実は、Liferayのポータル機能として、ユーザ管理、ロール管理またはサイトメンバー一覧などの画面で、すでに上記機能が実装されていますが、その画面が利用したメソッドは、ポートレットからの呼び出しを前提としたシグネチャーを持っています(すなわち、PortletRequest、HttpServletRequestなど)。 Liferayカスタマイズの際、サービスレイヤからそういう機能を実装する場面が多いため、今回の内容は、Liferayの既存機能の中のxxxRequestなどポートレット特化のパラメーターを利用しないこととします(すなわち本来xxxRequestから作成したものをハードコードで作成する)。
UserSearch
LiferayのUsersAdminPortletまたはSiteMembershipsPortletのユーザリスト部分を確認するとユーザ管理のViewUsersManagementToolbarDisplayContext.javaまたはサイトメンバー管理のUsersDisplayContext.java、よくUserSearchというクラスを見ます。さらに、Liferayには、階層構造を用いてデータベースの検索よりサーチエンジンの検索が早いことを利用し、指定条件のユーザを取得できるメソッドが用意されています。
// UsersDisplayContext.java UserSearch userSearch = new UserSearch(_renderRequest, getPortletURL()); UserSearchTerms searchTerms = (UserSearchTerms)userSearch.getSearchTerms(); LinkedHashMapそして、UserSearch.java、UserSearchTerms.javaなどのソースを参照し、以下のようなサービスレイヤ向けUserSearchが作成できます。userParams = new LinkedHashMap<>(); userParams.put("inherit", Boolean.TRUE); userParams.put("usersGroups", Long.valueOf(getGroupId())); int usersCount = UserLocalServiceUtil.searchCount( themeDisplay.getCompanyId(), searchTerms.getKeywords(), searchTerms.getStatus(), userParams); userSearch.setTotal(usersCount); List users = UserLocalServiceUtil.search( themeDisplay.getCompanyId(), searchTerms.getKeywords(), searchTerms.getStatus(), userParams, userSearch.getStart(), userSearch.getEnd(), userSearch.getOrderByComparator()); userSearch.setResults(users);
- searchTerms.getKeywords()のデフォルト値はnullになる
- ユーザ全体を取りたい場合、start=0、end=総数を指定する
- userSearch.getOrderByComparator()のデフォルト値はUsersAdminUtil.getUserOrderByComparator("last-name", "asc")になる
Component( property = { "osgi.command.scope=liferay", "osgi.command.function=checkOrganizationUsers", "osgi.command.function=checkSiteUsers", "osgi.command.function=checkRoleUsers" }, service = SiteUserOrgCmd.class ) public class SiteUserOrgCmd { private static final long companyId = PortalUtil.getDefaultCompanyId(); public void checkOrganizationUsers(String orgName) throws Exception { Organization org = OrganizationLocalServiceUtil.getOrganization(companyId, orgName); LinkedHashMapuserParams = new LinkedHashMap (); userParams.put("inherit", Boolean.TRUE); userParams.put("usersOrgs", org.getOrganizationId()); int usersCount = UserLocalServiceUtil.searchCount(companyId, StringPool.BLANK, WorkflowConstants.STATUS_APPROVED, userParams); OrderByComparator obc = UsersAdminUtil.getUserOrderByComparator("last-name", "asc"); List res = UserLocalServiceUtil.search(companyId, StringPool.BLANK, WorkflowConstants.STATUS_APPROVED, userParams, 0, usersCount, obc); System.out.println("Users of organization " + orgName + ": "); for (User u : res) { System.out.println(" " + u.getScreenName()); } } public void checkSiteUsers(String siteName) throws Exception { Group grp = null; for (Group g : GroupLocalServiceUtil.getGroups(QueryUtil.ALL_POS, QueryUtil.ALL_POS)) { if (g.getName(Locale.getDefault()).equals(siteName)) { grp = g; break; } } LinkedHashMap userParams = new LinkedHashMap (); userParams.put("inherit", Boolean.TRUE); userParams.put("usersGroups", grp.getGroupId()); int usersCount = UserLocalServiceUtil.searchCount(companyId, StringPool.BLANK, WorkflowConstants.STATUS_APPROVED, userParams); OrderByComparator obc = UsersAdminUtil.getUserOrderByComparator("last-name", "asc"); List res = UserLocalServiceUtil.search(companyId, StringPool.BLANK, WorkflowConstants.STATUS_APPROVED, userParams, 0, usersCount, obc); System.out.println("Users of site " + siteName + ": "); for (User u : res) { System.out.println(" " + u.getScreenName()); } } public void checkRoleUsers(String roleName) throws Exception { Role role = RoleLocalServiceUtil.getRole(companyId, roleName); LinkedHashMap userParams = new LinkedHashMap (); userParams.put("inherit", Boolean.TRUE); userParams.put("usersRoles", role.getRoleId()); int usersCount = UserLocalServiceUtil.searchCount(companyId, StringPool.BLANK, WorkflowConstants.STATUS_APPROVED, userParams); OrderByComparator obc = UsersAdminUtil.getUserOrderByComparator("last-name", "asc"); List res = UserLocalServiceUtil.search(companyId, StringPool.BLANK, WorkflowConstants.STATUS_APPROVED, userParams, 0, usersCount, obc); System.out.println("Users of site " + roleName + ": "); for (User u : res) { System.out.println(" " + u.getScreenName()); } } }
検証
前回と同じ、検証用エンティティを作成しましょう。
- ユーザ: ub_user, ub_user2, ub_user3
- ユーザグループ: ub_grp
- 組織: ub_org
- ub_orgの下の階層にob_org1を作成する
- サイト: ub_site
- 一般ロール: ub_role
では、上記サービスでUserSearchの効果を検証しましょう。
組織
- ub_org <- ub_user2、ub_org1 <- ub_user3
g! checkSiteUsers ub_site Users of site ub_site: test ub_user ub_user3 ub_user2
- 前回同様、dxp-14パッチまでのLiferayには、ub_user3を直接にub_orgにアサインしなくで、その下のub_org1にアサインすると、ub_user3はub_siteのサイトメンバーとして認識できなくなります。
ロール
ub_roleを:
- ub_userにアサインする
- ub_grpにアサインし、ub_user2をub_grpにアサインする
- ub_orgにアサインし、ub_user3をub_orgにアサインする
g! checkRoleUsers ub_role Users of site ub_role: ub_user ub_user3 ub_user2
まとめ
今回、Liferayが提供するUserSearchを利用し、サイト、組織またはロールの所属ユーザを全部取得する方法を紹介しました。実は、UserSearchだけではなく、RoleSearch、UserGroupSearch、GroupSearchなどのsearch系メソッドがLiferay中に定義されています。このようなクラスを同じ手段で改造したら、サービスレイヤであるエンティティーの下のロール、ユーザグループの取得も可能になります。