/** * 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.exportimport.lar; import aQute.bnd.annotation.ProviderType; import com.liferay.exportimport.kernel.lar.ManifestSummary; import com.liferay.exportimport.kernel.lar.PortletDataContext; import com.liferay.exportimport.kernel.lar.PortletDataContextFactory; import com.liferay.exportimport.kernel.lar.PortletDataException; import com.liferay.exportimport.kernel.lar.PortletDataHandlerKeys; import com.liferay.exportimport.kernel.lar.UserIdStrategy; import com.liferay.portal.kernel.lock.LockManager; import com.liferay.portal.kernel.model.Group; import com.liferay.portal.kernel.model.Layout; import com.liferay.portal.kernel.security.auth.CompanyThreadLocal; import com.liferay.portal.kernel.service.GroupLocalService; import com.liferay.portal.kernel.theme.ThemeDisplay; import com.liferay.portal.kernel.util.ArrayUtil; import com.liferay.portal.kernel.util.GetterUtil; import com.liferay.portal.kernel.util.MapUtil; import com.liferay.portal.kernel.xml.Document; import com.liferay.portal.kernel.xml.Element; import com.liferay.portal.kernel.xml.SAXReaderUtil; import com.liferay.portal.kernel.zip.ZipReader; import com.liferay.portal.kernel.zip.ZipWriter; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Date; import java.util.Map; import org.osgi.service.component.annotations.Component; import org.osgi.service.component.annotations.Reference; /** * @author Mate Thurzo */ @Component(immediate = true) @ProviderType public class PortletDataContextFactoryImpl implements PortletDataContextFactory { @Override public PortletDataContext clonePortletDataContext( PortletDataContext portletDataContext) { if (portletDataContext == null) { return null; } PortletDataContext clonePortletDataContext = new PortletDataContextImpl( _lockManager, false); clonePortletDataContext.setCompanyId(portletDataContext.getCompanyId()); clonePortletDataContext.setCompanyGroupId( portletDataContext.getCompanyGroupId()); clonePortletDataContext.setDataStrategy( portletDataContext.getDataStrategy()); clonePortletDataContext.setEndDate(portletDataContext.getEndDate()); clonePortletDataContext.setGroupId(portletDataContext.getGroupId()); long[] layoutIds = portletDataContext.getLayoutIds(); if (ArrayUtil.isNotEmpty(layoutIds)) { clonePortletDataContext.setLayoutIds( Arrays.copyOf(layoutIds, layoutIds.length)); } ManifestSummary manifestSummary = portletDataContext.getManifestSummary(); clonePortletDataContext.setManifestSummary( (ManifestSummary)manifestSummary.clone()); Map<String, Map<?, ?>> cloneNewPrimaryKeysMaps = clonePortletDataContext.getNewPrimaryKeysMaps(); cloneNewPrimaryKeysMaps.putAll( portletDataContext.getNewPrimaryKeysMaps()); clonePortletDataContext.setParameterMap( portletDataContext.getParameterMap()); clonePortletDataContext.setPortletId(portletDataContext.getPortletId()); clonePortletDataContext.setScopeGroupId( portletDataContext.getScopeGroupId()); clonePortletDataContext.setSourceCompanyId( portletDataContext.getSourceCompanyId()); clonePortletDataContext.setSourceCompanyGroupId( portletDataContext.getSourceCompanyGroupId()); clonePortletDataContext.setSourceGroupId( portletDataContext.getSourceGroupId()); clonePortletDataContext.setSourceUserPersonalSiteGroupId( portletDataContext.getSourceUserPersonalSiteGroupId()); clonePortletDataContext.setStartDate(portletDataContext.getStartDate()); clonePortletDataContext.setUserIdStrategy( portletDataContext.getUserIdStrategy()); clonePortletDataContext.setUserPersonalSiteGroupId( portletDataContext.getUserPersonalSiteGroupId()); return clonePortletDataContext; } @Override public PortletDataContext createExportPortletDataContext( long companyId, long groupId, Map<String, String[]> parameterMap, Date startDate, Date endDate, ZipWriter zipWriter) throws PortletDataException { validateDateRange(startDate, endDate); PortletDataContext portletDataContext = createPortletDataContext( companyId, groupId); portletDataContext.setEndDate(endDate); portletDataContext.setParameterMap(parameterMap); portletDataContext.setStartDate(startDate); portletDataContext.setZipWriter(zipWriter); return portletDataContext; } @Override public PortletDataContext createImportPortletDataContext( long companyId, long groupId, Map<String, String[]> parameterMap, UserIdStrategy userIdStrategy, ZipReader zipReader) throws PortletDataException { PortletDataContext portletDataContext = createPortletDataContext( companyId, groupId); String dataStrategy = MapUtil.getString( parameterMap, PortletDataHandlerKeys.DATA_STRATEGY, PortletDataHandlerKeys.DATA_STRATEGY_MIRROR); portletDataContext.setDataStrategy(dataStrategy); portletDataContext.setNewLayouts(new ArrayList<Layout>()); portletDataContext.setParameterMap(parameterMap); portletDataContext.setUserIdStrategy(userIdStrategy); portletDataContext.setZipReader(zipReader); readXML(portletDataContext); Map<Long, Long> groupIds = (Map<Long, Long>)portletDataContext.getNewPrimaryKeysMap( Group.class); groupIds.put( portletDataContext.getSourceCompanyGroupId(), portletDataContext.getCompanyGroupId()); return portletDataContext; } @Override public PortletDataContext createPreparePortletDataContext( long companyId, long groupId, Date startDate, Date endDate) throws PortletDataException { validateDateRange(startDate, endDate); PortletDataContext portletDataContext = createPortletDataContext( companyId, groupId); portletDataContext.setEndDate(endDate); portletDataContext.setParameterMap( Collections.<String, String[]>emptyMap()); portletDataContext.setStartDate(startDate); return portletDataContext; } @Override public PortletDataContext createPreparePortletDataContext( ThemeDisplay themeDisplay, Date startDate, Date endDate) throws PortletDataException { return createPreparePortletDataContext( themeDisplay.getCompanyId(), themeDisplay.getScopeGroupId(), startDate, endDate); } protected PortletDataContext createPortletDataContext( long companyId, long groupId) { PortletDataContext portletDataContext = new PortletDataContextImpl( _lockManager); try { Group companyGroup = _groupLocalService.fetchCompanyGroup( companyId); if (companyGroup != null) { portletDataContext.setCompanyGroupId(companyGroup.getGroupId()); } } catch (Exception e) { if (!CompanyThreadLocal.isDeleteInProcess()) { throw new IllegalStateException( "Unable to create a portlet data context for company " + companyId + " because it is being deleted", e); } } portletDataContext.setCompanyId(companyId); portletDataContext.setGroupId(groupId); portletDataContext.setScopeGroupId(groupId); try { Group userPersonalSiteGroup = _groupLocalService.fetchUserPersonalSiteGroup(companyId); if (userPersonalSiteGroup != null) { portletDataContext.setUserPersonalSiteGroupId( userPersonalSiteGroup.getGroupId()); } } catch (Exception e) { if (!CompanyThreadLocal.isDeleteInProcess()) { throw new IllegalStateException( "Unable to create a portlet data context for company " + companyId + " because it is being deleted", e); } } return portletDataContext; } protected void readXML(PortletDataContext portletDataContext) throws PortletDataException { String xml = portletDataContext.getZipEntryAsString("/manifest.xml"); Element rootElement = null; try { Document document = SAXReaderUtil.read(xml); rootElement = document.getRootElement(); } catch (Exception e) { throw new PortletDataException( "Unable to create portlet data context for the import " + "process because of an invalid LAR manifest", e); } portletDataContext.setImportDataRootElement(rootElement); Element headerElement = rootElement.element("header"); long sourceCompanyId = GetterUtil.getLong( headerElement.attributeValue("company-id")); portletDataContext.setSourceCompanyId(sourceCompanyId); long sourceCompanyGroupId = GetterUtil.getLong( headerElement.attributeValue("company-group-id")); portletDataContext.setSourceCompanyGroupId(sourceCompanyGroupId); long sourceGroupId = GetterUtil.getLong( headerElement.attributeValue("group-id")); portletDataContext.setSourceGroupId(sourceGroupId); long sourceUserPersonalSiteGroupId = GetterUtil.getLong( headerElement.attributeValue("user-personal-site-group-id")); portletDataContext.setSourceUserPersonalSiteGroupId( sourceUserPersonalSiteGroupId); Element missingReferencesElement = rootElement.element( "missing-references"); if (missingReferencesElement != null) { portletDataContext.setMissingReferencesElement( missingReferencesElement); } } @Reference(unbind = "-") protected void setGroupLocalService(GroupLocalService groupLocalService) { _groupLocalService = groupLocalService; } @Reference(unbind = "-") protected void setLockManager(LockManager lockManager) { _lockManager = lockManager; } protected void validateDateRange(Date startDate, Date endDate) throws PortletDataException { if ((startDate == null) && (endDate != null)) { throw new PortletDataException( PortletDataException.END_DATE_IS_MISSING_START_DATE); } else if ((startDate != null) && (endDate == null)) { throw new PortletDataException( PortletDataException.START_DATE_IS_MISSING_END_DATE); } if (startDate != null) { if (startDate.after(endDate) || startDate.equals(endDate)) { throw new PortletDataException( PortletDataException.START_DATE_AFTER_END_DATE); } Date now = new Date(); if (startDate.after(now)) { throw new PortletDataException( PortletDataException.FUTURE_START_DATE); } if (endDate.after(now)) { throw new PortletDataException( PortletDataException.FUTURE_END_DATE); } } } private GroupLocalService _groupLocalService; private LockManager _lockManager; }