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