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.service.persistence.OrganizationActionableDynamicQuery;
034 import com.liferay.portal.util.PortletKeys;
035 import com.liferay.portal.util.PropsValues;
036
037 import java.util.ArrayList;
038 import java.util.Collection;
039 import java.util.HashMap;
040 import java.util.LinkedHashMap;
041 import java.util.List;
042 import java.util.Locale;
043 import java.util.Map;
044
045 import javax.portlet.PortletURL;
046
047
052 public class OrganizationIndexer extends BaseIndexer {
053
054 public static final String[] CLASS_NAMES = {Organization.class.getName()};
055
056 public static final String PORTLET_ID = PortletKeys.USERS_ADMIN;
057
058 public OrganizationIndexer() {
059 setIndexerEnabled(PropsValues.ORGANIZATIONS_INDEXER_ENABLED);
060 setPermissionAware(true);
061 setStagingAware(false);
062 }
063
064 @Override
065 public String[] getClassNames() {
066 return CLASS_NAMES;
067 }
068
069 @Override
070 public String getPortletId() {
071 return PORTLET_ID;
072 }
073
074 @Override
075 public void postProcessContextQuery(
076 BooleanQuery contextQuery, SearchContext searchContext)
077 throws Exception {
078
079 LinkedHashMap<String, Object> params =
080 (LinkedHashMap<String, Object>)searchContext.getAttribute("params");
081
082 if (params == null) {
083 return;
084 }
085
086 List<Long> excludedOrganizationIds = (List<Long>)params.get(
087 "excludedOrganizationIds");
088
089 if ((excludedOrganizationIds != null) &&
090 !excludedOrganizationIds.isEmpty()) {
091
092 BooleanQuery booleanQuery = BooleanQueryFactoryUtil.create(
093 searchContext);
094
095 for (long excludedOrganizationId : excludedOrganizationIds) {
096 booleanQuery.addTerm(
097 "organizationId", String.valueOf(excludedOrganizationId));
098 }
099
100 contextQuery.add(booleanQuery, BooleanClauseOccur.MUST_NOT);
101 }
102
103 List<Organization> organizationsTree = (List<Organization>)params.get(
104 "organizationsTree");
105
106 if ((organizationsTree != null) && !organizationsTree.isEmpty()) {
107 BooleanQuery booleanQuery = BooleanQueryFactoryUtil.create(
108 searchContext);
109
110 for (Organization organization : organizationsTree) {
111 String treePath = organization.buildTreePath();
112
113 booleanQuery.addTerm("treePath", treePath, true);
114 }
115
116 contextQuery.add(booleanQuery, BooleanClauseOccur.MUST);
117 }
118 else {
119 long parentOrganizationId = GetterUtil.getLong(
120 searchContext.getAttribute("parentOrganizationId"));
121
122 if (parentOrganizationId !=
123 OrganizationConstants.ANY_PARENT_ORGANIZATION_ID) {
124
125 contextQuery.addRequiredTerm(
126 "parentOrganizationId", parentOrganizationId);
127 }
128 }
129 }
130
131 @Override
132 public void postProcessSearchQuery(
133 BooleanQuery searchQuery, SearchContext searchContext)
134 throws Exception {
135
136 addSearchTerm(searchQuery, searchContext, "city", false);
137 addSearchTerm(searchQuery, searchContext, "country", false);
138 addSearchTerm(searchQuery, searchContext, "name", false);
139 addSearchTerm(searchQuery, searchContext, "region", false);
140 addSearchTerm(searchQuery, searchContext, "street", false);
141 addSearchTerm(searchQuery, searchContext, "type", false);
142 addSearchTerm(searchQuery, searchContext, "zip", false);
143
144 LinkedHashMap<String, Object> params =
145 (LinkedHashMap<String, Object>)searchContext.getAttribute("params");
146
147 if (params != null) {
148 String expandoAttributes = (String)params.get("expandoAttributes");
149
150 if (Validator.isNotNull(expandoAttributes)) {
151 addSearchExpando(searchQuery, searchContext, expandoAttributes);
152 }
153 }
154 }
155
156 @Override
157 protected void doDelete(Object obj) throws Exception {
158 Organization organization = (Organization)obj;
159
160 deleteDocument(
161 organization.getCompanyId(), organization.getOrganizationId());
162 }
163
164 @Override
165 protected Document doGetDocument(Object obj) throws Exception {
166 Organization organization = (Organization)obj;
167
168 Document document = getBaseModelDocument(PORTLET_ID, organization);
169
170 document.addKeyword(Field.COMPANY_ID, organization.getCompanyId());
171 document.addText(Field.NAME, organization.getName());
172 document.addKeyword(
173 Field.ORGANIZATION_ID, organization.getOrganizationId());
174 document.addKeyword(Field.TYPE, organization.getType());
175
176 document.addKeyword(
177 "parentOrganizationId", organization.getParentOrganizationId());
178
179 String treePath = organization.buildTreePath();
180
181 document.addKeyword("treePath", treePath);
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 List<?>) {
224 List<Organization> organizations = (List<Organization>)obj;
225
226 for (Organization organization : organizations) {
227 doReindex(organization);
228 }
229 }
230 else if (obj instanceof Long) {
231 long organizationId = (Long)obj;
232
233 Organization organization =
234 OrganizationLocalServiceUtil.getOrganization(organizationId);
235
236 doReindex(organization);
237 }
238 else if (obj instanceof long[]) {
239 long[] organizationIds = (long[])obj;
240
241 Map<Long, Collection<Document>> documentsMap =
242 new HashMap<Long, Collection<Document>>();
243
244 for (long organizationId : organizationIds) {
245 Organization organization =
246 OrganizationLocalServiceUtil.fetchOrganization(
247 organizationId);
248
249 if (organization == null) {
250 continue;
251 }
252
253 Document document = getDocument(organization);
254
255 long companyId = organization.getCompanyId();
256
257 Collection<Document> documents = documentsMap.get(companyId);
258
259 if (documents == null) {
260 documents = new ArrayList<Document>();
261
262 documentsMap.put(companyId, documents);
263 }
264
265 documents.add(document);
266 }
267
268 for (Map.Entry<Long, Collection<Document>> entry :
269 documentsMap.entrySet()) {
270
271 long companyId = entry.getKey();
272 Collection<Document> documents = entry.getValue();
273
274 SearchEngineUtil.updateDocuments(
275 getSearchEngineId(), companyId, documents);
276 }
277 }
278 else if (obj instanceof Organization) {
279 Organization organization = (Organization)obj;
280
281 Document document = getDocument(organization);
282
283 SearchEngineUtil.updateDocument(
284 getSearchEngineId(), organization.getCompanyId(), document);
285 }
286 }
287
288 @Override
289 protected void doReindex(String className, long classPK) throws Exception {
290 Organization organization =
291 OrganizationLocalServiceUtil.getOrganization(classPK);
292
293 doReindex(organization);
294 }
295
296 @Override
297 protected void doReindex(String[] ids) throws Exception {
298 long companyId = GetterUtil.getLong(ids[0]);
299
300 reindexOrganizations(companyId);
301 }
302
303 @Override
304 protected String getPortletId(SearchContext searchContext) {
305 return PORTLET_ID;
306 }
307
308 protected void reindexOrganizations(long companyId) throws Exception {
309 final Collection<Document> documents = new ArrayList<Document>();
310
311 ActionableDynamicQuery actionableDynamicQuery =
312 new OrganizationActionableDynamicQuery() {
313
314 @Override
315 protected void performAction(Object object) throws PortalException {
316 Organization organization = (Organization)object;
317
318 Document document = getDocument(organization);
319
320 documents.add(document);
321 }
322
323 };
324
325 actionableDynamicQuery.setCompanyId(companyId);
326
327 actionableDynamicQuery.performActions();
328
329 SearchEngineUtil.updateDocuments(
330 getSearchEngineId(), companyId, documents);
331 }
332
333 }