All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.opencms.module.CmsTestModuleBuilder Maven / Gradle / Ivy

Go to download

OpenCms is an enterprise-ready, easy to use website content management system based on Java and XML technology. Offering a complete set of features, OpenCms helps content managers worldwide to create and maintain beautiful websites fast and efficiently.

The newest version!
/*
 * This library is part of OpenCms -
 * the Open Source Content Management System
 *
 * Copyright (c) Alkacon Software GmbH & Co. KG (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, 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.module;

import org.opencms.db.CmsExportPoint;
import org.opencms.file.CmsObject;
import org.opencms.file.CmsProperty;
import org.opencms.file.CmsResource;
import org.opencms.file.types.CmsResourceTypePlain;
import org.opencms.file.types.I_CmsResourceType;
import org.opencms.loader.CmsLoaderException;
import org.opencms.main.CmsException;
import org.opencms.main.OpenCms;
import org.opencms.report.CmsShellReport;
import org.opencms.util.CmsFileUtil;
import org.opencms.util.CmsStringUtil;
import org.opencms.util.CmsUUID;
import org.opencms.workplace.explorer.CmsExplorerTypeSettings;

import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;

/**
 * Helper class for creating modules for test purposes.

*/ public class CmsTestModuleBuilder { /** * Represents a type to be added.

*/ class TypeEntry { /** Type id. */ private int m_id; /** Type name. */ private String m_name; /** * Creates a new instance.

* * @param name the type name * @param id the type id */ public TypeEntry(String name, int id) { m_name = name; m_id = id; } /** * Gets the id.

* * @return the id */ public int getId() { return m_id; } /** * Gets the name.

* * @return the name */ public String getName() { return m_name; } } /** The CMS object. */ private CmsObject m_cms; /** The export points. */ private List m_exportPoints = new ArrayList<>(); /** The import script. */ private String m_importScript; /** The module. */ private CmsModule m_module; /** The module name. */ private String m_moduleName; /** The structure id for the next resource. */ private CmsUUID m_nextStructureId; /** The type entries. */ private List m_typeEntries = new ArrayList<>(); /** The next resource id. */ private CmsUUID m_nextResourceId; /** Module resources to set. */ private List m_moduleResources; /** * Creates a new instance.

* * @param cms the CMS context * @param moduleName the module name */ public CmsTestModuleBuilder(CmsObject cms, String moduleName) { m_cms = cms; m_moduleName = moduleName; } /** * Adds file using absolute path. * * @param type file type * @param text file content * @param path absolute file path * * @return the created resource * * @throws CmsLoaderException * @throws CmsException */ public CmsResource addAbsoluteFile(String type, String text, String path) throws CmsLoaderException, CmsException { String name = CmsFileUtil.removeTrailingSeparator(CmsResource.getName(path)); CmsUUID structureId = createStructureId(name); CmsUUID resourceId = createResourceId(name); long dummyTime = 1000000; CmsUUID userId = m_cms.getRequestContext().getCurrentUser().getId(); byte[] data = getBytes(text); int length = data == null ? 0 : data.length; // create a new CmsResource CmsResource resource = new CmsResource( structureId, resourceId, path, OpenCms.getResourceManager().getResourceType(type), 0, m_cms.getRequestContext().getCurrentProject().getUuid(), CmsResource.STATE_NEW, dummyTime, userId, dummyTime, userId, CmsResource.DATE_RELEASED_DEFAULT, CmsResource.DATE_EXPIRED_DEFAULT, 1, length, // size System.currentTimeMillis(), 0); return importResource(path, resource, data, new ArrayList<>()); } /** * Adds folder using absolute file path. * * @param path the path * * @throws CmsLoaderException * @throws CmsException */ public void addAbsoluteFolder(String path) throws CmsLoaderException, CmsException { String name = CmsFileUtil.removeTrailingSeparator(CmsResource.getName(path)); CmsUUID structureId = createStructureId(name); CmsUUID resourceId = CmsUUID.getConstantUUID("r-" + name); long dummyTime = 1000000; CmsUUID userId = m_cms.getRequestContext().getCurrentUser().getId(); // create a new CmsResource CmsResource resource = new CmsResource( structureId, resourceId, path, OpenCms.getResourceManager().getResourceType("folder"), 0, m_cms.getRequestContext().getCurrentProject().getUuid(), CmsResource.STATE_NEW, dummyTime, userId, dummyTime, userId, CmsResource.DATE_RELEASED_DEFAULT, CmsResource.DATE_EXPIRED_DEFAULT, 1, -1, // sizem_module System.currentTimeMillis(), 0); importResource(path, resource, null, new ArrayList<>()); } /** * Instead of adding the module with the name passed in the constructor, add it with a different name and explicitly set * list of module resources. This is used to simulate modules like the Apollo modules which have their resources under system/modules/org.opencms.apollo, * which is not a module resource itself. * * @param moduleName the real module name * @param moduleResources the module resource list * * @throws CmsException if something goes wrong */ public void addExplodedModule(String moduleName, List moduleResources) throws CmsException { m_module = new CmsModule(); m_module.setReducedExportMode(true); m_module.setName(moduleName); if (m_importScript != null) { m_module.setImportScript(m_importScript); } m_module.setResources(moduleResources); List types = new ArrayList<>(); for (TypeEntry entry : m_typeEntries) { I_CmsResourceType type = createResourceType(entry.getName(), entry.getId()); types.add(type); } m_module.setResourceTypes(types); OpenCms.getModuleManager().addModule(m_cms, m_module); OpenCms.getResourceManager().initialize(m_cms); } /** * Adds an export point.

* * @param exportPoint the export point */ public void addExportPoint(CmsExportPoint exportPoint) { m_exportPoints.add(exportPoint); } /** * Adds a file.

* * @param type the file type * @param relPath the path relative to the base directory * @param text the file content * @return the resource which has been created * * @throws CmsException if something goes wrong */ public CmsResource addFile(String type, String relPath, String text) throws CmsException { String path = moduleToAbsolutePath(relPath); return addAbsoluteFile(type, text, path); } /** * Adds a folder.

* * @param relPath the path relative to the base path * @throws CmsException if something goes wrong */ public void addFolder(String relPath) throws CmsException { String path = moduleToAbsolutePath(relPath); addAbsoluteFolder(path); } /** * Adds the module object to the module manager.

* * @throws CmsException if something goes wrong */ public void addModule() throws CmsException { m_module = new CmsModule(); m_module.setReducedExportMode(true); m_module.setName(m_moduleName); if (m_importScript != null) { m_module.setImportScript(m_importScript); } if (m_moduleResources == null) { m_moduleResources = Arrays.asList(moduleToAbsolutePath("")); } m_module.setResources(m_moduleResources); m_module.setExportPoints(m_exportPoints); List types = new ArrayList<>(); List expTypes = new ArrayList<>(); for (TypeEntry entry : m_typeEntries) { I_CmsResourceType type = createResourceType(entry.getName(), entry.getId()); types.add(type); CmsExplorerTypeSettings expType = createExplorerType(entry.getName()); expTypes.add(expType); } m_module.setResourceTypes(types); m_module.setExplorerTypes(expTypes); OpenCms.getModuleManager().addModule(m_cms, m_module); OpenCms.getResourceManager().initialize(m_cms); } /** * Adds te text file.

* * @param relPath the relative path * @param text the content * * @return the created resource * @throws CmsException if something goes wrong */ public CmsResource addTextFile(String relPath, String text) throws CmsException { String type = "plain"; return addFile(type, relPath, text); } /** * Adds a resource type.

* * @param name the type name * @param id the type id */ public void addType(String name, int id) { if (m_module != null) { throw new IllegalStateException("Must add types before call to addModule"); } TypeEntry entry = new TypeEntry(name, id); m_typeEntries.add(entry); } /** * Creates an explorer type for the module.

* * @param name the type name * @return the explorer type */ public CmsExplorerTypeSettings createExplorerType(String name) { CmsExplorerTypeSettings settings = new CmsExplorerTypeSettings(); settings.setName(name); settings.setAddititionalModuleExplorerType(true); return settings; } /** * Creates a resource type for the module.

* * @param name the name * @param id the type id * @return the resource type * * @throws CmsException if something goes wrong */ public I_CmsResourceType createResourceType(String name, int id) throws CmsException { I_CmsResourceType type = new CmsResourceTypePlain(); type.initConfiguration(name, "" + id, CmsResourceTypePlain.class.getName()); type.setModuleName(m_moduleName); type.setAdditionalModuleResourceType(true); return type; } /** * Deletes the module.

* * @throws CmsException if something goes wrong */ public void delete() throws CmsException { OpenCms.getModuleManager().deleteModule(m_cms, m_module.getName(), false, new CmsShellReport(Locale.ENGLISH)); } /** * Exports the module to the given file.

* * @param filename the file path * @throws Exception if something goes wrong */ public void export(String filename) throws Exception { CmsModuleImportExportHandler handler = CmsModuleImportExportHandler.getExportHandler( m_cms, OpenCms.getModuleManager().getModule(m_module.getName()), "test module export for " + m_moduleName); handler.setFileName(filename); OpenCms.getImportExportManager().exportData(m_cms, handler, new CmsShellReport(Locale.ENGLISH)); } /** * Gets the module object.

* * @return the module object */ public CmsModule getModule() { return m_module; } /** * Prepends the base path to the given path.

* @param relPath a relative path * @return the absolute path */ public String moduleToAbsolutePath(String relPath) { return CmsStringUtil.joinPaths("/system/modules", m_moduleName, relPath); } /** * Publishes the current project.

* * @throws CmsException if something goes wrong */ public void publish() throws CmsException { try { OpenCms.getPublishManager().publishProject(m_cms); OpenCms.getPublishManager().waitWhileRunning(); } catch (CmsException e) { throw e; } catch (Exception e) { throw new RuntimeException(e); } } /** * Sets the import script.

* * @param importScript the import script */ public void setImportScript(String importScript) { m_importScript = importScript; } /** * Sets the initial module resources. * * @param moduleResources the module resources */ public void setModuleResources(List moduleResources) { m_moduleResources = moduleResources; } /** * Sets the next resource id.

* * @param nextResourceId the next resource id */ public void setNextResourceId(CmsUUID nextResourceId) { m_nextResourceId = nextResourceId; } /** * Sets the next structure id (if not set, it will be automatically generated).

* * @param cmsUUID the next structure id */ public void setNextStructureId(CmsUUID cmsUUID) { m_nextStructureId = cmsUUID; } /** * Updates the module resources. * *

Works only if the module has been added to the module manager already. * * @param moduleResources the module resources * @throws CmsException if something goes wrong */ public void updateModuleResources(String... moduleResources) throws CmsException { CmsModule module = OpenCms.getModuleManager().getModule(m_module.getName()); CmsModule copy = module.clone(); copy.setResources(Arrays.asList(moduleResources)); OpenCms.getModuleManager().updateModule(m_cms, copy); } /** * Gets the UTF-8 encoding of a string.

* * @param str a string * @return the UTF-8 encoding for the string */ byte[] getBytes(String str) { if (str == null) { return null; } try { return str.getBytes("UTF-8"); } catch (UnsupportedEncodingException e) { // shouldn't happen return null; } } /** * Gets the next resource id.

* * If a resource id has been set, it will be returned and cleared, otherwise the resource id will be generated from the parameter passed in. * * @param name the resource name * @return the new resource id */ private CmsUUID createResourceId(String name) { CmsUUID result = m_nextResourceId; if (result == null) { result = CmsUUID.getConstantUUID("r-" + name); } m_nextResourceId = null; return result; } /** * Gets the next structure id.

* * If a structure has been set, it will be returned and cleared, otherwise the structure id will be generated from the parameter passed in. * * @param name the resource name * @return the new structure id */ private CmsUUID createStructureId(String name) { CmsUUID result = m_nextStructureId; if (result == null) { result = CmsUUID.getConstantUUID("s-" + name); } m_nextStructureId = null; return result; } /** * Imports a resource.

* * @param path the path * @param resource the resource to import * @param data the resource contetn * @param props the properties * @return the imported rsource * * @throws CmsException if something goes wrong */ private CmsResource importResource(String path, CmsResource resource, byte[] data, List props) throws CmsException { return m_cms.importResource(path, resource, data, props); } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy