001
014
015 package com.liferay.portlet.usersadmin.util;
016
017 import com.liferay.portal.kernel.dao.orm.ActionableDynamicQuery;
018 import com.liferay.portal.kernel.exception.PortalException;
019 import com.liferay.portal.kernel.search.BaseIndexer;
020 import com.liferay.portal.kernel.search.BooleanClauseOccur;
021 import com.liferay.portal.kernel.search.BooleanQuery;
022 import com.liferay.portal.kernel.search.BooleanQueryFactoryUtil;
023 import com.liferay.portal.kernel.search.Document;
024 import com.liferay.portal.kernel.search.Field;
025 import com.liferay.portal.kernel.search.SearchContext;
026 import com.liferay.portal.kernel.search.SearchEngineUtil;
027 import com.liferay.portal.kernel.search.Summary;
028 import com.liferay.portal.kernel.util.GetterUtil;
029 import com.liferay.portal.kernel.util.Validator;
030 import com.liferay.portal.model.Organization;
031 import com.liferay.portal.model.OrganizationConstants;
032 import com.liferay.portal.service.OrganizationLocalServiceUtil;
033 import com.liferay.portal.util.PortletKeys;
034 import com.liferay.portal.util.PropsValues;
035
036 import java.util.ArrayList;
037 import java.util.Collection;
038 import java.util.HashMap;
039 import java.util.LinkedHashMap;
040 import java.util.List;
041 import java.util.Locale;
042 import java.util.Map;
043
044 import javax.portlet.PortletRequest;
045 import javax.portlet.PortletResponse;
046 import javax.portlet.PortletURL;
047
048
053 public class OrganizationIndexer extends BaseIndexer {
054
055 public static final String[] CLASS_NAMES = {Organization.class.getName()};
056
057 public static final String PORTLET_ID = PortletKeys.USERS_ADMIN;
058
059 public OrganizationIndexer() {
060 setCommitImmediately(true);
061 setDefaultSelectedFieldNames(
062 Field.COMPANY_ID, Field.ORGANIZATION_ID, Field.UID);
063 setIndexerEnabled(PropsValues.ORGANIZATIONS_INDEXER_ENABLED);
064 setPermissionAware(true);
065 setStagingAware(false);
066 }
067
068 @Override
069 public String[] getClassNames() {
070 return CLASS_NAMES;
071 }
072
073 @Override
074 public String getPortletId() {
075 return PORTLET_ID;
076 }
077
078 @Override
079 public void postProcessContextQuery(
080 BooleanQuery contextQuery, SearchContext searchContext)
081 throws Exception {
082
083 LinkedHashMap<String, Object> params =
084 (LinkedHashMap<String, Object>)searchContext.getAttribute("params");
085
086 if (params == null) {
087 return;
088 }
089
090 List<Long> excludedOrganizationIds = (List<Long>)params.get(
091 "excludedOrganizationIds");
092
093 if ((excludedOrganizationIds != null) &&
094 !excludedOrganizationIds.isEmpty()) {
095
096 BooleanQuery booleanQuery = BooleanQueryFactoryUtil.create(
097 searchContext);
098
099 for (long excludedOrganizationId : excludedOrganizationIds) {
100 booleanQuery.addTerm(
101 "organizationId", String.valueOf(excludedOrganizationId));
102 }
103
104 contextQuery.add(booleanQuery, BooleanClauseOccur.MUST_NOT);
105 }
106
107 List<Organization> organizationsTree = (List<Organization>)params.get(
108 "organizationsTree");
109
110 if ((organizationsTree != null) && !organizationsTree.isEmpty()) {
111 BooleanQuery booleanQuery = BooleanQueryFactoryUtil.create(
112 searchContext);
113
114 for (Organization organization : organizationsTree) {
115 String treePath = organization.buildTreePath();
116
117 booleanQuery.addTerm(Field.TREE_PATH, treePath, true);
118 }
119
120 contextQuery.add(booleanQuery, BooleanClauseOccur.MUST);
121 }
122 else {
123 long parentOrganizationId = GetterUtil.getLong(
124 searchContext.getAttribute("parentOrganizationId"));
125
126 if (parentOrganizationId !=
127 OrganizationConstants.ANY_PARENT_ORGANIZATION_ID) {
128
129 contextQuery.addRequiredTerm(
130 "parentOrganizationId", parentOrganizationId);
131 }
132 }
133 }
134
135 @Override
136 public void postProcessSearchQuery(
137 BooleanQuery searchQuery, SearchContext searchContext)
138 throws Exception {
139
140 addSearchTerm(searchQuery, searchContext, "city", false);
141 addSearchTerm(searchQuery, searchContext, "country", false);
142 addSearchTerm(searchQuery, searchContext, "name", false);
143 addSearchTerm(searchQuery, searchContext, "region", false);
144 addSearchTerm(searchQuery, searchContext, "street", false);
145 addSearchTerm(searchQuery, searchContext, "type", false);
146 addSearchTerm(searchQuery, searchContext, "zip", false);
147
148 LinkedHashMap<String, Object> params =
149 (LinkedHashMap<String, Object>)searchContext.getAttribute("params");
150
151 if (params != null) {
152 String expandoAttributes = (String)params.get("expandoAttributes");
153
154 if (Validator.isNotNull(expandoAttributes)) {
155 addSearchExpando(searchQuery, searchContext, expandoAttributes);
156 }
157 }
158 }
159
160 @Override
161 protected void doDelete(Object obj) throws Exception {
162 Organization organization = (Organization)obj;
163
164 deleteDocument(
165 organization.getCompanyId(), organization.getOrganizationId());
166 }
167
168 @Override
169 protected Document doGetDocument(Object obj) throws Exception {
170 Organization organization = (Organization)obj;
171
172 Document document = getBaseModelDocument(PORTLET_ID, organization);
173
174 document.addKeyword(Field.COMPANY_ID, organization.getCompanyId());
175 document.addText(Field.NAME, organization.getName());
176 document.addKeyword(
177 Field.ORGANIZATION_ID, organization.getOrganizationId());
178 document.addKeyword(Field.TREE_PATH, organization.buildTreePath());
179 document.addKeyword(Field.TYPE, organization.getType());
180
181 document.addKeyword(
182 "parentOrganizationId", organization.getParentOrganizationId());
183
184 populateAddresses(
185 document, organization.getAddresses(), organization.getRegionId(),
186 organization.getCountryId());
187
188 return document;
189 }
190
191 @Override
192 protected String doGetSortField(String orderByCol) {
193 if (orderByCol.equals("name")) {
194 return "name";
195 }
196 else if (orderByCol.equals("type")) {
197 return "type";
198 }
199 else {
200 return orderByCol;
201 }
202 }
203
204 @Override
205 protected Summary doGetSummary(
206 Document document, Locale locale, String snippet, PortletURL portletURL,
207 PortletRequest portletRequest, PortletResponse portletResponse) {
208
209 String title = document.get("name");
210
211 String content = null;
212
213 String organizationId = document.get(Field.ORGANIZATION_ID);
214
215 portletURL.setParameter(
216 "struts_action", "/users_admin/edit_organization");
217 portletURL.setParameter("organizationId", organizationId);
218
219 return new Summary(title, content, portletURL);
220 }
221
222 @Override
223 protected void doReindex(Object obj) throws Exception {
224 if (obj instanceof Long) {
225 long organizationId = (Long)obj;
226
227 Organization organization =
228 OrganizationLocalServiceUtil.getOrganization(organizationId);
229
230 doReindex(organization);
231 }
232 else if (obj instanceof long[]) {
233 long[] organizationIds = (long[])obj;
234
235 Map<Long, Collection<Document>> documentsMap =
236 new HashMap<Long, Collection<Document>>();
237
238 for (long organizationId : organizationIds) {
239 Organization organization =
240 OrganizationLocalServiceUtil.fetchOrganization(
241 organizationId);
242
243 if (organization == null) {
244 continue;
245 }
246
247 Document document = getDocument(organization);
248
249 long companyId = organization.getCompanyId();
250
251 Collection<Document> documents = documentsMap.get(companyId);
252
253 if (documents == null) {
254 documents = new ArrayList<Document>();
255
256 documentsMap.put(companyId, documents);
257 }
258
259 documents.add(document);
260 }
261
262 for (Map.Entry<Long, Collection<Document>> entry :
263 documentsMap.entrySet()) {
264
265 long companyId = entry.getKey();
266 Collection<Document> documents = entry.getValue();
267
268 SearchEngineUtil.updateDocuments(
269 getSearchEngineId(), companyId, documents,
270 isCommitImmediately());
271 }
272 }
273 else if (obj instanceof Organization) {
274 Organization organization = (Organization)obj;
275
276 Document document = getDocument(organization);
277
278 SearchEngineUtil.updateDocument(
279 getSearchEngineId(), organization.getCompanyId(), document,
280 isCommitImmediately());
281 }
282 }
283
284 @Override
285 protected void doReindex(String className, long classPK) throws Exception {
286 Organization organization =
287 OrganizationLocalServiceUtil.getOrganization(classPK);
288
289 doReindex(organization);
290 }
291
292 @Override
293 protected void doReindex(String[] ids) throws Exception {
294 long companyId = GetterUtil.getLong(ids[0]);
295
296 reindexOrganizations(companyId);
297 }
298
299 @Override
300 protected String getPortletId(SearchContext searchContext) {
301 return PORTLET_ID;
302 }
303
304 protected void reindexOrganizations(long companyId) throws Exception {
305 final ActionableDynamicQuery actionableDynamicQuery =
306 OrganizationLocalServiceUtil.getActionableDynamicQuery();
307
308 actionableDynamicQuery.setCompanyId(companyId);
309 actionableDynamicQuery.setPerformActionMethod(
310 new ActionableDynamicQuery.PerformActionMethod() {
311
312 @Override
313 public void performAction(Object object)
314 throws PortalException {
315
316 Organization organization = (Organization)object;
317
318 Document document = getDocument(organization);
319
320 actionableDynamicQuery.addDocument(document);
321 }
322
323 });
324 actionableDynamicQuery.setSearchEngineId(getSearchEngineId());
325
326 actionableDynamicQuery.performActions();
327 }
328
329 }