/* * Copyright (C) 2004 Red Hat Inc. All Rights Reserved. * Copyright (C) 2009 Peter Boy (pb@zes.uni-bremen.de) 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.runtime; import com.arsdigita.util.UncheckedWrapperException; import java.io.File; import java.net.MalformedURLException; import java.net.URL; import org.apache.log4j.Logger; /** *
CCMResourceManager Runtime environment repository object, stores essential * properties of the runtime environment and provides them on request.
* *Currently, is is limited to the
*It provides public methods to make the properties available.
* *The singleton is initialised
*Currently as a fall back mechanism the environmant Variable CCM_HOME is * evaluated and used a last resort, if no initialisation has been done when * a getter is first called.
* *It is essential for the proper working of CCM that CCMResourceManager is * initialised before any operation starts, as it is the case with the Startup * class of the runtime package, which is responsible for organising database * access.
* * *Subject to change!
* * @author Justin Ross <jross@redhat.com> * rewritten by * @author pboy <pboy@barkhof.uni-bremen.de> * @version $Id: CCMResourceManager.java 751 2005-09-02 12:52:23Z sskracic $ */ public final class CCMResourceManager { public final static String versionId = "$Id: CCMResourceManager.java 1393 2006-11-28 09:12:32Z sskracic $" ; private static final Logger s_log = Logger.getLogger(CCMResourceManager.class); private static CCMResourceManager s_ccm; /** * Full Pathname of the application base directory * (document root in apache terminology) */ private static File m_baseDir; /** * Location of the registry in the applications directory tree * as offset from the base directory */ // currently not used, should be refactored as File object for the sake of // operating system independency! // public static final String registryPath = "/WEB-INF/conf/registry"; // public static final File registryPath = null; // currently not used, work in progress /* ************ Section singleton handlers ***************** */ /** * Sets the singleton configuration property for the runtime * environment. * */ public static final synchronized void setBaseDirectory(String baseDirName) { if (s_ccm == null) { s_ccm = new CCMResourceManager(); s_ccm.storeBaseDir(baseDirName); } else { // baseDir already set, silently discard s_log.info("baseDir already set as " + m_baseDir + ". Discarded."); } } /** * Returns the singleton configuration property for the runtime * environment. * * @return TheRuntimeConfig record; it cannot be null
*/
public static final synchronized File getBaseDirectory() {
if (s_ccm == null) {
// should never happen, setBaseDirectory has to be executed first
// we try to resolve the problem in fetchBaseDir by search for
// a runtime environment variable (the old way).
s_ccm = new CCMResourceManager();
}
return s_ccm.fetchBaseDir();
}
/* ************ Section singleton handlers END ************** */
/* ************ Constructors Section ************** */
/**
* Following the singleton pattern: Private constructor to prevent other
* clients from instantiating the class (and the compiler from generating
* a default public constructor).
*/
private CCMResourceManager() { }
/* ************ Constructors Section END ************** */
/* ************ Public getter/setter Section *************** */
/**
* Retrieve the homeDir as URL.
*
* Note! API changed. @see getHomeDirectory()
* May be removed in the future!
*
* @return Directory location in the servers file system as URL object.
*/
public static final URL getHomeURL() {
try {
return CCMResourceManager.getHomeDirectory().toURL();
} catch (MalformedURLException e) {
throw new UncheckedWrapperException(e);
}
}
/**
* Retrieve the homeDir, which is the location of the servlet server's
* servlet container directory in the file system of the server machine,
* as File object.
*
* Note! API changed!
*
* Originally it is used to determine all file object locations of a
* CCM installation, during the installation step as well as
* while running the application inside a servlet container. The CCM installation
* of a servlet container used to use a non-standard layout. It is based upon a
* system wide environment variable CCM_HOME to determine the home directory.
*
* The dependency from a system wide environment variable prevents a servlet
* container to run multiple instances of CCM. In addition to it CCM will
* be migrated to be installable in a standard way to a standard container.
* Therefore all file locations will be given relative to the applications
* directory (the baseDirectory @see m_baseDir).
*
*
* Method getHomeDirectory() is preserved during the transition phase.
* It may be removed in the future! Or it may be moved to
* c.ad.packaging for assistence of the installation step only.
*
* MODIFIED:
* CCM_HOME is now interpreted as the path to the applications base
* directory (web application context).
*
* @return Directory location in the servers file system as File object.
*/
static final File getHomeDirectory() {
String home = System.getProperty("ccm.home");
if (home == null) {
throw new IllegalStateException
("The ccm.home system property is null or not defined");
}
// make a guess, wether it is old style (i.e. referring to the containers
// base directory and therefor does not contain the webapps part) or
// new style referring to the apps base directory (and therefor containing
// the webapps part)
if (home.indexOf("webapps") > 0 ){
// should be new style
}
else {
// presumably old style, add path to standard context name
home += "/webapps/ROOT";
}
File file = new File(home);
// No need to require that home exists (indeed, during install it will not).
// Should be created by invoking method if not.
// if (!file.exists()) {
// throw new IllegalStateException
// ("The file given in the ccm.home system property " +
// "does not exist");
// }
if (!file.isDirectory()) {
throw new IllegalStateException
("The file given in the ccm.home system property " +
"is not a directory");
}
return file;
}
/**
* Provide the configDirectory as URL.
*
* @see getConfigDirectory() for details.
*
* Note! API changed!
*
* @return Directory location in the servers file system as URL object.
*/
public static final URL getConfigURL() {
try {
return CCMResourceManager.getConfigDirectory().toURL();
} catch (MalformedURLException e) {
throw new UncheckedWrapperException(e);
}
}
/**
* Retrieve the configDir, which is the location of the configuration
* database root (registry) in the file system tree of the server machine,
* as File object.
*
* @return Directory location in the servers file system as File object.
*/
public static final File getConfigDirectory() {
// Keep this in sync with informational attribut @see registryPath !
File confdir = new File(new File(new File(CCMResourceManager.getBaseDirectory(),
"WEB-INF"),"conf"), "registry");
if (!confdir.exists()) {
if (!confdir.mkdirs()) {
throw new IllegalStateException
("Could not create configuration directory: " + confdir);
}
}
if (!confdir.isDirectory()) {
throw new IllegalStateException
("Configuration directory value is not a directory: " + confdir);
}
return confdir;
}
/**
* getWorkDirectory retrieves and eventually creates an internal directory
* in the servlet container for temporary files (work files), where subsystems
* may create subdirectories for internal use (e.g. Lucene search enginge or
* the PublishToFile machinery).
*
* The containers work file directory could be used as well, but may be
* inappropriate in case of confidential data.
*
* @return Directory location in the servers file system as File object.
*/
public static final File getWorkDirectory() {
File file = new File(new File(CCMResourceManager.getBaseDirectory(),
"WEB-INF"),"work");
if (!file.exists()) {
if (!file.mkdirs()) {
throw new IllegalStateException
("Could not create work directory: " + file);
}
}
if (!file.isDirectory()) {
throw new IllegalStateException
("Work directory value is not a directory: " + file);
}
return file;
}
/* ************ Public getter/setter Section END *************** */
/* ************ Private Worker Section *************** */
/**
* Stores the passed in String as File object.
*
* @param baseDirName String containing the path, must not be null
*/
private final void storeBaseDir(String baseDirName) {
s_log.debug("storeBaseDir: BaseDir name is given as " + baseDirName );
m_baseDir = new File(baseDirName);
// eventually: check if dir exists, create it if not.
if (!m_baseDir.exists()) {
if (!m_baseDir.mkdirs()) {
throw new IllegalStateException
("Could not create base directory: " + m_baseDir);
}
}
if (!m_baseDir.isDirectory()) {
throw new IllegalStateException
("Base directory value is not a directory: " + m_baseDir);
}
}
/**
* Retrieves the stored BaseDir File object.
*
* @return Base directory location in the servers file system as File object.
*/
private final File fetchBaseDir() {
if (m_baseDir == null) {
// should never happen, but we try to cope with it anyway by
// falling back to getHomeDirectory() and the system wide
// environment variable.
// During transition phase only! Must be removed when the new
// standard compliant installation method is fully in place
// MODIFIED
// HomeDirectory now specifies the applications context dir.
m_baseDir = CCMResourceManager.getHomeDirectory();
// eventually: check if dir exists, create it if not.
if (!m_baseDir.exists()) {
if (!m_baseDir.mkdirs()) {
throw new IllegalStateException
("Could not create base directory: " + m_baseDir);
}
}
if (!m_baseDir.isDirectory()) {
throw new IllegalStateException
("Base directory value is not a directory: " + m_baseDir);
}
}
return m_baseDir;
}
/* ************ Private Worker Section END *************** */
}