You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by cz...@apache.org on 2005/04/21 22:43:20 UTC
svn commit: r164118 -
/cocoon/blocks/supported/portal/trunk/java/org/apache/cocoon/portlet/CocoonPortlet.java
Author: cziegeler
Date: Thu Apr 21 13:43:19 2005
New Revision: 164118
URL: http://svn.apache.org/viewcvs?rev=164118&view=rev
Log:
Start using CoreUtil
Modified:
cocoon/blocks/supported/portal/trunk/java/org/apache/cocoon/portlet/CocoonPortlet.java
Modified: cocoon/blocks/supported/portal/trunk/java/org/apache/cocoon/portlet/CocoonPortlet.java
URL: http://svn.apache.org/viewcvs/cocoon/blocks/supported/portal/trunk/java/org/apache/cocoon/portlet/CocoonPortlet.java?rev=164118&r1=164117&r2=164118&view=diff
==============================================================================
--- cocoon/blocks/supported/portal/trunk/java/org/apache/cocoon/portlet/CocoonPortlet.java (original)
+++ cocoon/blocks/supported/portal/trunk/java/org/apache/cocoon/portlet/CocoonPortlet.java Thu Apr 21 13:43:19 2005
@@ -1,5 +1,5 @@
/*
- * Copyright 1999-2004 The Apache Software Foundation.
+ * Copyright 1999-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.
@@ -15,74 +15,59 @@
*/
package org.apache.cocoon.portlet;
-import org.apache.avalon.excalibur.logger.Log4JLoggerManager;
-import org.apache.avalon.excalibur.logger.LogKitLoggerManager;
-import org.apache.avalon.excalibur.logger.LoggerManager;
-import org.apache.avalon.framework.configuration.Configurable;
-import org.apache.avalon.framework.configuration.Configuration;
-import org.apache.avalon.framework.configuration.DefaultConfigurationBuilder;
-import org.apache.avalon.framework.container.ContainerUtil;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.PrintStream;
+import java.net.MalformedURLException;
+import java.net.SocketException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.StringTokenizer;
+import java.util.jar.Attributes;
+import java.util.jar.Manifest;
+
+import javax.portlet.ActionRequest;
+import javax.portlet.ActionResponse;
+import javax.portlet.GenericPortlet;
+import javax.portlet.PortletConfig;
+import javax.portlet.PortletException;
+import javax.portlet.PortletRequest;
+import javax.portlet.PortletSession;
+import javax.portlet.RenderRequest;
+import javax.portlet.RenderResponse;
+import javax.servlet.ServletException;
+
import org.apache.avalon.framework.context.DefaultContext;
-import org.apache.avalon.framework.logger.LogKitLogger;
import org.apache.avalon.framework.logger.Logger;
-import org.apache.avalon.framework.service.ServiceManager;
-
import org.apache.cocoon.Cocoon;
import org.apache.cocoon.ConnectionResetException;
import org.apache.cocoon.Constants;
import org.apache.cocoon.ResourceNotFoundException;
-import org.apache.cocoon.components.ContextHelper;
import org.apache.cocoon.components.notification.DefaultNotifyingBuilder;
import org.apache.cocoon.components.notification.Notifier;
import org.apache.cocoon.components.notification.Notifying;
+import org.apache.cocoon.configuration.Settings;
+import org.apache.cocoon.core.BootstrapEnvironment;
+import org.apache.cocoon.core.CoreUtil;
+import org.apache.cocoon.environment.Context;
import org.apache.cocoon.environment.Environment;
import org.apache.cocoon.environment.portlet.PortletContext;
import org.apache.cocoon.environment.portlet.PortletEnvironment;
import org.apache.cocoon.portlet.multipart.MultipartActionRequest;
import org.apache.cocoon.portlet.multipart.RequestFactory;
-import org.apache.cocoon.util.ClassUtils;
import org.apache.cocoon.util.IOUtils;
-import org.apache.cocoon.util.StringUtils;
import org.apache.cocoon.util.log.CocoonLogFormatter;
-import org.apache.cocoon.util.log.Log4JConfigurator;
-
import org.apache.commons.lang.BooleanUtils;
import org.apache.commons.lang.SystemUtils;
import org.apache.log.ContextMap;
-import org.apache.log.ErrorHandler;
-import org.apache.log.Hierarchy;
-import org.apache.log.Priority;
-import org.apache.log.util.DefaultErrorHandler;
-import org.apache.log4j.LogManager;
-
-import javax.portlet.ActionRequest;
-import javax.portlet.ActionResponse;
-import javax.portlet.GenericPortlet;
-import javax.portlet.PortletConfig;
-import javax.portlet.PortletException;
-import javax.portlet.PortletSession;
-import javax.portlet.RenderRequest;
-import javax.portlet.RenderResponse;
-import javax.portlet.PortletRequest;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.PrintStream;
-import java.lang.reflect.Constructor;
-import java.net.MalformedURLException;
-import java.net.SocketException;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.StringTokenizer;
-import java.util.jar.Attributes;
-import java.util.jar.Manifest;
+import org.apache.log.LogTarget;
/**
* This is the entry point for Cocoon execution as an JSR-168 Portlet.
@@ -107,12 +92,6 @@
static final float HOUR = 60 * MINUTE;
private Logger log;
- private LoggerManager loggerManager;
-
- /**
- * The time the cocoon instance was created
- */
- protected long creationTime = 0;
/**
* The <code>Cocoon</code> instance
@@ -127,73 +106,15 @@
/**
* Avalon application context
*/
- protected DefaultContext appContext = new DefaultContext();
-
+ protected org.apache.avalon.framework.context.Context appContext;
- /**
- * Default value for {@link #allowReload} parameter (false)
- */
- protected static final boolean ALLOW_RELOAD = false;
-
- /**
- * Allow reloading of cocoon by specifying the <code>cocoon-reload=true</code> parameter with a request
- */
- protected boolean allowReload;
-
- /**
- * Allow adding processing time to the response
- */
- protected boolean showTime;
-
- /**
- * If true, processing time will be added as an HTML comment
- */
- protected boolean hiddenShowTime;
-
-
- /**
- * Default value for {@link #enableUploads} parameter (false)
- */
- private static final boolean ENABLE_UPLOADS = false;
- private static final boolean SAVE_UPLOADS_TO_DISK = true;
- private static final int MAX_UPLOAD_SIZE = 10000000; // 10Mb
-
- /**
- * Allow processing of upload requests (mime/multipart)
- */
- private boolean enableUploads;
- private boolean autoSaveUploads;
- private boolean allowOverwrite;
- private boolean silentlyRename;
- private int maxUploadSize;
-
- private File uploadDir;
- private File workDir;
- private File cacheDir;
private String containerEncoding;
- private String defaultFormEncoding;
protected javax.portlet.PortletContext portletContext;
/** The classloader that will be set as the context classloader if init-classloader is true */
protected ClassLoader classLoader = this.getClass().getClassLoader();
- protected boolean initClassLoader = false;
-
- 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;
-
- protected String forceLoadParameter;
- protected String forceSystemProperty;
-
- /**
- * If true or not set, this class will try to catch and handle all Cocoon exceptions.
- * If false, it will rethrow them to the portlet container.
- */
- private boolean manageExceptions;
/**
* This is the path to the portlet context (or the result
@@ -236,6 +157,12 @@
*/
protected boolean storeSessionPath;
+ /** CoreUtil */
+ protected CoreUtil coreUtil;
+
+ /** Settings */
+ protected Settings settings;
+
/**
* Initialize this <code>CocoonPortlet</code> instance.
*
@@ -257,71 +184,9 @@
public void init(PortletConfig conf) throws PortletException {
super.init(conf);
-
- // Check the init-classloader parameter only if it's not already true.
- // This is useful for subclasses of this portlet that override the value
- // initially set by this class (i.e. false).
- if (!this.initClassLoader) {
- this.initClassLoader = getInitParameterAsBoolean("init-classloader", false);
- }
-
- if (this.initClassLoader) {
- // Force context classloader so that JAXP can work correctly
- // (see javax.xml.parsers.FactoryFinder.findClassLoader())
- try {
- Thread.currentThread().setContextClassLoader(this.classLoader);
- } catch (Exception e) {
- // ignore
- }
- }
-
- try {
- // FIXME (VG): We shouldn't have to specify these. Need to override
- // jaxp implementation of weblogic before initializing logger.
- // This piece of code is also required in the Cocoon class.
- String value = System.getProperty("javax.xml.parsers.SAXParserFactory");
- if (value != null && value.startsWith("weblogic")) {
- System.setProperty("javax.xml.parsers.SAXParserFactory", "org.apache.xerces.jaxp.SAXParserFactoryImpl");
- System.setProperty("javax.xml.parsers.DocumentBuilderFactory", "org.apache.xerces.jaxp.DocumentBuilderFactoryImpl");
- }
- } catch (SecurityException e) {
- // Ignore security exception
- System.out.println("CocoonPortlet: Could not check system properties, got: " + e);
- }
-
this.portletContext = conf.getPortletContext();
- this.appContext.put(Constants.CONTEXT_ENVIRONMENT_CONTEXT, new PortletContext(this.portletContext));
this.portletContextPath = this.portletContext.getRealPath("/");
- // first init the work-directory for the logger.
- // this is required if we are running inside a war file!
- final String workDirParam = getInitParameter("work-directory");
- if (workDirParam != null) {
- if (this.portletContextPath == null) {
- // No context path : consider work-directory as absolute
- this.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
- this.workDir = workDirParamFile;
- } else {
- // No : consider it relative to context path
- this.workDir = new File(portletContextPath, workDirParam);
- }
- }
- } else {
- // TODO: Check portlet specification
- this.workDir = (File) this.portletContext.getAttribute("javax.servlet.context.tempdir");
- if (this.workDir == null) {
- this.workDir = new File(this.portletContext.getRealPath("/WEB-INF/work"));
- }
- this.workDir = new File(workDir, "cocoon-files");
- }
- this.workDir.mkdirs();
- this.appContext.put(Constants.CONTEXT_WORK_DIR, workDir);
-
String path = this.portletContextPath;
// these two variables are just for debugging. We can't log at this point
// as the logger isn't initialized yet.
@@ -338,702 +203,93 @@
debugPathTwo = path;
}
- try {
- if (path.indexOf(':') > 1) {
- this.portletContextURL = path;
- } else {
- this.portletContextURL = 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 {
- this.portletContextURL = new File(path).toURL().toExternalForm();
- } catch (MalformedURLException ignored) {
- throw new PortletException("Unable to determine portlet context URL.", me);
- }
- }
- try {
- this.appContext.put("context-root", new URL(this.portletContextURL));
- } catch (MalformedURLException ignore) {
- // we simply ignore this
- }
-
- // Init logger
- initLogger();
-
- if (getLogger().isDebugEnabled()) {
- getLogger().debug("getRealPath for /: " + this.portletContextPath);
- if (this.portletContextPath == null) {
- getLogger().debug("getResource for /WEB-INF: " + debugPathOne);
- getLogger().debug("Path for Root: " + debugPathTwo);
- }
- }
-
- this.forceLoadParameter = getInitParameter("load-class", null);
- this.forceSystemProperty = getInitParameter("force-property", null);
-
- // Output some debug info
- if (getLogger().isDebugEnabled()) {
- getLogger().debug("Portlet Context URL: " + this.portletContextURL);
- if (workDirParam != null) {
- getLogger().debug("Using work-directory " + this.workDir);
- } else {
- getLogger().debug("Using default work-directory " + this.workDir);
- }
- }
- try {
- this.appContext.put(ContextHelper.CONTEXT_ROOT_URL, new URL(this.portletContextURL));
- } catch (MalformedURLException ignore) {
- // we simply ignore this
- }
-
- final String uploadDirParam = conf.getInitParameter("upload-directory");
- if (uploadDirParam != null) {
- if (this.portletContextPath == null) {
- this.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
- this.uploadDir = uploadDirParamFile;
- } else {
- // No : consider it relative to context path
- this.uploadDir = new File(portletContextPath, uploadDirParam);
- }
- }
- if (getLogger().isDebugEnabled()) {
- getLogger().debug("Using upload-directory " + this.uploadDir);
- }
- } else {
- this.uploadDir = new File(workDir, "upload-dir" + File.separator);
- if (getLogger().isDebugEnabled()) {
- getLogger().debug("Using default upload-directory " + this.uploadDir);
- }
- }
- this.uploadDir.mkdirs();
- this.appContext.put(Constants.CONTEXT_UPLOAD_DIR, this.uploadDir);
-
- this.enableUploads = getInitParameterAsBoolean("enable-uploads", ENABLE_UPLOADS);
-
- this.autoSaveUploads = getInitParameterAsBoolean("autosave-uploads", SAVE_UPLOADS_TO_DISK);
-
- String overwriteParam = getInitParameter("overwrite-uploads", "rename");
- // accepted values are deny|allow|rename - rename is default.
- if ("deny".equalsIgnoreCase(overwriteParam)) {
- this.allowOverwrite = false;
- this.silentlyRename = false;
- } else if ("allow".equalsIgnoreCase(overwriteParam)) {
- this.allowOverwrite = true;
- this.silentlyRename = false; // ignored in this case
- } else {
- // either rename is specified or unsupported value - default to rename.
- this.allowOverwrite = false;
- this.silentlyRename = true;
- }
-
- this.maxUploadSize = getInitParameterAsInteger("upload-max-size", MAX_UPLOAD_SIZE);
-
- String cacheDirParam = conf.getInitParameter("cache-directory");
- if (cacheDirParam != null) {
- if (this.portletContextPath == null) {
- this.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
- this.cacheDir = cacheDirParamFile;
- } else {
- // No : consider it relative to context path
- this.cacheDir = new File(portletContextPath, cacheDirParam);
- }
- }
- if (getLogger().isDebugEnabled()) {
- getLogger().debug("Using cache-directory " + this.cacheDir);
- }
- } else {
- this.cacheDir = IOUtils.createFile(workDir, "cache-dir" + File.separator);
- if (getLogger().isDebugEnabled()) {
- getLogger().debug("cache-directory was not set - defaulting to " + this.cacheDir);
- }
- }
- this.cacheDir.mkdirs();
- this.appContext.put(Constants.CONTEXT_CACHE_DIR, this.cacheDir);
-
- this.appContext.put(Constants.CONTEXT_CONFIG_URL,
- getConfigFile(conf.getInitParameter("configurations")));
- if (conf.getInitParameter("configurations") == null) {
- if (getLogger().isDebugEnabled()) {
- getLogger().debug("configurations was not set - defaulting to... ?");
- }
- }
-
- // get allow reload parameter, default is true
- this.allowReload = getInitParameterAsBoolean("allow-reload", ALLOW_RELOAD);
-
- String value = conf.getInitParameter("show-time");
- this.showTime = BooleanUtils.toBoolean(value) || (this.hiddenShowTime = "hide".equals(value));
- if (value == null) {
- if (getLogger().isDebugEnabled()) {
- getLogger().debug("show-time was not set - defaulting to false");
- }
- }
-
- parentServiceManagerClass = getInitParameter("parent-service-manager", null);
- if (parentServiceManagerClass != null) {
- int dividerPos = parentServiceManagerClass.indexOf('/');
- if (dividerPos != -1) {
- parentServiceManagerInitParam = parentServiceManagerClass.substring(dividerPos + 1);
- parentServiceManagerClass = parentServiceManagerClass.substring(0, dividerPos);
- }
- }
-
- this.containerEncoding = getInitParameter("container-encoding", "ISO-8859-1");
- this.defaultFormEncoding = getInitParameter("form-encoding", "ISO-8859-1");
-
- this.appContext.put(Constants.CONTEXT_DEFAULT_ENCODING, this.defaultFormEncoding);
- this.manageExceptions = getInitParameterAsBoolean("manage-exceptions", true);
-
- this.requestFactory = new RequestFactory(this.autoSaveUploads,
- this.uploadDir,
- this.allowOverwrite,
- this.silentlyRename,
- this.maxUploadSize,
- this.defaultFormEncoding);
-
- this.servletPath = getInitParameter("servlet-path", null);
- if (this.servletPath != null) {
- if (this.servletPath.startsWith("/")) {
- this.servletPath = this.servletPath.substring(1);
- }
- if (this.servletPath.endsWith("/")) {
- this.servletPath = servletPath.substring(0, servletPath.length() - 1);
- }
- }
-
- final String sessionScopeParam = getInitParameter("default-session-scope", "portlet");
- if ("application".equalsIgnoreCase(sessionScopeParam)) {
- this.defaultSessionScope = javax.portlet.PortletSession.APPLICATION_SCOPE;
- } else {
- this.defaultSessionScope = javax.portlet.PortletSession.PORTLET_SCOPE;
- }
-
- // Add the portlet configuration
- this.appContext.put(CONTEXT_PORTLET_CONFIG, conf);
- this.createCocoon();
- }
-
- /**
- * Dispose Cocoon when portlet is destroyed
- */
- public void destroy() {
- if (this.initClassLoader) {
- try {
- Thread.currentThread().setContextClassLoader(this.classLoader);
- } catch (Exception e) {
- }
- }
-
- if (this.cocoon != null) {
- if (getLogger().isDebugEnabled()) {
- getLogger().debug("Portlet destroyed - disposing Cocoon");
- }
- this.disposeCocoon();
- }
-
- ContainerUtil.dispose(this.parentServiceManager);
- }
-
- /**
- * Adds an URL to the classloader. Does nothing here, but can
- * be overriden.
- */
- protected void addClassLoaderURL(URL URL) {
- // Nothing
- }
-
- /**
- * Adds a directory to the classloader. Does nothing here, but can
- * be overriden.
- */
- protected void addClassLoaderDirectory(String dir) {
- // Nothing
- }
-
- /**
- * This builds the important ClassPath used by this Portlet. It
- * does so in a Portlet Engine neutral way. It uses the
- * <code>PortletContext</code>'s <code>getRealPath</code> method
- * to get the Portlet identified classes and lib directories.
- * It iterates in alphabetical order through every file in the
- * lib directory and adds it to the classpath.
- *
- * Also, we add the files to the ClassLoader for the Cocoon system.
- * In order to protect ourselves from skitzofrantic classloaders,
- * we need to work with a known one.
- *
- * We need to get this to work properly when Cocoon is in a war.
- *
- * @throws PortletException
- */
- protected String getClassPath() throws PortletException {
- StringBuffer buildClassPath = new StringBuffer();
-
- File root = null;
- if (portletContextPath != null) {
- // Old method. There *MUST* be a better method than this...
-
- String classDir = this.portletContext.getRealPath("/WEB-INF/classes");
- String libDir = this.portletContext.getRealPath("/WEB-INF/lib");
-
- if (libDir != null) {
- root = new File(libDir);
- }
-
- if (classDir != null) {
- buildClassPath.append(classDir);
-
- addClassLoaderDirectory(classDir);
- }
- } else {
- // New(ish) method for war'd deployments
- URL classDirURL = null;
- URL libDirURL = null;
-
- try {
- classDirURL = this.portletContext.getResource("/WEB-INF/classes");
- } catch (MalformedURLException me) {
- if (getLogger().isWarnEnabled()) {
- this.getLogger().warn("Unable to add WEB-INF/classes to the classpath", me);
- }
- }
-
- try {
- libDirURL = this.portletContext.getResource("/WEB-INF/lib");
- } catch (MalformedURLException me) {
- if (getLogger().isWarnEnabled()) {
- this.getLogger().warn("Unable to add WEB-INF/lib to the classpath", me);
- }
- }
-
- if (libDirURL != null && libDirURL.toExternalForm().startsWith("file:")) {
- root = new File(libDirURL.toExternalForm().substring("file:".length()));
- }
-
- if (classDirURL != null) {
- buildClassPath.append(classDirURL.toExternalForm());
-
- addClassLoaderURL(classDirURL);
- }
- }
-
- // Unable to find lib directory. Going the hard way.
- if (root == null) {
- root = extractLibraries();
- }
-
- if (root != null && root.isDirectory()) {
- File[] libraries = root.listFiles();
- Arrays.sort(libraries);
- for (int i = 0; i < libraries.length; i++) {
- String fullName = IOUtils.getFullFilename(libraries[i]);
- buildClassPath.append(File.pathSeparatorChar).append(fullName);
-
- addClassLoaderDirectory(fullName);
- }
- }
-
- buildClassPath.append(File.pathSeparatorChar)
- .append(SystemUtils.JAVA_CLASS_PATH);
-
- buildClassPath.append(File.pathSeparatorChar)
- .append(getExtraClassPath());
- return buildClassPath.toString();
- }
-
- private File extractLibraries() {
- try {
- URL manifestURL = this.portletContext.getResource("/META-INF/MANIFEST.MF");
- if (manifestURL == null) {
- this.getLogger().fatalError("Unable to get Manifest");
- return null;
- }
-
- Manifest mf = new Manifest(manifestURL.openStream());
- Attributes attr = mf.getMainAttributes();
- String libValue = attr.getValue("Cocoon-Libs");
- if (libValue == null) {
- this.getLogger().fatalError("Unable to get 'Cocoon-Libs' attribute from the Manifest");
- return null;
- }
-
- List libList = new ArrayList();
- for (StringTokenizer st = new StringTokenizer(libValue, " "); st.hasMoreTokens();) {
- libList.add(st.nextToken());
- }
-
- File root = new File(this.workDir, "lib");
- root.mkdirs();
-
- File[] oldLibs = root.listFiles();
- for (int i = 0; i < oldLibs.length; i++) {
- String oldLib = oldLibs[i].getName();
- if (!libList.contains(oldLib)) {
- this.getLogger().debug("Removing old library " + oldLibs[i]);
- oldLibs[i].delete();
- }
- }
-
- this.getLogger().warn("Extracting libraries into " + root);
- byte[] buffer = new byte[65536];
- for (Iterator i = libList.iterator(); i.hasNext();) {
- String libName = (String) i.next();
-
- long lastModified = -1;
- try {
- lastModified = Long.parseLong(attr.getValue("Cocoon-Lib-" + libName.replace('.', '_')));
- } catch (Exception e) {
- this.getLogger().debug("Failed to parse lastModified: " + attr.getValue("Cocoon-Lib-" + libName.replace('.', '_')));
- }
-
- File lib = new File(root, libName);
- if (lib.exists() && lib.lastModified() != lastModified) {
- this.getLogger().debug("Removing modified library " + lib);
- lib.delete();
- }
-
- InputStream is = this.portletContext.getResourceAsStream("/WEB-INF/lib/" + libName);
- if (is == null) {
- this.getLogger().warn("Skipping " + libName);
- } else {
- this.getLogger().debug("Extracting " + libName);
- OutputStream os = null;
- try {
- os = new FileOutputStream(lib);
- int count;
- while ((count = is.read(buffer)) > 0) {
- os.write(buffer, 0, count);
- }
- } finally {
- if (is != null) is.close();
- if (os != null) os.close();
- }
- }
-
- if (lastModified != -1) {
- lib.setLastModified(lastModified);
- }
- }
-
- return root;
- } catch (IOException e) {
- this.getLogger().fatalError("Exception while processing Manifest file", e);
- return null;
- }
- }
-
-
- /**
- * Retreives the "extra-classpath" attribute, that needs to be
- * added to the class path.
- *
- * @throws PortletException
- */
- protected String getExtraClassPath() throws PortletException {
- String extraClassPath = this.getInitParameter("extra-classpath");
- if (extraClassPath != null) {
- StringBuffer sb = new StringBuffer();
- StringTokenizer st = new StringTokenizer(extraClassPath, SystemUtils.PATH_SEPARATOR, false);
- int i = 0;
- while (st.hasMoreTokens()) {
- String s = st.nextToken();
- if (i++ > 0) {
- sb.append(File.pathSeparatorChar);
- }
- if ((s.charAt(0) == File.separatorChar) ||
- (s.charAt(1) == ':')) {
- if (getLogger().isDebugEnabled()) {
- getLogger().debug("extraClassPath is absolute: " + s);
- }
- sb.append(s);
-
- addClassLoaderDirectory(s);
- } else {
- if (s.indexOf("${") != -1) {
- String path = StringUtils.replaceToken(s);
- sb.append(path);
- if (getLogger().isDebugEnabled()) {
- getLogger().debug("extraClassPath is not absolute replacing using token: [" + s + "] : " + path);
- }
- addClassLoaderDirectory(path);
- } else {
- String path = null;
- if (this.portletContextPath != null) {
- path = this.portletContextPath + s;
- if (getLogger().isDebugEnabled()) {
- getLogger().debug("extraClassPath is not absolute pre-pending context path: " + path);
- }
- } else {
- path = this.workDir.toString() + s;
- if (getLogger().isDebugEnabled()) {
- getLogger().debug("extraClassPath is not absolute pre-pending work-directory: " + path);
- }
- }
- sb.append(path);
- addClassLoaderDirectory(path);
- }
- }
- }
- return sb.toString();
- }
- return "";
- }
-
- /**
- * Set up the log level and path. The default log level is
- * Priority.ERROR, although it can be overwritten by the parameter
- * "log-level". The log system goes to both a file and the Portlet
- * container's log system. Only messages that are Priority.ERROR
- * and above go to the portlet context. The log messages can
- * be as restrictive (Priority.FATAL_ERROR and above) or as liberal
- * (Priority.DEBUG and above) as you want that get routed to the
- * file.
- */
- protected void initLogger() {
- final String logLevel = getInitParameter("log-level", "INFO");
-
- final String accesslogger = getInitParameter("portlet-logger", "cocoon");
-
- final Priority logPriority = Priority.getPriorityForName(logLevel);
-
- final CocoonLogFormatter formatter = new CocoonLogFormatter();
- formatter.setFormat("%7.7{priority} %{time} [%8.8{category}] " +
- "(%{uri}) %{thread}/%{class:short}: %{message}\\n%{throwable}");
- final PortletOutputLogTarget servTarget = new PortletOutputLogTarget(this.portletContext, formatter);
-
- final Hierarchy defaultHierarchy = Hierarchy.getDefaultHierarchy();
- final ErrorHandler errorHandler = new DefaultErrorHandler();
- defaultHierarchy.setErrorHandler(errorHandler);
- defaultHierarchy.setDefaultLogTarget(servTarget);
- defaultHierarchy.setDefaultPriority(logPriority);
- final Logger logger = new LogKitLogger(Hierarchy.getDefaultHierarchy().getLoggerFor(""));
- final String loggerManagerClass =
- this.getInitParameter("logger-class", LogKitLoggerManager.class.getName());
-
- // the log4j support requires currently that the log4j system is already configured elsewhere
-
- final LoggerManager loggerManager =
- newLoggerManager(loggerManagerClass, defaultHierarchy);
- ContainerUtil.enableLogging(loggerManager, logger);
-
- final DefaultContext subcontext = new DefaultContext(this.appContext);
- subcontext.put("portlet-context", this.portletContext);
- if (this.portletContextPath == null) {
- File logSCDir = new File(this.workDir, "log");
- logSCDir.mkdirs();
- if (getLogger().isWarnEnabled()) {
- getLogger().warn("Setting context-root for LogKit to " + logSCDir);
- }
- subcontext.put("context-root", logSCDir.toString());
- } else {
- subcontext.put("context-root", this.portletContextPath);
- }
-
- try {
- ContainerUtil.contextualize(loggerManager, subcontext);
- this.loggerManager = loggerManager;
-
- if (loggerManager instanceof Configurable) {
- //Configure the logkit management
- String logkitConfig = getInitParameter("logkit-config", "/WEB-INF/logkit.xconf");
-
- // test if this is a qualified url
- InputStream is = null;
- if (logkitConfig.indexOf(':') == -1) {
- is = this.portletContext.getResourceAsStream(logkitConfig);
- if (is == null) is = new FileInputStream(logkitConfig);
- } else {
- URL logkitURL = new URL(logkitConfig);
- is = logkitURL.openStream();
- }
- final DefaultConfigurationBuilder builder = new DefaultConfigurationBuilder();
- final Configuration conf = builder.build(is);
- ContainerUtil.configure(loggerManager, conf);
- }
-
- // let's configure log4j
- final String log4jConfig = getInitParameter("log4j-config", null);
- if ( log4jConfig != null ) {
- final Log4JConfigurator configurator = new Log4JConfigurator(subcontext);
-
- // test if this is a qualified url
- InputStream is = null;
- if ( log4jConfig.indexOf(':') == -1) {
- is = this.portletContext.getResourceAsStream(log4jConfig);
- if (is == null) is = new FileInputStream(log4jConfig);
- } else {
- final URL log4jURL = new URL(log4jConfig);
- is = log4jURL.openStream();
- }
- configurator.doConfigure(is, LogManager.getLoggerRepository());
- }
-
- ContainerUtil.initialize(loggerManager);
- } catch (Exception e) {
- errorHandler.error("Could not set up Cocoon Logger, will use screen instead", e, null);
- }
-
- this.log = this.loggerManager.getLoggerForCategory(accesslogger);
- }
-
- private LoggerManager newLoggerManager(String loggerManagerClass, Hierarchy hierarchy) {
- if (loggerManagerClass.equals(LogKitLoggerManager.class.getName())) {
- return new LogKitLoggerManager(hierarchy);
- } else if (loggerManagerClass.equals(Log4JLoggerManager.class.getName()) ||
- loggerManagerClass.equalsIgnoreCase("LOG4J")) {
- return new Log4JLoggerManager();
- } else {
+ try {
+ if (path.indexOf(':') > 1) {
+ this.portletContextURL = path;
+ } else {
+ this.portletContextURL = 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 {
- Class clazz = Class.forName(loggerManagerClass);
- return (LoggerManager)clazz.newInstance();
- } catch (Exception e) {
- return new LogKitLoggerManager(hierarchy);
+ this.portletContextURL = new File(path).toURL().toExternalForm();
+ } catch (MalformedURLException ignored) {
+ throw new PortletException("Unable to determine portlet context URL.", me);
}
}
- }
-
- /**
- * Set the ConfigFile for the Cocoon object.
- *
- * @param configFileName The file location for the cocoon.xconf
- *
- * @throws PortletException
- */
- private URL getConfigFile(final String configFileName)
- throws PortletException {
- final String usedFileName;
- if (configFileName == null) {
- if (getLogger().isWarnEnabled()) {
- getLogger().warn("Portlet initialization argument 'configurations' not specified, attempting to use '/WEB-INF/cocoon.xconf'");
+ try {
+ // FIXME (VG): We shouldn't have to specify these. Need to override
+ // jaxp implementation of weblogic before initializing logger.
+ // This piece of code is also required in the Cocoon class.
+ String value = System.getProperty("javax.xml.parsers.SAXParserFactory");
+ if (value != null && value.startsWith("weblogic")) {
+ System.setProperty("javax.xml.parsers.SAXParserFactory", "org.apache.xerces.jaxp.SAXParserFactoryImpl");
+ System.setProperty("javax.xml.parsers.DocumentBuilderFactory", "org.apache.xerces.jaxp.DocumentBuilderFactoryImpl");
}
- usedFileName = "/WEB-INF/cocoon.xconf";
- } else {
- usedFileName = configFileName;
+ } catch (SecurityException e) {
+ // Ignore security exception
+ this.portletContext.log("CocoonPortlet: Could not check system properties, got: " + e);
}
- if (getLogger().isDebugEnabled()) {
- getLogger().debug("Using configuration file: " + usedFileName);
- }
+ // initialize settings
+ PortletBootstrapEnvironment env = new PortletBootstrapEnvironment(conf, this.classLoader, this.portletContextPath, this.portletContextURL);
- URL result;
try {
- // test if this is a qualified url
- if (usedFileName.indexOf(':') == -1) {
- result = this.portletContext.getResource(usedFileName);
- } else {
- result = new URL(usedFileName);
+ this.coreUtil = new CoreUtil(env);
+ this.appContext = coreUtil.getCore().getContext();
+ this.log = env.logger;
+ } catch (Exception e) {
+ if ( e instanceof PortletException ) {
+ throw (PortletException)e;
}
- } catch (Exception mue) {
- String msg = "Init parameter 'configurations' is invalid : " + usedFileName;
- getLogger().error(msg, mue);
- throw new PortletException(msg, mue);
+ throw new PortletException(e);
}
- if (result == null) {
- File resultFile = new File(usedFileName);
- if (resultFile.isFile()) {
- try {
- result = resultFile.getCanonicalFile().toURL();
- } catch (Exception e) {
- String msg = "Init parameter 'configurations' is invalid : " + usedFileName;
- getLogger().error(msg, e);
- throw new PortletException(msg, e);
- }
+ if (getLogger().isDebugEnabled()) {
+ getLogger().debug("getRealPath for /: " + this.portletContextPath);
+ if (this.portletContextPath == null) {
+ getLogger().debug("getResource for /WEB-INF: " + debugPathOne);
+ getLogger().debug("Path for Root: " + debugPathTwo);
}
}
- if (result == null) {
- String msg = "Init parameter 'configuration' doesn't name an existing resource : " + usedFileName;
- getLogger().error(msg);
- throw new PortletException(msg);
- }
- return result;
- }
-
- /**
- * 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>
- */
- private void forceLoad() {
- if (this.forceLoadParameter != null) {
- StringTokenizer fqcnTokenizer = new StringTokenizer(forceLoadParameter, " \t\r\n\f;,", false);
+ this.containerEncoding = getInitParameter("container-encoding", "ISO-8859-1");
+ this.settings = this.coreUtil.getCore().getSettings();
+ this.requestFactory = new RequestFactory(this.settings.isAutosaveUploads(),
+ new File(this.settings.getUploadDirectory()),
+ this.settings.isAllowOverwrite(),
+ this.settings.isSilentlyRename(),
+ this.settings.getMaxUploadSize(),
+ this.settings.getFormEncoding());
- while (fqcnTokenizer.hasMoreTokens()) {
- final String fqcn = fqcnTokenizer.nextToken().trim();
+ final String sessionScopeParam = getInitParameter("default-session-scope", "portlet");
+ if ("application".equalsIgnoreCase(sessionScopeParam)) {
+ this.defaultSessionScope = javax.portlet.PortletSession.APPLICATION_SCOPE;
+ } else {
+ this.defaultSessionScope = javax.portlet.PortletSession.PORTLET_SCOPE;
+ }
- try {
- if (getLogger().isDebugEnabled()) {
- getLogger().debug("Trying to load class: " + fqcn);
- }
- ClassUtils.loadClass(fqcn).newInstance();
- } catch (Exception e) {
- if (getLogger().isWarnEnabled()) {
- getLogger().warn("Could not force-load class: " + fqcn, e);
- }
- // Do not throw an exception, because it is not a fatal error.
- }
- }
+ try {
+ this.exception = null;
+ this.cocoon = this.coreUtil.createCocoon();
+ } catch (Exception e) {
+ this.exception = e;
}
}
/**
- * 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.
+ * Dispose Cocoon when portlet is destroyed
*/
- private void forceProperty() {
- if (this.forceSystemProperty != null) {
- StringTokenizer tokenizer = new StringTokenizer(forceSystemProperty, " \t\r\n\f;,", false);
-
- java.util.Properties systemProps = System.getProperties();
- while (tokenizer.hasMoreTokens()) {
- final String property = tokenizer.nextToken().trim();
- if (property.indexOf('=') == -1) {
- continue;
- }
- try {
- String key = property.substring(0, property.indexOf('='));
- String value = property.substring(property.indexOf('=') + 1);
- if (value.indexOf("${") != -1) {
- value = StringUtils.replaceToken(value);
- }
- if (getLogger().isDebugEnabled()) {
- getLogger().debug("setting " + key + "=" + value);
- }
- systemProps.setProperty(key, value);
- } catch (Exception e) {
- if (getLogger().isWarnEnabled()) {
- getLogger().warn("Could not set property: " + property, e);
- }
- // Do not throw an exception, because it is not a fatal error.
- }
- }
- System.setProperties(systemProps);
+ public void destroy() {
+ this.portletContext.log("Destroying Cocoon Portlet.");
+ if ( this.coreUtil != null ) {
+ this.coreUtil.destroy();
+ this.coreUtil = null;
}
+ super.destroy();
}
/**
@@ -1045,7 +301,7 @@
/* HACK for reducing class loader problems. */
/* example: xalan extensions fail if someone adds xalan jars in tomcat3.2.1/lib */
- if (this.initClassLoader) {
+ if (this.settings.isInitClassloader()) {
try {
Thread.currentThread().setContextClassLoader(this.classLoader);
} catch (Exception e) {
@@ -1061,7 +317,7 @@
// get the request (wrapped if contains multipart-form data)
ActionRequest request;
try {
- if (this.enableUploads) {
+ if (this.settings.isEnableUploads()) {
request = requestFactory.getServletRequest(req);
} else {
request = req;
@@ -1077,7 +333,12 @@
}
// Get the cocoon engine instance
- getCocoon(request.getParameter(Constants.RELOAD_PARAM));
+ try {
+ this.exception = null;
+ this.cocoon = this.coreUtil.getCocoon(null, request.getParameter(Constants.RELOAD_PARAM));
+ } catch (Exception e) {
+ this.exception = e;
+ }
// Check if cocoon was initialized
if (this.cocoon == null) {
@@ -1216,7 +477,7 @@
/* HACK for reducing class loader problems. */
/* example: xalan extensions fail if someone adds xalan jars in tomcat3.2.1/lib */
- if (this.initClassLoader) {
+ if (this.settings.isInitClassloader()) {
try {
Thread.currentThread().setContextClassLoader(this.classLoader);
} catch (Exception e) {
@@ -1233,7 +494,12 @@
RenderRequest request = req;
// Get the cocoon engine instance
- getCocoon(request.getParameter(Constants.RELOAD_PARAM));
+ try {
+ this.exception = null;
+ this.cocoon = this.coreUtil.getCocoon(null, request.getParameter(Constants.RELOAD_PARAM));
+ } catch (Exception e) {
+ this.exception = e;
+ }
// Check if cocoon was initialized
if (this.cocoon == null) {
@@ -1348,12 +614,12 @@
if (contentType != null && contentType.equals("text/html")) {
String showTime = request.getParameter(Constants.SHOWTIME_PARAM);
- boolean show = this.showTime;
+ boolean show = this.settings.isShowTime();
if (showTime != null) {
show = !showTime.equalsIgnoreCase("no");
}
if (show) {
- boolean hide = this.hiddenShowTime;
+ boolean hide = this.settings.isHideShowTime();
if (showTime != null) {
hide = showTime.equalsIgnoreCase("hide");
}
@@ -1431,7 +697,7 @@
String uri, String title, String message, String description,
Exception e)
throws IOException, PortletException {
- if (this.manageExceptions) {
+ if (this.settings.isManageExceptions()) {
if (env != null) {
env.tryResetResponse();
} else {
@@ -1484,7 +750,7 @@
String formEncoding = req.getParameter("cocoon-form-encoding");
if (formEncoding == null) {
- formEncoding = this.defaultFormEncoding;
+ formEncoding = this.settings.getFormEncoding();
}
env = new PortletEnvironment(servletPath,
pathInfo,
@@ -1513,7 +779,7 @@
String formEncoding = req.getParameter("cocoon-form-encoding");
if (formEncoding == null) {
- formEncoding = this.defaultFormEncoding;
+ formEncoding = this.settings.getFormEncoding();
}
env = new PortletEnvironment(servletPath,
pathInfo,
@@ -1529,103 +795,6 @@
return env;
}
- /**
- * 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 synchronized ServiceManager getParentServiceManager() {
- ContainerUtil.dispose(this.parentServiceManager);
-
- this.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(this.parentServiceManager, this.getLogger());
- ContainerUtil.contextualize(this.parentServiceManager, this.appContext);
- ContainerUtil.initialize(this.parentServiceManager);
- } catch (Exception e) {
- if (getLogger().isErrorEnabled()) {
- getLogger().error("Could not initialize parent component manager.", e);
- }
- }
- }
- return parentServiceManager;
- }
-
- /**
- * Creates the Cocoon object and handles exception handling.
- */
- private synchronized void createCocoon()
- throws PortletException {
-
- /* HACK for reducing class loader problems. */
- /* example: xalan extensions fail if someone adds xalan jars in tomcat3.2.1/lib */
- if (this.initClassLoader) {
- try {
- Thread.currentThread().setContextClassLoader(this.classLoader);
- } catch (Exception e) {
- }
- }
-
- updateEnvironment();
- forceLoad();
- forceProperty();
-
- try {
- URL configFile = (URL) this.appContext.get(Constants.CONTEXT_CONFIG_URL);
- if (getLogger().isInfoEnabled()) {
- getLogger().info("Reloading from: " + configFile.toExternalForm());
- }
- Cocoon c = (Cocoon) ClassUtils.newInstance("org.apache.cocoon.Cocoon");
- ContainerUtil.enableLogging(c, getCocoonLogger());
- c.setLoggerManager(getLoggerManager());
- 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) {
- if (getLogger().isErrorEnabled()) {
- getLogger().error("Exception reloading", e);
- }
- this.exception = e;
- disposeCocoon();
- }
- }
-
- private Logger getCocoonLogger() {
- final String rootlogger = getInitParameter("cocoon-logger");
- if (rootlogger != null) {
- return this.getLoggerManager().getLoggerForCategory(rootlogger);
- } else {
- return getLogger();
- }
- }
-
- /**
- * 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 PortletException {
- this.appContext.put(Constants.CONTEXT_CLASS_LOADER, classLoader);
- this.appContext.put(Constants.CONTEXT_CLASSPATH, getClassPath());
- }
-
private String processTime(long time) {
StringBuffer out = new StringBuffer(PROCESSED_BY);
if (time <= SECOND) {
@@ -1645,51 +814,6 @@
}
/**
- * Gets the current cocoon object. Reload cocoon if configuration
- * changed or we are reloading.
- */
- private void getCocoon(final String reloadParam)
- throws PortletException {
- if (this.allowReload) {
- boolean reload = false;
-
- if (this.cocoon != null) {
- if (this.cocoon.modifiedSince(this.creationTime)) {
- if (getLogger().isInfoEnabled()) {
- getLogger().info("Configuration changed reload attempt");
- }
- reload = true;
- } else if (reloadParam != null) {
- if (getLogger().isInfoEnabled()) {
- getLogger().info("Forced reload attempt");
- }
- reload = true;
- }
- } else if (reloadParam != null) {
- if (getLogger().isInfoEnabled()) {
- getLogger().info("Invalid configurations reload");
- }
- reload = true;
- }
-
- if (reload) {
- initLogger();
- createCocoon();
- }
- }
- }
-
- /**
- * Destroy Cocoon
- */
- private final void disposeCocoon() {
- if (this.cocoon != null) {
- ContainerUtil.dispose(this.cocoon);
- this.cocoon = null;
- }
- }
-
- /**
* Get an initialisation parameter. The value is trimmed, and null is returned if the trimmed value
* is empty.
*/
@@ -1706,7 +830,7 @@
}
/** Convenience method to access portlet parameters */
- protected String getInitParameter(String name, String defaultValue) {
+ private String getInitParameter(String name, String defaultValue) {
String result = getInitParameter(name);
if (result == null) {
if (getLogger() != null && getLogger().isDebugEnabled()) {
@@ -1719,7 +843,7 @@
}
/** Convenience method to access boolean portlet parameters */
- protected boolean getInitParameterAsBoolean(String name, boolean defaultValue) {
+ private boolean getInitParameterAsBoolean(String name, boolean defaultValue) {
String value = getInitParameter(name);
if (value == null) {
if (getLogger() != null && getLogger().isDebugEnabled()) {
@@ -1731,7 +855,7 @@
return BooleanUtils.toBoolean(value);
}
- protected int getInitParameterAsInteger(String name, int defaultValue) {
+ private int getInitParameterAsInteger(String name, int defaultValue) {
String value = getInitParameter(name);
if (value == null) {
if (getLogger() != null && getLogger().isDebugEnabled()) {
@@ -1747,7 +871,338 @@
return this.log;
}
- protected LoggerManager getLoggerManager() {
- return this.loggerManager;
+ protected static final class PortletBootstrapEnvironment
+ implements BootstrapEnvironment {
+
+ private final PortletConfig config;
+ private final ClassLoader classLoader;
+ private final File writeableContextPath;
+ private final String contextPath;
+ public Logger logger;
+
+ public PortletBootstrapEnvironment(PortletConfig config,
+ ClassLoader cl,
+ String writeablePath,
+ String path) {
+ this.config = config;
+ this.classLoader = cl;
+ if ( writeablePath == null ) {
+ this.writeableContextPath = null;
+ } else {
+ this.writeableContextPath = new File(writeablePath);
+ }
+ this.contextPath = path;
+ }
+
+ /**
+ * @see org.apache.cocoon.core.BootstrapEnvironment#log(java.lang.String)
+ */
+ public void log(String message) {
+ this.config.getPortletContext().log(message);
+ }
+
+ /**
+ * @see org.apache.cocoon.core.BootstrapEnvironment#log(java.lang.String, java.lang.Throwable)
+ */
+ public void log(String message, Throwable error) {
+ this.config.getPortletContext().log(message, error);
+ }
+
+ /**
+ * @see org.apache.cocoon.core.BootstrapEnvironment#setLogger(org.apache.avalon.framework.logger.Logger)
+ */
+ public void setLogger(Logger rootLogger) {
+ this.logger = rootLogger;
+ }
+
+ /**
+ * @see org.apache.cocoon.core.BootstrapEnvironment#getInputStream(java.lang.String)
+ */
+ public InputStream getInputStream(String path) {
+ return this.config.getPortletContext().getResourceAsStream(path);
+ }
+
+ /**
+ * @see org.apache.cocoon.core.BootstrapEnvironment#configure(org.apache.cocoon.configuration.Settings)
+ */
+ public void configure(Settings settings) {
+ // fill from the portlet parameters
+ SettingsHelper.fill(settings, this.config);
+ if ( settings.getWorkDirectory() == null ) {
+ final File workDir = (File)this.config.getPortletContext().getAttribute("javax.servlet.context.tempdir");
+ settings.setWorkDirectory(workDir.getAbsolutePath());
+ }
+ }
+
+ /**
+ * @see org.apache.cocoon.core.BootstrapEnvironment#getInitClassLoader()
+ */
+ public ClassLoader getInitClassLoader() {
+ return this.classLoader;
+ }
+
+ /**
+ * @see org.apache.cocoon.core.BootstrapEnvironment#getEnvironmentContext()
+ */
+ public Context getEnvironmentContext() {
+ return new PortletContext(this.config.getPortletContext());
+ }
+
+ /**
+ * @see org.apache.cocoon.core.BootstrapEnvironment#getContextURL()
+ */
+ public String getContextURL() {
+ return this.contextPath;
+ }
+
+
+ /**
+ * @see org.apache.cocoon.core.BootstrapEnvironment#getContextForWriting()
+ */
+ public File getContextForWriting() {
+ return this.writeableContextPath;
+ }
+
+ /**
+ * @see org.apache.cocoon.core.BootstrapEnvironment#getDefaultLogTarget()
+ */
+ public LogTarget getDefaultLogTarget() {
+ final CocoonLogFormatter formatter = new CocoonLogFormatter();
+ formatter.setFormat("%7.7{priority} %{time} [%8.8{category}] " +
+ "(%{uri}) %{thread}/%{class:short}: %{message}\\n%{throwable}");
+ return new PortletOutputLogTarget(this.config.getPortletContext(), formatter);
+ }
+
+ /**
+ * @see org.apache.cocoon.core.BootstrapEnvironment#configureLoggingContext(org.apache.avalon.framework.context.DefaultContext)
+ */
+ public void configureLoggingContext(DefaultContext context) {
+ context.put("servlet-context", this.config.getPortletContext());
+ }
+
+ /**
+ * @see org.apache.cocoon.core.BootstrapEnvironment#configure(org.apache.avalon.framework.context.DefaultContext)
+ */
+ public void configure(DefaultContext context) {
+ // Add the portlet configuration
+ context.put(CONTEXT_PORTLET_CONFIG, this.config);
+ }
+
+ /**
+ * @see org.apache.cocoon.core.BootstrapEnvironment#getConfigFile(java.lang.String)
+ */
+ public URL getConfigFile(final String configFileName)
+ throws Exception {
+ final String usedFileName;
+
+ if (configFileName == null) {
+ if (this.logger.isWarnEnabled()) {
+ this.logger.warn("Servlet initialization argument 'configurations' not specified, attempting to use '/WEB-INF/cocoon.xconf'");
+ }
+ usedFileName = "/WEB-INF/cocoon.xconf";
+ } else {
+ usedFileName = configFileName;
+ }
+
+ if (this.logger.isDebugEnabled()) {
+ this.logger.debug("Using configuration file: " + usedFileName);
+ }
+
+ URL result;
+ try {
+ // test if this is a qualified url
+ if (usedFileName.indexOf(':') == -1) {
+ result = this.config.getPortletContext().getResource(usedFileName);
+ } else {
+ result = new URL(usedFileName);
+ }
+ } catch (Exception mue) {
+ String msg = "Init parameter 'configurations' is invalid : " + usedFileName;
+ this.logger.error(msg, mue);
+ throw new PortletException(msg, mue);
+ }
+
+ if (result == null) {
+ File resultFile = new File(usedFileName);
+ if (resultFile.isFile()) {
+ try {
+ result = resultFile.getCanonicalFile().toURL();
+ } catch (Exception e) {
+ String msg = "Init parameter 'configurations' is invalid : " + usedFileName;
+ this.logger.error(msg, e);
+ throw new PortletException(msg, e);
+ }
+ }
+ }
+
+ if (result == null) {
+ String msg = "Init parameter 'configuration' doesn't name an existing resource : " + usedFileName;
+ this.logger.error(msg);
+ throw new PortletException(msg);
+ }
+ return result;
+ }
+
+ /**
+ * 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
+ * to get the Servlet 2.2 identified classes and lib directories.
+ * It iterates in alphabetical order through every file in the
+ * lib directory and adds it to the classpath.
+ *
+ * Also, we add the files to the ClassLoader for the Cocoon system.
+ * In order to protect ourselves from skitzofrantic classloaders,
+ * we need to work with a known one.
+ *
+ * We need to get this to work properly when Cocoon is in a war.
+ *
+ * @throws ServletException
+ */
+ public String getClassPath(Settings settings) {
+ StringBuffer buildClassPath = new StringBuffer();
+
+ File root = null;
+ if (this.getContextForWriting() != null) {
+ // Old method. There *MUST* be a better method than this...
+
+ String classDir = this.config.getPortletContext().getRealPath("/WEB-INF/classes");
+ String libDir = this.config.getPortletContext().getRealPath("/WEB-INF/lib");
+
+ if (libDir != null) {
+ root = new File(libDir);
+ }
+
+ if (classDir != null) {
+ buildClassPath.append(classDir);
+ }
+ } else {
+ // New(ish) method for war'd deployments
+ URL classDirURL = null;
+ URL libDirURL = null;
+
+ try {
+ classDirURL = this.config.getPortletContext().getResource("/WEB-INF/classes");
+ } catch (MalformedURLException me) {
+ this.logger.warn("Unable to add WEB-INF/classes to the classpath", me);
+ }
+
+ try {
+ libDirURL = this.config.getPortletContext().getResource("/WEB-INF/lib");
+ } catch (MalformedURLException me) {
+ this.logger.warn("Unable to add WEB-INF/lib to the classpath", me);
+ }
+
+ if (libDirURL != null && libDirURL.toExternalForm().startsWith("file:")) {
+ root = new File(libDirURL.toExternalForm().substring("file:".length()));
+ }
+
+ if (classDirURL != null) {
+ buildClassPath.append(classDirURL.toExternalForm());
+ }
+ }
+
+ // Unable to find lib directory. Going the hard way.
+ if (root == null) {
+ root = this.extractLibraries(settings);
+ }
+
+ if (root != null && root.isDirectory()) {
+ File[] libraries = root.listFiles();
+ Arrays.sort(libraries);
+ for (int i = 0; i < libraries.length; i++) {
+ String fullName = IOUtils.getFullFilename(libraries[i]);
+ buildClassPath.append(File.pathSeparatorChar).append(fullName);
+ }
+ }
+
+ buildClassPath.append(File.pathSeparatorChar)
+ .append(SystemUtils.JAVA_CLASS_PATH);
+
+ return buildClassPath.toString();
+ }
+
+ private File extractLibraries(Settings settings) {
+ try {
+ URL manifestURL = this.config.getPortletContext().getResource("/META-INF/MANIFEST.MF");
+ if (manifestURL == null) {
+ this.logger.fatalError("Unable to get Manifest");
+ return null;
+ }
+
+ Manifest mf = new Manifest(manifestURL.openStream());
+ Attributes attr = mf.getMainAttributes();
+ String libValue = attr.getValue("Cocoon-Libs");
+ if (libValue == null) {
+ this.logger.fatalError("Unable to get 'Cocoon-Libs' attribute from the Manifest");
+ return null;
+ }
+
+ List libList = new ArrayList();
+ for (StringTokenizer st = new StringTokenizer(libValue, " "); st.hasMoreTokens();) {
+ libList.add(st.nextToken());
+ }
+
+ File root = new File(settings.getWorkDirectory(), "lib");
+ root.mkdirs();
+
+ File[] oldLibs = root.listFiles();
+ for (int i = 0; i < oldLibs.length; i++) {
+ String oldLib = oldLibs[i].getName();
+ if (!libList.contains(oldLib)) {
+ this.logger.debug("Removing old library " + oldLibs[i]);
+ oldLibs[i].delete();
+ }
+ }
+
+ this.logger.warn("Extracting libraries into " + root);
+ byte[] buffer = new byte[65536];
+ for (Iterator i = libList.iterator(); i.hasNext();) {
+ String libName = (String) i.next();
+
+ long lastModified = -1;
+ try {
+ lastModified = Long.parseLong(attr.getValue("Cocoon-Lib-" + libName.replace('.', '_')));
+ } catch (Exception e) {
+ this.logger.debug("Failed to parse lastModified: " + attr.getValue("Cocoon-Lib-" + libName.replace('.', '_')));
+ }
+
+ File lib = new File(root, libName);
+ if (lib.exists() && lib.lastModified() != lastModified) {
+ this.logger.debug("Removing modified library " + lib);
+ lib.delete();
+ }
+
+ InputStream is = this.config.getPortletContext().getResourceAsStream("/WEB-INF/lib/" + libName);
+ if (is == null) {
+ this.logger.warn("Skipping " + libName);
+ } else {
+ this.logger.debug("Extracting " + libName);
+ OutputStream os = null;
+ try {
+ os = new FileOutputStream(lib);
+ int count;
+ while ((count = is.read(buffer)) > 0) {
+ os.write(buffer, 0, count);
+ }
+ } finally {
+ if (is != null) is.close();
+ if (os != null) os.close();
+ }
+ }
+
+ if (lastModified != -1) {
+ lib.setLastModified(lastModified);
+ }
+ }
+
+ return root;
+ } catch (IOException e) {
+ this.logger.fatalError("Exception while processing Manifest file", e);
+ return null;
+ }
+ }
+
}
+
}
Re: svn commit: r164118 - /cocoon/blocks/supported/portal/trunk/java/org/apache/cocoon/portlet/CocoonPortlet.java
Posted by Carsten Ziegeler <cz...@apache.org>.
Vadim Gritsenko wrote:
> cziegeler@apache.org wrote:
>
>>Start using CoreUtil
>
>
>>- private LoggerManager loggerManager;
>>-
>>- /**
>>- * The time the cocoon instance was created
>>- */
>>- protected long creationTime = 0;
>
>
> Great. This code duplication always bugged me... (But not enough to start
> rewrite ;-)
>
Yes, me too :)
I want to reduce the duplication to a minimum - this includes using the
CoreUtil for the CLI as well; once we use the same code for all
environments we can build nice little features on top of it :)
Carsten
--
Carsten Ziegeler - Open Source Group, S&N AG
http://www.s-und-n.de
http://www.osoco.org/weblogs/rael/
Re: svn commit: r164118 - /cocoon/blocks/supported/portal/trunk/java/org/apache/cocoon/portlet/CocoonPortlet.java
Posted by Vadim Gritsenko <va...@reverycodes.com>.
cziegeler@apache.org wrote:
> Start using CoreUtil
> - private LoggerManager loggerManager;
> -
> - /**
> - * The time the cocoon instance was created
> - */
> - protected long creationTime = 0;
Great. This code duplication always bugged me... (But not enough to start
rewrite ;-)
Vadim