/** * Copyright (c) 2000-present 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.document.library.web.lar; import com.liferay.document.library.kernel.model.DLFileEntry; import com.liferay.document.library.kernel.model.DLFileEntryConstants; import com.liferay.document.library.kernel.model.DLFileEntryType; import com.liferay.document.library.kernel.model.DLFileRank; import com.liferay.document.library.kernel.model.DLFileShortcut; import com.liferay.document.library.kernel.model.DLFileShortcutConstants; import com.liferay.document.library.kernel.model.DLFileVersion; import com.liferay.document.library.kernel.model.DLFolder; import com.liferay.document.library.kernel.model.DLFolderConstants; import com.liferay.document.library.kernel.service.DLAppLocalService; import com.liferay.document.library.kernel.service.DLFileEntryLocalService; import com.liferay.document.library.kernel.service.DLFileEntryTypeLocalService; import com.liferay.document.library.kernel.service.DLFileShortcutLocalService; import com.liferay.document.library.kernel.service.DLFolderLocalService; import com.liferay.document.library.web.constants.DLPortletKeys; import com.liferay.exportimport.kernel.lar.BasePortletDataHandler; import com.liferay.exportimport.kernel.lar.PortletDataContext; import com.liferay.exportimport.kernel.lar.PortletDataHandler; import com.liferay.exportimport.kernel.lar.PortletDataHandlerBoolean; import com.liferay.exportimport.kernel.lar.PortletDataHandlerControl; import com.liferay.exportimport.kernel.lar.StagedModelDataHandler; import com.liferay.exportimport.kernel.lar.StagedModelDataHandlerRegistryUtil; import com.liferay.exportimport.kernel.lar.StagedModelDataHandlerUtil; import com.liferay.exportimport.kernel.lar.StagedModelType; import com.liferay.portal.kernel.dao.orm.ActionableDynamicQuery; import com.liferay.portal.kernel.dao.orm.Conjunction; import com.liferay.portal.kernel.dao.orm.Criterion; import com.liferay.portal.kernel.dao.orm.Disjunction; import com.liferay.portal.kernel.dao.orm.DynamicQuery; import com.liferay.portal.kernel.dao.orm.DynamicQueryFactoryUtil; import com.liferay.portal.kernel.dao.orm.ExportActionableDynamicQuery; import com.liferay.portal.kernel.dao.orm.ProjectionFactoryUtil; import com.liferay.portal.kernel.dao.orm.Property; import com.liferay.portal.kernel.dao.orm.PropertyFactoryUtil; import com.liferay.portal.kernel.dao.orm.RestrictionsFactoryUtil; import com.liferay.portal.kernel.exception.PortalException; import com.liferay.portal.kernel.model.Repository; import com.liferay.portal.kernel.repository.model.FileEntry; import com.liferay.portal.kernel.repository.model.FileShortcut; import com.liferay.portal.kernel.repository.model.Folder; import com.liferay.portal.kernel.service.RepositoryLocalService; import com.liferay.portal.kernel.util.Portal; import com.liferay.portal.kernel.util.PortalClassLoaderUtil; import com.liferay.portal.kernel.util.StringPool; import com.liferay.portal.kernel.xml.Element; import com.liferay.portal.repository.liferayrepository.LiferayRepositoryDefiner; import com.liferay.portal.repository.temporaryrepository.TemporaryFileEntryRepositoryDefiner; import com.liferay.portal.util.PropsValues; import com.liferay.portlet.documentlibrary.constants.DLConstants; import com.liferay.portlet.documentlibrary.service.permission.DLPermission; import java.util.List; import javax.portlet.PortletPreferences; import org.osgi.service.component.annotations.Activate; import org.osgi.service.component.annotations.Component; import org.osgi.service.component.annotations.Reference; /** * @author Bruno Farache * @author Raymond Augé * @author Sampsa Sohlman * @author Mate Thurzo * @author Zsolt Berentey */ @Component( property = { "javax.portlet.name=" + DLPortletKeys.DOCUMENT_LIBRARY, "javax.portlet.name=" + DLPortletKeys.DOCUMENT_LIBRARY_ADMIN }, service = PortletDataHandler.class ) public class DLPortletDataHandler extends BasePortletDataHandler { public static final String NAMESPACE = "document_library"; public static final String SCHEMA_VERSION = "1.0.0"; @Override public String getSchemaVersion() { return SCHEMA_VERSION; } @Override public String getServiceName() { return DLConstants.SERVICE_NAME; } @Activate protected void activate() { setDataLocalized(true); setDataPortletPreferences("rootFolderId"); setDeletionSystemEventStagedModelTypes( new StagedModelType(DLFileEntryType.class), new StagedModelType(DLFileRank.class), new StagedModelType(DLFileShortcut.class), new StagedModelType(DLFileEntryConstants.getClassName()), new StagedModelType(DLFolderConstants.getClassName()), new StagedModelType(Repository.class)); setExportControls( new PortletDataHandlerBoolean( NAMESPACE, "repositories", true, false, null, Repository.class.getName(), StagedModelType.REFERRER_CLASS_NAME_ALL), new PortletDataHandlerBoolean( NAMESPACE, "folders", true, false, null, DLFolderConstants.getClassName()), new PortletDataHandlerBoolean( NAMESPACE, "documents", true, false, new PortletDataHandlerControl[] { new PortletDataHandlerBoolean( NAMESPACE, "previews-and-thumbnails") }, DLFileEntryConstants.getClassName()), new PortletDataHandlerBoolean( NAMESPACE, "document-types", true, false, null, DLFileEntryType.class.getName()), new PortletDataHandlerBoolean( NAMESPACE, "shortcuts", true, false, null, DLFileShortcutConstants.getClassName())); setPublishToLiveByDefault(PropsValues.DL_PUBLISH_TO_LIVE_BY_DEFAULT); setRank(90); } @Override protected PortletPreferences doDeleteData( PortletDataContext portletDataContext, String portletId, PortletPreferences portletPreferences) throws Exception { if (portletDataContext.addPrimaryKey( DLPortletDataHandler.class, "deleteData")) { return portletPreferences; } _dlAppLocalService.deleteAll(portletDataContext.getScopeGroupId()); if (portletPreferences == null) { return portletPreferences; } portletPreferences.setValue("enable-comment-ratings", StringPool.BLANK); portletPreferences.setValue("fileEntriesPerPage", StringPool.BLANK); portletPreferences.setValue("fileEntryColumns", StringPool.BLANK); portletPreferences.setValue("folderColumns", StringPool.BLANK); portletPreferences.setValue("foldersPerPage", StringPool.BLANK); portletPreferences.setValue("rootFolderId", StringPool.BLANK); portletPreferences.setValue("showFoldersSearch", StringPool.BLANK); portletPreferences.setValue("showSubfolders", StringPool.BLANK); return portletPreferences; } @Override protected String doExportData( final PortletDataContext portletDataContext, String portletId, PortletPreferences portletPreferences) throws Exception { portletDataContext.addPortletPermissions(DLPermission.RESOURCE_NAME); Element rootElement = addExportDataRootElement(portletDataContext); rootElement.addAttribute( "group-id", String.valueOf(portletDataContext.getScopeGroupId())); if (portletDataContext.getBooleanParameter(NAMESPACE, "folders")) { ActionableDynamicQuery folderActionableDynamicQuery = getFolderActionableDynamicQuery(portletDataContext); folderActionableDynamicQuery.performActions(); } if (portletDataContext.getBooleanParameter(NAMESPACE, "documents")) { ActionableDynamicQuery fileEntryActionableDynamicQuery = getFileEntryActionableDynamicQuery(portletDataContext); fileEntryActionableDynamicQuery.performActions(); } if (portletDataContext.getBooleanParameter( NAMESPACE, "document-types")) { ActionableDynamicQuery fileEntryTypeActionableDynamicQuery = getDLFileEntryTypeActionableDynamicQuery(portletDataContext); fileEntryTypeActionableDynamicQuery.performActions(); } if (portletDataContext.getBooleanParameter(NAMESPACE, "repositories")) { ActionableDynamicQuery repositoryActionableDynamicQuery = getRepositoryActionableDynamicQuery(portletDataContext); repositoryActionableDynamicQuery.performActions(); } if (portletDataContext.getBooleanParameter(NAMESPACE, "shortcuts")) { ActionableDynamicQuery fileShortcutActionableDynamicQuery = getDLFileShortcutActionableDynamicQuery(portletDataContext); fileShortcutActionableDynamicQuery.performActions(); } return getExportDataRootElementString(rootElement); } @Override protected PortletPreferences doImportData( PortletDataContext portletDataContext, String portletId, PortletPreferences portletPreferences, String data) throws Exception { portletDataContext.importPortletPermissions(DLPermission.RESOURCE_NAME); if (portletDataContext.getBooleanParameter(NAMESPACE, "folders")) { Element foldersElement = portletDataContext.getImportDataGroupElement(DLFolder.class); List<Element> folderElements = foldersElement.elements(); for (Element folderElement : folderElements) { StagedModelDataHandlerUtil.importStagedModel( portletDataContext, folderElement); } } if (portletDataContext.getBooleanParameter(NAMESPACE, "documents")) { Element fileEntriesElement = portletDataContext.getImportDataGroupElement(DLFileEntry.class); List<Element> fileEntryElements = fileEntriesElement.elements(); for (Element fileEntryElement : fileEntryElements) { StagedModelDataHandlerUtil.importStagedModel( portletDataContext, fileEntryElement); } } if (portletDataContext.getBooleanParameter( NAMESPACE, "document-types")) { Element fileEntryTypesElement = portletDataContext.getImportDataGroupElement( DLFileEntryType.class); List<Element> fileEntryTypeElements = fileEntryTypesElement.elements(); for (Element fileEntryTypeElement : fileEntryTypeElements) { StagedModelDataHandlerUtil.importStagedModel( portletDataContext, fileEntryTypeElement); } } if (portletDataContext.getBooleanParameter(NAMESPACE, "repositories")) { Element repositoriesElement = portletDataContext.getImportDataGroupElement(Repository.class); List<Element> repositoryElements = repositoriesElement.elements(); for (Element repositoryElement : repositoryElements) { StagedModelDataHandlerUtil.importStagedModel( portletDataContext, repositoryElement); } } if (portletDataContext.getBooleanParameter(NAMESPACE, "shortcuts")) { Element fileShortcutsElement = portletDataContext.getImportDataGroupElement( DLFileShortcut.class); List<Element> fileShortcutElements = fileShortcutsElement.elements(); for (Element fileShortcutElement : fileShortcutElements) { StagedModelDataHandlerUtil.importStagedModel( portletDataContext, fileShortcutElement); } } return portletPreferences; } @Override protected void doPrepareManifestSummary( final PortletDataContext portletDataContext, PortletPreferences portletPreferences) throws Exception { ActionableDynamicQuery dlFileShortcutActionableDynamicQuery = getDLFileShortcutActionableDynamicQuery(portletDataContext); dlFileShortcutActionableDynamicQuery.performCount(); ActionableDynamicQuery fileEntryActionableDynamicQuery = getFileEntryActionableDynamicQuery(portletDataContext); fileEntryActionableDynamicQuery.performCount(); ActionableDynamicQuery fileEntryTypeActionableDynamicQuery = getDLFileEntryTypeActionableDynamicQuery(portletDataContext); fileEntryTypeActionableDynamicQuery.performCount(); ActionableDynamicQuery folderActionableDynamicQuery = getFolderActionableDynamicQuery(portletDataContext); folderActionableDynamicQuery.performCount(); ActionableDynamicQuery repositoryActionableDynamicQuery = getRepositoryActionableDynamicQuery(portletDataContext); repositoryActionableDynamicQuery.performCount(); } protected ActionableDynamicQuery getDLFileEntryTypeActionableDynamicQuery( final PortletDataContext portletDataContext) throws Exception { ActionableDynamicQuery actionableDynamicQuery = _dlFileEntryTypeLocalService.getExportActionableDynamicQuery( portletDataContext); final ActionableDynamicQuery.AddCriteriaMethod addCriteriaMethod = actionableDynamicQuery.getAddCriteriaMethod(); actionableDynamicQuery.setAddCriteriaMethod( new ActionableDynamicQuery.AddCriteriaMethod() { @Override public void addCriteria(DynamicQuery dynamicQuery) { addCriteriaMethod.addCriteria(dynamicQuery); Property property = PropertyFactoryUtil.forName("groupId"); dynamicQuery.add( property.in( new Long[] {portletDataContext.getScopeGroupId()})); } }); actionableDynamicQuery.setPerformActionMethod( new ActionableDynamicQuery.PerformActionMethod<DLFileEntryType>() { @Override public void performAction(DLFileEntryType dlFileEntryType) throws PortalException { if (dlFileEntryType.isExportable()) { StagedModelDataHandlerUtil.exportStagedModel( portletDataContext, dlFileEntryType); } } }); return actionableDynamicQuery; } protected ActionableDynamicQuery getDLFileShortcutActionableDynamicQuery( final PortletDataContext portletDataContext) throws Exception { final ExportActionableDynamicQuery exportActionableDynamicQuery = _dlFileShortcutLocalService.getExportActionableDynamicQuery( portletDataContext); final ActionableDynamicQuery.AddCriteriaMethod addCriteriaMethod = exportActionableDynamicQuery.getAddCriteriaMethod(); exportActionableDynamicQuery.setAddCriteriaMethod( new ActionableDynamicQuery.AddCriteriaMethod() { @Override public void addCriteria(DynamicQuery dynamicQuery) { addCriteriaMethod.addCriteria(dynamicQuery); Property property = PropertyFactoryUtil.forName("active"); dynamicQuery.add(property.eq(Boolean.TRUE)); } }); exportActionableDynamicQuery.setPerformActionMethod( new ActionableDynamicQuery.PerformActionMethod<DLFileShortcut>() { @Override public void performAction(DLFileShortcut dlFileShortcut) throws PortalException { FileShortcut fileShortcut = _dlAppLocalService.getFileShortcut( dlFileShortcut.getFileShortcutId()); StagedModelDataHandlerUtil.exportStagedModel( portletDataContext, fileShortcut); } }); exportActionableDynamicQuery.setStagedModelType( new StagedModelType(DLFileShortcutConstants.getClassName())); return exportActionableDynamicQuery; } protected ActionableDynamicQuery getFileEntryActionableDynamicQuery( final PortletDataContext portletDataContext) throws Exception { final ExportActionableDynamicQuery exportActionableDynamicQuery = _dlFileEntryLocalService.getExportActionableDynamicQuery( portletDataContext); exportActionableDynamicQuery.setAddCriteriaMethod( new ActionableDynamicQuery.AddCriteriaMethod() { @Override public void addCriteria(DynamicQuery dynamicQuery) { DynamicQuery fileVersionDynamicQuery = DynamicQueryFactoryUtil.forClass( DLFileVersion.class, "dlFileVersion", PortalClassLoaderUtil.getClassLoader()); fileVersionDynamicQuery.setProjection( ProjectionFactoryUtil.property("fileEntryId")); fileVersionDynamicQuery.add( RestrictionsFactoryUtil.eqProperty( "dlFileVersion.fileEntryId", "this.fileEntryId")); fileVersionDynamicQuery.add( RestrictionsFactoryUtil.eqProperty( "dlFileVersion.version", "this.version")); Property fileVersionStatusProperty = PropertyFactoryUtil.forName("dlFileVersion.status"); StagedModelDataHandler<?> stagedModelDataHandler = StagedModelDataHandlerRegistryUtil. getStagedModelDataHandler( DLFileEntry.class.getName()); fileVersionDynamicQuery.add( fileVersionStatusProperty.in( stagedModelDataHandler.getExportableStatuses())); Criterion fileVersionModifiedDateCriterion = portletDataContext.getDateRangeCriteria( "dlFileVersion.modifiedDate"); Criterion fileVersionStatusDateCriterion = portletDataContext.getDateRangeCriteria( "dlFileVersion.statusDate"); Criterion modifiedDateCriterion = portletDataContext.getDateRangeCriteria( "this.modifiedDate"); if ((fileVersionStatusDateCriterion != null) && (modifiedDateCriterion != null)) { Disjunction disjunction = RestrictionsFactoryUtil.disjunction(); disjunction.add(fileVersionModifiedDateCriterion); disjunction.add(fileVersionStatusDateCriterion); disjunction.add(modifiedDateCriterion); fileVersionDynamicQuery.add(disjunction); } Property fileEntryIdProperty = PropertyFactoryUtil.forName( "fileEntryId"); dynamicQuery.add( fileEntryIdProperty.in(fileVersionDynamicQuery)); Property repositoryIdProperty = PropertyFactoryUtil.forName( "repositoryId"); dynamicQuery.add( repositoryIdProperty.eq( portletDataContext.getScopeGroupId())); } }); exportActionableDynamicQuery.setPerformActionMethod( new ActionableDynamicQuery.PerformActionMethod<DLFileEntry>() { @Override public void performAction(DLFileEntry dlFileEntry) throws PortalException { FileEntry fileEntry = _dlAppLocalService.getFileEntry( dlFileEntry.getFileEntryId()); StagedModelDataHandlerUtil.exportStagedModel( portletDataContext, fileEntry); } }); exportActionableDynamicQuery.setStagedModelType( new StagedModelType(DLFileEntryConstants.getClassName())); return exportActionableDynamicQuery; } protected ActionableDynamicQuery getFolderActionableDynamicQuery( final PortletDataContext portletDataContext) throws Exception { ExportActionableDynamicQuery exportActionableDynamicQuery = _dlFolderLocalService.getExportActionableDynamicQuery( portletDataContext); final ActionableDynamicQuery.AddCriteriaMethod addCriteriaMethod = exportActionableDynamicQuery.getAddCriteriaMethod(); exportActionableDynamicQuery.setAddCriteriaMethod( new ActionableDynamicQuery.AddCriteriaMethod() { @Override public void addCriteria(DynamicQuery dynamicQuery) { addCriteriaMethod.addCriteria(dynamicQuery); Property property = PropertyFactoryUtil.forName( "repositoryId"); dynamicQuery.add( property.eq(portletDataContext.getScopeGroupId())); } }); exportActionableDynamicQuery.setPerformActionMethod( new ActionableDynamicQuery.PerformActionMethod<DLFolder>() { @Override public void performAction(DLFolder dlFolder) throws PortalException { if (dlFolder.isInTrash()) { return; } Folder folder = _dlAppLocalService.getFolder( dlFolder.getFolderId()); StagedModelDataHandlerUtil.exportStagedModel( portletDataContext, folder); } }); exportActionableDynamicQuery.setStagedModelType( new StagedModelType(DLFolderConstants.getClassName())); return exportActionableDynamicQuery; } protected ActionableDynamicQuery getRepositoryActionableDynamicQuery( final PortletDataContext portletDataContext) throws Exception { ExportActionableDynamicQuery exportActionableDynamicQuery = _repositoryLocalService.getExportActionableDynamicQuery( portletDataContext); final ActionableDynamicQuery.AddCriteriaMethod addCriteriaMethod = exportActionableDynamicQuery.getAddCriteriaMethod(); exportActionableDynamicQuery.setAddCriteriaMethod( new ActionableDynamicQuery.AddCriteriaMethod() { @Override public void addCriteria(DynamicQuery dynamicQuery) { addCriteriaMethod.addCriteria(dynamicQuery); Conjunction conjunction = RestrictionsFactoryUtil.conjunction(); Property classNameIdProperty = PropertyFactoryUtil.forName( "classNameId"); long liferayRepositoryClassNameId = _portal.getClassNameId( LiferayRepositoryDefiner.CLASS_NAME); conjunction.add( classNameIdProperty.ne(liferayRepositoryClassNameId)); long tempFileRepositoryClassNameId = _portal.getClassNameId( TemporaryFileEntryRepositoryDefiner.CLASS_NAME); conjunction.add( classNameIdProperty.ne(tempFileRepositoryClassNameId)); dynamicQuery.add(conjunction); Disjunction disjunction = RestrictionsFactoryUtil.disjunction(); Property portletIdProperty = PropertyFactoryUtil.forName( "portletId"); disjunction.add(portletIdProperty.isNull()); disjunction.add(portletIdProperty.eq(StringPool.BLANK)); disjunction.add( portletIdProperty.eq( DLPortletKeys.DOCUMENT_LIBRARY_ADMIN)); dynamicQuery.add(disjunction); } }); exportActionableDynamicQuery.setStagedModelType( new StagedModelType( _portal.getClassNameId(Repository.class.getName()), StagedModelType.REFERRER_CLASS_NAME_ID_ALL)); return exportActionableDynamicQuery; } @Reference(unbind = "-") protected void setDLAppLocalService(DLAppLocalService dlAppLocalService) { _dlAppLocalService = dlAppLocalService; } @Reference(unbind = "-") protected void setDLFileEntryLocalService( DLFileEntryLocalService dlFileEntryLocalService) { _dlFileEntryLocalService = dlFileEntryLocalService; } @Reference(unbind = "-") protected void setDLFileEntryTypeLocalService( DLFileEntryTypeLocalService dlFileEntryTypeLocalService) { _dlFileEntryTypeLocalService = dlFileEntryTypeLocalService; } @Reference(unbind = "-") protected void setDLFileShortcutLocalService( DLFileShortcutLocalService dlFileShortcutLocalService) { _dlFileShortcutLocalService = dlFileShortcutLocalService; } @Reference(unbind = "-") protected void setDLFolderLocalService( DLFolderLocalService dlFolderLocalService) { _dlFolderLocalService = dlFolderLocalService; } @Reference(unbind = "-") protected void setRepositoryLocalService( RepositoryLocalService repositoryLocalService) { _repositoryLocalService = repositoryLocalService; } private DLAppLocalService _dlAppLocalService; private DLFileEntryLocalService _dlFileEntryLocalService; private DLFileEntryTypeLocalService _dlFileEntryTypeLocalService; private DLFileShortcutLocalService _dlFileShortcutLocalService; private DLFolderLocalService _dlFolderLocalService; @Reference private Portal _portal; private RepositoryLocalService _repositoryLocalService; }