/** * 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.dynamic.data.mapping.exportimport.content.processor; import com.liferay.document.library.kernel.exception.NoSuchFileEntryException; import com.liferay.document.library.kernel.service.DLAppService; import com.liferay.dynamic.data.mapping.model.DDMFormFieldType; import com.liferay.dynamic.data.mapping.model.Value; import com.liferay.dynamic.data.mapping.storage.DDMFormFieldValue; import com.liferay.dynamic.data.mapping.storage.DDMFormValues; import com.liferay.dynamic.data.mapping.util.DDMFormFieldValueTransformer; import com.liferay.dynamic.data.mapping.util.DDMFormValuesTransformer; import com.liferay.exportimport.content.processor.ExportImportContentProcessor; import com.liferay.exportimport.kernel.lar.PortletDataContext; import com.liferay.exportimport.kernel.lar.StagedModelDataHandlerUtil; import com.liferay.portal.kernel.exception.PortalException; import com.liferay.portal.kernel.json.JSONFactoryUtil; import com.liferay.portal.kernel.json.JSONObject; import com.liferay.portal.kernel.log.Log; import com.liferay.portal.kernel.log.LogFactoryUtil; import com.liferay.portal.kernel.model.Group; import com.liferay.portal.kernel.model.Layout; import com.liferay.portal.kernel.model.StagedModel; import com.liferay.portal.kernel.repository.model.FileEntry; import com.liferay.portal.kernel.service.LayoutLocalService; import com.liferay.portal.kernel.util.GetterUtil; import com.liferay.portal.kernel.util.MapUtil; import com.liferay.portal.kernel.util.Validator; import com.liferay.portal.kernel.xml.Element; import java.util.Locale; import java.util.Map; import org.osgi.service.component.annotations.Component; import org.osgi.service.component.annotations.Reference; /** * @author Daniel Kocsis */ @Component( property = {"model.class.name=com.liferay.dynamic.data.mapping.storage.DDMFormValues"}, service = { DDMFormValuesExportImportContentProcessor.class, ExportImportContentProcessor.class } ) public class DDMFormValuesExportImportContentProcessor implements ExportImportContentProcessor<DDMFormValues> { @Override public DDMFormValues replaceExportContentReferences( PortletDataContext portletDataContext, StagedModel stagedModel, DDMFormValues ddmFormValues, boolean exportReferencedContent, boolean escapeContent) throws Exception { DDMFormValuesTransformer ddmFormValuesTransformer = new DDMFormValuesTransformer(ddmFormValues); ddmFormValuesTransformer.addTransformer( new FileEntryExportDDMFormFieldValueTransformer( exportReferencedContent, portletDataContext, stagedModel)); ddmFormValuesTransformer.addTransformer( new LayoutExportDDMFormFieldValueTransformer( portletDataContext, stagedModel)); ddmFormValuesTransformer.transform(); return ddmFormValues; } @Override public DDMFormValues replaceImportContentReferences( PortletDataContext portletDataContext, StagedModel stagedModel, DDMFormValues ddmFormValues) throws Exception { DDMFormValuesTransformer ddmFormValuesTransformer = new DDMFormValuesTransformer(ddmFormValues); ddmFormValuesTransformer.addTransformer( new FileEntryImportDDMFormFieldValueTransformer( portletDataContext)); ddmFormValuesTransformer.addTransformer( new LayoutImportDDMFormFieldValueTransformer(portletDataContext)); ddmFormValuesTransformer.transform(); return ddmFormValues; } @Override public void validateContentReferences( long groupId, DDMFormValues ddmFormValues) { } @Reference(unbind = "-") protected void setDLAppService(DLAppService dlAppService) { _dlAppService = dlAppService; } @Reference(unbind = "-") protected void setLayoutLocalService( LayoutLocalService layoutLocalService) { _layoutLocalService = layoutLocalService; } private static final Log _log = LogFactoryUtil.getLog( DDMFormValuesExportImportContentProcessor.class); private DLAppService _dlAppService; private LayoutLocalService _layoutLocalService; private static class LayoutImportDDMFormFieldValueTransformer implements DDMFormFieldValueTransformer { public LayoutImportDDMFormFieldValueTransformer( PortletDataContext portletDataContext) { _portletDataContext = portletDataContext; } @Override public String getFieldType() { return DDMFormFieldType.LINK_TO_PAGE; } @Override public void transform(DDMFormFieldValue ddmFormFieldValue) throws PortalException { Value value = ddmFormFieldValue.getValue(); for (Locale locale : value.getAvailableLocales()) { String valueString = value.getString(locale); JSONObject jsonObject = JSONFactoryUtil.createJSONObject( valueString); Layout importedLayout = fetchImportedLayout( _portletDataContext, jsonObject); if (importedLayout == null) { continue; } value.addString(locale, toJSON(importedLayout)); } } protected Layout fetchImportedLayout( PortletDataContext portletDataContext, JSONObject jsonObject) { Map<Long, Layout> layouts = (Map<Long, Layout>)portletDataContext.getNewPrimaryKeysMap( Layout.class + ".layout"); long layoutId = jsonObject.getLong("layoutId"); Layout layout = layouts.get(layoutId); if (layout == null) { if (_log.isWarnEnabled()) { _log.warn("Unable to find layout with ID " + layoutId); } } return layout; } protected String toJSON(Layout layout) { JSONObject jsonObject = JSONFactoryUtil.createJSONObject(); jsonObject.put("groupId", layout.getGroupId()); jsonObject.put("layoutId", layout.getLayoutId()); jsonObject.put("privateLayout", layout.isPrivateLayout()); return jsonObject.toString(); } private final PortletDataContext _portletDataContext; } private class FileEntryExportDDMFormFieldValueTransformer implements DDMFormFieldValueTransformer { public FileEntryExportDDMFormFieldValueTransformer( boolean exportReferencedContent, PortletDataContext portletDataContext, StagedModel stagedModel) { _exportReferencedContent = exportReferencedContent; _portletDataContext = portletDataContext; _stagedModel = stagedModel; } @Override public String getFieldType() { return DDMFormFieldType.DOCUMENT_LIBRARY; } @Override public void transform(DDMFormFieldValue ddmFormFieldValue) throws PortalException { Value value = ddmFormFieldValue.getValue(); for (Locale locale : value.getAvailableLocales()) { String valueString = value.getString(locale); JSONObject jsonObject = JSONFactoryUtil.createJSONObject( valueString); long groupId = GetterUtil.getLong(jsonObject.get("groupId")); String uuid = jsonObject.getString("uuid"); if ((groupId == 0) || Validator.isNull(uuid)) { continue; } FileEntry fileEntry = _dlAppService.getFileEntryByUuidAndGroupId(uuid, groupId); if (_exportReferencedContent) { StagedModelDataHandlerUtil.exportReferenceStagedModel( _portletDataContext, _stagedModel, fileEntry, _portletDataContext.REFERENCE_TYPE_DEPENDENCY); } else { Element entityElement = _portletDataContext.getExportDataElement(_stagedModel); _portletDataContext.addReferenceElement( _stagedModel, entityElement, fileEntry, PortletDataContext.REFERENCE_TYPE_DEPENDENCY, true); } } } private final boolean _exportReferencedContent; private final PortletDataContext _portletDataContext; private final StagedModel _stagedModel; } private class FileEntryImportDDMFormFieldValueTransformer implements DDMFormFieldValueTransformer { public FileEntryImportDDMFormFieldValueTransformer( PortletDataContext portletDataContext) { _portletDataContext = portletDataContext; } @Override public String getFieldType() { return DDMFormFieldType.DOCUMENT_LIBRARY; } @Override public void transform(DDMFormFieldValue ddmFormFieldValue) throws PortalException { Value value = ddmFormFieldValue.getValue(); for (Locale locale : value.getAvailableLocales()) { String valueString = value.getString(locale); JSONObject jsonObject = JSONFactoryUtil.createJSONObject( valueString); String type = jsonObject.getString("type"); FileEntry importedFileEntry = fetchImportedFileEntry( _portletDataContext, jsonObject); if (importedFileEntry == null) { continue; } value.addString(locale, toJSON(importedFileEntry, type)); } } protected FileEntry fetchImportedFileEntry( PortletDataContext portletDataContext, JSONObject jsonObject) throws PortalException { Map<Long, Long> groupIds = (Map<Long, Long>)portletDataContext.getNewPrimaryKeysMap( Group.class); long groupId = jsonObject.getLong("groupId"); String uuid = jsonObject.getString("uuid"); groupId = MapUtil.getLong(groupIds, groupId, groupId); if ((groupId > 0) && Validator.isNotNull(uuid)) { try { return _dlAppService.getFileEntryByUuidAndGroupId( uuid, groupId); } catch (NoSuchFileEntryException nsfee) { if (_log.isWarnEnabled()) { _log.warn( "Unable to find file entry with uuid " + uuid + " and groupId " + groupId, nsfee); } } } return null; } protected String toJSON(FileEntry fileEntry, String type) { JSONObject jsonObject = JSONFactoryUtil.createJSONObject(); jsonObject.put("groupId", fileEntry.getGroupId()); jsonObject.put("title", fileEntry.getTitle()); jsonObject.put("type", type); jsonObject.put("uuid", fileEntry.getUuid()); return jsonObject.toString(); } private final PortletDataContext _portletDataContext; } private class LayoutExportDDMFormFieldValueTransformer implements DDMFormFieldValueTransformer { public LayoutExportDDMFormFieldValueTransformer( PortletDataContext portletDataContext, StagedModel stagedModel) { _portletDataContext = portletDataContext; _stagedModel = stagedModel; } @Override public String getFieldType() { return DDMFormFieldType.LINK_TO_PAGE; } @Override public void transform(DDMFormFieldValue ddmFormFieldValue) throws PortalException { Value value = ddmFormFieldValue.getValue(); for (Locale locale : value.getAvailableLocales()) { String valueString = value.getString(locale); JSONObject jsonObject = JSONFactoryUtil.createJSONObject( valueString); long groupId = GetterUtil.getLong(jsonObject.get("groupId")); long layoutId = GetterUtil.getLong( jsonObject.getLong("layoutId")); boolean privateLayout = jsonObject.getBoolean("privateLayout"); Layout layout = _layoutLocalService.getLayout( groupId, privateLayout, layoutId); Element entityElement = _portletDataContext.getExportDataElement(_stagedModel); _portletDataContext.addReferenceElement( _stagedModel, entityElement, layout, PortletDataContext.REFERENCE_TYPE_DEPENDENCY, true); } } private final PortletDataContext _portletDataContext; private final StagedModel _stagedModel; } }