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 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<Organization> organizationsTree = (List<Organization>)params.get(
084 "organizationsTree");
085
086 if ((organizationsTree != null) && !organizationsTree.isEmpty()) {
087 BooleanQuery booleanQuery = BooleanQueryFactoryUtil.create(
088 searchContext);
089
090 for (Organization organization : organizationsTree) {
091 String treePath = organization.buildTreePath();
092
093 booleanQuery.addTerm("treePath", treePath, true);
094 }
095
096 contextQuery.add(booleanQuery, BooleanClauseOccur.MUST);
097 }
098 }
099
100 @Override
101 public void postProcessSearchQuery(
102 BooleanQuery searchQuery, SearchContext searchContext)
103 throws Exception {
104
105 addSearchTerm(searchQuery, searchContext, "city", false);
106 addSearchTerm(searchQuery, searchContext, "country", false);
107 addSearchTerm(searchQuery, searchContext, "name", false);
108 addSearchTerm(
109 searchQuery, searchContext, "parentOrganizationId", false);
110 addSearchTerm(searchQuery, searchContext, "region", false);
111 addSearchTerm(searchQuery, searchContext, "street", false);
112 addSearchTerm(searchQuery, searchContext, "type", false);
113 addSearchTerm(searchQuery, searchContext, "zip", false);
114
115 LinkedHashMap<String, Object> params =
116 (LinkedHashMap<String, Object>)searchContext.getAttribute("params");
117
118 if (params != null) {
119 String expandoAttributes = (String)params.get("expandoAttributes");
120
121 if (Validator.isNotNull(expandoAttributes)) {
122 addSearchExpando(searchQuery, searchContext, expandoAttributes);
123 }
124 }
125 }
126
127 @Override
128 protected void doDelete(Object obj) throws Exception {
129 Organization organization = (Organization)obj;
130
131 deleteDocument(
132 organization.getCompanyId(), organization.getOrganizationId());
133 }
134
135 @Override
136 protected Document doGetDocument(Object obj) throws Exception {
137 Organization organization = (Organization)obj;
138
139 Document document = getBaseModelDocument(PORTLET_ID, organization);
140
141 document.addKeyword(Field.COMPANY_ID, organization.getCompanyId());
142 document.addText(Field.NAME, organization.getName());
143 document.addKeyword(
144 Field.ORGANIZATION_ID, organization.getOrganizationId());
145 document.addKeyword(Field.TYPE, organization.getType());
146
147 document.addKeyword(
148 "parentOrganizationId", organization.getParentOrganizationId());
149
150 String treePath = organization.buildTreePath();
151
152 document.addKeyword("treePath", treePath);
153
154 populateAddresses(
155 document, organization.getAddresses(), organization.getRegionId(),
156 organization.getCountryId());
157
158 return document;
159 }
160
161 @Override
162 protected String doGetSortField(String orderByCol) {
163 if (orderByCol.equals("name")) {
164 return "name";
165 }
166 else if (orderByCol.equals("type")) {
167 return "type";
168 }
169 else {
170 return orderByCol;
171 }
172 }
173
174 @Override
175 protected Summary doGetSummary(
176 Document document, Locale locale, String snippet,
177 PortletURL portletURL) {
178
179 String title = document.get("name");
180
181 String content = null;
182
183 String organizationId = document.get(Field.ORGANIZATION_ID);
184
185 portletURL.setParameter(
186 "struts_action", "/users_admin/edit_organization");
187 portletURL.setParameter("organizationId", organizationId);
188
189 return new Summary(title, content, portletURL);
190 }
191
192 @Override
193 protected void doReindex(Object obj) throws Exception {
194 if (obj instanceof List<?>) {
195 List<Organization> organizations = (List<Organization>)obj;
196
197 for (Organization organization : organizations) {
198 doReindex(organization);
199 }
200 }
201 else if (obj instanceof Long) {
202 long organizationId = (Long)obj;
203
204 Organization organization =
205 OrganizationLocalServiceUtil.getOrganization(organizationId);
206
207 doReindex(organization);
208 }
209 else if (obj instanceof long[]) {
210 long[] organizationIds = (long[])obj;
211
212 Map<Long, Collection<Document>> documentsMap =
213 new HashMap<Long, Collection<Document>>();
214
215 for (long organizationId : organizationIds) {
216 Organization organization =
217 OrganizationLocalServiceUtil.fetchOrganization(
218 organizationId);
219
220 if (organization == null) {
221 continue;
222 }
223
224 Document document = getDocument(organization);
225
226 long companyId = organization.getCompanyId();
227
228 Collection<Document> documents = documentsMap.get(companyId);
229
230 if (documents == null) {
231 documents = new ArrayList<Document>();
232
233 documentsMap.put(companyId, documents);
234 }
235
236 documents.add(document);
237 }
238
239 for (Map.Entry<Long, Collection<Document>> entry :
240 documentsMap.entrySet()) {
241
242 long companyId = entry.getKey();
243 Collection<Document> documents = entry.getValue();
244
245 SearchEngineUtil.updateDocuments(companyId, documents);
246 }
247 }
248 else if (obj instanceof Organization) {
249 Organization organization = (Organization)obj;
250
251 Document document = getDocument(organization);
252
253 SearchEngineUtil.updateDocument(
254 organization.getCompanyId(), document);
255 }
256 }
257
258 @Override
259 protected void doReindex(String className, long classPK) throws Exception {
260 Organization organization =
261 OrganizationLocalServiceUtil.getOrganization(classPK);
262
263 doReindex(organization);
264 }
265
266 @Override
267 protected void doReindex(String[] ids) throws Exception {
268 long companyId = GetterUtil.getLong(ids[0]);
269
270 reindexOrganizations(companyId);
271 }
272
273 @Override
274 protected String getPortletId(SearchContext searchContext) {
275 return PORTLET_ID;
276 }
277
278 protected void reindexOrganizations(long companyId) throws Exception {
279 int count = OrganizationLocalServiceUtil.getOrganizationsCount();
280
281 int pages = count / OrganizationIndexer.DEFAULT_INTERVAL;
282
283 for (int i = 0; i <= pages; i++) {
284 int start = (i * OrganizationIndexer.DEFAULT_INTERVAL);
285 int end = start + OrganizationIndexer.DEFAULT_INTERVAL;
286
287 reindexOrganizations(companyId, start, end);
288 }
289 }
290
291 protected void reindexOrganizations(long companyId, int start, int end)
292 throws Exception {
293
294 List<Organization> organizations =
295 OrganizationLocalServiceUtil.getOrganizations(start, end);
296
297 if (organizations.isEmpty()) {
298 return;
299 }
300
301 Collection<Document> documents = new ArrayList<Document>();
302
303 for (Organization organization : organizations) {
304 Document document = getDocument(organization);
305
306 documents.add(document);
307 }
308
309 SearchEngineUtil.updateDocuments(companyId, documents);
310 }
311
312 }