org.opencms.workplace.explorer.CmsResourceUtil 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 & 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 GmbH & Co. KG, 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.workplace.explorer;
import org.opencms.db.CmsDbEntryNotFoundException;
import org.opencms.db.CmsResourceState;
import org.opencms.file.CmsObject;
import org.opencms.file.CmsProject;
import org.opencms.file.CmsPropertyDefinition;
import org.opencms.file.CmsRequestContext;
import org.opencms.file.CmsResource;
import org.opencms.file.CmsResourceFilter;
import org.opencms.file.history.I_CmsHistoryResource;
import org.opencms.file.types.CmsResourceTypePlain;
import org.opencms.file.types.CmsResourceTypeXmlContainerPage;
import org.opencms.file.types.I_CmsResourceType;
import org.opencms.gwt.CmsIconUtil;
import org.opencms.i18n.CmsMessages;
import org.opencms.jsp.CmsJspNavBuilder;
import org.opencms.lock.CmsLock;
import org.opencms.main.CmsException;
import org.opencms.main.CmsLog;
import org.opencms.main.OpenCms;
import org.opencms.search.galleries.CmsGallerySearch;
import org.opencms.search.galleries.CmsGallerySearchResult;
import org.opencms.security.CmsOrganizationalUnit;
import org.opencms.security.CmsPermissionSet;
import org.opencms.security.CmsPermissionSetCustom;
import org.opencms.security.CmsPrincipal;
import org.opencms.util.A_CmsModeIntEnumeration;
import org.opencms.util.CmsStringUtil;
import org.opencms.util.CmsUUID;
import org.opencms.workplace.CmsWorkplace;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import org.apache.commons.logging.Log;
import com.google.common.collect.Maps;
/**
* Provides {@link CmsResource} utility functions.
*
* This class provides in java all resource information used by the explorer view,
* mostly generated in javascript (see explorer.js)
*
* @since 6.0.0
*/
public final class CmsResourceUtil {
/**
* Enumeration class for defining the resource project state.
*/
public static class CmsResourceProjectState extends A_CmsModeIntEnumeration {
/** Constant for the project state unlocked. */
protected static final CmsResourceProjectState CLEAN = new CmsResourceProjectState(0);
/** Constant for the project state locked for publishing. */
protected static final CmsResourceProjectState LOCKED_FOR_PUBLISHING = new CmsResourceProjectState(5);
/** Constant for the project state locked in current project. */
protected static final CmsResourceProjectState MODIFIED_IN_CURRENT_PROJECT = new CmsResourceProjectState(1);
/** Constant for the project state locked in other project. */
protected static final CmsResourceProjectState MODIFIED_IN_OTHER_PROJECT = new CmsResourceProjectState(2);
/** serial version UID. */
private static final long serialVersionUID = 4580450220255428716L;
/**
* Default constructor.
*
* @param mode the mode descriptor
*/
protected CmsResourceProjectState(int mode) {
super(mode);
}
/**
* Checks if this is a {@link #LOCKED_FOR_PUBLISHING} state.
*
* @return true
if this is a {@link #LOCKED_FOR_PUBLISHING} state
*/
public boolean isLockedForPublishing() {
return (this == LOCKED_FOR_PUBLISHING);
}
/**
* Checks if this is a {@link #MODIFIED_IN_CURRENT_PROJECT} state.
*
* @return true
if this is a {@link #MODIFIED_IN_CURRENT_PROJECT} state
*/
public boolean isModifiedInCurrentProject() {
return (this == MODIFIED_IN_CURRENT_PROJECT);
}
/**
* Checks if this is a {@link #MODIFIED_IN_OTHER_PROJECT} state.
*
* @return true
if this is a {@link #MODIFIED_IN_OTHER_PROJECT} state
*/
public boolean isModifiedInOtherProject() {
return (this == MODIFIED_IN_OTHER_PROJECT);
}
/**
* Checks if this is a {@link #CLEAN} state.
*
* @return true
if this is a {@link #CLEAN} state
*/
public boolean isUnlocked() {
return (this == CLEAN);
}
}
/**
* Enumeration class for defining the site modes.
*/
private static class CmsResourceUtilSiteMode {
/**
* Default constructor.
*/
protected CmsResourceUtilSiteMode() {
// noop
}
}
/** Layout style for resources after expire date. */
public static final int LAYOUTSTYLE_AFTEREXPIRE = 2;
/** Layout style for resources before release date. */
public static final int LAYOUTSTYLE_BEFORERELEASE = 1;
/** Layout style for resources after release date and before expire date. */
public static final int LAYOUTSTYLE_INRANGE = 0;
/** Constant that signalizes that all path operations will be based on the current site. */
public static final CmsResourceUtilSiteMode SITE_MODE_CURRENT = new CmsResourceUtilSiteMode();
/** Constant that signalizes that all path operations will be based on the best matching site. */
public static final CmsResourceUtilSiteMode SITE_MODE_MATCHING = new CmsResourceUtilSiteMode();
/** Constant that signalizes that all path operations will be based on the root path. */
public static final CmsResourceUtilSiteMode SITE_MODE_ROOT = new CmsResourceUtilSiteMode();
/** Constant for the project state locked for publishing. */
public static final CmsResourceProjectState STATE_LOCKED_FOR_PUBLISHING = CmsResourceProjectState.LOCKED_FOR_PUBLISHING;
/** Constant for the project state locked in current project. */
public static final CmsResourceProjectState STATE_MODIFIED_IN_CURRENT_PROJECT = CmsResourceProjectState.MODIFIED_IN_CURRENT_PROJECT;
/** Constant for the project state locked in other project. */
public static final CmsResourceProjectState STATE_MODIFIED_IN_OTHER_PROJECT = CmsResourceProjectState.MODIFIED_IN_OTHER_PROJECT;
/** The log object for this class. */
private static final Log LOG = CmsLog.getLog(CmsResourceUtil.class);
/** The folder size display string constant. */
private static final String SIZE_DIR = "-";
/** Constant for the project state unlocked. */
private static final CmsResourceProjectState STATE_CLEAN = CmsResourceProjectState.CLEAN;
/** If greater than zero, the path will be formatted to this number of chars. */
private int m_abbrevLength;
/** The current cms context. */
private CmsObject m_cms;
/** The current resource lock. */
private CmsLock m_lock;
/** The message bundle for formatting dates, depends on the request locale. */
private CmsMessages m_messages;
/** Reference project resources cache. */
private List m_projectResources;
/** The project to use to check project state, if null
the current project will be used. */
private CmsProject m_referenceProject;
/** The 'relative to' path. */
private String m_relativeTo;
/** The current request context. */
private CmsRequestContext m_request;
/** The current resource. */
private CmsResource m_resource;
/** The current resource type. */
private I_CmsResourceType m_resourceType;
/** The current site mode. */
private CmsResourceUtilSiteMode m_siteMode = SITE_MODE_CURRENT;
private Map m_searchResultMap = Maps.newHashMap();
/**
* Creates a new {@link CmsResourceUtil} object.
*
* @param cms the cms context
*/
public CmsResourceUtil(CmsObject cms) {
setCms(cms);
}
/**
* Creates a new {@link CmsResourceUtil} object.
*
* @param cms the cms context
* @param resource the resource
*/
public CmsResourceUtil(CmsObject cms, CmsResource resource) {
setCms(cms);
setResource(resource);
}
/**
* Creates a new {@link CmsResourceUtil} object.
*
* @param resource the resource
*/
public CmsResourceUtil(CmsResource resource) {
setResource(resource);
}
/**
* Returns the path abbreviation length.
*
* If greater than zero, the path will be formatted to this number of chars.
*
* This only affects the generation of the path for the current resource.
*
* @return the path abbreviation Length
*/
public int getAbbrevLength() {
return m_abbrevLength;
}
/**
* Gets the full path for the big icon.
*
* @return the full path for the big icon
*/
public String getBigIconPath() {
if ((m_cms != null) && CmsJspNavBuilder.isNavLevelFolder(m_cms, m_resource)) {
return CmsWorkplace.getResourceUri(CmsWorkplace.RES_PATH_FILETYPES + CmsIconUtil.ICON_NAV_LEVEL_BIG);
}
if ((m_cms != null) && CmsResourceTypeXmlContainerPage.isModelReuseGroup(m_cms, m_resource)) {
return CmsWorkplace.getResourceUri(
CmsWorkplace.RES_PATH_FILETYPES + CmsIconUtil.ICON_MODEL_GROUP_REUSE_BIG);
}
I_CmsResourceType type = getResourceType();
CmsExplorerTypeSettings explorerType = OpenCms.getWorkplaceManager().getExplorerTypeSetting(type.getTypeName());
String typeIcon = "";
if (explorerType != null) {
typeIcon = CmsWorkplace.getResourceUri(
CmsWorkplace.RES_PATH_FILETYPES + explorerType.getBigIconIfAvailable());
}
return typeIcon;
}
/**
* Returns the cms context.
*
* @return the cms context
*/
public CmsObject getCms() {
return m_cms;
}
/**
* Returns the formatted date of expiration.
*
* @return the formatted date of expiration
*/
public String getDateExpired() {
long release = m_resource.getDateExpired();
if (release != CmsResource.DATE_EXPIRED_DEFAULT) {
return getMessages().getDateTime(release);
} else {
return CmsWorkplace.DEFAULT_DATE_STRING;
}
}
/**
* Returns the formatted date of release.
*
* @return the formatted date of release
*/
public String getDateReleased() {
long release = m_resource.getDateReleased();
if (release != CmsResource.DATE_RELEASED_DEFAULT) {
return getMessages().getDateTime(release);
} else {
return CmsWorkplace.DEFAULT_DATE_STRING;
}
}
/**
* Returns the path of the current resource, taking into account just the site mode.
*
* @return the full path
*/
public String getFullPath() {
String path = m_resource.getRootPath();
if ((m_siteMode != SITE_MODE_ROOT) && (m_cms != null)) {
String site = getSite();
if (path.startsWith(site)) {
path = path.substring(site.length());
}
}
return path;
}
public String getGalleryDescription(Locale locale) {
return getSearchResult(locale).getDescription();
}
public String getGalleryTitle(Locale locale) {
return getSearchResult(locale).getTitle();
}
/**
* Returns the resource icon path displayed in the explorer view for the given resource.
*
* Relative to /system/workplace/resources/
.
*
* If the resource has no sibling it is the same as {@link #getIconPathResourceType()}.
*
* @return the resource icon path displayed in the explorer view for the given resource
*
* @see #getStyleSiblings()
*/
public String getIconPathExplorer() {
if (m_resource.getSiblingCount() > 1) {
// links are present
if (m_resource.isLabeled()) {
// there is at least one link in a marked site
return "explorer/link_labeled.gif";
} else {
// common links are present
return "explorer/link.gif";
}
} else {
return getIconPathResourceType();
}
}
/**
* Returns the lock icon path for the given resource.
*
* Relative to /system/workplace/resources/
.
*
* Returns explorer/project_none.gif
if request context is null
.
*
* @return the lock icon path for the given resource
*/
public String getIconPathLock() {
CmsLock lock = getLock();
String iconPath = null;
if (!lock.isUnlocked() && (m_request != null) && isInsideProject()) {
if (getLock().isOwnedBy(m_request.getCurrentUser())
&& (getLockedInProjectId().equals(getReferenceProject().getUuid()))) {
if (lock.isShared()) {
iconPath = "shared";
} else {
iconPath = "user";
}
} else {
iconPath = "other";
}
}
if (iconPath == null) {
iconPath = "project_none";
} else {
iconPath = "lock_" + iconPath;
}
return "explorer/" + iconPath + ".gif";
}
/**
* Returns the project state icon path for the given resource.
*
* Relative to /system/workplace/resources/
.
*
* @return the project state icon path for the given resource
*/
public String getIconPathProjectState() {
String iconPath;
if (getProjectState() == STATE_MODIFIED_IN_CURRENT_PROJECT) {
iconPath = "this.png";
} else if (getProjectState() == STATE_MODIFIED_IN_OTHER_PROJECT) {
iconPath = "other.png";
} else if (getProjectState() == STATE_LOCKED_FOR_PUBLISHING) {
iconPath = "publish.png";
} else {
// STATE_UNLOCKED
iconPath = "none.gif";
}
return "explorer/project_" + iconPath;
}
/**
* Returns the resource type icon path for the given resource.
*
* Relative to /system/workplace/resources/
.
*
* @return the resource type icon path for the given resource
*/
public String getIconPathResourceType() {
if ((m_cms != null) && CmsJspNavBuilder.isNavLevelFolder(m_cms, m_resource)) {
return CmsWorkplace.getResourceUri(CmsWorkplace.RES_PATH_FILETYPES + CmsIconUtil.ICON_NAV_LEVEL_SMALL);
}
if ((m_cms != null) && CmsResourceTypeXmlContainerPage.isModelReuseGroup(m_cms, m_resource)) {
return CmsWorkplace.getResourceUri(
CmsWorkplace.RES_PATH_FILETYPES + CmsIconUtil.ICON_MODEL_GROUP_REUSE_SMALL);
}
if (!isEditable()) {
return CmsWorkplace.RES_PATH_FILETYPES
+ OpenCms.getWorkplaceManager().getExplorerTypeSetting(
CmsResourceTypePlain.getStaticTypeName()).getIcon();
}
return CmsWorkplace.RES_PATH_FILETYPES
+ OpenCms.getWorkplaceManager().getExplorerTypeSetting(getResourceTypeName()).getIcon();
}
/**
* Returns an integer representation for the link type.
*
*
* 0
: No sibling
* 1
: Sibling
* 2
: Labeled sibling
*
*
* @return an integer representation for the link type
*/
public int getLinkType() {
if (m_resource.getSiblingCount() > 1) {
// links are present
if (m_resource.isLabeled()) {
// there is at least one link in a marked site
return 2;
} else {
// common links are present
return 1;
}
} else {
// no links to the resource are in the VFS
return 0;
}
}
/**
* Returns the the lock for the given resource.
*
* @return the lock the given resource
*/
public CmsLock getLock() {
if (m_lock == null) {
try {
m_lock = getCms().getLock(m_resource);
} catch (Throwable e) {
m_lock = CmsLock.getNullLock();
LOG.error(e.getLocalizedMessage(), e);
}
}
return m_lock;
}
/**
* Returns the user name who owns the lock for the given resource.
*
* @return the user name who owns the lock for the given resource
*/
public String getLockedByName() {
String lockedBy = "";
if (!getLock().isNullLock()) {
// user
lockedBy = getLock().getUserId().toString();
try {
lockedBy = getCurrentOuRelativeName(
CmsPrincipal.readPrincipalIncludingHistory(getCms(), getLock().getUserId()).getName());
} catch (Throwable e) {
lockedBy = e.getMessage();
}
}
return lockedBy;
}
/**
* Returns the id of the project in which the given resource is locked.
*
* @return the id of the project in which the given resource is locked
*/
public CmsUUID getLockedInProjectId() {
CmsUUID lockedInProject = null;
if (getLock().isNullLock() && !getResource().getState().isUnchanged()) {
// resource is unlocked and modified
lockedInProject = getResource().getProjectLastModified();
} else if (!getResource().getState().isUnchanged()) {
// resource is locked and modified
lockedInProject = getProjectId();
} else if (!getLock().isNullLock()) {
// resource is locked and unchanged
lockedInProject = getLock().getProjectId();
}
return lockedInProject;
}
/**
* Returns the project name that locked the current resource's.
*
* @return the the project name that locked the current resource's
*/
public String getLockedInProjectName() {
try {
CmsUUID pId = getLockedInProjectId();
if ((pId == null) || pId.isNullUUID()) {
// the resource is unlocked and unchanged
return "";
}
try {
return getCurrentOuRelativeName(getCms().readProject(pId).getName());
} catch (CmsDbEntryNotFoundException e) {
return getCurrentOuRelativeName(getCms().readHistoryProject(pId).getName());
}
} catch (Throwable e) {
LOG.error(e.getLocalizedMessage(), e);
return "";
}
}
/**
* Returns the lock state of the current resource.
*
* @return the lock state of the current resource
*/
public int getLockState() {
if (CmsStringUtil.isEmptyOrWhitespaceOnly(getLockedByName())) {
// unlocked
return 0;
}
if (!getLockedByName().equals(getCurrentOuRelativeName(m_request.getCurrentUser().getName()))
|| !getLockedInProjectId().equals(m_request.getCurrentProject().getUuid())) {
// locked by other user and/or project
return 1;
}
if (getLock().getType().isShared()) {
// shared lock
return 2;
}
// exclusive lock
return 3;
}
/**
* Returns the navtext of a resource.
*
* @return the navtext for that resource
*/
public String getNavText() {
String navText = "";
try {
navText = getCms().readPropertyObject(
getCms().getSitePath(m_resource),
CmsPropertyDefinition.PROPERTY_NAVTEXT,
false).getValue();
} catch (Throwable e) {
String storedSiteRoot = getCms().getRequestContext().getSiteRoot();
try {
getCms().getRequestContext().setSiteRoot("");
navText = getCms().readPropertyObject(
m_resource.getRootPath(),
CmsPropertyDefinition.PROPERTY_NAVTEXT,
false).getValue();
} catch (Exception e1) {
// should usually never happen
if (LOG.isInfoEnabled()) {
LOG.info(e);
}
} finally {
getCms().getRequestContext().setSiteRoot(storedSiteRoot);
}
}
if (navText == null) {
navText = "";
}
return navText;
}
/**
* Checks is the current resource can be edited by the current user.
*
* @param locale the locale to use for the messages
*
* @return an empty string if editable, or a localized string with the reason
*
* @throws CmsException if something goes wrong
*/
public String getNoEditReason(Locale locale) throws CmsException {
return getNoEditReason(locale, false);
}
/**
* Checks is the current resource can be edited by the current user.
*
* @param locale the locale to use for the messages
* @param ignoreExpiration true
to ignore resource release and expiration date
*
* @return an empty string if editable, or a localized string with the reason
*
* @throws CmsException if something goes wrong
*/
public String getNoEditReason(Locale locale, boolean ignoreExpiration) throws CmsException {
String reason = "";
if (m_resource instanceof I_CmsHistoryResource) {
reason = Messages.get().getBundle(locale).key(Messages.GUI_NO_EDIT_REASON_HISTORY_0);
} else if (!m_cms.hasPermissions(
m_resource,
CmsPermissionSet.ACCESS_WRITE,
false,
ignoreExpiration ? CmsResourceFilter.IGNORE_EXPIRATION : CmsResourceFilter.DEFAULT) || !isEditable()) {
reason = Messages.get().getBundle(locale).key(Messages.GUI_NO_EDIT_REASON_PERMISSION_0);
} else if (!getLock().isLockableBy(m_cms.getRequestContext().getCurrentUser())) {
if (getLock().getSystemLock().isPublish()) {
reason = Messages.get().getBundle(locale).key(Messages.GUI_PUBLISH_TOOLTIP_0);
} else {
reason = Messages.get().getBundle(locale).key(Messages.GUI_NO_EDIT_REASON_LOCK_1, getLockedByName());
}
}
return reason;
}
/**
* Returns the path of the current resource.
*
* Taking into account following settings:
*
* - site mode
*
- abbreviation length
*
- relative to
*
*
* @return the path
*/
public String getPath() {
String path = getFullPath();
if (m_relativeTo != null) {
path = getResource().getRootPath();
if (path.startsWith(m_relativeTo)) {
path = path.substring(m_relativeTo.length());
if (path.length() == 0) {
path = ".";
}
} else {
String site = getSite();
if (path.startsWith(site + "/") || path.equals(site)) {
path = path.substring(site.length());
}
}
}
if (m_abbrevLength > 0) {
boolean absolute = path.startsWith("/");
path = CmsStringUtil.formatResourceName(path, m_abbrevLength);
if (!absolute && path.startsWith("/")) {
// remove leading '/'
path = path.substring(1);
}
}
return path;
}
/**
* Returns the permission set for the given resource.
*
* @return the permission set for the given resource
*/
public CmsPermissionSet getPermissionSet() {
CmsPermissionSetCustom pset = new CmsPermissionSetCustom();
CmsResource resource = getResource();
try {
if (getCms().hasPermissions(resource, CmsPermissionSet.ACCESS_CONTROL, false, CmsResourceFilter.ALL)) {
pset.grantPermissions(CmsPermissionSet.PERMISSION_CONTROL);
} else {
pset.denyPermissions(CmsPermissionSet.PERMISSION_CONTROL);
}
} catch (CmsException e) {
LOG.error(e.getLocalizedMessage());
}
try {
if (getCms().hasPermissions(
resource,
CmsPermissionSet.ACCESS_DIRECT_PUBLISH,
false,
CmsResourceFilter.ALL)) {
pset.grantPermissions(CmsPermissionSet.PERMISSION_DIRECT_PUBLISH);
} else {
pset.denyPermissions(CmsPermissionSet.PERMISSION_DIRECT_PUBLISH);
}
} catch (CmsException e) {
LOG.error(e.getLocalizedMessage());
}
try {
if (getCms().hasPermissions(resource, CmsPermissionSet.ACCESS_READ, false, CmsResourceFilter.ALL)) {
pset.grantPermissions(CmsPermissionSet.PERMISSION_READ);
} else {
pset.denyPermissions(CmsPermissionSet.PERMISSION_READ);
}
} catch (CmsException e) {
LOG.error(e.getLocalizedMessage());
}
try {
if (getCms().hasPermissions(resource, CmsPermissionSet.ACCESS_VIEW, false, CmsResourceFilter.ALL)) {
pset.grantPermissions(CmsPermissionSet.PERMISSION_VIEW);
} else {
pset.denyPermissions(CmsPermissionSet.PERMISSION_VIEW);
}
} catch (CmsException e) {
LOG.error(e.getLocalizedMessage());
}
try {
if (getCms().hasPermissions(resource, CmsPermissionSet.ACCESS_WRITE, false, CmsResourceFilter.ALL)) {
pset.grantPermissions(CmsPermissionSet.PERMISSION_WRITE);
} else {
pset.denyPermissions(CmsPermissionSet.PERMISSION_WRITE);
}
} catch (CmsException e) {
LOG.error(e.getLocalizedMessage());
}
return pset;
}
/**
* Returns the permissions string for the given resource.
*
* @return the permissions string for the given resource
*/
public String getPermissionString() {
return getPermissionSet().getPermissionString();
}
/**
* Returns the id of the project which the resource belongs to.
*
* @return the id of the project which the resource belongs to
*/
public CmsUUID getProjectId() {
CmsUUID projectId = m_resource.getProjectLastModified();
if (!getLock().isUnlocked() && !getLock().isInherited()) {
// use lock project ID only if lock is not inherited
projectId = getLock().getProjectId();
}
return projectId;
}
/**
* Returns the project state of the given resource.
*
*
* - null: unchanged.
* - true: locked in current project.
* - false: not locked in current project.
*
*
* @return the project state of the given resource
*/
public CmsResourceProjectState getProjectState() {
if (getResource().getState().isUnchanged()) {
return STATE_CLEAN; // STATE_CLEAN
} else if (getLock().getSystemLock().isPublish()) {
return STATE_LOCKED_FOR_PUBLISHING;
} else if (getResource().getProjectLastModified().equals(getReferenceProject().getUuid())) {
return STATE_MODIFIED_IN_CURRENT_PROJECT; // STATE_MODIFIED_CURRENT_PROJECT
} else {
return STATE_MODIFIED_IN_OTHER_PROJECT; // STATE_MODIFIED_OTHER_PROJECT
}
}
/**
* Returns the project to use to check project state.
*
* @return the project to use to check project state
*/
public CmsProject getReferenceProject() {
if (m_referenceProject == null) {
if (m_request != null) {
m_referenceProject = m_request.getCurrentProject();
}
}
return m_referenceProject;
}
/**
* Returns the 'relative to' path.
*
* This only affects the generation of the path for the current resource.
*
* @return the 'relative to' path
*/
public String getRelativeTo() {
return m_relativeTo;
}
/**
* Returns the resource.
*
* @return the resource
*/
public CmsResource getResource() {
return m_resource;
}
/**
* Returns the resource type for the given resource.
*
* @return the resource type for the given resource
*/
public I_CmsResourceType getResourceType() {
if (m_resourceType == null) {
m_resourceType = OpenCms.getResourceManager().getResourceType(m_resource);
}
return m_resourceType;
}
/**
* Returns the resource type id for the given resource.
*
* @return the resource type id for the given resource
*/
public int getResourceTypeId() {
return getResourceType().getTypeId();
}
/**
* Returns the resource type name for the given resource.
*
* @return the resource type name for the given resource
*/
public String getResourceTypeName() {
return getResourceType().getTypeName();
}
public CmsGallerySearchResult getSearchResult(Locale locale) {
if (!m_searchResultMap.containsKey(locale)) {
CmsGallerySearchResult sResult;
try {
sResult = CmsGallerySearch.searchById(m_cms, m_resource.getStructureId(), locale);
m_searchResultMap.put(locale, sResult);
} catch (CmsException e) {
LOG.error(e.getLocalizedMessage(), e);
}
}
return m_searchResultMap.get(locale);
}
/**
* Returns the site of the current resources,
* taking into account the set site mode.
*
* @return the site path
*/
public String getSite() {
String site = null;
if ((m_siteMode == SITE_MODE_MATCHING) || (m_cms == null)) {
site = OpenCms.getSiteManager().getSiteRoot(m_resource.getRootPath());
} else if (m_siteMode == SITE_MODE_CURRENT) {
site = m_cms.getRequestContext().getSiteRoot();
} else if (m_siteMode == SITE_MODE_ROOT) {
site = "";
}
return (site == null ? "" : site);
}
/**
* Returns the site mode.
*
* This only affects the generation of the path for the current resource.
*
* @return the site mode
*/
public CmsResourceUtilSiteMode getSiteMode() {
return m_siteMode;
}
/**
* Returns the title of the site.
*
* @return the title of the site
*/
public String getSiteTitle() {
String title = getSite();
String rootSite = getCms().getRequestContext().getSiteRoot();
try {
getCms().getRequestContext().setSiteRoot("");
title = getCms().readPropertyObject(title, CmsPropertyDefinition.PROPERTY_TITLE, false).getValue(title);
} catch (CmsException e) {
// ignore
} finally {
getCms().getRequestContext().setSiteRoot(rootSite);
}
return title;
}
/**
* Returns the size of the given resource as a String.
*
* For directories it returns SIZE_DIR
.
*
* @return the size of the given resource as a String
*/
public String getSizeString() {
return m_resource.getLength() == -1 ? SIZE_DIR : "" + m_resource.getLength();
}
/**
* Returns resource state abbreviation.
*
* @return resource state abbreviation
*/
public char getStateAbbreviation() {
return getResource().getState().getAbbreviation();
}
/**
* Returns the state name for a resource.
*
* Uses default locale if request context is null
.
*
* @return the state name for that resource
*/
public String getStateName() {
CmsResourceState state = m_resource.getState();
String name;
if (m_request == null) {
name = org.opencms.workplace.explorer.Messages.get().getBundle().key(
org.opencms.workplace.explorer.Messages.getStateKey(state));
} else {
name = org.opencms.workplace.explorer.Messages.get().getBundle(m_request.getLocale()).key(
org.opencms.workplace.explorer.Messages.getStateKey(state));
}
return name;
}
/**
* Returns the style class to use for the given resource.
*
* @return style class name
*
* @see org.opencms.workplace.list.CmsListExplorerColumn#getExplorerStyleDef()
*/
public String getStyleClassName() {
if (isInsideProject() && isEditable()) {
if (m_resource.getState().isChanged()) {
return "fc";
} else if (m_resource.getState().isNew()) {
return "fn";
} else if (m_resource.getState().isDeleted()) {
return "fd";
} else {
return "nf";
}
}
return "fp";
}
/**
* Returns additional style sheets for the resource type icon depending on siblings.
*
* That is, depending on {@link CmsResource#getSiblingCount()}
*
* Use it with the {@link #getIconPathExplorer} method.
*
* @return additional style sheets depending on siblings
*/
public String getStyleSiblings() {
StringBuffer style = new StringBuffer(128);
if (m_resource.getSiblingCount() > 1) {
style.append("background-image:url(");
style.append(CmsWorkplace.getSkinUri());
style.append(getIconPathResourceType());
style.append("); background-position: 0px 0px; background-repeat: no-repeat; ");
}
return style.toString();
}
/**
* Returns the system lock information tooltip for the explorer view.
*
* @param forExplorer if the tool tip should be generated for the explorer view
*
* @return the system lock information tooltip
*/
public String getSystemLockInfo(boolean forExplorer) {
if (getLock().getSystemLock().isPublish()) {
if (!forExplorer) {
return getMessages().key(Messages.GUI_PUBLISH_TOOLTIP_0);
} else {
// see explorer.js(sysLockInfo) and top_js.jsp(publishlock)
return "p"; // should have length == 1
}
}
return "";
}
/**
* Returns additional style sheets depending on publication constraints.
*
* That is, depending on {@link CmsResource#getDateReleased()} and
* {@link CmsResource#getDateExpired()}.
*
* @return additional style sheets depending on publication constraints
*
* @see #getTimeWindowLayoutType()
*/
public String getTimeWindowLayoutStyle() {
return getTimeWindowLayoutType() == CmsResourceUtil.LAYOUTSTYLE_INRANGE ? "" : "font-style:italic;";
}
/**
* Returns the layout style for the current time window state.
*
*
* {@link CmsResourceUtil#LAYOUTSTYLE_INRANGE}
: The time window is in range
* {@link CmsResourceUtil#LAYOUTSTYLE_BEFORERELEASE}
: The resource is not yet released
* {@link CmsResourceUtil#LAYOUTSTYLE_AFTEREXPIRE}
: The resource has already expired
*
*
* @return the layout style for the current time window state
*
* @see #getTimeWindowLayoutStyle()
*/
public int getTimeWindowLayoutType() {
int layoutstyle = CmsResourceUtil.LAYOUTSTYLE_INRANGE;
if (!m_resource.isReleased(getCms().getRequestContext().getRequestTime())) {
layoutstyle = CmsResourceUtil.LAYOUTSTYLE_BEFORERELEASE;
} else if (m_resource.isExpired(getCms().getRequestContext().getRequestTime())) {
layoutstyle = CmsResourceUtil.LAYOUTSTYLE_AFTEREXPIRE;
}
return layoutstyle;
}
/**
* Returns the title of a resource.
*
* @return the title for that resource
*/
public String getTitle() {
String title = "";
try {
title = getCms().readPropertyObject(
getCms().getSitePath(m_resource),
CmsPropertyDefinition.PROPERTY_TITLE,
false).getValue();
} catch (Throwable e) {
String storedSiteRoot = getCms().getRequestContext().getSiteRoot();
try {
getCms().getRequestContext().setSiteRoot("");
title = getCms().readPropertyObject(
m_resource.getRootPath(),
CmsPropertyDefinition.PROPERTY_TITLE,
false).getValue();
} catch (Exception e1) {
// should usually never happen
if (LOG.isInfoEnabled()) {
LOG.info(e);
}
} finally {
getCms().getRequestContext().setSiteRoot(storedSiteRoot);
}
}
if (title == null) {
title = "";
}
return title;
}
/**
* Returns the name of the user who created the given resource.
*
* @return the name of the user who created the given resource
*/
public String getUserCreated() {
String user = m_resource.getUserCreated().toString();
try {
user = getCurrentOuRelativeName(
CmsPrincipal.readPrincipalIncludingHistory(getCms(), m_resource.getUserCreated()).getName());
} catch (Throwable e) {
LOG.info(e.getLocalizedMessage());
}
return user;
}
/**
* Returns the name of the user who last modified the given resource.
*
* @return the name of the user who last modified the given resource
*/
public String getUserLastModified() {
String user = m_resource.getUserLastModified().toString();
try {
user = getCurrentOuRelativeName(
CmsPrincipal.readPrincipalIncludingHistory(getCms(), m_resource.getUserLastModified()).getName());
} catch (Throwable e) {
LOG.info(e.getLocalizedMessage());
}
return user;
}
/**
* Returns true
if the given resource is editable by the current user.
*
* Returns false
if no request context is set.
*
* @return true
if the given resource is editable by the current user
*/
public boolean isEditable() {
if (m_request == null) {
return false;
}
CmsExplorerTypeSettings settings = OpenCms.getWorkplaceManager().getExplorerTypeSetting(getResourceTypeName());
if (settings != null) {
String rightSite = OpenCms.getSiteManager().getSiteRoot(getResource().getRootPath());
if (rightSite == null) {
rightSite = "";
}
String currentSite = getCms().getRequestContext().getSiteRoot();
try {
getCms().getRequestContext().setSiteRoot(rightSite);
return settings.isEditable(getCms(), getResource());
} finally {
getCms().getRequestContext().setSiteRoot(currentSite);
}
}
return false;
}
/**
* Returns true
if the given resource is in the reference project.
*
* Returns false
if the request context is null
.
*
* @return true
if the given resource is in the reference project
*
* @see #getReferenceProject()
*/
public boolean isInsideProject() {
return CmsProject.isInsideProject(getProjectResources(), getResource());
}
/**
* Returns true
if the stored resource has been released and has not expired.
*
* If no request context is available, the current time is used for the validation check.
*
* @return true
if the stored resource has been released and has not expired
*
* @see CmsResource#isReleasedAndNotExpired(long)
*/
public boolean isReleasedAndNotExpired() {
long requestTime;
if (m_request == null) {
requestTime = System.currentTimeMillis();
} else {
requestTime = m_request.getRequestTime();
}
return m_resource.isReleasedAndNotExpired(requestTime);
}
/**
* Sets the path abbreviation length.
*
* If greater than zero, the path will be formatted to this number of chars.
*
* This only affects the generation of the path for the current resource.
*
* @param abbrevLength the path abbreviation length to set
*/
public void setAbbrevLength(int abbrevLength) {
m_abbrevLength = abbrevLength;
}
/**
* Sets the cms context.
*
* @param cms the cms context to set
*/
public void setCms(CmsObject cms) {
m_cms = cms;
m_request = cms.getRequestContext();
m_referenceProject = null;
m_projectResources = null;
m_messages = null;
}
/**
* Sets the project to use to check project state.
*
* @param project the project to set
*/
public void setReferenceProject(CmsProject project) {
m_referenceProject = project;
m_projectResources = null;
}
/**
* Sets the 'relative to' path.
*
* This only affects the generation of the path for the current resource.
*
* @param relativeTo the 'relative to' path to set
*/
public void setRelativeTo(String relativeTo) {
m_relativeTo = relativeTo;
if (CmsStringUtil.isEmptyOrWhitespaceOnly(m_relativeTo)) {
m_relativeTo = null;
} else {
if (!m_relativeTo.startsWith("/")) {
m_relativeTo = "/" + m_relativeTo;
}
if (!m_relativeTo.endsWith("/")) {
m_relativeTo += "/";
}
}
}
/**
* Sets the resource.
*
* @param resource the resource to set
*/
public void setResource(CmsResource resource) {
m_resource = resource;
m_lock = null;
m_resourceType = null;
}
/**
* Sets the site mode.
*
* This only affects the generation of the path for the current resource.
*
* @param siteMode the site mode to set
*/
public void setSiteMode(CmsResourceUtilSiteMode siteMode) {
m_siteMode = siteMode;
}
/**
* Returns the simple name if the ou is the same as the current user's ou.
*
* @param name the fully qualified name to check
*
* @return the simple name if the ou is the same as the current user's ou
*/
private String getCurrentOuRelativeName(String name) {
if (m_request == null) {
return CmsOrganizationalUnit.SEPARATOR + name;
}
String ou = CmsOrganizationalUnit.getParentFqn(name);
if (ou.equals(m_request.getCurrentUser().getOuFqn())) {
return CmsOrganizationalUnit.getSimpleName(name);
}
return CmsOrganizationalUnit.SEPARATOR + name;
}
/**
* Returns the message bundle for formatting dates, depends on the request locale.
*
* @return the message bundle for formatting dates
*/
private CmsMessages getMessages() {
if (m_messages == null) {
if (m_cms != null) {
m_messages = Messages.get().getBundle(OpenCms.getWorkplaceManager().getWorkplaceLocale(m_cms));
} else {
m_messages = Messages.get().getBundle();
}
}
return m_messages;
}
/**
* Returns the reference project resources.
*
* @return the reference project resources
*/
private List getProjectResources() {
if (m_projectResources == null) {
try {
m_projectResources = getCms().readProjectResources(getReferenceProject());
} catch (Throwable e) {
LOG.error(e.getLocalizedMessage(), e);
// use an empty list (all resources are "outside")
m_projectResources = new ArrayList();
}
}
return m_projectResources;
}
}