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