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