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.service.OrganizationLocalServiceUtil;
032 import com.liferay.portal.service.persistence.OrganizationActionableDynamicQuery;
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.PortletURL;
045
046
051 public class OrganizationIndexer extends BaseIndexer {
052
053 public static final String[] CLASS_NAMES = {Organization.class.getName()};
054
055 public static final String PORTLET_ID = PortletKeys.USERS_ADMIN;
056
057 public OrganizationIndexer() {
058 setIndexerEnabled(PropsValues.ORGANIZATIONS_INDEXER_ENABLED);
059 setPermissionAware(true);
060 setStagingAware(false);
061 }
062
063 public String[] getClassNames() {
064 return CLASS_NAMES;
065 }
066
067 public String getPortletId() {
068 return PORTLET_ID;
069 }
070
071 @Override
072 public void postProcessContextQuery(
073 BooleanQuery contextQuery, SearchContext searchContext)
074 throws Exception {
075
076 LinkedHashMap<String, Object> params =
077 (LinkedHashMap<String, Object>)searchContext.getAttribute("params");
078
079 if (params == null) {
080 return;
081 }
082
083 List<Long> excludedOrganizationIds = (List<Long>)params.get(
084 "excludedOrganizationIds");
085
086 if ((excludedOrganizationIds != null) &&
087 !excludedOrganizationIds.isEmpty()) {
088
089 BooleanQuery booleanQuery = BooleanQueryFactoryUtil.create(
090 searchContext);
091
092 for (long excludedOrganizationId : excludedOrganizationIds) {
093 booleanQuery.addTerm(
094 "organizationId", String.valueOf(excludedOrganizationId));
095 }
096
097 contextQuery.add(booleanQuery, BooleanClauseOccur.MUST_NOT);
098 }
099
100 List<Organization> organizationsTree = (List<Organization>)params.get(
101 "organizationsTree");
102
103 if ((organizationsTree != null) && !organizationsTree.isEmpty()) {
104 BooleanQuery booleanQuery = BooleanQueryFactoryUtil.create(
105 searchContext);
106
107 for (Organization organization : organizationsTree) {
108 String treePath = organization.buildTreePath();
109
110 booleanQuery.addTerm("treePath", treePath, true);
111 }
112
113 contextQuery.add(booleanQuery, BooleanClauseOccur.MUST);
114 }
115 else {
116 long parentOrganizationId = GetterUtil.getLong(
117 searchContext.getAttribute("parentOrganizationId"));
118
119 if (parentOrganizationId > 0) {
120 contextQuery.addRequiredTerm(
121 "parentOrganizationId", parentOrganizationId);
122 }
123 }
124 }
125
126 @Override
127 public void postProcessSearchQuery(
128 BooleanQuery searchQuery, SearchContext searchContext)
129 throws Exception {
130
131 addSearchTerm(searchQuery, searchContext, "city", false);
132 addSearchTerm(searchQuery, searchContext, "country", false);
133 addSearchTerm(searchQuery, searchContext, "name", false);
134 addSearchTerm(searchQuery, searchContext, "region", false);
135 addSearchTerm(searchQuery, searchContext, "street", false);
136 addSearchTerm(searchQuery, searchContext, "type", false);
137 addSearchTerm(searchQuery, searchContext, "zip", false);
138
139 LinkedHashMap<String, Object> params =
140 (LinkedHashMap<String, Object>)searchContext.getAttribute("params");
141
142 if (params != null) {
143 String expandoAttributes = (String)params.get("expandoAttributes");
144
145 if (Validator.isNotNull(expandoAttributes)) {
146 addSearchExpando(searchQuery, searchContext, expandoAttributes);
147 }
148 }
149 }
150
151 @Override
152 protected void doDelete(Object obj) throws Exception {
153 Organization organization = (Organization)obj;
154
155 deleteDocument(
156 organization.getCompanyId(), organization.getOrganizationId());
157 }
158
159 @Override
160 protected Document doGetDocument(Object obj) throws Exception {
161 Organization organization = (Organization)obj;
162
163 Document document = getBaseModelDocument(PORTLET_ID, organization);
164
165 document.addKeyword(Field.COMPANY_ID, organization.getCompanyId());
166 document.addText(Field.NAME, organization.getName());
167 document.addKeyword(
168 Field.ORGANIZATION_ID, organization.getOrganizationId());
169 document.addKeyword(Field.TYPE, organization.getType());
170
171 document.addKeyword(
172 "parentOrganizationId", organization.getParentOrganizationId());
173
174 String treePath = organization.buildTreePath();
175
176 document.addKeyword("treePath", treePath);
177
178 populateAddresses(
179 document, organization.getAddresses(), organization.getRegionId(),
180 organization.getCountryId());
181
182 return document;
183 }
184
185 @Override
186 protected String doGetSortField(String orderByCol) {
187 if (orderByCol.equals("name")) {
188 return "name";
189 }
190 else if (orderByCol.equals("type")) {
191 return "type";
192 }
193 else {
194 return orderByCol;
195 }
196 }
197
198 @Override
199 protected Summary doGetSummary(
200 Document document, Locale locale, String snippet,
201 PortletURL portletURL) {
202
203 String title = document.get("name");
204
205 String content = null;
206
207 String organizationId = document.get(Field.ORGANIZATION_ID);
208
209 portletURL.setParameter(
210 "struts_action", "/users_admin/edit_organization");
211 portletURL.setParameter("organizationId", organizationId);
212
213 return new Summary(title, content, portletURL);
214 }
215
216 @Override
217 protected void doReindex(Object obj) throws Exception {
218 if (obj instanceof List<?>) {
219 List<Organization> organizations = (List<Organization>)obj;
220
221 for (Organization organization : organizations) {
222 doReindex(organization);
223 }
224 }
225 else if (obj instanceof Long) {
226 long organizationId = (Long)obj;
227
228 Organization organization =
229 OrganizationLocalServiceUtil.getOrganization(organizationId);
230
231 doReindex(organization);
232 }
233 else if (obj instanceof long[]) {
234 long[] organizationIds = (long[])obj;
235
236 Map<Long, Collection<Document>> documentsMap =
237 new HashMap<Long, Collection<Document>>();
238
239 for (long organizationId : organizationIds) {
240 Organization organization =
241 OrganizationLocalServiceUtil.fetchOrganization(
242 organizationId);
243
244 if (organization == null) {
245 continue;
246 }
247
248 Document document = getDocument(organization);
249
250 long companyId = organization.getCompanyId();
251
252 Collection<Document> documents = documentsMap.get(companyId);
253
254 if (documents == null) {
255 documents = new ArrayList<Document>();
256
257 documentsMap.put(companyId, documents);
258 }
259
260 documents.add(document);
261 }
262
263 for (Map.Entry<Long, Collection<Document>> entry :
264 documentsMap.entrySet()) {
265
266 long companyId = entry.getKey();
267 Collection<Document> documents = entry.getValue();
268
269 SearchEngineUtil.updateDocuments(
270 getSearchEngineId(), companyId, documents);
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 }
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 final Collection<Document> documents = new ArrayList<Document>();
305
306 ActionableDynamicQuery actionableDynamicQuery =
307 new OrganizationActionableDynamicQuery() {
308
309 @Override
310 protected void performAction(Object object) throws PortalException {
311 Organization organization = (Organization)object;
312
313 Document document = getDocument(organization);
314
315 documents.add(document);
316 }
317
318 };
319
320 actionableDynamicQuery.setCompanyId(companyId);
321
322 actionableDynamicQuery.performActions();
323
324 SearchEngineUtil.updateDocuments(
325 getSearchEngineId(), companyId, documents);
326 }
327
328 }