Author: dblevins
Date: Sun Apr 10 13:58:11 2011
New Revision: 1090804

URL: http://svn.apache.org/viewvc?rev=1090804&view=rev
Log:
OPENEJB-1517: EJBContainer.createEJBContainer MODULES supports various 
org.apache.openejb.jee.* types
OPENEJB-1510: org.apache.openejb.OpenEjbContainer.inject(object)  -- now fully 
functional

Added:
    
openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/OpenEjbContainerTest.java
   (with props)
Modified:
    
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/config/NewLoaderLogic.java
    
openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/DependencyVisitor.java

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=1090804&r1=1090803&r2=1090804&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
 Sun Apr 10 13:58:11 2011
@@ -16,35 +16,24 @@
  */
 package org.apache.openejb;
 
-import java.io.File;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.net.URLClassLoader;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-import java.util.Set;
-
-import javax.ejb.EJBException;
-import javax.ejb.embeddable.EJBContainer;
-import javax.ejb.spi.EJBContainerProvider;
-import javax.naming.Context;
-import javax.naming.Name;
-import javax.naming.NameNotFoundException;
-import javax.naming.NamingException;
 import org.apache.openejb.assembler.classic.AppInfo;
 import org.apache.openejb.assembler.classic.Assembler;
 import org.apache.openejb.config.AppModule;
 import org.apache.openejb.config.ConfigurationFactory;
+import org.apache.openejb.config.ConnectorModule;
 import org.apache.openejb.config.EjbModule;
 import org.apache.openejb.config.NewLoaderLogic;
+import org.apache.openejb.config.PersistenceModule;
 import org.apache.openejb.config.ValidationFailedException;
+import org.apache.openejb.jee.Application;
+import org.apache.openejb.jee.Beans;
+import org.apache.openejb.jee.Connector;
 import org.apache.openejb.jee.EjbJar;
+import org.apache.openejb.jee.EnterpriseBean;
 import org.apache.openejb.jee.ManagedBean;
 import org.apache.openejb.jee.TransactionType;
+import org.apache.openejb.jee.jpa.unit.Persistence;
+import org.apache.openejb.jee.jpa.unit.PersistenceUnit;
 import org.apache.openejb.jee.oejb3.EjbDeployment;
 import org.apache.openejb.jee.oejb3.OpenejbJar;
 import org.apache.openejb.loader.SystemInstance;
@@ -55,6 +44,25 @@ import org.apache.openejb.util.Logger;
 import org.apache.openejb.util.OptionsLog;
 import org.apache.xbean.naming.context.ContextFlyweight;
 
+import javax.ejb.EJBException;
+import javax.ejb.embeddable.EJBContainer;
+import javax.ejb.spi.EJBContainerProvider;
+import javax.naming.Context;
+import javax.naming.Name;
+import javax.naming.NameNotFoundException;
+import javax.naming.NamingException;
+import java.io.File;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+
 /**
  * @version $Rev$ $Date$
  */
@@ -63,7 +71,7 @@ public class OpenEjbContainer extends EJ
     static Logger logger = Logger.getInstance(LogCategory.OPENEJB_STARTUP, 
OpenEjbContainer.class);
 
     private static OpenEjbContainer instance;
-    
+
     private final Context context;
 
     private OpenEjbContainer(Context context) {
@@ -86,7 +94,7 @@ public class OpenEjbContainer extends EJ
     }
 
     public <T> T inject(T object) {
-        
+
         assert object != null;
 
         final Class<?> clazz = object.getClass();
@@ -94,7 +102,7 @@ public class OpenEjbContainer extends EJ
         final BeanContext context = resolve(clazz);
 
         if (context == null) throw new 
NoInjectionMetaDataException(clazz.getName());
-        
+
         final InjectionProcessor processor = new InjectionProcessor(object, 
context.getInjections(), context.getJndiContext());
 
         try {
@@ -151,7 +159,6 @@ public class OpenEjbContainer extends EJ
                 return instance;
             }
 
-            String appId = (String) map.get(EJBContainer.APP_NAME);
 
             try {
                 Properties properties = new Properties();
@@ -169,86 +176,8 @@ public class OpenEjbContainer extends EJ
 
                 final ConfigurationFactory configurationFactory = new 
ConfigurationFactory();
 
-                final List<File> moduleLocations;
-
-                final Object modules = map.get(EJBContainer.MODULES);
-
-                // will be updated if needed
-                ClassLoader classLoader = getClass().getClassLoader();
-
-                if (modules instanceof String) {
-
-                    moduleLocations = 
configurationFactory.getModulesFromClassPath(null, classLoader);
-                    for (Iterator<File> i = moduleLocations.iterator(); 
i.hasNext(); ) {
-                        File file = i.next();
-                        if (!match((String)modules, file)) {
-                            i.remove();
-                        }
-                    }
-
-                } else if (modules instanceof String[]) {
-
-                    // TODO Optimize this so we look specifically for modules 
by name
-                    moduleLocations = 
configurationFactory.getModulesFromClassPath(null, classLoader);
-
-                    int matched = 0;
-
-                    for (Iterator<File> i = moduleLocations.iterator(); 
i.hasNext(); ) {
-                        File file = i.next();
-                        boolean remove = true;
-                        for (String s: (String[])modules) {
-                            if (match(s, file)) {
-                                remove = false;
-                                matched++;
-                                break;
-                            }
-                        }
-                        if (remove) {
-                            i.remove();
-                        }
-                    }
-
-                    if (matched != ((String[])modules).length) {
-
-                        throw specifiedModulesNotFound();
-                        
-                    }
-
-                } else if (modules instanceof File) {
-
-                    URL url = ((File) modules).toURI().toURL();
-                    classLoader = new URLClassLoader(new URL[] {url}, 
classLoader);
-                    moduleLocations = Collections.singletonList((File)modules);
-
-                } else if (modules instanceof File[]) {
-
-                    File[] files = (File[]) modules;
-                    URL[] urls = new URL[files.length];
-                    for (int i = 0; i< urls.length; i++) {
-                        urls[i] = files[i].toURI().toURL();
-                    }
-                    classLoader = new URLClassLoader(urls, classLoader);
-                    moduleLocations = Arrays.asList((File[])modules);
-
-                } else if (modules == null) {
-
-                    moduleLocations = 
configurationFactory.getModulesFromClassPath(null, classLoader);
-
-                } else {
 
-                    throw invalidModulesValue(modules);
-
-                }
-
-
-                if (moduleLocations.isEmpty()) {
-
-                    throw new NoModulesFoundException("No modules to deploy 
found");
-                    
-                }
-
-                // TODO With this load method we can finally do some checking 
on module ids to really implement EJBContainer.MODULES String/String[]
-                final AppModule appModule = 
configurationFactory.loadApplication(classLoader, appId, moduleLocations);
+                final AppModule appModule = load(map, configurationFactory);
 
                 final Set<String> callers = NewLoaderLogic.callers();
                 final EjbJar ejbJar = new EjbJar();
@@ -262,7 +191,7 @@ public class OpenEjbContainer extends EJ
                     bean.setTransactionType(TransactionType.BEAN);
 
                     final EjbDeployment ejbDeployment = 
openejbJar.addEjbDeployment(bean);
-                    
+
                     // important in case any other deploment id formats are 
specified
                     ejbDeployment.setDeploymentId(caller);
                 }
@@ -270,7 +199,6 @@ public class OpenEjbContainer extends EJ
                 appModule.getEjbModules().add(new EjbModule(ejbJar, 
openejbJar));
 
 
-
                 final AppInfo appInfo;
                 try {
 
@@ -295,7 +223,7 @@ public class OpenEjbContainer extends EJ
                 final AppContext appContext;
 
                 try {
-                    appContext = assembler.createApplication(appInfo, 
classLoader);
+                    appContext = assembler.createApplication(appInfo, 
appModule.getClassLoader());
                 } catch (Exception e) {
                     throw new AssembleApplicationException(e);
                 }
@@ -321,13 +249,176 @@ public class OpenEjbContainer extends EJ
             }
         }
 
+        private AppModule load(Map<?, ?> map, ConfigurationFactory 
configurationFactory) throws MalformedURLException, OpenEJBException {
+            final List<File> moduleLocations;
+
+            String appId = (String) map.get(EJBContainer.APP_NAME);
+
+
+            final Object modules = map.get(EJBContainer.MODULES);
+
+            // will be updated if needed
+
+            ClassLoader classLoader = getClass().getClassLoader();
+
+            if (modules instanceof String) {
+
+                moduleLocations = 
configurationFactory.getModulesFromClassPath(null, classLoader);
+                for (Iterator<File> i = moduleLocations.iterator(); 
i.hasNext();) {
+                    File file = i.next();
+                    if (!match((String) modules, file)) {
+                        i.remove();
+                    }
+                }
+
+            } else if (modules instanceof String[]) {
+
+                // TODO Optimize this so we look specifically for modules by 
name
+                moduleLocations = 
configurationFactory.getModulesFromClassPath(null, classLoader);
+
+                int matched = 0;
+
+                for (Iterator<File> i = moduleLocations.iterator(); 
i.hasNext();) {
+                    File file = i.next();
+                    boolean remove = true;
+                    for (String s : (String[]) modules) {
+                        if (match(s, file)) {
+                            remove = false;
+                            matched++;
+                            break;
+                        }
+                    }
+                    if (remove) {
+                        i.remove();
+                    }
+                }
+
+                if (matched != ((String[]) modules).length) {
+
+                    throw specifiedModulesNotFound();
+
+                }
+
+            } else if (modules instanceof File) {
+
+                URL url = ((File) modules).toURI().toURL();
+                classLoader = new URLClassLoader(new URL[]{url}, classLoader);
+                moduleLocations = Collections.singletonList((File) modules);
+
+            } else if (modules instanceof File[]) {
+
+                File[] files = (File[]) modules;
+                URL[] urls = new URL[files.length];
+                for (int i = 0; i < urls.length; i++) {
+                    urls[i] = files[i].toURI().toURL();
+                }
+                classLoader = new URLClassLoader(urls, classLoader);
+                moduleLocations = Arrays.asList((File[]) modules);
+
+            } else if (modules == null) {
+
+                moduleLocations = 
configurationFactory.getModulesFromClassPath(null, classLoader);
+
+            } else {
+
+                AppModule appModule = load(map);
+
+                if (appModule != null) return appModule;
+
+                throw invalidModulesValue(modules);
+
+            }
+
+
+            if (moduleLocations.isEmpty()) {
+
+                throw new NoModulesFoundException("No modules to deploy 
found");
+
+            }
+
+            // TODO With this load method we can finally do some checking on 
module ids to really implement EJBContainer.MODULES String/String[]
+            return configurationFactory.loadApplication(classLoader, appId, 
moduleLocations);
+        }
+
+        private AppModule load(Map<?, ?> map) {
+
+            String appId = (String) map.get(EJBContainer.APP_NAME);
+
+
+            final Object modules = map.get(EJBContainer.MODULES);
+
+            map.size();
+            AppModule m;
+
+            {
+                final Object obj = modules;
+                Application application = null;
+                AppModule appModule = new 
AppModule(this.getClass().getClassLoader(), appId);
+
+                {
+                    if (obj instanceof EjbJar) {
+
+                        final EjbJar ejbJar = (EjbJar) obj;
+                        appModule.getEjbModules().add(new EjbModule(ejbJar));
+
+                    } else if (obj instanceof EnterpriseBean) {
+
+                        final EnterpriseBean bean = (EnterpriseBean) obj;
+                        final EjbJar ejbJar = new EjbJar();
+                        ejbJar.addEnterpriseBean(bean);
+                        appModule.getEjbModules().add(new EjbModule(ejbJar));
+
+                    } else if (obj instanceof Application) {
+
+                        application = (Application) obj;
+
+                    } else if (obj instanceof Connector) {
+
+                        final Connector connector = (Connector) obj;
+                        appModule.getConnectorModules().add(new 
ConnectorModule(connector));
+
+                    } else if (obj instanceof Persistence) {
+
+                        final Persistence persistence = (Persistence) obj;
+                        appModule.getPersistenceModules().add(new 
PersistenceModule("", persistence));
+
+                    } else if (obj instanceof PersistenceUnit) {
+
+                        final PersistenceUnit unit = (PersistenceUnit) obj;
+                        appModule.getPersistenceModules().add(new 
PersistenceModule("", new Persistence(unit)));
+
+                    } else if (obj instanceof Beans) {
+
+                        final Beans beans = (Beans) obj;
+                        final EjbModule ejbModule = new EjbModule(new 
EjbJar());
+                        ejbModule.setBeans(beans);
+                        appModule.getEjbModules().add(ejbModule);
+                    }
+                }
+
+                // Application is final in AppModule, which is fine, so we'll 
create a new one and move everything
+                if (application != null) {
+                    final AppModule newModule = new 
AppModule(appModule.getClassLoader(), appModule.getModuleId(), application, 
false);
+                    
newModule.getClientModules().addAll(appModule.getClientModules());
+                    
newModule.getPersistenceModules().addAll(appModule.getPersistenceModules());
+                    
newModule.getEjbModules().addAll(appModule.getEjbModules());
+                    
newModule.getConnectorModules().addAll(appModule.getConnectorModules());
+                    appModule = newModule;
+                }
+
+                m = appModule;
+            }
+            return m;
+        }
+
         // TODO, report some information
+
         private EJBException specifiedModulesNotFound() {
             return new NoSuchModuleException("some modules not matched on 
classpath");
         }
 
         private InvalidModulesPropertyException invalidModulesValue(Object 
value) {
-            String[] spec = {"java.lang.String","java.lang.String[]", 
"java.io.File", "java.io.File[]"};
+            String[] spec = {"java.lang.String", "java.lang.String[]", 
"java.io.File", "java.io.File[]"};
 //            TODO
 //            String[] vendor = {"java.lang.Class","java.lang.Class[]", 
"java.net.URL", "java.io.URL[]"};
             String type = (value == null) ? null : value.getClass().getName();
@@ -383,19 +474,20 @@ public class OpenEjbContainer extends EJ
 
         @Override
         protected String getName(String name) throws NamingException {
+            if ("inject".equals(name)) return name;
             if (!name.startsWith("java:")) throw new 
NameNotFoundException("Name must be in java: namespace");
             return name.substring("java:".length());
         }
 
         @Override
         public void bind(Name name, Object obj) throws NamingException {
-            if (name.size() == 1 && "bind".equals(name.get(0))) inject(obj);
+            if (name.size() == 1 && "inject".equals(name.get(0))) inject(obj);
             else super.bind(name, obj);
         }
 
         @Override
         public void bind(String name, Object obj) throws NamingException {
-            if (name != null && "bind".equals(name)) inject(obj);
+            if (name != null && "inject".equals(name)) inject(obj);
             else super.bind(name, obj);
         }
     }

Modified: 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/NewLoaderLogic.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/NewLoaderLogic.java?rev=1090804&r1=1090803&r2=1090804&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/NewLoaderLogic.java
 (original)
+++ 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/NewLoaderLogic.java
 Sun Apr 10 13:58:11 2011
@@ -80,7 +80,7 @@ public class NewLoaderLogic {
         // if we don't find one, so be it, this is only a convenience
         {
             // Entry points are the following:
-            Filter start = Filters.classes("javax.ejb.embedded.EJBContainer", 
"javax.naming.InitialContext");
+            Filter start = 
Filters.classes("javax.ejb.embeddable.EJBContainer", 
"javax.naming.InitialContext");
 
             Iterator<StackTraceElement> iterator = elements.iterator();
             while (iterator.hasNext()) {

Modified: 
openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/DependencyVisitor.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/DependencyVisitor.java?rev=1090804&r1=1090803&r2=1090804&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/DependencyVisitor.java
 (original)
+++ 
openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/DependencyVisitor.java
 Sun Apr 10 13:58:11 2011
@@ -87,19 +87,25 @@ public class DependencyVisitor implement
             final String signature,
             final String superName,
             final String[] interfaces) {
-        String p = getGroupKey(name);
-        current = groups.get(p);
-        if (current == null) {
-            current = new HashMap<String, Integer>();
-            groups.put(p, current);
-        }
 
-        if (signature == null) {
-            addName(superName);
-            addNames(interfaces);
+        if (name.startsWith("org/apache/openejb/OpenEjbContainer")) {
+            current = new HashMap<String, Integer>();
         } else {
-            addSignature(signature);
+            String p = getGroupKey(name);
+            current = groups.get(p);
+            if (current == null) {
+                current = new HashMap<String, Integer>();
+                groups.put(p, current);
+            }
+
+            if (signature == null) {
+                addName(superName);
+                addNames(interfaces);
+            } else {
+                addSignature(signature);
+            }
         }
+
     }
 
     public AnnotationVisitor visitAnnotation(

Added: 
openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/OpenEjbContainerTest.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/OpenEjbContainerTest.java?rev=1090804&view=auto
==============================================================================
--- 
openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/OpenEjbContainerTest.java
 (added)
+++ 
openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/OpenEjbContainerTest.java
 Sun Apr 10 13:58:11 2011
@@ -0,0 +1,59 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.openejb;
+
+import junit.framework.TestCase;
+import org.apache.openejb.jee.EjbJar;
+import org.apache.openejb.jee.SingletonBean;
+
+import javax.ejb.EJB;
+import javax.ejb.embeddable.EJBContainer;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class OpenEjbContainerTest extends TestCase {
+
+    @EJB
+    private Widget widget;
+
+    public void testInject() throws Exception {
+
+        Map<String, Object> map = new HashMap<String, Object>();
+
+
+        final EjbJar ejbJar = new EjbJar();
+        ejbJar.addEnterpriseBean(new SingletonBean(Widget.class));
+        map.put(EJBContainer.MODULES, ejbJar);
+
+        OpenEjbContainer openEjbContainer = (OpenEjbContainer) 
EJBContainer.createEJBContainer(map);
+
+        openEjbContainer.inject(this);
+
+        assertNotNull(widget);
+
+        widget = null;
+
+        openEjbContainer.getContext().bind("inject", this);
+    }
+
+    public static class Widget {
+
+    }
+}

Propchange: 
openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/OpenEjbContainerTest.java
------------------------------------------------------------------------------
    svn:eol-style = native


Reply via email to