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