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.custom.portal.verify; import com.liferay.counter.service.CounterLocalServiceUtil; import com.liferay.portal.kernel.dao.orm.ActionableDynamicQuery; import com.liferay.portal.kernel.dao.orm.Criterion; import com.liferay.portal.kernel.dao.orm.DynamicQuery; import com.liferay.portal.kernel.dao.orm.DynamicQueryFactoryUtil; import com.liferay.portal.kernel.dao.orm.RestrictionsFactoryUtil; 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.repository.model.FileEntry; import com.liferay.portal.kernel.repository.model.FileVersion; import com.liferay.portal.kernel.repository.model.Folder; import com.liferay.portal.kernel.util.ContentTypes; import com.liferay.portal.kernel.util.ListUtil; import com.liferay.portal.kernel.util.LocaleUtil; import com.liferay.portal.kernel.util.MimeTypesUtil; import com.liferay.portal.kernel.util.StreamUtil; import com.liferay.portal.kernel.util.StringPool; import com.liferay.portal.kernel.util.StringUtil; import com.liferay.portal.kernel.workflow.WorkflowConstants; import com.liferay.portal.repository.liferayrepository.model.LiferayFileEntry; import com.liferay.portal.repository.liferayrepository.model.LiferayFileVersion; import com.liferay.portal.repository.liferayrepository.model.LiferayFolder; import com.liferay.portal.util.PortalInstances; import com.liferay.portal.verify.VerifyProcess; import com.liferay.portlet.documentlibrary.model.DLFileEntry; 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.service.DLAppHelperLocalServiceUtil; import com.liferay.portlet.documentlibrary.service.DLFileEntryLocalServiceUtil; import com.liferay.portlet.documentlibrary.service.DLFileEntryTypeLocalServiceUtil; import com.liferay.portlet.documentlibrary.service.DLFileShortcutLocalServiceUtil; import com.liferay.portlet.documentlibrary.service.DLFileVersionLocalServiceUtil; import com.liferay.portlet.documentlibrary.service.DLFolderLocalServiceUtil; import com.liferay.portlet.documentlibrary.service.persistence.DLFileEntryActionableDynamicQuery; import com.liferay.portlet.documentlibrary.service.persistence.DLFileVersionActionableDynamicQuery; import com.liferay.portlet.documentlibrary.store.DLStoreUtil; import com.liferay.portlet.documentlibrary.util.DLUtil; import com.liferay.portlet.documentlibrary.util.comparator.FileVersionVersionComparator; import com.liferay.portlet.documentlibrary.webdav.DLWebDAVStorageImpl; import com.liferay.portlet.trash.model.TrashEntry; import com.liferay.portlet.trash.service.TrashEntryLocalServiceUtil; import java.io.InputStream; import java.util.Collections; import java.util.Date; import java.util.List; /** * @author Raymond Aug * @author Douglas Wong * @author Alexander Chow */ public class CustomVerifyDocumentLibrary extends VerifyProcess { protected void addDLFileVersion(DLFileEntry dlFileEntry) throws SystemException { long fileVersionId = CounterLocalServiceUtil.increment(); DLFileVersion dlFileVersion = DLFileVersionLocalServiceUtil.createDLFileVersion(fileVersionId); dlFileVersion.setGroupId(dlFileEntry.getGroupId()); dlFileVersion.setCompanyId(dlFileEntry.getCompanyId()); long userId = dlFileEntry.getUserId(); dlFileVersion.setUserId(userId); String userName = dlFileEntry.getUserName(); dlFileVersion.setUserName(userName); dlFileVersion.setCreateDate(dlFileEntry.getModifiedDate()); dlFileVersion.setModifiedDate(dlFileEntry.getModifiedDate()); dlFileVersion.setRepositoryId(dlFileEntry.getRepositoryId()); dlFileVersion.setFolderId(dlFileEntry.getFolderId()); dlFileVersion.setFileEntryId(dlFileEntry.getFileEntryId()); dlFileVersion.setExtension(dlFileEntry.getExtension()); dlFileVersion.setMimeType(dlFileEntry.getMimeType()); dlFileVersion.setTitle(dlFileEntry.getTitle()); dlFileVersion.setDescription(dlFileEntry.getDescription()); dlFileVersion.setExtraSettings(dlFileEntry.getExtraSettings()); dlFileVersion.setFileEntryTypeId(dlFileEntry.getFileEntryTypeId()); dlFileVersion.setVersion(dlFileEntry.getVersion()); dlFileVersion.setSize(dlFileEntry.getSize()); dlFileVersion.setStatus(WorkflowConstants.STATUS_APPROVED); dlFileVersion.setStatusByUserId(userId); dlFileVersion.setStatusByUserName(userName); dlFileVersion.setStatusDate(new Date()); DLFileVersionLocalServiceUtil.updateDLFileVersion(dlFileVersion); } protected void checkDLFileEntryType() throws Exception { DLFileEntryType dlFileEntryType = DLFileEntryTypeLocalServiceUtil .fetchDLFileEntryType(DLFileEntryTypeConstants.FILE_ENTRY_TYPE_ID_BASIC_DOCUMENT); if (dlFileEntryType != null) { return; } Date now = new Date(); dlFileEntryType = DLFileEntryTypeLocalServiceUtil .createDLFileEntryType(DLFileEntryTypeConstants.FILE_ENTRY_TYPE_ID_BASIC_DOCUMENT); dlFileEntryType.setCreateDate(now); dlFileEntryType.setModifiedDate(now); dlFileEntryType.setFileEntryTypeKey(StringUtil.toUpperCase(DLFileEntryTypeConstants.NAME_BASIC_DOCUMENT)); dlFileEntryType.setName(DLFileEntryTypeConstants.NAME_BASIC_DOCUMENT, LocaleUtil.getDefault()); DLFileEntryTypeLocalServiceUtil.updateDLFileEntryType(dlFileEntryType); } protected void checkFileEntryMimeTypes(final String originalMimeType) throws Exception { ActionableDynamicQuery actionableDynamicQuery = new DLFileEntryActionableDynamicQuery() { @Override protected void performAction(Object object) throws PortalException, SystemException { DLFileEntry dlFileEntry = (DLFileEntry) object; InputStream inputStream = null; try { inputStream = DLFileEntryLocalServiceUtil.getFileAsStream(dlFileEntry.getUserId(), dlFileEntry.getFileEntryId(), dlFileEntry.getVersion(), false); } catch (Exception e) { if (_log.isWarnEnabled()) { _log.warn("Unable to find file entry " + dlFileEntry.getName(), e); } return; } String title = DLUtil.getTitleWithExtension(dlFileEntry.getTitle(), dlFileEntry.getExtension()); String mimeType = getMimeType(inputStream, title); if (mimeType.equals(originalMimeType)) { return; } dlFileEntry.setMimeType(mimeType); DLFileEntryLocalServiceUtil.updateDLFileEntry(dlFileEntry); DLFileVersion dlFileVersion = dlFileEntry.getFileVersion(); dlFileVersion.setMimeType(mimeType); DLFileVersionLocalServiceUtil.updateDLFileVersion(dlFileVersion); } }; actionableDynamicQuery.performActions(); } protected void checkFileVersionMimeTypes(final String originalMimeType) throws Exception { ActionableDynamicQuery actionableDynamicQuery = new DLFileVersionActionableDynamicQuery() { @Override protected void performAction(Object object) throws SystemException { DLFileVersion dlFileVersion = (DLFileVersion) object; InputStream inputStream = null; try { inputStream = DLFileEntryLocalServiceUtil.getFileAsStream(dlFileVersion.getUserId(), dlFileVersion.getFileEntryId(), dlFileVersion.getVersion(), false); } catch (Exception e) { if (_log.isWarnEnabled()) { DLFileEntry dlFileEntry = DLFileEntryLocalServiceUtil .fetchDLFileEntry(dlFileVersion.getFileEntryId()); if (dlFileEntry == null) { _log.warn("Unable to find file entry associated with " + "file version " + dlFileVersion.getFileVersionId(), e); } else { _log.warn("Unable to find file version " + dlFileVersion.getVersion() + " for file " + "entry " + dlFileEntry.getName(), e); } } return; } String title = DLUtil.getTitleWithExtension(dlFileVersion.getTitle(), dlFileVersion.getExtension()); String mimeType = getMimeType(inputStream, title); if (mimeType.equals(originalMimeType)) { return; } dlFileVersion.setMimeType(mimeType); DLFileVersionLocalServiceUtil.updateDLFileVersion(dlFileVersion); } }; actionableDynamicQuery.performActions(); } protected void checkMimeTypes() throws Exception { String[] mimeTypes = { ContentTypes.APPLICATION_OCTET_STREAM, DLWebDAVStorageImpl.MS_OFFICE_2010_TEXT_XML_UTF8 }; for (String mimeType : mimeTypes) { checkFileEntryMimeTypes(mimeType); checkFileVersionMimeTypes(mimeType); } if (_log.isDebugEnabled()) { _log.debug("Fixed file entries with invalid mime types"); } } protected void checkMisversionedDLFileEntries() throws Exception { List<DLFileEntry> dlFileEntries = DLFileEntryLocalServiceUtil.getMisversionedFileEntries(); if (_log.isDebugEnabled()) { _log.debug("Processing " + dlFileEntries.size() + " misversioned file entries"); } for (DLFileEntry dlFileEntry : dlFileEntries) { copyDLFileEntry(dlFileEntry); addDLFileVersion(dlFileEntry); } if (_log.isDebugEnabled()) { _log.debug("Fixed misversioned file entries"); } } protected void checkTitles() throws Exception { DynamicQuery dynamicQuery = DynamicQueryFactoryUtil.forClass(DLFileEntry.class); Criterion criterion1 = RestrictionsFactoryUtil.like("title", "%/%"); Criterion criterion2 = RestrictionsFactoryUtil.like("title", "%\\\\%"); dynamicQuery.add(RestrictionsFactoryUtil.or(criterion1, criterion2)); List<DLFileEntry> dlFileEntries = DLFileEntryLocalServiceUtil.dynamicQuery(dynamicQuery); for (DLFileEntry dlFileEntry : dlFileEntries) { TrashEntry trashEntry = TrashEntryLocalServiceUtil.fetchEntry(dlFileEntry.getModelClassName(), dlFileEntry.getFileEntryId()); if (trashEntry != null) { continue; } String title = dlFileEntry.getTitle(); String newTitle = title.replace(StringPool.SLASH, StringPool.BLANK); newTitle = newTitle.replace(StringPool.BACK_SLASH, StringPool.UNDERLINE); dlFileEntry.setTitle(newTitle); DLFileEntryLocalServiceUtil.updateDLFileEntry(dlFileEntry); DLFileVersion dlFileVersion = dlFileEntry.getFileVersion(); dlFileVersion.setTitle(newTitle); DLFileVersionLocalServiceUtil.updateDLFileVersion(dlFileVersion); if (_log.isDebugEnabled()) { _log.debug("Invalid document title " + title + "renamed to " + newTitle); } } } protected void copyDLFileEntry(DLFileEntry dlFileEntry) throws PortalException, SystemException { long companyId = dlFileEntry.getCompanyId(); long dataRepositoryId = dlFileEntry.getDataRepositoryId(); String name = dlFileEntry.getName(); String version = dlFileEntry.getVersion(); if (DLStoreUtil.hasFile(companyId, dataRepositoryId, name, version)) { return; } FileVersionVersionComparator comparator = new FileVersionVersionComparator(); List<DLFileVersion> dlFileVersions = dlFileEntry.getFileVersions(WorkflowConstants.STATUS_APPROVED); if (dlFileVersions.isEmpty()) { dlFileVersions = dlFileEntry.getFileVersions(WorkflowConstants.STATUS_ANY); } if (dlFileVersions.isEmpty()) { DLStoreUtil.addFile(companyId, dataRepositoryId, name, new byte[0]); return; } dlFileVersions = ListUtil.copy(dlFileVersions); Collections.sort(dlFileVersions, comparator); DLFileVersion dlFileVersion = dlFileVersions.get(0); DLStoreUtil.copyFileVersion(companyId, dataRepositoryId, name, dlFileVersion.getVersion(), version); } @Override protected void doVerify() throws Exception { checkMisversionedDLFileEntries(); checkDLFileEntryType(); checkMimeTypes(); checkTitles(); removeOrphanedDLFileEntries(); updateFileEntryAssets(); updateFolderAssets(); verifyTree(); } protected String getMimeType(InputStream inputStream, String title) { String mimeType = null; try { mimeType = MimeTypesUtil.getContentType(inputStream, title); } finally { StreamUtil.cleanUp(inputStream); } return mimeType; } protected void removeOrphanedDLFileEntries() throws Exception { List<DLFileEntry> dlFileEntries = DLFileEntryLocalServiceUtil.getOrphanedFileEntries(); if (_log.isDebugEnabled()) { _log.debug("Processing " + dlFileEntries.size() + " file entries with no group"); } for (DLFileEntry dlFileEntry : dlFileEntries) { try { DLFileEntryLocalServiceUtil.deleteFileEntry(dlFileEntry.getFileEntryId()); } catch (Exception e) { if (_log.isWarnEnabled()) { _log.warn( "Unable to remove file entry " + dlFileEntry.getFileEntryId() + ": " + e.getMessage()); } } } if (_log.isDebugEnabled()) { _log.debug("Removed orphaned file entries"); } } protected void updateFileEntryAssets() throws Exception { List<DLFileEntry> dlFileEntries = DLFileEntryLocalServiceUtil.getNoAssetFileEntries(); if (_log.isDebugEnabled()) { _log.debug("Processing " + dlFileEntries.size() + " file entries with no asset"); } for (DLFileEntry dlFileEntry : dlFileEntries) { FileEntry fileEntry = new LiferayFileEntry(dlFileEntry); FileVersion fileVersion = new LiferayFileVersion(dlFileEntry.getFileVersion()); try { DLAppHelperLocalServiceUtil.updateAsset(dlFileEntry.getUserId(), fileEntry, fileVersion, null, null, null); } catch (Exception e) { if (_log.isWarnEnabled()) { _log.warn("Unable to update asset for file entry " + dlFileEntry.getFileEntryId() + ": " + e.getMessage()); } } } if (_log.isDebugEnabled()) { _log.debug("Assets verified for file entries"); } } protected void updateFolderAssets() throws Exception { List<DLFolder> dlFolders = DLFolderLocalServiceUtil.getNoAssetFolders(); if (_log.isDebugEnabled()) { _log.debug("Processing " + dlFolders.size() + " folders with no asset"); } for (DLFolder dlFolder : dlFolders) { Folder folder = new LiferayFolder(dlFolder); try { DLAppHelperLocalServiceUtil.updateAsset(dlFolder.getUserId(), folder, null, null, null); } catch (Exception e) { if (_log.isWarnEnabled()) { _log.warn( "Unable to update asset for folder " + dlFolder.getFolderId() + ": " + e.getMessage()); } } } if (_log.isDebugEnabled()) { _log.debug("Assets verified for folders"); } } protected void verifyTree() throws Exception { long[] companyIds = PortalInstances.getCompanyIdsBySQL(); for (long companyId : companyIds) { DLFileEntryLocalServiceUtil.rebuildTree(companyId); DLFileShortcutLocalServiceUtil.rebuildTree(companyId); DLFileVersionLocalServiceUtil.rebuildTree(companyId); DLFolderLocalServiceUtil.rebuildTree(companyId); } } private static Log _log = LogFactoryUtil.getLog(CustomVerifyDocumentLibrary.class); }