Author: cziegeler Date: Fri Apr 8 05:31:02 2005 New Revision: 160547 URL: http://svn.apache.org/viewcvs?view=rev&rev=160547 Log: Start moving Cocoon creation to util class
Modified: cocoon/trunk/src/core/java/org/apache/cocoon/core/CoreUtil.java cocoon/trunk/src/java/org/apache/cocoon/servlet/CocoonServlet.java Modified: cocoon/trunk/src/core/java/org/apache/cocoon/core/CoreUtil.java URL: http://svn.apache.org/viewcvs/cocoon/trunk/src/core/java/org/apache/cocoon/core/CoreUtil.java?view=diff&r1=160546&r2=160547 ============================================================================== --- cocoon/trunk/src/core/java/org/apache/cocoon/core/CoreUtil.java (original) +++ cocoon/trunk/src/core/java/org/apache/cocoon/core/CoreUtil.java Fri Apr 8 05:31:02 2005 @@ -89,6 +89,14 @@ /** TODO This will be made protected */ public LoggerManager loggerManager; + /** TODO This will be made protected */ + public Object cocoon; + + /** + * The time the cocoon instance was created + */ + protected long creationTime; + public CoreUtil(Core.BootstrapEnvironment environment) throws Exception { this.env = environment; @@ -232,6 +240,9 @@ // set encoding this.appContext.put(Constants.CONTEXT_DEFAULT_ENCODING, settings.getFormEncoding()); + // set class loader + this.appContext.put(Constants.CONTEXT_CLASS_LOADER, this.env.getInitClassLoader()); + // create parent service manager final ServiceManager parent = this.getParentServiceManager(); @@ -584,6 +595,174 @@ this.parent.release(component); } } + } + + /** + * Creates the Cocoon object and handles exception handling. + */ + public synchronized void createCocoon() + throws Exception { + + /* HACK for reducing class loader problems. */ + /* example: xalan extensions fail if someone adds xalan jars in tomcat3.2.1/lib */ + if (this.settings.isInitClassloader()) { + try { + Thread.currentThread().setContextClassLoader(this.env.getInitClassLoader()); + } catch (Exception e) { + // ignore + } + } + + this.updateEnvironment(); + this.forceLoad(); + this.forceProperty(); + + try { + if (this.log.isInfoEnabled()) { + this.log.info("Reloading from: " + this.settings.getConfiguration()); + } + Object c = ClassUtils.newInstance("org.apache.cocoon.Cocoon"); + ContainerUtil.enableLogging(c, getCocoonLogger()); + // TODO: c.setLoggerManager(this.loggerManager); + ContainerUtil.contextualize(c, this.appContext); + final ServiceManager parent = this.getParentServiceManager(); + if (parent != null) { + ContainerUtil.service(c, parent); + } + ContainerUtil.initialize(c); + this.creationTime = System.currentTimeMillis(); + + disposeCocoon(); + this.cocoon = c; + } catch (Exception e) { + this.log.error("Exception reloading", e); + this.disposeCocoon(); + throw e; + } + } + + /** + * Gets the current cocoon object. Reload cocoon if configuration + * changed or we are reloading. + */ + public void getCocoon(final String pathInfo, final String reloadParam) + throws Exception { + if (this.settings.isAllowReload()) { + boolean reload = false; + + if (this.cocoon != null) { + // TODO: activate +/* if (this.cocoon.modifiedSince(this.creationTime)) { + if (this.log.isInfoEnabled()) { + this.log.info("Configuration changed reload attempt"); + } + reload = true; + } else if (pathInfo == null && reloadParam != null) { + if (this.log.isInfoEnabled()) { + this.log.info("Forced reload attempt"); + } + reload = true; + } */ + } else if (pathInfo == null && reloadParam != null) { + if (this.log.isInfoEnabled()) { + this.log.info("Invalid configurations reload"); + } + reload = true; + } + + if (reload) { + this.initLogger(); + this.createCocoon(); + } + } + } + + /** + * Destroy Cocoon + */ + public final void disposeCocoon() { + if (this.cocoon != null) { + ContainerUtil.dispose(this.cocoon); + this.cocoon = null; + } + } + + protected Logger getCocoonLogger() { + final String rootlogger = this.settings.getCocoonLogger(); + if (rootlogger != null) { + return this.loggerManager.getLoggerForCategory(rootlogger); + } + return this.log; + } + + /** + * Handle the <code>load-class</code> parameter. This overcomes + * limits in many classpath issues. One of the more notorious + * ones is a bug in WebSphere that does not load the URL handler + * for the <code>classloader://</code> protocol. In order to + * overcome that bug, set <code>load-class</code> parameter to + * the <code>com.ibm.servlet.classloader.Handler</code> value. + * + * <p>If you need to load more than one class, then separate each + * entry with whitespace, a comma, or a semi-colon. Cocoon will + * strip any whitespace from the entry.</p> + */ + protected void forceLoad() { + final Iterator i = this.settings.getLoadClasses(); + while (i.hasNext()) { + final String fqcn = (String)i.next(); + try { + if (this.log.isDebugEnabled()) { + this.log.debug("Loading: " + fqcn); + } + ClassUtils.loadClass(fqcn).newInstance(); + } catch (Exception e) { + if (this.log.isWarnEnabled()) { + this.log.warn("Could not load class: " + fqcn, e); + } + // Do not throw an exception, because it is not a fatal error. + } + } + } + + /** + * Handle the "force-property" parameter. + * + * If you need to force more than one property to load, then + * separate each entry with whitespace, a comma, or a semi-colon. + * Cocoon will strip any whitespace from the entry. + */ + protected void forceProperty() { + if (this.settings.getForceProperties().size() > 0) { + Properties systemProps = System.getProperties(); + final Iterator i = this.settings.getForceProperties().entrySet().iterator(); + while (i.hasNext()) { + final Map.Entry current = (Map.Entry)i.next(); + try { + if (this.log.isDebugEnabled()) { + this.log.debug("Setting: " + current.getKey() + "=" + current.getValue()); + } + systemProps.setProperty(current.getKey().toString(), current.getValue().toString()); + } catch (Exception e) { + if (this.log.isWarnEnabled()) { + this.log.warn("Could not set property: " + current.getKey(), e); + } + // Do not throw an exception, because it is not a fatal error. + } + } + System.setProperties(systemProps); + } + } + + /** + * Method to update the environment before Cocoon instances are created. + * + * This is also useful if you wish to customize any of the 'protected' + * variables from this class before a Cocoon instance is built in a derivative + * of this class (eg. Cocoon Context). + */ + protected void updateEnvironment() throws Exception { + // can be overridden } } Modified: cocoon/trunk/src/java/org/apache/cocoon/servlet/CocoonServlet.java URL: http://svn.apache.org/viewcvs/cocoon/trunk/src/java/org/apache/cocoon/servlet/CocoonServlet.java?view=diff&r1=160546&r2=160547 ============================================================================== --- cocoon/trunk/src/java/org/apache/cocoon/servlet/CocoonServlet.java (original) +++ cocoon/trunk/src/java/org/apache/cocoon/servlet/CocoonServlet.java Fri Apr 8 05:31:02 2005 @@ -60,7 +60,6 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -import java.lang.reflect.Constructor; import java.net.MalformedURLException; import java.net.SocketException; import java.net.URL; @@ -134,9 +133,6 @@ /** The classloader that will be set as the context classloader if init-classloader is true */ protected final ClassLoader classLoader = this.getClass().getClassLoader(); - private String parentServiceManagerClass; - private String parentServiceManagerInitParam; - /** The parent ServiceManager, if any. Stored here in order to be able to dispose it in destroy(). */ private ServiceManager parentServiceManager; @@ -292,22 +288,6 @@ } /** - * Adds an URL to the classloader. Does nothing here, but is - * overriden in [EMAIL PROTECTED] ParanoidCocoonServlet}. - */ - protected void addClassLoaderURL(URL URL) { - // Nothing - } - - /** - * Adds a directory to the classloader. Does nothing here, but is - * overriden in [EMAIL PROTECTED] ParanoidCocoonServlet}. - */ - protected void addClassLoaderDirectory(String dir) { - // Nothing - } - - /** * This builds the important ClassPath used by this Servlet. It * does so in a Servlet Engine neutral way. It uses the * <code>ServletContext</code>'s <code>getRealPath</code> method @@ -339,8 +319,6 @@ if (classDir != null) { buildClassPath.append(classDir); - - addClassLoaderDirectory(classDir); } } else { // New(ish) method for war'd deployments @@ -365,8 +343,6 @@ if (classDirURL != null) { buildClassPath.append(classDirURL.toExternalForm()); - - addClassLoaderURL(classDirURL); } } @@ -381,8 +357,6 @@ for (int i = 0; i < libraries.length; i++) { String fullName = IOUtils.getFullFilename(libraries[i]); buildClassPath.append(File.pathSeparatorChar).append(fullName); - - addClassLoaderDirectory(fullName); } } @@ -499,7 +473,6 @@ } sb.append(s); - addClassLoaderDirectory(s); } else { if (s.indexOf("${") != -1) { String path = StringUtils.replaceToken(s); @@ -507,7 +480,6 @@ if (getLogger().isDebugEnabled()) { getLogger().debug("extraClassPath is not absolute replacing using token: [" + s + "] : " + path); } - addClassLoaderDirectory(path); } else { String path = null; if (this.servletContextPath != null) { @@ -522,7 +494,6 @@ } } sb.append(path); - addClassLoaderDirectory(path); } } } @@ -1228,6 +1199,10 @@ */ public void configure(DefaultContext context) { context.put(CONTEXT_SERVLET_CONFIG, this.config); + // TODO - move the following into CoreUtil + context.put(Constants.CONTEXT_CLASS_LOADER, classLoader); + // TODO: + //context.put(Constants.CONTEXT_CLASSPATH, getClassPath()); } /**