001
014
015 package com.liferay.portlet.usersadmin.util;
016
017 import com.liferay.portal.kernel.dao.orm.DynamicQuery;
018 import com.liferay.portal.kernel.dao.orm.DynamicQueryFactoryUtil;
019 import com.liferay.portal.kernel.dao.orm.Projection;
020 import com.liferay.portal.kernel.dao.orm.ProjectionFactoryUtil;
021 import com.liferay.portal.kernel.dao.orm.ProjectionList;
022 import com.liferay.portal.kernel.dao.orm.Property;
023 import com.liferay.portal.kernel.dao.orm.PropertyFactoryUtil;
024 import com.liferay.portal.kernel.search.BaseIndexer;
025 import com.liferay.portal.kernel.search.BooleanClauseOccur;
026 import com.liferay.portal.kernel.search.BooleanQuery;
027 import com.liferay.portal.kernel.search.BooleanQueryFactoryUtil;
028 import com.liferay.portal.kernel.search.Document;
029 import com.liferay.portal.kernel.search.Field;
030 import com.liferay.portal.kernel.search.SearchContext;
031 import com.liferay.portal.kernel.search.SearchEngineUtil;
032 import com.liferay.portal.kernel.search.Summary;
033 import com.liferay.portal.kernel.util.GetterUtil;
034 import com.liferay.portal.kernel.util.Validator;
035 import com.liferay.portal.model.Organization;
036 import com.liferay.portal.security.pacl.PACLClassLoaderUtil;
037 import com.liferay.portal.service.OrganizationLocalServiceUtil;
038 import com.liferay.portal.util.PortletKeys;
039 import com.liferay.portal.util.PropsValues;
040
041 import java.util.ArrayList;
042 import java.util.Collection;
043 import java.util.HashMap;
044 import java.util.LinkedHashMap;
045 import java.util.List;
046 import java.util.Locale;
047 import java.util.Map;
048
049 import javax.portlet.PortletURL;
050
051
056 public class OrganizationIndexer extends BaseIndexer {
057
058 public static final String[] CLASS_NAMES = {Organization.class.getName()};
059
060 public static final String PORTLET_ID = PortletKeys.USERS_ADMIN;
061
062 public OrganizationIndexer() {
063 setStagingAware(false);
064 }
065
066 public String[] getClassNames() {
067 return CLASS_NAMES;
068 }
069
070 public String getPortletId() {
071 return PORTLET_ID;
072 }
073
074 @Override
075 public boolean isIndexerEnabled() {
076 return PropsValues.ORGANIZATIONS_INDEXER_ENABLED;
077 }
078
079 @Override
080 public boolean isPermissionAware() {
081 return _PERMISSION_AWARE;
082 }
083
084 @Override
085 public void postProcessContextQuery(
086 BooleanQuery contextQuery, SearchContext searchContext)
087 throws Exception {
088
089 LinkedHashMap<String, Object> params =
090 (LinkedHashMap<String, Object>)searchContext.getAttribute("params");
091
092 if (params == null) {
093 return;
094 }
095
096 List<Organization> organizationsTree = (List<Organization>)params.get(
097 "organizationsTree");
098
099 if ((organizationsTree != null) && !organizationsTree.isEmpty()) {
100 BooleanQuery booleanQuery = BooleanQueryFactoryUtil.create(
101 searchContext);
102
103 for (Organization organization : organizationsTree) {
104 String treePath = organization.buildTreePath();
105
106 booleanQuery.addTerm("treePath", treePath, true);
107 }
108
109 contextQuery.add(booleanQuery, BooleanClauseOccur.MUST);
110 }
111 }
112
113 @Override
114 public void postProcessSearchQuery(
115 BooleanQuery searchQuery, SearchContext searchContext)
116 throws Exception {
117
118 addSearchTerm(searchQuery, searchContext, "city", false);
119 addSearchTerm(searchQuery, searchContext, "country", false);
120 addSearchTerm(searchQuery, searchContext, "name", false);
121 addSearchTerm(
122 searchQuery, searchContext, "parentOrganizationId", false);
123 addSearchTerm(searchQuery, searchContext, "region", false);
124 addSearchTerm(searchQuery, searchContext, "street", false);
125 addSearchTerm(searchQuery, searchContext, "type", false);
126 addSearchTerm(searchQuery, searchContext, "zip", false);
127
128 LinkedHashMap<String, Object> params =
129 (LinkedHashMap<String, Object>)searchContext.getAttribute("params");
130
131 if (params != null) {
132 String expandoAttributes = (String)params.get("expandoAttributes");
133
134 if (Validator.isNotNull(expandoAttributes)) {
135 addSearchExpando(searchQuery, searchContext, expandoAttributes);
136 }
137 }
138 }
139
140 protected void addReindexCriteria(
141 DynamicQuery dynamicQuery, long companyId) {
142
143 Property property = PropertyFactoryUtil.forName("companyId");
144
145 dynamicQuery.add(property.eq(companyId));
146 }
147
148 @Override
149 protected void doDelete(Object obj) throws Exception {
150 Organization organization = (Organization)obj;
151
152 deleteDocument(
153 organization.getCompanyId(), organization.getOrganizationId());
154 }
155
156 @Override
157 protected Document doGetDocument(Object obj) throws Exception {
158 Organization organization = (Organization)obj;
159
160 Document document = getBaseModelDocument(PORTLET_ID, organization);
161
162 document.addKeyword(Field.COMPANY_ID, organization.getCompanyId());
163 document.addText(Field.NAME, organization.getName());
164 document.addKeyword(
165 Field.ORGANIZATION_ID, organization.getOrganizationId());
166 document.addKeyword(Field.TYPE, organization.getType());
167
168 document.addKeyword(
169 "parentOrganizationId", organization.getParentOrganizationId());
170
171 String treePath = organization.buildTreePath();
172
173 document.addKeyword("treePath", treePath);
174
175 populateAddresses(
176 document, organization.getAddresses(), organization.getRegionId(),
177 organization.getCountryId());
178
179 return document;
180 }
181
182 @Override
183 protected String doGetSortField(String orderByCol) {
184 if (orderByCol.equals("name")) {
185 return "name";
186 }
187 else if (orderByCol.equals("type")) {
188 return "type";
189 }
190 else {
191 return orderByCol;
192 }
193 }
194
195 @Override
196 protected Summary doGetSummary(
197 Document document, Locale locale, String snippet,
198 PortletURL portletURL) {
199
200 String title = document.get("name");
201
202 String content = null;
203
204 String organizationId = document.get(Field.ORGANIZATION_ID);
205
206 portletURL.setParameter(
207 "struts_action", "/users_admin/edit_organization");
208 portletURL.setParameter("organizationId", organizationId);
209
210 return new Summary(title, content, portletURL);
211 }
212
213 @Override
214 protected void doReindex(Object obj) throws Exception {
215 if (obj instanceof List<?>) {
216 List<Organization> organizations = (List<Organization>)obj;
217
218 for (Organization organization : organizations) {
219 doReindex(organization);
220 }
221 }
222 else if (obj instanceof Long) {
223 long organizationId = (Long)obj;
224
225 Organization organization =
226 OrganizationLocalServiceUtil.getOrganization(organizationId);
227
228 doReindex(organization);
229 }
230 else if (obj instanceof long[]) {
231 long[] organizationIds = (long[])obj;
232
233 Map<Long, Collection<Document>> documentsMap =
234 new HashMap<Long, Collection<Document>>();
235
236 for (long organizationId : organizationIds) {
237 Organization organization =
238 OrganizationLocalServiceUtil.fetchOrganization(
239 organizationId);
240
241 if (organization == null) {
242 continue;
243 }
244
245 Document document = getDocument(organization);
246
247 long companyId = organization.getCompanyId();
248
249 Collection<Document> documents = documentsMap.get(companyId);
250
251 if (documents == null) {
252 documents = new ArrayList<Document>();
253
254 documentsMap.put(companyId, documents);
255 }
256
257 documents.add(document);
258 }
259
260 for (Map.Entry<Long, Collection<Document>> entry :
261 documentsMap.entrySet()) {
262
263 long companyId = entry.getKey();
264 Collection<Document> documents = entry.getValue();
265
266 SearchEngineUtil.updateDocuments(
267 getSearchEngineId(), companyId, documents);
268 }
269 }
270 else if (obj instanceof Organization) {
271 Organization organization = (Organization)obj;
272
273 Document document = getDocument(organization);
274
275 SearchEngineUtil.updateDocument(
276 getSearchEngineId(), organization.getCompanyId(), document);
277 }
278 }
279
280 @Override
281 protected void doReindex(String className, long classPK) throws Exception {
282 Organization organization =
283 OrganizationLocalServiceUtil.getOrganization(classPK);
284
285 doReindex(organization);
286 }
287
288 @Override
289 protected void doReindex(String[] ids) throws Exception {
290 long companyId = GetterUtil.getLong(ids[0]);
291
292 reindexOrganizations(companyId);
293 }
294
295 @Override
296 protected String getPortletId(SearchContext searchContext) {
297 return PORTLET_ID;
298 }
299
300 protected void reindexOrganizations(long companyId) throws Exception {
301 DynamicQuery dynamicQuery = DynamicQueryFactoryUtil.forClass(
302 Organization.class, PACLClassLoaderUtil.getPortalClassLoader());
303
304 Projection minOrganizationIdProjection = ProjectionFactoryUtil.min(
305 "organizationId");
306 Projection maxOrganizationIdProjection = ProjectionFactoryUtil.max(
307 "organizationId");
308
309 ProjectionList projectionList = ProjectionFactoryUtil.projectionList();
310
311 projectionList.add(minOrganizationIdProjection);
312 projectionList.add(maxOrganizationIdProjection);
313
314 dynamicQuery.setProjection(projectionList);
315
316 addReindexCriteria(dynamicQuery, companyId);
317
318 List<Object[]> results = OrganizationLocalServiceUtil.dynamicQuery(
319 dynamicQuery);
320
321 Object[] minAndMaxOrganizationIds = results.get(0);
322
323 if ((minAndMaxOrganizationIds[0] == null) ||
324 (minAndMaxOrganizationIds[1] == null)) {
325
326 return;
327 }
328
329 long minOrganizationId = (Long)minAndMaxOrganizationIds[0];
330 long maxOrganizationId = (Long)minAndMaxOrganizationIds[1];
331
332 long startOrganizationId = minOrganizationId;
333 long endOrganizationId = startOrganizationId + DEFAULT_INTERVAL;
334
335 while (startOrganizationId <= maxOrganizationId) {
336 reindexOrganizations(
337 companyId, startOrganizationId, endOrganizationId);
338
339 startOrganizationId = endOrganizationId;
340 endOrganizationId += DEFAULT_INTERVAL;
341 }
342 }
343
344 protected void reindexOrganizations(
345 long companyId, long startOrganizationId, long endOrganizationId)
346 throws Exception {
347
348 DynamicQuery dynamicQuery = DynamicQueryFactoryUtil.forClass(
349 Organization.class, PACLClassLoaderUtil.getPortalClassLoader());
350
351 Property property = PropertyFactoryUtil.forName("organizationId");
352
353 dynamicQuery.add(property.ge(startOrganizationId));
354 dynamicQuery.add(property.lt(endOrganizationId));
355
356 addReindexCriteria(dynamicQuery, companyId);
357
358 List<Organization> organizations =
359 OrganizationLocalServiceUtil.dynamicQuery(dynamicQuery);
360
361 if (organizations.isEmpty()) {
362 return;
363 }
364
365 Collection<Document> documents = new ArrayList<Document>(
366 organizations.size());
367
368 for (Organization organization : organizations) {
369 Document document = getDocument(organization);
370
371 documents.add(document);
372 }
373
374 SearchEngineUtil.updateDocuments(
375 getSearchEngineId(), companyId, documents);
376 }
377
378 private static final boolean _PERMISSION_AWARE = true;
379
380 }