// ======================================================================== // Copyright (c) 2010-2011 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // All rights reserved. This program and the accompanying materials // are made available under the terms of the Eclipse Public License v1.0 // and Apache License v2.0 which accompanies this distribution. // The Eclipse Public License is available at // http://www.eclipse.org/legal/epl-v10.html // The Apache License v2.0 is available at // http://www.opensource.org/licenses/apache2.0.php // You may elect to redistribute this code under either of these licenses. // ======================================================================== package org.eclipse.jetty.overlays; import java.io.IOException; import java.security.PermissionCollection; import java.util.Map; import org.eclipse.jetty.http.MimeTypes; import org.eclipse.jetty.server.ResourceCache; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.util.component.AggregateLifeCycle; import org.eclipse.jetty.util.component.Destroyable; import org.eclipse.jetty.util.resource.Resource; import org.eclipse.jetty.webapp.ClasspathPattern; import org.eclipse.jetty.webapp.WebAppClassLoader; import org.eclipse.jetty.webapp.WebAppContext; import org.eclipse.jetty.xml.XmlConfiguration; /** * A Cloudtide template context. * <p> * This class is configured by the template.xml files and is used to control the * shared resource cache and classloader. * <p> * This class is an AggregateLifeCycle, so dependent beans may be added to the template and will be started, stopped and destroyed with the template. * The template is started after the template.xml file have been applied. It is stopped and destroyed after the last instance using the template is undeployed. */ public class TemplateContext extends AggregateLifeCycle implements WebAppClassLoader.Context, Destroyable { private final ClassLoader _libLoader; private final Resource _baseResource; private final ResourceCache _resourceCache; private final Server _server; private final MimeTypes _mimeTypes; private final WebAppClassLoader _webappLoader; private ClasspathPattern _systemClasses; private ClasspathPattern _serverClasses; private PermissionCollection _permissions; private boolean _parentLoaderPriority; private String _extraClasspath; private Map<String, Object> _idMap; public ClassLoader getLibLoader() { return _libLoader; } public TemplateContext() { _server=null; _baseResource=null; _mimeTypes=new MimeTypes(); _resourceCache=null; _webappLoader=null; _libLoader=null; } public TemplateContext(String key, Server server,Resource baseResource, ClassLoader libLoader) throws IOException { _server=server; _baseResource=baseResource; _mimeTypes=new MimeTypes(); _resourceCache=new ResourceCache(null,baseResource,_mimeTypes); String[] patterns = (String[])_server.getAttribute(WebAppContext.SERVER_SRV_CLASSES); _serverClasses=new ClasspathPattern(patterns==null?WebAppContext.__dftServerClasses:patterns); patterns = (String[])_server.getAttribute(WebAppContext.SERVER_SYS_CLASSES); _systemClasses=new ClasspathPattern(patterns==null?WebAppContext.__dftSystemClasses:patterns); _libLoader=libLoader; // Is this a webapp or a normal context Resource classes=getBaseResource().addPath("WEB-INF/classes/"); Resource lib=getBaseResource().addPath("WEB-INF/lib/"); if (classes.exists() && classes.isDirectory() || lib.exists() && lib.isDirectory()) { _webappLoader=new WebAppClassLoader(_libLoader,this); _webappLoader.setName(key); if (classes.exists()) _webappLoader.addClassPath(classes); if (lib.exists()) _webappLoader.addJars(lib); } else _webappLoader=null; } /* ------------------------------------------------------------ */ public Resource getBaseResource() { return _baseResource; } /* ------------------------------------------------------------ */ /** * @return Comma or semicolon separated path of filenames or URLs * pointing to directories or jar files. Directories should end * with '/'. */ public String getExtraClasspath() { return _extraClasspath; } /* ------------------------------------------------------------ */ public MimeTypes getMimeTypes() { return _mimeTypes; } /* ------------------------------------------------------------ */ public PermissionCollection getPermissions() { return _permissions; } /* ------------------------------------------------------------ */ public ResourceCache getResourceCache() { return _resourceCache; } /* ------------------------------------------------------------ */ public Server getServer() { return _server; } /* ------------------------------------------------------------ */ WebAppClassLoader getWebappLoader() { return _webappLoader; } /* ------------------------------------------------------------ */ public boolean isParentLoaderPriority() { return _parentLoaderPriority; } /* ------------------------------------------------------------ */ public boolean isServerClass(String clazz) { return _serverClasses.match(clazz); } /* ------------------------------------------------------------ */ public boolean isSystemClass(String clazz) { return _systemClasses.match(clazz); } /* ------------------------------------------------------------ */ public Resource newResource(String urlOrPath) throws IOException { return Resource.newResource(urlOrPath); } /* ------------------------------------------------------------ */ /** * @param extraClasspath Comma or semicolon separated path of filenames or URLs * pointing to directories or jar files. Directories should end * with '/'. */ public void setExtraClasspath(String extraClasspath) { _extraClasspath=extraClasspath; } /* ------------------------------------------------------------ */ /** * @param java2compliant The java2compliant to set. */ public void setParentLoaderPriority(boolean java2compliant) { _parentLoaderPriority = java2compliant; } /* ------------------------------------------------------------ */ /** * @param permissions The permissions to set. */ public void setPermissions(PermissionCollection permissions) { _permissions = permissions; } /* ------------------------------------------------------------ */ /** * Set the server classes patterns. * <p> * Server classes/packages are classes used to implement the server and are hidden * from the context. If the context needs to load these classes, it must have its * own copy of them in WEB-INF/lib or WEB-INF/classes. * A class pattern is a string of one of the forms:<dl> * <dt>org.package.Classname</dt><dd>Match a specific class</dd> * <dt>org.package.</dt><dd>Match a specific package hierarchy</dd> * <dt>-org.package.Classname</dt><dd>Exclude a specific class</dd> * <dt>-org.package.</dt><dd>Exclude a specific package hierarchy</dd> * </dl> * @param serverClasses The serverClasses to set. */ public void setServerClasses(String[] serverClasses) { _serverClasses = new ClasspathPattern(serverClasses); } /* ------------------------------------------------------------ */ /** * Set the system classes patterns. * <p> * System classes/packages are classes provided by the JVM and that * cannot be replaced by classes of the same name from WEB-INF, * regardless of the value of {@link #setParentLoaderPriority(boolean)}. * A class pattern is a string of one of the forms:<dl> * <dt>org.package.Classname</dt><dd>Match a specific class</dd> * <dt>org.package.</dt><dd>Match a specific package hierarchy</dd> * <dt>-org.package.Classname</dt><dd>Exclude a specific class</dd> * <dt>-org.package.</dt><dd>Exclude a specific package hierarchy</dd> * </dl> * @param systemClasses The systemClasses to set. */ public void setSystemClasses(String[] systemClasses) { _systemClasses = new ClasspathPattern(systemClasses); } /* ------------------------------------------------------------ */ public void addSystemClass(String classname) { _systemClasses.addPattern(classname); } /* ------------------------------------------------------------ */ public void addServerClass(String classname) { _serverClasses.addPattern(classname); } /* ------------------------------------------------------------ */ public void destroy() { if (_baseResource!=null) _baseResource.release(); if (_resourceCache!=null) _resourceCache.flushCache(); if(_idMap!=null) _idMap.clear(); } /* ------------------------------------------------------------ */ public void setIdMap(Map<String, Object> idMap) { _idMap=idMap; } /* ------------------------------------------------------------ */ public Map<String, Object> getIdMap() { return _idMap; } }