You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by dj...@apache.org on 2004/01/19 07:38:23 UTC

cvs commit: incubator-geronimo/modules/web/src/java/org/apache/geronimo/web/jetty JettyWebApplication.java JettyWebApplicationContext.java

djencks     2004/01/18 22:38:23

  Modified:    modules/web/src/java/org/apache/geronimo/web
                        AbstractWebApplication.java
                        WebDeploymentPlanner.java
               modules/web/src/java/org/apache/geronimo/web/deployment
                        WebDeployer.java WebModule.java
               modules/web/src/java/org/apache/geronimo/web/jetty
                        JettyWebApplication.java
                        JettyWebApplicationContext.java
  Log:
  Make connection factory use from servlets work (untested). Make gbean-based web deployment work.
  
  Revision  Changes    Path
  1.16      +45 -17    incubator-geronimo/modules/web/src/java/org/apache/geronimo/web/AbstractWebApplication.java
  
  Index: AbstractWebApplication.java
  ===================================================================
  RCS file: /home/cvs/incubator-geronimo/modules/web/src/java/org/apache/geronimo/web/AbstractWebApplication.java,v
  retrieving revision 1.15
  retrieving revision 1.16
  diff -u -r1.15 -r1.16
  --- AbstractWebApplication.java	16 Jan 2004 23:31:21 -0000	1.15
  +++ AbstractWebApplication.java	19 Jan 2004 06:38:23 -0000	1.16
  @@ -107,40 +107,42 @@
       protected String deploymentDescriptorStr;
   
       //jndi context for webapp
  -    protected Context context;
  +    private Context componentContext;
   
       //servlet definitions
       protected String[] servlets;
   
  -    // context path of webapp
  +    // componentContext path of webapp
       protected String contextPath;
   
       //class loading delegation model. Default to web-app scope
       private boolean java2ClassLoadingCompliance;
       private ClassLoader parentClassLoader;
       private UserTransactionImpl userTransaction;
  +    private String contextID;
   
       /**
        * User transaction must be a parameter since it is also possibly already included in the ReadOnlyContext
        * @param uri
        * @param parentClassLoader
  -     * @param webApp
  +     * @param deploymentDescriptorDoc
        * @param geronimoWebAppDocument
        * @param contextPath
  -     * @param context
  +     * @param componentContext
        * @param java2ClassLoadingCompliance
        * @param userTransaction
        * @param transactionManager
        * @param trackedConnectionAssociator
        */
  -    public AbstractWebApplication(URI uri, ClassLoader parentClassLoader, WebApp webApp, GeronimoWebAppDocument geronimoWebAppDocument, String contextPath,
  -                                  Context context, boolean java2ClassLoadingCompliance, UserTransactionImpl userTransaction, TransactionManager transactionManager, TrackedConnectionAssociator trackedConnectionAssociator) {
  +    public AbstractWebApplication(URI uri, String contextID, ClassLoader parentClassLoader, Document deploymentDescriptorDoc, GeronimoWebAppDocument geronimoWebAppDocument, String contextPath,
  +                                  Context componentContext, boolean java2ClassLoadingCompliance, UserTransactionImpl userTransaction, TransactionManager transactionManager, TrackedConnectionAssociator trackedConnectionAssociator) {
           this.uri = uri;
  +        this.contextID = contextID;
           this.parentClassLoader = parentClassLoader;
  -        this.webApp = webApp;
  +        this.deploymentDescriptorDoc = deploymentDescriptorDoc;
           this.geronimoWebAppDoc = geronimoWebAppDocument;
           this.contextPath = contextPath;
  -        this.context = context;
  +        this.componentContext = componentContext;
           this.java2ClassLoadingCompliance = java2ClassLoadingCompliance;
           this.userTransaction = userTransaction;
           userTransaction.setTransactionManager(transactionManager);
  @@ -156,11 +158,19 @@
           webApp = webApplicationContext.webApp;
           geronimoWebAppDoc = webApplicationContext.geronimoWebAppDoc;
           contextPath = webApplicationContext.contextPath;
  -        context = webApplicationContext.context;
  +        componentContext = webApplicationContext.context;
           userTransaction = webApplicationContext.userTransaction;
           java2ClassLoadingCompliance = webApplicationContext.java2ClassLoadingCompliance;
       }
   
  +    public UserTransactionImpl getUserTransaction() {
  +        return userTransaction;
  +    }
  +
  +    public void setUserTransaction(UserTransactionImpl userTransaction) {
  +        this.userTransaction = userTransaction;
  +    }
  +
       public TransactionManager getTransactionManager() {
           return userTransaction.getTransactionManager();
       }
  @@ -177,6 +187,22 @@
           userTransaction.setTrackedConnectionAssociator(trackedConnectionAssociator);
       }
   
  +    public Document getDeploymentDescriptorDoc() {
  +        return deploymentDescriptorDoc;
  +    }
  +
  +    public void setDeploymentDescriptorDoc(Document deploymentDescriptorDoc) {
  +        this.deploymentDescriptorDoc = deploymentDescriptorDoc;
  +    }
  +
  +    public String getContextID() {
  +        return contextID;
  +    }
  +
  +    public void setContextID(String contextID) {
  +        this.contextID = contextID;
  +    }
  +
       /** Get the URI of this webapp
        * @return the URI of the webapp
        * @see org.apache.geronimo.web.WebApplication#getURI()
  @@ -188,7 +214,7 @@
       /**
        * Getter for classloading compliance. If true, then classloading will
        * delegate first to parent classloader a la Java2 spec. If false, then
  -     * webapps wanting to load class will try their own context class loader first.
  +     * webapps wanting to load class will try their own componentContext class loader first.
        * @return true if application is using Java 2 compliant class loading
        */
       public boolean getJava2ClassLoadingCompliance() {
  @@ -201,7 +227,7 @@
        * @see org.apache.geronimo.web.WebApplication#getComponentContext()
        */
       public Context getComponentContext() {
  -        return context;
  +        return componentContext;
       }
   
       /*
  @@ -283,19 +309,21 @@
       static {
           GBeanInfoFactory infoFactory = new GBeanInfoFactory(AbstractWebApplication.class.getName());
           infoFactory.addAttribute(new GAttributeInfo("URI", true));
  +        infoFactory.addAttribute(new GAttributeInfo("ContextID", true));
           infoFactory.addAttribute(new GAttributeInfo("ParentClassLoader", true));
           infoFactory.addAttribute(new GAttributeInfo("ContextPath", true));
  -        infoFactory.addAttribute(new GAttributeInfo("DeploymentDescriptor", true));
  +        infoFactory.addAttribute(new GAttributeInfo("DeploymentDescriptorDoc", true));
           infoFactory.addAttribute(new GAttributeInfo("GeronimoWebAppDoc", true));
  -        infoFactory.addAttribute(new GAttributeInfo("Java2ClassloadingCompliance", true));
  +        infoFactory.addAttribute(new GAttributeInfo("Java2ClassLoadingCompliance", true));
           infoFactory.addAttribute(new GAttributeInfo("ComponentContext", true));
           infoFactory.addAttribute(new GAttributeInfo("Servlets", false));
  +        infoFactory.addAttribute(new GAttributeInfo("UserTransaction", true));
           infoFactory.addEndpoint(new GEndpointInfo("TransactionManager", TransactionManager.class.getName()));
           infoFactory.addEndpoint(new GEndpointInfo("TrackedConnectionAssociator", TrackedConnectionAssociator.class.getName()));
           infoFactory.setConstructor(new GConstructorInfo(
  -                Arrays.asList(new Object[]{"URI", "ParentClassLoader", "WebApp", "GeronimoWebAppDoc", "ContextPath",
  -                                  "Context", "Java2ClassLoadingCompliance", "UserTransaction",  "TransactionManager", "TrackedConnectionAssociator"}),
  -                Arrays.asList(new Object[]{URI.class, ClassLoader.class, WebApp.class, GeronimoWebAppDocument.class, String.class,
  +                Arrays.asList(new Object[]{"URI", "ContextID", "ParentClassLoader", "DeploymentDescriptorDoc", "GeronimoWebAppDoc", "ContextPath",
  +                                  "ComponentContext", "Java2ClassLoadingCompliance", "UserTransaction",  "TransactionManager", "TrackedConnectionAssociator"}),
  +                Arrays.asList(new Object[]{URI.class, String.class, ClassLoader.class, Document.class, GeronimoWebAppDocument.class, String.class,
                                     Context.class, Boolean.TYPE, UserTransactionImpl.class, TransactionManager.class, TrackedConnectionAssociator.class})
           ));
   
  
  
  
  1.4       +27 -1     incubator-geronimo/modules/web/src/java/org/apache/geronimo/web/WebDeploymentPlanner.java
  
  Index: WebDeploymentPlanner.java
  ===================================================================
  RCS file: /home/cvs/incubator-geronimo/modules/web/src/java/org/apache/geronimo/web/WebDeploymentPlanner.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- WebDeploymentPlanner.java	30 Dec 2003 08:28:57 -0000	1.3
  +++ WebDeploymentPlanner.java	19 Jan 2004 06:38:23 -0000	1.4
  @@ -70,6 +70,7 @@
   import javax.management.MalformedObjectNameException;
   import javax.management.ObjectName;
   import javax.transaction.UserTransaction;
  +import javax.transaction.TransactionManager;
   
   import org.apache.commons.logging.Log;
   import org.apache.commons.logging.LogFactory;
  @@ -94,6 +95,7 @@
   import org.apache.geronimo.kernel.jmx.JMXKernel;
   import org.apache.geronimo.kernel.service.GeronimoAttributeInfo;
   import org.apache.geronimo.kernel.service.GeronimoMBeanInfo;
  +import org.apache.geronimo.kernel.service.GeronimoMBeanEndpoint;
   import org.apache.geronimo.naming.java.ComponentContextBuilder;
   import org.apache.geronimo.naming.java.ReadOnlyContext;
   import org.apache.geronimo.naming.java.ReferenceFactory;
  @@ -102,6 +104,7 @@
   import org.apache.geronimo.xml.deployment.GeronimoWebAppLoader;
   import org.apache.geronimo.xml.deployment.LoaderUtil;
   import org.apache.geronimo.xml.deployment.WebAppLoader;
  +import org.apache.geronimo.connector.outbound.connectiontracking.TrackedConnectionAssociator;
   import org.w3c.dom.Document;
   import org.xml.sax.SAXException;
   
  @@ -121,11 +124,16 @@
       private String webApplicationClass;
       private String containerName;
   
  +    private TransactionManager transactionManager;
  +    private TrackedConnectionAssociator trackedConnectionAssociator;
  +
   
       public static GeronimoMBeanInfo getGeronimoMBeanInfo() throws Exception {
           GeronimoMBeanInfo mbeanInfo = AbstractDeploymentPlanner.getGeronimoMBeanInfo(WebDeploymentPlanner.class.getName());
           mbeanInfo.addAttributeInfo(new GeronimoAttributeInfo("WebApplicationClass", true, true, "Name of the class of WebApplications"));
           mbeanInfo.addAttributeInfo(new GeronimoAttributeInfo("ContainerName", true, true, "Name of the Web Container"));
  +        mbeanInfo.addEndpoint(new GeronimoMBeanEndpoint("TransactionManager", TransactionManager.class, ObjectName.getInstance("geronimo.transaction:role=TransactionManager"), true));
  +        mbeanInfo.addEndpoint(new GeronimoMBeanEndpoint("TrackedConnectionAssociator", TrackedConnectionAssociator.class, ObjectName.getInstance("geronimo.connector:role=ConnectionTrackingCoordinator"), true));
           return mbeanInfo;
       }
   
  @@ -145,6 +153,22 @@
           this.containerName = containerName;
       }
   
  +    public TransactionManager getTransactionManager() {
  +        return transactionManager;
  +    }
  +
  +    public void setTransactionManager(TransactionManager transactionManager) {
  +        this.transactionManager = transactionManager;
  +    }
  +
  +    public TrackedConnectionAssociator getTrackedConnectionAssociator() {
  +        return trackedConnectionAssociator;
  +    }
  +
  +    public void setTrackedConnectionAssociator(TrackedConnectionAssociator trackedConnectionAssociator) {
  +        this.trackedConnectionAssociator = trackedConnectionAssociator;
  +    }
  +
       /**
        * Something to be deployed.
        * We will deploy it if it looks and smells like a webapp. That is, it
  @@ -225,6 +249,8 @@
           webApplicationContext.geronimoWebAppDoc = geronimoWebAppDoc;
           webApplicationContext.contextPath = getContextPath(baseURI);
           webApplicationContext.userTransaction = new UserTransactionImpl();
  +        webApplicationContext.userTransaction.setTransactionManager(transactionManager);
  +        webApplicationContext.userTransaction.setTrackedConnectionAssociator(trackedConnectionAssociator);
           webApplicationContext.context = getComponentContext(geronimoWebAppDoc, webApplicationContext.userTransaction);
   
           MBeanMetadata metadata = new MBeanMetadata(webApplicationName,
  
  
  
  1.3       +87 -66    incubator-geronimo/modules/web/src/java/org/apache/geronimo/web/deployment/WebDeployer.java
  
  Index: WebDeployer.java
  ===================================================================
  RCS file: /home/cvs/incubator-geronimo/modules/web/src/java/org/apache/geronimo/web/deployment/WebDeployer.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- WebDeployer.java	17 Jan 2004 01:32:38 -0000	1.2
  +++ WebDeployer.java	19 Jan 2004 06:38:23 -0000	1.3
  @@ -67,15 +67,24 @@
   import javax.management.ObjectName;
   import javax.transaction.UserTransaction;
   import javax.xml.parsers.DocumentBuilder;
  +import javax.xml.parsers.ParserConfigurationException;
   
  +import org.apache.commons.logging.Log;
  +import org.apache.commons.logging.LogFactory;
   import org.apache.geronimo.deployment.DeploymentModule;
   import org.apache.geronimo.deployment.ModuleFactory;
   import org.apache.geronimo.deployment.model.geronimo.web.GeronimoWebAppDocument;
   import org.apache.geronimo.deployment.service.GBeanDefault;
   import org.apache.geronimo.deployment.util.DeploymentHelper;
  +import org.apache.geronimo.deployment.xml.ParserFactory;
  +import org.apache.geronimo.gbean.GAttributeInfo;
  +import org.apache.geronimo.gbean.GBeanInfo;
  +import org.apache.geronimo.gbean.GBeanInfoFactory;
  +import org.apache.geronimo.gbean.GConstructorInfo;
  +import org.apache.geronimo.gbean.GEndpointInfo;
  +import org.apache.geronimo.gbean.GOperationInfo;
   import org.apache.geronimo.kernel.deployment.DeploymentException;
   import org.apache.geronimo.kernel.deployment.scanner.URLInfo;
  -import org.apache.geronimo.kernel.jmx.JMXKernel;
   import org.apache.geronimo.naming.java.ComponentContextBuilder;
   import org.apache.geronimo.naming.java.ReadOnlyContext;
   import org.apache.geronimo.naming.java.ReferenceFactory;
  @@ -98,20 +107,63 @@
    * */
   public class WebDeployer implements ModuleFactory {
   
  -    private final DocumentBuilder parser;
  +    private static final Log log = LogFactory.getLog(WebDeployer.class);
  +
  +    private final static GBeanInfo GBEAN_INFO;
  +
  +    private final ParserFactory parserFactory;
   
       private final String type;//"Jetty"
  -    private ObjectName transactionManager;
  -    private ObjectName trackedConnectionAssociator;
  -    private String webApplicationClass;
  +    private ObjectName transactionManagerNamePattern;
  +    private ObjectName trackedConnectionAssociatorNamePattern;
  +    private final String webApplicationClass;
  +    private boolean java2ClassLoadingCompliance;
   
   
  -    public WebDeployer(DocumentBuilder parser, String type, String webApplicationClass, ObjectName transactionManager, ObjectName trackedConnectionAssociator) {
  -        this.parser = parser;
  +    public WebDeployer(ParserFactory parserFactory, String type, String webApplicationClass, boolean java2ClassLoadingCompliance, ObjectName transactionManagerNamePattern, ObjectName trackedConnectionAssociatorNamePattern) {
  +        this.parserFactory = parserFactory;
           this.type = type;
           this.webApplicationClass = webApplicationClass;
  -        this.transactionManager = transactionManager;
  -        this.trackedConnectionAssociator = trackedConnectionAssociator;
  +        this.java2ClassLoadingCompliance = java2ClassLoadingCompliance;
  +        this.transactionManagerNamePattern = transactionManagerNamePattern;
  +        this.trackedConnectionAssociatorNamePattern = trackedConnectionAssociatorNamePattern;
  +    }
  +
  +    public ObjectName getTransactionManagerNamePattern() {
  +        return transactionManagerNamePattern;
  +    }
  +
  +    public void setTransactionManagerNamePattern(ObjectName transactionManagerNamePattern) {
  +        this.transactionManagerNamePattern = transactionManagerNamePattern;
  +    }
  +
  +    public ObjectName getTrackedConnectionAssociatorNamePattern() {
  +        return trackedConnectionAssociatorNamePattern;
  +    }
  +
  +    public void setTrackedConnectionAssociatorNamePattern(ObjectName trackedConnectionAssociatorNamePattern) {
  +        this.trackedConnectionAssociatorNamePattern = trackedConnectionAssociatorNamePattern;
  +    }
  +
  +    public String getType() {
  +        return type;
  +    }
  +
  +    public String getWebApplicationClass() {
  +        return webApplicationClass;
  +    }
  +
  +    public boolean isJava2ClassLoadingCompliance() {
  +        return java2ClassLoadingCompliance;
  +    }
  +
  +    public void setJava2ClassLoadingCompliance(boolean java2ClassLoadingCompliance) {
  +        this.java2ClassLoadingCompliance = java2ClassLoadingCompliance;
  +    }
  +
  +    //endpoint
  +    public ParserFactory getParserFactory() {
  +        return parserFactory;
       }
   
       public DeploymentModule getModule(URLInfo urlInfo, URI moduleID) throws DeploymentException {
  @@ -121,75 +173,44 @@
           if (deploymentHelper.locateGeronimoDD() == null || deploymentHelper.locateJ2EEDD() == null) {
               return null;
           }
  +        DocumentBuilder parser = null;
  +        try {
  +            parser = parserFactory.getParser();
  +        } catch (ParserConfigurationException e) {
  +            throw new DeploymentException("Could not configure parser", e);
  +        }
           Document webAppDoc = deploymentHelper.getJ2EEDoc(parser);
           if (webAppDoc == null) {
               return null;
           }
  +        GeronimoWebAppDocument geronimoWebAppDoc = null;
           Document geronimoWebAppDocument = deploymentHelper.getGeronimoDoc(parser);
           if (geronimoWebAppDocument == null) {
  -            return null;
  +            log.info("No Geronimo dd found, no local jndi context will be available");
  +        } else {
  +            geronimoWebAppDoc = GeronimoWebAppLoader.load(geronimoWebAppDocument);
           }
  -        GeronimoWebAppDocument geronimoWebAppDoc = GeronimoWebAppLoader.load(geronimoWebAppDocument);
  -
  -        LinkedHashSet path = new LinkedHashSet();
  -        //for now we rely on the Jetty/whatever classloader.
  -
  -        //I wonder what this does
  -        URI baseURI = URI.create(urlInfo.getUrl().toString()).normalize();
  -
  -        Map values = new HashMap(8);
  -        values.put("URI", baseURI);
  -        values.put("ParentClassLoader", null);//What do we put here?
  -        values.put("ContextPath", getContextPath(baseURI));
  -        values.put("DeploymentDescriptor", webAppDoc);
  -        values.put("GeronimoWebAppDoc", geronimoWebAppDoc);
  -        values.put("Java2ClassloadingCompliance", Boolean.FALSE);
  -        UserTransactionImpl userTransaction = new UserTransactionImpl();
  -        values.put("ComponentContext", getComponentContext(geronimoWebAppDoc, userTransaction));
  -        values.put("UserTransaction", userTransaction);
  -
  -        Map endpoints = new HashMap(2);
  -        endpoints.put("TransactionManager", Collections.singleton(transactionManager));
  -        endpoints.put("TrackedConnectionAssociator", Collections.singleton(trackedConnectionAssociator));
  -
  -        List gbeanDefaults = Collections.singletonList(new GBeanDefault(webApplicationClass, getWebApplicationObjectName(baseURI), values, endpoints));
  -        return new WebModule(moduleID, urlInfo, new ArrayList(path), gbeanDefaults);
   
  +        return new WebModule(moduleID, urlInfo, webAppDoc, geronimoWebAppDoc, this);
       }
   
  -    private String getContextPath(URI baseURI) {
  -        String path = baseURI.getPath();
  -
  -        if (path.endsWith("/")) {
  -            path = path.substring(0, path.length() - 1);
  -        }
  -
  -        int sepIndex = path.lastIndexOf('/');
  -        if (sepIndex > 0) {
  -            path = path.substring(sepIndex + 1);
  -        }
  -
  -        if (path.endsWith(".war")) {
  -            path = path.substring(0, path.length() - 4);
  -        }
  -
  -        return "/" + path;
  -    }
   
  +    static {
  +        GBeanInfoFactory infoFactory = new GBeanInfoFactory(WebDeployer.class.getName());
  +        infoFactory.addAttribute(new GAttributeInfo("Type", true));
  +        infoFactory.addAttribute(new GAttributeInfo("WebApplicationClass", true));
  +        infoFactory.addAttribute(new GAttributeInfo("Java2ClassLoadingCompliance", true));
  +        infoFactory.addAttribute(new GAttributeInfo("TransactionManagerNamePattern", true));
  +        infoFactory.addAttribute(new GAttributeInfo("TrackedConnectionAssociatorNamePattern", true));
  +        infoFactory.addOperation(new GOperationInfo("getModule", new String[]{URLInfo.class.getName(), URI.class.getName()}));
  +        infoFactory.addEndpoint(new GEndpointInfo("ParserFactory", ParserFactory.class.getName()));
  +        infoFactory.setConstructor(new GConstructorInfo(new String[]{"ParserFactory", "Type", "WebApplicationClass", "Java2ClassLoadingCompliance", "TransactionManagerNamePattern", "TrackedConnectionAssociatorNamePattern"},
  +                new Class[]{ParserFactory.class, String.class, String.class, Boolean.TYPE, ObjectName.class, ObjectName.class}));
  +        GBEAN_INFO = infoFactory.getBeanInfo();
   
  -    private ReadOnlyContext getComponentContext(GeronimoWebAppDocument geronimoWebAppDoc, UserTransaction userTransaction) throws DeploymentException {
  -        if (geronimoWebAppDoc != null) {
  -            ReferenceFactory referenceFactory = new JMXReferenceFactory(null);//JMXKernel.getMBeanServerId(getServer()));
  -            ComponentContextBuilder builder = new ComponentContextBuilder(referenceFactory, userTransaction);
  -            ReadOnlyContext context = builder.buildContext(geronimoWebAppDoc.getWebApp());
  -            return context;
  -        } else {
  -            return null;
  -        }
       }
   
  -    private String getWebApplicationObjectName(URI baseURI) {
  -        return AbstractWebContainer.BASE_WEB_APPLICATION_NAME + AbstractWebContainer.CONTAINER_CLAUSE + type + ",module=" + ObjectName.quote(baseURI.toString());
  +    public static GBeanInfo getGBeanInfo() {
  +        return GBEAN_INFO;
       }
  -
   }
  
  
  
  1.2       +105 -49   incubator-geronimo/modules/web/src/java/org/apache/geronimo/web/deployment/WebModule.java
  
  Index: WebModule.java
  ===================================================================
  RCS file: /home/cvs/incubator-geronimo/modules/web/src/java/org/apache/geronimo/web/deployment/WebModule.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- WebModule.java	16 Jan 2004 23:42:54 -0000	1.1
  +++ WebModule.java	19 Jan 2004 06:38:23 -0000	1.2
  @@ -57,22 +57,29 @@
   package org.apache.geronimo.web.deployment;
   
   import java.net.URI;
  -import java.util.Iterator;
  -import java.util.List;
  -import java.util.Map;
  -import java.util.Set;
  +import java.net.URLClassLoader;
  +import java.util.Arrays;
  +import java.util.Collections;
   
   import javax.management.MalformedObjectNameException;
   import javax.management.ObjectName;
  +import javax.transaction.UserTransaction;
   
   import org.apache.geronimo.deployment.ConfigurationCallback;
   import org.apache.geronimo.deployment.DeploymentModule;
  -import org.apache.geronimo.deployment.service.GBeanDefault;
  +import org.apache.geronimo.deployment.model.geronimo.web.GeronimoWebAppDocument;
   import org.apache.geronimo.gbean.GBeanInfo;
   import org.apache.geronimo.gbean.InvalidConfigurationException;
   import org.apache.geronimo.gbean.jmx.GBeanMBean;
   import org.apache.geronimo.kernel.deployment.DeploymentException;
   import org.apache.geronimo.kernel.deployment.scanner.URLInfo;
  +import org.apache.geronimo.naming.java.ComponentContextBuilder;
  +import org.apache.geronimo.naming.java.ReadOnlyContext;
  +import org.apache.geronimo.naming.java.ReferenceFactory;
  +import org.apache.geronimo.naming.jmx.JMXReferenceFactory;
  +import org.apache.geronimo.transaction.manager.UserTransactionImpl;
  +import org.apache.geronimo.web.AbstractWebContainer;
  +import org.w3c.dom.Document;
   
   /**
    *
  @@ -83,14 +90,16 @@
   public class WebModule implements DeploymentModule {
       private final URI moduleID;
       private final URLInfo urlInfo;
  -    private final List pathURIs;
  -    private final List gbeanDefaults;
  +    private Document deploymentDescriptorDoc;
  +    private GeronimoWebAppDocument geronimoWebAppDoc;
  +    private WebDeployer webDeployer;
   
  -    public WebModule(URI moduleID, URLInfo urlInfo, List urls, List gbeanDefaults) {
  +    public WebModule(URI moduleID, URLInfo urlInfo, Document webAppDoc, GeronimoWebAppDocument geronimoWebAppDoc, WebDeployer webDeployer) {
           this.moduleID = moduleID;
           this.urlInfo = urlInfo;
  -        this.pathURIs = urls;
  -        this.gbeanDefaults = gbeanDefaults;
  +        this.deploymentDescriptorDoc = webAppDoc;
  +        this.geronimoWebAppDoc = geronimoWebAppDoc;
  +        this.webDeployer = webDeployer;
       }
   
   
  @@ -102,47 +111,94 @@
       }
   
       public void defineGBeans(ConfigurationCallback callback, ClassLoader cl) throws DeploymentException {
  -        for (Iterator i = gbeanDefaults.iterator(); i.hasNext();) {
  -            GBeanDefault defs = (GBeanDefault) i.next();
  -            ObjectName name;
  -            try {
  -                name = new ObjectName(defs.getObjectName());
  -            } catch (MalformedObjectNameException e) {
  -                throw new DeploymentException("Invalid JMX ObjectName: " + defs.getObjectName(), e);
  -            }
  -
  -            GBeanInfo gbeanInfo = defs.getGBeanInfo();
  -            if (gbeanInfo == null) {
  -                String className = defs.getClassName();
  -                try {
  -                    gbeanInfo = GBeanInfo.getGBeanInfo(className, cl);
  -                } catch (InvalidConfigurationException e) {
  -                    throw new DeploymentException("Unable to get GBeanInfo from class " + className, e);
  -                }
  -            }
  -
  -            GBeanMBean gbean;
  -            try {
  -                gbean = new GBeanMBean(gbeanInfo);
  -            } catch (InvalidConfigurationException e) {
  -                throw new DeploymentException("Unable to create GMBean", e);
  -            }
  -            for (Iterator j = defs.getValues().entrySet().iterator(); j.hasNext();) {
  -                Map.Entry entry = (Map.Entry) j.next();
  -                try {
  -                    gbean.setAttribute((String) entry.getKey(), entry.getValue());
  -                } catch (Exception e) {
  -                    throw new DeploymentException("Unable to set GMBean attribute " + entry.getKey(), e);
  -                }
  -            }
  -            for (Iterator iterator = defs.getEndpoints().entrySet().iterator(); iterator.hasNext();) {
  -                Map.Entry entry = (Map.Entry) iterator.next();
  -                gbean.setEndpointPatterns((String) entry.getKey(), (Set) entry.getValue());
  -            }
  -            callback.addGBean(name, gbean);
  +        GBeanInfo gbeanInfo;
  +        try {
  +            gbeanInfo = GBeanInfo.getGBeanInfo(webDeployer.getWebApplicationClass(), cl);
  +        } catch (InvalidConfigurationException e) {
  +            throw new DeploymentException("Unable to get GBeanInfo from class " + webDeployer.getWebApplicationClass(), e);
           }
  +
  +        GBeanMBean gbean;
  +        try {
  +            gbean = new GBeanMBean(gbeanInfo);
  +        } catch (InvalidConfigurationException e) {
  +            throw new DeploymentException("Unable to create GMBean", e);
  +        }
  +
  +        try {
  +            getClass().getClassLoader().loadClass("org.apache.jasper.servlet.JspServlet");
  +        } catch (ClassNotFoundException e) {
  +            throw new DeploymentException("Could not load jsp servlet class: urls: " + Arrays.asList(((URLClassLoader)getClass().getClassLoader()).getURLs()), e);
  +        }
  +
  +        //I wonder what this does
  +        URI baseURI = URI.create(urlInfo.getUrl().toString()).normalize();
  +
  +        try {
  +            gbean.setAttribute("URI", baseURI);
  +            //this needs to be an endpoint to ConfigurationParent
  +            gbean.setAttribute("ParentClassLoader", null);//What do we put here?
  +            gbean.setAttribute("ContextPath", getContextPath(baseURI));
  +            gbean.setAttribute("DeploymentDescriptorDoc", deploymentDescriptorDoc);
  +            gbean.setAttribute("GeronimoWebAppDoc", geronimoWebAppDoc);
  +            gbean.setAttribute("Java2ClassLoadingCompliance", Boolean.valueOf(webDeployer.isJava2ClassLoadingCompliance()));
  +            UserTransactionImpl userTransaction = new UserTransactionImpl();
  +            gbean.setAttribute("ComponentContext", getComponentContext(geronimoWebAppDoc, userTransaction));
  +            gbean.setAttribute("UserTransaction", userTransaction);
  +        } catch (Exception e) {
  +            throw new DeploymentException("Unable to set WebApplication attribute", e);
  +        }
  +
  +        gbean.setEndpointPatterns("TransactionManager", Collections.singleton(webDeployer.getTransactionManagerNamePattern()));
  +        gbean.setEndpointPatterns("TrackedConnectionAssociator", Collections.singleton(webDeployer.getTrackedConnectionAssociatorNamePattern()));
  +
  +
  +        ObjectName name;
  +        try {
  +            name = ObjectName.getInstance(getWebApplicationObjectName());
  +        } catch (MalformedObjectNameException e) {
  +            throw new DeploymentException("Invalid JMX ObjectName: " + getWebApplicationObjectName(), e);
  +        }
  +
  +        callback.addGBean(name, gbean);
       }
   
       public void complete() {
       }
  +
  +    private String getContextPath(URI baseURI) {
  +        String path = baseURI.getPath();
  +
  +        if (path.endsWith("/")) {
  +            path = path.substring(0, path.length() - 1);
  +        }
  +
  +        int sepIndex = path.lastIndexOf('/');
  +        if (sepIndex > 0) {
  +            path = path.substring(sepIndex + 1);
  +        }
  +
  +        if (path.endsWith(".war")) {
  +            path = path.substring(0, path.length() - 4);
  +        }
  +
  +        return "/" + path;
  +    }
  +
  +
  +    private ReadOnlyContext getComponentContext(GeronimoWebAppDocument geronimoWebAppDoc, UserTransaction userTransaction) throws DeploymentException {
  +        if (geronimoWebAppDoc != null) {
  +            ReferenceFactory referenceFactory = new JMXReferenceFactory(null);//JMXKernel.getMBeanServerId(getServer()));
  +            ComponentContextBuilder builder = new ComponentContextBuilder(referenceFactory, userTransaction);
  +            ReadOnlyContext context = builder.buildContext(geronimoWebAppDoc.getWebApp());
  +            return context;
  +        } else {
  +            return null;
  +        }
  +    }
  +
  +    private String getWebApplicationObjectName() {
  +        return AbstractWebContainer.BASE_WEB_APPLICATION_NAME + AbstractWebContainer.CONTAINER_CLAUSE + webDeployer.getType() + ",module=" + ObjectName.quote(moduleID.toString());
  +    }
  +
   }
  
  
  
  1.13      +11 -8     incubator-geronimo/modules/web/src/java/org/apache/geronimo/web/jetty/JettyWebApplication.java
  
  Index: JettyWebApplication.java
  ===================================================================
  RCS file: /home/cvs/incubator-geronimo/modules/web/src/java/org/apache/geronimo/web/jetty/JettyWebApplication.java,v
  retrieving revision 1.12
  retrieving revision 1.13
  diff -u -r1.12 -r1.13
  --- JettyWebApplication.java	16 Jan 2004 23:31:21 -0000	1.12
  +++ JettyWebApplication.java	19 Jan 2004 06:38:23 -0000	1.13
  @@ -24,6 +24,7 @@
   import org.apache.geronimo.web.AbstractWebApplication;
   import org.apache.geronimo.transaction.manager.UserTransactionImpl;
   import org.mortbay.jetty.servlet.WebApplicationContext;
  +import org.w3c.dom.Document;
   
   
   /**
  @@ -48,21 +49,20 @@
           super(new org.apache.geronimo.web.WebApplicationContext());
       }
   
  -    public JettyWebApplication(URI uri, ClassLoader parentClassLoader, WebApp webApp, GeronimoWebAppDocument geronimoWebAppDocument, String contextPath,
  -                               Context context, boolean java2ClassLoadingCompliance, UserTransactionImpl userTransaction, TransactionManager transactionManager, TrackedConnectionAssociator trackedConnectionAssociator) {
  -        super(uri, parentClassLoader, webApp, geronimoWebAppDocument, contextPath, context,
  +    public JettyWebApplication(URI uri, String contextID, ClassLoader parentClassLoader, Document deploymentDescriptorDoc, GeronimoWebAppDocument geronimoWebAppDocument, String contextPath,
  +                               Context componentContext, boolean java2ClassLoadingCompliance, UserTransactionImpl userTransaction, TransactionManager transactionManager, TrackedConnectionAssociator trackedConnectionAssociator) {
  +        super(uri, contextID, parentClassLoader, deploymentDescriptorDoc, geronimoWebAppDocument, contextPath, componentContext,
                   java2ClassLoadingCompliance, userTransaction, transactionManager, trackedConnectionAssociator);
           if (uri == null) {
               jettyContext = new JettyWebApplicationContext();
           } else {
  -            jettyContext = new JettyWebApplicationContext(uri.toString());
  +            jettyContext = new JettyWebApplicationContext(uri.toString(), contextID, componentContext, transactionManager, trackedConnectionAssociator);
           }
           //we could perhaps use geronimo classloading
           //jettyContext.setClassLoader(classLoader);
           jettyContext.setParentClassLoader(parentClassLoader);
           jettyContext.setContextPath(contextPath);
           jettyContext.setClassLoaderJava2Compliant(java2ClassLoadingCompliance);
  -        jettyContext.setComponentContext(context);
       }
   
       /**
  @@ -75,14 +75,17 @@
           if (uri == null) {
               jettyContext = new JettyWebApplicationContext();
           } else {
  -            jettyContext = new JettyWebApplicationContext(uri.toString());
  +            jettyContext = new JettyWebApplicationContext(uri.toString(),
  +                    null,
  +                    webApplicationContext.context,
  +                    webApplicationContext.userTransaction.getTransactionManager(),
  +                    webApplicationContext.userTransaction.getTrackedConnectionAssociator());
           }
           //we could perhaps use geronimo classloading
           //jettyContext.setClassLoader(webApplicationContext.classLoader);
           jettyContext.setParentClassLoader(webApplicationContext.parentClassLoader);
           jettyContext.setContextPath(webApplicationContext.contextPath);
           jettyContext.setClassLoaderJava2Compliant(webApplicationContext.java2ClassLoadingCompliance);
  -        jettyContext.setComponentContext(webApplicationContext.context);
   
       }
   
  
  
  
  1.6       +105 -9    incubator-geronimo/modules/web/src/java/org/apache/geronimo/web/jetty/JettyWebApplicationContext.java
  
  Index: JettyWebApplicationContext.java
  ===================================================================
  RCS file: /home/cvs/incubator-geronimo/modules/web/src/java/org/apache/geronimo/web/jetty/JettyWebApplicationContext.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- JettyWebApplicationContext.java	30 Dec 2003 08:28:58 -0000	1.5
  +++ JettyWebApplicationContext.java	19 Jan 2004 06:38:23 -0000	1.6
  @@ -55,11 +55,27 @@
    */
   package org.apache.geronimo.web.jetty;
   
  +import java.util.Collections;
  +import java.util.Map;
  +import java.util.Set;
  +import java.util.WeakHashMap;
  +
   import javax.naming.Context;
  +import javax.resource.ResourceException;
   import javax.security.jacc.PolicyContext;
  +import javax.transaction.RollbackException;
  +import javax.transaction.Status;
  +import javax.transaction.SystemException;
  +import javax.transaction.Transaction;
  +import javax.transaction.TransactionManager;
   
   import org.apache.commons.logging.Log;
   import org.apache.commons.logging.LogFactory;
  +import org.apache.geronimo.connector.outbound.ConnectorComponentContext;
  +import org.apache.geronimo.connector.outbound.ConnectorTransactionContext;
  +import org.apache.geronimo.connector.outbound.connectiontracking.TrackedConnectionAssociator;
  +import org.apache.geronimo.connector.outbound.connectiontracking.defaultimpl.DefaultComponentContext;
  +import org.apache.geronimo.connector.outbound.connectiontracking.defaultimpl.DefaultTransactionContext;
   import org.apache.geronimo.naming.java.ReadOnlyContext;
   import org.apache.geronimo.naming.java.RootContext;
   import org.mortbay.http.HttpRequest;
  @@ -72,28 +88,90 @@
    * @version $Revision$ $Date$
    */
   public class JettyWebApplicationContext extends WebApplicationContext {
  +
  +    private static Log log = LogFactory.getLog(JettyWebApplicationContext.class);
  +
  +
       private Context componentContext;
       private String contextID;
  -    private Log log = LogFactory.getLog(JettyWebApplicationContext.class);
  +    private TransactionManager transactionManager;
  +    private TrackedConnectionAssociator trackedConnectionAssociator;
  +
  +    //we don't examine the dd for these yet.
  +    private final Set unshareableResources = Collections.EMPTY_SET;
  +
  +    //this should be replaced by global tx context handling.
  +    private final Map transactionToTransactionContextMap = Collections.synchronizedMap(new WeakHashMap());
   
       public JettyWebApplicationContext() {
       }
   
  -    public JettyWebApplicationContext(String webApp) {
  +    public JettyWebApplicationContext(String webApp, String contextID, Context componentContext, TransactionManager transactionManager, TrackedConnectionAssociator trackedConnectionAssociator) {
           super(webApp);
  +        this.contextID = contextID;
  +        this.componentContext = componentContext;
  +        this.transactionManager = transactionManager;
  +        this.trackedConnectionAssociator = trackedConnectionAssociator;
       }
   
       public Object enterContextScope(HttpRequest httpRequest, HttpResponse httpResponse) {
           log.info("Entering context " + httpRequest.getRequestURL());
  -        RootContext.setComponentContext((ReadOnlyContext)componentContext);
  -        PolicyContext.setContextID(contextID);
  -        return super.enterContextScope(httpRequest, httpResponse);
  +        ReadOnlyContext oldContext = RootContext.getComponentContext();
  +        RootContext.setComponentContext((ReadOnlyContext) componentContext);
  +        String oldContextID = null;
  +        try {
  +            oldContextID = PolicyContext.getContextID();
  +        } catch (Throwable e) {
  +            log.info(e);
  +        }
  +        try {
  +            PolicyContext.setContextID(contextID);
  +        } catch (Throwable e) {
  +            log.info(e);
  +        }
  +        //tx handling. Definitely a hack until we get a system wide tx context system.
  +        try {
  +            Transaction transaction = transactionManager == null? null: transactionManager.getTransaction();
  +            ConnectorTransactionContext newConnectorTransactionContext;
  +            if (transaction == null || transaction.getStatus() == Status.STATUS_COMMITTED || transaction.getStatus() == Status.STATUS_ROLLEDBACK) {
  +                newConnectorTransactionContext = new DefaultTransactionContext(null);
  +            } else {
  +                newConnectorTransactionContext = (ConnectorTransactionContext) transactionToTransactionContextMap.get(transaction);
  +                if (newConnectorTransactionContext == null) {
  +                    newConnectorTransactionContext = new DefaultTransactionContext(transaction);
  +                    transactionToTransactionContextMap.put(transaction, newConnectorTransactionContext);
  +                }
  +            }
  +            Set oldUnshareableResources = trackedConnectionAssociator.setUnshareableResources(unshareableResources);
  +            ConnectorComponentContext oldConnectorComponentContext = trackedConnectionAssociator.enter(new DefaultComponentContext());
  +            ConnectorTransactionContext oldConnectorTransactionContext = trackedConnectionAssociator.setConnectorTransactionContext(newConnectorTransactionContext);
  +            Object scope = super.enterContextScope(httpRequest, httpResponse);
  +            ThreadContext threadContext = new ThreadContext(oldUnshareableResources, oldConnectorComponentContext, oldConnectorTransactionContext, oldContext, oldContextID, scope);
  +            return threadContext;
  +        } catch (SystemException e) {
  +            throw new RuntimeException(e);
  +        } catch (RollbackException e) {
  +            throw new RuntimeException(e);
  +        } catch (ResourceException e) {
  +            throw new RuntimeException(e);
  +        }
       }
   
       public void leaveContextScope(HttpRequest httpRequest, HttpResponse httpResponse, Object o) {
  -        super.leaveContextScope(httpRequest, httpResponse, o);
  -        RootContext.setComponentContext(null);
  -        PolicyContext.setContextID(null);
  +        ThreadContext threadContext = (ThreadContext) o;
  +        super.leaveContextScope(httpRequest, httpResponse, threadContext == null? null: threadContext.scope);
  +        if (threadContext == null) {
  +            return;
  +        }
  +        try {
  +            trackedConnectionAssociator.exit(threadContext.connectorComponentContext, unshareableResources);
  +        } catch (ResourceException e) {
  +            throw new RuntimeException(e);
  +        }
  +        trackedConnectionAssociator.resetConnectorTransactionContext(threadContext.connectorTransactionContext);
  +        trackedConnectionAssociator.setUnshareableResources(threadContext.unshareableResources);
  +        RootContext.setComponentContext(threadContext.context);
  +        PolicyContext.setContextID(threadContext.contextID);
           log.info("Leaving context " + httpRequest.getRequestURL());
       }
   
  @@ -111,5 +189,23 @@
   
       public void setContextID(String contextID) {
           this.contextID = contextID;
  +    }
  +
  +    private static class ThreadContext {
  +        final Set unshareableResources;
  +        final ConnectorComponentContext connectorComponentContext;
  +        final ConnectorTransactionContext connectorTransactionContext;
  +        final ReadOnlyContext context;
  +        final String contextID;
  +        final Object scope;
  +
  +        ThreadContext(Set unshareableResources, ConnectorComponentContext connectorComponentContext, ConnectorTransactionContext connectorTransactionContext, ReadOnlyContext context, String contextID, Object scope) {
  +            this.unshareableResources = unshareableResources;
  +            this.connectorComponentContext = connectorComponentContext;
  +            this.connectorTransactionContext = connectorTransactionContext;
  +            this.context = context;
  +            this.contextID = contextID;
  +            this.scope = scope;
  +        }
       }
   }