--- /dev/null
+/**\r
+ * Copyright (c) 2000-2012 Liferay, Inc. All rights reserved.\r
+ *\r
+ * This library is free software; you can redistribute it and/or modify it under\r
+ * the terms of the GNU Lesser General Public License as published by the Free\r
+ * Software Foundation; either version 2.1 of the License, or (at your option)\r
+ * any later version.\r
+ *\r
+ * This library is distributed in the hope that it will be useful, but WITHOUT\r
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\r
+ * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more\r
+ * details.\r
+ */\r
+\r
+package com.liferay.portlet.documentlibrary.util;\r
+\r
+import java.io.IOException;\r
+import java.io.InputStream;\r
+import java.text.SimpleDateFormat;\r
+import java.util.ArrayList;\r
+import java.util.Collection;\r
+import java.util.LinkedHashMap;\r
+import java.util.List;\r
+import java.util.Locale;\r
+import java.util.Set;\r
+import java.util.TreeSet;\r
+\r
+import javax.portlet.PortletRequest;\r
+import javax.portlet.PortletURL;\r
+import javax.portlet.WindowStateException;\r
+\r
+import com.liferay.portal.kernel.dao.orm.DynamicQuery;\r
+import com.liferay.portal.kernel.dao.orm.DynamicQueryFactoryUtil;\r
+import com.liferay.portal.kernel.dao.orm.Projection;\r
+import com.liferay.portal.kernel.dao.orm.ProjectionFactoryUtil;\r
+import com.liferay.portal.kernel.dao.orm.ProjectionList;\r
+import com.liferay.portal.kernel.dao.orm.Property;\r
+import com.liferay.portal.kernel.dao.orm.PropertyFactoryUtil;\r
+import com.liferay.portal.kernel.exception.PortalException;\r
+import com.liferay.portal.kernel.exception.SystemException;\r
+import com.liferay.portal.kernel.log.Log;\r
+import com.liferay.portal.kernel.log.LogFactoryUtil;\r
+import com.liferay.portal.kernel.portlet.LiferayPortletURL;\r
+import com.liferay.portal.kernel.portlet.LiferayWindowState;\r
+import com.liferay.portal.kernel.repository.model.FileEntry;\r
+import com.liferay.portal.kernel.search.BaseIndexer;\r
+import com.liferay.portal.kernel.search.BooleanClauseOccur;\r
+import com.liferay.portal.kernel.search.BooleanQuery;\r
+import com.liferay.portal.kernel.search.BooleanQueryFactoryUtil;\r
+import com.liferay.portal.kernel.search.Document;\r
+import com.liferay.portal.kernel.search.DocumentImpl;\r
+import com.liferay.portal.kernel.search.Field;\r
+import com.liferay.portal.kernel.search.SearchContext;\r
+import com.liferay.portal.kernel.search.SearchEngineUtil;\r
+import com.liferay.portal.kernel.search.SearchException;\r
+import com.liferay.portal.kernel.search.Summary;\r
+import com.liferay.portal.kernel.util.ArrayUtil;\r
+import com.liferay.portal.kernel.util.GetterUtil;\r
+import com.liferay.portal.kernel.util.HtmlUtil;\r
+import com.liferay.portal.kernel.util.ListUtil;\r
+import com.liferay.portal.kernel.util.PropsKeys;\r
+import com.liferay.portal.kernel.util.StringPool;\r
+import com.liferay.portal.kernel.util.StringUtil;\r
+import com.liferay.portal.kernel.util.Validator;\r
+import com.liferay.portal.kernel.workflow.WorkflowConstants;\r
+import com.liferay.portal.model.Group;\r
+import com.liferay.portal.model.Organization;\r
+import com.liferay.portal.security.pacl.PACLClassLoaderUtil;\r
+import com.liferay.portal.security.permission.ActionKeys;\r
+import com.liferay.portal.security.permission.PermissionChecker;\r
+import com.liferay.portal.service.GroupLocalServiceUtil;\r
+import com.liferay.portal.service.UserLocalServiceUtil;\r
+import com.liferay.portal.util.PortalUtil;\r
+import com.liferay.portal.util.PortletKeys;\r
+import com.liferay.portal.util.PrefsPropsUtil;\r
+import com.liferay.portal.util.PropsValues;\r
+import com.liferay.portlet.asset.model.AssetCategory;\r
+import com.liferay.portlet.asset.service.AssetCategoryLocalServiceUtil;\r
+import com.liferay.portlet.asset.service.AssetTagLocalServiceUtil;\r
+import com.liferay.portlet.bookmarks.service.BookmarksFolderLocalServiceUtil;\r
+import com.liferay.portlet.documentlibrary.model.DLFileEntry;\r
+import com.liferay.portlet.documentlibrary.model.DLFileEntryMetadata;\r
+import com.liferay.portlet.documentlibrary.model.DLFileEntryType;\r
+import com.liferay.portlet.documentlibrary.model.DLFileVersion;\r
+import com.liferay.portlet.documentlibrary.model.DLFolder;\r
+import com.liferay.portlet.documentlibrary.model.DLFolderConstants;\r
+import com.liferay.portlet.documentlibrary.service.DLFileEntryLocalServiceUtil;\r
+import com.liferay.portlet.documentlibrary.service.DLFileEntryMetadataLocalServiceUtil;\r
+import com.liferay.portlet.documentlibrary.service.DLFileEntryTypeLocalServiceUtil;\r
+import com.liferay.portlet.documentlibrary.service.DLFolderLocalServiceUtil;\r
+import com.liferay.portlet.documentlibrary.service.DLFolderServiceUtil;\r
+import com.liferay.portlet.documentlibrary.service.permission.DLFileEntryPermission;\r
+import com.liferay.portlet.dynamicdatamapping.model.DDMStructure;\r
+import com.liferay.portlet.dynamicdatamapping.service.DDMStructureLocalServiceUtil;\r
+import com.liferay.portlet.dynamicdatamapping.storage.Fields;\r
+import com.liferay.portlet.dynamicdatamapping.storage.StorageEngineUtil;\r
+import com.liferay.portlet.dynamicdatamapping.util.DDMIndexerUtil;\r
+import com.liferay.portlet.expando.model.ExpandoBridge;\r
+import com.liferay.portlet.expando.util.ExpandoBridgeFactoryUtil;\r
+import com.liferay.portlet.expando.util.ExpandoBridgeIndexerUtil;\r
+import com.pentila.entSavoie.cartable.model.DlLink;\r
+import com.pentila.entSavoie.cartable.model.FileTag;\r
+import com.pentila.entSavoie.cartable.service.DlLinkLocalServiceUtil;\r
+import com.pentila.entSavoie.cartable.service.FileTagLocalServiceUtil;\r
+import com.pentila.entSavoie.communityInfos.model.CommunityInfos;\r
+import com.pentila.entSavoie.communityInfos.service.CommunityInfosLocalServiceUtil;\r
+import com.pentila.entSavoie.directory.OrganizationFinderServiceUtil;\r
+import com.pentila.entSavoie.search.util.IndexerUtil;\r
+import com.pentila.entSavoie.utils.DLEntryUtil;\r
+\r
+/**\r
+ * @author Brian Wing Shun Chan\r
+ * @author Raymond Augé\r
+ * @author Alexander Chow\r
+ */\r
+public class DLIndexer extends BaseIndexer {\r
+\r
+ public static final String[] CLASS_NAMES = {DLFileEntry.class.getName()};\r
+\r
+ public static final String PORTLET_ID = PortletKeys.DOCUMENT_LIBRARY;\r
+\r
+ public String[] getClassNames() {\r
+ return CLASS_NAMES;\r
+ }\r
+\r
+ public String getPortletId() {\r
+ return PORTLET_ID;\r
+ }\r
+\r
+ @Override\r
+ public boolean hasPermission(\r
+ PermissionChecker permissionChecker, long entryClassPK,\r
+ String actionId)\r
+ throws Exception {\r
+\r
+ return DLFileEntryPermission.contains(\r
+ permissionChecker, entryClassPK, ActionKeys.VIEW);\r
+ }\r
+\r
+ @Override\r
+ public boolean isFilterSearch() {\r
+ return _FILTER_SEARCH;\r
+ }\r
+\r
+ @Override\r
+ public boolean isPermissionAware() {\r
+ return _PERMISSION_AWARE;\r
+ }\r
+\r
+ @Override\r
+ public void postProcessContextQuery(\r
+ BooleanQuery contextQuery, SearchContext searchContext)\r
+ throws Exception {\r
+\r
+ int status = GetterUtil.getInteger(\r
+ searchContext.getAttribute(Field.STATUS),\r
+ WorkflowConstants.STATUS_APPROVED);\r
+\r
+ if (status != WorkflowConstants.STATUS_ANY) {\r
+ contextQuery.addRequiredTerm(Field.STATUS, status);\r
+ }\r
+\r
+ long[] folderIds = searchContext.getFolderIds();\r
+\r
+ if ((folderIds != null) && (folderIds.length > 0)) {\r
+ if (folderIds[0] == DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {\r
+ return;\r
+ }\r
+\r
+ BooleanQuery folderIdsQuery = BooleanQueryFactoryUtil.create(\r
+ searchContext);\r
+\r
+ for (long folderId : folderIds) {\r
+ try {\r
+ DLFolderServiceUtil.getFolder(folderId);\r
+ }\r
+ catch (Exception e) {\r
+ continue;\r
+ }\r
+\r
+ folderIdsQuery.addTerm(Field.FOLDER_ID, folderId);\r
+ }\r
+\r
+ contextQuery.add(folderIdsQuery, BooleanClauseOccur.MUST);\r
+ }\r
+ }\r
+\r
+ @Override\r
+ public void postProcessSearchQuery(\r
+ BooleanQuery searchQuery, SearchContext searchContext)\r
+ throws Exception {\r
+\r
+ Set<DDMStructure> ddmStructuresSet = new TreeSet<DDMStructure>();\r
+\r
+ long[] groupIds = searchContext.getGroupIds();\r
+\r
+ if ((groupIds != null) && (groupIds.length > 0)) {\r
+ List<DLFileEntryType> dlFileEntryTypes =\r
+ DLFileEntryTypeLocalServiceUtil.getFileEntryTypes(groupIds);\r
+\r
+ for (DLFileEntryType dlFileEntryType : dlFileEntryTypes) {\r
+ ddmStructuresSet.addAll(dlFileEntryType.getDDMStructures());\r
+ }\r
+ }\r
+\r
+ Group group = GroupLocalServiceUtil.getCompanyGroup(\r
+ searchContext.getCompanyId());\r
+\r
+ DDMStructure tikaRawMetadataStructure =\r
+ DDMStructureLocalServiceUtil.fetchStructure(\r
+ group.getGroupId(), "TikaRawMetadata");\r
+\r
+ if (tikaRawMetadataStructure != null) {\r
+ ddmStructuresSet.add(tikaRawMetadataStructure);\r
+ }\r
+\r
+ for (DDMStructure ddmStructure : ddmStructuresSet) {\r
+ addSearchDDMStruture(searchQuery, searchContext, ddmStructure);\r
+ }\r
+\r
+ addSearchTerm(searchQuery, searchContext, Field.USER_NAME, false);\r
+\r
+ addSearchTerm(searchQuery, searchContext, "extension", false);\r
+ addSearchTerm(searchQuery, searchContext, "fileEntryTypeId", false);\r
+ addSearchTerm(searchQuery, searchContext, "path", false);\r
+\r
+ LinkedHashMap<String, Object> params =\r
+ (LinkedHashMap<String, Object>)searchContext.getAttribute("params");\r
+\r
+ if (params != null) {\r
+ String expandoAttributes = (String)params.get("expandoAttributes");\r
+\r
+ if (Validator.isNotNull(expandoAttributes)) {\r
+ addSearchExpando(searchQuery, searchContext, expandoAttributes);\r
+ }\r
+ }\r
+ }\r
+\r
+ protected void addFileEntryTypeAttributes(\r
+ Document document, DLFileVersion dlFileVersion)\r
+ throws PortalException, SystemException {\r
+\r
+ DLFileEntryType dlFileEntryType =\r
+ DLFileEntryTypeLocalServiceUtil.getFileEntryType(\r
+ dlFileVersion.getFileEntryTypeId());\r
+\r
+ List<DDMStructure> ddmStructures = dlFileEntryType.getDDMStructures();\r
+\r
+ Group group = GroupLocalServiceUtil.getCompanyGroup(\r
+ dlFileVersion.getCompanyId());\r
+\r
+ DDMStructure tikaRawMetadataStructure =\r
+ DDMStructureLocalServiceUtil.fetchStructure(\r
+ group.getGroupId(), "TikaRawMetadata");\r
+\r
+ if (tikaRawMetadataStructure != null) {\r
+ ddmStructures = ListUtil.copy(ddmStructures);\r
+\r
+ ddmStructures.add(tikaRawMetadataStructure);\r
+ }\r
+\r
+ for (DDMStructure ddmStructure : ddmStructures) {\r
+ Fields fields = null;\r
+\r
+ try {\r
+ DLFileEntryMetadata fileEntryMetadata =\r
+ DLFileEntryMetadataLocalServiceUtil.getFileEntryMetadata(\r
+ ddmStructure.getStructureId(),\r
+ dlFileVersion.getFileVersionId());\r
+\r
+ fields = StorageEngineUtil.getFields(\r
+ fileEntryMetadata.getDDMStorageId());\r
+ }\r
+ catch (Exception e) {\r
+ }\r
+\r
+ if (fields != null) {\r
+ DDMIndexerUtil.addAttributes(document, ddmStructure, fields);\r
+ }\r
+ }\r
+ }\r
+\r
+ protected void addReindexCriteria(\r
+ DynamicQuery dynamicQuery, long companyId) {\r
+\r
+ Property property = PropertyFactoryUtil.forName("companyId");\r
+\r
+ dynamicQuery.add(property.eq(companyId));\r
+ }\r
+\r
+ protected void addReindexCriteria(\r
+ DynamicQuery dynamicQuery, long groupId, long folderId) {\r
+\r
+ Property groupIdProperty = PropertyFactoryUtil.forName("groupId");\r
+\r
+ dynamicQuery.add(groupIdProperty.eq(groupId));\r
+\r
+ Property folderIdProperty = PropertyFactoryUtil.forName("folderId");\r
+\r
+ dynamicQuery.add(folderIdProperty.eq(folderId));\r
+ }\r
+\r
+ @Override\r
+ protected void doDelete(Object obj) throws Exception {\r
+ DLFileEntry dlFileEntry;\r
+ \r
+ if(obj instanceof FileEntry){\r
+ FileEntry fileEntry = (FileEntry) obj;\r
+ dlFileEntry = DLFileEntryLocalServiceUtil.getDLFileEntry(fileEntry.getFileEntryId());\r
+ } \r
+ else {\r
+ dlFileEntry = (DLFileEntry)obj;\r
+ }\r
+\r
+ Document document = new DocumentImpl();\r
+\r
+ document.addUID(PORTLET_ID, dlFileEntry.getFileEntryId());\r
+\r
+ SearchEngineUtil.deleteDocument(\r
+ getSearchEngineId(), dlFileEntry.getCompanyId(),\r
+ document.get(Field.UID));\r
+ }\r
+\r
+ @Override\r
+ protected Document doGetDocument(Object obj) throws Exception {\r
+ DLFileEntry dlFileEntry;\r
+ \r
+ if(obj instanceof FileEntry){\r
+ FileEntry fileEntry = (FileEntry) obj;\r
+ dlFileEntry = DLFileEntryLocalServiceUtil.getDLFileEntry(fileEntry.getFileEntryId());\r
+ } \r
+ else {\r
+ dlFileEntry = (DLFileEntry)obj;\r
+ }\r
+\r
+ if (_log.isDebugEnabled()) {\r
+ _log.debug("Indexing document " + dlFileEntry);\r
+ }\r
+\r
+ boolean indexContent = true;\r
+\r
+ InputStream is = null;\r
+\r
+ try {\r
+ if (PropsValues.DL_FILE_INDEXING_MAX_SIZE == 0) {\r
+ indexContent = false;\r
+ }\r
+ else if (PropsValues.DL_FILE_INDEXING_MAX_SIZE != -1) {\r
+ if (dlFileEntry.getSize() >\r
+ PropsValues.DL_FILE_INDEXING_MAX_SIZE) {\r
+\r
+ indexContent = false;\r
+ }\r
+ }\r
+\r
+ if (indexContent) {\r
+ String[] ignoreExtensions = PrefsPropsUtil.getStringArray(\r
+ PropsKeys.DL_FILE_INDEXING_IGNORE_EXTENSIONS,\r
+ StringPool.COMMA);\r
+\r
+ if (ArrayUtil.contains(\r
+ ignoreExtensions,\r
+ StringPool.PERIOD + dlFileEntry.getExtension())) {\r
+\r
+ indexContent = false;\r
+ }\r
+ }\r
+\r
+ if (indexContent) {\r
+ // check for a link\r
+ try {\r
+ DlLink dll = DlLinkLocalServiceUtil.getDlFileLinkByTarget(dlFileEntry.getFileEntryId());\r
+ // we have a link so we index the source content !!!!!\r
+ DLFileEntry dlfe = DLFileEntryLocalServiceUtil.getDLFileEntry(dll.getSourceId());\r
+ is = dlfe.getFileVersion().getContentStream(false);\r
+ } catch (Exception e1) {\r
+ is = dlFileEntry.getFileVersion().getContentStream(false);\r
+ }\r
+ }\r
+ }\r
+ catch (Exception e) {\r
+ }\r
+\r
+ if (indexContent && (is == null)) {\r
+ if (_log.isDebugEnabled()) {\r
+ _log.debug(\r
+ "Document " + dlFileEntry + " does not have any content");\r
+ }\r
+\r
+ return null;\r
+ }\r
+\r
+ try {\r
+ Document document = new DocumentImpl();\r
+\r
+ long fileEntryId = dlFileEntry.getFileEntryId();\r
+\r
+ document.addUID(PORTLET_ID, fileEntryId);\r
+\r
+ try {\r
+ List<AssetCategory> assetCategories =\r
+ AssetCategoryLocalServiceUtil.getCategories(\r
+ DLFileEntry.class.getName(), fileEntryId);\r
+ \r
+ long[] assetCategoryIds = StringUtil.split(\r
+ ListUtil.toString(\r
+ assetCategories, AssetCategory.CATEGORY_ID_ACCESSOR),\r
+ 0L);\r
+ \r
+ document.addKeyword(Field.ASSET_CATEGORY_IDS, assetCategoryIds);\r
+ \r
+ addSearchAssetCategoryTitles(\r
+ document, Field.ASSET_CATEGORY_TITLES, assetCategories);\r
+ } catch(Exception e){\r
+ // No such asset category\r
+ }\r
+\r
+ try {\r
+ String[] assetTagNames = AssetTagLocalServiceUtil.getTagNames(\r
+ DLFileEntry.class.getName(), fileEntryId);\r
+ \r
+ document.addKeyword(Field.ASSET_TAG_NAMES, assetTagNames);\r
+ } catch(Exception e){\r
+ // No such asset category\r
+ }\r
+\r
+ document.addKeyword(Field.COMPANY_ID, dlFileEntry.getCompanyId());\r
+\r
+ if (indexContent) {\r
+ if(dlFileEntry.getExtension().equals("html") || dlFileEntry.getExtension().equals("htm")){\r
+ document.addText(Field.CONTENT, IndexerUtil.normalizeString(HtmlUtil.extractText(StringUtil.read(is))));\r
+ }\r
+ else {\r
+ try {\r
+ document.addFile(Field.CONTENT, is, dlFileEntry.getTitle());\r
+ } catch (IOException ioe) {\r
+ throw new SearchException(\r
+ "Cannot extract text from file" + dlFileEntry);\r
+ }\r
+ }\r
+ }\r
+\r
+ document.addText(Field.DESCRIPTION, dlFileEntry.getDescription());\r
+ document.addKeyword(\r
+ Field.ENTRY_CLASS_NAME, DLFileEntry.class.getName());\r
+ document.addKeyword(Field.ENTRY_CLASS_PK, fileEntryId);\r
+ document.addKeyword(Field.FOLDER_ID, dlFileEntry.getFolderId());\r
+ document.addKeyword(\r
+ Field.GROUP_ID, dlFileEntry.getGroupId());\r
+ \r
+ try {\r
+ if(dlFileEntry.getGroupId()>0){\r
+ Group group = GroupLocalServiceUtil.getGroup(dlFileEntry.getGroupId());\r
+ if(group.isOrganization()){\r
+ document.addKeyword("etabId", IndexerUtil.getEtabId(Long.valueOf(group.getOrganizationId())));\r
+ } else {\r
+ CommunityInfos ci = CommunityInfosLocalServiceUtil.getCommunityInfosByGroupId(dlFileEntry.getGroupId());\r
+ if (ci.getStatus()==0) {\r
+ document.addKeyword("etabId", IndexerUtil.getEtabId(ci.getEtabId()));\r
+ }\r
+ }\r
+ }\r
+ else {\r
+ // Ce cas ne doit normalement pas arrive\r
+ Organization etab = OrganizationFinderServiceUtil.getEtabRatachement(UserLocalServiceUtil.getUser(dlFileEntry.getGroupId()));\r
+ document.addKeyword("etabId", etab.getGroupId());\r
+ }\r
+ } catch (Exception e){}\r
+ \r
+ SimpleDateFormat classicDateFormat = new SimpleDateFormat("yyyy-MM-dd");\r
+ document.addDate(Field.MODIFIED_DATE, dlFileEntry.getModifiedDate());\r
+ document.addText(IndexerUtil.MODIFIED_DATE_FORMATTED, classicDateFormat.format(dlFileEntry.getModifiedDate()));\r
+ \r
+ document.addKeyword(Field.PORTLET_ID, PORTLET_ID);\r
+ document.addText(\r
+ Field.PROPERTIES, dlFileEntry.getLuceneProperties());\r
+ document.addKeyword(Field.SCOPE_GROUP_ID, dlFileEntry.getGroupId());\r
+\r
+ DLFileVersion dlFileVersion = dlFileEntry.getFileVersion();\r
+\r
+ document.addKeyword(Field.STATUS, dlFileVersion.getStatus());\r
+ document.addText(Field.TITLE, IndexerUtil.normalizeString(dlFileEntry.getTitle()));\r
+ \r
+ // Add Tags On FileEntry Indexation\r
+ try {\r
+ FileTag fileTag = FileTagLocalServiceUtil.getFileTagByFileEntryId(fileEntryId);\r
+ String keywordList = (fileTag != null)? fileTag.getKeywordList() : "";\r
+ String tagList = (fileTag != null)? fileTag.getTagList() : "";\r
+ String linkList = (fileTag != null)? fileTag.getLinkList() : "";\r
+ document.addKeyword("keywordList", keywordList);\r
+ document.addKeyword("tagList", tagList);\r
+ document.addKeyword("linkList", linkList);\r
+ } catch (Exception e) {\r
+ // No File tag associated to the DLFile\r
+ }\r
+ \r
+ long userId = dlFileEntry.getUserId();\r
+\r
+ document.addKeyword(Field.USER_ID, userId);\r
+ document.addKeyword(\r
+ Field.USER_NAME,\r
+ PortalUtil.getUserName(userId, dlFileEntry.getUserName()),\r
+ true);\r
+\r
+ document.addKeyword(\r
+ "dataRepositoryId", dlFileEntry.getDataRepositoryId());\r
+ document.addKeyword("extension", dlFileEntry.getExtension());\r
+ document.addKeyword(\r
+ "fileEntryTypeId", dlFileEntry.getFileEntryTypeId());\r
+ document.addKeyword("path", dlFileEntry.getTitle());\r
+\r
+ ExpandoBridge expandoBridge =\r
+ ExpandoBridgeFactoryUtil.getExpandoBridge(\r
+ dlFileEntry.getCompanyId(), DLFileEntry.class.getName(),\r
+ dlFileVersion.getFileVersionId());\r
+\r
+ ExpandoBridgeIndexerUtil.addAttributes(document, expandoBridge);\r
+\r
+ addFileEntryTypeAttributes(document, dlFileVersion);\r
+\r
+ if (_log.isDebugEnabled()) {\r
+ _log.debug("Document " + dlFileEntry + " indexed successfully");\r
+ }\r
+\r
+ return document;\r
+ }\r
+ finally {\r
+ if (is != null) {\r
+ try {\r
+ is.close();\r
+ }\r
+ catch (IOException ioe) {\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ @Override\r
+ protected Summary doGetSummary(\r
+ Document document, Locale locale, String snippet,\r
+ PortletURL portletURL) {\r
+\r
+ LiferayPortletURL liferayPortletURL = (LiferayPortletURL)portletURL;\r
+\r
+ liferayPortletURL.setLifecycle(PortletRequest.ACTION_PHASE);\r
+\r
+ try {\r
+ liferayPortletURL.setWindowState(LiferayWindowState.EXCLUSIVE);\r
+ }\r
+ catch (WindowStateException wse) {\r
+ }\r
+\r
+ String title = document.get(Field.TITLE);\r
+\r
+ String content = StringUtil.shorten(document.get(Field.CONTENT), 200);\r
+\r
+ String fileEntryId = document.get(Field.ENTRY_CLASS_PK);\r
+\r
+ portletURL.setParameter("struts_action", "/document_library/get_file");\r
+ portletURL.setParameter("fileEntryId", fileEntryId);\r
+\r
+ return new Summary(title, content, portletURL);\r
+ }\r
+\r
+ @Override\r
+ protected void doReindex(Object obj) throws Exception {\r
+ DLFileEntry dlFileEntry;\r
+ \r
+ if(obj instanceof FileEntry){\r
+ FileEntry fileEntry = (FileEntry) obj;\r
+ dlFileEntry = DLFileEntryLocalServiceUtil.getDLFileEntry(fileEntry.getFileEntryId());\r
+ } \r
+ else {\r
+ dlFileEntry = (DLFileEntry)obj;\r
+ }\r
+ \r
+ DLFileVersion dlFileVersion = dlFileEntry.getLatestFileVersion(true);\r
+\r
+ if (!dlFileVersion.isApproved()) {\r
+ return;\r
+ }\r
+\r
+ Document document = getDocument(dlFileEntry);\r
+\r
+ if (document != null) {\r
+ SearchEngineUtil.updateDocument(\r
+ getSearchEngineId(), dlFileEntry.getCompanyId(), document);\r
+ }\r
+ }\r
+\r
+ @Override\r
+ protected void doReindex(String className, long classPK) throws Exception {\r
+ DLFileEntry dlFileEntry = DLFileEntryLocalServiceUtil.getFileEntry(\r
+ classPK);\r
+\r
+ doReindex(dlFileEntry);\r
+ }\r
+\r
+ @Override\r
+ protected void doReindex(String[] ids) throws Exception {\r
+ if (ids.length == 1) {\r
+ long companyId = GetterUtil.getLong(ids[0]);\r
+\r
+ reindexFolders(companyId);\r
+ reindexRoot(companyId);\r
+ }\r
+ else {\r
+ long companyId = GetterUtil.getLong(ids[0]);\r
+ long groupId = GetterUtil.getLong(ids[2]);\r
+ long dataRepositoryId = GetterUtil.getLong(ids[3]);\r
+\r
+ reindexFileEntries(companyId, groupId, dataRepositoryId);\r
+ }\r
+ }\r
+\r
+ @Override\r
+ protected String getPortletId(SearchContext searchContext) {\r
+ return PORTLET_ID;\r
+ }\r
+\r
+ protected void reindexFileEntries(\r
+ long companyId, long groupId, long dataRepositoryId)\r
+ throws Exception {\r
+\r
+ DynamicQuery dynamicQuery = DynamicQueryFactoryUtil.forClass(\r
+ DLFileEntry.class, PACLClassLoaderUtil.getPortalClassLoader());\r
+\r
+ Projection minFileEntryIdProjection = ProjectionFactoryUtil.min(\r
+ "fileEntryId");\r
+ Projection maxFileEntryIdProjection = ProjectionFactoryUtil.max(\r
+ "fileEntryId");\r
+\r
+ ProjectionList projectionList = ProjectionFactoryUtil.projectionList();\r
+\r
+ projectionList.add(minFileEntryIdProjection);\r
+ projectionList.add(maxFileEntryIdProjection);\r
+\r
+ dynamicQuery.setProjection(projectionList);\r
+\r
+ long folderId = DLFolderConstants.getFolderId(\r
+ groupId, dataRepositoryId);\r
+\r
+ addReindexCriteria(dynamicQuery, groupId, folderId);\r
+\r
+ List<Object[]> results = DLFileEntryLocalServiceUtil.dynamicQuery(\r
+ dynamicQuery);\r
+\r
+ Object[] minAndMaxFileEntryIds = results.get(0);\r
+\r
+ if ((minAndMaxFileEntryIds[0] == null) ||\r
+ (minAndMaxFileEntryIds[1] == null)) {\r
+\r
+ return;\r
+ }\r
+\r
+ long minFileEntryId = (Long)minAndMaxFileEntryIds[0];\r
+ long maxFileEntryId = (Long)minAndMaxFileEntryIds[1];\r
+\r
+ long startFileEntryId = minFileEntryId;\r
+ long endFileEntryId = startFileEntryId + DEFAULT_INTERVAL;\r
+\r
+ while (startFileEntryId <= maxFileEntryId) {\r
+ reindexFileEntries(\r
+ companyId, groupId, folderId, startFileEntryId, endFileEntryId);\r
+\r
+ startFileEntryId = endFileEntryId;\r
+ endFileEntryId += DEFAULT_INTERVAL;\r
+ }\r
+ }\r
+\r
+ protected void reindexFileEntries(\r
+ long companyId, long groupId, long folderId, long startFileEntryId,\r
+ long endFileEntryId)\r
+ throws Exception {\r
+\r
+ DynamicQuery dynamicQuery = DynamicQueryFactoryUtil.forClass(\r
+ DLFileEntry.class, PACLClassLoaderUtil.getPortalClassLoader());\r
+\r
+ Property property = PropertyFactoryUtil.forName("fileEntryId");\r
+\r
+ dynamicQuery.add(property.ge(startFileEntryId));\r
+ dynamicQuery.add(property.lt(endFileEntryId));\r
+\r
+ addReindexCriteria(dynamicQuery, groupId, folderId);\r
+\r
+ List<DLFileEntry> dlFileEntries =\r
+ DLFileEntryLocalServiceUtil.dynamicQuery(dynamicQuery);\r
+\r
+ if (dlFileEntries.isEmpty()) {\r
+ return;\r
+ }\r
+\r
+ Collection<Document> documents = new ArrayList<Document>(\r
+ dlFileEntries.size());\r
+\r
+ for (DLFileEntry dlFileEntry : dlFileEntries) {\r
+ Document document = getDocument(dlFileEntry);\r
+\r
+ if (document != null) {\r
+ documents.add(document);\r
+ }\r
+ }\r
+\r
+ SearchEngineUtil.updateDocuments(\r
+ getSearchEngineId(), companyId, documents);\r
+ }\r
+\r
+ protected void reindexFolders(long companyId) throws Exception {\r
+ DynamicQuery dynamicQuery = DynamicQueryFactoryUtil.forClass(\r
+ DLFolder.class, PACLClassLoaderUtil.getPortalClassLoader());\r
+\r
+ Projection minFolderIdProjection = ProjectionFactoryUtil.min(\r
+ "folderId");\r
+ Projection maxFolderIdProjection = ProjectionFactoryUtil.max(\r
+ "folderId");\r
+\r
+ ProjectionList projectionList = ProjectionFactoryUtil.projectionList();\r
+\r
+ projectionList.add(minFolderIdProjection);\r
+ projectionList.add(maxFolderIdProjection);\r
+\r
+ dynamicQuery.setProjection(projectionList);\r
+\r
+ addReindexCriteria(dynamicQuery, companyId);\r
+\r
+ List<Object[]> results = BookmarksFolderLocalServiceUtil.dynamicQuery(\r
+ dynamicQuery);\r
+\r
+ Object[] minAndMaxFolderIds = results.get(0);\r
+\r
+ if ((minAndMaxFolderIds[0] == null) ||\r
+ (minAndMaxFolderIds[1] == null)) {\r
+\r
+ return;\r
+ }\r
+\r
+ long minFolderId = (Long)minAndMaxFolderIds[0];\r
+ long maxFolderId = (Long)minAndMaxFolderIds[1];\r
+\r
+ long startFolderId = minFolderId;\r
+ long endFolderId = startFolderId + DEFAULT_INTERVAL;\r
+\r
+ while (startFolderId <= maxFolderId) {\r
+ reindexFolders(companyId, startFolderId, endFolderId);\r
+\r
+ startFolderId = endFolderId;\r
+ endFolderId += DEFAULT_INTERVAL;\r
+ }\r
+ }\r
+\r
+ protected void reindexFolders(\r
+ long companyId, long startFolderId, long endFolderId)\r
+ throws Exception {\r
+\r
+ DynamicQuery dynamicQuery = DynamicQueryFactoryUtil.forClass(\r
+ DLFolder.class, PACLClassLoaderUtil.getPortalClassLoader());\r
+\r
+ Property property = PropertyFactoryUtil.forName("folderId");\r
+\r
+ dynamicQuery.add(property.ge(startFolderId));\r
+ dynamicQuery.add(property.lt(endFolderId));\r
+\r
+ addReindexCriteria(dynamicQuery, companyId);\r
+\r
+ List<DLFolder> dlFolders = DLFolderLocalServiceUtil.dynamicQuery(\r
+ dynamicQuery);\r
+\r
+ for (DLFolder dlFolder : dlFolders) {\r
+ String portletId = PortletKeys.DOCUMENT_LIBRARY;\r
+ long groupId = dlFolder.getGroupId();\r
+ long folderId = dlFolder.getFolderId();\r
+\r
+ String[] newIds = {\r
+ String.valueOf(companyId), portletId, String.valueOf(groupId),\r
+ String.valueOf(folderId)\r
+ };\r
+\r
+ reindex(newIds);\r
+ }\r
+ }\r
+\r
+ protected void reindexRoot(long companyId) throws Exception {\r
+ DynamicQuery dynamicQuery = DynamicQueryFactoryUtil.forClass(\r
+ Group.class, PACLClassLoaderUtil.getPortalClassLoader());\r
+\r
+ Projection minGroupIdProjection = ProjectionFactoryUtil.min("groupId");\r
+ Projection maxGroupIdProjection = ProjectionFactoryUtil.max("groupId");\r
+\r
+ ProjectionList projectionList = ProjectionFactoryUtil.projectionList();\r
+\r
+ projectionList.add(minGroupIdProjection);\r
+ projectionList.add(maxGroupIdProjection);\r
+\r
+ dynamicQuery.setProjection(projectionList);\r
+\r
+ addReindexCriteria(dynamicQuery, companyId);\r
+\r
+ List<Object[]> results = GroupLocalServiceUtil.dynamicQuery(\r
+ dynamicQuery);\r
+\r
+ Object[] minAndMaxGroupIds = results.get(0);\r
+\r
+ if ((minAndMaxGroupIds[0] == null) || (minAndMaxGroupIds[1] == null)) {\r
+ return;\r
+ }\r
+\r
+ long minGroupId = (Long)minAndMaxGroupIds[0];\r
+ long maxGroupId = (Long)minAndMaxGroupIds[1];\r
+\r
+ long startGroupId = minGroupId;\r
+ long endGroupId = startGroupId + DEFAULT_INTERVAL;\r
+\r
+ while (startGroupId <= maxGroupId) {\r
+ reindexRoot(companyId, startGroupId, endGroupId);\r
+\r
+ startGroupId = endGroupId;\r
+ endGroupId += DEFAULT_INTERVAL;\r
+ }\r
+ }\r
+\r
+ protected void reindexRoot(\r
+ long companyId, long startGroupId, long endGroupId)\r
+ throws Exception {\r
+\r
+ DynamicQuery dynamicQuery = DynamicQueryFactoryUtil.forClass(\r
+ Group.class, PACLClassLoaderUtil.getPortalClassLoader());\r
+\r
+ Property property = PropertyFactoryUtil.forName("groupId");\r
+\r
+ dynamicQuery.add(property.ge(startGroupId));\r
+ dynamicQuery.add(property.lt(endGroupId));\r
+\r
+ addReindexCriteria(dynamicQuery, companyId);\r
+\r
+ List<Group> groups = GroupLocalServiceUtil.dynamicQuery(dynamicQuery);\r
+\r
+ for (Group group : groups) {\r
+ String portletId = PortletKeys.DOCUMENT_LIBRARY;\r
+ long groupId = group.getGroupId();\r
+ long folderId = groupId;\r
+\r
+ String[] newIds = {\r
+ String.valueOf(companyId), portletId, String.valueOf(groupId),\r
+ String.valueOf(folderId)\r
+ };\r
+\r
+ reindex(newIds);\r
+ }\r
+ }\r
+\r
+ private static final boolean _FILTER_SEARCH = true;\r
+\r
+ private static final boolean _PERMISSION_AWARE = true;\r
+\r
+ private static Log _log = LogFactoryUtil.getLog(DLIndexer.class);\r
+\r
+}
\ No newline at end of file