
org.opencms.main.CmsShellCommands Maven / Gradle / Ivy
Show all versions of opencms-test Show documentation
/*
* 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.main;
import org.opencms.db.CmsDbEntryNotFoundException;
import org.opencms.db.CmsLoginMessage;
import org.opencms.file.CmsFile;
import org.opencms.file.CmsGroup;
import org.opencms.file.CmsObject;
import org.opencms.file.CmsProject;
import org.opencms.file.CmsProperty;
import org.opencms.file.CmsPropertyDefinition;
import org.opencms.file.CmsResource;
import org.opencms.file.CmsResourceFilter;
import org.opencms.file.CmsUser;
import org.opencms.file.types.CmsResourceTypeFolder;
import org.opencms.file.types.I_CmsResourceType;
import org.opencms.i18n.CmsLocaleManager;
import org.opencms.i18n.CmsMessages;
import org.opencms.importexport.CmsExportParameters;
import org.opencms.importexport.CmsImportParameters;
import org.opencms.importexport.CmsVfsImportExportHandler;
import org.opencms.module.CmsModule;
import org.opencms.module.CmsModule.ExportMode;
import org.opencms.module.CmsModuleImportExportHandler;
import org.opencms.report.CmsShellReport;
import org.opencms.report.I_CmsReport;
import org.opencms.search.CmsSearchIndex;
import org.opencms.security.CmsAccessControlEntry;
import org.opencms.security.CmsAccessControlList;
import org.opencms.security.CmsRole;
import org.opencms.security.I_CmsPrincipal;
import org.opencms.staticexport.CmsLinkManager;
import org.opencms.util.CmsFileUtil;
import org.opencms.util.CmsUUID;
import org.opencms.workplace.CmsWorkplace;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Random;
import java.util.Set;
import java.util.StringTokenizer;
/**
* Provides additional commands for the CmsShell.
*
* Such additional commands can access OpenCms functions not available on "regular" OpenCms classes.
* Also, wrapping methods to access some important functions in the CmsObject that
* require complex data type parameters are provided.
*
* @since 6.0.0
*/
class CmsShellCommands implements I_CmsShellCommands {
/** The OpenCms context object. */
private CmsObject m_cms;
/** The Cms shell object. */
private CmsShell m_shell;
/**
* Generate a new instance of the command processor.
*
* To initialize the command processor, you must call {@link #initShellCmsObject(CmsObject, CmsShell)}.
*
* @see #initShellCmsObject(CmsObject, CmsShell)
*/
protected CmsShellCommands() {
// noop
}
/**
* Add the user to the given role.
*
* @param user name of the user
* @param role name of the role, for example 'EDITOR'
*
* @throws CmsException if something goes wrong
*/
public void addUserToRole(String user, String role) throws CmsException {
OpenCms.getRoleManager().addUserToRole(m_cms, CmsRole.valueOfRoleName(role), user);
}
/**
* Changes the current folder (i.e. the URI in the VFS).
*
* @param target the new URI
* @throws Exception if something goes wrong
* @see org.opencms.file.CmsRequestContext#setUri(String)
*/
public void cd(String target) throws Exception {
String folder = CmsResource.getFolderPath(m_cms.getRequestContext().getUri());
if (!target.endsWith("/")) {
target += "/";
}
String resolvedTarget = CmsLinkManager.getAbsoluteUri(target, folder);
CmsResource res = m_cms.readResource(resolvedTarget);
if (!res.isFolder()) {
throw new CmsIllegalArgumentException(
Messages.get().container(Messages.ERR_NOT_A_FOLDER_1, resolvedTarget));
}
m_cms.getRequestContext().setUri(resolvedTarget);
m_shell.getOut().println(
'\n' + getMessages().key(Messages.GUI_SHELL_CURRENT_FOLDER_1, new Object[] {resolvedTarget}));
m_shell.getOut().println();
}
/**
* Changes the access control for a given resource and a given principal(user/group).
*
* @param resourceName name of the resource
* @param principalType the type of the principal (group or user)
* @param principalName name of the principal
* @param permissionString the permissions in the format ((+|-)(r|w|v|c|i))*
* @throws CmsException if something goes wrong
* @see CmsObject#chacc(String, String, String, String)
*/
public void chacc(String resourceName, String principalType, String principalName, String permissionString)
throws CmsException {
m_cms.lockResource(resourceName);
if (I_CmsPrincipal.PRINCIPAL_GROUP.equalsIgnoreCase(principalType.trim())) {
principalName = OpenCms.getImportExportManager().translateGroup(principalName);
} else {
principalName = OpenCms.getImportExportManager().translateUser(principalName);
}
m_cms.chacc(resourceName, principalType, principalName, permissionString);
}
/**
* Clears all OpenCms internal caches.
*
* @throws Exception if something goes wrong
*/
public void clearCaches() throws Exception {
OpenCms.fireCmsEvent(new CmsEvent(I_CmsEventListener.EVENT_CLEAR_CACHES, new HashMap()));
}
/**
* Prints the OpenCms copyright information.
*/
public void copyright() {
String[] copy = Messages.COPYRIGHT_BY_ALKACON;
for (int i = 0; i < copy.length; i++) {
m_shell.getOut().println(copy[i]);
}
}
/**
* Creates a default project.
*
* This created project has the following properties:
* - The users group is the default user group
*
- The users group is also the default project manager group
*
- All resources are contained in the project
*
- The project will remain after publishing
*
* @param name the name of the project to create
* @param description the description for the new project
* @throws Exception if something goes wrong
*/
public void createDefaultProject(String name, String description) throws Exception {
String storedSiteRoot = m_cms.getRequestContext().getSiteRoot();
try {
m_cms.getRequestContext().setSiteRoot("/");
CmsProject project = m_cms.createProject(
name,
description,
OpenCms.getDefaultUsers().getGroupUsers(),
OpenCms.getDefaultUsers().getGroupUsers(),
CmsProject.PROJECT_TYPE_NORMAL);
m_cms.getRequestContext().setCurrentProject(project);
m_cms.copyResourceToProject("/");
} finally {
m_cms.getRequestContext().setSiteRoot(storedSiteRoot);
}
if (OpenCms.getRoleManager().hasRole(m_cms, CmsRole.WORKPLACE_MANAGER)) {
// re-initialize the search indexes after default project generation
OpenCms.getSearchManager().initialize(m_cms);
}
}
/**
* Creates a new folder in the given target folder.
*
* @param targetFolder the target folder
* @param folderName the new folder to create in the target folder
* @return the created folder
* @throws Exception if somthing goes wrong
*/
public CmsResource createFolder(String targetFolder, String folderName) throws Exception {
return m_cms.createResource(targetFolder + folderName, CmsResourceTypeFolder.getStaticTypeId());
}
/**
* Creates a group.
*
* @param name the name of the new group
* @param description the description of the new group
* @return the created group
* @throws Exception if something goes wrong
* @see CmsObject#createGroup(String, String, int, String)
*/
public CmsGroup createGroup(String name, String description) throws Exception {
return m_cms.createGroup(name, description, I_CmsPrincipal.FLAG_ENABLED, null);
}
/**
* Creates a property definition for the given resource type.
*
* @param name the name of the property definition to create
* @return the created property definition
* @throws Exception if something goes wrong
* @see CmsObject#createPropertyDefinition(String)
*/
public CmsPropertyDefinition createPropertydefinition(String name) throws Exception {
return m_cms.createPropertyDefinition(name);
}
/**
* Creates a new user.
*
* @param name the name for the new user
* @param password the password for the new user
* @param description the description for the new user
*
* @throws Exception if something goes wrong
* @see CmsObject#createUser(String, String, String, java.util.Map)
* @return the created user
*/
public CmsUser createUser(String name, String password, String description) throws Exception {
if (existsUser(name)) {
m_shell.getOut().println(getMessages().key(Messages.GUI_SHELL_USER_ALREADY_EXISTS_1, name));
return null;
}
return m_cms.createUser(name, password, description, new Hashtable());
}
/**
* Creates a user with some additional information.
*
* @param name the name of the new user
* @param password the password
* @param description the description
* @param firstname the users first name
* @param lastname the users he last name
* @param email the users email address
* @return the created user
*
* @throws Exception if something goes wrong
*
* @see CmsObject#createUser(String, String, String, java.util.Map)
*/
public CmsUser createUser(
String name,
String password,
String description,
String firstname,
String lastname,
String email) throws Exception {
if (existsUser(name)) {
m_shell.getOut().println(getMessages().key(Messages.GUI_SHELL_USER_ALREADY_EXISTS_1, name));
return null;
}
CmsUser user = m_cms.createUser(name, password, description, new Hashtable());
user.setEmail(email);
user.setFirstname(firstname);
user.setLastname(lastname);
m_cms.writeUser(user);
return user;
}
/**
* Deletes the versions from the history tables that are older then the given number of versions.
*
* @param versionsToKeep number of versions to keep, is ignored if negative
* @param versionsDeleted number of versions to keep for deleted resources, is ignored if negative
* @param timeDeleted deleted resources older than this will also be deleted, is ignored if negative
*
* @throws Exception if something goes wrong
*
* @see CmsObject#deleteHistoricalVersions( int, int, long, I_CmsReport)
*/
public void deleteHistoricalVersions(int versionsToKeep, int versionsDeleted, long timeDeleted) throws Exception {
m_cms.deleteHistoricalVersions(
versionsToKeep,
versionsDeleted,
timeDeleted,
new CmsShellReport(m_cms.getRequestContext().getLocale()));
}
/**
* Deletes a module.
*
* @param moduleName the name of the module
* @throws Exception if something goes wrong
*/
public void deleteModule(String moduleName) throws Exception {
OpenCms.getModuleManager().deleteModule(
m_cms,
moduleName,
false,
new CmsShellReport(m_cms.getRequestContext().getLocale()));
}
/**
* Deletes a project by name.
*
* @param name the name of the project to delete
* @throws Exception if something goes wrong
*
* @see CmsObject#deleteProject(CmsUUID)
*/
public void deleteProject(String name) throws Exception {
m_cms.deleteProject(m_cms.readProject(name).getUuid());
}
/**
* Delete a property definition for a resource.
*
* @param name the name of the property definition to delete
*
* @throws Exception if something goes wrong
*
* @see CmsObject#deletePropertyDefinition(String)
*/
public void deletepropertydefinition(String name) throws Exception {
m_cms.deletePropertyDefinition(name);
}
/**
* Deletes a resource.
*
* @param name the name of the resource to delete
*
* @throws Exception if something goes wrong
*/
public void deleteResource(String name) throws Exception {
m_cms.lockResource(name);
m_cms.deleteResource(name, CmsResource.DELETE_PRESERVE_SIBLINGS);
}
/**
* Deletes a resource together with its siblings.
*
* @param name the name of the resource to delete
*
* @throws Exception if something goes wrong
*/
public void deleteResourceWithSiblings(String name) throws Exception {
m_cms.lockResource(name);
m_cms.deleteResource(name, CmsResource.DELETE_REMOVE_SIBLINGS);
}
/**
* Turns the echo status for the shell on or off.
*
* @param echo if "on", echo is turned on, otherwise echo is turned off
*/
public void echo(String echo) {
if (echo == null) {
return;
}
boolean b = "on".equalsIgnoreCase(echo.trim());
m_shell.setEcho(b);
if (b) {
m_shell.getOut().println(getMessages().key(Messages.GUI_SHELL_ECHO_ON_0));
} else {
m_shell.getOut().println(getMessages().key(Messages.GUI_SHELL_ECHO_OFF_0));
}
}
/**
* Exits the shell.
*/
public void exit() {
m_shell.exit();
}
/**
* Exports all resources from the current site root to a ZIP file.
*
* @param exportFile the name (absolute path) of the ZIP file to export to
* @throws Exception if something goes wrong
*/
public void exportAllResources(String exportFile) throws Exception {
exportAllResources(exportFile, false);
}
/**
* Exports all resources from the current site root to a ZIP file.
*
* @param exportFile the name (absolute path) of the ZIP file to export to
* @param isReducedExportMode flag, indicating if the reduced export mode should be used
* @throws Exception if something goes wrong
*/
public void exportAllResources(String exportFile, boolean isReducedExportMode) throws Exception {
List exportPaths = new ArrayList(1);
exportPaths.add("/");
CmsVfsImportExportHandler vfsExportHandler = new CmsVfsImportExportHandler();
CmsExportParameters params = new CmsExportParameters(
exportFile,
null,
true,
false,
false,
exportPaths,
true,
true,
0,
true,
false,
isReducedExportMode ? ExportMode.REDUCED : ExportMode.DEFAULT);
vfsExportHandler.setExportParams(params);
OpenCms.getImportExportManager().exportData(
m_cms,
vfsExportHandler,
new CmsShellReport(m_cms.getRequestContext().getLocale()));
}
/**
* Exports the module with the given name to the default location.
*
* @param moduleName the name of the module to export
*
* @throws Exception if something goes wrong
*/
public void exportModule(String moduleName) throws Exception {
CmsModule module = OpenCms.getModuleManager().getModule(moduleName);
if (module == null) {
throw new CmsDbEntryNotFoundException(Messages.get().container(Messages.ERR_UNKNOWN_MODULE_1, moduleName));
}
String filename = OpenCms.getSystemInfo().getAbsoluteRfsPathRelativeToWebInf(
OpenCms.getSystemInfo().getPackagesRfsPath()
+ CmsSystemInfo.FOLDER_MODULES
+ moduleName
+ "_"
+ OpenCms.getModuleManager().getModule(moduleName).getVersion().toString());
List moduleResources = CmsModule.calculateModuleResourceNames(m_cms, module);
String[] resources = new String[moduleResources.size()];
System.arraycopy(moduleResources.toArray(), 0, resources, 0, resources.length);
// generate a module export handler
CmsModuleImportExportHandler moduleExportHandler = new CmsModuleImportExportHandler();
moduleExportHandler.setFileName(filename);
moduleExportHandler.setAdditionalResources(resources);
moduleExportHandler.setModuleName(module.getName().replace('\\', '/'));
moduleExportHandler.setDescription(
getMessages().key(
Messages.GUI_SHELL_IMPORTEXPORT_MODULE_HANDLER_NAME_1,
new Object[] {moduleExportHandler.getModuleName()}));
// export the module
OpenCms.getImportExportManager().exportData(
m_cms,
moduleExportHandler,
new CmsShellReport(m_cms.getRequestContext().getLocale()));
}
/**
* Exports a list of resources from the current site root to a ZIP file.
*
* The resource names in the list must be separated with a ";".
*
* @param exportFile the name (absolute path) of the ZIP file to export to
* @param pathList the list of resource to export, separated with a ";"
* @throws Exception if something goes wrong
*/
public void exportResources(String exportFile, String pathList) throws Exception {
exportResources(exportFile, pathList, false);
}
/**
* Exports a list of resources from the current site root to a ZIP file.
*
* The resource names in the list must be separated with a ";".
*
* @param exportFile the name (absolute path) of the ZIP file to export to
* @param pathList the list of resource to export, separated with a ";"
* @param isReducedExportMode flag, indicating if the reduced export mode should be used
* @throws Exception if something goes wrong
*/
public void exportResources(String exportFile, String pathList, boolean isReducedExportMode) throws Exception {
StringTokenizer tok = new StringTokenizer(pathList, ";");
List exportPaths = new ArrayList();
while (tok.hasMoreTokens()) {
exportPaths.add(tok.nextToken());
}
boolean includeSystem = false;
if (pathList.startsWith(CmsWorkplace.VFS_PATH_SYSTEM)
|| (pathList.indexOf(";" + CmsWorkplace.VFS_PATH_SYSTEM) > -1)) {
includeSystem = true;
}
CmsVfsImportExportHandler vfsExportHandler = new CmsVfsImportExportHandler();
CmsExportParameters params = new CmsExportParameters(
exportFile,
null,
true,
false,
false,
exportPaths,
includeSystem,
true,
0,
true,
false,
isReducedExportMode ? ExportMode.REDUCED : ExportMode.DEFAULT);
vfsExportHandler.setExportParams(params);
OpenCms.getImportExportManager().exportData(
m_cms,
vfsExportHandler,
new CmsShellReport(m_cms.getRequestContext().getLocale()));
}
/**
* Exports a list of resources from the current site root and the user data to a ZIP file.
*
* The resource names in the list must be separated with a ";".
*
* @param exportFile the name (absolute path) of the ZIP file to export to
* @param pathList the list of resource to export, separated with a ";"
* @throws Exception if something goes wrong
*/
public void exportResourcesAndUserdata(String exportFile, String pathList) throws Exception {
exportResourcesAndUserdata(exportFile, pathList, false);
}
/**
* Exports a list of resources from the current site root and the user data to a ZIP file.
*
* The resource names in the list must be separated with a ";".
*
* @param exportFile the name (absolute path) of the ZIP file to export to
* @param pathList the list of resource to export, separated with a ";"
* @param isReducedExportMode flag, indicating if the reduced export mode should be used
* @throws Exception if something goes wrong
*/
public void exportResourcesAndUserdata(String exportFile, String pathList, boolean isReducedExportMode)
throws Exception {
StringTokenizer tok = new StringTokenizer(pathList, ";");
List exportPaths = new ArrayList();
while (tok.hasMoreTokens()) {
exportPaths.add(tok.nextToken());
}
boolean includeSystem = false;
if (pathList.startsWith(CmsWorkplace.VFS_PATH_SYSTEM)
|| (pathList.indexOf(";" + CmsWorkplace.VFS_PATH_SYSTEM) > -1)) {
includeSystem = true;
}
CmsVfsImportExportHandler vfsExportHandler = new CmsVfsImportExportHandler();
CmsExportParameters params = new CmsExportParameters(
exportFile,
null,
true,
true,
false,
exportPaths,
includeSystem,
true,
0,
true,
false,
isReducedExportMode ? ExportMode.REDUCED : ExportMode.DEFAULT);
vfsExportHandler.setExportParams(params);
OpenCms.getImportExportManager().exportData(
m_cms,
vfsExportHandler,
new CmsShellReport(m_cms.getRequestContext().getLocale()));
}
/**
* Displays the access control list of a given resource.
*
* @param resourceName the name of the resource
*
* @throws Exception if something goes wrong
*
* @see CmsObject#getAccessControlList(String)
*/
public void getAcl(String resourceName) throws Exception {
CmsAccessControlList acList = m_cms.getAccessControlList(resourceName);
Iterator principals = acList.getPrincipals().iterator();
while (principals.hasNext()) {
I_CmsPrincipal p = m_cms.lookupPrincipal(principals.next());
m_shell.getOut().println(p.getName() + ": " + acList.getPermissions(p.getId()).getPermissionString());
}
}
/**
* Returns the Locales available on the system ready to use on Method
* {@link #setLocale(String)} from the {@link CmsShell}
.
*
* Note that the full name containing language, country and optional variant seperated
* by underscores is returned always but the latter two parts may be left out.
*/
public void getLocales() {
m_shell.getOut().println(getMessages().key(Messages.GUI_SHELL_LOCALES_AVAILABLE_0));
Locale[] locales = Locale.getAvailableLocales();
for (int i = locales.length - 1; i >= 0; i--) {
m_shell.getOut().println(" \"" + locales[i].toString() + "\"");
}
}
/**
* Provides help information for the CmsShell.
*/
public void help() {
m_shell.getOut().println();
m_shell.getOut().println(getMessages().key(Messages.GUI_SHELL_HELP1_0));
m_shell.getOut().println(getMessages().key(Messages.GUI_SHELL_HELP2_0));
m_shell.getOut().println(getMessages().key(Messages.GUI_SHELL_HELP3_0));
m_shell.getOut().println(getMessages().key(Messages.GUI_SHELL_HELP4_0));
m_shell.getOut().println();
}
/**
* Executes the given help command.
*
* @param command the help command to execute
*/
public void help(String command) {
if ("*".equalsIgnoreCase(command)) {
m_shell.help(null);
} else if ("help".equalsIgnoreCase(command)) {
help();
} else {
m_shell.help(command);
}
}
/**
* Imports a module.
*
* @param importFile the absolute path of the import module file
*
* @throws Exception if something goes wrong
*
* @see org.opencms.importexport.CmsImportExportManager#importData(CmsObject, I_CmsReport, CmsImportParameters)
*/
public void importModule(String importFile) throws Exception {
CmsImportParameters params = new CmsImportParameters(importFile, "/", true);
OpenCms.getImportExportManager().importData(
m_cms,
new CmsShellReport(m_cms.getRequestContext().getLocale()),
params);
}
/**
* Imports a module (zipfile) from the default module directory,
* creating a temporary project for this.
*
* @param importFile the name of the import module located in the default module directory
*
* @throws Exception if something goes wrong
*
* @see org.opencms.importexport.CmsImportExportManager#importData(CmsObject, I_CmsReport, CmsImportParameters)
*/
public void importModuleFromDefault(String importFile) throws Exception {
String exportPath = OpenCms.getSystemInfo().getPackagesRfsPath();
String fileName = OpenCms.getSystemInfo().getAbsoluteRfsPathRelativeToWebInf(
exportPath + CmsSystemInfo.FOLDER_MODULES + importFile);
CmsImportParameters params = new CmsImportParameters(fileName, "/", true);
OpenCms.getImportExportManager().importData(
m_cms,
new CmsShellReport(m_cms.getRequestContext().getLocale()),
params);
}
/**
* Exists so that the setup script can run without the wizard, does nothing.
*/
public void importModulesFromSetupBean() {
// noop, exists so that the setup script can run without the wizard
}
/**
* Imports a resource into the Cms.
*
* @param importFile the name (absolute Path) of the import resource (zip or folder)
* @param importPath the name (absolute Path) of folder in which should be imported
*
* @throws Exception if something goes wrong
*/
public void importResources(String importFile, String importPath) throws Exception {
CmsImportParameters params = new CmsImportParameters(
OpenCms.getSystemInfo().getAbsoluteRfsPathRelativeToWebInf(importFile),
importPath,
true);
OpenCms.getImportExportManager().importData(
m_cms,
new CmsShellReport(m_cms.getRequestContext().getLocale()),
params);
}
/**
* Imports a resource into the Cms.
*
* @param importFile the name (absolute Path) of the import resource (zip or folder)
* @param importPath the name (absolute Path) of folder in which should be imported
* @param keepPermissions if set, the permissions set on existing resources will not be modified
*
* @throws Exception if something goes wrong
*/
public void importResources(String importFile, String importPath, boolean keepPermissions) throws Exception {
CmsImportParameters params = new CmsImportParameters(
OpenCms.getSystemInfo().getAbsoluteRfsPathRelativeToWebInf(importFile),
importPath,
keepPermissions);
OpenCms.getImportExportManager().importData(
m_cms,
new CmsShellReport(m_cms.getRequestContext().getLocale()),
params);
}
/**
* Imports a folder or a ZIP file to the root folder of the
* current site, creating a temporary project for this.
*
* @param importFile the absolute path of the import resource
* @throws Exception if something goes wrong
*/
public void importResourcesWithTempProject(String importFile) throws Exception {
CmsProject project = m_cms.createProject(
"SystemUpdate",
getMessages().key(Messages.GUI_SHELL_IMPORT_TEMP_PROJECT_NAME_0),
OpenCms.getDefaultUsers().getGroupAdministrators(),
OpenCms.getDefaultUsers().getGroupAdministrators(),
CmsProject.PROJECT_TYPE_TEMPORARY);
CmsUUID id = project.getUuid();
m_cms.getRequestContext().setCurrentProject(project);
m_cms.copyResourceToProject("/");
CmsImportParameters params = new CmsImportParameters(importFile, "/", true);
OpenCms.getImportExportManager().importData(
m_cms,
new CmsShellReport(m_cms.getRequestContext().getLocale()),
params);
m_cms.unlockProject(id);
OpenCms.getPublishManager().publishProject(m_cms);
OpenCms.getPublishManager().waitWhileRunning();
}
/**
* @see org.opencms.main.I_CmsShellCommands#initShellCmsObject(org.opencms.file.CmsObject, org.opencms.main.CmsShell)
*/
public void initShellCmsObject(CmsObject cms, CmsShell shell) {
m_cms = cms;
m_shell = shell;
}
/**
* Displays a list of all currently installed modules.
*
* @throws Exception if something goes wrong
*/
public void listModules() throws Exception {
Set modules = OpenCms.getModuleManager().getModuleNames();
m_shell.getOut().println(
"\n" + getMessages().key(Messages.GUI_SHELL_LIST_MODULES_1, new Integer(modules.size())));
Iterator i = modules.iterator();
while (i.hasNext()) {
String moduleName = i.next();
m_shell.getOut().println(moduleName);
}
m_shell.getOut().println();
}
/**
* Log a user in to the the CmsSell.
*
* @param username the name of the user to log in
* @param password the password of the user
*/
public void login(String username, String password) {
username = OpenCms.getImportExportManager().translateUser(username);
try {
m_cms.loginUser(username, password);
// reset the settings, this will switch the startup site root etc.
m_shell.initSettings();
m_shell.getOut().println(getMessages().key(Messages.GUI_SHELL_LOGIN_1, whoami().getName()));
// output the login message if required
CmsLoginMessage message = OpenCms.getLoginManager().getLoginMessage();
if ((message != null) && (message.isActive())) {
m_shell.getOut().println(message.getMessage());
}
} catch (Exception exc) {
m_shell.getOut().println(getMessages().key(Messages.GUI_SHELL_LOGIN_FAILED_0));
}
}
/**
* Displays a list of all resources in the current folder.
*
* @throws Exception if something goes wrong
* @see CmsObject#getResourcesInFolder(String, CmsResourceFilter)
*/
public void ls() throws Exception {
String folder = CmsResource.getFolderPath(m_cms.getRequestContext().getUri());
List resources = m_cms.getResourcesInFolder(folder, CmsResourceFilter.IGNORE_EXPIRATION);
m_shell.getOut().println(
"\n" + getMessages().key(Messages.GUI_SHELL_LS_2, folder, new Integer(resources.size())));
Iterator i = resources.iterator();
while (i.hasNext()) {
CmsResource r = i.next();
m_shell.getOut().println(m_cms.getSitePath(r));
}
m_shell.getOut().println();
}
/**
* Lists the access control entries of a given resource.
*
* @param resourceName the name of the resource
* @throws Exception if something goes wrong
*/
public void lsacc(String resourceName) throws Exception {
List acList = m_cms.getAccessControlEntries(resourceName);
for (int i = 0; i < acList.size(); i++) {
CmsAccessControlEntry ace = acList.get(i);
I_CmsPrincipal acePrincipal = m_cms.lookupPrincipal(ace.getPrincipal());
String pName = (acePrincipal != null) ? acePrincipal.getName() : ace.getPrincipal().toString();
m_shell.getOut().println(pName + ": " + ace.getPermissions().getPermissionString() + " " + ace);
}
}
/**
* Lists the access control entries belonging to the given principal.
*
* @param resourceName the name of the resource
* @param principalName the name of the principal
* @throws Exception if something goes wrong
*/
public void lsacc(String resourceName, String principalName) throws Exception {
I_CmsPrincipal principal = m_cms.lookupPrincipal(principalName);
List acList = m_cms.getAccessControlEntries(resourceName);
for (int i = 0; i < acList.size(); i++) {
CmsAccessControlEntry ace = acList.get(i);
I_CmsPrincipal acePrincipal = m_cms.lookupPrincipal(ace.getPrincipal());
if (principal.equals(acePrincipal)) {
String pName = (acePrincipal != null) ? acePrincipal.getName() : ace.getPrincipal().toString();
m_shell.getOut().println(pName + ": " + ace.getPermissions().getPermissionString() + " " + ace);
}
}
}
/**
* Does performance measurements of the OpenCms core.
*
* @throws Exception if something goes wrong
*/
public void perf() throws Exception {
int maxTests = 50000;
String storedSiteRoot = m_cms.getRequestContext().getSiteRoot();
try {
m_cms.getRequestContext().setSiteRoot("/");
Random random = new Random();
// create a resource filter to get the resources with
List testResources = m_cms.readResources("/", CmsResourceFilter.ALL);
int resourceCount = testResources.size();
m_shell.getOut().println("#Resources:\t" + resourceCount);
long start, time;
long totalTime = 0;
long minTime = Long.MAX_VALUE;
long maxTime = Long.MIN_VALUE;
m_shell.getOut().print("readFileHeader:\t");
for (int i = maxTests; i > 0; --i) {
int index = random.nextInt(resourceCount);
CmsResource resource = testResources.get(index);
start = System.currentTimeMillis();
m_cms.readResource(m_cms.getSitePath(resource), CmsResourceFilter.ALL);
time = System.currentTimeMillis() - start;
totalTime += time;
if (time < minTime) {
minTime = time;
}
if (time > maxTime) {
maxTime = time;
}
if ((i % 100) == 0) {
m_shell.getOut().print('.');
}
}
m_shell.getOut().println(
"\nreadFileHeader:\t" + minTime + "\t" + maxTime + "\t" + (((float)totalTime) / maxTests) + " ms");
} finally {
m_cms.getRequestContext().setSiteRoot(storedSiteRoot);
}
}
/**
* Sets the current shell prompt.
*
* @param prompt the prompt to set
* @see CmsShell#setPrompt(String)
*/
public void prompt(String prompt) {
m_shell.setPrompt(prompt);
}
/**
* Publishes the current project and waits until it finishes.
*
* @throws Exception if something goes wrong
*/
public void publishProjectAndWait() throws Exception {
OpenCms.getPublishManager().publishProject(m_cms);
OpenCms.getPublishManager().waitWhileRunning();
}
/**
* Purges the jsp repository.
*
* @throws Exception if something goes wrong
*
* @see org.opencms.flex.CmsFlexCache#cmsEvent(org.opencms.main.CmsEvent)
*/
public void purgeJspRepository() throws Exception {
OpenCms.fireCmsEvent(
new CmsEvent(I_CmsEventListener.EVENT_FLEX_PURGE_JSP_REPOSITORY, new HashMap()));
}
/**
* Returns the current folder set as URI in the request context.
*
* @return the current folder
* @throws Exception if something goes wrong
* @see org.opencms.file.CmsRequestContext#getUri()
* @see CmsResource#getFolderPath(String)
*/
public String pwd() throws Exception {
return CmsResource.getFolderPath(m_cms.getRequestContext().getUri());
}
/**
* Exits the shell.
*
* @see #exit()
*/
public void quit() {
exit();
}
/**
* Returns the selected files contentsls as a String.
*
* @param filename the file to read the contents from
* @throws CmsException if something goes wrong
* @return the selected files contents
*/
public String readFileContent(String filename) throws CmsException {
filename = CmsLinkManager.getAbsoluteUri(
filename,
CmsResource.getFolderPath(m_cms.getRequestContext().getUri()));
CmsFile file = m_cms.readFile(filename, CmsResourceFilter.IGNORE_EXPIRATION);
return new String(file.getContents());
}
/**
* Returns the users group of a project.
*
* @param project the id of the project to return the users group for
* @return the users group of the project
* @throws Exception if something goes wrong
*/
public CmsGroup readGroupOfProject(CmsUUID project) throws Exception {
return m_cms.readGroup(m_cms.readProject(project));
}
/**
* Returns the manager group of a project.
*
* @param project the id of the project to return the manager group for
* @return the manager group of the project
* @throws Exception if something goes wrong
*/
public CmsGroup readManagerGroup(CmsUUID project) throws Exception {
return m_cms.readManagerGroup(m_cms.readProject(project));
}
/**
* Returns the owner of a project.
*
* @param project the id of the project
* @return the owner of the project
* @throws Exception if something goes wrong
*/
public CmsUser readOwnerOfProject(CmsUUID project) throws Exception {
return m_cms.readOwner(m_cms.readProject(project));
}
/**
* Rebuilds (if required creates) all configured search indexes.
*
* @throws Exception if something goes wrong
*
* @see org.opencms.search.CmsSearchManager#rebuildAllIndexes(org.opencms.report.I_CmsReport)
*/
public void rebuildAllIndexes() throws Exception {
I_CmsReport report = new CmsShellReport(m_cms.getRequestContext().getLocale());
OpenCms.getSearchManager().rebuildAllIndexes(report);
}
/**
* Rebuilds (if required creates) the given search index.
*
* @param index name of the index to update
* @throws Exception if something goes wrong
* @see org.opencms.search.CmsSearchManager#rebuildIndex(String, org.opencms.report.I_CmsReport)
*/
public void rebuildIndex(String index) throws Exception {
OpenCms.getSearchManager().rebuildIndex(index, new CmsShellReport(m_cms.getRequestContext().getLocale()));
}
/**
* Replaces a module with another revision.
*
* @param moduleName the name of the module
* @param importFile the name of the import file
*
* @throws Exception if something goes wrong
*/
public void replaceModule(String moduleName, String importFile) throws Exception {
if (OpenCms.getModuleManager().getModule(moduleName) != null) {
OpenCms.getModuleManager().deleteModule(
m_cms,
moduleName,
true,
new CmsShellReport(m_cms.getRequestContext().getLocale()));
}
importModule(importFile);
}
/**
* Replaces a module with another revision.
*
* @param moduleName the name of the module
* @param importFile the name of the import file
* @throws Exception if something goes wrong
*/
public void replaceModuleFromDefault(String moduleName, String importFile) throws Exception {
if (OpenCms.getModuleManager().getModule(moduleName) != null) {
OpenCms.getModuleManager().deleteModule(
m_cms,
moduleName,
true,
new CmsShellReport(m_cms.getRequestContext().getLocale()));
}
importModuleFromDefault(importFile);
}
/**
* Sets the current project to the provided project id.
*
* @param id the project id to set
* @return the project set
* @throws Exception if something goes wrong
*/
public CmsProject setCurrentProject(CmsUUID id) throws Exception {
return m_cms.getRequestContext().setCurrentProject(m_cms.readProject(id));
}
/**
* Sets the current project to the provided project name.
*
* @param name the project name to set
* @return the project set
* @throws Exception if something goes wrong
*/
public CmsProject setCurrentProject(String name) throws Exception {
return m_cms.getRequestContext().setCurrentProject(m_cms.readProject(name));
}
/**
* Sets the rebuild mode for the requested index. Allowing to disable indexing during module import.
* This setting will not be written to the XML configuration file and will only take effect within the current shell instance.
*
* @param searchIndex the search index
* @param mode the rebuild mode to set
*/
public void setIndexRebuildMode(String searchIndex, String mode) {
CmsSearchIndex index = OpenCms.getSearchManager().getIndex(searchIndex);
if (index != null) {
index.setRebuildMode(mode);
// required for this setting to take effect
OpenCms.getSearchManager().initOfflineIndexes();
}
}
/**
* Set the locale of the current user logged in.
*
* This method will always set a valid Locale for the current user!
* If the provided locale name is not valid (i.e. leads to an Exception
* when trying to create the Locale, then the configured default Locale is set.
*
* The full name must consist of language code,
* country code(optional), variant(optional) separated by "_".
*
* @see Locale#getLanguage()
* @see Locale#getCountry()
* @see Locale#getVariant()
* @param localeName the full locale name
*
* @throws CmsException if something goes wrong
*
*/
public void setLocale(String localeName) throws CmsException {
Locale locale = CmsLocaleManager.getLocale(localeName);
m_shell.getOut().println(
getMessages().key(
Messages.GUI_SHELL_SETLOCALE_2,
locale,
m_cms.getRequestContext().getCurrentUser().getName()));
m_shell.setLocale(locale);
m_shell.getOut().println(getMessages().key(Messages.GUI_SHELL_SETLOCALE_POST_1, locale));
}
/**
* @see org.opencms.main.I_CmsShellCommands#shellExit()
*/
public void shellExit() {
m_shell.getOut().println();
m_shell.getOut().println(getMessages().key(Messages.GUI_SHELL_GOODBYE_0));
}
/**
* @see org.opencms.main.I_CmsShellCommands#shellStart()
*/
public void shellStart() {
m_shell.getOut().println();
m_shell.getOut().println(getMessages().key(Messages.GUI_SHELL_WELCOME_0));
m_shell.getOut().println();
// print the version information
version();
// print the copyright message
copyright();
if (m_shell.isInteractive()) {
// print the help information for interactive terminals
help();
}
}
/**
* Unlocks the current project, required before publishing.
* @throws Exception if something goes wrong
*/
public void unlockCurrentProject() throws Exception {
m_cms.unlockProject(m_cms.getRequestContext().getCurrentProject().getUuid());
}
/**
* Loads a file from the "real" file system to the VFS.
*
* @param localfile the file upload
* @param folder the folder in the VFS to place the file into
* @param filename the name of the uploaded file in the VFS
* @param type the type of the new file in the VFS
* @return the createed file
* @throws Exception if something goes wrong
* @throws CmsIllegalArgumentException if the concatenation of String arguments
* folder
and localfile
is of length 0
*
*/
public CmsResource uploadFile(String localfile, String folder, String filename, String type)
throws Exception, CmsIllegalArgumentException {
I_CmsResourceType t = OpenCms.getResourceManager().getResourceType(type);
return m_cms.createResource(folder + filename, t, CmsFileUtil.readFile(new File(localfile)), null);
}
/**
* Returns the current users name.
*
* @return the current users name
*/
public String userName() {
return m_cms.getRequestContext().getCurrentUser().getName();
}
/**
* Returns the version information for this OpenCms instance.
*/
public void version() {
m_shell.getOut().println();
m_shell.getOut().println(
getMessages().key(Messages.GUI_SHELL_VERSION_1, OpenCms.getSystemInfo().getVersionNumber()));
}
/**
* Returns the current user.
*
* @return the current user
*/
public CmsUser whoami() {
return m_cms.getRequestContext().getCurrentUser();
}
/**
* Writes the given property to the resource as structure value.
*
* @param resourceName the resource to write the value to
* @param propertyName the property to write the value to
* @param value the value to write
*
* @throws CmsException if something goes wrong
*/
public void writeProperty(String resourceName, String propertyName, String value) throws CmsException {
m_cms.lockResource(resourceName);
m_cms.writePropertyObject(resourceName, new CmsProperty(propertyName, value, null));
}
/**
* Returns the localized messages object for the current user.
*
* @return the localized messages object for the current user
*/
protected CmsMessages getMessages() {
return m_shell.getMessages();
}
/**
* Checks whether the given user already exists.
*
* @param name the user name
*
* @return true
if the given user already exists
*/
private boolean existsUser(String name) {
CmsUser user = null;
try {
user = m_cms.readUser(name);
} catch (@SuppressWarnings("unused") CmsException e) {
// this will happen, if the user does not exist
}
return user != null;
}
}