cmssitemanagerimpl.java
来自「找了很久才找到到源代码」· Java 代码 · 共 770 行 · 第 1/2 页
JAVA
770 行
/*
* File : $Source: /usr/local/cvs/opencms/src/org/opencms/site/CmsSiteManagerImpl.java,v $
* Date : $Date: 2007-09-11 14:14:02 $
* Version: $Revision: 1.2 $
*
* This library is part of OpenCms -
* the Open Source Content Management System
*
* Copyright (c) 2002 - 2007 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.site;
import org.opencms.configuration.CmsConfigurationException;
import org.opencms.file.CmsObject;
import org.opencms.file.CmsPropertyDefinition;
import org.opencms.file.CmsResource;
import org.opencms.main.CmsException;
import org.opencms.main.CmsLog;
import org.opencms.main.CmsRuntimeException;
import org.opencms.main.OpenCms;
import org.opencms.security.CmsPermissionSet;
import org.opencms.security.CmsRole;
import org.opencms.util.CmsStringUtil;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.logging.Log;
/**
* Manages all configured sites in OpenCms.<p>
*
* To obtain the configured site manager instance, use {@link OpenCms#getSiteManager()}.<p>
*
* @author Alexander Kandzior
*
* @version $Revision: 1.2 $
*
* @since 7.0.2
*/
public final class CmsSiteManagerImpl {
/** The static log object for this class. */
private static final Log LOG = CmsLog.getLog(CmsSiteManagerImpl.class);
/** The path to the "/sites/" folder. */
private static final String SITES_FOLDER = "/sites/";
/** The length of the "/sites/" folder plus 1. */
private static final int SITES_FOLDER_POS = SITES_FOLDER.length() + 1;
/** A list of additional site roots, that is site roots that are not belows the "/sites/" folder. */
private List m_additionalSiteRoots;
/**
* The list of aliases for the site that is configured at the moment,
* needed for the sites added during configuration. */
private List m_aliases;
/** The default site root. */
private CmsSite m_defaultSite;
/** The default URI. */
private String m_defaultUri;
/** Indicates if the configuration is finalized (frozen). */
private boolean m_frozen;
/** Maps site matchers to sites. */
private Map m_siteMatcherSites;
/** The set of all configured site root paths (as String). */
private Set m_siteRoots;
/** Maps site roots to sites. */
private Map m_siteRootSites;
/** The workplace server. */
private String m_workplaceServer;
/** The site matcher that matches the workplace site. */
private CmsSiteMatcher m_workplaceSiteMatcher;
/**
* Creates a new CmsSiteManager.<p>
*
*/
public CmsSiteManagerImpl() {
m_siteMatcherSites = new HashMap();
m_siteRootSites = new HashMap();
m_aliases = new ArrayList();
m_additionalSiteRoots = new ArrayList();
if (CmsLog.INIT.isInfoEnabled()) {
CmsLog.INIT.info(Messages.get().getBundle().key(Messages.INIT_START_SITE_CONFIG_0));
}
}
/**
* Adds an alias to the currently configured site.
*
* @param alias the URL of the alias server
*/
public void addAliasToConfigSite(String alias) {
CmsSiteMatcher siteMatcher = new CmsSiteMatcher(alias);
m_aliases.add(siteMatcher);
}
/**
* Adds a new CmsSite to the list of configured sites,
* this is only allowed during configuration.<p>
*
* If this method is called after the configuration is finished,
* a <code>RuntimeException</code> is thrown.<p>
*
* @param server the Server
* @param uri the VFS path
* @param secureServer a secure server, can be <code>null</code>
* @param exclusive if set to <code>true</code>, secure resources will only be available using the configured secure url
* @param error if exclusive, and set to <code>true</code> will generate a 404 error,
* if set to <code>false</code> will redirect to secure URL
*
* @throws CmsConfigurationException if the site contains a server name, that is already assigned
*/
public void addSite(String server, String uri, String secureServer, String exclusive, String error)
throws CmsConfigurationException {
if (m_frozen) {
throw new CmsRuntimeException(Messages.get().container(Messages.ERR_CONFIG_FROZEN_0));
}
CmsSiteMatcher matcher = new CmsSiteMatcher(server);
CmsSite site = new CmsSite(uri, matcher);
addServer(matcher, site);
if (CmsStringUtil.isNotEmpty(secureServer)) {
matcher = new CmsSiteMatcher(secureServer);
site.setSecureServer(matcher);
site.setExclusiveUrl(Boolean.valueOf(exclusive).booleanValue());
site.setExclusiveError(Boolean.valueOf(error).booleanValue());
addServer(matcher, site);
}
// note that Digester first calls the addAliasToConfigSite method.
// therefore, the aliases are already set
site.setAliases(m_aliases);
Iterator i = m_aliases.iterator();
while (i.hasNext()) {
matcher = (CmsSiteMatcher)i.next();
addServer(matcher, site);
}
m_aliases = new ArrayList();
m_siteRootSites.put(site.getSiteRoot(), site);
if (CmsLog.INIT.isInfoEnabled()) {
CmsLog.INIT.info(Messages.get().getBundle().key(Messages.INIT_SITE_ROOT_ADDED_1, site.toString()));
}
}
/**
* Returns a list of all sites available for the current user.<p>
*
* @param cms the current OpenCms user context
* @param workplaceMode if true, the root and current site is included for the admin user
* and the view permission is required to see the site root
*
* @return a list of all site available for the current user
*/
public List getAvailableSites(CmsObject cms, boolean workplaceMode) {
return getAvailableSites(cms, workplaceMode, cms.getRequestContext().getOuFqn());
}
/**
* Returns a list of all {@link CmsSite} instances that are compatible to the given organizational unit.<p>
*
* @param cms the current OpenCms user context
* @param workplaceMode if true, the root and current site is included for the admin user
* and the view permission is required to see the site root
* @param ouFqn the organizational unit
*
* @return a list of all site available for the current user
*/
public List getAvailableSites(CmsObject cms, boolean workplaceMode, String ouFqn) {
List siteroots = new ArrayList(m_siteMatcherSites.size() + 1);
Map siteServers = new HashMap(m_siteMatcherSites.size() + 1);
List result = new ArrayList(m_siteMatcherSites.size() + 1);
Iterator i;
// add site list
i = m_siteMatcherSites.keySet().iterator();
while (i.hasNext()) {
CmsSite site = (CmsSite)m_siteMatcherSites.get(i.next());
String folder = site.getSiteRoot() + "/";
if (!siteroots.contains(folder)) {
siteroots.add(folder);
siteServers.put(folder, site.getSiteMatcher());
}
}
// add default site
if (workplaceMode && (m_defaultSite != null)) {
String folder = m_defaultSite.getSiteRoot() + "/";
if (!siteroots.contains(folder)) {
siteroots.add(folder);
}
}
String storedSiteRoot = cms.getRequestContext().getSiteRoot();
try {
// for all operations here we need no context
cms.getRequestContext().setSiteRoot("/");
if (workplaceMode && OpenCms.getRoleManager().hasRole(cms, CmsRole.DEVELOPER)) {
if (!siteroots.contains("/")) {
siteroots.add("/");
}
if (!siteroots.contains(storedSiteRoot + "/")) {
siteroots.add(storedSiteRoot + "/");
}
}
List resources;
try {
resources = OpenCms.getOrgUnitManager().getResourcesForOrganizationalUnit(cms, ouFqn);
} catch (CmsException e) {
return Collections.EMPTY_LIST;
}
Collections.sort(siteroots); // sort by resource name
i = siteroots.iterator();
while (i.hasNext()) {
String folder = (String)i.next();
boolean compatible = false;
Iterator itResources = resources.iterator();
while (itResources.hasNext()) {
CmsResource resource = (CmsResource)itResources.next();
if (resource.getRootPath().startsWith(folder) || folder.startsWith(resource.getRootPath())) {
compatible = true;
break;
}
}
// select only sites compatibles to the given organizational unit
if (compatible) {
try {
CmsResource res = cms.readResource(folder);
if (!workplaceMode || cms.hasPermissions(res, CmsPermissionSet.ACCESS_VIEW)) {
String title = cms.readPropertyObject(res, CmsPropertyDefinition.PROPERTY_TITLE, false).getValue();
if (title == null) {
title = folder;
}
String position = cms.readPropertyObject(res, CmsPropertyDefinition.PROPERTY_NAVPOS, false).getValue();
result.add(new CmsSite(
folder,
res.getStructureId(),
title,
(CmsSiteMatcher)siteServers.get(folder),
position));
}
} catch (CmsException e) {
// user probably has no read access to the folder, ignore and continue iterating
}
}
}
Collections.sort(result);
} catch (Throwable t) {
LOG.error(Messages.get().getBundle().key(Messages.LOG_READ_SITE_PROP_FAILED_0), t);
} finally {
// restore the user's current context
cms.getRequestContext().setSiteRoot(storedSiteRoot);
}
return result;
}
/**
* Returns the current site for the provided OpenCms user context object.<p>
*
* In the unlikely case that no site matches with the provided OpenCms user context,
* the default site is returned.<p>
*
* @param cms the OpenCms user context object to check for the site
*
* @return the current site for the provided OpenCms user context object
*/
public CmsSite getCurrentSite(CmsObject cms) {
CmsSite site = getSiteForSiteRoot(cms.getRequestContext().getSiteRoot());
return (site == null) ? m_defaultSite : site;
}
/**
* Returns the default site.<p>
*
* @return the default site
*/
public CmsSite getDefaultSite() {
return m_defaultSite;
}
/**
* Returns the defaultUri.<p>
*
* @return the defaultUri
*/
public String getDefaultUri() {
return m_defaultUri;
}
/**
* Returns the site with has the provided site root,
* or <code>null</code> if no configured site has that site root.<p>
*
* The site root must have the form:
* <code>/sites/default</code>.<br>
* That means there must be a leading, but no trailing slash.<p>
*
* @param siteRoot the site root to look up the site for
*
* @return the site with has the provided site root,
* or <code>null</code> if no configured site has that site root
*
* @deprecated use {@link #getSiteForSiteRoot(String)} instead
*
* @see #getSiteForSiteRoot(String)
*/
public CmsSite getSite(String siteRoot) {
return (CmsSite)m_siteRootSites.get(siteRoot);
}
/**
* Returns the site for the given resource path, using the fall back site root
* in case the resource path is no root path.<p>
*
* In case neither the given resource path, nor the given fall back site root
* matches any configured site, the default site is returned.<p>
*
* Usually the fall back site root should be taken from {@link org.opencms.file.CmsRequestContext#getSiteRoot()},
* in which case a site for the site root should always exist.<p>
*
* This is the same as first calling {@link #getSiteForRootPath(String)} with the
* <code>resourcePath</code> parameter, and if this fails calling
* {@link #getSiteForSiteRoot(String)} with the <code>fallbackSiteRoot</code> parameter,
* and if this fails calling {@link #getDefaultSite()}.<p>
*
* @param resourcePath the resource path to get the site for
* @param fallbackSiteRoot site root to use in case the resource path is no root path
*
* @return the site for the given resource path, using the fall back site root
* in case the resource path is no root path
*
* @see #getSiteForRootPath(String)
*/
public CmsSite getSite(String resourcePath, String fallbackSiteRoot) {
CmsSite result = getSiteForRootPath(resourcePath);
if (result == null) {
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?