cmssitemanagerimpl.java
来自「找了很久才找到到源代码」· Java 代码 · 共 770 行 · 第 1/2 页
JAVA
770 行
result = getSiteForSiteRoot(fallbackSiteRoot);
if (result == null) {
result = getDefaultSite();
}
}
return result;
}
/**
* Returns the site for the given resources root path,
* or <code>null</code> if the resources root path does not match any site.<p>
*
* @param rootPath the root path of a resource
*
* @return the site for the given resources root path,
* or <code>null</code> if the resources root path does not match any site
*
* @see #getSiteForSiteRoot(String)
* @see #getSiteRoot(String)
*/
public CmsSite getSiteForRootPath(String rootPath) {
// most sites will be below the "/sites/" folder,
CmsSite result = lookupSitesFolder(rootPath);
if (result != null) {
return result;
}
// look through all folders that are not below "/sites/"
String siteRoot = lookupAdditionalSite(rootPath);
return (siteRoot != null) ? getSiteForSiteRoot(siteRoot) : null;
}
/**
* 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
*
* @see #getSiteForRootPath(String)
*/
public CmsSite getSiteForSiteRoot(String siteRoot) {
return (CmsSite)m_siteRootSites.get(siteRoot);
}
/**
* Returns the site root part for the given resources root path,
* or <code>null</code> if the given resources root path does not match any site root.<p>
*
* The site root returned will have the form:
* <code>/sites/default</code>.<br>
* That means there will a leading, but no trailing slash.<p>
*
* @param rootPath the root path of a resource
*
* @return the site root part of the resources root path,
* or <code>null</code> if the path does not match any site root
*
* @see #getSiteForRootPath(String)
*/
public String getSiteRoot(String rootPath) {
// most sites will be below the "/sites/" folder,
CmsSite site = lookupSitesFolder(rootPath);
if (site != null) {
return site.getSiteRoot();
}
// look through all folders that are not below "/sites/"
return lookupAdditionalSite(rootPath);
}
/**
* Returns an unmodifiable set of all configured site roots (Strings).<p>
*
* @return an unmodifiable set of all configured site roots (Strings)
*/
public Set getSiteRoots() {
return m_siteRoots;
}
/**
* Returns the map of configured sites, using
* {@link CmsSiteMatcher} objects as keys and {@link CmsSite} objects as values.<p>
*
* @return the map of configured sites, using {@link CmsSiteMatcher}
* objects as keys and {@link CmsSite} objects as values
*/
public Map getSites() {
return m_siteMatcherSites;
}
/**
* Returns the workplace server.<p>
*
* @return the workplace server
*/
public String getWorkplaceServer() {
return m_workplaceServer;
}
/**
* Returns the site matcher that matches the workplace site.<p>
*
* @return the site matcher that matches the workplace site
*/
public CmsSiteMatcher getWorkplaceSiteMatcher() {
return m_workplaceSiteMatcher;
}
/**
* Initializes the site manager with the OpenCms system configuration.<p>
*
* @param cms an OpenCms context object that must have been initialized with "Admin" permissions
*/
public void initialize(CmsObject cms) {
if (CmsLog.INIT.isInfoEnabled()) {
CmsLog.INIT.info(Messages.get().getBundle().key(
Messages.INIT_NUM_SITE_ROOTS_CONFIGURED_1,
new Integer((m_siteMatcherSites.size() + ((m_defaultUri != null) ? 1 : 0)))));
}
// check the presence of sites in VFS
Iterator i = m_siteMatcherSites.values().iterator();
while (i.hasNext()) {
CmsSite site = (CmsSite)i.next();
if (site != null) {
try {
cms.readResource(site.getSiteRoot());
} catch (Throwable t) {
if (CmsLog.INIT.isWarnEnabled()) {
CmsLog.INIT.warn(Messages.get().getBundle().key(Messages.INIT_NO_ROOT_FOLDER_1, site));
}
}
}
}
// check the presence of the default site in VFS
if (CmsStringUtil.isEmptyOrWhitespaceOnly(m_defaultUri)) {
m_defaultSite = null;
} else {
m_defaultSite = new CmsSite(m_defaultUri, CmsSiteMatcher.DEFAULT_MATCHER);
try {
cms.readResource(m_defaultSite.getSiteRoot());
} catch (Throwable t) {
if (CmsLog.INIT.isWarnEnabled()) {
CmsLog.INIT.warn(Messages.get().getBundle().key(
Messages.INIT_NO_ROOT_FOLDER_DEFAULT_SITE_1,
m_defaultSite));
}
}
}
if (m_defaultSite == null) {
m_defaultSite = new CmsSite("/", CmsSiteMatcher.DEFAULT_MATCHER);
}
if (CmsLog.INIT.isInfoEnabled()) {
if (m_defaultSite != null) {
CmsLog.INIT.info(Messages.get().getBundle().key(Messages.INIT_DEFAULT_SITE_ROOT_1, m_defaultSite));
} else {
CmsLog.INIT.info(Messages.get().getBundle().key(Messages.INIT_DEFAULT_SITE_ROOT_0));
}
}
m_workplaceSiteMatcher = new CmsSiteMatcher(m_workplaceServer);
if (CmsLog.INIT.isInfoEnabled()) {
if (m_workplaceSiteMatcher != null) {
CmsLog.INIT.info(Messages.get().getBundle().key(Messages.INIT_WORKPLACE_SITE_1, m_workplaceSiteMatcher));
} else {
CmsLog.INIT.info(Messages.get().getBundle().key(Messages.INIT_WORKPLACE_SITE_0));
}
}
// set site lists to unmodifiable
m_siteMatcherSites = Collections.unmodifiableMap(m_siteMatcherSites);
m_siteRoots = Collections.unmodifiableSet(m_siteRootSites.keySet());
// store additional site roots to optimize lookups later
Iterator j = m_siteRoots.iterator();
while (j.hasNext()) {
String root = (String)j.next();
if (!root.startsWith(SITES_FOLDER)) {
m_additionalSiteRoots.add(root);
}
}
// initialization is done, set the frozen flag to true
m_frozen = true;
}
/**
* Returns <code>true</code> if the given site matcher matches any configured site,
* which includes the workplace site.<p>
*
* @param matcher the site matcher to match the site with
*
* @return <code>true</code> if the matcher matches a site
*/
public boolean isMatching(CmsSiteMatcher matcher) {
boolean result = m_siteMatcherSites.get(matcher) != null;
if (!result) {
// try to match the workplace site
result = (m_workplaceSiteMatcher != null) && m_workplaceSiteMatcher.equals(matcher);
}
return result;
}
/**
* Returns <code>true</code> if the given site matcher matches the current site.<p>
*
* @param cms the current OpenCms user context
* @param matcher the site matcher to match the site with
*
* @return <code>true</code> if the matcher matches the current site
*/
public boolean isMatchingCurrentSite(CmsObject cms, CmsSiteMatcher matcher) {
return m_siteMatcherSites.get(matcher) == getCurrentSite(cms);
}
/**
* Returns <code>true</code> if the given site matcher matches the configured OpenCms workplace.<p>
*
* @param matcher the site matcher to match the site with
*
* @return <code>true</code> if the given site matcher matches the configured OpenCms workplace
*/
public boolean isWorkplaceRequest(CmsSiteMatcher matcher) {
return (m_workplaceSiteMatcher != null) && m_workplaceSiteMatcher.equals(matcher);
}
/**
* Returns <code>true</code> if the given request is against the configured OpenCms workplace.<p>
*
* @param req the request to match
*
* @return <code>true</code> if the given request is against the configured OpenCms workplace
*/
public boolean isWorkplaceRequest(HttpServletRequest req) {
if (req == null) {
// this may be true inside a static export test case scenario
return false;
}
return isWorkplaceRequest(new CmsSiteMatcher(req.getScheme(), req.getServerName(), req.getServerPort()));
}
/**
* Matches the given request against all configures sites and returns
* the matching site, or the default site if no sites matches.<p>
*
* @param req the request to match
*
* @return the matching site, or the default site if no sites matches
*/
public CmsSite matchRequest(HttpServletRequest req) {
CmsSiteMatcher matcher = new CmsSiteMatcher(req.getScheme(), req.getServerName(), req.getServerPort());
CmsSite site = matchSite(matcher);
if (LOG.isDebugEnabled()) {
String requestServer = req.getScheme() + "://" + req.getServerName() + ":" + req.getServerPort();
LOG.debug(Messages.get().getBundle().key(
Messages.LOG_MATCHING_REQUEST_TO_SITE_2,
requestServer,
site.toString()));
}
return site;
}
/**
* Return the configured site that matches the given site matcher,
* or the default site if no sites matches.<p>
*
* @param matcher the site matcher to match the site with
* @return the matching site, or the default site if no sites matches
*/
public CmsSite matchSite(CmsSiteMatcher matcher) {
CmsSite site = (CmsSite)m_siteMatcherSites.get(matcher);
if (site == null) {
// return the default site (might be null as well)
site = m_defaultSite;
}
return site;
}
/**
* Sets the default URI, 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 defaultUri the defaultUri to set
*/
public void setDefaultUri(String defaultUri) {
if (m_frozen) {
throw new CmsRuntimeException(Messages.get().container(Messages.ERR_CONFIG_FROZEN_0));
}
m_defaultUri = defaultUri;
}
/**
* Sets the workplace server, 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 workplaceServer the workplace server to set
*/
public void setWorkplaceServer(String workplaceServer) {
if (m_frozen) {
throw new CmsRuntimeException(Messages.get().container(Messages.ERR_CONFIG_FROZEN_0));
}
m_workplaceServer = workplaceServer;
}
/**
* Adds a new Site matcher object to the map of server names.
*
* @param matcher the SiteMatcher of the server
* @param site the site to add
*
* @throws CmsConfigurationException if the site contains a server name, that is already assigned
*/
private void addServer(CmsSiteMatcher matcher, CmsSite site) throws CmsConfigurationException {
if (m_siteMatcherSites.containsKey(matcher)) {
throw new CmsConfigurationException(Messages.get().container(
Messages.ERR_DUPLICATE_SERVER_NAME_1,
matcher.getUrl()));
}
m_siteMatcherSites.put(matcher, site);
}
/**
* Returns <code>true</code> if the given root path matches any of the stored additional sites.<p>
*
* @param rootPath the root path to check
*
* @return <code>true</code> if the given root path matches any of the stored additional sites
*/
private String lookupAdditionalSite(String rootPath) {
for (int i = 0, size = m_additionalSiteRoots.size(); i < size; i++) {
String siteRoot = (String)m_additionalSiteRoots.get(i);
if (rootPath.startsWith(siteRoot)) {
return siteRoot;
}
}
return null;
}
/**
* Returns the configured site if the given root path matches site in the "/sites/" folder,
* or <code>null</code> otherwise.<p>
*
* @param rootPath the root path to check
*
* @return the configured site if the given root path matches site in the "/sites/" folder,
* or <code>null</code> otherwise
*/
private CmsSite lookupSitesFolder(String rootPath) {
int pos = rootPath.indexOf('/', SITES_FOLDER_POS);
if (pos > 0) {
// this assumes that the root path may likely start with something like "/sites/default/"
// just cut the first 2 directories from the root path and do a direct lookup in the internal map
return (CmsSite)m_siteRootSites.get(rootPath.substring(0, pos));
}
return null;
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?