Author: cziegeler Date: Sat Mar 19 08:53:06 2005 New Revision: 158253 URL: http://svn.apache.org/viewcvs?view=rev&rev=158253 Log: Move initialization code into own class Remove deprecated methods from ClassUtils
Added: cocoon/trunk/src/core/java/org/apache/cocoon/core/CoreUtil.java (with props) Modified: cocoon/trunk/src/core/java/org/apache/cocoon/core/Core.java cocoon/trunk/src/core/java/org/apache/cocoon/util/ClassUtils.java cocoon/trunk/src/java/org/apache/cocoon/servlet/CocoonServlet.java Modified: cocoon/trunk/src/core/java/org/apache/cocoon/core/Core.java URL: http://svn.apache.org/viewcvs/cocoon/trunk/src/core/java/org/apache/cocoon/core/Core.java?view=diff&r1=158252&r2=158253 ============================================================================== --- cocoon/trunk/src/core/java/org/apache/cocoon/core/Core.java (original) +++ cocoon/trunk/src/core/java/org/apache/cocoon/core/Core.java Sat Mar 19 08:53:06 2005 @@ -20,22 +20,17 @@ import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; -import java.lang.reflect.Constructor; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Properties; import org.apache.avalon.framework.CascadingRuntimeException; -import org.apache.avalon.framework.container.ContainerUtil; import org.apache.avalon.framework.context.Context; import org.apache.avalon.framework.context.ContextException; import org.apache.avalon.framework.context.Contextualizable; -import org.apache.avalon.framework.service.ServiceException; -import org.apache.avalon.framework.service.ServiceManager; import org.apache.cocoon.Constants; import org.apache.cocoon.configuration.Settings; -import org.apache.cocoon.util.ClassUtils; /** * This is the core Cocoon component. @@ -235,117 +230,10 @@ void configure(Settings settings); ClassLoader getInitClassLoader(); - } - - /** - * Bootstrap Cocoon Service Manager - */ - public static ServiceManager createRootServiceManager(BootstrapEnvironment env) { - // create settings - final Settings s = createSettings(env); - - if (s.isInitClassloader()) { - // Force context classloader so that JAXP can work correctly - // (see javax.xml.parsers.FactoryFinder.findClassLoader()) - try { - Thread.currentThread().setContextClassLoader(env.getInitClassLoader()); - } catch (Exception e) { - // ignore this - } - } - // create new Core - final Core cocoon = new Core(s); + org.apache.cocoon.environment.Context getEnvironmentContext(); - // create parent service manager - final ServiceManager parent = getParentServiceManager(s); - - return new RootServiceManager(parent, cocoon); + String getContextPath(); } - /** - * Instatiates the parent service manager, as specified in the - * parent-service-manager init parameter. - * - * If none is specified, the method returns <code>null</code>. - * - * @return the parent service manager, or <code>null</code>. - */ - protected static ServiceManager getParentServiceManager(Settings s) { - String parentServiceManagerClass = s.getParentServiceManagerClassName(); - String parentServiceManagerInitParam = null; - if (parentServiceManagerClass != null) { - int dividerPos = parentServiceManagerClass.indexOf('/'); - if (dividerPos != -1) { - parentServiceManagerInitParam = parentServiceManagerInitParam.substring(dividerPos + 1); - parentServiceManagerClass = parentServiceManagerClass.substring(0, dividerPos); - } - } - - ServiceManager parentServiceManager = null; - if (parentServiceManagerClass != null) { - try { - Class pcm = ClassUtils.loadClass(parentServiceManagerClass); - Constructor pcmc = pcm.getConstructor(new Class[]{String.class}); - parentServiceManager = (ServiceManager) pcmc.newInstance(new Object[]{parentServiceManagerInitParam}); - - //ContainerUtil.enableLogging(parentServiceManager, getLogger()); - //ContainerUtil.contextualize(parentServiceManager, this.appContext); - ContainerUtil.initialize(parentServiceManager); - } catch (Exception e) { - /*if (getLogger().isErrorEnabled()) { - getLogger().error("Could not initialize parent component manager.", e); - }*/ - } - } - return parentServiceManager; - } - - public static final class RootServiceManager implements ServiceManager { - - protected final static String CORE_KEY = Core.class.getName(); - - protected final ServiceManager parent; - protected final Core cocoon; - - public RootServiceManager(ServiceManager p, Core c) { - this.parent = p; - this.cocoon = c; - } - - /* (non-Javadoc) - * @see org.apache.avalon.framework.service.ServiceManager#hasService(java.lang.String) - */ - public boolean hasService(String key) { - if ( CORE_KEY.equals(key) ) { - return true; - } - if ( this.parent != null ) { - return this.parent.hasService(key); - } - return false; - } - - /* (non-Javadoc) - * @see org.apache.avalon.framework.service.ServiceManager#lookup(java.lang.String) - */ - public Object lookup(String key) throws ServiceException { - if ( CORE_KEY.equals(key) ) { - return this.cocoon; - } - if ( this.parent != null ) { - return this.parent.lookup(key); - } - throw new ServiceException("Cocoon", "Component for key '" + key + "' not found."); - } - - /* (non-Javadoc) - * @see org.apache.avalon.framework.service.ServiceManager#release(java.lang.Object) - */ - public void release(Object component) { - if ( component != this.cocoon && parent != null ) { - this.parent.release(component); - } - } - } } Added: 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=auto&rev=158253 ============================================================================== --- cocoon/trunk/src/core/java/org/apache/cocoon/core/CoreUtil.java (added) +++ cocoon/trunk/src/core/java/org/apache/cocoon/core/CoreUtil.java Sat Mar 19 08:53:06 2005 @@ -0,0 +1,303 @@ +/* + * Copyright 2005 The Apache Software Foundation + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. + * + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.cocoon.core; + +import java.io.File; +import java.lang.reflect.Constructor; +import java.net.MalformedURLException; + +import org.apache.avalon.framework.container.ContainerUtil; +import org.apache.avalon.framework.context.DefaultContext; +import org.apache.avalon.framework.logger.Logger; +import org.apache.avalon.framework.service.ServiceException; +import org.apache.avalon.framework.service.ServiceManager; +import org.apache.cocoon.Constants; +import org.apache.cocoon.configuration.Settings; +import org.apache.cocoon.util.ClassUtils; + +/** + * + * @version SVN $Id:$ + * @since 2.2 + */ +public class CoreUtil { + + /** + * Bootstrap Cocoon Service Manager + */ + public static ServiceManager createRootServiceManager(Core.BootstrapEnvironment env) + throws Exception { + // "legacy" support: create an avalon context + final DefaultContext appContext = new DefaultContext(); + + // create settings + final Settings s = Core.createSettings(env); + + if (s.isInitClassloader()) { + // Force context classloader so that JAXP can work correctly + // (see javax.xml.parsers.FactoryFinder.findClassLoader()) + try { + Thread.currentThread().setContextClassLoader(env.getInitClassLoader()); + } catch (Exception e) { + // ignore this + } + } + + appContext.put(Constants.CONTEXT_ENVIRONMENT_CONTEXT, env.getEnvironmentContext()); + + // first init the work-directory for the logger. + // this is required if we are running inside a war file! + final String workDirParam = s.getWorkDirectory(); + File workDir; + if (workDirParam != null) { + if (env.getContextPath() == null) { + // No context path : consider work-directory as absolute + workDir = new File(workDirParam); + } else { + // Context path exists : is work-directory absolute ? + File workDirParamFile = new File(workDirParam); + if (workDirParamFile.isAbsolute()) { + // Yes : keep it as is + workDir = workDirParamFile; + } else { + // No : consider it relative to context path + workDir = new File(env.getContextPath(), workDirParam); + } + } + } else { + // TODO: + workDir = null; + //workDir = (File) this.servletContext.getAttribute("javax.servlet.context.tempdir"); + workDir = new File(workDir, "cocoon-files"); + } + workDir.mkdirs(); + appContext.put(Constants.CONTEXT_WORK_DIR, workDir); + s.setWorkDirectory(workDir.getAbsolutePath()); + + // TODO we should move the following into the bootstrap env + String contextURL; + String path = env.getContextPath(); + // these two variables are just for debugging. We can't log at this point + // as the logger isn't initialized yet. + String debugPathOne = null, debugPathTwo = null; + if (path == null) { + // Try to figure out the path of the root from that of WEB-INF + //try { + // TODO: + //path = this.servletContext.getResource("/WEB-INF").toString(); + //} catch (MalformedURLException me) { + // throw new ServletException("Unable to get resource 'WEB-INF'.", me); + //} + debugPathOne = path; + path = path.substring(0, path.length() - "WEB-INF".length()); + debugPathTwo = path; + } + try { + if (path.indexOf(':') > 1) { + contextURL = path; + } else { + contextURL = new File(path).toURL().toExternalForm(); + } + } catch (MalformedURLException me) { + // VG: Novell has absolute file names starting with the + // volume name which is easily more then one letter. + // Examples: sys:/apache/cocoon or sys:\apache\cocoon + try { + contextURL = new File(path).toURL().toExternalForm(); + } catch (MalformedURLException ignored) { + throw new Exception("Unable to determine context URL.", me); + } + } + + //try { + // TODO - ContextHelper is not in core :( + //appContext.put(ContextHelper.CONTEXT_ROOT_URL, new URL(contextURL)); + //} catch (MalformedURLException ignore) { + // we simply ignore this + //} + + // TODO create logger + final Logger logger = null; + + // Output some debug info + if (logger.isDebugEnabled()) { + logger.debug("Context URL: " + contextURL); + if (workDirParam != null) { + logger.debug("Using work-directory " + workDir); + } else { + logger.debug("Using default work-directory " + workDir); + } + } + + final String uploadDirParam = s.getUploadDirectory(); + File uploadDir; + if (uploadDirParam != null) { + if (env.getContextPath() == null) { + uploadDir = new File(uploadDirParam); + } else { + // Context path exists : is upload-directory absolute ? + File uploadDirParamFile = new File(uploadDirParam); + if (uploadDirParamFile.isAbsolute()) { + // Yes : keep it as is + uploadDir = uploadDirParamFile; + } else { + // No : consider it relative to context path + uploadDir = new File(env.getContextPath(), uploadDirParam); + } + } + if (logger.isDebugEnabled()) { + logger.debug("Using upload-directory " + uploadDir); + } + } else { + uploadDir = new File(workDir, "upload-dir" + File.separator); + if (logger.isDebugEnabled()) { + logger.debug("Using default upload-directory " + uploadDir); + } + } + uploadDir.mkdirs(); + appContext.put(Constants.CONTEXT_UPLOAD_DIR, uploadDir); + s.setUploadDirectory(uploadDir.getAbsolutePath()); + + String cacheDirParam = s.getCacheDirectory(); + File cacheDir; + if (cacheDirParam != null) { + if (env.getContextPath() == null) { + cacheDir = new File(cacheDirParam); + } else { + // Context path exists : is cache-directory absolute ? + File cacheDirParamFile = new File(cacheDirParam); + if (cacheDirParamFile.isAbsolute()) { + // Yes : keep it as is + cacheDir = cacheDirParamFile; + } else { + // No : consider it relative to context path + cacheDir = new File(env.getContextPath(), cacheDirParam); + } + } + if (logger.isDebugEnabled()) { + logger.debug("Using cache-directory " + cacheDir); + } + } else { + cacheDir = new File(workDir, "cache-dir" + File.separator); + File parent = cacheDir.getParentFile(); + if (parent != null) { + parent.mkdirs(); + } + if (logger.isDebugEnabled()) { + logger.debug("cache-directory was not set - defaulting to " + cacheDir); + } + } + cacheDir.mkdirs(); + appContext.put(Constants.CONTEXT_CACHE_DIR, cacheDir); + s.setCacheDirectory(cacheDir.getAbsolutePath()); + + // create new Core + final Core cocoon = new Core(s); + + // create parent service manager + final ServiceManager parent = getParentServiceManager(s); + + return new RootServiceManager(parent, cocoon); + } + + /** + * Instatiates the parent service manager, as specified in the + * parent-service-manager init parameter. + * + * If none is specified, the method returns <code>null</code>. + * + * @return the parent service manager, or <code>null</code>. + */ + protected static ServiceManager getParentServiceManager(Settings s) { + String parentServiceManagerClass = s.getParentServiceManagerClassName(); + String parentServiceManagerInitParam = null; + if (parentServiceManagerClass != null) { + int dividerPos = parentServiceManagerClass.indexOf('/'); + if (dividerPos != -1) { + parentServiceManagerInitParam = parentServiceManagerInitParam.substring(dividerPos + 1); + parentServiceManagerClass = parentServiceManagerClass.substring(0, dividerPos); + } + } + + ServiceManager parentServiceManager = null; + if (parentServiceManagerClass != null) { + try { + Class pcm = ClassUtils.loadClass(parentServiceManagerClass); + Constructor pcmc = pcm.getConstructor(new Class[]{String.class}); + parentServiceManager = (ServiceManager) pcmc.newInstance(new Object[]{parentServiceManagerInitParam}); + + //ContainerUtil.enableLogging(parentServiceManager, getLogger()); + //ContainerUtil.contextualize(parentServiceManager, this.appContext); + ContainerUtil.initialize(parentServiceManager); + } catch (Exception e) { + /*if (getLogger().isErrorEnabled()) { + getLogger().error("Could not initialize parent component manager.", e); + }*/ + } + } + return parentServiceManager; + } + + public static final class RootServiceManager implements ServiceManager { + + protected final static String CORE_KEY = Core.class.getName(); + + protected final ServiceManager parent; + protected final Core cocoon; + + public RootServiceManager(ServiceManager p, Core c) { + this.parent = p; + this.cocoon = c; + } + + /* (non-Javadoc) + * @see org.apache.avalon.framework.service.ServiceManager#hasService(java.lang.String) + */ + public boolean hasService(String key) { + if ( CORE_KEY.equals(key) ) { + return true; + } + if ( this.parent != null ) { + return this.parent.hasService(key); + } + return false; + } + + /* (non-Javadoc) + * @see org.apache.avalon.framework.service.ServiceManager#lookup(java.lang.String) + */ + public Object lookup(String key) throws ServiceException { + if ( CORE_KEY.equals(key) ) { + return this.cocoon; + } + if ( this.parent != null ) { + return this.parent.lookup(key); + } + throw new ServiceException("Cocoon", "Component for key '" + key + "' not found."); + } + + /* (non-Javadoc) + * @see org.apache.avalon.framework.service.ServiceManager#release(java.lang.Object) + */ + public void release(Object component) { + if ( component != this.cocoon && parent != null ) { + this.parent.release(component); + } + } + } + +} Propchange: cocoon/trunk/src/core/java/org/apache/cocoon/core/CoreUtil.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: cocoon/trunk/src/core/java/org/apache/cocoon/core/CoreUtil.java ------------------------------------------------------------------------------ svn:keywords = Id Modified: cocoon/trunk/src/core/java/org/apache/cocoon/util/ClassUtils.java URL: http://svn.apache.org/viewcvs/cocoon/trunk/src/core/java/org/apache/cocoon/util/ClassUtils.java?view=diff&r1=158252&r2=158253 ============================================================================== --- cocoon/trunk/src/core/java/org/apache/cocoon/util/ClassUtils.java (original) +++ cocoon/trunk/src/core/java/org/apache/cocoon/util/ClassUtils.java Sat Mar 19 08:53:06 2005 @@ -15,8 +15,6 @@ */ package org.apache.cocoon.util; -import java.io.File; -import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; @@ -76,77 +74,6 @@ */ public static ClassLoader getClassLoader() { return Thread.currentThread().getContextClassLoader(); - } - - /** - * Tests if a class implements a given interface - * - * @return true if class implements given interface. - * @deprecated Will be removed 2 versions after 2.1.5 - */ - public static boolean implementsInterface(String className, String iface) throws Exception { - Class class1 = ClassUtils.loadClass (className); - Class class2 = ClassUtils.loadClass (iface); - return ClassUtils.implementsInterface(class1, class2); - } - - /** - * Tests if a class implements a given interface - * - * @return true if class implements given interface. - * @deprecated Will be removed 2 versions after 2.1.5 - */ - public static boolean implementsInterface(Class class1, Class iface) { - return iface.isAssignableFrom (class1); - } - - /** - * Determine the last modification date for this - * class file or its enclosing library - * - * @param aClass A class whose last modification date is queried - * @return The time the given class was last modified - * @exception IOException IOError - * @exception IllegalArgumentException The class was not loaded from a file - * or directory - * @deprecated Will be removed 2 versions after 2.1.5 - */ - public static long lastModified(Class aClass) - throws IOException, IllegalArgumentException { - URL url = aClass.getProtectionDomain().getCodeSource().getLocation(); - - if (!url.getProtocol().equals("file")) { - throw new IllegalArgumentException("Class was not loaded from a file url"); - } - - File directory = new File(url.getFile()); - if (!directory.isDirectory()) { - throw new IllegalArgumentException("Class was not loaded from a directory"); - } - - String className = aClass.getName(); - String basename = className.substring(className.lastIndexOf(".") + 1); - - File file = new File(directory, basename + ".class"); - - return file.lastModified(); - } - - /** - * Gets the absolute pathname of the class file - * containing the specified class name, as prescribed - * by the current classpath. - * - * @param aClass Name of the class. - * @deprecated Will be removed 2 versions after 2.1.5 - */ - public static String which(Class aClass) { - String path = null; - try { - path = aClass.getProtectionDomain().getCodeSource().getLocation().toString(); - } catch (Throwable t){ - } - return path; } } 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=158252&r2=158253 ============================================================================== --- cocoon/trunk/src/java/org/apache/cocoon/servlet/CocoonServlet.java (original) +++ cocoon/trunk/src/java/org/apache/cocoon/servlet/CocoonServlet.java Sat Mar 19 08:53:06 2005 @@ -59,6 +59,7 @@ import org.apache.cocoon.components.notification.Notifying; import org.apache.cocoon.configuration.Settings; import org.apache.cocoon.core.Core; +import org.apache.cocoon.environment.Context; import org.apache.cocoon.environment.Environment; import org.apache.cocoon.environment.http.HttpContext; import org.apache.cocoon.environment.http.HttpEnvironment; @@ -177,8 +178,10 @@ super.init(conf); + this.servletContextPath = this.servletContext.getRealPath("/"); + // initialize settings - Core.BootstrapEnvironment env = new ServletBootstrapEnvironment(conf, this.classLoader); + Core.BootstrapEnvironment env = new ServletBootstrapEnvironment(conf, this.classLoader, this.servletContextPath); this.settings = Core.createSettings(env); @@ -206,7 +209,6 @@ } this.appContext.put(Constants.CONTEXT_ENVIRONMENT_CONTEXT, new HttpContext(this.servletContext)); - this.servletContextPath = this.servletContext.getRealPath("/"); // first init the work-directory for the logger. // this is required if we are running inside a war file! @@ -1301,34 +1303,61 @@ private final ServletConfig config; private final ClassLoader classLoader; - - public ServletBootstrapEnvironment(ServletConfig config, ClassLoader cl) { + private final String contextPath; + public ServletBootstrapEnvironment(ServletConfig config, ClassLoader cl, String path) { this.config = config; this.classLoader = cl; + this.contextPath = path; } + /** + * @see org.apache.cocoon.core.Core.BootstrapEnvironment#log(java.lang.String) + */ public void log(String message) { this.config.getServletContext().log(message); } + /** + * @see org.apache.cocoon.core.Core.BootstrapEnvironment#log(java.lang.String, java.lang.Throwable) + */ public void log(String message, Throwable error) { this.config.getServletContext().log(message, error); } + /** + * @see org.apache.cocoon.core.Core.BootstrapEnvironment#getInputStream(java.lang.String) + */ public InputStream getInputStream(String path) { return this.config.getServletContext().getResourceAsStream(path); } + /** + * @see org.apache.cocoon.core.Core.BootstrapEnvironment#configure(org.apache.cocoon.configuration.Settings) + */ public void configure(Settings settings) { // fill from the servlet parameters SettingsHelper.fill(settings, this.config); } - /* (non-Javadoc) + /** * @see org.apache.cocoon.core.Core.BootstrapEnvironment#getInitClassLoader() */ public ClassLoader getInitClassLoader() { return this.classLoader; + } + + /** + * @see org.apache.cocoon.core.Core.BootstrapEnvironment#getEnvironmentContext() + */ + public Context getEnvironmentContext() { + return new HttpContext(this.config.getServletContext()); + } + + /** + * @see org.apache.cocoon.core.Core.BootstrapEnvironment#getContextPath() + */ + public String getContextPath() { + return this.contextPath; } }