Java tutorial
/** * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved. * * This library is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. */ package com.liferay.portlet.documentlibrary.util; import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.io.Serializable; import java.util.LinkedHashMap; import java.util.List; import java.util.Locale; import javax.portlet.PortletRequest; import javax.portlet.PortletURL; import javax.portlet.WindowStateException; import com.liferay.portal.kernel.dao.orm.ActionableDynamicQuery; import com.liferay.portal.kernel.dao.orm.DynamicQuery; import com.liferay.portal.kernel.dao.orm.Property; import com.liferay.portal.kernel.dao.orm.PropertyFactoryUtil; import com.liferay.portal.kernel.exception.PortalException; import com.liferay.portal.kernel.exception.SystemException; import com.liferay.portal.kernel.log.Log; import com.liferay.portal.kernel.log.LogFactoryUtil; import com.liferay.portal.kernel.portlet.LiferayPortletURL; import com.liferay.portal.kernel.portlet.LiferayWindowState; import com.liferay.portal.kernel.search.BaseIndexer; import com.liferay.portal.kernel.search.BooleanClauseOccur; import com.liferay.portal.kernel.search.BooleanQuery; import com.liferay.portal.kernel.search.BooleanQueryFactoryUtil; import com.liferay.portal.kernel.search.Document; import com.liferay.portal.kernel.search.DocumentImpl; import com.liferay.portal.kernel.search.Field; import com.liferay.portal.kernel.search.Indexer; import com.liferay.portal.kernel.search.IndexerRegistryUtil; import com.liferay.portal.kernel.search.SearchContext; import com.liferay.portal.kernel.search.SearchEngineUtil; import com.liferay.portal.kernel.search.SearchException; import com.liferay.portal.kernel.search.Summary; import com.liferay.portal.kernel.util.ArrayUtil; import com.liferay.portal.kernel.util.CharPool; import com.liferay.portal.kernel.util.GetterUtil; import com.liferay.portal.kernel.util.LocaleUtil; import com.liferay.portal.kernel.util.PropsKeys; import com.liferay.portal.kernel.util.PropsUtil; import com.liferay.portal.kernel.util.StringBundler; import com.liferay.portal.kernel.util.StringPool; import com.liferay.portal.kernel.util.StringUtil; import com.liferay.portal.kernel.util.Validator; import com.liferay.portal.model.Group; import com.liferay.portal.model.Repository; import com.liferay.portal.security.permission.ActionKeys; import com.liferay.portal.security.permission.PermissionChecker; import com.liferay.portal.service.GroupLocalServiceUtil; import com.liferay.portal.service.RepositoryLocalServiceUtil; import com.liferay.portal.service.persistence.GroupActionableDynamicQuery; import com.liferay.portal.util.PortalUtil; import com.liferay.portal.util.PortletKeys; import com.liferay.portal.util.PrefsPropsUtil; import com.liferay.portal.util.PropsValues; import com.liferay.portlet.documentlibrary.model.DLFileEntry; import com.liferay.portlet.documentlibrary.model.DLFileEntryMetadata; import com.liferay.portlet.documentlibrary.model.DLFileEntryType; import com.liferay.portlet.documentlibrary.model.DLFileEntryTypeConstants; import com.liferay.portlet.documentlibrary.model.DLFileVersion; import com.liferay.portlet.documentlibrary.model.DLFolder; import com.liferay.portlet.documentlibrary.model.DLFolderConstants; import com.liferay.portlet.documentlibrary.service.DLFileEntryLocalServiceUtil; import com.liferay.portlet.documentlibrary.service.DLFileEntryMetadataLocalServiceUtil; import com.liferay.portlet.documentlibrary.service.DLFileEntryTypeLocalServiceUtil; import com.liferay.portlet.documentlibrary.service.permission.DLFileEntryPermission; import com.liferay.portlet.documentlibrary.service.persistence.DLFileEntryActionableDynamicQuery; import com.liferay.portlet.documentlibrary.service.persistence.DLFolderActionableDynamicQuery; import com.liferay.portlet.dynamicdatamapping.StructureFieldException; import com.liferay.portlet.dynamicdatamapping.model.DDMStructure; import com.liferay.portlet.dynamicdatamapping.service.DDMStructureLocalServiceUtil; import com.liferay.portlet.dynamicdatamapping.storage.Fields; import com.liferay.portlet.dynamicdatamapping.storage.StorageEngineUtil; import com.liferay.portlet.dynamicdatamapping.util.DDMIndexerUtil; import com.liferay.portlet.dynamicdatamapping.util.DDMUtil; import com.liferay.portlet.expando.model.ExpandoBridge; import com.liferay.portlet.expando.util.ExpandoBridgeFactoryUtil; import com.liferay.portlet.expando.util.ExpandoBridgeIndexerUtil; import com.liferay.portlet.messageboards.model.MBMessage; import com.stoxx.fileindexer.logger.FileLogger; import com.stoxx.indexer.logger.IndexerLogger; /** * @author Brian Wing Shun Chan * @author Raymond Aug * @author Alexander Chow */ public class DLFileEntryIndexer extends BaseIndexer { public static final String[] CLASS_NAMES = { DLFileEntry.class.getName() }; //CSV file header private static final String NEW_LINE_SEPARATOR = "\n"; String liferayHome = PropsUtil.get("liferay.home"); String fileName = "ReIndexingFileException.csv"; String fileCsvpath = liferayHome + StringPool.SLASH + fileName; FileWriter fileWriter = null; public static final String PORTLET_ID = PortletKeys.DOCUMENT_LIBRARY; public DLFileEntryIndexer() { setFilterSearch(true); setPermissionAware(true); } @Override public void addRelatedEntryFields(Document document, Object obj) throws Exception { MBMessage message = (MBMessage) obj; DLFileEntry dlFileEntry = DLFileEntryLocalServiceUtil.getDLFileEntry(message.getClassPK()); document.addKeyword(Field.FOLDER_ID, dlFileEntry.getFolderId()); document.addKeyword(Field.HIDDEN, dlFileEntry.isInHiddenFolder()); document.addKeyword(Field.RELATED_ENTRY, true); } @Override public String[] getClassNames() { return CLASS_NAMES; } @Override public String getPortletId() { return PORTLET_ID; } @Override public boolean hasPermission(PermissionChecker permissionChecker, String entryClassName, long entryClassPK, String actionId) throws Exception { return DLFileEntryPermission.contains(permissionChecker, entryClassPK, ActionKeys.VIEW); } @Override public void postProcessContextQuery(BooleanQuery contextQuery, SearchContext searchContext) throws Exception { addStatus(contextQuery, searchContext); if (searchContext.isIncludeAttachments()) { addRelatedClassNames(contextQuery, searchContext); } contextQuery.addRequiredTerm(Field.HIDDEN, searchContext.isIncludeAttachments()); addSearchClassTypeIds(contextQuery, searchContext); String ddmStructureFieldName = (String) searchContext.getAttribute("ddmStructureFieldName"); Serializable ddmStructureFieldValue = searchContext.getAttribute("ddmStructureFieldValue"); if (Validator.isNotNull(ddmStructureFieldName) && Validator.isNotNull(ddmStructureFieldValue)) { String[] ddmStructureFieldNameParts = StringUtil.split(ddmStructureFieldName, StringPool.SLASH); DDMStructure structure = DDMStructureLocalServiceUtil .getStructure(GetterUtil.getLong(ddmStructureFieldNameParts[1])); String fieldName = StringUtil.replaceLast(ddmStructureFieldNameParts[2], StringPool.UNDERLINE.concat(LocaleUtil.toLanguageId(searchContext.getLocale())), StringPool.BLANK); try { ddmStructureFieldValue = DDMUtil.getIndexedFieldValue(ddmStructureFieldValue, structure.getFieldType(fieldName)); } catch (StructureFieldException sfe) { } contextQuery.addRequiredTerm(ddmStructureFieldName, StringPool.QUOTE + ddmStructureFieldValue + StringPool.QUOTE); } String[] mimeTypes = (String[]) searchContext.getAttribute("mimeTypes"); if (ArrayUtil.isNotEmpty(mimeTypes)) { BooleanQuery mimeTypesQuery = BooleanQueryFactoryUtil.create(searchContext); for (String mimeType : mimeTypes) { mimeTypesQuery.addTerm("mimeType", StringUtil.replace(mimeType, CharPool.FORWARD_SLASH, CharPool.UNDERLINE)); } contextQuery.add(mimeTypesQuery, BooleanClauseOccur.MUST); } } @Override public void postProcessSearchQuery(BooleanQuery searchQuery, SearchContext searchContext) throws Exception { Group group = GroupLocalServiceUtil.getCompanyGroup(searchContext.getCompanyId()); DDMStructure tikaRawMetadataStructure = DDMStructureLocalServiceUtil.fetchStructure(group.getGroupId(), PortalUtil.getClassNameId(RawMetadataProcessor.class), "TikaRawMetadata"); if (tikaRawMetadataStructure != null) { addSearchDDMStruture(searchQuery, searchContext, tikaRawMetadataStructure); } String keywords = searchContext.getKeywords(); if (Validator.isNull(keywords)) { addSearchTerm(searchQuery, searchContext, Field.DESCRIPTION, false); addSearchTerm(searchQuery, searchContext, Field.TITLE, false); addSearchTerm(searchQuery, searchContext, Field.USER_NAME, false); } addSearchTerm(searchQuery, searchContext, "ddmContent", false); addSearchTerm(searchQuery, searchContext, "extension", false); addSearchTerm(searchQuery, searchContext, "fileEntryTypeId", false); addSearchTerm(searchQuery, searchContext, "path", false); LinkedHashMap<String, Object> params = (LinkedHashMap<String, Object>) searchContext.getAttribute("params"); if (params != null) { String expandoAttributes = (String) params.get("expandoAttributes"); if (Validator.isNotNull(expandoAttributes)) { addSearchExpando(searchQuery, searchContext, expandoAttributes); } } } protected void addFileEntryTypeAttributes(Document document, DLFileVersion dlFileVersion) throws PortalException, SystemException { DLFileEntryType dlFileEntryType = DLFileEntryTypeLocalServiceUtil .getDLFileEntryType(dlFileVersion.getFileEntryTypeId()); List<DDMStructure> ddmStructures = dlFileEntryType.getDDMStructures(); for (DDMStructure ddmStructure : ddmStructures) { Fields fields = null; try { DLFileEntryMetadata fileEntryMetadata = DLFileEntryMetadataLocalServiceUtil .getFileEntryMetadata(ddmStructure.getStructureId(), dlFileVersion.getFileVersionId()); fields = StorageEngineUtil.getFields(fileEntryMetadata.getDDMStorageId()); } catch (Exception e) { _log.error("COGNIZANT@@@@addFileEntryTypeAttributes@@CATCH:::::" + dlFileVersion.getFileEntryId(), e); fileLog.error("FileEntryVersion ID" + dlFileVersion.getFileEntryId()); try { fileWriter = generateCsvFile(dlFileVersion.getFileEntryId(), fileCsvpath); } catch (IOException e1) { _log.error("Error Generating CSV", e1); } } if (fields != null) { DDMIndexerUtil.addAttributes(document, ddmStructure, fields); } } } @Override protected void doDelete(Object obj) throws Exception { DLFileEntry dlFileEntry = (DLFileEntry) obj; Document document = new DocumentImpl(); document.addUID(PORTLET_ID, dlFileEntry.getFileEntryId()); SearchEngineUtil.deleteDocument(getSearchEngineId(), dlFileEntry.getCompanyId(), document.get(Field.UID)); } @Override protected Document doGetDocument(Object obj) throws Exception { DLFileEntry dlFileEntry = (DLFileEntry) obj; _log.info("COGNIZANT@@@@doGetDocument::::: TILE::::" + dlFileEntry.getTitle() + "FileEntryID::::" + dlFileEntry.getFileEntryId()); if (_log.isDebugEnabled()) { _log.debug("Indexing document " + dlFileEntry); } boolean indexContent = true; InputStream is = null; try { if (PropsValues.DL_FILE_INDEXING_MAX_SIZE == 0) { indexContent = false; } else if (PropsValues.DL_FILE_INDEXING_MAX_SIZE != -1) { if (dlFileEntry.getSize() > PropsValues.DL_FILE_INDEXING_MAX_SIZE) { indexContent = false; } } if (indexContent) { String[] ignoreExtensions = PrefsPropsUtil .getStringArray(PropsKeys.DL_FILE_INDEXING_IGNORE_EXTENSIONS, StringPool.COMMA); if (ArrayUtil.contains(ignoreExtensions, StringPool.PERIOD + dlFileEntry.getExtension())) { indexContent = false; } } if (indexContent) { is = dlFileEntry.getFileVersion().getContentStream(false); } } catch (Exception e) { _log.error("COGNIZANT@@@@doGetDocument@@CATCH1:::::" + dlFileEntry.getFileEntryId() + "@@@@@" + dlFileEntry.getTitle() + "@@@@", e); fileLog.error("FileEntry ID" + dlFileEntry.getFileEntryId()); try { fileWriter = generateCsvFile(dlFileEntry.getFileEntryId(), fileCsvpath); } catch (IOException e1) { _log.error("Error Generating CSV", e1); } } DLFileVersion dlFileVersion = dlFileEntry.getFileVersion(); try { Document document = getBaseModelDocument(PORTLET_ID, dlFileEntry, dlFileVersion); if (indexContent) { if (is != null) { try { document.addFile(Field.CONTENT, is, dlFileEntry.getTitle()); } catch (IOException ioe) { throw new SearchException("Cannot extract text from file" + dlFileEntry); } } else if (_log.isDebugEnabled()) { _log.debug("Document " + dlFileEntry + " does not have any content"); } } document.addKeyword(Field.CLASS_TYPE_ID, dlFileEntry.getFileEntryTypeId()); document.addText(Field.DESCRIPTION, dlFileEntry.getDescription()); document.addKeyword(Field.FOLDER_ID, dlFileEntry.getFolderId()); document.addKeyword(Field.HIDDEN, dlFileEntry.isInHiddenFolder()); document.addText(Field.PROPERTIES, dlFileEntry.getLuceneProperties()); document.addText(Field.TITLE, dlFileEntry.getTitle()); document.addKeyword(Field.TREE_PATH, StringUtil.split(dlFileEntry.getTreePath(), CharPool.SLASH)); document.addKeyword("dataRepositoryId", dlFileEntry.getDataRepositoryId()); document.addText("ddmContent", extractContent(dlFileVersion, LocaleUtil.getSiteDefault())); document.addKeyword("extension", dlFileEntry.getExtension()); document.addKeyword("fileEntryTypeId", dlFileEntry.getFileEntryTypeId()); document.addKeyword("mimeType", StringUtil.replace(dlFileEntry.getMimeType(), CharPool.FORWARD_SLASH, CharPool.UNDERLINE)); document.addKeyword("path", dlFileEntry.getTitle()); document.addKeyword("readCount", dlFileEntry.getReadCount()); document.addKeyword("size", dlFileEntry.getSize()); ExpandoBridge expandoBridge = ExpandoBridgeFactoryUtil.getExpandoBridge(dlFileEntry.getCompanyId(), DLFileEntry.class.getName(), dlFileVersion.getFileVersionId()); ExpandoBridgeIndexerUtil.addAttributes(document, expandoBridge); addFileEntryTypeAttributes(document, dlFileVersion); if (dlFileEntry.isInHiddenFolder()) { try { Repository repository = RepositoryLocalServiceUtil.getRepository(dlFileEntry.getRepositoryId()); String portletId = repository.getPortletId(); for (Indexer indexer : IndexerRegistryUtil.getIndexers()) { if (portletId.equals(indexer.getPortletId())) { indexer.addRelatedEntryFields(document, obj); } } } catch (Exception e) { _log.error("COGNIZANT@@@@doGetDocument@@CATCH2:::" + dlFileEntry.getFileEntryId() + "@@@@" + dlFileEntry.getTitle() + "@@@@", e); fileLog.error("FileEntry ID" + dlFileEntry.getFileEntryId()); try { fileWriter = generateCsvFile(dlFileEntry.getFileEntryId(), fileCsvpath); } catch (IOException e1) { _log.error("Error Generating CSV", e1); } } } if (_log.isDebugEnabled()) { _log.debug("Document " + dlFileEntry + " indexed successfully"); } return document; } finally { if (is != null) { try { is.close(); } catch (IOException ioe) { _log.error("COGNIZANT@@@@doGetDocument@@CATCH3:::" + dlFileEntry.getFileEntryId() + "@@@@" + dlFileEntry.getTitle() + "@@@@", ioe); fileLog.error("FileEntry ID" + dlFileEntry.getFileEntryId()); try { fileWriter = generateCsvFile(dlFileEntry.getFileEntryId(), fileCsvpath); } catch (IOException e1) { _log.error("Error Generating CSV", e1); } } } } } @Override protected Summary doGetSummary(Document document, Locale locale, String snippet, PortletURL portletURL) { LiferayPortletURL liferayPortletURL = (LiferayPortletURL) portletURL; liferayPortletURL.setLifecycle(PortletRequest.ACTION_PHASE); try { liferayPortletURL.setWindowState(LiferayWindowState.EXCLUSIVE); } catch (WindowStateException wse) { } String fileEntryId = document.get(Field.ENTRY_CLASS_PK); portletURL.setParameter("struts_action", "/document_library/get_file"); portletURL.setParameter("fileEntryId", fileEntryId); Summary summary = createSummary(document, Field.TITLE, Field.CONTENT); summary.setMaxContentLength(200); summary.setPortletURL(portletURL); return summary; } @Override protected void doReindex(Object obj) throws Exception { DLFileEntry dlFileEntry = null; try { dlFileEntry = (DLFileEntry) obj; DLFileVersion dlFileVersion = dlFileEntry.getFileVersion(); if (!dlFileVersion.isApproved() && !dlFileEntry.isInTrash()) { return; } Document document = getDocument(dlFileEntry); if (document != null) { SearchEngineUtil.updateDocument(getSearchEngineId(), dlFileEntry.getCompanyId(), document); } } catch (Exception e) { _log.error("COGNIZANT@@@@doReindex1 in dlfilenetryindexer:::::", e); fileLog.error("File EntryId :" + dlFileEntry.getFileEntryId()); try { fileWriter = generateCsvFile(dlFileEntry.getFileEntryId(), fileCsvpath); } catch (IOException e1) { _log.error("Error Generating CSV", e1); } } } @Override protected void doReindex(String className, long classPK) throws Exception { DLFileEntry dlFileEntry = DLFileEntryLocalServiceUtil.getFileEntry(classPK); doReindex(dlFileEntry); } @Override protected void doReindex(String[] ids) throws Exception { try { if (ids.length == 1) { long companyId = GetterUtil.getLong(ids[0]); reindexFolders(companyId); reindexRoot(companyId); } else { long companyId = GetterUtil.getLong(ids[0]); long groupId = GetterUtil.getLong(ids[2]); long dataRepositoryId = GetterUtil.getLong(ids[3]); reindexFileEntries(companyId, groupId, dataRepositoryId); } } catch (Exception e) { _log.error("COGNIZANT@@@@doReindex2 in dlfilenetryindexer:::::", e); } } @Override protected void doReindexDDMStructures(List<Long> ddmStructureIds) throws Exception { try { List<DLFileEntry> dlFileEntries = DLFileEntryLocalServiceUtil .getDDMStructureFileEntries(ArrayUtil.toLongArray(ddmStructureIds)); for (DLFileEntry dlFileEntry : dlFileEntries) { doReindex(dlFileEntry); } } catch (Exception e) { _log.error("COGNIZANT@@@@doReindexDDMStructures::::::", e); } } protected String extractContent(DLFileVersion dlFileVersion, Locale locale) throws Exception { if (dlFileVersion.getFileEntryTypeId() == DLFileEntryTypeConstants.FILE_ENTRY_TYPE_ID_BASIC_DOCUMENT) { return StringPool.BLANK; } return extractDDMContent(dlFileVersion, locale); } protected String extractDDMContent(DLFileVersion dlFileVersion, Locale locale) throws Exception { DLFileEntryType dlFileEntryType = DLFileEntryTypeLocalServiceUtil .getDLFileEntryType(dlFileVersion.getFileEntryTypeId()); List<DDMStructure> ddmStructures = dlFileEntryType.getDDMStructures(); StringBundler sb = new StringBundler(ddmStructures.size()); for (DDMStructure ddmStructure : ddmStructures) { DLFileEntryMetadata fileEntryMetadata = DLFileEntryMetadataLocalServiceUtil .fetchFileEntryMetadata(ddmStructure.getStructureId(), dlFileVersion.getFileVersionId()); if (fileEntryMetadata == null) { continue; } Fields fields = null; try { fields = StorageEngineUtil.getFields(fileEntryMetadata.getDDMStorageId()); } catch (Exception e) { continue; } if (fields != null) { sb.append(DDMIndexerUtil.extractAttributes(ddmStructure, fields, locale)); } } return sb.toString(); } @Override protected String getPortletId(SearchContext searchContext) { return PORTLET_ID; } protected void reindexFileEntries(long companyId, final long groupId, final long dataRepositoryId) throws PortalException, SystemException { try { ActionableDynamicQuery actionableDynamicQuery = new DLFileEntryActionableDynamicQuery() { @Override protected void addCriteria(DynamicQuery dynamicQuery) { Property property = PropertyFactoryUtil.forName("folderId"); long folderId = DLFolderConstants.getFolderId(groupId, dataRepositoryId); dynamicQuery.add(property.eq(folderId)); } @Override protected void performAction(Object object) throws PortalException { DLFileEntry dlFileEntry = (DLFileEntry) object; Document document = getDocument(dlFileEntry); if (document != null) { addDocument(document); } } }; actionableDynamicQuery.setCompanyId(companyId); actionableDynamicQuery.setGroupId(groupId); actionableDynamicQuery.setSearchEngineId(getSearchEngineId()); actionableDynamicQuery.performActions(); } catch (Exception e) { _log.error("COGNIZANT@@@@reindexFileEntries:::" + e.getMessage()); } } protected void reindexFolders(final long companyId) throws PortalException, SystemException { try { ActionableDynamicQuery actionableDynamicQuery = new DLFolderActionableDynamicQuery() { @Override protected void performAction(Object object) throws PortalException { DLFolder dlFolder = (DLFolder) object; String portletId = PortletKeys.DOCUMENT_LIBRARY; long groupId = dlFolder.getGroupId(); long folderId = dlFolder.getFolderId(); String[] newIds = { String.valueOf(companyId), portletId, String.valueOf(groupId), String.valueOf(folderId) }; reindex(newIds); } }; actionableDynamicQuery.setCompanyId(companyId); actionableDynamicQuery.performActions(); } catch (Exception e) { _log.error("COGNIZANT@@@@reindexFolders:::", e); } } protected void reindexRoot(final long companyId) throws PortalException, SystemException { try { ActionableDynamicQuery actionableDynamicQuery = new GroupActionableDynamicQuery() { @Override protected void performAction(Object object) throws PortalException { Group group = (Group) object; String portletId = PortletKeys.DOCUMENT_LIBRARY; long groupId = group.getGroupId(); long folderId = groupId; String[] newIds = { String.valueOf(companyId), portletId, String.valueOf(groupId), String.valueOf(folderId) }; reindex(newIds); } }; actionableDynamicQuery.setCompanyId(companyId); actionableDynamicQuery.performActions(); } catch (Exception e) { _log.error("COGNIZANT@@@@reindexFolders:::", e); } } private static Log _log = LogFactoryUtil.getLog(IndexerLogger.class); private static Log fileLog = LogFactoryUtil.getLog(FileLogger.class); private FileWriter generateCsvFile(long fileEntryId, String sFileName) throws IOException { try { fileWriter = new FileWriter(sFileName, Boolean.TRUE); fileLog.error( "generateCsvFile with fileEntryId as " + fileEntryId + " and the sFileName as " + sFileName); fileWriter.append(String.valueOf(fileEntryId)); fileWriter.append(NEW_LINE_SEPARATOR); } catch (IOException e) { fileLog.error("Error in generateCsvFile method", e); } finally { fileWriter.flush(); fileWriter.close(); } return fileWriter; } }