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;
+ }
}
}