geronimo-scm mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From gdam...@apache.org
Subject svn commit: r321306 - in /geronimo/trunk/modules: connector-builder/src/java/org/apache/geronimo/connector/deployment/ connector-builder/src/schema/ deployment/src/java/org/apache/geronimo/deployment/ j2ee-builder/src/java/org/apache/geronimo/j2ee/depl...
Date Sat, 15 Oct 2005 07:40:22 GMT
Author: gdamour
Date: Sat Oct 15 00:39:42 2005
New Revision: 321306

URL: http://svn.apache.org/viewcvs?rev=321306&view=rev
Log:
GERONIMO-1075 Configuration classloaders should support an inverse classloading delegation model.


A configuration supports now the following attribute and elements:
* inverseClassloading: indicate if the standard class loading delegation model
is to be reversed for this configuration;
* hidden-classes: filter of classes hidden from the configuration; and
* non-overridable-classes: filter of classes, which cannot be defined by the 
configuration.

Modified:
    geronimo/trunk/modules/connector-builder/src/java/org/apache/geronimo/connector/deployment/ConnectorModuleBuilder.java
    geronimo/trunk/modules/connector-builder/src/schema/geronimo-connector-1.0.xsd
    geronimo/trunk/modules/deployment/src/java/org/apache/geronimo/deployment/DeploymentContext.java
    geronimo/trunk/modules/j2ee-builder/src/java/org/apache/geronimo/j2ee/deployment/EARConfigBuilder.java
    geronimo/trunk/modules/j2ee-builder/src/schema/geronimo-application-1.0.xsd
    geronimo/trunk/modules/j2ee-schema/src/java/org/apache/geronimo/schema/SchemaConversionUtils.java
    geronimo/trunk/modules/jetty-builder/src/java/org/apache/geronimo/jetty/deployment/JettyModuleBuilder.java
    geronimo/trunk/modules/jetty-builder/src/schema/geronimo-jetty-1.0.xsd
    geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/runtime/GBeanInstanceState.java
    geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/config/Configuration.java
    geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/config/ConfigurationData.java
    geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/config/MultiParentClassLoader.java
    geronimo/trunk/modules/kernel/src/test/org/apache/geronimo/kernel/config/MultiParentClassLoaderTest.java
    geronimo/trunk/modules/service-builder/src/java/org/apache/geronimo/deployment/service/ServiceConfigBuilder.java
    geronimo/trunk/modules/service-builder/src/schema/geronimo-config-1.0.xsd
    geronimo/trunk/modules/system/src/java/org/apache/geronimo/system/configuration/ExecutableConfigurationUtil.java
    geronimo/trunk/modules/tomcat-builder/src/java/org/apache/geronimo/tomcat/deployment/TomcatModuleBuilder.java
    geronimo/trunk/modules/tomcat-builder/src/schema/geronimo-tomcat-1.0.xsd

Modified: geronimo/trunk/modules/connector-builder/src/java/org/apache/geronimo/connector/deployment/ConnectorModuleBuilder.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/connector-builder/src/java/org/apache/geronimo/connector/deployment/ConnectorModuleBuilder.java?rev=321306&r1=321305&r2=321306&view=diff
==============================================================================
--- geronimo/trunk/modules/connector-builder/src/java/org/apache/geronimo/connector/deployment/ConnectorModuleBuilder.java (original)
+++ geronimo/trunk/modules/connector-builder/src/java/org/apache/geronimo/connector/deployment/ConnectorModuleBuilder.java Sat Oct 15 00:39:42 2005
@@ -65,6 +65,7 @@
 import org.apache.geronimo.deployment.service.ServiceConfigBuilder;
 import org.apache.geronimo.deployment.util.DeploymentUtil;
 import org.apache.geronimo.deployment.xmlbeans.XmlBeansUtil;
+import org.apache.geronimo.deployment.xbeans.ClassFilterType;
 import org.apache.geronimo.deployment.xbeans.DependencyType;
 import org.apache.geronimo.deployment.xbeans.GbeanType;
 import org.apache.geronimo.deployment.DeploymentContext;
@@ -243,7 +244,6 @@
         return new ConnectorModule(standAlone, configId, parentId, moduleFile, targetPath, connector, gerConnector, specDD);
     }
 
-
     public void installModule(JarFile earFile, EARContext earContext, Module module) throws DeploymentException {
         GerConnectorType vendorConnector = (GerConnectorType) module.getVendorDD();
         //suppressing the default parentid is mostly useful for deploying standalone connectors on the app client.
@@ -276,6 +276,16 @@
         } catch (IOException e) {
             throw new DeploymentException("Problem deploying connector", e);
         }
+
+        if (vendorConnector.isSetInverseClassloading()) {
+            earContext.setInverseClassloading(vendorConnector.getInverseClassloading());
+        }
+        
+        ClassFilterType[] filters = vendorConnector.getHiddenClassesArray();
+        ServiceConfigBuilder.addHiddenClasses(earContext, filters);
+        
+        filters = vendorConnector.getNonOverridableClassesArray();
+        ServiceConfigBuilder.addNonOverridableClasses(earContext, filters);
     }
 
     public void initContext(EARContext earContext, Module module, ClassLoader cl) throws DeploymentException {

Modified: geronimo/trunk/modules/connector-builder/src/schema/geronimo-connector-1.0.xsd
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/connector-builder/src/schema/geronimo-connector-1.0.xsd?rev=321306&r1=321305&r2=321306&view=diff
==============================================================================
--- geronimo/trunk/modules/connector-builder/src/schema/geronimo-connector-1.0.xsd (original)
+++ geronimo/trunk/modules/connector-builder/src/schema/geronimo-connector-1.0.xsd Sat Oct 15 00:39:42 2005
@@ -291,6 +291,8 @@
 
         <xs:sequence>
             <xs:element ref="sys:import" minOccurs="0" maxOccurs="unbounded"/>
+            <xs:element ref="sys:hidden-classes" minOccurs="0" maxOccurs="unbounded"/>
+            <xs:element ref="sys:non-overridable-classes" minOccurs="0" maxOccurs="unbounded"/>
             <xs:element ref="sys:dependency" minOccurs="0" maxOccurs="unbounded"/>
 
             <xs:element name="resourceadapter" type="ger:resourceadapterType" maxOccurs="unbounded"/>
@@ -303,6 +305,7 @@
         <xs:attribute name="configId" type="xs:string" use="required"/>
         <xs:attribute name="parentId" type="xs:string" use="optional"/>
         <xs:attribute name="suppressDefaultParentId" type="xs:boolean" use="optional"/>
+        <xs:attribute name="inverseClassloading" type="xs:boolean" use="optional"/>
     </xs:complexType>
 
     <!-- **************************************************** -->

Modified: geronimo/trunk/modules/deployment/src/java/org/apache/geronimo/deployment/DeploymentContext.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/deployment/src/java/org/apache/geronimo/deployment/DeploymentContext.java?rev=321306&r1=321305&r2=321306&view=diff
==============================================================================
--- geronimo/trunk/modules/deployment/src/java/org/apache/geronimo/deployment/DeploymentContext.java (original)
+++ geronimo/trunk/modules/deployment/src/java/org/apache/geronimo/deployment/DeploymentContext.java Sat Oct 15 00:39:42 2005
@@ -105,6 +105,7 @@
         configurationData.setDomain(domain);
         configurationData.setServer(server);
         determineNaming();
+        determineInherited();
     }
 
     private void determineNaming() throws DeploymentException {
@@ -150,11 +151,62 @@
         }
     }
 
-
+    private void determineInherited() throws DeploymentException {
+        if (null == kernel) {
+            return;
+        }
+        
+        List parentId = configurationData.getParentId();
+        if (parentId != null && parentId.size() > 0) {
+            ConfigurationManager configurationManager = ConfigurationUtil.getConfigurationManager(kernel);
+            List inherited = new ArrayList();
+            try {
+                for (Iterator iterator = parentId.iterator(); iterator.hasNext();) {
+                    URI uri = (URI) iterator.next();
+                    ObjectName parentName = Configuration.getConfigurationObjectName(uri);
+                    boolean loaded = false;
+                    try {
+                        if (!configurationManager.isLoaded(uri)) {
+                            parentName = configurationManager.load(uri);
+                            loaded = true;
+                        }
+                        String[] nonOverridableClasses = (String[]) kernel.getAttribute(parentName, "nonOverridableClasses");
+                        if (null != nonOverridableClasses) {
+                            for (int i = 0; i < nonOverridableClasses.length; i++) {
+                                inherited.add(nonOverridableClasses[i]);
+                            }
+                        }
+                    } finally {
+                        if (loaded) {
+                            configurationManager.unload(uri);
+                        }
+                    }
+                }
+            } catch (DeploymentException e) {
+                throw e;
+            } catch (Exception e) {
+                throw new DeploymentException(e);
+            }
+            configurationData.getNonOverridableClasses().addAll(inherited);
+        }
+    }
+    
     public URI getConfigID() {
         return configurationData.getId();
     }
 
+    public void setInverseClassloading(boolean inverseClassloading) {
+        configurationData.setInverseClassloading(inverseClassloading);
+    }
+    
+    public void addHiddenClasses(Set hiddenClasses) {
+        configurationData.getHiddenClasses().addAll(hiddenClasses);
+    }
+
+    public void addNonOverridableClasses(Set nonOverridableClasses) {
+        configurationData.getNonOverridableClasses().addAll(nonOverridableClasses);
+    }
+    
     public void addParentId(List parentId) {
         configurationData.getParentId().addAll(parentId);
     }
@@ -570,7 +622,13 @@
             throw new DeploymentException(e);
         }
 
-        return new MultiParentClassLoader(configurationData.getId(), urls, parentCL);
+        boolean inverseClassloading = configurationData.isInverseClassloading();
+        Set filter = configurationData.getHiddenClasses();
+        String[] hiddenFilter = (String[]) filter.toArray(new String[0]); 
+        filter = configurationData.getNonOverridableClasses();
+        String[] nonOverridableFilter = (String[]) filter.toArray(new String[0]); 
+        
+        return new MultiParentClassLoader(configurationData.getId(), urls, parentCL, inverseClassloading, hiddenFilter, nonOverridableFilter);
     }
 
     public void close() throws IOException, DeploymentException {

Modified: geronimo/trunk/modules/j2ee-builder/src/java/org/apache/geronimo/j2ee/deployment/EARConfigBuilder.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/j2ee-builder/src/java/org/apache/geronimo/j2ee/deployment/EARConfigBuilder.java?rev=321306&r1=321305&r2=321306&view=diff
==============================================================================
--- geronimo/trunk/modules/j2ee-builder/src/java/org/apache/geronimo/j2ee/deployment/EARConfigBuilder.java (original)
+++ geronimo/trunk/modules/j2ee-builder/src/java/org/apache/geronimo/j2ee/deployment/EARConfigBuilder.java Sat Oct 15 00:39:42 2005
@@ -34,18 +34,19 @@
 import java.util.Set;
 import java.util.jar.JarFile;
 import java.util.zip.ZipEntry;
+
 import javax.management.MalformedObjectNameException;
 import javax.management.ObjectName;
-import javax.xml.namespace.QName;
 
 import org.apache.geronimo.common.DeploymentException;
 import org.apache.geronimo.deployment.ConfigurationBuilder;
 import org.apache.geronimo.deployment.service.ServiceConfigBuilder;
 import org.apache.geronimo.deployment.util.DeploymentUtil;
 import org.apache.geronimo.deployment.util.NestedJarFile;
-import org.apache.geronimo.deployment.xmlbeans.XmlBeansUtil;
+import org.apache.geronimo.deployment.xbeans.ClassFilterType;
 import org.apache.geronimo.deployment.xbeans.DependencyType;
 import org.apache.geronimo.deployment.xbeans.GbeanType;
+import org.apache.geronimo.deployment.xmlbeans.XmlBeansUtil;
 import org.apache.geronimo.gbean.GBeanData;
 import org.apache.geronimo.gbean.GBeanInfo;
 import org.apache.geronimo.gbean.GBeanInfoBuilder;
@@ -65,7 +66,6 @@
 import org.apache.geronimo.xbeans.geronimo.j2ee.GerModuleType;
 import org.apache.geronimo.xbeans.j2ee.ApplicationType;
 import org.apache.geronimo.xbeans.j2ee.ModuleType;
-import org.apache.xmlbeans.XmlCursor;
 import org.apache.xmlbeans.XmlException;
 import org.apache.xmlbeans.XmlObject;
 
@@ -312,13 +312,23 @@
                 }
             }
 
-            // add dependencies declared in the geronimo-application.xml
             GerApplicationType geronimoApplication = (GerApplicationType) applicationInfo.getVendorDD();
             if (geronimoApplication != null) {
+                // add dependencies declared in the geronimo-application.xml
                 DependencyType[] dependencies = geronimoApplication.getDependencyArray();
                 ServiceConfigBuilder.addDependencies(earContext, dependencies, repository);
-            }
 
+                if (geronimoApplication.isSetInverseClassloading()) {
+                    earContext.setInverseClassloading(geronimoApplication.getInverseClassloading());
+                }
+                
+                ClassFilterType[] filters = geronimoApplication.getHiddenClassesArray();
+                ServiceConfigBuilder.addHiddenClasses(earContext, filters);
+                
+                filters = geronimoApplication.getNonOverridableClassesArray();
+                ServiceConfigBuilder.addNonOverridableClasses(earContext, filters);
+            }
+            
             // each module installs it's files into the output context.. this is different for each module type
             Set modules = applicationInfo.getModules();
             for (Iterator iterator = modules.iterator(); iterator.hasNext();) {

Modified: geronimo/trunk/modules/j2ee-builder/src/schema/geronimo-application-1.0.xsd
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/j2ee-builder/src/schema/geronimo-application-1.0.xsd?rev=321306&r1=321305&r2=321306&view=diff
==============================================================================
--- geronimo/trunk/modules/j2ee-builder/src/schema/geronimo-application-1.0.xsd (original)
+++ geronimo/trunk/modules/j2ee-builder/src/schema/geronimo-application-1.0.xsd Sat Oct 15 00:39:42 2005
@@ -34,6 +34,8 @@
     <xs:complexType name="applicationType">
         <xs:sequence>
             <xs:element ref="sys:import" minOccurs="0" maxOccurs="unbounded"/>
+            <xs:element ref="sys:hidden-classes" minOccurs="0" maxOccurs="unbounded"/>
+            <xs:element ref="sys:non-overridable-classes" minOccurs="0" maxOccurs="unbounded"/>
             <xs:element ref="sys:dependency" minOccurs="0" maxOccurs="unbounded"/>
             <xs:element name="module" type="geronimo:moduleType" minOccurs="0" maxOccurs="unbounded"/>
             <xs:element name="ext-module" type="geronimo:ext-moduleType" minOccurs="0" maxOccurs="unbounded"/>
@@ -44,6 +46,7 @@
         <xs:attribute name="configId" type="xs:string" use="required"/>
         <xs:attribute name="parentId" type="xs:string" use="optional"/>
         <xs:attribute name="application-name" type="xs:string" use="optional"/>
+        <xs:attribute name="inverseClassloading" type="xs:boolean" use="optional"/>
     </xs:complexType>
 
     <xs:complexType name="moduleType">

Modified: geronimo/trunk/modules/j2ee-schema/src/java/org/apache/geronimo/schema/SchemaConversionUtils.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/j2ee-schema/src/java/org/apache/geronimo/schema/SchemaConversionUtils.java?rev=321306&r1=321305&r2=321306&view=diff
==============================================================================
--- geronimo/trunk/modules/j2ee-schema/src/java/org/apache/geronimo/schema/SchemaConversionUtils.java (original)
+++ geronimo/trunk/modules/j2ee-schema/src/java/org/apache/geronimo/schema/SchemaConversionUtils.java Sat Oct 15 00:39:42 2005
@@ -72,6 +72,8 @@
 
         GERONIMO_SCHEMA_CONVERSIONS.put("gbean", GERONIMO_SERVICE_NAMESPACE);
         GERONIMO_SCHEMA_CONVERSIONS.put("import", GERONIMO_SERVICE_NAMESPACE);
+        GERONIMO_SCHEMA_CONVERSIONS.put("hidden-classes", GERONIMO_SERVICE_NAMESPACE);
+        GERONIMO_SCHEMA_CONVERSIONS.put("non-overridable-classes", GERONIMO_SERVICE_NAMESPACE);
         GERONIMO_SCHEMA_CONVERSIONS.put("dependency", GERONIMO_SERVICE_NAMESPACE);
         GERONIMO_SCHEMA_CONVERSIONS.put("include", GERONIMO_SERVICE_NAMESPACE);
     }

Modified: geronimo/trunk/modules/jetty-builder/src/java/org/apache/geronimo/jetty/deployment/JettyModuleBuilder.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/jetty-builder/src/java/org/apache/geronimo/jetty/deployment/JettyModuleBuilder.java?rev=321306&r1=321305&r2=321306&view=diff
==============================================================================
--- geronimo/trunk/modules/jetty-builder/src/java/org/apache/geronimo/jetty/deployment/JettyModuleBuilder.java (original)
+++ geronimo/trunk/modules/jetty-builder/src/java/org/apache/geronimo/jetty/deployment/JettyModuleBuilder.java Sat Oct 15 00:39:42 2005
@@ -57,6 +57,7 @@
 import org.apache.geronimo.deployment.service.ServiceConfigBuilder;
 import org.apache.geronimo.deployment.util.DeploymentUtil;
 import org.apache.geronimo.deployment.xmlbeans.XmlBeansUtil;
+import org.apache.geronimo.deployment.xbeans.ClassFilterType;
 import org.apache.geronimo.deployment.xbeans.DependencyType;
 import org.apache.geronimo.deployment.xbeans.GbeanType;
 import org.apache.geronimo.deployment.xmlbeans.XmlBeansUtil;
@@ -371,6 +372,8 @@
     }
 
     public void installModule(JarFile earFile, EARContext earContext, Module module) throws DeploymentException {
+        JettyWebAppType jettyWebApp = (JettyWebAppType) module.getVendorDD();
+
         earContext.addParentId(defaultParentId);
         try {
             URI baseDir = URI.create(module.getTargetPath() + "/");
@@ -394,7 +397,6 @@
             earContext.addManifestClassPath(warFile, URI.create(module.getTargetPath()));
 
             // add the dependencies declared in the geronimo-web.xml file
-            JettyWebAppType jettyWebApp = (JettyWebAppType) module.getVendorDD();
             DependencyType[] dependencies = jettyWebApp.getDependencyArray();
             ServiceConfigBuilder.addDependencies(earContext, dependencies, repository);
         } catch (IOException e) {
@@ -402,6 +404,16 @@
         } catch (URISyntaxException e) {
             throw new DeploymentException("Could not construct URI for location of war entry", e);
         }
+        
+        if (jettyWebApp.isSetInverseClassloading()) {
+            earContext.setInverseClassloading(jettyWebApp.getInverseClassloading());
+        }
+        
+        ClassFilterType[] filters = jettyWebApp.getHiddenClassesArray();
+        ServiceConfigBuilder.addHiddenClasses(earContext, filters);
+        
+        filters = jettyWebApp.getNonOverridableClassesArray();
+        ServiceConfigBuilder.addNonOverridableClasses(earContext, filters);
     }
 
     public void initContext(EARContext earContext, Module module, ClassLoader cl) throws DeploymentException {

Modified: geronimo/trunk/modules/jetty-builder/src/schema/geronimo-jetty-1.0.xsd
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/jetty-builder/src/schema/geronimo-jetty-1.0.xsd?rev=321306&r1=321305&r2=321306&view=diff
==============================================================================
--- geronimo/trunk/modules/jetty-builder/src/schema/geronimo-jetty-1.0.xsd (original)
+++ geronimo/trunk/modules/jetty-builder/src/schema/geronimo-jetty-1.0.xsd Sat Oct 15 00:39:42 2005
@@ -37,6 +37,8 @@
     <xs:complexType name="web-appType">
         <xs:sequence>
             <xs:element ref="sys:import" minOccurs="0" maxOccurs="unbounded"/>
+            <xs:element ref="sys:hidden-classes" minOccurs="0" maxOccurs="unbounded"/>
+            <xs:element ref="sys:non-overridable-classes" minOccurs="0" maxOccurs="unbounded"/>
             <xs:element ref="sys:dependency" minOccurs="0" maxOccurs="unbounded"/>
 
             <xs:element name="context-root" type="xs:string" minOccurs="0"/>
@@ -56,6 +58,7 @@
         </xs:sequence>
         <xs:attribute name="configId" type="xs:string" use="required"/>
         <xs:attribute name="parentId" type="xs:string" use="optional"/>
+        <xs:attribute name="inverseClassloading" type="xs:boolean" use="optional"/>
     </xs:complexType>
 
     <xs:complexType name="container-configType">

Modified: geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/runtime/GBeanInstanceState.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/runtime/GBeanInstanceState.java?rev=321306&r1=321305&r2=321306&view=diff
==============================================================================
--- geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/runtime/GBeanInstanceState.java (original)
+++ geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/runtime/GBeanInstanceState.java Sat Oct 15 00:39:42 2005
@@ -121,7 +121,7 @@
         assert !Thread.holdsLock(this): "This method cannot be called while holding a synchronized lock on this";
 
         State state = getStateInstance();
-        if (state != State.STOPPED && state != State.FAILED) {
+        if (state != State.STOPPED && state != State.FAILED && state != State.RUNNING) {
             // Cannot startRecursive while in the stopping state
             // Dain: I don't think we can throw an exception here because there is no way for the caller
             // to lock the instance and check the state before calling

Modified: geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/config/Configuration.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/config/Configuration.java?rev=321306&r1=321305&r2=321306&view=diff
==============================================================================
--- geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/config/Configuration.java (original)
+++ geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/config/Configuration.java Sat Oct 15 00:39:42 2005
@@ -26,6 +26,7 @@
 import java.net.MalformedURLException;
 import java.net.URI;
 import java.net.URL;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
@@ -130,6 +131,9 @@
 
     private final List dependencies;
     private final List classPath;
+    private final boolean inverseClassLoading;
+    private final String[] hiddenClasses;
+    private final String[] nonOverridableClasses;
     private final String domain;
     private final String server;
 
@@ -177,6 +181,9 @@
         configurationClassLoader = null;
         dependencies = null;
         classPath = null;
+        inverseClassLoading = false;
+        hiddenClasses = null;
+        nonOverridableClasses = null;
         baseURL = null;
         repositories = null;
     }
@@ -201,6 +208,9 @@
             String domain,
             String server,
             List classPath,
+            boolean inverseClassLoading,
+            String[] hiddenClasses,
+            String[] nonOverridableClasses,
             byte[] gbeanState,
             Collection repositories,
             List dependencies,
@@ -220,6 +230,17 @@
         } else {
             this.classPath = Collections.EMPTY_LIST;
         }
+        this.inverseClassLoading = inverseClassLoading;
+        if (null != hiddenClasses) {
+            this.hiddenClasses = hiddenClasses;
+        } else {
+            this.hiddenClasses = new String[0];
+        }
+        if (null != nonOverridableClasses) {
+            this.nonOverridableClasses = nonOverridableClasses;
+        } else {
+            this.nonOverridableClasses = new String[0];
+        }
         if (dependencies != null) {
             this.dependencies = dependencies;
         } else {
@@ -254,9 +275,9 @@
             // no explicit parent set, so use the class loader of this class as
             // the parent... this class should be in the root geronimo classloader,
             // which is normally the system class loader but not always, so be safe
-            configurationClassLoader = new MultiParentClassLoader(id, urls, getClass().getClassLoader());
+            configurationClassLoader = new MultiParentClassLoader(id, urls, getClass().getClassLoader(), inverseClassLoading, hiddenClasses, nonOverridableClasses);
         } else {
-            configurationClassLoader = new MultiParentClassLoader(id, urls, getClassLoaders(parentId));
+            configurationClassLoader = new MultiParentClassLoader(id, urls, getClassLoaders(parentId), inverseClassLoading, hiddenClasses, nonOverridableClasses);
         }
 
 //        loadGBeans();
@@ -461,6 +482,14 @@
         return configurationClassLoader;
     }
 
+    public String[] getHiddenClasses() {
+        return hiddenClasses;
+    }
+
+    public String[] getNonOverridableClasses() {
+        return nonOverridableClasses;
+    }
+
     public synchronized void addGBean(GBeanData beanData, boolean start) throws InvalidConfigException, GBeanAlreadyExistsException {
         ClassLoader oldCl = Thread.currentThread().getContextClassLoader();
         try {
@@ -628,6 +657,9 @@
         infoFactory.addAttribute("domain", String.class, true, false);
         infoFactory.addAttribute("server", String.class, true, false);
         infoFactory.addAttribute("classPath", List.class, true, false);
+        infoFactory.addAttribute("inverseClassLoading", boolean.class, true, false);
+        infoFactory.addAttribute("hiddenClasses", String[].class, true, false);
+        infoFactory.addAttribute("nonOverridableClasses", String[].class, true, false);
         infoFactory.addAttribute("dependencies", List.class, true, false);
         infoFactory.addAttribute("gBeanState", byte[].class, true, false);
         infoFactory.addAttribute("baseURL", URL.class, true, false);
@@ -653,6 +685,9 @@
             "domain",
             "server",
             "classPath",
+            "inverseClassLoading",
+            "hiddenClasses",
+            "nonOverridableClasses",
             "gBeanState",
             "Repositories",
             "dependencies",

Modified: geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/config/ConfigurationData.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/config/ConfigurationData.java?rev=321306&r1=321305&r2=321306&view=diff
==============================================================================
--- geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/config/ConfigurationData.java (original)
+++ geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/config/ConfigurationData.java Sat Oct 15 00:39:42 2005
@@ -20,9 +20,11 @@
 import java.net.URI;
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.HashSet;
 import java.util.Iterator;
-import java.util.List;
 import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Set;
 
 import org.apache.geronimo.gbean.GBeanData;
 
@@ -75,6 +77,22 @@
      */
     private final List childConfigurations = new ArrayList();
 
+    /**
+     * If true, then inverse the standard class loading delegation model.
+     */
+    private boolean inverseClassLoading;
+    
+    /**
+     * Class filters defining the classes hidden from the configuration.
+     */
+    private final Set hiddenClasses = new HashSet();
+
+    /**
+     * Class filters defining the classes that the configuration cannot
+     * override.  
+     */
+    private final Set nonOverridableClasses = new HashSet();
+    
     public ConfigurationData() {
     }
 
@@ -88,6 +106,9 @@
         setClassPath(new ArrayList(configurationData.classPath));
         setGBeans(configurationData.gbeans);
         setChildConfigurations(configurationData.childConfigurations);
+        inverseClassLoading = configurationData.inverseClassLoading;
+        hiddenClasses.addAll(configurationData.hiddenClasses);
+        nonOverridableClasses.addAll(configurationData.nonOverridableClasses);
     }
 
     public URI getId() {
@@ -195,5 +216,21 @@
     public void addChildConfiguration(ConfigurationData configurationData) {
         assert configurationData != null;
         childConfigurations.add(configurationData);
+    }
+
+    public boolean isInverseClassloading() {
+        return inverseClassLoading;
+    }
+    
+    public void setInverseClassloading(boolean inverseClassLoading) {
+        this.inverseClassLoading = inverseClassLoading;
+    }
+    
+    public Set getHiddenClasses() {
+        return hiddenClasses;
+    }
+    
+    public Set getNonOverridableClasses() {
+        return nonOverridableClasses;
     }
 }

Modified: geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/config/MultiParentClassLoader.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/config/MultiParentClassLoader.java?rev=321306&r1=321305&r2=321306&view=diff
==============================================================================
--- geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/config/MultiParentClassLoader.java (original)
+++ geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/kernel/config/MultiParentClassLoader.java Sat Oct 15 00:39:42 2005
@@ -31,6 +31,8 @@
 import java.io.ObjectStreamClass;
 import java.lang.reflect.Field;
 
+import javax.print.attribute.SupportedValuesAttribute;
+
 import org.apache.commons.logging.LogFactory;
 
 /**
@@ -44,6 +46,9 @@
 public class MultiParentClassLoader extends URLClassLoader {
     private final URI id;
     private final ClassLoader[] parents;
+    private final boolean inverseClassLoading;
+    private final String[] hiddenClasses;
+    private final String[] nonOverridableClasses;
 
     /**
      * Creates a named class loader with no parents.
@@ -54,6 +59,9 @@
         super(urls);
         this.id = id;
         parents = new ClassLoader[0];
+        inverseClassLoading = false;
+        hiddenClasses = new String[0];
+        nonOverridableClasses = new String[0];
     }
 
     /**
@@ -66,6 +74,10 @@
         this(id, urls, new ClassLoader[] {parent});
     }
 
+    public MultiParentClassLoader(URI id, URL[] urls, ClassLoader parent, boolean inverseClassLoading, String[] hiddenClasses, String[] nonOverridableClasses) {
+        this(id, urls, new ClassLoader[] {parent}, inverseClassLoading, hiddenClasses, nonOverridableClasses);
+    }
+
     /**
      * Creates a named class loader as a child of the specified parent and using the specified URLStreamHandlerFactory
      * for accessing the urls..
@@ -88,6 +100,18 @@
         super(urls);
         this.id = id;
         this.parents = copyParents(parents);
+        inverseClassLoading = false;
+        hiddenClasses = new String[0];
+        nonOverridableClasses = new String[0];
+    }
+
+    public MultiParentClassLoader(URI id, URL[] urls, ClassLoader[] parents, boolean inverseClassLoading, String[] hiddenClasses, String[] nonOverridableClasses) {
+        super(urls, new FilteringParentCL(hiddenClasses));
+        this.id = id;
+        this.parents = copyParents(parents);
+        this.inverseClassLoading = inverseClassLoading;
+        this.hiddenClasses = hiddenClasses;
+        this.nonOverridableClasses = nonOverridableClasses;
     }
 
     /**
@@ -102,6 +126,9 @@
         super(urls, null, factory);
         this.id = id;
         this.parents = copyParents(parents);
+        inverseClassLoading = false;
+        hiddenClasses = new String[0];
+        nonOverridableClasses = new String[0];
     }
 
     private static ClassLoader[] copyParents(ClassLoader[] parents) {
@@ -134,35 +161,77 @@
 
     protected synchronized Class loadClass(String name, boolean resolve) throws ClassNotFoundException {
         Class clazz = findLoadedClass(name);
-        for (int i = 0; i < parents.length && clazz == null; i++) {
-            ClassLoader parent = parents[i];
-            try {
-                clazz = parent.loadClass(name);
-            } catch (ClassNotFoundException ignored) {
-                // this parent didn't have the class; try the next one
-            }
-        }
 
-        if (clazz == null) {
-            // parents didn't have the class; attempt to load from my urls
-            return super.loadClass(name, resolve);
-        } else {
-            // we found the class; resolve it if requested
+        if (null != clazz) {
             if (resolve) {
                 resolveClass(clazz);
             }
             return clazz;
         }
+
+        if (inverseClassLoading) {
+            boolean checkMe = true;
+            for (int i = 0; i < nonOverridableClasses.length && checkMe; i++) {
+                if (name.startsWith(nonOverridableClasses[i])) {
+                    checkMe = false;
+                }
+            }
+
+            if (checkMe) {
+                try {
+                    clazz = findClass(name);
+                    if (resolve) {
+                        resolveClass(clazz);
+                    }
+                    return clazz;
+                } catch (ClassNotFoundException ignored) {
+                }
+            }
+        }
+
+        boolean checkParents = true;
+        for (int i = 0; i < hiddenClasses.length && checkParents; i++) {
+            if (name.startsWith(hiddenClasses[i])) {
+                checkParents = false;
+            }
+        }
+        if (checkParents) {
+            for (int i = 0; i < parents.length && clazz == null; i++) {
+                ClassLoader parent = parents[i];
+                try {
+                    clazz = parent.loadClass(name);
+                } catch (ClassNotFoundException ignored) {
+                    // this parent didn't have the class; try the next one
+                }
+            }
+        }
+        
+        if (null == clazz) {
+            return super.loadClass(name, resolve);
+        }
+        
+        if (resolve) {
+            resolveClass(clazz);
+        }
+        return clazz;
     }
 
     public URL getResource(String name) {
         URL url = null;
+        
+        if (inverseClassLoading) {
+            url = super.getResource(name);
+            if (null != url) {
+                return url;
+            }
+        }
+        
         for (int i = 0; i < parents.length && url == null; i++) {
             ClassLoader parent = parents[i];
             url = parent.getResource(name);
         }
 
-        if (url == null) {
+        if (url == null && false == inverseClassLoading) {
             // parents didn't have the resource; attempt to load it from my urls
             return super.getResource(name);
         } else {
@@ -200,6 +269,29 @@
         clearSoftCache(ObjectStreamClass.class, "reflectors");
     }
 
+    private static class FilteringParentCL extends ClassLoader {
+        private final String[] hiddenClasses;
+
+        public FilteringParentCL(String[] hiddenClasses) {
+            this.hiddenClasses = hiddenClasses;
+        }
+        
+        protected synchronized Class loadClass(String name, boolean resolve) throws ClassNotFoundException {
+            boolean checkParents = true;
+            for (int i = 0; i < hiddenClasses.length && checkParents; i++) {
+                if (name.startsWith(hiddenClasses[i])) {
+                    checkParents = false;
+                }
+            }
+            
+            if (checkParents) {
+                return super.loadClass(name, resolve);
+            }
+
+            throw new ClassNotFoundException(name);
+        }
+    }
+    
     private static Object lock = new Object();
     private static boolean clearSoftCacheFailed = false;
     private static void clearSoftCache(Class clazz, String fieldName) {

Modified: geronimo/trunk/modules/kernel/src/test/org/apache/geronimo/kernel/config/MultiParentClassLoaderTest.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/kernel/src/test/org/apache/geronimo/kernel/config/MultiParentClassLoaderTest.java?rev=321306&r1=321305&r2=321306&view=diff
==============================================================================
--- geronimo/trunk/modules/kernel/src/test/org/apache/geronimo/kernel/config/MultiParentClassLoaderTest.java (original)
+++ geronimo/trunk/modules/kernel/src/test/org/apache/geronimo/kernel/config/MultiParentClassLoaderTest.java Sat Oct 15 00:39:42 2005
@@ -132,6 +132,45 @@
         assertEquals(parents[0], clazz.getClassLoader());
     }
 
+    public void testInverseClassLoading() throws Exception {
+        File parentJar = createJarFile(0);
+        ClassLoader parentCl = new URLClassLoader(new URL[]{parentJar.toURL()});
+        File myJar = createJarFile(1);
+        ClassLoader cl = new MultiParentClassLoader(NAME, new URL[]{myJar.toURL()}, parentCl);
+        Class clazz = cl.loadClass(CLASS_NAME);
+        assertSame(parentCl, clazz.getClassLoader());
+        
+        cl = new MultiParentClassLoader(NAME, new URL[]{myJar.toURL()}, parentCl, true, new String[0], new String[0]);
+        clazz = cl.loadClass(CLASS_NAME);
+        assertSame(cl, clazz.getClassLoader());
+    }
+
+    public void testHiddenClasses() throws Exception {
+        File parentJar = createJarFile(0);
+        ClassLoader parentCl = new URLClassLoader(new URL[]{parentJar.toURL()});
+        File myJar = createJarFile(1);
+        ClassLoader cl = new MultiParentClassLoader(NAME, new URL[]{myJar.toURL()}, parentCl);
+        Class clazz = cl.loadClass(CLASS_NAME);
+        assertSame(parentCl, clazz.getClassLoader());
+        
+        cl = new MultiParentClassLoader(NAME, new URL[]{myJar.toURL()}, parentCl, false, new String[] {CLASS_NAME}, new String[0]);
+        clazz = cl.loadClass(CLASS_NAME);
+        assertSame(cl, clazz.getClassLoader());
+    }
+
+    public void testNonOverridableClasses() throws Exception {
+        File parentJar = createJarFile(0);
+        ClassLoader parentCl = new URLClassLoader(new URL[]{parentJar.toURL()});
+        File myJar = createJarFile(1);
+        ClassLoader cl = new MultiParentClassLoader(NAME, new URL[]{myJar.toURL()}, parentCl);
+        Class clazz = cl.loadClass(CLASS_NAME);
+        assertSame(parentCl, clazz.getClassLoader());
+        
+        cl = new MultiParentClassLoader(NAME, new URL[]{myJar.toURL()}, parentCl, true, new String[0], new String[] {CLASS_NAME});
+        clazz = cl.loadClass(CLASS_NAME);
+        assertSame(parentCl, clazz.getClassLoader());
+    }
+
     /**
      * Test that an attempt to load a non-existant class causes a ClassNotFoundException.
      */

Modified: geronimo/trunk/modules/service-builder/src/java/org/apache/geronimo/deployment/service/ServiceConfigBuilder.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/service-builder/src/java/org/apache/geronimo/deployment/service/ServiceConfigBuilder.java?rev=321306&r1=321305&r2=321306&view=diff
==============================================================================
--- geronimo/trunk/modules/service-builder/src/java/org/apache/geronimo/deployment/service/ServiceConfigBuilder.java (original)
+++ geronimo/trunk/modules/service-builder/src/java/org/apache/geronimo/deployment/service/ServiceConfigBuilder.java Sat Oct 15 00:39:42 2005
@@ -30,9 +30,12 @@
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.jar.JarFile;
+
 import javax.management.MalformedObjectNameException;
 import javax.management.ObjectName;
 import javax.xml.namespace.QName;
@@ -40,9 +43,8 @@
 import org.apache.geronimo.common.DeploymentException;
 import org.apache.geronimo.deployment.ConfigurationBuilder;
 import org.apache.geronimo.deployment.DeploymentContext;
-import org.apache.geronimo.deployment.xmlbeans.XmlBeansUtil;
-import org.apache.geronimo.deployment.xmlbeans.XmlBeansUtil;
 import org.apache.geronimo.deployment.xbeans.AttributeType;
+import org.apache.geronimo.deployment.xbeans.ClassFilterType;
 import org.apache.geronimo.deployment.xbeans.ConfigurationDocument;
 import org.apache.geronimo.deployment.xbeans.ConfigurationType;
 import org.apache.geronimo.deployment.xbeans.DependencyType;
@@ -51,6 +53,7 @@
 import org.apache.geronimo.deployment.xbeans.ReferencesType;
 import org.apache.geronimo.deployment.xbeans.ServiceDocument;
 import org.apache.geronimo.deployment.xbeans.XmlAttributeType;
+import org.apache.geronimo.deployment.xmlbeans.XmlBeansUtil;
 import org.apache.geronimo.gbean.GBeanData;
 import org.apache.geronimo.gbean.GBeanInfo;
 import org.apache.geronimo.gbean.GBeanInfoBuilder;
@@ -201,8 +204,31 @@
         ClassLoader cl = context.getClassLoader(repository);
         GbeanType[] gbeans = configType.getGbeanArray();
         addGBeans(gbeans, cl, j2eeContext, context);
+        if (configType.isSetInverseClassloading()) {
+            context.setInverseClassloading(configType.getInverseClassloading());
+        }
+        ClassFilterType[] filters = configType.getHiddenClassesArray();
+        addHiddenClasses(context, filters);
+        filters = configType.getNonOverridableClassesArray();
+        addNonOverridableClasses(context, filters);
         context.close();
         return context.getConfigurationData();
+    }
+
+    public static void addHiddenClasses(DeploymentContext context, ClassFilterType[] filters) throws DeploymentException {
+        Set tmpFilters = new HashSet();
+        for (int i = 0; i < filters.length; i++) {
+            tmpFilters.add(filters[i].getFilter());
+        }
+        context.addHiddenClasses(tmpFilters);
+    }
+
+    public static void addNonOverridableClasses(DeploymentContext context, ClassFilterType[] filters) throws DeploymentException {
+        Set tmpFilters = new HashSet();
+        for (int i = 0; i < filters.length; i++) {
+            tmpFilters.add(filters[i].getFilter());
+        }
+        context.addNonOverridableClasses(tmpFilters);
     }
 
     public static List getParentID(String parentIDString, DependencyType[] imports) throws DeploymentException {

Modified: geronimo/trunk/modules/service-builder/src/schema/geronimo-config-1.0.xsd
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/service-builder/src/schema/geronimo-config-1.0.xsd?rev=321306&r1=321305&r2=321306&view=diff
==============================================================================
--- geronimo/trunk/modules/service-builder/src/schema/geronimo-config-1.0.xsd (original)
+++ geronimo/trunk/modules/service-builder/src/schema/geronimo-config-1.0.xsd Sat Oct 15 00:39:42 2005
@@ -36,6 +36,8 @@
 
     <xs:complexType name="configurationType">
         <xs:sequence>
+            <xs:element ref="sys:hidden-classes" minOccurs="0" maxOccurs="unbounded"/>
+            <xs:element ref="sys:non-overridable-classes" minOccurs="0" maxOccurs="unbounded"/>
             <xs:element ref="sys:import" minOccurs="0" maxOccurs="unbounded"/>
             <xs:element name="include" type="sys:dependencyType" minOccurs="0" maxOccurs="unbounded"/>
             <xs:element ref="sys:dependency" minOccurs="0" maxOccurs="unbounded"/>
@@ -52,11 +54,20 @@
         </xs:attribute>
         <xs:attribute name="domain" type="xs:string" use="optional"/>
         <xs:attribute name="server" type="xs:string" use="optional"/>
+        <xs:attribute name="inverseClassloading" type="xs:boolean" use="optional"/>
     </xs:complexType>
 
+    <xs:element name="hidden-classes" type="sys:classFilterType"/>
+    <xs:element name="non-overridable-classes" type="sys:classFilterType"/>
     <xs:element name="import" type="sys:dependencyType"/>
     <xs:element name="dependency" type="sys:dependencyType"/>
     <xs:element name="gbean" type="sys:gbeanType"/>
+
+    <xs:complexType name="classFilterType">
+        <xs:sequence>
+            <xs:element name="filter" type="xs:string"/>
+        </xs:sequence>
+    </xs:complexType>
 
     <xs:complexType name="dependencyType">
         <xs:choice>

Modified: geronimo/trunk/modules/system/src/java/org/apache/geronimo/system/configuration/ExecutableConfigurationUtil.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/system/src/java/org/apache/geronimo/system/configuration/ExecutableConfigurationUtil.java?rev=321306&r1=321305&r2=321306&view=diff
==============================================================================
--- geronimo/trunk/modules/system/src/java/org/apache/geronimo/system/configuration/ExecutableConfigurationUtil.java (original)
+++ geronimo/trunk/modules/system/src/java/org/apache/geronimo/system/configuration/ExecutableConfigurationUtil.java Sat Oct 15 00:39:42 2005
@@ -29,6 +29,7 @@
 import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Set;
 import java.util.jar.JarOutputStream;
 import java.util.jar.Manifest;
 import java.util.zip.ZipEntry;
@@ -166,7 +167,12 @@
             config.setReferencePatterns("Repositories", Collections.singleton(new ObjectName("*:name=Repository,*")));
             config.setAttribute("dependencies", configurationData.getDependencies());
             config.setAttribute("classPath", configurationData.getClassPath());
-
+            config.setAttribute("inverseClassLoading", Boolean.valueOf(configurationData.isInverseClassloading()));
+            Set set = configurationData.getHiddenClasses();
+            config.setAttribute("hiddenClasses", set.toArray(new String[set.size()]));
+            set = configurationData.getNonOverridableClasses();
+            config.setAttribute("nonOverridableClasses", set.toArray(new String[set.size()]));
+            
             return config;
         } catch (MalformedObjectNameException e) {
             throw new InvalidConfigException(e);

Modified: geronimo/trunk/modules/tomcat-builder/src/java/org/apache/geronimo/tomcat/deployment/TomcatModuleBuilder.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/tomcat-builder/src/java/org/apache/geronimo/tomcat/deployment/TomcatModuleBuilder.java?rev=321306&r1=321305&r2=321306&view=diff
==============================================================================
--- geronimo/trunk/modules/tomcat-builder/src/java/org/apache/geronimo/tomcat/deployment/TomcatModuleBuilder.java (original)
+++ geronimo/trunk/modules/tomcat-builder/src/java/org/apache/geronimo/tomcat/deployment/TomcatModuleBuilder.java Sat Oct 15 00:39:42 2005
@@ -54,6 +54,7 @@
 import org.apache.geronimo.deployment.service.ServiceConfigBuilder;
 import org.apache.geronimo.deployment.util.DeploymentUtil;
 import org.apache.geronimo.deployment.xmlbeans.XmlBeansUtil;
+import org.apache.geronimo.deployment.xbeans.ClassFilterType;
 import org.apache.geronimo.deployment.xbeans.DependencyType;
 import org.apache.geronimo.deployment.xbeans.GbeanType;
 import org.apache.geronimo.deployment.xmlbeans.XmlBeansUtil;
@@ -321,6 +322,8 @@
     }
 
     public void installModule(JarFile earFile, EARContext earContext, Module module) throws DeploymentException {
+        TomcatWebAppType tomcatWebApp = (TomcatWebAppType) module.getVendorDD();
+
         earContext.addParentId(defaultParentId);
         try {
             URI baseDir = URI.create(module.getTargetPath() + "/");
@@ -344,7 +347,6 @@
             earContext.addManifestClassPath(warFile, URI.create(module.getTargetPath()));
 
             // add the dependencies declared in the geronimo-web.xml file
-            TomcatWebAppType tomcatWebApp = (TomcatWebAppType) module.getVendorDD();
             DependencyType[] dependencies = tomcatWebApp.getDependencyArray();
             ServiceConfigBuilder.addDependencies(earContext, dependencies, repository);
         } catch (IOException e) {
@@ -352,6 +354,16 @@
         } catch (URISyntaxException e) {
             throw new DeploymentException("Could not construct URI for location of war entry", e);
         }
+
+        if (tomcatWebApp.isSetInverseClassloading()) {
+            earContext.setInverseClassloading(tomcatWebApp.getInverseClassloading());
+        }
+        
+        ClassFilterType[] filters = tomcatWebApp.getHiddenClassesArray();
+        ServiceConfigBuilder.addHiddenClasses(earContext, filters);
+        
+        filters = tomcatWebApp.getNonOverridableClassesArray();
+        ServiceConfigBuilder.addNonOverridableClasses(earContext, filters);
     }
 
     public void initContext(EARContext earContext, Module module, ClassLoader cl) throws DeploymentException {

Modified: geronimo/trunk/modules/tomcat-builder/src/schema/geronimo-tomcat-1.0.xsd
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/tomcat-builder/src/schema/geronimo-tomcat-1.0.xsd?rev=321306&r1=321305&r2=321306&view=diff
==============================================================================
--- geronimo/trunk/modules/tomcat-builder/src/schema/geronimo-tomcat-1.0.xsd (original)
+++ geronimo/trunk/modules/tomcat-builder/src/schema/geronimo-tomcat-1.0.xsd Sat Oct 15 00:39:42 2005
@@ -37,6 +37,8 @@
     <xs:complexType name="web-appType">
         <xs:sequence>
             <xs:element ref="sys:import" minOccurs="0" maxOccurs="unbounded"/>
+            <xs:element ref="sys:hidden-classes" minOccurs="0" maxOccurs="unbounded"/>
+            <xs:element ref="sys:non-overridable-classes" minOccurs="0" maxOccurs="unbounded"/>
             <xs:element ref="sys:dependency" minOccurs="0" maxOccurs="unbounded"/>
 
             <xs:element name="context-root" type="xs:string" minOccurs="0"/>
@@ -60,6 +62,7 @@
         </xs:sequence>
         <xs:attribute name="configId" type="xs:string" use="required"/>
         <xs:attribute name="parentId" type="xs:string" use="optional"/>
+        <xs:attribute name="inverseClassloading" type="xs:boolean" use="optional"/>
     </xs:complexType>
 
     <xs:complexType name="emptyType"/>



Mime
View raw message