/* * This library is part of OpenCms - * the Open Source Content Management System * * Copyright (c) Alkacon Software GmbH (http://www.alkacon.com) * * 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. * * For further information about Alkacon Software GmbH, please see the * company website: http://www.alkacon.com * * For further information about OpenCms, please see the * project website: http://www.opencms.org * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package org.opencms.importexport; import org.opencms.configuration.CmsConfigurationException; import org.opencms.db.CmsUserExportSettings; import org.opencms.file.CmsObject; import org.opencms.i18n.CmsMessageContainer; import org.opencms.main.CmsEvent; import org.opencms.main.CmsException; import org.opencms.main.CmsLog; import org.opencms.main.I_CmsEventListener; import org.opencms.main.OpenCms; import org.opencms.report.I_CmsReport; import org.opencms.security.CmsRole; import org.opencms.security.CmsRoleViolationException; import org.opencms.security.I_CmsPrincipal; import org.opencms.xml.CmsXmlException; import java.io.InputStream; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.logging.Log; import org.dom4j.Document; import org.dom4j.io.SAXReader; /** * Provides information about how to handle imported resources.<p> * * @since 6.0.0 * * @see OpenCms#getImportExportManager() */ public class CmsImportExportManager { /** Tag in the {@link #EXPORT_MANIFEST} for the "userinfo/entry@name" attribute, contains the additional user info entry name. * @deprecated Use the appropriate tag from latest import class instead*/ @Deprecated public static final String A_NAME = A_CmsImport.A_NAME; /** Tag in the {@link #EXPORT_MANIFEST} for the "userinfo/entry@type" attribute, contains the additional user info entry data type name. * @deprecated Use the appropriate tag from latest import class instead*/ @Deprecated public static final String A_TYPE = A_CmsImport.A_TYPE; /** The name of the XML manifest file used for the description of exported OpenCms VFS properties and attributes. */ public static final String EXPORT_MANIFEST = "manifest.xml"; /** The current version of the OpenCms export (appears in the {@link #EXPORT_MANIFEST} header). */ public static final String EXPORT_VERSION = "" + CmsImportVersion7.IMPORT_VERSION7; /** * The name of the XML manifest file used for the description of exported OpenCms VFS properties and attributes.<p> * * @deprecated use {@link #EXPORT_MANIFEST} instead */ @Deprecated public static final String EXPORT_XMLFILENAME = EXPORT_MANIFEST; /** Tag in the {@link #EXPORT_MANIFEST} for the "access" node. * @deprecated Use the appropriate tag from latest import class instead*/ @Deprecated public static final String N_ACCESS = A_CmsImport.N_ACCESS; /** Tag in the {@link #EXPORT_MANIFEST} for the "allowed" node, to identify allowed user permissions. * @deprecated Use the appropriate tag from latest import class instead*/ @Deprecated public static final String N_ACCESSCONTROL_ALLOWEDPERMISSIONS = A_CmsImport.N_ACCESSCONTROL_ALLOWEDPERMISSIONS; /** Tag in the {@link #EXPORT_MANIFEST} for the "denied" node, to identify denied user permissions. * @deprecated Use the appropriate tag from latest import class instead*/ @Deprecated public static final String N_ACCESSCONTROL_DENIEDPERMISSIONS = A_CmsImport.N_ACCESSCONTROL_DENIEDPERMISSIONS; /** Tag in the {@link #EXPORT_MANIFEST} for the "accesscontrol" node, to identify access control entries. * @deprecated Use the appropriate tag from latest import class instead*/ @Deprecated public static final String N_ACCESSCONTROL_ENTRIES = A_CmsImport.N_ACCESSCONTROL_ENTRIES; /** Tag in the {@link #EXPORT_MANIFEST} for the "accessentry" node, to identify a single access control entry. * @deprecated Use the appropriate tag from latest import class instead*/ @Deprecated public static final String N_ACCESSCONTROL_ENTRY = A_CmsImport.N_ACCESSCONTROL_ENTRY; /** Tag in the {@link #EXPORT_MANIFEST} for the "permissionset" node, to identify a permission set. * @deprecated Use the appropriate tag from latest import class instead*/ @Deprecated public static final String N_ACCESSCONTROL_PERMISSIONSET = A_CmsImport.N_ACCESSCONTROL_PERMISSIONSET; /** Tag in the {@link #EXPORT_MANIFEST} for the "uuidprincipal" node, to identify a principal UUID. * @deprecated Use the appropriate tag from latest import class instead*/ @Deprecated public static final String N_ACCESSCONTROL_PRINCIPAL = A_CmsImport.N_ACCESSCONTROL_PRINCIPAL; /** Tag for the "creator" node (appears in the {@link #EXPORT_MANIFEST} header). */ public static final String N_CREATOR = "creator"; /** Tag for the "createdate" node (appears in the {@link #EXPORT_MANIFEST} header). */ public static final String N_DATE = "createdate"; /** Tag in the {@link #EXPORT_MANIFEST} for the "datecreated" node, contains the date created VFS file attribute. * @deprecated Use the appropriate tag from latest import class instead*/ @Deprecated public static final String N_DATECREATED = A_CmsImport.N_DATECREATED; /** Tag in the {@link #EXPORT_MANIFEST} for the "dateexpired" node, contains the expiration date VFS file attribute. * @deprecated Use the appropriate tag from latest import class instead*/ @Deprecated public static final String N_DATEEXPIRED = A_CmsImport.N_DATEEXPIRED; /** Tag in the {@link #EXPORT_MANIFEST} for the "datelastmodified" node, contains the date last modified VFS file attribute. * @deprecated Use the appropriate tag from latest import class instead*/ @Deprecated public static final String N_DATELASTMODIFIED = A_CmsImport.N_DATELASTMODIFIED; /** Tag in the {@link #EXPORT_MANIFEST} for the "datereleased" node, contains the release date VFS file attribute. * @deprecated Use the appropriate tag from latest import class instead*/ @Deprecated public static final String N_DATERELEASED = A_CmsImport.N_DATERELEASED; /** Tag in the {@link #EXPORT_MANIFEST} for the "defaultgroup" node, for backward compatibility with OpenCms 5.x. * @deprecated Use the appropriate tag from latest import class instead*/ @Deprecated public static final String N_DEFAULTGROUP = A_CmsImport.N_DEFAULTGROUP; /** Tag in the {@link #EXPORT_MANIFEST} for the "description" node, contains a users description test. * @deprecated Use the appropriate tag from latest import class instead*/ @Deprecated public static final String N_DESCRIPTION = A_CmsImport.N_DESCRIPTION; /** Tag in the {@link #EXPORT_MANIFEST} for the "destination" node, contains target VFS file name. * @deprecated Use the appropriate tag from latest import class instead*/ @Deprecated public static final String N_DESTINATION = A_CmsImport.N_DESTINATION; /** Tag in the {@link #EXPORT_MANIFEST} for the "email" node, contains a users email. * @deprecated Use the appropriate tag from latest import class instead*/ @Deprecated public static final String N_EMAIL = A_CmsImport.N_EMAIL; /** Tag in the {@link #EXPORT_MANIFEST} for the "export" node. */ public static final String N_EXPORT = "export"; /** Tag in the {@link #EXPORT_MANIFEST} for the "file" node, container node for all VFS resources. * @deprecated Use the appropriate tag from latest import class instead*/ @Deprecated public static final String N_FILE = A_CmsImport.N_FILE; /** Tag in the {@link #EXPORT_MANIFEST} for the "firstname" node, contains a users first name. * @deprecated Use the appropriate tag from latest import class instead*/ @Deprecated public static final String N_FIRSTNAME = A_CmsImport.N_FIRSTNAME; /** Tag in the {@link #EXPORT_MANIFEST} for the "flags" node, contains the flags of a VFS resource. * @deprecated Use the appropriate tag from latest import class instead*/ @Deprecated public static final String N_FLAGS = A_CmsImport.N_FLAGS; /** Tag in the {@link #EXPORT_MANIFEST} for the "groupdata" node, contains a users group data. * @deprecated Use the appropriate tag from latest import class instead*/ @Deprecated public static final String N_GROUPDATA = A_CmsImport.N_GROUPDATA; /** Tag in the {@link #EXPORT_MANIFEST} for the "groupname" node, contains a groups name. * @deprecated Use the appropriate tag from latest import class instead*/ @Deprecated public static final String N_GROUPNAME = A_CmsImport.N_GROUPNAME; /** Tag in the {@link #EXPORT_MANIFEST} for the "id" node, only required for backward compatibility with import version 2. * @deprecated Use the appropriate tag from latest import class instead*/ @Deprecated public static final String N_ID = A_CmsImport.N_ID; /** Tag in the {@link #EXPORT_MANIFEST}, starts the manifest info header. */ public static final String N_INFO = "info"; /** Tag in the {@link #EXPORT_MANIFEST} for the "lastmodified" node, only required for backward compatibility with import version 2. * @deprecated Use the appropriate tag from latest import class instead*/ @Deprecated public static final String N_LASTMODIFIED = A_CmsImport.N_LASTMODIFIED; /** Tag in the {@link #EXPORT_MANIFEST} for the "lastname" node, contains a users last name. * @deprecated Use the appropriate tag from latest import class instead*/ @Deprecated public static final String N_LASTNAME = A_CmsImport.N_LASTNAME; /** Tag in the {@link #EXPORT_MANIFEST} for the "name" node, contains a users login name. * @deprecated Use the appropriate tag from latest import class instead*/ @Deprecated public static final String N_NAME = A_CmsImport.N_NAME; /** Tag in the {@link #EXPORT_MANIFEST} for the "opencms_version" node, appears in the manifest info header. */ public static final String N_OC_VERSION = "opencms_version"; /** Tag in the {@link #EXPORT_MANIFEST} for the "parentgroup" node, contains a groups parent group name. * @deprecated Use the appropriate tag from latest import class instead*/ @Deprecated public static final String N_PARENTGROUP = A_CmsImport.N_PARENTGROUP; /** Tag in the {@link #EXPORT_MANIFEST} for the "password" node, contains a users encrypted password. * @deprecated Use the appropriate tag from latest import class instead*/ @Deprecated public static final String N_PASSWORD = A_CmsImport.N_PASSWORD; /** Tag in the {@link #EXPORT_MANIFEST} for the "infoproject" node, appears in the manifest info header. */ public static final String N_INFO_PROJECT = "infoproject"; /** Tag in the {@link #EXPORT_MANIFEST} for the "properties" node, starts the list of properties of a VFS resource. * @deprecated Use the appropriate tag from latest import class instead*/ @Deprecated public static final String N_PROPERTIES = A_CmsImport.N_PROPERTIES; /** Tag in the {@link #EXPORT_MANIFEST} for the "property" node, starts a property for a VFS resource. * @deprecated Use the appropriate tag from latest import class instead*/ @Deprecated public static final String N_PROPERTY = A_CmsImport.N_PROPERTY; /** Tag in the {@link #EXPORT_MANIFEST} for the "type" property attribute, contains a property type. * @deprecated Use the appropriate tag from latest import class instead*/ @Deprecated public static final String N_PROPERTY_ATTRIB_TYPE = A_CmsImport.N_PROPERTY_ATTRIB_TYPE; /** Tag in the {@link #EXPORT_MANIFEST} for the "shared" property type attribute value. * @deprecated Use the appropriate tag from latest import class instead*/ @Deprecated public static final String N_PROPERTY_ATTRIB_TYPE_SHARED = A_CmsImport.N_PROPERTY_ATTRIB_TYPE_SHARED; /** Tag in the {@link #EXPORT_MANIFEST} for the "relation" node, starts a relation for a VFS resource. * @deprecated Use the appropriate tag from latest import class instead*/ @Deprecated public static final String N_RELATION = A_CmsImport.N_RELATION; /** Tag in the {@link #EXPORT_MANIFEST} for the "id" relation attribute, contains the structure id of the target resource of the relation. * @deprecated Use the appropriate tag from latest import class instead*/ @Deprecated public static final String N_RELATION_ATTRIBUTE_ID = A_CmsImport.N_RELATION_ATTRIBUTE_ID; /** Tag in the {@link #EXPORT_MANIFEST} for the "path" relation attribute, contains the path to the target resource of the relation. * @deprecated Use the appropriate tag from latest import class instead*/ @Deprecated public static final String N_RELATION_ATTRIBUTE_PATH = A_CmsImport.N_RELATION_ATTRIBUTE_PATH; /** Tag in the {@link #EXPORT_MANIFEST} for the "type" relation attribute, contains the type of relation. * @deprecated Use the appropriate tag from latest import class instead*/ @Deprecated public static final String N_RELATION_ATTRIBUTE_TYPE = A_CmsImport.N_RELATION_ATTRIBUTE_TYPE; /** Tag in the {@link #EXPORT_MANIFEST} for the "relations" node, starts the list of relations of a VFS resources. * @deprecated Use the appropriate tag from latest import class instead*/ @Deprecated public static final String N_RELATIONS = A_CmsImport.N_RELATIONS; /** Tag in the {@link #EXPORT_MANIFEST} for the "source" node, contains the source path of a VFS resource in the import zip (or folder). * @deprecated Use the appropriate tag from latest import class instead*/ @Deprecated public static final String N_SOURCE = A_CmsImport.N_SOURCE; /** Tag in the {@link #EXPORT_MANIFEST} for the "address" node, contains a users address. * @deprecated Use the appropriate tag from latest import class instead*/ @Deprecated public static final String N_TAG_ADDRESS = A_CmsImport.N_TAG_ADDRESS; /** Tag in the {@link #EXPORT_MANIFEST} for the "type" node, the resource type name of a VFS resource. * @deprecated Use the appropriate tag from latest import class instead*/ @Deprecated public static final String N_TYPE = A_CmsImport.N_TYPE; /** Tag in the {@link #EXPORT_MANIFEST} for the "user" node, starts the user data. * @deprecated Use the appropriate tag from latest import class instead*/ @Deprecated public static final String N_USER = A_CmsImport.N_USER; /** Tag in the {@link #EXPORT_MANIFEST} for the "usercreated" node, contains the name of the user who created the VFS resource. * @deprecated Use the appropriate tag from latest import class instead*/ @Deprecated public static final String N_USERCREATED = A_CmsImport.N_USERCREATED; /** Tag in the {@link #EXPORT_MANIFEST} for the "userdata" node, starts the list of users. * @deprecated Use the appropriate tag from latest import class instead*/ @Deprecated public static final String N_USERDATA = A_CmsImport.N_USERDATA; /** Tag in the {@link #EXPORT_MANIFEST} for the "usergroupdatas" node, starts the users group data. * @deprecated Use the appropriate tag from latest import class instead*/ @Deprecated public static final String N_USERGROUPDATA = A_CmsImport.N_USERGROUPDATA; /** Tag in the {@link #EXPORT_MANIFEST} for the "orgunitdatas" node, starts the organizational unit data. * @deprecated Use the appropriate tag from latest import class instead*/ @Deprecated public static final String N_ORGUNITDATA = A_CmsImport.N_ORGUNITDATA; /** Tag in the {@link #EXPORT_MANIFEST} for the "usergroups" node, starts the users group data. * @deprecated Use the appropriate tag from latest import class instead*/ @Deprecated public static final String N_USERGROUPS = A_CmsImport.N_USERGROUPS; /** Tag in the {@link #EXPORT_MANIFEST} for the "userinfo" node, contains the additional user info. * @deprecated Use the appropriate tag from latest import class instead*/ @Deprecated public static final String N_USERINFO = A_CmsImport.N_USERINFO; /** Tag in the {@link #EXPORT_MANIFEST} for the "userinfo/entry" node, contains the additional user info entry value. * @deprecated Use the appropriate tag from latest import class instead*/ @Deprecated public static final String N_USERINFO_ENTRY = A_CmsImport.N_USERINFO_ENTRY; /** Tag in the {@link #EXPORT_MANIFEST} for the "userlastmodified" node, contains the name of the user who last modified the VFS resource. * @deprecated Use the appropriate tag from latest import class instead*/ @Deprecated public static final String N_USERLASTMODIFIED = A_CmsImport.N_USERLASTMODIFIED; /** Tag in the {@link #EXPORT_MANIFEST} for the "uuidresource" node, contains a the resource UUID of a VFS resource. * @deprecated Use the appropriate tag from latest import class instead*/ @Deprecated public static final String N_UUIDRESOURCE = A_CmsImport.N_UUIDRESOURCE; /** Tag in the {@link #EXPORT_MANIFEST} for the "uuidstructure" node, only required for backward compatibility with import version 2. * @deprecated Use the appropriate tag from latest import class instead*/ @Deprecated public static final String N_UUIDSTRUCTURE = A_CmsImport.N_UUIDSTRUCTURE; /** Tag in the {@link #EXPORT_MANIFEST} for the "value" node, contains the value of a property. * @deprecated Use the appropriate tag from latest import class instead*/ @Deprecated public static final String N_VALUE = A_CmsImport.N_VALUE; /** Tag in the {@link #EXPORT_MANIFEST} for the "export_version" node, appears in the manifest info header. */ public static final String N_VERSION = "export_version"; /** The log object for this class. */ private static final Log LOG = CmsLog.getLog(CmsImportExportManager.class); /** Boolean flag whether imported pages should be converted into XML pages. */ private boolean m_convertToXmlPage; /** The default values of the HTML->OpenCms Template converter. */ private CmsExtendedHtmlImportDefault m_extendedHtmlImportDefault; /** List of property keys that should be removed from imported resources. */ private List<String> m_ignoredProperties; /** List of immutable resources that should remain unchanged when resources are imported. */ private List<String> m_immutableResources; /** The initialized import/export handlers. */ private List<I_CmsImportExportHandler> m_importExportHandlers; /** Import principal group translations. */ private Map<String, String> m_importGroupTranslations; /** Import principal user translations. */ private Map<String, String> m_importUserTranslations; /** The configured import versions class names. */ private List<I_CmsImport> m_importVersionClasses; /** Boolean flag whether colliding resources should be overwritten during the import. */ private boolean m_overwriteCollidingResources; /** The user export settings. */ private CmsUserExportSettings m_userExportSettings; /** The URL of a 4.x OpenCms application to import content correct into 5.x OpenCms application. */ private String m_webAppUrl; /** * Creates a new instance for the import/export manager, will be called by the import/export configuration manager. */ public CmsImportExportManager() { if (LOG.isInfoEnabled()) { LOG.info(Messages.get().getBundle().key(Messages.INIT_IMPORTEXPORT_INITIALIZING_0)); } m_importExportHandlers = new ArrayList<I_CmsImportExportHandler>(); m_immutableResources = new ArrayList<String>(); m_ignoredProperties = new ArrayList<String>(); m_convertToXmlPage = true; m_importGroupTranslations = new HashMap<String, String>(); m_importUserTranslations = new HashMap<String, String>(); m_overwriteCollidingResources = true; m_importVersionClasses = new ArrayList<I_CmsImport>(); } /** * Adds a property name to the list of properties that should be removed from imported resources.<p> * * @param propertyName a property name */ public void addIgnoredProperty(String propertyName) { if (LOG.isDebugEnabled()) { LOG.debug(Messages.get().getBundle().key(Messages.LOG_IMPORTEXPORT_IGNORING_PROPERTY_1, propertyName)); } m_ignoredProperties.add(propertyName); } /** * Adds a resource to the list of immutable resources that should remain * unchanged when resources are imported.<p> * * @param immutableResource a resources uri in the OpenCms VFS */ public void addImmutableResource(String immutableResource) { if (LOG.isDebugEnabled()) { LOG.debug(Messages.get().getBundle().key( Messages.LOG_IMPORTEXPORT_ADDED_IMMUTABLE_RESOURCE_1, immutableResource)); } m_immutableResources.add(immutableResource); } /** * Adds an import/export handler to the list of configured handlers.<p> * * @param handler the import/export handler to add */ public void addImportExportHandler(I_CmsImportExportHandler handler) { if (LOG.isDebugEnabled()) { LOG.debug(Messages.get().getBundle().key(Messages.LOG_IMPORTEXPORT_ADDED_IMPORTEXPORT_HANDLER_1, handler)); } m_importExportHandlers.add(handler); } /** * Adds an import princial translation to the configuration.<p> * * @param type the princial type ("USER" or "GROUP") * @param from the "from" translation source * @param to the "to" translation target */ public void addImportPrincipalTranslation(String type, String from, String to) { if (LOG.isDebugEnabled()) { LOG.debug(Messages.get().getBundle().key( Messages.LOG_IMPORTEXPORT_ADDED_PRINCIPAL_TRANSLATION_3, type, from, to)); } if (I_CmsPrincipal.PRINCIPAL_GROUP.equalsIgnoreCase(type)) { m_importGroupTranslations.put(from, to); if (LOG.isInfoEnabled()) { LOG.info(Messages.get().getBundle().key(Messages.INIT_IMPORTEXPORT_ADDED_GROUP_TRANSLATION_2, from, to)); } } else if (I_CmsPrincipal.PRINCIPAL_USER.equalsIgnoreCase(type)) { m_importUserTranslations.put(from, to); if (LOG.isInfoEnabled()) { LOG.info(Messages.get().getBundle().key(Messages.INIT_IMPORTEXPORT_ADDED_USER_TRANSLATION_2, from, to)); } } } /** * Adds a import version class name to the configuration.<p> * * @param importVersionClass the import version class name to add */ public void addImportVersionClass(I_CmsImport importVersionClass) { if (LOG.isDebugEnabled()) { LOG.debug(Messages.get().getBundle().key( Messages.LOG_IMPORTEXPORT_ADDED_IMPORT_VERSION_1, importVersionClass)); } m_importVersionClasses.add(importVersionClass); } /** * Checks if imported pages should be converted into XML pages.<p> * * @return true, if imported pages should be converted into XML pages */ public boolean convertToXmlPage() { return m_convertToXmlPage; } /** * Checks if the current user has permissions to export Cms data of a specified export handler, * and if so, triggers the handler to write the export.<p> * * @param cms the cms context * @param handler handler containing the export data * @param report the output report * * @throws CmsRoleViolationException if the current user is not a allowed to export the OpenCms database * @throws CmsImportExportException if operation was not successful * @throws CmsConfigurationException if something goes wrong * * @see I_CmsImportExportHandler */ public void exportData(CmsObject cms, I_CmsImportExportHandler handler, I_CmsReport report) throws CmsConfigurationException, CmsImportExportException, CmsRoleViolationException { OpenCms.getRoleManager().checkRole(cms, CmsRole.DATABASE_MANAGER); handler.exportData(cms, report); } /** * Returns the extendedHtmlImportDefault.<p> * * @return the extendedHtmlImportDefault */ public CmsExtendedHtmlImportDefault getExtendedHtmlImportDefault() { return getExtendedHtmlImportDefault(false); } /** * Returns the extendedHtmlImportDefault.<p> * *@param withNull returns the extendenHtmlImport as null if its null, * otherwise a new CmsExtendedHtmlImportDefault Object is generated * * @return the extendedHtmlImportDefault */ public CmsExtendedHtmlImportDefault getExtendedHtmlImportDefault(boolean withNull) { return (withNull || (m_extendedHtmlImportDefault != null) ? m_extendedHtmlImportDefault : new CmsExtendedHtmlImportDefault()); } /** * Returns the list of property keys that should be removed from imported resources.<p> * * @return the list of property keys that should be removed from imported resources, or Collections.EMPTY_LIST */ public List<String> getIgnoredProperties() { return m_ignoredProperties; } /** * Returns the list of immutable resources that should remain unchanged when resources are * imported.<p> * * Certain system resources should not be changed during import. This is the case for the main * folders in the /system/ folder. Changes to these folders usually should not be imported to * another system.<p> * * @return the list of immutable resources, or {@link Collections#EMPTY_LIST} */ public List<String> getImmutableResources() { return m_immutableResources; } /** * Returns an instance of an import/export handler implementation that is able to import * a specified resource.<p> * * @param parameters the import parameters * * @return an instance of an import/export handler implementation * * @throws CmsImportExportException if something goes wrong */ public I_CmsImportExportHandler getImportExportHandler(CmsImportParameters parameters) throws CmsImportExportException { Document manifest; InputStream stream = null; CmsImportHelper helper = new CmsImportHelper(parameters); try { helper.openFile(); stream = helper.getFileStream(CmsImportExportManager.EXPORT_MANIFEST); SAXReader reader = new SAXReader(false); reader.setValidation(false); reader.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); manifest = reader.read(stream); } catch (Throwable e) { throw new CmsImportExportException(Messages.get().container( Messages.ERR_IMPORTEXPORT_FILE_NOT_FOUND_1, EXPORT_MANIFEST), e); } finally { try { if (stream != null) { stream.close(); } } catch (Exception e) { // noop } helper.closeFile(); } for (int i = 0; i < m_importExportHandlers.size(); i++) { I_CmsImportExportHandler handler = m_importExportHandlers.get(i); if (handler.matches(manifest)) { return handler; } } CmsMessageContainer message = Messages.get().container( Messages.ERR_IMPORTEXPORT_ERROR_NO_HANDLER_FOUND_1, EXPORT_MANIFEST); if (LOG.isDebugEnabled()) { LOG.debug(message.key()); } throw new CmsImportExportException(message); } /** * Returns the list of configured import/export handlers.<p> * * @return the list of configured import/export handlers */ public List<I_CmsImportExportHandler> getImportExportHandlers() { return m_importExportHandlers; } /** * Returns the configured principal group translations.<p> * * @return the configured principal group translations */ public Map<String, String> getImportGroupTranslations() { return m_importGroupTranslations; } /** * Returns the configured principal user translations.<p> * * @return the configured principal user translations */ public Map<String, String> getImportUserTranslations() { return m_importUserTranslations; } /** * Returns the configured import version class names.<p> * * @return the configured import version class names */ public List<I_CmsImport> getImportVersionClasses() { return m_importVersionClasses; } /** * Returns the URL of a 4.x OpenCms app. (e.g. http://localhost:8080/opencms/opencms/) * from which content was exported.<p> * * This setting is required to import content of 4.x OpenCms apps. correct into 5.x OpenCms apps.<p> * * @return the webAppUrl. */ public String getOldWebAppUrl() { return m_webAppUrl; } /** * Returns the user settings for export.<p> * * @return the user settings for export */ public CmsUserExportSettings getUserExportSettings() { return m_userExportSettings; } /** * Checks if the current user has permissions to import data into the Cms, * and if so, creates a new import handler instance that imports the data.<p> * * @param cms the current OpenCms context object * @param report a Cms report to print log messages * @param parameters the import parameters * * @throws CmsRoleViolationException if the current user is not allowed to import the OpenCms database * @throws CmsImportExportException if operation was not successful * @throws CmsXmlException if the manifest of the import could not be unmarshalled * @throws CmsException in case of errors accessing the VFS * * @see I_CmsImportExportHandler * @see #importData(CmsObject, String, String, I_CmsReport) */ public void importData(CmsObject cms, I_CmsReport report, CmsImportParameters parameters) throws CmsImportExportException, CmsXmlException, CmsRoleViolationException, CmsException { // check the required role permissions OpenCms.getRoleManager().checkRole(cms, CmsRole.DATABASE_MANAGER); try { OpenCms.fireCmsEvent(new CmsEvent( I_CmsEventListener.EVENT_CLEAR_CACHES, Collections.<String, Object> emptyMap())); I_CmsImportExportHandler handler = getImportExportHandler(parameters); synchronized (handler) { handler.setImportParameters(parameters); handler.importData(cms, report); } } finally { OpenCms.fireCmsEvent(new CmsEvent( I_CmsEventListener.EVENT_CLEAR_CACHES, Collections.<String, Object> emptyMap())); } } /** * Checks if the current user has permissions to import data into the Cms, * and if so, creates a new import handler instance that imports the data.<p> * * @param cms the current OpenCms context object * @param importFile the name (absolute path) of the resource (zipfile or folder) to be imported * @param importPath the name (absolute path) of the destination folder in the Cms if required, or null * @param report a Cms report to print log messages * * @throws CmsRoleViolationException if the current user is not allowed to import the OpenCms database * @throws CmsImportExportException if operation was not successful * @throws CmsXmlException if the manifest of the import could not be unmarshalled * @throws CmsException in case of errors accessing the VFS * * @see I_CmsImportExportHandler * @see #importData(CmsObject, I_CmsReport, CmsImportParameters) * * @deprecated use {@link #importData(CmsObject, I_CmsReport, CmsImportParameters)} instead */ @Deprecated public void importData(CmsObject cms, String importFile, String importPath, I_CmsReport report) throws CmsImportExportException, CmsXmlException, CmsRoleViolationException, CmsException { CmsImportParameters parameters = new CmsImportParameters(importFile, importPath, false); importData(cms, report, parameters); } /** * Checks if colliding resources should be overwritten during the import.<p> * * @return true, if colliding resources should be overwritten during the import * @see #setOverwriteCollidingResources(boolean) */ public boolean overwriteCollidingResources() { return m_overwriteCollidingResources; } /** * Sets if imported pages should be converted into XML pages.<p> * * @param convertToXmlPage true, if imported pages should be converted into XML pages. */ public void setConvertToXmlPage(boolean convertToXmlPage) { if (LOG.isDebugEnabled()) { LOG.debug(Messages.get().getBundle().key( Messages.LOG_IMPORTEXPORT_SET_CONVERT_PARAMETER_1, Boolean.toString(convertToXmlPage))); } m_convertToXmlPage = convertToXmlPage; } /** * Sets if imported pages should be converted into XML pages.<p> * * @param convertToXmlPage <code>"true"</code>, if imported pages should be converted into XML pages. */ public void setConvertToXmlPage(String convertToXmlPage) { setConvertToXmlPage(Boolean.valueOf(convertToXmlPage).booleanValue()); } /** * Sets the extendedHtmlImportDefault.<p> * * @param extendedHtmlImportDefault the extendedHtmlImportDefault to set */ public void setExtendedHtmlImportDefault(CmsExtendedHtmlImportDefault extendedHtmlImportDefault) { m_extendedHtmlImportDefault = extendedHtmlImportDefault; } /** * Sets the URL of a 4.x OpenCms app. (e.g. http://localhost:8080/opencms/opencms/) * from which content was exported.<p> * * This setting is required to import content of 4.x OpenCms apps. correct into 5.x OpenCms apps.<p> * * @param webAppUrl a URL of the a OpenCms app. (e.g. http://localhost:8080/opencms/opencms/) */ public void setOldWebAppUrl(String webAppUrl) { if (LOG.isDebugEnabled()) { LOG.debug(Messages.get().getBundle().key(Messages.LOG_IMPORTEXPORT_SET_OLD_WEBAPP_URL_1, webAppUrl)); } m_webAppUrl = webAppUrl; } /** * Sets whether colliding resources should be overwritten during the import for a * specified import implementation.<p> * * v1 and v2 imports (without resource UUIDs in the manifest) *MUST* overwrite colliding * resources. Don't forget to set this flag back to it's original value in v1 and v2 * import implementations!<p> * * This flag must be set to false to force imports > v2 to move colliding resources to * /system/lost-found/.<p> * * The import implementation has to take care to set this flag correct!<p> * * @param overwriteCollidingResources true if colliding resources should be overwritten during the import */ public void setOverwriteCollidingResources(boolean overwriteCollidingResources) { if (LOG.isDebugEnabled()) { LOG.debug(Messages.get().getBundle().key( Messages.LOG_IMPORTEXPORT_SET_OVERWRITE_PARAMETER_1, Boolean.toString(overwriteCollidingResources))); } m_overwriteCollidingResources = overwriteCollidingResources; } /** * @see CmsImportExportManager#setOverwriteCollidingResources(boolean) * * @param overwriteCollidingResources <code>"true"</code> if colliding resources should be overwritten during the import */ public void setOverwriteCollidingResources(String overwriteCollidingResources) { setOverwriteCollidingResources(Boolean.valueOf(overwriteCollidingResources).booleanValue()); } /** * Sets the user export settings.<p> * * @param userExportSettings the user export settings to set */ public void setUserExportSettings(CmsUserExportSettings userExportSettings) { m_userExportSettings = userExportSettings; } /** * Returns the translated name for the given group name.<p> * * If no matching name is found, the given group name is returned.<p> * * @param name the group name to translate * @return the translated name for the given group name */ public String translateGroup(String name) { if (m_importGroupTranslations == null) { return name; } String match = m_importGroupTranslations.get(name); if (match != null) { return match; } else { return name; } } /** * Returns the translated name for the given user name.<p> * * If no matching name is found, the given user name is returned.<p> * * @param name the user name to translate * @return the translated name for the given user name */ public String translateUser(String name) { if (m_importUserTranslations == null) { return name; } String match = m_importUserTranslations.get(name); if (match != null) { return match; } else { return name; } } }