259 lines
8.4 KiB
Java
Executable File
259 lines
8.4 KiB
Java
Executable File
/*
|
|
* Copyright (C) 2001-2004 Red Hat Inc. All Rights Reserved.
|
|
*
|
|
* 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.
|
|
*
|
|
* 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 com.arsdigita.cms.dispatcher;
|
|
|
|
import com.arsdigita.bebop.PageState;
|
|
import com.arsdigita.cms.CMS;
|
|
import com.arsdigita.dispatcher.DispatcherHelper;
|
|
|
|
import org.apache.logging.log4j.LogManager;
|
|
import org.apache.logging.log4j.Logger;
|
|
|
|
import javax.servlet.http.HttpServletResponse;
|
|
|
|
import java.util.Collections;
|
|
import java.util.Date;
|
|
import java.util.HashMap;
|
|
import java.util.Map;
|
|
|
|
import org.librecms.CmsConstants;
|
|
import org.librecms.assets.BinaryAsset;
|
|
import org.librecms.assets.Image;
|
|
import org.librecms.contentsection.ContentSection;
|
|
|
|
/**
|
|
* <p>
|
|
* This class provides many utility functions for the Content Management
|
|
* System.</p>
|
|
* Specifically used by various JSP templates.
|
|
*
|
|
* @author Michael Pih (pihman@arsdigita.com)
|
|
*/
|
|
public class Utilities {
|
|
|
|
public static final Logger LOGGER = LogManager.getLogger(Utilities.class);
|
|
|
|
// Used for caching util lookups
|
|
private static HashMap m_cache = new HashMap();
|
|
|
|
private static Date s_lastSectionRefresh = null;
|
|
private static Map s_sectionRefreshTimes = Collections.synchronizedMap(
|
|
new HashMap());
|
|
|
|
/**
|
|
* Fetch the location of the CMS ContentCenter package.
|
|
*
|
|
* @return The URL of the CMS ContentCenter package
|
|
*
|
|
* @deprecated use ContentCenter.getURL() instead
|
|
*/
|
|
public static String getWorkspaceURL() {
|
|
|
|
return CmsConstants.CONTENT_CENTER_URL;
|
|
|
|
}
|
|
|
|
/**
|
|
* Fetch the location (URL) of the CMS Services package. Caches the result.
|
|
*
|
|
* @return The URL of the CMS Services package
|
|
*
|
|
* @deprecated Use Service.getURL( instead
|
|
*/
|
|
public static String getServiceURL() {
|
|
String url = (String) m_cache.get(CmsConstants.SERVICE_PACKAGE_KEY);
|
|
if (url == null) {
|
|
// chris.gilbert@westsussex.gov.uk
|
|
// We don't want application context in this url, especially when
|
|
// it gets cached in a static variable - if I have a
|
|
// file that is maintained by a non cms application eg
|
|
// forum, then I can end up with a url that doesn't work
|
|
// and so breaks file links everywhere
|
|
// url = getSingletonPackageURLSansContext(CMS.SERVICE_PACKAGE_KEY);
|
|
url = CmsConstants.SERVICE_URL;
|
|
m_cache.put(CmsConstants.SERVICE_PACKAGE_KEY, url);
|
|
}
|
|
|
|
return url;
|
|
}
|
|
|
|
/**
|
|
* The URL to log out.
|
|
*
|
|
* @return The logout URL
|
|
*/
|
|
public static String getLogoutURL() {
|
|
//StringBuffer buf = new StringBuffer(getServiceURL());
|
|
StringBuilder buf = new StringBuilder(CmsConstants.SERVICE_URL);
|
|
buf.append("logout");
|
|
return buf.toString();
|
|
}
|
|
|
|
/**
|
|
* Construct a URL which serves a binary asset.
|
|
*
|
|
* @param asset The binary asset
|
|
*
|
|
* @return the URL which will serve the specified binary asset
|
|
*
|
|
* @deprecated Use Service.getAssetURL(BinaryAsset asset) instead
|
|
*/
|
|
public static String getAssetURL(BinaryAsset asset) {
|
|
return getAssetURL(asset.getObjectId());
|
|
}
|
|
|
|
/**
|
|
* Constuct a URL which serves a binary asset.
|
|
*
|
|
* @param assetId The asset ID
|
|
*
|
|
* @return the URL which will serve the specified binary asset
|
|
*
|
|
* @deprecated Use Service.getAssetURL(BigDecimal assetId) instead
|
|
*/
|
|
public static String getAssetURL(long assetId) {
|
|
// StringBuffer buf = new StringBuffer(getServiceURL());
|
|
StringBuilder buf = new StringBuilder(CmsConstants.SERVICE_URL);
|
|
buf.append("stream/asset?");
|
|
buf.append(CmsConstants.ASSET_ID).append("=").append(assetId);
|
|
return buf.toString();
|
|
}
|
|
|
|
/**
|
|
* Construct a URL which serves an image.
|
|
*
|
|
* @param asset The image asset whose image is to be served
|
|
*
|
|
* @return the URL which will serve the specified image asset
|
|
*
|
|
* @deprecated Use Service.getImageURL(ImageAsset) instead!
|
|
*/
|
|
public static String getImageURL(Image asset) {
|
|
// StringBuffer buf = new StringBuffer(getServiceURL());
|
|
StringBuilder buf = new StringBuilder(CmsConstants.SERVICE_URL);
|
|
buf.append("stream/image/?");
|
|
buf.append(CmsConstants.IMAGE_ID).append("=")
|
|
.append(asset.getObjectId());
|
|
return buf.toString();
|
|
}
|
|
|
|
public static String getGlobalAssetsURL() {
|
|
return getWebappContext();
|
|
}
|
|
|
|
/**
|
|
* Fetch the context path of the request. This is typically "/".
|
|
*
|
|
* @return The webapp context path
|
|
*/
|
|
public static String getWebappContext() {
|
|
return DispatcherHelper.getWebappContext();
|
|
}
|
|
|
|
/**
|
|
* Check for the last refresh on authoring kits or content types in a
|
|
* section.
|
|
*
|
|
*/
|
|
public static synchronized Date
|
|
getLastSectionRefresh(ContentSection section) {
|
|
|
|
// cache by URL string instead of by section object to avoid
|
|
// holding the reference.
|
|
String sectionURL = section.getPrimaryUrl();
|
|
|
|
Date lastModified = (Date) s_sectionRefreshTimes.get(sectionURL);
|
|
if (lastModified == null) {
|
|
lastModified = new Date();
|
|
s_lastSectionRefresh = lastModified;
|
|
s_sectionRefreshTimes.put(sectionURL, lastModified);
|
|
}
|
|
|
|
return lastModified;
|
|
}
|
|
|
|
/**
|
|
* Check for the last refresh on authoring kits or content types in any
|
|
* section.
|
|
*
|
|
*/
|
|
public static Date getLastSectionRefresh() {
|
|
|
|
// instantiate last refresh lazily to ensure that first result is
|
|
// predictable.
|
|
if (s_lastSectionRefresh == null) {
|
|
s_lastSectionRefresh = new Date();
|
|
}
|
|
return s_lastSectionRefresh;
|
|
}
|
|
|
|
/**
|
|
* Force the authoring UI to reload. This should be done every time an
|
|
* authoring kit or a content type are updated.
|
|
*/
|
|
public static void refreshItemUI(PageState state) {
|
|
// Drop the authoring kit UI to force it to refresh
|
|
// THE URL SHOULD NOT BE HARDCODED !
|
|
|
|
ContentSection section = CMS.getContext().getContentSection();
|
|
|
|
// OLD APPROACH: used in conjunction with CMSDispatcher. This
|
|
// shouldn't do any harm even if CMSDispatcher is not being used.
|
|
CMSDispatcher.releaseResource(section, "admin/item");
|
|
refreshAdminUI(state);
|
|
|
|
// NEW APPROACH: used in conjunction with
|
|
// ContentSectionDispatcher. cache by URL string instead of by
|
|
// section object to avoid holding the reference. This shouldn't
|
|
// do any harm even if ContentSectionDispatcher is not being used.
|
|
s_lastSectionRefresh = new Date();
|
|
s_sectionRefreshTimes.put(section.getPrimaryUrl(),
|
|
s_lastSectionRefresh);
|
|
}
|
|
|
|
/**
|
|
* Force the authoring UI to reload. This should be done every time an
|
|
* authoring kit or a content type are updated.
|
|
*/
|
|
public static void refreshAdminUI(PageState state) {
|
|
// Drop the admin UI to force it to refresh
|
|
// THE URL SHOULD NOT BE HARDCODED !
|
|
|
|
ContentSection section = CMS.getContext().getContentSection();
|
|
|
|
CMSDispatcher.releaseResource(section, "admin");
|
|
CMSDispatcher.releaseResource(section, "admin/index");
|
|
CMSDispatcher.releaseResource(section, "");
|
|
}
|
|
|
|
/**
|
|
* Add the "pragma: no-cache" header to the HTTP response to make sure the
|
|
* browser does not cache tha page
|
|
*
|
|
* @param response The HTTP response
|
|
*
|
|
* @deprecated use
|
|
* com.arsdigita.dispatcher.DispatcherHelper.cacheDisable(HttpServletResponse)
|
|
*/
|
|
public static void disableBrowserCache(HttpServletResponse response) {
|
|
response.addHeader("pragma", "no-cache");
|
|
}
|
|
|
|
}
|