You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by db...@apache.org on 2010/08/21 18:58:58 UTC

svn commit: r987790 [1/2] - in /openejb/trunk/openejb3: assembly/openejb-jetty/openejb-jetty-common/src/main/java/org/apache/openejb/jetty/common/ assembly/openejb-standalone/ assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/ope...

Author: dblevins
Date: Sat Aug 21 16:58:57 2010
New Revision: 987790

URL: http://svn.apache.org/viewvc?rev=987790&view=rev
Log:
Better support for standalone modules
Partial revert of change allowing AppInfo.jarPath to be null -- this broke the tomcat integration, deploy tool and a few other things.
Strict non-null check on App id/path throughout deployment.
Partial merge of David Jencks' code for a better "openejb.strict.interface.declaration" mode. Still needs to be enabled and related tests flushed out

Modified:
    openejb/trunk/openejb3/assembly/openejb-jetty/openejb-jetty-common/src/main/java/org/apache/openejb/jetty/common/OpenEJBConfiguration.java
    openejb/trunk/openejb3/assembly/openejb-standalone/try.sh
    openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/TomcatWebAppBuilder.java
    openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-webapp/pom.xml
    openejb/trunk/openejb3/container/openejb-activemq4/src/test/java/org/apache/openejb/core/mdb/CustomMdbContainerTest.java
    openejb/trunk/openejb3/container/openejb-activemq4/src/test/java/org/apache/openejb/core/mdb/QuartzMdbContainerTest.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/OpenEjbContainer.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/DeployerEjb.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/AppInfo.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ClientInfo.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ConnectorInfo.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EjbJarInfo.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/JndiBuilder.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/WebAppInfo.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/client/LocalInitialContext.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AppInfoBuilder.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AppModule.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/Deploy.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/EjbJarInfoBuilder.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ReadDescriptors.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/VmDeploymentManager.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/AppContext.java
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/timer/DefaultTimerThreadPoolAdapter.java
    openejb/trunk/openejb3/container/openejb-core/src/main/resources/org/apache/openejb/config/rules/Messages.properties
    openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/assembler/classic/EjbRefTest.java
    openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/config/ConfigurationFactoryTest.java
    openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/InheritedAppExceptionTest.java
    openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/cmp/jpa/AuthorBean.java
    openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/cmp/jpa/BookBean.java
    openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/mdb/CustomMdbContainerTest.java
    openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/mdb/QuartzMdbContainerTest.java
    openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/singleton/DependsOnTest.java
    openejb/trunk/openejb3/container/openejb-jee/src/main/java/org/apache/openejb/jee/Application.java
    openejb/trunk/openejb3/container/openejb-junit/src/main/java/org/apache/openejb/junit/LocalClientRunner.java
    openejb/trunk/openejb3/container/openejb-osgi/src/main/java/org/apache/openejb/core/osgi/impl/Deployer.java
    openejb/trunk/openejb3/container/openejb-spring/src/main/java/org/apache/openejb/spring/AbstractApplication.java
    openejb/trunk/openejb3/container/openejb-spring/src/main/java/org/apache/openejb/spring/ClassPathApplication.java
    openejb/trunk/openejb3/server/openejb-client/src/main/java/org/apache/openejb/client/Main.java
    openejb/trunk/openejb3/server/openejb-client/src/test/java/org/apache/openejb/client/MainTest.java
    openejb/trunk/openejb3/server/openejb-ejbd/src/main/java/org/apache/openejb/server/ejbd/JndiRequestHandler.java
    openejb/trunk/openejb3/server/openejb-ejbd/src/test/java/org/apache/openejb/server/ejbd/DeploymentIndexTest.java
    openejb/trunk/openejb3/server/openejb-webservices/src/main/java/org/apache/openejb/server/webservices/WsService.java

Modified: openejb/trunk/openejb3/assembly/openejb-jetty/openejb-jetty-common/src/main/java/org/apache/openejb/jetty/common/OpenEJBConfiguration.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/assembly/openejb-jetty/openejb-jetty-common/src/main/java/org/apache/openejb/jetty/common/OpenEJBConfiguration.java?rev=987790&r1=987789&r2=987790&view=diff
==============================================================================
--- openejb/trunk/openejb3/assembly/openejb-jetty/openejb-jetty-common/src/main/java/org/apache/openejb/jetty/common/OpenEJBConfiguration.java (original)
+++ openejb/trunk/openejb3/assembly/openejb-jetty/openejb-jetty-common/src/main/java/org/apache/openejb/jetty/common/OpenEJBConfiguration.java Sat Aug 21 16:58:57 2010
@@ -155,10 +155,7 @@ public class OpenEJBConfiguration implem
         WebModule webModule = createWebModule(application);
 
         // create the app module
-        AppModule appModule = new AppModule(webModule.getClassLoader(), webModule.getJarLocation());
-
-        // add the web module itself
-        appModule.getWebModules().add(webModule);
+        AppModule appModule = new AppModule(webModule);
 
         // check each url to determine if it is an ejb jar
         for (URL url : getUrls(application)) {

Modified: openejb/trunk/openejb3/assembly/openejb-standalone/try.sh
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/assembly/openejb-standalone/try.sh?rev=987790&r1=987789&r2=987790&view=diff
==============================================================================
--- openejb/trunk/openejb3/assembly/openejb-standalone/try.sh (original)
+++ openejb/trunk/openejb3/assembly/openejb-standalone/try.sh Sat Aug 21 16:58:57 2010
@@ -26,12 +26,13 @@ cd target/
 tar xzvf openejb-$VERSION.tar.gz
 cd openejb-$VERSION
 mkdir apps
-cp $JAR apps/
+mkdir logs
+#cp $JAR apps/
 ./bin/openejb start &
 sleep 1
-tail -f logs/openejb.log
-#sleep 14
-#./bin/openejb deploy -h
-#$JAR
+tail -f logs/openejb.log &
+sleep 14
+echo ./bin/openejb deploy $JAR
+./bin/openejb deploy $JAR
 
 

Modified: openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/TomcatWebAppBuilder.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/TomcatWebAppBuilder.java?rev=987790&r1=987789&r2=987790&view=diff
==============================================================================
--- openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/TomcatWebAppBuilder.java (original)
+++ openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/TomcatWebAppBuilder.java Sat Aug 21 16:58:57 2010
@@ -213,7 +213,7 @@ public class TomcatWebAppBuilder impleme
         for (WebAppInfo webApp : appInfo.webApps) {
             if (getContextInfo(webApp) == null) {
                 StandardContext standardContext = new StandardContext();
-                String contextXmlFile = webApp.codebase + "/META-INF/context.xml";
+                String contextXmlFile = webApp.path + "/META-INF/context.xml";
                 if (new File(contextXmlFile).exists()) {
                     standardContext.setConfigFile(contextXmlFile);
                     standardContext.setOverride(true);
@@ -222,7 +222,7 @@ public class TomcatWebAppBuilder impleme
                 standardContext.addLifecycleListener(contextConfig);
 
                 standardContext.setPath("/" + webApp.contextRoot);
-                standardContext.setDocBase(webApp.codebase);
+                standardContext.setDocBase(webApp.path);
                 standardContext.setParentClassLoader(classLoader);
                 standardContext.setDelegate(true);
 
@@ -480,7 +480,7 @@ public class TomcatWebAppBuilder impleme
         ContextInfo contextInfo = getContextInfo(standardContext);
         if (contextInfo != null && contextInfo.appInfo != null && contextInfo.deployer == null) {
             try {
-                assembler.destroyApplication(contextInfo.appInfo.jarPath);
+                assembler.destroyApplication(contextInfo.appInfo.path);
             } catch (Exception e) {
                 logger.error("Unable to stop web application " + standardContext.getPath() + ": Exception: " + e.getMessage(), e);
             }
@@ -524,9 +524,9 @@ public class TomcatWebAppBuilder impleme
                 DeployedApplication deployedApplication = entry.getValue();
                 if (deployedApplication.isModified()) {
                     try {
-                        assembler.destroyApplication(deployedApplication.appInfo.jarPath);
+                        assembler.destroyApplication(deployedApplication.appInfo.path);
                     } catch (Exception e) {
-                        logger.error("Unable to application " + deployedApplication.appInfo.jarPath + ": Exception: " + e.getMessage(), e);
+                        logger.error("Unable to application " + deployedApplication.appInfo.path + ": Exception: " + e.getMessage(), e);
                     }
                     iterator.remove();
                 }
@@ -660,7 +660,7 @@ public class TomcatWebAppBuilder impleme
         WebModule webModule = createWebModule(standardContext);
 
         // create the app module
-        AppModule appModule = new AppModule(webModule.getClassLoader(), webModule.getJarLocation());
+        AppModule appModule = new AppModule(webModule);
 
         // add the web module itself
         appModule.getWebModules().add(webModule);

Modified: openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-webapp/pom.xml
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-webapp/pom.xml?rev=987790&r1=987789&r2=987790&view=diff
==============================================================================
--- openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-webapp/pom.xml (original)
+++ openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-webapp/pom.xml Sat Aug 21 16:58:57 2010
@@ -218,6 +218,16 @@
       <groupId>org.apache.tomcat</groupId>
       <artifactId>catalina</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.apache.myfaces.core</groupId>
+      <artifactId>myfaces-api</artifactId>
+      <version>1.2.2</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.myfaces.core</groupId>
+      <artifactId>myfaces-impl</artifactId>
+      <version>1.2.2</version>
+    </dependency>
   </dependencies>
 </project>
 

Modified: openejb/trunk/openejb3/container/openejb-activemq4/src/test/java/org/apache/openejb/core/mdb/CustomMdbContainerTest.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-activemq4/src/test/java/org/apache/openejb/core/mdb/CustomMdbContainerTest.java?rev=987790&r1=987789&r2=987790&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-activemq4/src/test/java/org/apache/openejb/core/mdb/CustomMdbContainerTest.java (original)
+++ openejb/trunk/openejb3/container/openejb-activemq4/src/test/java/org/apache/openejb/core/mdb/CustomMdbContainerTest.java Sat Aug 21 16:58:57 2010
@@ -87,7 +87,7 @@ public class CustomMdbContainerTest exte
         MessageAdapter messageAdapter = inbound.setMessageAdapter(new MessageAdapter());
         MessageListener listener = messageAdapter.addMessageListener(new MessageListener(EmailConsumer.class, EmailAccountInfo.class));
         listener.getActivationSpec().addRequiredConfigProperty("address");
-        app.getResourceModules().add(new ConnectorModule(connector));
+        app.getConnectorModules().add(new ConnectorModule(connector));
 
         EjbJar ejbJar = new EjbJar();
         ejbJar.addEnterpriseBean(new MessageDrivenBean(EmailBean.class));

Modified: openejb/trunk/openejb3/container/openejb-activemq4/src/test/java/org/apache/openejb/core/mdb/QuartzMdbContainerTest.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-activemq4/src/test/java/org/apache/openejb/core/mdb/QuartzMdbContainerTest.java?rev=987790&r1=987789&r2=987790&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-activemq4/src/test/java/org/apache/openejb/core/mdb/QuartzMdbContainerTest.java (original)
+++ openejb/trunk/openejb3/container/openejb-activemq4/src/test/java/org/apache/openejb/core/mdb/QuartzMdbContainerTest.java Sat Aug 21 16:58:57 2010
@@ -78,7 +78,7 @@ public class QuartzMdbContainerTest exte
         MessageAdapter messageAdapter = inbound.setMessageAdapter(new MessageAdapter());
         MessageListener listener = messageAdapter.addMessageListener(new MessageListener(Job.class, JobSpec.class));
         listener.getActivationSpec().addRequiredConfigProperty("cronExpression");
-        app.getResourceModules().add(new ConnectorModule(connector));
+        app.getConnectorModules().add(new ConnectorModule(connector));
 
         EjbJar ejbJar = new EjbJar();
         ejbJar.addEnterpriseBean(new MessageDrivenBean(CronBean.class));

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/OpenEjbContainer.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/OpenEjbContainer.java?rev=987790&r1=987789&r2=987790&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/OpenEjbContainer.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/OpenEjbContainer.java Sat Aug 21 16:58:57 2010
@@ -36,6 +36,7 @@ import javax.naming.NameNotFoundExceptio
 import javax.naming.NamingException;
 import org.apache.openejb.assembler.classic.AppInfo;
 import org.apache.openejb.assembler.classic.Assembler;
+import org.apache.openejb.config.AnnotationDeployer;
 import org.apache.openejb.config.ConfigurationFactory;
 import org.apache.openejb.config.DeploymentsResolver;
 import org.apache.openejb.config.RequireDescriptors;
@@ -83,6 +84,7 @@ public class OpenEjbContainer extends EJ
             String appId = (String) properties.get(EJBContainer.APP_NAME);
             try {
                 Properties props = new Properties();
+                props.put(AnnotationDeployer.ProcessAnnotatedBeans.STRICT_INTERFACE_DECLARATION, Boolean.toString(true));
                 props.put(DeploymentsResolver.DEPLOYMENTS_CLASSPATH_PROPERTY, Boolean.toString(false));
                 //This causes scan of the entire classpath except for default excludes.  This may be quite slow.
                 props.put(DeploymentsResolver.CLASSPATH_INCLUDE, ".*");

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/DeployerEjb.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/DeployerEjb.java?rev=987790&r1=987789&r2=987790&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/DeployerEjb.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/DeployerEjb.java Sat Aug 21 16:58:57 2010
@@ -112,7 +112,7 @@ public class DeployerEjb implements Depl
             for (DeploymentModule module : appModule.getWebModules()) {
                 modules.put(module.getModuleId(), module);
             }
-            for (DeploymentModule module : appModule.getResourceModules()) {
+            for (DeploymentModule module : appModule.getConnectorModules()) {
                 modules.put(module.getModuleId(), module);
             }
 

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/AppInfo.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/AppInfo.java?rev=987790&r1=987789&r2=987790&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/AppInfo.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/AppInfo.java Sat Aug 21 16:58:57 2010
@@ -26,7 +26,8 @@ import java.util.TreeSet;
  */
 public class AppInfo extends InfoObject {
     public String appId;
-    public String jarPath;
+    public String path;
+    public boolean standaloneModule;
     public final List<ClientInfo> clients = new ArrayList<ClientInfo>();
     public final List<EjbJarInfo> ejbJars = new ArrayList<EjbJarInfo>();
     public final List<ConnectorInfo> connectors = new ArrayList<ConnectorInfo>();

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java?rev=987790&r1=987789&r2=987790&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java Sat Aug 21 16:58:57 2010
@@ -98,6 +98,7 @@ import org.apache.openejb.spi.Applicatio
 import org.apache.openejb.spi.ContainerSystem;
 import org.apache.openejb.spi.SecurityService;
 import org.apache.openejb.util.AsmParameterNameLoader;
+import org.apache.openejb.util.Debug;
 import org.apache.openejb.util.LogCategory;
 import org.apache.openejb.util.Logger;
 import org.apache.openejb.util.Messages;
@@ -164,10 +165,10 @@ public class Assembler extends Assembler
         for (DeploymentListener listener : listeners) {
             String listenerName = listener.getClass().getSimpleName();
             try {
-                logger.debug("appCreationEvent.start", listenerName, getPath(appInfo));
+                logger.debug("appCreationEvent.start", listenerName, appInfo.path);
                 listener.afterApplicationCreated(appInfo);
             } catch (Throwable e) {
-                logger.error("appCreationEvent.failed", e, listenerName, getPath(appInfo));
+                logger.error("appCreationEvent.failed", e, listenerName, appInfo.path);
             }
         }
     }
@@ -180,10 +181,10 @@ public class Assembler extends Assembler
         for (DeploymentListener listener : listeners) {
             String listenerName = listener.getClass().getSimpleName();
             try {
-                logger.debug("appDestroyedEvent.start", listenerName, getPath(appInfo));
+                logger.debug("appDestroyedEvent.start", listenerName, appInfo.path);
                 listener.beforeApplicationDestroyed(appInfo);
             } catch (Throwable e) {
-                logger.error("appDestroyedEvent.failed", e, listenerName, getPath(appInfo));
+                logger.error("appDestroyedEvent.failed", e, listenerName, appInfo.path);
             }
         }
     }
@@ -371,7 +372,7 @@ public class Assembler extends Assembler
             } catch (DuplicateDeploymentIdException e) {
                 // already logged.
             } catch (Throwable e) {
-                logger.error("appNotDeployed", e, getPath(appInfo));
+                logger.error("appNotDeployed", e, appInfo.path);
             }
         }
     }
@@ -386,7 +387,8 @@ public class Assembler extends Assembler
 
     public void createEjbJar(EjbJarInfo ejbJar) throws NamingException, IOException, OpenEJBException {
         AppInfo appInfo = new AppInfo();
-        appInfo.jarPath = ejbJar.jarPath;
+        appInfo.path = ejbJar.path;
+        appInfo.appId = ejbJar.moduleId;
         appInfo.ejbJars.add(ejbJar);
         createApplication(appInfo);
     }
@@ -397,49 +399,56 @@ public class Assembler extends Assembler
 
     public void createEjbJar(EjbJarInfo ejbJar, ClassLoader classLoader) throws NamingException, IOException, OpenEJBException {
         AppInfo appInfo = new AppInfo();
-        appInfo.jarPath = ejbJar.jarPath;
+        appInfo.path = ejbJar.path;
+        appInfo.appId = ejbJar.moduleId;
         appInfo.ejbJars.add(ejbJar);
         createApplication(appInfo, classLoader);
     }
 
     public void createClient(ClientInfo clientInfo) throws NamingException, IOException, OpenEJBException {
         AppInfo appInfo = new AppInfo();
-        appInfo.jarPath = clientInfo.moduleId;
+        appInfo.path = clientInfo.path;
+        appInfo.appId = clientInfo.moduleId;
         appInfo.clients.add(clientInfo);
         createApplication(appInfo);
     }
 
     public void createClient(ClientInfo clientInfo, ClassLoader classLoader) throws NamingException, IOException, OpenEJBException {
         AppInfo appInfo = new AppInfo();
-        appInfo.jarPath = clientInfo.moduleId;
+        appInfo.path = clientInfo.path;
+        appInfo.appId = clientInfo.moduleId;
         appInfo.clients.add(clientInfo);
         createApplication(appInfo, classLoader);
     }
 
     public void createConnector(ConnectorInfo connectorInfo) throws NamingException, IOException, OpenEJBException {
         AppInfo appInfo = new AppInfo();
-        appInfo.jarPath = connectorInfo.moduleId;
+        appInfo.path = connectorInfo.path;
+        appInfo.appId = connectorInfo.moduleId;
         appInfo.connectors.add(connectorInfo);
         createApplication(appInfo);
     }
 
     public void createConnector(ConnectorInfo connectorInfo, ClassLoader classLoader) throws NamingException, IOException, OpenEJBException {
         AppInfo appInfo = new AppInfo();
-        appInfo.jarPath = connectorInfo.moduleId;
+        appInfo.path = connectorInfo.path;
+        appInfo.appId = connectorInfo.moduleId;
         appInfo.connectors.add(connectorInfo);
         createApplication(appInfo, classLoader);
     }
 
     public void createWebApp(WebAppInfo webAppInfo) throws NamingException, IOException, OpenEJBException {
         AppInfo appInfo = new AppInfo();
-        appInfo.jarPath = webAppInfo.moduleId;
+        appInfo.path = webAppInfo.path;
+        appInfo.appId = webAppInfo.moduleId;
         appInfo.webApps.add(webAppInfo);
         createApplication(appInfo);
     }
 
     public void createWebApp(WebAppInfo webAppInfo, ClassLoader classLoader) throws NamingException, IOException, OpenEJBException {
         AppInfo appInfo = new AppInfo();
-        appInfo.jarPath = webAppInfo.moduleId;
+        appInfo.path = webAppInfo.path;
+        appInfo.appId = webAppInfo.moduleId;
         appInfo.webApps.add(webAppInfo);
         createApplication(appInfo, classLoader);
     }
@@ -453,8 +462,18 @@ public class Assembler extends Assembler
     }
 
     public List<DeploymentInfo> createApplication(AppInfo appInfo, ClassLoader classLoader, boolean start) throws OpenEJBException, IOException, NamingException {
-
-        logger.info("createApplication.start", getPath(appInfo));
+        // The path is used in the UrlCache, command line deployer, JNDI name templates, tomcat integration and a few other places 
+        if (appInfo.path == null) throw new IllegalArgumentException("AppInfo.path cannot be null");
+        if (appInfo.appId == null) throw new IllegalArgumentException("AppInfo.appId cannot be null");
+
+        logger.info("createApplication.start", appInfo.path);
+
+//        try {
+//            Thread.sleep(5000);
+//        } catch (InterruptedException e) {
+//            e.printStackTrace();
+//            Thread.interrupted();
+//        }
 
         // To start out, ensure we don't already have any beans deployed with duplicate IDs.  This
         // is a conflict we can't handle.
@@ -468,7 +487,7 @@ public class Assembler extends Assembler
         }
 
         if (used.size() > 0) {
-            String message = logger.error("createApplication.appFailedDuplicateIds", getPath(appInfo));
+            String message = logger.error("createApplication.appFailedDuplicateIds", appInfo.path);
             for (String id : used) {
                 logger.debug("createApplication.deploymentIdInUse", id);
                 message += "\n    "+id;
@@ -488,10 +507,10 @@ public class Assembler extends Assembler
             CmpJarBuilder cmpJarBuilder = new CmpJarBuilder(appInfo, classLoader);
             File generatedJar = cmpJarBuilder.getJarFile();
             if (generatedJar != null) {
-                classLoader = ClassLoaderUtil.createClassLoader(getPath(appInfo), new URL []{generatedJar.toURI().toURL()}, classLoader);
+                classLoader = ClassLoaderUtil.createClassLoader(appInfo.path, new URL []{generatedJar.toURI().toURL()}, classLoader);
             }
 
-            AppContext appContext = new AppContext(appInfo.appId, SystemInstance.get(), classLoader, globalJndiContext, appJndiContext);
+            AppContext appContext = new AppContext(appInfo.appId, SystemInstance.get(), classLoader, globalJndiContext, appJndiContext, false);
             
             // JPA - Persistence Units MUST be processed first since they will add ClassFileTransformers
             // to the class loader which must be added before any classes are loaded
@@ -652,17 +671,20 @@ public class Assembler extends Assembler
                 jndiEncBuilder.setUseCrossClassLoaderRef(false);
                 Context context = (Context) jndiEncBuilder.build(JndiEncBuilder.JndiScope.comp);
 
+                Debug.printContext(context);
+                
                 containerSystem.getJNDIContext().bind("openejb/client/" + clientInfo.moduleId, context);
-                if (clientInfo.codebase != null) {
-                    containerSystem.getJNDIContext().bind("openejb/client/" + clientInfo.moduleId + "/comp/path", clientInfo.codebase);
+
+                if (clientInfo.path != null) {
+                    context.bind("info/path", clientInfo.path);
                 }
                 if (clientInfo.mainClass != null) {
-                    containerSystem.getJNDIContext().bind("openejb/client/" + clientInfo.moduleId + "/comp/mainClass", clientInfo.mainClass);
+                    context.bind("info/mainClass", clientInfo.mainClass);
                 }
                 if (clientInfo.callbackHandler != null) {
-                    containerSystem.getJNDIContext().bind("openejb/client/" + clientInfo.moduleId + "/comp/callbackHandler", clientInfo.callbackHandler);
+                    context.bind("info/callbackHandler", clientInfo.callbackHandler);
                 }
-                containerSystem.getJNDIContext().bind("openejb/client/" + clientInfo.moduleId + "/comp/injections", injections);
+                context.bind("info/injections", injections);
 
                 for (String clientClassName : clientInfo.remoteClients) {
                     containerSystem.getJNDIContext().bind("openejb/client/" + clientClassName, clientInfo.moduleId);
@@ -688,9 +710,9 @@ public class Assembler extends Assembler
                 globalEjbResolver.addAll(appInfo.ejbJars);
             }
 
-            logger.info("createApplication.success", getPath(appInfo));
+            logger.info("createApplication.success", appInfo.path);
 
-            deployedApplications.put(getPath(appInfo), appInfo);
+            deployedApplications.put(appInfo.path, appInfo);
             fireAfterApplicationCreated(appInfo);
 
             return allDeployments;
@@ -698,30 +720,11 @@ public class Assembler extends Assembler
             try {
                 destroyApplication(appInfo);
             } catch (Exception e1) {
-                logger.debug("createApplication.undeployFailed", e1, getPath(appInfo));
+                logger.debug("createApplication.undeployFailed", e1, appInfo.path);
             }
 
-            throw new OpenEJBException(messages.format("createApplication.failed", getPath(appInfo)), t);
-        }
-    }
-
-    private String getPath(AppInfo appInfo) {
-        if (appInfo.jarPath != null) {
-            return appInfo.jarPath;
-        }
-        for (EjbJarInfo ejbJarInfo: appInfo.ejbJars) {
-            return ejbJarInfo.jarPath;
-        }
-        for (ConnectorInfo connectorInfo: appInfo.connectors) {
-            return connectorInfo.codebase;
-        }
-        for (WebAppInfo webAppInfo: appInfo.webApps) {
-            return webAppInfo.codebase;
-        }
-        for (ClientInfo clientInfo: appInfo.clients) {
-            return clientInfo.codebase;
+            throw new OpenEJBException(messages.format("createApplication.failed", appInfo.path), t);
         }
-        throw new IllegalStateException("Nothing in app to locate it: " + appInfo);
     }
 
     private TransactionPolicyFactory createTransactionPolicyFactory(EjbJarInfo ejbJar, ClassLoader classLoader) {
@@ -798,9 +801,9 @@ public class Assembler extends Assembler
         Assembler assembler = this;
         for (AppInfo appInfo : assembler.getDeployedApplications()) {
             try {
-                assembler.destroyApplication(getPath(appInfo));
+                assembler.destroyApplication(appInfo.path);
             } catch (UndeployException e) {
-                logger.error("Undeployment failed: " + getPath(appInfo), e);
+                logger.error("Undeployment failed: " + appInfo.path, e);
             } catch (NoSuchApplicationException e) {
             }
         }
@@ -841,7 +844,7 @@ public class Assembler extends Assembler
     }
 
     private void destroyApplication(AppInfo appInfo) throws UndeployException {
-        logger.info("destroyApplication.start", getPath(appInfo));
+        logger.info("destroyApplication.start", appInfo.path);
 
         fireBeforeApplicationDestroyed(appInfo);
 
@@ -854,14 +857,14 @@ public class Assembler extends Assembler
 
 
         Context globalContext = containerSystem.getJNDIContext();
-        UndeployException undeployException = new UndeployException(messages.format("destroyApplication.failed", getPath(appInfo)));
+        UndeployException undeployException = new UndeployException(messages.format("destroyApplication.failed", appInfo.path));
 
         WebAppBuilder webAppBuilder = SystemInstance.get().getComponent(WebAppBuilder.class);
         if (webAppBuilder != null) {
             try {
                 webAppBuilder.undeployWebApps(appInfo);
             } catch (Exception e) {
-                undeployException.getCauses().add(new Exception("App: " + getPath(appInfo) + ": " + e.getMessage(), e));
+                undeployException.getCauses().add(new Exception("App: " + appInfo.path + ": " + e.getMessage(), e));
             }
         }
 
@@ -970,22 +973,22 @@ public class Assembler extends Assembler
             }
         }
 
-        ClassLoaderUtil.destroyClassLoader(getPath(appInfo));
+        ClassLoaderUtil.destroyClassLoader(appInfo.path);
 
         if (undeployException.getCauses().size() > 0) {
             throw undeployException;
         }
 
-        logger.debug("destroyApplication.success", getPath(appInfo));
+        logger.debug("destroyApplication.success", appInfo.path);
     }
 
     public ClassLoader createAppClassLoader(AppInfo appInfo) throws OpenEJBException, IOException {
         List<URL> jars = new ArrayList<URL>();
         for (EjbJarInfo info : appInfo.ejbJars) {
-            jars.add(toUrl(info.jarPath));
+            jars.add(toUrl(info.path));
         }
         for (ClientInfo info : appInfo.clients) {
-            jars.add(toUrl(info.codebase));
+            jars.add(toUrl(info.path));
         }
         for (ConnectorInfo info : appInfo.connectors) {
             for (String jarPath : info.libs) {
@@ -997,7 +1000,7 @@ public class Assembler extends Assembler
         }
 
         // Create the class loader
-        ClassLoader classLoader = ClassLoaderUtil.createClassLoader(getPath(appInfo), jars.toArray(new URL[jars.size()]), OpenEJB.class.getClassLoader());
+        ClassLoader classLoader = ClassLoaderUtil.createClassLoader(appInfo.path, jars.toArray(new URL[jars.size()]), OpenEJB.class.getClassLoader());
         return classLoader;
     }
 

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ClientInfo.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ClientInfo.java?rev=987790&r1=987789&r2=987790&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ClientInfo.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ClientInfo.java Sat Aug 21 16:58:57 2010
@@ -23,7 +23,7 @@ import java.util.TreeSet;
 
 public class ClientInfo extends InfoObject {
 
-    public String codebase;
+    public String path;
     public String description;
     public String displayName;
     public String smallIcon;

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ConnectorInfo.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ConnectorInfo.java?rev=987790&r1=987789&r2=987790&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ConnectorInfo.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ConnectorInfo.java Sat Aug 21 16:58:57 2010
@@ -24,7 +24,7 @@ import java.util.TreeSet;
 
 public class ConnectorInfo extends InfoObject {
 
-    public String codebase;
+    public String path;
     public String description;
     public String displayName;
     public String smallIcon;

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EjbJarInfo.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EjbJarInfo.java?rev=987790&r1=987789&r2=987790&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EjbJarInfo.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EjbJarInfo.java Sat Aug 21 16:58:57 2010
@@ -26,7 +26,7 @@ public class EjbJarInfo extends InfoObje
     public final Properties properties = new Properties();
 
     public String moduleId;
-    public String jarPath;
+    public String path;
     public final List<EnterpriseBeanInfo> enterpriseBeans = new ArrayList<EnterpriseBeanInfo>();
 
     public final List<SecurityRoleInfo> securityRoles = new ArrayList<SecurityRoleInfo>();

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/JndiBuilder.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/JndiBuilder.java?rev=987790&r1=987789&r2=987790&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/JndiBuilder.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/JndiBuilder.java Sat Aug 21 16:58:57 2010
@@ -27,6 +27,7 @@ import javax.jms.MessageListener;
 import org.apache.openejb.DeploymentInfo;
 import org.apache.openejb.InterfaceType;
 import org.apache.openejb.core.CoreDeploymentInfo;
+import org.apache.openejb.core.ModuleContext;
 import org.apache.openejb.core.ivm.naming.BusinessLocalBeanReference;
 import org.apache.openejb.spi.ContainerSystem;
 import org.apache.openejb.util.LogCategory;
@@ -40,6 +41,7 @@ import org.apache.openejb.core.ivm.namin
 import org.apache.openejb.core.ivm.naming.IntraVmJndiReference;
 import org.apache.openejb.util.StringTemplate;
 
+import java.util.Iterator;
 import java.util.List;
 import java.util.ArrayList;
 import java.util.Map;
@@ -197,9 +199,21 @@ public class JndiBuilder {
                 beanInfos.put(beanInfo.ejbDeploymentId, beanInfo);
             }
 
+            final Iterator<DeploymentInfo> it = deployments.values().iterator();
+            if (!it.hasNext()) return;
+
+            final ModuleContext moduleContext = ((CoreDeploymentInfo) it.next()).getModuleContext();
+
             appContext = new HashMap<String, String>();
             putAll(appContext, SystemInstance.get().getProperties());
-            putAll(appContext, ejbJarInfo.properties);
+            putAll(appContext, moduleContext.getAppContext().getProperties());
+            putAll(appContext, moduleContext.getProperties());
+
+            appContext.put("appName", moduleContext.getAppContext().getId());
+            appContext.put("appId", moduleContext.getAppContext().getId());
+
+            appContext.put("moduleName", moduleContext.getId());
+            appContext.put("moduleId", moduleContext.getId());
         }
 
         private void putAll(Map<String, String> map, Properties properties) {
@@ -228,7 +242,6 @@ public class JndiBuilder {
 
             beanContext = new HashMap<String, String>(appContext);
             putAll(beanContext, deploymentInfo.getProperties());
-            beanContext.put("moduleId", deploymentInfo.getModuleID());
             beanContext.put("ejbType", deploymentInfo.getComponentType().name());
             beanContext.put("ejbClass", deploymentInfo.getBeanClass().getName());
             beanContext.put("ejbClass.simpleName", deploymentInfo.getBeanClass().getSimpleName());
@@ -531,7 +544,7 @@ public class JndiBuilder {
         Context appContext = cdi.getModuleContext().getAppContext().getAppJndiContext();
         Context globalContext = cdi.getModuleContext().getAppContext().getGlobalJndiContext();
 
-        String appName = cdi.getModuleContext().getAppContext().getId() == null? "": cdi.getModuleContext().getAppContext().getId() + "/";
+        String appName = cdi.getModuleContext().getAppContext().isStandaloneModule() ? "" : cdi.getModuleContext().getAppContext().getId() + "/";
         String moduleName = cdi.getModuleID() + "/";
         String beanName = cdi.getEjbName();
         if (interfaceName != null) {

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/WebAppInfo.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/WebAppInfo.java?rev=987790&r1=987789&r2=987790&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/WebAppInfo.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/WebAppInfo.java Sat Aug 21 16:58:57 2010
@@ -23,7 +23,7 @@ import java.util.List;
 import java.util.ArrayList;
 
 public class WebAppInfo extends InfoObject {
-    public String codebase;
+    public String path;
     public String description;
     public String displayName;
     public String smallIcon;

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/client/LocalInitialContext.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/client/LocalInitialContext.java?rev=987790&r1=987789&r2=987790&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/client/LocalInitialContext.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/client/LocalInitialContext.java Sat Aug 21 16:58:57 2010
@@ -187,8 +187,8 @@ public class LocalInitialContext extends
         while (clazz != null && !clazz.equals(Object.class)) {
             try {
                 String moduleId = (String) clients.lookup(clazz.getName());
-                injections = (List<Injection>) clients.lookup(moduleId + "/comp/injections");
                 context = (Context) clients.lookup(moduleId);
+                injections = (List<Injection>) context.lookup("info/injections");
                 break;
             } catch (NamingException e) {
                 clazz = clazz.getSuperclass();

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java?rev=987790&r1=987789&r2=987790&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java Sat Aug 21 16:58:57 2010
@@ -292,7 +292,7 @@ public class AnnotationDeployer implemen
                     removeModule();
                 }
             }
-            for (ConnectorModule connectorModule : appModule.getResourceModules()) {
+            for (ConnectorModule connectorModule : appModule.getConnectorModules()) {
                 setModule(connectorModule);
                 try {
                     deploy(connectorModule);
@@ -648,7 +648,7 @@ public class AnnotationDeployer implemen
 
     public static class ProcessAnnotatedBeans implements DynamicDeployer {
 
-        private static final String STRICT_INTERFACE_DECLARATION = "openejb.strict.interface.declaration";
+        public static final String STRICT_INTERFACE_DECLARATION = "openejb.strict.interface.declaration";
 
         public AppModule deploy(AppModule appModule) throws OpenEJBException {
             for (EjbModule ejbModule : appModule.getEjbModules()) {
@@ -667,7 +667,7 @@ public class AnnotationDeployer implemen
                     removeModule();
                 }
             }
-            for (ConnectorModule connectorModule : appModule.getResourceModules()) {
+            for (ConnectorModule connectorModule : appModule.getConnectorModules()) {
                 setModule(connectorModule);
                 try {
                     deploy(connectorModule);
@@ -1285,7 +1285,12 @@ public class AnnotationDeployer implemen
                          * @WebService
                          * @WebServiceProvider
                          */
-                        processSessionInterfaces(sessionBean, clazz, ejbModule);
+//                        boolean strict = getProperty(ejbModule, STRICT_INTERFACE_DECLARATION, false + "").equalsIgnoreCase("true");
+                        if (false) {
+                            processSessionInterfacesStrict(sessionBean, clazz, ejbModule);
+                        } else {
+                            processSessionInterfaces(sessionBean, clazz, ejbModule);
+                        }
 
                         /*
                          * Allow for all session bean types
@@ -1528,7 +1533,7 @@ public class AnnotationDeployer implemen
                     if (assemblyDescriptor.getApplicationException(exception) != null) {
                         mergeApplicationExceptionAnnotation(assemblyDescriptor, exception, annotation);
                     } else {
-                        logger.info("Found previously undetected application exception {} listed on a method {} with annotation {}", method, exception, annotation);
+                        logger.debug("Found previously undetected application exception {0} listed on a method {1} with annotation {2}", method, exception, annotation);
                         assemblyDescriptor.addApplicationException(exception, annotation.rollback(), annotation.inherited());
                     }
                 }
@@ -1826,6 +1831,192 @@ public class AnnotationDeployer implemen
 
         }
 
+        private void processSessionInterfacesStrict(SessionBean sessionBean, Class<?> beanClass, EjbModule ejbModule) {
+
+            ValidationContext validation = ejbModule.getValidation();
+            String ejbName = sessionBean.getEjbName();
+
+//            boolean strict = getProperty(ejbModule, STRICT_INTERFACE_DECLARATION, false + "").equalsIgnoreCase("true");
+
+            /*
+             * Collect all interfaces explicitly declared via xml.
+             * We will subtract these from the interfaces implemented
+             * by the bean and do annotation scanning on the remainder.
+             */
+            List<String> descriptor = new ArrayList<String>();
+            descriptor.add(sessionBean.getHome());
+            descriptor.add(sessionBean.getRemote());
+            descriptor.add(sessionBean.getLocalHome());
+            descriptor.add(sessionBean.getLocal());
+            descriptor.addAll(sessionBean.getBusinessLocal());
+            descriptor.addAll(sessionBean.getBusinessRemote());
+            descriptor.add(sessionBean.getServiceEndpoint());
+
+            BusinessInterfaces xml = new BusinessInterfaces();
+            xml.addLocals(sessionBean.getBusinessLocal(), ejbModule.getClassLoader());
+            xml.addRemotes(sessionBean.getBusinessRemote(), ejbModule.getClassLoader());
+
+            /**
+             * Anything declared as both <business-local> and <business-remote> is invalid in strict mode
+             */
+            for (Class interfce : xml.local) {
+                if (xml.remote.contains(interfce)) {
+                    validation.fail(ejbName, "xml.localRemote.conflict", interfce.getName());
+                }
+            }
+            
+            /*
+             * Merge the xml declared business interfaces into the complete set
+             */
+            BusinessInterfaces all = new BusinessInterfaces();
+            all.local.addAll(xml.local);
+            all.remote.addAll(xml.remote);
+
+            BusinessInterfaces annotated = new BusinessInterfaces();
+            LinkedHashSet<Class<?>> interfaces = new LinkedHashSet<Class<?>>();
+            boolean localBean = false;
+            /*
+            * @WebService
+            * @WebServiceProvider
+            */
+            if (sessionBean.getServiceEndpoint() == null) {
+                Class defaultEndpoint = DeploymentInfo.ServiceEndpoint.class;
+
+                for (Class interfce : beanClass.getInterfaces()) {
+                    if (interfce.isAnnotationPresent(WebService.class)) {
+                        defaultEndpoint = interfce;
+                    }
+                }
+
+                WebService webService = beanClass.getAnnotation(WebService.class);
+                if (webService != null) {
+
+                    String className = webService.endpointInterface();
+
+                    if (!className.equals("")) {
+                        sessionBean.setServiceEndpoint(className);
+                    } else {
+                        sessionBean.setServiceEndpoint(defaultEndpoint.getName());
+                    }
+                } else if (beanClass.isAnnotationPresent(WebServiceProvider.class)) {
+                    sessionBean.setServiceEndpoint(defaultEndpoint.getName());
+                } else if (!defaultEndpoint.equals(DeploymentInfo.ServiceEndpoint.class)) {
+                    sessionBean.setServiceEndpoint(defaultEndpoint.getName());
+                }
+            }
+            /*
+             * 4.9.2.1 client views are specified on the session bean class itself, not on any superclasses.
+             */
+
+            /*
+             * 4.9.7  par 5.3
+             * 4.9.8 par 1.3
+            * These interface types are not eligible to be business interfaces.
+            * java.io.Serializable
+            * java.io.Externalizable
+            * javax.ejb.*
+            */
+            for (Class<?> interfce : beanClass.getInterfaces()) {
+                String name = interfce.getName();
+                if (!name.equals("java.io.Serializable") &&
+                        !name.equals("java.io.Externalizable") &&
+                        !name.startsWith("javax.ejb.")) {
+                    interfaces.add(interfce);
+                }
+            }
+            localBean |= beanClass.getAnnotation(LocalBean.class) != null;
+            if (beanClass.getAnnotation(Local.class) != null) {
+                annotated.local.addAll(toList(beanClass.getAnnotation(Local.class).value()));
+            }
+            if (beanClass.getAnnotation(Remote.class) != null) {
+                annotated.remote.addAll(toList(beanClass.getAnnotation(Remote.class).value()));
+            }
+
+            if (localBean) {
+                sessionBean.setLocalBean(new Empty());
+            }
+            /**
+             * 4.9.8 implied local bean
+             */
+            if (sessionBean.getLocalBean() == null
+                    && beanClass.getInterfaces().length == 0
+                    && annotated.local.isEmpty()
+                    && annotated.remote.isEmpty()
+                    && xml.local.isEmpty()
+                    && xml.remote.isEmpty()
+                    && sessionBean.getHome() == null
+                    && sessionBean.getRemote() == null
+                    && sessionBean.getLocalHome() == null
+                    && sessionBean.getLocal() == null
+                    && sessionBean.getServiceEndpoint() == null) {
+                sessionBean.setLocalBean(new Empty());
+                //nothing else to do...
+                return;
+            }
+            /**
+             * 4.9.7 par 5.1 single interface.
+             * Requires: not no-interface, no interface specified by @Local or @Remote on a bean class(?) and only one implemented interface.
+             */
+            if (sessionBean.getLocalBean() == null
+                    && interfaces.size() == 1
+                    && annotated.local.isEmpty()
+                    && annotated.remote.isEmpty()
+                    && xml.local.isEmpty()
+                    && xml.remote.isEmpty()) {
+                Class<?> interfce = interfaces.iterator().next();
+                if (interfce.getAnnotation(Remote.class) != null) {
+                    validateRemoteInterface(interfce, validation, ejbName);
+                    sessionBean.getBusinessRemote().add(interfce.getName());
+                } else {
+                    validateLocalInterface(interfce, validation, ejbName);
+                    sessionBean.getBusinessLocal().add(interfce.getName());
+                }
+                return;
+            }
+
+            /**
+             * 4.9.7 par 5.2 and 5.5
+             * All other interfaces must be specified as local or remote on the interface or in the beans @Local/@Remote annotation
+             * (or the xml)
+             */
+            for (Class<?> interfce: interfaces) {
+                if (interfce.getAnnotation(Local.class) != null) {
+                    annotated.local.add(interfce);
+                }
+                if (interfce.getAnnotation(Remote.class) != null) {
+                    annotated.remote.add(interfce);
+                }
+            }
+
+            /**
+             * 4.9.7 par 5.4
+             * No interface can be both Local and Remote
+             */
+            // TODO This isn't right either, xml always wins over annotation so there can never be this mixed "some combination of xml and annotations" case
+            all.local.addAll(annotated.local);
+            all.remote.addAll(annotated.remote);
+            for (Class<?> local: all.local) {
+                if (all.remote.contains(local)) {
+                    validation.fail(ejbName, "ann.localRemote.generalconflict", local);
+                }
+            }
+
+            //add to xml
+            annotated.local.removeAll(xml.local);
+            annotated.remote.removeAll(xml.remote);
+            for (Class<?> local: annotated.local) {
+                sessionBean.getBusinessLocal().add(local.getName());
+            }
+            for (Class<?> remote: annotated.remote) {
+                sessionBean.getBusinessRemote().add(remote.getName());
+            }
+        }
+
+        private List<? extends Class> toList(Class[] classes) {
+            if (classes == null) return Collections.emptyList();
+            return asList(classes);
+        }
+
         private static class BusinessInterfaces {
             private Set<Class> local = new LinkedHashSet<Class>();
             private Set<Class> remote = new LinkedHashSet<Class>();

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AppInfoBuilder.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AppInfoBuilder.java?rev=987790&r1=987789&r2=987790&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AppInfoBuilder.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AppInfoBuilder.java Sat Aug 21 16:58:57 2010
@@ -98,7 +98,13 @@ class AppInfoBuilder {
     public AppInfo build(AppModule appModule) throws OpenEJBException {
         AppInfo appInfo = new AppInfo();
         appInfo.appId = appModule.getModuleId();
+        appInfo.path = appModule.getJarLocation();
+        appInfo.standaloneModule = appModule.isStandaloneModule();
+        appInfo.watchedResources.addAll(appModule.getWatchedResources());
 
+        if (appInfo.path == null) throw new IllegalArgumentException("AppInfo.path cannot be null");
+        if (appInfo.appId == null) throw new IllegalArgumentException("AppInfo.appId cannot be null");
+        
         //
         //  J2EE Connectors
         //
@@ -143,7 +149,7 @@ class AppInfoBuilder {
                 ejbJarInfo.portInfos.addAll(configureWebservices(ejbModule.getWebservices()));
                 configureWebserviceSecurity(ejbJarInfo, ejbModule);
 
-                ejbJarInfos.put(ejbJarInfo.jarPath, ejbJarInfo);
+                ejbJarInfos.put(ejbJarInfo.path, ejbJarInfo);
 
                 appInfo.ejbJars.add(ejbJarInfo);
 
@@ -196,7 +202,7 @@ class AppInfoBuilder {
             });
         } catch (CircularReferencesException e) {
             List<List> circuits = e.getCircuits();
-
+            // TODO Seems we lost circular reference detection, or we do it elsewhere and don't need it here
         }
 
         //
@@ -213,8 +219,6 @@ class AppInfoBuilder {
         //
         //  Final AppInfo creation
         //
-        appInfo.jarPath = appModule.getJarLocation();
-        appInfo.watchedResources.addAll(appModule.getWatchedResources());
         List<URL> additionalLibraries = appModule.getAdditionalLibraries();
         for (URL url : additionalLibraries) {
             File file = toFile(url);
@@ -238,7 +242,7 @@ class AppInfoBuilder {
         ReportValidationResults reportValidationResults = new ReportValidationResults();
         reportValidationResults.deploy(appModule);
 
-        logger.info("config.appLoaded", appInfo.jarPath);
+        logger.info("config.appLoaded", appInfo.path);
         return appInfo;
 
     }
@@ -249,7 +253,7 @@ class AppInfoBuilder {
             ClientInfo clientInfo = new ClientInfo();
             clientInfo.description = applicationClient.getDescription();
             clientInfo.displayName = applicationClient.getDisplayName();
-            clientInfo.codebase = clientModule.getJarLocation();
+            clientInfo.path = clientModule.getJarLocation();
             clientInfo.mainClass = clientModule.getMainClass();
             clientInfo.localClients.addAll(clientModule.getLocalClients());
             clientInfo.remoteClients.addAll(clientModule.getRemoteClients());
@@ -268,7 +272,7 @@ class AppInfoBuilder {
             WebAppInfo webAppInfo = new WebAppInfo();
             webAppInfo.description = webApp.getDescription();
             webAppInfo.displayName = webApp.getDisplayName();
-            webAppInfo.codebase = webModule.getJarLocation();
+            webAppInfo.path = webModule.getJarLocation();
             webAppInfo.moduleId = webModule.getModuleId();
             webAppInfo.watchedResources.addAll(webModule.getWatchedResources());
 
@@ -294,7 +298,7 @@ class AppInfoBuilder {
     private void buildConnectorModules(AppModule appModule, AppInfo appInfo) throws OpenEJBException {
         String appId = appModule.getModuleId();
 
-        for (ConnectorModule connectorModule : appModule.getResourceModules()) {
+        for (ConnectorModule connectorModule : appModule.getConnectorModules()) {
             //
             // DEVELOPERS NOTE:  if you change the id generation code here, you must change
             // the id generation code in AutoConfig$AppResources
@@ -305,7 +309,7 @@ class AppInfoBuilder {
             ConnectorInfo connectorInfo = new ConnectorInfo();
             connectorInfo.description = connector.getDescription();
             connectorInfo.displayName = connector.getDisplayName();
-            connectorInfo.codebase = connectorModule.getJarLocation();
+            connectorInfo.path = connectorModule.getJarLocation();
             connectorInfo.moduleId = connectorModule.getModuleId();
             connectorInfo.watchedResources.addAll(connectorModule.getWatchedResources());
 

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AppModule.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AppModule.java?rev=987790&r1=987789&r2=987790&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AppModule.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AppModule.java Sat Aug 21 16:58:57 2010
@@ -48,11 +48,32 @@ public class AppModule implements Deploy
     private final Map<String,Object> altDDs = new HashMap<String,Object>();
     private final String moduleId;
     private final Set<String> watchedResources = new TreeSet<String>();
+    private final boolean standaloneModule;
 
     public AppModule(ClassLoader classLoader, String jarLocation) {
-        this(classLoader, jarLocation, null);
+        this(classLoader, jarLocation, null, false);
     }
-    public AppModule(ClassLoader classLoader, String jarLocation, Application application) {
+
+    public <T extends DeploymentModule> AppModule(T module) {
+        this(module.getClassLoader(), module.getJarLocation(), new Application(module.getModuleId()), true);
+        final Class<? extends DeploymentModule> type = module.getClass();
+
+        if (type == EjbModule.class) {
+            getEjbModules().add((EjbModule) module);
+        } else if (type == ClientModule.class) {
+            getClientModules().add((ClientModule) module);
+        } else if (type == ConnectorModule.class) {
+            getConnectorModules().add((ConnectorModule) module);
+        } else if (type == WebModule.class) {
+            getWebModules().add((WebModule) module);
+        } else if (type == PersistenceModule.class) {
+            getPersistenceModules().add((PersistenceModule) module);
+        } else {
+            throw new IllegalArgumentException("Unknown module type: " + type.getName());
+        }
+    }
+
+    public AppModule(ClassLoader classLoader, String jarLocation, Application application, boolean standaloneModule) {
         this.classLoader = classLoader;
         this.jarLocation = jarLocation;
         this.application = application;
@@ -69,7 +90,15 @@ public class AppModule implements Deploy
         } else {
             this.moduleId = application.getApplicationName();
         }
+        if (this.jarLocation == null) throw new IllegalArgumentException("jarLocation cannot be null");
+        if (this.moduleId == null) throw new IllegalArgumentException("moduleId cannot be null");
+
         this.validation = new ValidationContext(AppModule.class, jarLocation);
+        this.standaloneModule = standaloneModule;
+    }
+
+    public boolean isStandaloneModule() {
+        return standaloneModule;
     }
 
     public ValidationContext getValidation() {
@@ -191,7 +220,7 @@ public class AppModule implements Deploy
         this.cmpMappings = cmpMappings;
     }
 
-    public List<ConnectorModule> getResourceModules() {
+    public List<ConnectorModule> getConnectorModules() {
         return connectorModules;
     }
 

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java?rev=987790&r1=987789&r2=987790&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java Sat Aug 21 16:58:57 2010
@@ -19,7 +19,6 @@ package org.apache.openejb.config;
 
 import org.apache.openejb.OpenEJBException;
 import org.apache.openejb.assembler.classic.ContainerInfo;
-import org.apache.openejb.assembler.classic.InjectionInfo;
 import org.apache.openejb.assembler.classic.ResourceInfo;
 import org.apache.openejb.config.sys.Resource;
 import org.apache.openejb.jee.ActivationConfig;
@@ -141,7 +140,7 @@ public class AutoConfig implements Dynam
         for (ClientModule clientModule : appModule.getClientModules()) {
             deploy(clientModule, appResources);
         }
-        for (ConnectorModule connectorModule : appModule.getResourceModules()) {
+        for (ConnectorModule connectorModule : appModule.getConnectorModules()) {
             deploy(connectorModule);
         }
         for (WebModule webModule : appModule.getWebModules()) {
@@ -1627,7 +1626,7 @@ public class AutoConfig implements Dynam
             // the id generation code in ConfigurationFactory.configureApplication(AppModule appModule)
             //
 
-            for (ConnectorModule connectorModule : appModule.getResourceModules()) {
+            for (ConnectorModule connectorModule : appModule.getConnectorModules()) {
                 Connector connector = connectorModule.getConnector();
 
                 ResourceAdapter resourceAdapter = connector.getResourceAdapter();

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java?rev=987790&r1=987789&r2=987790&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java Sat Aug 21 16:58:57 2010
@@ -549,7 +549,7 @@ public class ConfigurationFactory implem
     public AppInfo configureApplication(ClassLoader classLoader, String id, List<File> jarFiles) throws OpenEJBException {
         Application application = new Application();
         application.setApplicationName(id);
-        AppModule collection = new AppModule(classLoader, null, application);
+        AppModule collection = new AppModule(classLoader, id, application, false);
         Map<String, Object> altDDs = collection.getAltDDs();
 
         for (File jarFile : jarFiles) {
@@ -562,7 +562,7 @@ public class ConfigurationFactory implem
                 collection.getClientModules().addAll(module.getClientModules());
                 collection.getEjbModules().addAll(module.getEjbModules());
                 collection.getPersistenceModules().addAll(module.getPersistenceModules());
-                collection.getResourceModules().addAll(module.getResourceModules());
+                collection.getConnectorModules().addAll(module.getConnectorModules());
                 collection.getWebModules().addAll(module.getWebModules());
                 collection.getWatchedResources().addAll(module.getWatchedResources());
 
@@ -618,30 +618,22 @@ public class ConfigurationFactory implem
     }
 
     public EjbJarInfo configureApplication(EjbModule ejbModule) throws OpenEJBException {
-        AppModule appModule = new AppModule(ejbModule.getClassLoader(), null);
-        appModule.getEjbModules().add(ejbModule);
-        AppInfo appInfo = configureApplication(appModule);
+        AppInfo appInfo = configureApplication(new AppModule(ejbModule));
         return appInfo.ejbJars.get(0);
     }
 
     public ClientInfo configureApplication(ClientModule clientModule) throws OpenEJBException {
-        AppModule appModule = new AppModule(clientModule.getClassLoader(), null);
-        appModule.getClientModules().add(clientModule);
-        AppInfo appInfo = configureApplication(appModule);
+        AppInfo appInfo = configureApplication(new AppModule(clientModule));
         return appInfo.clients.get(0);
     }
 
     public ConnectorInfo configureApplication(ConnectorModule connectorModule) throws OpenEJBException {
-        AppModule appModule = new AppModule(connectorModule.getClassLoader(), null);
-        appModule.getResourceModules().add(connectorModule);
-        AppInfo appInfo = configureApplication(appModule);
+        AppInfo appInfo = configureApplication(new AppModule(connectorModule));
         return appInfo.connectors.get(0);
     }
 
     public WebAppInfo configureApplication(WebModule webModule) throws OpenEJBException {
-        AppModule appModule = new AppModule(webModule.getClassLoader(), null);
-        appModule.getWebModules().add(webModule);
-        AppInfo appInfo = configureApplication(appModule);
+        AppInfo appInfo = configureApplication(new AppModule(webModule));
         return appInfo.webApps.get(0);
     }
 

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/Deploy.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/Deploy.java?rev=987790&r1=987789&r2=987790&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/Deploy.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/Deploy.java Sat Aug 21 16:58:57 2010
@@ -195,7 +195,7 @@ public class Deploy {
                 }
                 AppInfo appInfo = deployer.deploy(location);
 
-                System.out.println(messages.format("cmd.deploy.successful", path, appInfo.jarPath));
+                System.out.println(messages.format("cmd.deploy.successful", path, appInfo.path));
 
                 if (line.hasOption("quiet")) {
                     continue;
@@ -222,7 +222,7 @@ public class Deploy {
                 if (!delete(destFile)){
                     System.out.println(messages.format("cmd.deploy.cantDelete.deploy", destFile.getAbsolutePath()));
                 }
-            } catch (OpenEJBException e) {
+            } catch (Throwable e) {
                 System.out.println(messages.format("cmd.deploy.failed", path));
                 e.printStackTrace(System.out);
                 exitCode++;
@@ -253,10 +253,10 @@ public class Deploy {
     }
 
     private static void print(AppInfo appInfo) {
-        System.out.println("App(id=" + appInfo.jarPath + ")");
+        System.out.println("App(id=" + appInfo.path + ")");
 
         for (EjbJarInfo info : appInfo.ejbJars) {
-            System.out.println("    EjbJar(id=" + info.moduleId + ", path=" + info.jarPath + ")");
+            System.out.println("    EjbJar(id=" + info.moduleId + ", path=" + info.path + ")");
             for (EnterpriseBeanInfo beanInfo : info.enterpriseBeans) {
                 System.out.println("        Ejb(ejb-name=" + beanInfo.ejbName + ", id=" + beanInfo.ejbDeploymentId + ")");
                 for (String name : beanInfo.jndiNames) {
@@ -270,15 +270,15 @@ public class Deploy {
             System.out.println("");
         }
         for (ClientInfo clientInfo : appInfo.clients) {
-            System.out.println("    Client(main-class=" + clientInfo.mainClass + ", id=" + clientInfo.moduleId + ", path=" + clientInfo.codebase + ")");
+            System.out.println("    Client(main-class=" + clientInfo.mainClass + ", id=" + clientInfo.moduleId + ", path=" + clientInfo.path + ")");
             System.out.println("");
         }
         for (ConnectorInfo connectorInfo : appInfo.connectors) {
-            System.out.println("    Connector(id=" + connectorInfo.moduleId + ", path=" + connectorInfo.codebase + ")");
+            System.out.println("    Connector(id=" + connectorInfo.moduleId + ", path=" + connectorInfo.path + ")");
             System.out.println("");
         }
         for (WebAppInfo webAppInfo : appInfo.webApps) {
-            System.out.println("    WebApp(context-root=" + webAppInfo.contextRoot + ", id=" + webAppInfo.moduleId + ", path=" + webAppInfo.codebase + ")");
+            System.out.println("    WebApp(context-root=" + webAppInfo.contextRoot + ", id=" + webAppInfo.moduleId + ", path=" + webAppInfo.path + ")");
             System.out.println("");
         }
         for (PersistenceUnitInfo persistenceUnitInfo : appInfo.persistenceUnits) {

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java?rev=987790&r1=987789&r2=987790&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java Sat Aug 21 16:58:57 2010
@@ -145,8 +145,7 @@ public class DeploymentLoader {
                 EjbModule ejbModule = createEjbModule(baseUrl, jarPath, classLoader, null);
 
                 // wrap the EJB Module with an Application Module
-                AppModule appModule = new AppModule(ejbModule.getClassLoader(), null);
-                appModule.getEjbModules().add(ejbModule);
+                AppModule appModule = new AppModule(ejbModule);
 
                 // Persistence Units
                 addPersistenceUnits(appModule, baseUrl);
@@ -157,31 +156,27 @@ public class DeploymentLoader {
                 ClientModule clientModule = createClientModule(baseUrl, jarLocation, OpenEJB.class.getClassLoader(), null);
 
                 // Wrap the resource module with an Application Module
-                AppModule appModule = new AppModule(clientModule.getClassLoader(), null);
-                appModule.getClientModules().add(clientModule);
-
-                return appModule;
+                return new AppModule(clientModule);
             } else if (ConnectorModule.class.equals(moduleClass)) {
                 String jarLocation = URLs.toFilePath(baseUrl);
                 ConnectorModule connectorModule = createConnectorModule(jarLocation, jarLocation, OpenEJB.class.getClassLoader(), null);
 
                 // Wrap the resource module with an Application Module
-                AppModule appModule = new AppModule(connectorModule.getClassLoader(), null);
-                appModule.getResourceModules().add(connectorModule);
-
-                return appModule;
+                return new AppModule(connectorModule);
             } else if (WebModule.class.equals(moduleClass)) {
-                String moduleId = toFile(baseUrl).getName();
+                final File file = toFile(baseUrl);
+                String moduleId = file.getName();
                 String warPath = URLs.toFilePath(baseUrl);
 
-                AppModule appModule = new AppModule(OpenEJB.class.getClassLoader(), null);
+                AppModule appModule = new AppModule(OpenEJB.class.getClassLoader(), file.getAbsolutePath());
                 addWebModule(appModule, warPath, OpenEJB.class.getClassLoader(), null, moduleId);
                 return appModule;
             } else if (PersistenceModule.class.equals(moduleClass)) {
+                String jarLocation = URLs.toFilePath(baseUrl);
                 ClassLoader classLoader = ClassLoaderUtil.createTempClassLoader(jarPath, new URL[]{baseUrl}, OpenEJB.class.getClassLoader());
 
                 // wrap the EJB Module with an Application Module
-                AppModule appModule = new AppModule(classLoader, null);
+                AppModule appModule = new AppModule(classLoader, jarLocation);
 
                 // Persistence Units
                 addPersistenceUnits(appModule, baseUrl);
@@ -348,7 +343,7 @@ public class DeploymentLoader {
             // Create the AppModule and all nested module objects
             //
 
-            AppModule appModule = new AppModule(appClassLoader, appId, application);
+            AppModule appModule = new AppModule(appClassLoader, appId, application, false);
             appModule.getAdditionalLibraries().addAll(extraLibs);
             appModule.getAltDDs().putAll(appDescriptors);
             appModule.getWatchedResources().add(appId);
@@ -392,7 +387,7 @@ public class DeploymentLoader {
                     URL rarUrl = resouceModules.get(moduleName);
                     ConnectorModule connectorModule = createConnectorModule(appId, URLs.toFilePath(rarUrl), appClassLoader, moduleName);
 
-                    appModule.getResourceModules().add(connectorModule);
+                    appModule.getConnectorModules().add(connectorModule);
                 } catch (OpenEJBException e) {
                     logger.error("Unable to load RAR: " + appId + ", module: " + moduleName + ". Exception: " + e.getMessage(), e);
                 }

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/EjbJarInfoBuilder.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/EjbJarInfoBuilder.java?rev=987790&r1=987789&r2=987790&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/EjbJarInfoBuilder.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/EjbJarInfoBuilder.java Sat Aug 21 16:58:57 2010
@@ -134,10 +134,10 @@ public class EjbJarInfoBuilder {
         Map<String, EnterpriseBean> items = new HashMap<String, EnterpriseBean>();
 
         EjbJarInfo ejbJar = new EjbJarInfo();
-        ejbJar.jarPath = jar.getJarLocation();
+        ejbJar.path = jar.getJarLocation();
         ejbJar.moduleId = jar.getModuleId();
         if (ejbJar.moduleId == null) {
-            ejbJar.moduleId = new File(ejbJar.jarPath).getName().replaceFirst(".jar$","");
+            ejbJar.moduleId = new File(ejbJar.path).getName().replaceFirst(".jar$","");
         }
         ejbJar.watchedResources.addAll(jar.getWatchedResources());
 

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ReadDescriptors.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ReadDescriptors.java?rev=987790&r1=987789&r2=987790&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ReadDescriptors.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ReadDescriptors.java Sat Aug 21 16:58:57 2010
@@ -80,7 +80,7 @@ public class ReadDescriptors implements 
             readAppClient(clientModule, appModule);
         }
 
-        for (ConnectorModule connectorModule : appModule.getResourceModules()) {
+        for (ConnectorModule connectorModule : appModule.getConnectorModules()) {
             readConnector(connectorModule, appModule);
         }
 

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/VmDeploymentManager.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/VmDeploymentManager.java?rev=987790&r1=987789&r2=987790&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/VmDeploymentManager.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/VmDeploymentManager.java Sat Aug 21 16:58:57 2010
@@ -169,48 +169,48 @@ public class VmDeploymentManager impleme
             InfoObject infoObject = infos.get(0);
             if (infoObject instanceof ClientInfo) {
                 ClientInfo clientInfo = (ClientInfo) infoObject;
-                if (appInfo.jarPath.equals(clientInfo.codebase)) {
+                if (appInfo.path.equals(clientInfo.path)) {
                     // are client modules allowed
                     if (allowedModuleType != null && !allowedModuleType.equals(ModuleType.CAR)) {
                         return null;
                     }
-                    if (clientInfo.moduleId == appInfo.jarPath) {
+                    if (clientInfo.moduleId == appInfo.path) {
                         return new TargetModuleIDImpl(DEFAULT_TARGET, clientInfo.moduleId);
                     }
                 }
             }
             if (infoObject instanceof EjbJarInfo) {
                 EjbJarInfo ejbJarInfo = (EjbJarInfo) infoObject;
-                if (appInfo.jarPath.equals(ejbJarInfo.jarPath)) {
+                if (appInfo.path.equals(ejbJarInfo.path)) {
                     // are ejb modules allowed
                     if (allowedModuleType != null && !allowedModuleType.equals(ModuleType.EJB)) {
                         return null;
                     }
-                    if (ejbJarInfo.moduleId == appInfo.jarPath) {
+                    if (ejbJarInfo.moduleId == appInfo.path) {
                         return new TargetModuleIDImpl(DEFAULT_TARGET, ejbJarInfo.moduleId);
                     }
                 }
             }
             if (infoObject instanceof ConnectorInfo) {
                 ConnectorInfo connectorInfo = (ConnectorInfo) infoObject;
-                if (appInfo.jarPath.equals(connectorInfo.codebase)) {
+                if (appInfo.path.equals(connectorInfo.path)) {
                     // are connector modules allowed
                     if (allowedModuleType != null && !allowedModuleType.equals(ModuleType.RAR)) {
                         return null;
                     }
-                    if (connectorInfo.moduleId == appInfo.jarPath) {
+                    if (connectorInfo.moduleId == appInfo.path) {
                         return new TargetModuleIDImpl(DEFAULT_TARGET, connectorInfo.moduleId);
                     }
                 }
             }
             if (infoObject instanceof WebAppInfo) {
                 WebAppInfo webAppInfo = (WebAppInfo) infoObject;
-                if (appInfo.jarPath.equals(webAppInfo.codebase)) {
+                if (appInfo.path.equals(webAppInfo.path)) {
                     // are web app modules allowed
                     if (allowedModuleType != null && !allowedModuleType.equals(ModuleType.WAR)) {
                         return null;
                     }
-                    if (webAppInfo.moduleId == appInfo.jarPath) {
+                    if (webAppInfo.moduleId == appInfo.path) {
                         return new TargetModuleIDImpl(DEFAULT_TARGET, webAppInfo.moduleId); //todo web module
                     }
                 }
@@ -224,7 +224,7 @@ public class VmDeploymentManager impleme
             return null;
         }
 
-        TargetModuleIDImpl earModuleId = new TargetModuleIDImpl(DEFAULT_TARGET, appInfo.jarPath);
+        TargetModuleIDImpl earModuleId = new TargetModuleIDImpl(DEFAULT_TARGET, appInfo.path);
         for (ClientInfo clientInfo : appInfo.clients) {
             TargetModuleIDImpl clientModuleId = new TargetModuleIDImpl(DEFAULT_TARGET, clientInfo.moduleId);
             clientModuleId.setParentTargetModuleID(earModuleId);

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/AppContext.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/AppContext.java?rev=987790&r1=987789&r2=987790&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/AppContext.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/AppContext.java Sat Aug 21 16:58:57 2010
@@ -29,13 +29,20 @@ public class AppContext extends Deployme
     private final ClassLoader classLoader;
     private final Context globalJndiContext;
     private final Context appJndiContext;
+    private final boolean standaloneModule;
 
-    public AppContext(String id, SystemInstance systemInstance, ClassLoader classLoader, Context globalJndiContext, Context appJndiContext) {
+    public AppContext(String id, SystemInstance systemInstance, ClassLoader classLoader, Context globalJndiContext, Context appJndiContext, boolean standaloneModule) {
         super(id, systemInstance.getOptions());
         this.classLoader = classLoader;
         this.systemInstance = systemInstance;
         this.globalJndiContext = globalJndiContext;
         this.appJndiContext = appJndiContext;
+        this.standaloneModule = standaloneModule;
+    }
+
+    @Override
+    public String getId() {
+        return super.getId();
     }
 
     public ClassLoader getClassLoader() {
@@ -53,4 +60,8 @@ public class AppContext extends Deployme
     public Context getGlobalJndiContext() {
         return globalJndiContext;
     }
+
+    public boolean isStandaloneModule() {
+        return standaloneModule;
+    }
 }

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/timer/DefaultTimerThreadPoolAdapter.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/timer/DefaultTimerThreadPoolAdapter.java?rev=987790&r1=987789&r2=987790&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/timer/DefaultTimerThreadPoolAdapter.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/timer/DefaultTimerThreadPoolAdapter.java Sat Aug 21 16:58:57 2010
@@ -57,7 +57,7 @@ public class DefaultTimerThreadPoolAdapt
         }
     }
 
-    @Override
+//    @Override
     public int blockForAvailableThreads() {
         if (threadPoolExecutorUsed) {
             ThreadPoolExecutor threadPoolExecutor = (ThreadPoolExecutor) executor;
@@ -75,12 +75,12 @@ public class DefaultTimerThreadPoolAdapt
         }
     }
 
-    @Override
+//    @Override
     public void setInstanceId(String instanceId) {
         this.instanceId = instanceId;
     }
 
-    @Override
+//    @Override
     public void setInstanceName(String instanceName) {
         this.instanceName = instanceName;
     }

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/resources/org/apache/openejb/config/rules/Messages.properties
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/resources/org/apache/openejb/config/rules/Messages.properties?rev=987790&r1=987789&r2=987790&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/resources/org/apache/openejb/config/rules/Messages.properties (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/resources/org/apache/openejb/config/rules/Messages.properties Sat Aug 21 16:58:57 2010
@@ -297,6 +297,11 @@
 2.xml.localRemote.conflict = Interface illegally declared as both <business-local> and <business-remote>: {0}
 3.xml.localRemote.conflict = When declaring business interface as <business-local> in an ejb-jar.xml file, the same interface cannot be listed as <business-remote>.  Revise the declaration of business interface "{0}" so that it is either local or remote, not both.
 
+# fail(ejbName, "xml.localRemote.conflict", interfce);
+1.ann.localRemote.generalconflict = Interface illegally declared as both local and remote in some combination of xml and annotations.
+2.ann.localRemote.generalconflict = Interface illegally declared as both local and remote in some combination of xml and annotations: {0}
+3.ann.localRemote.generalconflict = When declaring business interface as local in xml or annotations, the same interface cannot be listed as remote.  Revise the declaration of business interface "{0}" so that it is either local or remote, not both.
+
 # fail(ejbName, "ann.remote.noAttributes", join(", ", interfaces));
 1.ann.remote.noAttributes = Ambiguous @Remote() usage on bean class
 2.ann.remote.noAttributes = Ambiguous @Remote() usage on bean class.  Must list interfaces explicitly in annotation.