2 * Copyright (c) 2000-2012 Liferay, Inc. All rights reserved.
\r
4 * This library is free software; you can redistribute it and/or modify it under
\r
5 * the terms of the GNU Lesser General Public License as published by the Free
\r
6 * Software Foundation; either version 2.1 of the License, or (at your option)
\r
9 * This library is distributed in the hope that it will be useful, but WITHOUT
\r
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
\r
11 * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
\r
15 package com.liferay.portlet.documentlibrary.util;
\r
17 import java.io.IOException;
\r
18 import java.io.InputStream;
\r
19 import java.text.SimpleDateFormat;
\r
20 import java.util.ArrayList;
\r
21 import java.util.Collection;
\r
22 import java.util.LinkedHashMap;
\r
23 import java.util.List;
\r
24 import java.util.Locale;
\r
25 import java.util.Set;
\r
26 import java.util.TreeSet;
\r
28 import javax.portlet.PortletRequest;
\r
29 import javax.portlet.PortletURL;
\r
30 import javax.portlet.WindowStateException;
\r
32 import com.liferay.portal.kernel.dao.orm.DynamicQuery;
\r
33 import com.liferay.portal.kernel.dao.orm.DynamicQueryFactoryUtil;
\r
34 import com.liferay.portal.kernel.dao.orm.Projection;
\r
35 import com.liferay.portal.kernel.dao.orm.ProjectionFactoryUtil;
\r
36 import com.liferay.portal.kernel.dao.orm.ProjectionList;
\r
37 import com.liferay.portal.kernel.dao.orm.Property;
\r
38 import com.liferay.portal.kernel.dao.orm.PropertyFactoryUtil;
\r
39 import com.liferay.portal.kernel.exception.PortalException;
\r
40 import com.liferay.portal.kernel.exception.SystemException;
\r
41 import com.liferay.portal.kernel.log.Log;
\r
42 import com.liferay.portal.kernel.log.LogFactoryUtil;
\r
43 import com.liferay.portal.kernel.portlet.LiferayPortletURL;
\r
44 import com.liferay.portal.kernel.portlet.LiferayWindowState;
\r
45 import com.liferay.portal.kernel.repository.model.FileEntry;
\r
46 import com.liferay.portal.kernel.search.BaseIndexer;
\r
47 import com.liferay.portal.kernel.search.BooleanClauseOccur;
\r
48 import com.liferay.portal.kernel.search.BooleanQuery;
\r
49 import com.liferay.portal.kernel.search.BooleanQueryFactoryUtil;
\r
50 import com.liferay.portal.kernel.search.Document;
\r
51 import com.liferay.portal.kernel.search.DocumentImpl;
\r
52 import com.liferay.portal.kernel.search.Field;
\r
53 import com.liferay.portal.kernel.search.SearchContext;
\r
54 import com.liferay.portal.kernel.search.SearchEngineUtil;
\r
55 import com.liferay.portal.kernel.search.SearchException;
\r
56 import com.liferay.portal.kernel.search.Summary;
\r
57 import com.liferay.portal.kernel.util.ArrayUtil;
\r
58 import com.liferay.portal.kernel.util.GetterUtil;
\r
59 import com.liferay.portal.kernel.util.HtmlUtil;
\r
60 import com.liferay.portal.kernel.util.ListUtil;
\r
61 import com.liferay.portal.kernel.util.PropsKeys;
\r
62 import com.liferay.portal.kernel.util.StringPool;
\r
63 import com.liferay.portal.kernel.util.StringUtil;
\r
64 import com.liferay.portal.kernel.util.Validator;
\r
65 import com.liferay.portal.kernel.workflow.WorkflowConstants;
\r
66 import com.liferay.portal.model.Group;
\r
67 import com.liferay.portal.model.Organization;
\r
68 import com.liferay.portal.security.pacl.PACLClassLoaderUtil;
\r
69 import com.liferay.portal.security.permission.ActionKeys;
\r
70 import com.liferay.portal.security.permission.PermissionChecker;
\r
71 import com.liferay.portal.service.GroupLocalServiceUtil;
\r
72 import com.liferay.portal.service.UserLocalServiceUtil;
\r
73 import com.liferay.portal.util.PortalUtil;
\r
74 import com.liferay.portal.util.PortletKeys;
\r
75 import com.liferay.portal.util.PrefsPropsUtil;
\r
76 import com.liferay.portal.util.PropsValues;
\r
77 import com.liferay.portlet.asset.model.AssetCategory;
\r
78 import com.liferay.portlet.asset.service.AssetCategoryLocalServiceUtil;
\r
79 import com.liferay.portlet.asset.service.AssetTagLocalServiceUtil;
\r
80 import com.liferay.portlet.bookmarks.service.BookmarksFolderLocalServiceUtil;
\r
81 import com.liferay.portlet.documentlibrary.model.DLFileEntry;
\r
82 import com.liferay.portlet.documentlibrary.model.DLFileEntryMetadata;
\r
83 import com.liferay.portlet.documentlibrary.model.DLFileEntryType;
\r
84 import com.liferay.portlet.documentlibrary.model.DLFileVersion;
\r
85 import com.liferay.portlet.documentlibrary.model.DLFolder;
\r
86 import com.liferay.portlet.documentlibrary.model.DLFolderConstants;
\r
87 import com.liferay.portlet.documentlibrary.service.DLFileEntryLocalServiceUtil;
\r
88 import com.liferay.portlet.documentlibrary.service.DLFileEntryMetadataLocalServiceUtil;
\r
89 import com.liferay.portlet.documentlibrary.service.DLFileEntryTypeLocalServiceUtil;
\r
90 import com.liferay.portlet.documentlibrary.service.DLFolderLocalServiceUtil;
\r
91 import com.liferay.portlet.documentlibrary.service.DLFolderServiceUtil;
\r
92 import com.liferay.portlet.documentlibrary.service.permission.DLFileEntryPermission;
\r
93 import com.liferay.portlet.dynamicdatamapping.model.DDMStructure;
\r
94 import com.liferay.portlet.dynamicdatamapping.service.DDMStructureLocalServiceUtil;
\r
95 import com.liferay.portlet.dynamicdatamapping.storage.Fields;
\r
96 import com.liferay.portlet.dynamicdatamapping.storage.StorageEngineUtil;
\r
97 import com.liferay.portlet.dynamicdatamapping.util.DDMIndexerUtil;
\r
98 import com.liferay.portlet.expando.model.ExpandoBridge;
\r
99 import com.liferay.portlet.expando.util.ExpandoBridgeFactoryUtil;
\r
100 import com.liferay.portlet.expando.util.ExpandoBridgeIndexerUtil;
\r
101 import com.pentila.entSavoie.cartable.model.DlLink;
\r
102 import com.pentila.entSavoie.cartable.model.FileTag;
\r
103 import com.pentila.entSavoie.cartable.service.DlLinkLocalServiceUtil;
\r
104 import com.pentila.entSavoie.cartable.service.FileTagLocalServiceUtil;
\r
105 import com.pentila.entSavoie.communityInfos.model.CommunityInfos;
\r
106 import com.pentila.entSavoie.communityInfos.service.CommunityInfosLocalServiceUtil;
\r
107 import com.pentila.entSavoie.directory.OrganizationFinderServiceUtil;
\r
108 import com.pentila.entSavoie.search.util.IndexerUtil;
\r
109 import com.pentila.entSavoie.utils.DLEntryUtil;
\r
112 * @author Brian Wing Shun Chan
\r
113 * @author Raymond Augé
\r
114 * @author Alexander Chow
\r
116 public class DLIndexer extends BaseIndexer {
\r
118 public static final String[] CLASS_NAMES = {DLFileEntry.class.getName()};
\r
120 public static final String PORTLET_ID = PortletKeys.DOCUMENT_LIBRARY;
\r
122 public String[] getClassNames() {
\r
123 return CLASS_NAMES;
\r
126 public String getPortletId() {
\r
131 public boolean hasPermission(
\r
132 PermissionChecker permissionChecker, long entryClassPK,
\r
136 return DLFileEntryPermission.contains(
\r
137 permissionChecker, entryClassPK, ActionKeys.VIEW);
\r
141 public boolean isFilterSearch() {
\r
142 return _FILTER_SEARCH;
\r
146 public boolean isPermissionAware() {
\r
147 return _PERMISSION_AWARE;
\r
151 public void postProcessContextQuery(
\r
152 BooleanQuery contextQuery, SearchContext searchContext)
\r
155 int status = GetterUtil.getInteger(
\r
156 searchContext.getAttribute(Field.STATUS),
\r
157 WorkflowConstants.STATUS_APPROVED);
\r
159 if (status != WorkflowConstants.STATUS_ANY) {
\r
160 contextQuery.addRequiredTerm(Field.STATUS, status);
\r
163 long[] folderIds = searchContext.getFolderIds();
\r
165 if ((folderIds != null) && (folderIds.length > 0)) {
\r
166 if (folderIds[0] == DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
\r
170 BooleanQuery folderIdsQuery = BooleanQueryFactoryUtil.create(
\r
173 for (long folderId : folderIds) {
\r
175 DLFolderServiceUtil.getFolder(folderId);
\r
177 catch (Exception e) {
\r
181 folderIdsQuery.addTerm(Field.FOLDER_ID, folderId);
\r
184 contextQuery.add(folderIdsQuery, BooleanClauseOccur.MUST);
\r
189 public void postProcessSearchQuery(
\r
190 BooleanQuery searchQuery, SearchContext searchContext)
\r
193 Set<DDMStructure> ddmStructuresSet = new TreeSet<DDMStructure>();
\r
195 long[] groupIds = searchContext.getGroupIds();
\r
197 if ((groupIds != null) && (groupIds.length > 0)) {
\r
198 List<DLFileEntryType> dlFileEntryTypes =
\r
199 DLFileEntryTypeLocalServiceUtil.getFileEntryTypes(groupIds);
\r
201 for (DLFileEntryType dlFileEntryType : dlFileEntryTypes) {
\r
202 ddmStructuresSet.addAll(dlFileEntryType.getDDMStructures());
\r
206 Group group = GroupLocalServiceUtil.getCompanyGroup(
\r
207 searchContext.getCompanyId());
\r
209 DDMStructure tikaRawMetadataStructure =
\r
210 DDMStructureLocalServiceUtil.fetchStructure(
\r
211 group.getGroupId(), "TikaRawMetadata");
\r
213 if (tikaRawMetadataStructure != null) {
\r
214 ddmStructuresSet.add(tikaRawMetadataStructure);
\r
217 for (DDMStructure ddmStructure : ddmStructuresSet) {
\r
218 addSearchDDMStruture(searchQuery, searchContext, ddmStructure);
\r
221 addSearchTerm(searchQuery, searchContext, Field.USER_NAME, false);
\r
223 addSearchTerm(searchQuery, searchContext, "extension", false);
\r
224 addSearchTerm(searchQuery, searchContext, "fileEntryTypeId", false);
\r
225 addSearchTerm(searchQuery, searchContext, "path", false);
\r
227 LinkedHashMap<String, Object> params =
\r
228 (LinkedHashMap<String, Object>)searchContext.getAttribute("params");
\r
230 if (params != null) {
\r
231 String expandoAttributes = (String)params.get("expandoAttributes");
\r
233 if (Validator.isNotNull(expandoAttributes)) {
\r
234 addSearchExpando(searchQuery, searchContext, expandoAttributes);
\r
239 protected void addFileEntryTypeAttributes(
\r
240 Document document, DLFileVersion dlFileVersion)
\r
241 throws PortalException, SystemException {
\r
243 DLFileEntryType dlFileEntryType =
\r
244 DLFileEntryTypeLocalServiceUtil.getFileEntryType(
\r
245 dlFileVersion.getFileEntryTypeId());
\r
247 List<DDMStructure> ddmStructures = dlFileEntryType.getDDMStructures();
\r
249 Group group = GroupLocalServiceUtil.getCompanyGroup(
\r
250 dlFileVersion.getCompanyId());
\r
252 DDMStructure tikaRawMetadataStructure =
\r
253 DDMStructureLocalServiceUtil.fetchStructure(
\r
254 group.getGroupId(), "TikaRawMetadata");
\r
256 if (tikaRawMetadataStructure != null) {
\r
257 ddmStructures = ListUtil.copy(ddmStructures);
\r
259 ddmStructures.add(tikaRawMetadataStructure);
\r
262 for (DDMStructure ddmStructure : ddmStructures) {
\r
263 Fields fields = null;
\r
266 DLFileEntryMetadata fileEntryMetadata =
\r
267 DLFileEntryMetadataLocalServiceUtil.getFileEntryMetadata(
\r
268 ddmStructure.getStructureId(),
\r
269 dlFileVersion.getFileVersionId());
\r
271 fields = StorageEngineUtil.getFields(
\r
272 fileEntryMetadata.getDDMStorageId());
\r
274 catch (Exception e) {
\r
277 if (fields != null) {
\r
278 DDMIndexerUtil.addAttributes(document, ddmStructure, fields);
\r
283 protected void addReindexCriteria(
\r
284 DynamicQuery dynamicQuery, long companyId) {
\r
286 Property property = PropertyFactoryUtil.forName("companyId");
\r
288 dynamicQuery.add(property.eq(companyId));
\r
291 protected void addReindexCriteria(
\r
292 DynamicQuery dynamicQuery, long groupId, long folderId) {
\r
294 Property groupIdProperty = PropertyFactoryUtil.forName("groupId");
\r
296 dynamicQuery.add(groupIdProperty.eq(groupId));
\r
298 Property folderIdProperty = PropertyFactoryUtil.forName("folderId");
\r
300 dynamicQuery.add(folderIdProperty.eq(folderId));
\r
304 protected void doDelete(Object obj) throws Exception {
\r
305 DLFileEntry dlFileEntry;
\r
307 if(obj instanceof FileEntry){
\r
308 FileEntry fileEntry = (FileEntry) obj;
\r
309 dlFileEntry = DLFileEntryLocalServiceUtil.getDLFileEntry(fileEntry.getFileEntryId());
\r
312 dlFileEntry = (DLFileEntry)obj;
\r
315 Document document = new DocumentImpl();
\r
317 document.addUID(PORTLET_ID, dlFileEntry.getFileEntryId());
\r
319 SearchEngineUtil.deleteDocument(
\r
320 getSearchEngineId(), dlFileEntry.getCompanyId(),
\r
321 document.get(Field.UID));
\r
325 protected Document doGetDocument(Object obj) throws Exception {
\r
326 DLFileEntry dlFileEntry;
\r
328 if(obj instanceof FileEntry){
\r
329 FileEntry fileEntry = (FileEntry) obj;
\r
330 dlFileEntry = DLFileEntryLocalServiceUtil.getDLFileEntry(fileEntry.getFileEntryId());
\r
333 dlFileEntry = (DLFileEntry)obj;
\r
336 if (_log.isDebugEnabled()) {
\r
337 _log.debug("Indexing document " + dlFileEntry);
\r
340 boolean indexContent = true;
\r
342 InputStream is = null;
\r
345 if (PropsValues.DL_FILE_INDEXING_MAX_SIZE == 0) {
\r
346 indexContent = false;
\r
348 else if (PropsValues.DL_FILE_INDEXING_MAX_SIZE != -1) {
\r
349 if (dlFileEntry.getSize() >
\r
350 PropsValues.DL_FILE_INDEXING_MAX_SIZE) {
\r
352 indexContent = false;
\r
356 if (indexContent) {
\r
357 String[] ignoreExtensions = PrefsPropsUtil.getStringArray(
\r
358 PropsKeys.DL_FILE_INDEXING_IGNORE_EXTENSIONS,
\r
361 if (ArrayUtil.contains(
\r
363 StringPool.PERIOD + dlFileEntry.getExtension())) {
\r
365 indexContent = false;
\r
369 if (indexContent) {
\r
370 // check for a link
\r
372 DlLink dll = DlLinkLocalServiceUtil.getDlFileLinkByTarget(dlFileEntry.getFileEntryId());
\r
373 // we have a link so we index the source content !!!!!
\r
374 DLFileEntry dlfe = DLFileEntryLocalServiceUtil.getDLFileEntry(dll.getSourceId());
\r
375 is = dlfe.getFileVersion().getContentStream(false);
\r
376 } catch (Exception e1) {
\r
377 is = dlFileEntry.getFileVersion().getContentStream(false);
\r
381 catch (Exception e) {
\r
384 if (indexContent && (is == null)) {
\r
385 if (_log.isDebugEnabled()) {
\r
387 "Document " + dlFileEntry + " does not have any content");
\r
394 Document document = new DocumentImpl();
\r
396 long fileEntryId = dlFileEntry.getFileEntryId();
\r
398 document.addUID(PORTLET_ID, fileEntryId);
\r
401 List<AssetCategory> assetCategories =
\r
402 AssetCategoryLocalServiceUtil.getCategories(
\r
403 DLFileEntry.class.getName(), fileEntryId);
\r
405 long[] assetCategoryIds = StringUtil.split(
\r
407 assetCategories, AssetCategory.CATEGORY_ID_ACCESSOR),
\r
410 document.addKeyword(Field.ASSET_CATEGORY_IDS, assetCategoryIds);
\r
412 addSearchAssetCategoryTitles(
\r
413 document, Field.ASSET_CATEGORY_TITLES, assetCategories);
\r
414 } catch(Exception e){
\r
415 // No such asset category
\r
419 String[] assetTagNames = AssetTagLocalServiceUtil.getTagNames(
\r
420 DLFileEntry.class.getName(), fileEntryId);
\r
422 document.addKeyword(Field.ASSET_TAG_NAMES, assetTagNames);
\r
423 } catch(Exception e){
\r
424 // No such asset category
\r
427 document.addKeyword(Field.COMPANY_ID, dlFileEntry.getCompanyId());
\r
429 if (indexContent) {
\r
430 if(dlFileEntry.getExtension().equals("html") || dlFileEntry.getExtension().equals("htm")){
\r
431 document.addText(Field.CONTENT, IndexerUtil.normalizeString(HtmlUtil.extractText(StringUtil.read(is))));
\r
435 document.addFile(Field.CONTENT, is, dlFileEntry.getTitle());
\r
436 } catch (IOException ioe) {
\r
437 throw new SearchException(
\r
438 "Cannot extract text from file" + dlFileEntry);
\r
443 document.addText(Field.DESCRIPTION, dlFileEntry.getDescription());
\r
444 document.addKeyword(
\r
445 Field.ENTRY_CLASS_NAME, DLFileEntry.class.getName());
\r
446 document.addKeyword(Field.ENTRY_CLASS_PK, fileEntryId);
\r
447 document.addKeyword(Field.FOLDER_ID, dlFileEntry.getFolderId());
\r
448 document.addKeyword(
\r
449 Field.GROUP_ID, dlFileEntry.getGroupId());
\r
452 if(dlFileEntry.getGroupId()>0){
\r
453 Group group = GroupLocalServiceUtil.getGroup(dlFileEntry.getGroupId());
\r
454 if(group.isOrganization()){
\r
455 document.addKeyword("etabId", IndexerUtil.getEtabId(Long.valueOf(group.getOrganizationId())));
\r
457 CommunityInfos ci = CommunityInfosLocalServiceUtil.getCommunityInfosByGroupId(dlFileEntry.getGroupId());
\r
458 if (ci.getStatus()==0) {
\r
459 document.addKeyword("etabId", IndexerUtil.getEtabId(ci.getEtabId()));
\r
464 // Ce cas ne doit normalement pas arrive
\r
465 Organization etab = OrganizationFinderServiceUtil.getEtabRatachement(UserLocalServiceUtil.getUser(dlFileEntry.getGroupId()));
\r
466 document.addKeyword("etabId", etab.getGroupId());
\r
468 } catch (Exception e){}
\r
470 SimpleDateFormat classicDateFormat = new SimpleDateFormat("yyyy-MM-dd");
\r
471 document.addDate(Field.MODIFIED_DATE, dlFileEntry.getModifiedDate());
\r
472 document.addText(IndexerUtil.MODIFIED_DATE_FORMATTED, classicDateFormat.format(dlFileEntry.getModifiedDate()));
\r
474 document.addKeyword(Field.PORTLET_ID, PORTLET_ID);
\r
476 Field.PROPERTIES, dlFileEntry.getLuceneProperties());
\r
477 document.addKeyword(Field.SCOPE_GROUP_ID, dlFileEntry.getGroupId());
\r
479 DLFileVersion dlFileVersion = dlFileEntry.getFileVersion();
\r
481 document.addKeyword(Field.STATUS, dlFileVersion.getStatus());
\r
482 document.addText(Field.TITLE, IndexerUtil.normalizeString(dlFileEntry.getTitle()));
\r
484 // Add Tags On FileEntry Indexation
\r
486 FileTag fileTag = FileTagLocalServiceUtil.getFileTagByFileEntryId(fileEntryId);
\r
487 String keywordList = (fileTag != null)? fileTag.getKeywordList() : "";
\r
488 String tagList = (fileTag != null)? fileTag.getTagList() : "";
\r
489 String linkList = (fileTag != null)? fileTag.getLinkList() : "";
\r
490 document.addKeyword("keywordList", keywordList);
\r
491 document.addKeyword("tagList", tagList);
\r
492 document.addKeyword("linkList", linkList);
\r
493 } catch (Exception e) {
\r
494 // No File tag associated to the DLFile
\r
497 long userId = dlFileEntry.getUserId();
\r
499 document.addKeyword(Field.USER_ID, userId);
\r
500 document.addKeyword(
\r
502 PortalUtil.getUserName(userId, dlFileEntry.getUserName()),
\r
505 document.addKeyword(
\r
506 "dataRepositoryId", dlFileEntry.getDataRepositoryId());
\r
507 document.addKeyword("extension", dlFileEntry.getExtension());
\r
508 document.addKeyword(
\r
509 "fileEntryTypeId", dlFileEntry.getFileEntryTypeId());
\r
510 document.addKeyword("path", dlFileEntry.getTitle());
\r
512 ExpandoBridge expandoBridge =
\r
513 ExpandoBridgeFactoryUtil.getExpandoBridge(
\r
514 dlFileEntry.getCompanyId(), DLFileEntry.class.getName(),
\r
515 dlFileVersion.getFileVersionId());
\r
517 ExpandoBridgeIndexerUtil.addAttributes(document, expandoBridge);
\r
519 addFileEntryTypeAttributes(document, dlFileVersion);
\r
521 if (_log.isDebugEnabled()) {
\r
522 _log.debug("Document " + dlFileEntry + " indexed successfully");
\r
532 catch (IOException ioe) {
\r
539 protected Summary doGetSummary(
\r
540 Document document, Locale locale, String snippet,
\r
541 PortletURL portletURL) {
\r
543 LiferayPortletURL liferayPortletURL = (LiferayPortletURL)portletURL;
\r
545 liferayPortletURL.setLifecycle(PortletRequest.ACTION_PHASE);
\r
548 liferayPortletURL.setWindowState(LiferayWindowState.EXCLUSIVE);
\r
550 catch (WindowStateException wse) {
\r
553 String title = document.get(Field.TITLE);
\r
555 String content = StringUtil.shorten(document.get(Field.CONTENT), 200);
\r
557 String fileEntryId = document.get(Field.ENTRY_CLASS_PK);
\r
559 portletURL.setParameter("struts_action", "/document_library/get_file");
\r
560 portletURL.setParameter("fileEntryId", fileEntryId);
\r
562 return new Summary(title, content, portletURL);
\r
566 protected void doReindex(Object obj) throws Exception {
\r
567 DLFileEntry dlFileEntry;
\r
569 if(obj instanceof FileEntry){
\r
570 FileEntry fileEntry = (FileEntry) obj;
\r
571 dlFileEntry = DLFileEntryLocalServiceUtil.getDLFileEntry(fileEntry.getFileEntryId());
\r
574 dlFileEntry = (DLFileEntry)obj;
\r
577 DLFileVersion dlFileVersion = dlFileEntry.getLatestFileVersion(true);
\r
579 if (!dlFileVersion.isApproved()) {
\r
583 Document document = getDocument(dlFileEntry);
\r
585 if (document != null) {
\r
586 SearchEngineUtil.updateDocument(
\r
587 getSearchEngineId(), dlFileEntry.getCompanyId(), document);
\r
592 protected void doReindex(String className, long classPK) throws Exception {
\r
593 DLFileEntry dlFileEntry = DLFileEntryLocalServiceUtil.getFileEntry(
\r
596 doReindex(dlFileEntry);
\r
600 protected void doReindex(String[] ids) throws Exception {
\r
601 if (ids.length == 1) {
\r
602 long companyId = GetterUtil.getLong(ids[0]);
\r
604 reindexFolders(companyId);
\r
605 reindexRoot(companyId);
\r
608 long companyId = GetterUtil.getLong(ids[0]);
\r
609 long groupId = GetterUtil.getLong(ids[2]);
\r
610 long dataRepositoryId = GetterUtil.getLong(ids[3]);
\r
612 reindexFileEntries(companyId, groupId, dataRepositoryId);
\r
617 protected String getPortletId(SearchContext searchContext) {
\r
621 protected void reindexFileEntries(
\r
622 long companyId, long groupId, long dataRepositoryId)
\r
625 DynamicQuery dynamicQuery = DynamicQueryFactoryUtil.forClass(
\r
626 DLFileEntry.class, PACLClassLoaderUtil.getPortalClassLoader());
\r
628 Projection minFileEntryIdProjection = ProjectionFactoryUtil.min(
\r
630 Projection maxFileEntryIdProjection = ProjectionFactoryUtil.max(
\r
633 ProjectionList projectionList = ProjectionFactoryUtil.projectionList();
\r
635 projectionList.add(minFileEntryIdProjection);
\r
636 projectionList.add(maxFileEntryIdProjection);
\r
638 dynamicQuery.setProjection(projectionList);
\r
640 long folderId = DLFolderConstants.getFolderId(
\r
641 groupId, dataRepositoryId);
\r
643 addReindexCriteria(dynamicQuery, groupId, folderId);
\r
645 List<Object[]> results = DLFileEntryLocalServiceUtil.dynamicQuery(
\r
648 Object[] minAndMaxFileEntryIds = results.get(0);
\r
650 if ((minAndMaxFileEntryIds[0] == null) ||
\r
651 (minAndMaxFileEntryIds[1] == null)) {
\r
656 long minFileEntryId = (Long)minAndMaxFileEntryIds[0];
\r
657 long maxFileEntryId = (Long)minAndMaxFileEntryIds[1];
\r
659 long startFileEntryId = minFileEntryId;
\r
660 long endFileEntryId = startFileEntryId + DEFAULT_INTERVAL;
\r
662 while (startFileEntryId <= maxFileEntryId) {
\r
663 reindexFileEntries(
\r
664 companyId, groupId, folderId, startFileEntryId, endFileEntryId);
\r
666 startFileEntryId = endFileEntryId;
\r
667 endFileEntryId += DEFAULT_INTERVAL;
\r
671 protected void reindexFileEntries(
\r
672 long companyId, long groupId, long folderId, long startFileEntryId,
\r
673 long endFileEntryId)
\r
676 DynamicQuery dynamicQuery = DynamicQueryFactoryUtil.forClass(
\r
677 DLFileEntry.class, PACLClassLoaderUtil.getPortalClassLoader());
\r
679 Property property = PropertyFactoryUtil.forName("fileEntryId");
\r
681 dynamicQuery.add(property.ge(startFileEntryId));
\r
682 dynamicQuery.add(property.lt(endFileEntryId));
\r
684 addReindexCriteria(dynamicQuery, groupId, folderId);
\r
686 List<DLFileEntry> dlFileEntries =
\r
687 DLFileEntryLocalServiceUtil.dynamicQuery(dynamicQuery);
\r
689 if (dlFileEntries.isEmpty()) {
\r
693 Collection<Document> documents = new ArrayList<Document>(
\r
694 dlFileEntries.size());
\r
696 for (DLFileEntry dlFileEntry : dlFileEntries) {
\r
697 Document document = getDocument(dlFileEntry);
\r
699 if (document != null) {
\r
700 documents.add(document);
\r
704 SearchEngineUtil.updateDocuments(
\r
705 getSearchEngineId(), companyId, documents);
\r
708 protected void reindexFolders(long companyId) throws Exception {
\r
709 DynamicQuery dynamicQuery = DynamicQueryFactoryUtil.forClass(
\r
710 DLFolder.class, PACLClassLoaderUtil.getPortalClassLoader());
\r
712 Projection minFolderIdProjection = ProjectionFactoryUtil.min(
\r
714 Projection maxFolderIdProjection = ProjectionFactoryUtil.max(
\r
717 ProjectionList projectionList = ProjectionFactoryUtil.projectionList();
\r
719 projectionList.add(minFolderIdProjection);
\r
720 projectionList.add(maxFolderIdProjection);
\r
722 dynamicQuery.setProjection(projectionList);
\r
724 addReindexCriteria(dynamicQuery, companyId);
\r
726 List<Object[]> results = BookmarksFolderLocalServiceUtil.dynamicQuery(
\r
729 Object[] minAndMaxFolderIds = results.get(0);
\r
731 if ((minAndMaxFolderIds[0] == null) ||
\r
732 (minAndMaxFolderIds[1] == null)) {
\r
737 long minFolderId = (Long)minAndMaxFolderIds[0];
\r
738 long maxFolderId = (Long)minAndMaxFolderIds[1];
\r
740 long startFolderId = minFolderId;
\r
741 long endFolderId = startFolderId + DEFAULT_INTERVAL;
\r
743 while (startFolderId <= maxFolderId) {
\r
744 reindexFolders(companyId, startFolderId, endFolderId);
\r
746 startFolderId = endFolderId;
\r
747 endFolderId += DEFAULT_INTERVAL;
\r
751 protected void reindexFolders(
\r
752 long companyId, long startFolderId, long endFolderId)
\r
755 DynamicQuery dynamicQuery = DynamicQueryFactoryUtil.forClass(
\r
756 DLFolder.class, PACLClassLoaderUtil.getPortalClassLoader());
\r
758 Property property = PropertyFactoryUtil.forName("folderId");
\r
760 dynamicQuery.add(property.ge(startFolderId));
\r
761 dynamicQuery.add(property.lt(endFolderId));
\r
763 addReindexCriteria(dynamicQuery, companyId);
\r
765 List<DLFolder> dlFolders = DLFolderLocalServiceUtil.dynamicQuery(
\r
768 for (DLFolder dlFolder : dlFolders) {
\r
769 String portletId = PortletKeys.DOCUMENT_LIBRARY;
\r
770 long groupId = dlFolder.getGroupId();
\r
771 long folderId = dlFolder.getFolderId();
\r
773 String[] newIds = {
\r
774 String.valueOf(companyId), portletId, String.valueOf(groupId),
\r
775 String.valueOf(folderId)
\r
782 protected void reindexRoot(long companyId) throws Exception {
\r
783 DynamicQuery dynamicQuery = DynamicQueryFactoryUtil.forClass(
\r
784 Group.class, PACLClassLoaderUtil.getPortalClassLoader());
\r
786 Projection minGroupIdProjection = ProjectionFactoryUtil.min("groupId");
\r
787 Projection maxGroupIdProjection = ProjectionFactoryUtil.max("groupId");
\r
789 ProjectionList projectionList = ProjectionFactoryUtil.projectionList();
\r
791 projectionList.add(minGroupIdProjection);
\r
792 projectionList.add(maxGroupIdProjection);
\r
794 dynamicQuery.setProjection(projectionList);
\r
796 addReindexCriteria(dynamicQuery, companyId);
\r
798 List<Object[]> results = GroupLocalServiceUtil.dynamicQuery(
\r
801 Object[] minAndMaxGroupIds = results.get(0);
\r
803 if ((minAndMaxGroupIds[0] == null) || (minAndMaxGroupIds[1] == null)) {
\r
807 long minGroupId = (Long)minAndMaxGroupIds[0];
\r
808 long maxGroupId = (Long)minAndMaxGroupIds[1];
\r
810 long startGroupId = minGroupId;
\r
811 long endGroupId = startGroupId + DEFAULT_INTERVAL;
\r
813 while (startGroupId <= maxGroupId) {
\r
814 reindexRoot(companyId, startGroupId, endGroupId);
\r
816 startGroupId = endGroupId;
\r
817 endGroupId += DEFAULT_INTERVAL;
\r
821 protected void reindexRoot(
\r
822 long companyId, long startGroupId, long endGroupId)
\r
825 DynamicQuery dynamicQuery = DynamicQueryFactoryUtil.forClass(
\r
826 Group.class, PACLClassLoaderUtil.getPortalClassLoader());
\r
828 Property property = PropertyFactoryUtil.forName("groupId");
\r
830 dynamicQuery.add(property.ge(startGroupId));
\r
831 dynamicQuery.add(property.lt(endGroupId));
\r
833 addReindexCriteria(dynamicQuery, companyId);
\r
835 List<Group> groups = GroupLocalServiceUtil.dynamicQuery(dynamicQuery);
\r
837 for (Group group : groups) {
\r
838 String portletId = PortletKeys.DOCUMENT_LIBRARY;
\r
839 long groupId = group.getGroupId();
\r
840 long folderId = groupId;
\r
842 String[] newIds = {
\r
843 String.valueOf(companyId), portletId, String.valueOf(groupId),
\r
844 String.valueOf(folderId)
\r
851 private static final boolean _FILTER_SEARCH = true;
\r
853 private static final boolean _PERMISSION_AWARE = true;
\r
855 private static Log _log = LogFactoryUtil.getLog(DLIndexer.class);
\r