001
014
015 package com.liferay.portlet.usersadmin.util;
016
017 import com.liferay.portal.kernel.search.BaseIndexer;
018 import com.liferay.portal.kernel.search.BooleanClauseOccur;
019 import com.liferay.portal.kernel.search.BooleanQuery;
020 import com.liferay.portal.kernel.search.BooleanQueryFactoryUtil;
021 import com.liferay.portal.kernel.search.Document;
022 import com.liferay.portal.kernel.search.Field;
023 import com.liferay.portal.kernel.search.SearchContext;
024 import com.liferay.portal.kernel.search.SearchEngineUtil;
025 import com.liferay.portal.kernel.search.Summary;
026 import com.liferay.portal.kernel.util.GetterUtil;
027 import com.liferay.portal.kernel.util.Validator;
028 import com.liferay.portal.model.Organization;
029 import com.liferay.portal.service.OrganizationLocalServiceUtil;
030 import com.liferay.portal.util.PortletKeys;
031 import com.liferay.portal.util.PropsValues;
032
033 import java.util.ArrayList;
034 import java.util.Collection;
035 import java.util.HashMap;
036 import java.util.LinkedHashMap;
037 import java.util.List;
038 import java.util.Locale;
039 import java.util.Map;
040
041 import javax.portlet.PortletURL;
042
043
048 public class OrganizationIndexer extends BaseIndexer {
049
050 public static final String[] CLASS_NAMES = {Organization.class.getName()};
051
052 public static final String PORTLET_ID = PortletKeys.USERS_ADMIN;
053
054 public OrganizationIndexer() {
055 setStagingAware(false);
056 }
057
058 public String[] getClassNames() {
059 return CLASS_NAMES;
060 }
061
062 public String getPortletId() {
063 return PORTLET_ID;
064 }
065
066 @Override
067 public boolean isIndexerEnabled() {
068 return PropsValues.ORGANIZATIONS_INDEXER_ENABLED;
069 }
070
071 @Override
072 public boolean isPermissionAware() {
073 return _PERMISSION_AWARE;
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 @Override
133 protected void doDelete(Object obj) throws Exception {
134 Organization organization = (Organization)obj;
135
136 deleteDocument(
137 organization.getCompanyId(), organization.getOrganizationId());
138 }
139
140 @Override
141 protected Document doGetDocument(Object obj) throws Exception {
142 Organization organization = (Organization)obj;
143
144 Document document = getBaseModelDocument(PORTLET_ID, organization);
145
146 document.addKeyword(Field.COMPANY_ID, organization.getCompanyId());
147 document.addText(Field.NAME, organization.getName());
148 document.addKeyword(
149 Field.ORGANIZATION_ID, organization.getOrganizationId());
150 document.addKeyword(Field.TYPE, organization.getType());
151
152 document.addKeyword(
153 "parentOrganizationId", organization.getParentOrganizationId());
154
155 String treePath = organization.buildTreePath();
156
157 document.addKeyword("treePath", treePath);
158
159 populateAddresses(
160 document, organization.getAddresses(), organization.getRegionId(),
161 organization.getCountryId());
162
163 return document;
164 }
165
166 @Override
167 protected String doGetSortField(String orderByCol) {
168 if (orderByCol.equals("name")) {
169 return "name";
170 }
171 else if (orderByCol.equals("type")) {
172 return "type";
173 }
174 else {
175 return orderByCol;
176 }
177 }
178
179 @Override
180 protected Summary doGetSummary(
181 Document document, Locale locale, String snippet,
182 PortletURL portletURL) {
183
184 String title = document.get("name");
185
186 String content = null;
187
188 String organizationId = document.get(Field.ORGANIZATION_ID);
189
190 portletURL.setParameter(
191 "struts_action", "/users_admin/edit_organization");
192 portletURL.setParameter("organizationId", organizationId);
193
194 return new Summary(title, content, portletURL);
195 }
196
197 @Override
198 protected void doReindex(Object obj) throws Exception {
199 if (obj instanceof List<?>) {
200 List<Organization> organizations = (List<Organization>)obj;
201
202 for (Organization organization : organizations) {
203 doReindex(organization);
204 }
205 }
206 else if (obj instanceof Long) {
207 long organizationId = (Long)obj;
208
209 Organization organization =
210 OrganizationLocalServiceUtil.getOrganization(organizationId);
211
212 doReindex(organization);
213 }
214 else if (obj instanceof long[]) {
215 long[] organizationIds = (long[])obj;
216
217 Map<Long, Collection<Document>> documentsMap =
218 new HashMap<Long, Collection<Document>>();
219
220 for (long organizationId : organizationIds) {
221 Organization organization =
222 OrganizationLocalServiceUtil.fetchOrganization(
223 organizationId);
224
225 if (organization == null) {
226 continue;
227 }
228
229 Document document = getDocument(organization);
230
231 long companyId = organization.getCompanyId();
232
233 Collection<Document> documents = documentsMap.get(companyId);
234
235 if (documents == null) {
236 documents = new ArrayList<Document>();
237
238 documentsMap.put(companyId, documents);
239 }
240
241 documents.add(document);
242 }
243
244 for (Map.Entry<Long, Collection<Document>> entry :
245 documentsMap.entrySet()) {
246
247 long companyId = entry.getKey();
248 Collection<Document> documents = entry.getValue();
249
250 SearchEngineUtil.updateDocuments(companyId, documents);
251 }
252 }
253 else if (obj instanceof Organization) {
254 Organization organization = (Organization)obj;
255
256 Document document = getDocument(organization);
257
258 SearchEngineUtil.updateDocument(
259 organization.getCompanyId(), document);
260 }
261 }
262
263 @Override
264 protected void doReindex(String className, long classPK) throws Exception {
265 Organization organization =
266 OrganizationLocalServiceUtil.getOrganization(classPK);
267
268 doReindex(organization);
269 }
270
271 @Override
272 protected void doReindex(String[] ids) throws Exception {
273 long companyId = GetterUtil.getLong(ids[0]);
274
275 reindexOrganizations(companyId);
276 }
277
278 @Override
279 protected String getPortletId(SearchContext searchContext) {
280 return PORTLET_ID;
281 }
282
283 protected void reindexOrganizations(long companyId) throws Exception {
284 int count = OrganizationLocalServiceUtil.getOrganizationsCount();
285
286 int pages = count / OrganizationIndexer.DEFAULT_INTERVAL;
287
288 for (int i = 0; i <= pages; i++) {
289 int start = (i * OrganizationIndexer.DEFAULT_INTERVAL);
290 int end = start + OrganizationIndexer.DEFAULT_INTERVAL;
291
292 reindexOrganizations(companyId, start, end);
293 }
294 }
295
296 protected void reindexOrganizations(long companyId, int start, int end)
297 throws Exception {
298
299 List<Organization> organizations =
300 OrganizationLocalServiceUtil.getOrganizations(start, end);
301
302 if (organizations.isEmpty()) {
303 return;
304 }
305
306 Collection<Document> documents = new ArrayList<Document>();
307
308 for (Organization organization : organizations) {
309 Document document = getDocument(organization);
310
311 documents.add(document);
312 }
313
314 SearchEngineUtil.updateDocuments(companyId, documents);
315 }
316
317 private static final boolean _PERMISSION_AWARE = true;
318
319 }