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 2012/04/26 05:51:22 UTC
svn commit: r1330642 - in /openejb/branches/openejb-4.0.0:
arquillian-tomee/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/
arquillian-tomee/arquillian-tomee-embedded/
arquillian-tomee/arquillian-tomee-webapp-remote/src/test...
Author: dblevins
Date: Thu Apr 26 03:51:21 2012
New Revision: 1330642
URL: http://svn.apache.org/viewvc?rev=1330642&view=rev
Log:
TOMEE-127: Remote Arquillian Adapter for TomEE (related fixes for windows)
TOMEE-164: Optimization on reading built-in tld files
TOMEE-166: Web.xml metadata-complete effectively ignored
TOMEE-168: Load OpenEJB System applications directly, without scanning
TOMEE-169: Optimization scanning for tld files
OPENEJB-1828: Disable hsql ServerService by default
OPENEJB-1829: Plain Java to parse openejb.xml and tomee.xml files
OPENEJB-1830: Omitting <ejb-name> from xml may result in failed deployment
Added:
openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/SystemApps.java
- copied, changed from r1330257, openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/SystemApps.java
openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/TldScanner.java
- copied unchanged from r1330257, openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/TldScanner.java
openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/sys/SaxOpenejb.java
- copied, changed from r1330253, openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/sys/SaxOpenejb.java
openejb/branches/openejb-4.0.0/container/openejb-core/src/test/java/org/apache/openejb/config/sys/
- copied from r1330253, openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/config/sys/
openejb/branches/openejb-4.0.0/container/openejb-core/src/test/java/org/apache/openejb/config/sys/OpenejbTest.java
- copied unchanged from r1330253, openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/config/sys/OpenejbTest.java
openejb/branches/openejb-4.0.0/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/Warmup.java
- copied unchanged from r1330257, openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/Warmup.java
Removed:
openejb/branches/openejb-4.0.0/container/openejb-core/src/main/resources/META-INF/application-client.xml
Modified:
openejb/branches/openejb-4.0.0/arquillian-tomee/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TomEEContainer.java
openejb/branches/openejb-4.0.0/arquillian-tomee/arquillian-tomee-embedded/pom.xml
openejb/branches/openejb-4.0.0/arquillian-tomee/arquillian-tomee-webapp-remote/src/test/java/org/apache/openejb/arquillian/TomEEContainerTest.java
openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java
openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java
openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/ReadDescriptors.java
openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/sys/AbstractService.java
openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/sys/JaxbOpenejb.java
openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/util/StringTemplate.java
openejb/branches/openejb-4.0.0/container/openejb-jee/src/main/java/org/apache/openejb/jee/EjbJar.java
openejb/branches/openejb-4.0.0/server/openejb-hsql/src/main/resources/META-INF/org.apache.openejb.server.ServerService/hsql
openejb/branches/openejb-4.0.0/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatLoader.java
openejb/branches/openejb-4.0.0/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Container.java
openejb/branches/openejb-4.0.0/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/TomEEJarScanner.java
Modified: openejb/branches/openejb-4.0.0/arquillian-tomee/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TomEEContainer.java
URL: http://svn.apache.org/viewvc/openejb/branches/openejb-4.0.0/arquillian-tomee/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TomEEContainer.java?rev=1330642&r1=1330641&r2=1330642&view=diff
==============================================================================
--- openejb/branches/openejb-4.0.0/arquillian-tomee/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TomEEContainer.java (original)
+++ openejb/branches/openejb-4.0.0/arquillian-tomee/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TomEEContainer.java Thu Apr 26 03:51:21 2012
@@ -16,9 +16,11 @@
*/
package org.apache.openejb.arquillian.common;
+import org.apache.openejb.OpenEJBException;
import org.apache.openejb.assembler.Deployer;
import org.apache.openejb.assembler.classic.AppInfo;
import org.apache.openejb.assembler.classic.Info;
+import org.apache.openejb.loader.IO;
import org.apache.openejb.loader.Options;
import org.apache.openejb.util.NetworkUtil;
import org.jboss.arquillian.container.spi.client.container.DeployableContainer;
@@ -37,8 +39,10 @@ import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import java.io.File;
+import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
+import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
@@ -157,11 +161,17 @@ public abstract class TomEEContainer<Con
public ProtocolMetaData deploy(Archive<?> archive) throws DeploymentException {
try {
String tmpDir = configuration.getAppWorkingDir();
- File file;
+ File file, folderFile;
int i = 0;
do { // be sure we don't override something existing
file = new File(tmpDir + File.separator + i++ + File.separator + archive.getName());
- } while (file.exists());
+ if (file.isDirectory() || !file.getName().endsWith("ar")) {
+ folderFile = file;
+ } else {
+ final String name = file.getName();
+ folderFile = new File(file.getParentFile(), name.substring(0, name.length() - 4));
+ }
+ } while (file.exists() || folderFile.exists()); // we unpack the war/ear and the delete of "i" can fail (on win in particular)
if (!file.getParentFile().exists() && !file.getParentFile().mkdirs()) {
LOGGER.warning("can't create " + file.getParent());
}
Modified: openejb/branches/openejb-4.0.0/arquillian-tomee/arquillian-tomee-embedded/pom.xml
URL: http://svn.apache.org/viewvc/openejb/branches/openejb-4.0.0/arquillian-tomee/arquillian-tomee-embedded/pom.xml?rev=1330642&r1=1330641&r2=1330642&view=diff
==============================================================================
--- openejb/branches/openejb-4.0.0/arquillian-tomee/arquillian-tomee-embedded/pom.xml (original)
+++ openejb/branches/openejb-4.0.0/arquillian-tomee/arquillian-tomee-embedded/pom.xml Thu Apr 26 03:51:21 2012
@@ -58,6 +58,12 @@
</dependency>
<dependency>
+ <groupId>org.apache.myfaces.core</groupId>
+ <artifactId>myfaces-api</artifactId>
+ <version>${myfaces.version}</version>
+ </dependency>
+
+ <dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
Modified: openejb/branches/openejb-4.0.0/arquillian-tomee/arquillian-tomee-webapp-remote/src/test/java/org/apache/openejb/arquillian/TomEEContainerTest.java
URL: http://svn.apache.org/viewvc/openejb/branches/openejb-4.0.0/arquillian-tomee/arquillian-tomee-webapp-remote/src/test/java/org/apache/openejb/arquillian/TomEEContainerTest.java?rev=1330642&r1=1330641&r2=1330642&view=diff
==============================================================================
--- openejb/branches/openejb-4.0.0/arquillian-tomee/arquillian-tomee-webapp-remote/src/test/java/org/apache/openejb/arquillian/TomEEContainerTest.java (original)
+++ openejb/branches/openejb-4.0.0/arquillian-tomee/arquillian-tomee-webapp-remote/src/test/java/org/apache/openejb/arquillian/TomEEContainerTest.java Thu Apr 26 03:51:21 2012
@@ -26,6 +26,7 @@ import junit.framework.Assert;
import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.junit.Arquillian;
+import org.jboss.arquillian.test.api.ArquillianResource;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.asset.StringAsset;
import org.jboss.shrinkwrap.api.spec.WebArchive;
@@ -34,13 +35,17 @@ import org.jboss.shrinkwrap.descriptor.a
import org.junit.Test;
import org.junit.runner.RunWith;
+// todo: add arquillian enricher to use @ArquillianResource URl url;
@RunWith(Arquillian.class)
public class TomEEContainerTest {
@Deployment
public static WebArchive createDeployment() {
- return ShrinkWrap.create(WebArchive.class, "test.war").addClass(TestServlet.class).addClass(TestEjb.class).addClass(TomEEContainerTest.class)
- .setWebXML(new StringAsset(Descriptors.create(WebAppDescriptor.class).version("3.0").servlet(TestServlet.class, "/ejb").exportAsString()));
+ return ShrinkWrap.create(WebArchive.class, "test.war")
+ .addClass(TestServlet.class).addClass(TestEjb.class).addClass(TomEEContainerTest.class)
+ .setWebXML(new StringAsset(
+ Descriptors.create(WebAppDescriptor.class)
+ .version("3.0").servlet(TestServlet.class, "/ejb").exportAsString()));
}
@EJB
@@ -53,7 +58,7 @@ public class TomEEContainerTest {
@Test
public void testShouldBeAbleToAccessServletAndEjb() throws Exception {
- InputStream is = new URL("http://127.0.0.1:" + System.getProperty("tomee.httpPort", "10080") + "/test/ejb").openStream();
+ InputStream is = new URL("http://localhost:" + System.getProperty("tomee.httpPort", "10080") + "/test/ejb").openStream();
ByteArrayOutputStream os = new ByteArrayOutputStream();
int bytesRead = -1;
Modified: openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
URL: http://svn.apache.org/viewvc/openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java?rev=1330642&r1=1330641&r2=1330642&view=diff
==============================================================================
--- openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java (original)
+++ openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java Thu Apr 26 03:51:21 2012
@@ -1185,6 +1185,36 @@ public class AnnotationDeployer implemen
final Set<Class<?>> specializingClasses = new HashSet<Class<?>>();
+
+ // Fill in default sessionType for xml declared EJBs
+ for (EnterpriseBean bean : ejbModule.getEjbJar().getEnterpriseBeans()) {
+ if (!(bean instanceof SessionBean)) continue;
+
+ SessionBean sessionBean = (SessionBean) bean;
+
+ if (sessionBean.getSessionType() != null) continue;
+
+ try {
+ final Class<?> clazz = ejbModule.getClassLoader().loadClass(bean.getEjbClass());
+ sessionBean.setSessionType(getSessionType(clazz));
+ } catch (Throwable handledInValidation) {
+ }
+ }
+
+ // Fill in default ejbName for xml declared EJBs
+ for (EnterpriseBean bean : ejbModule.getEjbJar().getEnterpriseBeans()) {
+ if (bean.getEjbClass() == null) continue;
+ if (bean.getEjbName() == null || bean.getEjbName().startsWith("@NULL@")) {
+ ejbModule.getEjbJar().removeEnterpriseBean(bean.getEjbName());
+ try {
+ final Class<?> clazz = ejbModule.getClassLoader().loadClass(bean.getEjbClass());
+ final String ejbName = getEjbName(bean, clazz);
+ bean.setEjbName(ejbName);
+ } catch (Throwable handledInValidation) {
+ }
+ ejbModule.getEjbJar().addEnterpriseBean(bean);
+ }
+ }
/* 19.2: ejb-name: Default is the unqualified name of the bean class */
EjbJar ejbJar = ejbModule.getEjbJar();
@@ -1397,6 +1427,54 @@ public class AnnotationDeployer implemen
return ejbModule;
}
+ private SessionType getSessionType(Class<?> clazz) {
+ if (clazz.isAnnotationPresent(Stateful.class)) return SessionType.STATEFUL;
+ if (clazz.isAnnotationPresent(Stateless.class)) return SessionType.STATELESS;
+ if (clazz.isAnnotationPresent(Singleton.class)) return SessionType.SINGLETON;
+ if (clazz.isAnnotationPresent(ManagedBean.class)) return SessionType.MANAGED;
+ return null;
+ }
+
+ private String getEjbName(EnterpriseBean bean, Class<?> clazz) {
+
+ if (bean instanceof SessionBean) {
+ SessionBean sessionBean = (SessionBean) bean;
+ switch (sessionBean.getSessionType()) {
+ case STATEFUL: {
+ final Stateful annotation = clazz.getAnnotation(Stateful.class);
+ if (annotation != null && specified(annotation.name())) {
+ return annotation.name();
+ }
+ }
+ case STATELESS: {
+ final Stateless annotation = clazz.getAnnotation(Stateless.class);
+ if (annotation != null && specified(annotation.name())) {
+ return annotation.name();
+ }
+ }
+ case SINGLETON: {
+ final Singleton annotation = clazz.getAnnotation(Singleton.class);
+ if (annotation != null && specified(annotation.name())) {
+ return annotation.name();
+ }
+ }
+ }
+ }
+
+ if (bean instanceof MessageDrivenBean) {
+ final MessageDriven annotation = clazz.getAnnotation(MessageDriven.class);
+ if (annotation != null && specified(annotation.name())) {
+ return annotation.name();
+ }
+ }
+
+ return clazz.getSimpleName();
+ }
+
+ private static boolean specified(final String name) {
+ return name != null && name.length() != 0;
+ }
+
private List<String> getBeanClasses(IAnnotationFinder finder) {
// What we're hoping in this method is to get lucky and find
Modified: openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java
URL: http://svn.apache.org/viewvc/openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java?rev=1330642&r1=1330641&r2=1330642&view=diff
==============================================================================
--- openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java (original)
+++ openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java Thu Apr 26 03:51:21 2012
@@ -447,13 +447,23 @@ public class ConfigurationFactory implem
}
final boolean embedded = SystemInstance.get().hasProperty(EJBContainer.class.getName());
- if (SystemInstance.get().getOptions().get(DEPLOYMENTS_CLASSPATH_PROPERTY, !embedded)) {
+ final Options options = SystemInstance.get().getOptions();
+
+ if (options.get("openejb.system.apps", false)) {
+ try {
+ final AppInfo appInfo = configureApplication(new AppModule(SystemApps.getSystemModule()));
+ sys.containerSystem.applications.add(appInfo);
+ } catch (OpenEJBException e) {
+ logger.error("Unable to load the system applications.", e);
+ }
+ } else if (options.get(DEPLOYMENTS_CLASSPATH_PROPERTY, !embedded)) {
+
final ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
final ArrayList<File> jarFiles = getModulesFromClassPath(declaredApps, classLoader);
final String appId = "classpath.ear";
- final boolean classpathAsEar = SystemInstance.get().getOptions().get(CLASSPATH_AS_EAR, true);
+ final boolean classpathAsEar = options.get(CLASSPATH_AS_EAR, true);
try {
if (classpathAsEar && !jarFiles.isEmpty()) {
Modified: openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java
URL: http://svn.apache.org/viewvc/openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java?rev=1330642&r1=1330641&r2=1330642&view=diff
==============================================================================
--- openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java (original)
+++ openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java Thu Apr 26 03:51:21 2012
@@ -51,6 +51,7 @@ import org.apache.xbean.finder.IAnnotati
import org.apache.xbean.finder.ResourceFinder;
import org.apache.xbean.finder.UrlSet;
import org.apache.xbean.finder.archive.Archive;
+import org.apache.xbean.finder.archive.ClassesArchive;
import org.apache.xbean.finder.archive.JarArchive;
import org.xml.sax.SAXException;
@@ -83,6 +84,8 @@ import java.util.jar.JarFile;
import java.util.jar.Manifest;
import static org.apache.openejb.config.NewLoaderLogic.applyBuiltinExcludes;
+import static org.apache.openejb.config.TldScanner.scanForTagLibs;
+import static org.apache.openejb.config.TldScanner.scanWarForTagLibs;
import static org.apache.openejb.util.URLs.toFile;
/**
@@ -677,9 +680,17 @@ public class DeploymentLoader implements
try {
// TODO: Put our scanning ehnancements back, here
- final IAnnotationFinder finder = FinderFactory.createFinder(webModule);
- webModule.setFinder(finder);
- webEjbModule.setFinder(finder);
+ fillEjbJar(webModule, webEjbModule);
+
+ if (isMetadataComplete(webModule, webEjbModule)) {
+ final IAnnotationFinder finder = new org.apache.xbean.finder.AnnotationFinder(new ClassesArchive());
+ webModule.setFinder(finder);
+ webEjbModule.setFinder(finder);
+ } else {
+ final IAnnotationFinder finder = FinderFactory.createFinder(webModule);
+ webModule.setFinder(finder);
+ webEjbModule.setFinder(finder);
+ }
} catch (Exception e) {
throw new OpenEJBException("Unable to create annotation scanner for web module " + webModule.getModuleId(), e);
}
@@ -687,6 +698,40 @@ public class DeploymentLoader implements
addWebservices(webEjbModule);
}
+ /**
+ * If the web.xml is metadata-complete and there is no ejb-jar.xml
+ * then per specification we use the web.xml metadata-complete setting
+ * to imply the same for EJBs.
+ *
+ * @param webModule
+ * @param ejbModule
+ */
+ private void fillEjbJar(WebModule webModule, EjbModule ejbModule) {
+ final Object o = webModule.getAltDDs().get("ejb-jar.xml");
+ if (o != null) return;
+ if (ejbModule.getEjbJar() != null) return;
+
+ final EjbJar ejbJar = new EjbJar();
+ final WebApp webApp = webModule.getWebApp();
+
+ ejbJar.setMetadataComplete(webApp.isMetadataComplete());
+
+ ejbModule.setEjbJar(ejbJar);
+ }
+
+ private boolean isMetadataComplete(WebModule webModule, EjbModule ejbModule) {
+ if (webModule.getWebApp() == null) return false;
+ if (!webModule.getWebApp().isMetadataComplete()) return false;
+
+ // At this point we know the web.xml is metadata-complete
+ // We need to determine if there are cdi or ejb xml files
+ if (webModule.getAltDDs().get("beans.xml") == null) return true;
+ if (ejbModule.getEjbJar() == null) return true;
+ if (!ejbModule.getEjbJar().isMetadataComplete()) return false;
+
+ return true;
+ }
+
public WebModule createWebModule(final String appId, final String warPath, final ClassLoader parentClassLoader, final String contextRoot, final String moduleName) throws OpenEJBException {
File warFile = new File(warPath);
if (!warFile.isDirectory()) {
@@ -956,7 +1001,7 @@ public class DeploymentLoader implements
// Search all libs
final ClassLoader parentClassLoader = webModule.getClassLoader().getParent();
- urls = scanClassLoaderForTagLibs(parentClassLoader);
+ urls = TldScanner.scan(parentClassLoader);
tldLocations.addAll(urls);
// load the tld files
Modified: openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/ReadDescriptors.java
URL: http://svn.apache.org/viewvc/openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/ReadDescriptors.java?rev=1330642&r1=1330641&r2=1330642&view=diff
==============================================================================
--- openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/ReadDescriptors.java (original)
+++ openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/ReadDescriptors.java Thu Apr 26 03:51:21 2012
@@ -29,6 +29,7 @@ import org.apache.openejb.jee.FacesConfi
import org.apache.openejb.jee.HandlerChains;
import org.apache.openejb.jee.JavaWsdlMapping;
import org.apache.openejb.jee.JaxbJavaee;
+import org.apache.openejb.jee.Listener;
import org.apache.openejb.jee.TldTaglib;
import org.apache.openejb.jee.WebApp;
import org.apache.openejb.jee.Webservices;
@@ -646,6 +647,16 @@ public class ReadDescriptors implements
}
public static TldTaglib readTldTaglib(URL url) throws OpenEJBException {
+ // TOMEE-164 Optimization on reading built-in tld files
+ if (url.getPath().contains("jstl-1.2.jar")) return new TldTaglib();
+ if (url.getPath().contains("myfaces-impl")) {
+ final TldTaglib taglib = new TldTaglib();
+ final Listener listener = new Listener();
+ listener.setListenerClass("org.apache.myfaces.webapp.StartupServletContextListener");
+ taglib.getListener().add(listener);
+ return taglib;
+ }
+
TldTaglib tldTaglib;
try {
tldTaglib = (TldTaglib) JaxbJavaee.unmarshalTaglib(TldTaglib.class, IO.read(url));
Copied: openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/SystemApps.java (from r1330257, openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/SystemApps.java)
URL: http://svn.apache.org/viewvc/openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/SystemApps.java?p2=openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/SystemApps.java&p1=openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/SystemApps.java&r1=1330257&r2=1330642&rev=1330642&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/SystemApps.java (original)
+++ openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/SystemApps.java Thu Apr 26 03:51:21 2012
@@ -18,7 +18,6 @@ package org.apache.openejb.config;
import org.apache.openejb.assembler.DeployerEjb;
import org.apache.openejb.assembler.classic.cmd.ConfigurationInfoEjb;
-import org.apache.openejb.assembler.monitoring.JMXDeployer;
import org.apache.openejb.jee.EjbJar;
import org.apache.openejb.jee.StatelessBean;
import org.apache.openejb.jee.oejb3.EjbDeployment;
@@ -40,7 +39,6 @@ public class SystemApps {
ejbJar.addEnterpriseBean(new StatelessBean(null, DeployerEjb.class));
ejbJar.addEnterpriseBean(new StatelessBean(null, ConfigurationInfoEjb.class));
ejbJar.addEnterpriseBean(new StatelessBean(null, MEJBBean.class));
- module.getMbeans().add(JMXDeployer.class.getName());
final String className = "org.apache.tomee.catalina.deployer.WebappDeployer";
if (exists(className)) {
Modified: openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/sys/AbstractService.java
URL: http://svn.apache.org/viewvc/openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/sys/AbstractService.java?rev=1330642&r1=1330641&r2=1330642&view=diff
==============================================================================
--- openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/sys/AbstractService.java (original)
+++ openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/sys/AbstractService.java Thu Apr 26 03:51:21 2012
@@ -17,6 +17,7 @@
package org.apache.openejb.config.sys;
import org.apache.openejb.config.Service;
+import org.apache.openejb.util.SuperProperties;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
@@ -97,7 +98,7 @@ public abstract class AbstractService im
*/
public Properties getProperties() {
if (properties == null) {
- properties = new Properties();
+ properties = new SuperProperties();
}
return properties;
}
Modified: openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/sys/JaxbOpenejb.java
URL: http://svn.apache.org/viewvc/openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/sys/JaxbOpenejb.java?rev=1330642&r1=1330641&r2=1330642&view=diff
==============================================================================
--- openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/sys/JaxbOpenejb.java (original)
+++ openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/sys/JaxbOpenejb.java Thu Apr 26 03:51:21 2012
@@ -224,8 +224,7 @@ public abstract class JaxbOpenejb {
} else {
in = IO.read(new File(configFile));
}
- Openejb openejb = (Openejb) unmarshal(SystemInstance.get().getOptions().get("openejb.configuration.class", Openejb.class), in);
- return openejb;
+ return SaxOpenejb.parse(new InputSource(in));
} catch (MalformedURLException e) {
throw new OpenEJBException("Unable to resolve location " + configFile, e);
} catch (Exception e) {
Copied: openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/sys/SaxOpenejb.java (from r1330253, openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/sys/SaxOpenejb.java)
URL: http://svn.apache.org/viewvc/openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/sys/SaxOpenejb.java?p2=openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/sys/SaxOpenejb.java&p1=openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/sys/SaxOpenejb.java&r1=1330253&r2=1330642&rev=1330642&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/sys/SaxOpenejb.java (original)
+++ openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/config/sys/SaxOpenejb.java Thu Apr 26 03:51:21 2012
@@ -181,6 +181,13 @@ class SaxOpenejb extends DefaultHandler
}
@Override
+ public void startElement(String uri, String localName, String qName, Attributes attributes) {
+ super.startElement(uri, localName, qName, attributes);
+ final String ctype = attributes.getValue("ctype");
+ if (ctype != null) service.setType(ctype);
+ }
+
+ @Override
public void endElement(String uri, String localName, String qName) {
openejb.getContainer().add(service);
super.endElement(uri, localName, qName);
Modified: openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/util/StringTemplate.java
URL: http://svn.apache.org/viewvc/openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/util/StringTemplate.java?rev=1330642&r1=1330641&r2=1330642&view=diff
==============================================================================
--- openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/util/StringTemplate.java (original)
+++ openejb/branches/openejb-4.0.0/container/openejb-core/src/main/java/org/apache/openejb/util/StringTemplate.java Thu Apr 26 03:51:21 2012
@@ -35,6 +35,9 @@ public class StringTemplate {
while (matcher.find()) {
String key = matcher.group(2);
+
+ if (key == null) throw new IllegalStateException("Key is null. Template '" + template + "'");
+
String value = map.get(key);
if (key.toLowerCase().endsWith(".lc")) {
@@ -44,8 +47,9 @@ public class StringTemplate {
} else if (key.toLowerCase().endsWith(".cc")) {
value = Strings.camelCase(map.get(key.substring(0, key.length() - 3)));
}
-
- matcher.appendReplacement(buf, value);
+
+ if (value == null) throw new IllegalStateException("Value is null for key '" + key + "'. Template '" + template + "'. Keys: " + Join.join(", ", map.keySet()));
+ matcher.appendReplacement(buf, value);
}
matcher.appendTail(buf);
Modified: openejb/branches/openejb-4.0.0/container/openejb-jee/src/main/java/org/apache/openejb/jee/EjbJar.java
URL: http://svn.apache.org/viewvc/openejb/branches/openejb-4.0.0/container/openejb-jee/src/main/java/org/apache/openejb/jee/EjbJar.java?rev=1330642&r1=1330641&r2=1330642&view=diff
==============================================================================
--- openejb/branches/openejb-4.0.0/container/openejb-jee/src/main/java/org/apache/openejb/jee/EjbJar.java (original)
+++ openejb/branches/openejb-4.0.0/container/openejb-jee/src/main/java/org/apache/openejb/jee/EjbJar.java Thu Apr 26 03:51:21 2012
@@ -179,14 +179,28 @@ public class EjbJar implements NamedModu
public void setEnterpriseBeans(EnterpriseBean[] v) {
enterpriseBeans.clear();
- for (EnterpriseBean e : v) enterpriseBeans.put(e.getEjbName(), e);
+ for (EnterpriseBean e : v) {
+ defaultName(e);
+ enterpriseBeans.put(e.getEjbName(), e);
+ }
+ }
+
+ private void defaultName(EnterpriseBean e) {
+ if (e.getEjbName() == null) {
+ e.setEjbName("@NULL@" + e.hashCode());
+ }
}
public <T extends EnterpriseBean> T addEnterpriseBean(T bean){
+ defaultName(bean);
enterpriseBeans.put(bean.getEjbName(), bean);
return bean;
}
+ public EnterpriseBean removeEnterpriseBean(EnterpriseBean bean){
+ return removeEnterpriseBean(bean.getEjbName());
+ }
+
public EnterpriseBean removeEnterpriseBean(String name){
EnterpriseBean bean = enterpriseBeans.remove(name);
return bean;
Modified: openejb/branches/openejb-4.0.0/server/openejb-hsql/src/main/resources/META-INF/org.apache.openejb.server.ServerService/hsql
URL: http://svn.apache.org/viewvc/openejb/branches/openejb-4.0.0/server/openejb-hsql/src/main/resources/META-INF/org.apache.openejb.server.ServerService/hsql?rev=1330642&r1=1330641&r2=1330642&view=diff
==============================================================================
--- openejb/branches/openejb-4.0.0/server/openejb-hsql/src/main/resources/META-INF/org.apache.openejb.server.ServerService/hsql (original)
+++ openejb/branches/openejb-4.0.0/server/openejb-hsql/src/main/resources/META-INF/org.apache.openejb.server.ServerService/hsql Thu Apr 26 03:51:21 2012
@@ -1,4 +1,4 @@
server = org.apache.openejb.server.hsql.HsqlService
bind = 127.0.0.1
port = 9001
-disabled = false
+disabled = true
Modified: openejb/branches/openejb-4.0.0/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatLoader.java
URL: http://svn.apache.org/viewvc/openejb/branches/openejb-4.0.0/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatLoader.java?rev=1330642&r1=1330641&r2=1330642&view=diff
==============================================================================
--- openejb/branches/openejb-4.0.0/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatLoader.java (original)
+++ openejb/branches/openejb-4.0.0/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatLoader.java Thu Apr 26 03:51:21 2012
@@ -87,6 +87,10 @@ import java.util.Set;
*/
public class TomcatLoader implements Loader {
+ static {
+ Warmup.warmup();
+ }
+
private static final Logger logger = Logger.getInstance(LogCategory.OPENEJB_STARTUP, TomcatLoader.class);
public static final String TOMEE_NOSHUTDOWNHOOK_PROP = "tomee.noshutdownhook";
@@ -124,7 +128,8 @@ public class TomcatLoader implements Loa
}
public void initDefaults(Properties properties) {
- setIfNull(properties, "openejb.deployments.classpath", "true");
+ setIfNull(properties, "openejb.system.apps", "true");
+ setIfNull(properties, "openejb.deployments.classpath", "false");
setIfNull(properties, "openejb.deployments.classpath.filter.systemapps", "false");
//Sets default service provider
Modified: openejb/branches/openejb-4.0.0/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Container.java
URL: http://svn.apache.org/viewvc/openejb/branches/openejb-4.0.0/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Container.java?rev=1330642&r1=1330641&r2=1330642&view=diff
==============================================================================
--- openejb/branches/openejb-4.0.0/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Container.java (original)
+++ openejb/branches/openejb-4.0.0/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Container.java Thu Apr 26 03:51:21 2012
@@ -86,7 +86,7 @@ public class Container {
final ExecutorService executor = Executors.newFixedThreadPool(4, new DaemonThreadFactory("warmup"));
executor.execute(new JaxbJavaeeLoad(WebApp.class));
- executor.execute(new JaxbJavaeeLoad(TldTaglib.class));
+// executor.execute(new JaxbJavaeeLoad(TldTaglib.class));
executor.execute(new Runnable(){
@Override
public void run() {
Modified: openejb/branches/openejb-4.0.0/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/TomEEJarScanner.java
URL: http://svn.apache.org/viewvc/openejb/branches/openejb-4.0.0/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/TomEEJarScanner.java?rev=1330642&r1=1330641&r2=1330642&view=diff
==============================================================================
--- openejb/branches/openejb-4.0.0/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/TomEEJarScanner.java (original)
+++ openejb/branches/openejb-4.0.0/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/TomEEJarScanner.java Thu Apr 26 03:51:21 2012
@@ -19,22 +19,143 @@
package org.apache.tomee.loader;
+import org.apache.juli.logging.Log;
+import org.apache.juli.logging.LogFactory;
+import org.apache.openejb.OpenEJBException;
+import org.apache.openejb.config.TldScanner;
+import org.apache.openejb.util.URLs;
import org.apache.tomcat.JarScannerCallback;
+import org.apache.tomcat.util.file.Matcher;
+import org.apache.tomcat.util.res.StringManager;
+import org.apache.tomcat.util.scan.Constants;
import org.apache.tomcat.util.scan.StandardJarScanner;
import javax.servlet.ServletContext;
+import java.io.File;
+import java.io.IOException;
+import java.net.JarURLConnection;
+import java.net.MalformedURLException;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.net.URLConnection;
+import java.util.HashSet;
+import java.util.Iterator;
import java.util.Set;
+import java.util.StringTokenizer;
public class TomEEJarScanner extends StandardJarScanner {
+
+ private static final Log log = LogFactory.getLog(StandardJarScanner.class);
+
+ private static final Set<String> defaultJarsToSkip = new HashSet<String>();
+
+ /**
+ * The string resources for this package.
+ */
+ private static final StringManager sm = StringManager.getManager(Constants.Package);
+
+ static {
+ String jarList = System.getProperty(Constants.SKIP_JARS_PROPERTY);
+ if (jarList != null) {
+ StringTokenizer tokenizer = new StringTokenizer(jarList, ",");
+ while (tokenizer.hasMoreElements()) {
+ defaultJarsToSkip.add(tokenizer.nextToken());
+ }
+ }
+ }
+
@Override
public void scan(ServletContext context, ClassLoader classLoader, JarScannerCallback callback, Set<String> jarsToIgnore) {
if ("FragmentJarScannerCallback".equals(callback.getClass().getSimpleName())) {
EmbeddedJarScanner embeddedJarScanner = new EmbeddedJarScanner();
embeddedJarScanner.scan(context, classLoader, callback, jarsToIgnore);
+ } else if ("TldJarScannerCallback".equals(callback.getClass().getSimpleName())) {
+
+ final Set<String> ignoredJars = defaultJarsToSkip;
+
+ final Set<String[]> ignoredJarsTokens = new HashSet<String[]>();
+
+ for (String pattern : ignoredJars) {
+ ignoredJarsTokens.add(Matcher.tokenizePathAsArray(pattern));
+ }
+
+ // Scan WEB-INF/lib
+ Set<String> dirList = context.getResourcePaths(Constants.WEB_INF_LIB);
+ if (dirList != null) {
+ Iterator<String> it = dirList.iterator();
+ while (it.hasNext()) {
+ String path = it.next();
+ if (path.endsWith(Constants.JAR_EXT) &&
+ !Matcher.matchPath(ignoredJarsTokens,
+ path.substring(path.lastIndexOf('/') + 1))) {
+ // Need to scan this JAR
+ URL url = null;
+ try {
+ // File URLs are always faster to work with so use them
+ // if available.
+ String realPath = context.getRealPath(path);
+ if (realPath == null) {
+ url = context.getResource(path);
+ } else {
+ url = (new File(realPath)).toURI().toURL();
+ }
+ process(callback, url);
+ } catch (IOException e) {
+ log.warn(sm.getString("jarScan.webinflibFail", url), e);
+ }
+ } else {
+ if (log.isTraceEnabled()) {
+ log.trace(sm.getString("jarScan.webinflibJarNoScan", path));
+ }
+ }
+ }
+ }
+
+ // Scan the classpath
+ if (isScanClassPath()) {
+ if (log.isTraceEnabled()) {
+ log.trace(sm.getString("jarScan.classloaderStart"));
+ }
+
+
+ try {
+ final ClassLoader loader = Thread.currentThread().getContextClassLoader();
+ final Set<URL> tldFileUrls = TldScanner.scan(loader);
+
+ final Set<URL> jarUlrs = discardFilePaths(tldFileUrls);
+
+ for (URL url : jarUlrs) {
+ String jarName = getJarName(url);
+
+ // Skip JARs known not to be interesting and JARs
+ // in WEB-INF/lib we have already scanned
+ if (jarName != null && !(Matcher.matchPath(ignoredJarsTokens, jarName) || url.toString().contains(Constants.WEB_INF_LIB + jarName))) {
+
+ if (log.isDebugEnabled()) {
+ log.debug(sm.getString("jarScan.classloaderJarScan", url));
+ }
+ try {
+ process(callback, url);
+ } catch (IOException ioe) {
+ log.warn(sm.getString(
+ "jarScan.classloaderFail", url), ioe);
+ }
+ } else {
+ if (log.isTraceEnabled()) {
+ log.trace(sm.getString("jarScan.classloaderJarNoScan", url));
+ }
+ }
+ }
+ } catch (OpenEJBException e) {
+ log.warn("JarScan.TldScan Failed ", e);
+ }
+ }
+
} else {
super.scan(context, classLoader, callback, jarsToIgnore);
}
+
// String openejbWar = System.getProperty("tomee.war");
//
// if (openejbWar == null) {
@@ -60,4 +181,100 @@ public class TomEEJarScanner extends Sta
//
// super.scan(context, classLoader, callback, newIgnores);
}
+
+ private Set<URL> discardFilePaths(Set<URL> tldFileUrls) {
+ final Set<String> jarPaths = new HashSet<String>();
+
+ for (URL tldFileUrl : tldFileUrls) {
+ jarPaths.add(URLs.toFilePath(tldFileUrl));
+ }
+
+ final Set<URL> jars = new HashSet<URL>();
+ for (String jarPath : jarPaths) {
+ try {
+ final URL url = new File(jarPath).toURI().toURL();
+ jars.add(url);
+ } catch (MalformedURLException e) {
+ log.warn("Skipping JAR file " + jarPath, e);
+ }
+ }
+ return jars;
+ }
+
+ /*
+ * Scan a URL for JARs with the optional extensions to look at all files
+ * and all directories.
+ */
+ private void process(JarScannerCallback callback, URL url) throws IOException {
+
+ if (log.isTraceEnabled()) {
+ log.trace(sm.getString("jarScan.jarUrlStart", url));
+ }
+
+ final URLConnection conn = url.openConnection();
+ if (conn instanceof JarURLConnection) {
+
+ callback.scan((JarURLConnection) conn);
+
+ } else {
+
+ final String urlStr = url.toString();
+
+ if (urlStr.startsWith("file:") || urlStr.startsWith("jndi:")) {
+
+ if (urlStr.endsWith(Constants.JAR_EXT)) {
+
+ final URL jarURL = new URL("jar:" + urlStr + "!/");
+ callback.scan((JarURLConnection) jarURL.openConnection());
+
+ } else {
+ try {
+
+ final File f = new File(url.toURI());
+
+ if (f.isFile() && isScanAllFiles()) {
+
+ // Treat this file as a JAR
+ final URL jarURL = new URL("jar:" + urlStr + "!/");
+ callback.scan((JarURLConnection) jarURL.openConnection());
+
+ } else if (f.isDirectory() && isScanAllDirectories()) {
+
+ final File metainf = new File(f.getAbsoluteFile() + File.separator + "META-INF");
+
+ if (metainf.isDirectory()) {
+ callback.scan(f);
+ }
+ }
+ } catch (URISyntaxException e) {
+ // Wrap the exception and re-throw
+ IOException ioe = new IOException();
+ ioe.initCause(e);
+ throw ioe;
+ }
+ }
+ }
+ }
+
+ }
+
+ /*
+ * Extract the JAR name, if present, from a URL
+ */
+ private String getJarName(URL url) {
+
+ String name = null;
+
+ String path = url.getPath();
+ int end = path.indexOf(Constants.JAR_EXT);
+ if (end != -1) {
+ int start = path.lastIndexOf('/', end);
+ name = path.substring(start + 1, end + 4);
+ } else if (isScanAllDirectories()) {
+ int start = path.lastIndexOf('/');
+ name = path.substring(start + 1);
+ }
+
+ return name;
+ }
}