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<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(
246 getSearchEngineId(), companyId, documents);
247 }
248 }
249 else if (obj instanceof Organization) {
250 Organization organization = (Organization)obj;
251
252 Document document = getDocument(organization);
253
254 SearchEngineUtil.updateDocument(
255 getSearchEngineId(), organization.getCompanyId(), document);
256 }
257 }
258
259 @Override
260 protected void doReindex(String className, long classPK) throws Exception {
261 Organization organization =
262 OrganizationLocalServiceUtil.getOrganization(classPK);
263
264 doReindex(organization);
265 }
266
267 @Override
268 protected void doReindex(String[] ids) throws Exception {
269 long companyId = GetterUtil.getLong(ids[0]);
270
271 reindexOrganizations(companyId);
272 }
273
274 @Override
275 protected String getPortletId(SearchContext searchContext) {
276 return PORTLET_ID;
277 }
278
279 protected void reindexOrganizations(long companyId) throws Exception {
280 final Collection<Document> documents = new ArrayList<Document>();
281
282 ActionableDynamicQuery actionableDynamicQuery =
283 new OrganizationActionableDynamicQuery() {
284
285 @Override
286 protected void performAction(Object object) throws PortalException {
287 Organization organization = (Organization)object;
288
289 Document document = getDocument(organization);
290
291 documents.add(document);
292 }
293
294 };
295
296 actionableDynamicQuery.setCompanyId(companyId);
297
298 actionableDynamicQuery.performActions();
299
300 SearchEngineUtil.updateDocuments(
301 getSearchEngineId(), companyId, documents);
302 }
303
304 }