You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by rm...@apache.org on 2014/03/01 13:30:11 UTC

svn commit: r1573165 - in /tomee/tomee/trunk/container/openejb-core/src: main/java/org/apache/openejb/cdi/ main/java/org/apache/openejb/testing/ test/java/org/apache/openejb/cdi/ test/resources/META-INF/services/

Author: rmannibucau
Date: Sat Mar  1 12:30:10 2014
New Revision: 1573165

URL: http://svn.apache.org/r1573165
Log:
TOMEE-1133 @CdiExtensions for app composer

Added:
    tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/testing/CdiExtensions.java
      - copied, changed from r1573154, tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/testing/Classes.java
    tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/cdi/AnExtension.java
    tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/cdi/AppComposerCdiExtensionTest.java
    tomee/tomee/trunk/container/openejb-core/src/test/resources/META-INF/services/javax.enterprise.inject.spi.Extension
Modified:
    tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/cdi/OptimizedLoaderService.java
    tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/cdi/ThreadSingletonServiceImpl.java
    tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/testing/ApplicationComposers.java

Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/cdi/OptimizedLoaderService.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/cdi/OptimizedLoaderService.java?rev=1573165&r1=1573164&r2=1573165&view=diff
==============================================================================
--- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/cdi/OptimizedLoaderService.java (original)
+++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/cdi/OptimizedLoaderService.java Sat Mar  1 12:30:10 2014
@@ -62,16 +62,21 @@ public class OptimizedLoaderService impl
         }
 
         // As far as we know, this only is reached for CDI Extension discovery
-        final List<T> list = loaderService.load(serviceType, classLoader);
         if (Extension.class.equals(serviceType)) {
-            final Collection<String> additional = ADDITIONAL_EXTENSIONS.get();
-            if (additional != null) {
-                for (final String name : additional) {
-                    try {
-                        list.add((T) classLoader.loadClass(name).newInstance());
-                    } catch (final Exception ignored) {
-                        // no-op
-                    }
+            return (List<T>) loadExtensions(classLoader);
+        }
+        return loaderService.load(serviceType, classLoader);
+    }
+
+    protected List<? extends Extension> loadExtensions(final ClassLoader classLoader) {
+        final List<Extension> list = loaderService.load(Extension.class, classLoader);
+        final Collection<String> additional = ADDITIONAL_EXTENSIONS.get();
+        if (additional != null) {
+            for (final String name : additional) {
+                try {
+                    list.add(Extension.class.cast(classLoader.loadClass(name).newInstance()));
+                } catch (final Exception ignored) {
+                    // no-op
                 }
             }
         }

Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/cdi/ThreadSingletonServiceImpl.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/cdi/ThreadSingletonServiceImpl.java?rev=1573165&r1=1573164&r2=1573165&view=diff
==============================================================================
--- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/cdi/ThreadSingletonServiceImpl.java (original)
+++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/cdi/ThreadSingletonServiceImpl.java Sat Mar  1 12:30:10 2014
@@ -120,7 +120,12 @@ public class ThreadSingletonServiceImpl 
         services.put(TransactionService.class, new OpenEJBTransactionService());
         services.put(ELAdaptor.class, new CustomELAdapter(appContext));
         services.put(ScannerService.class, new CdiScanner());
-        services.put(LoaderService.class, new OptimizedLoaderService());
+        final LoaderService loaderService = SystemInstance.get().getComponent(LoaderService.class);
+        if (loaderService == null) {
+            services.put(LoaderService.class, new OptimizedLoaderService());
+        } else {
+            services.put(LoaderService.class, loaderService);
+        }
 
         optional(services, ConversationService.class, "org.apache.webbeans.jsf.DefaultConversationService");
 

Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/testing/ApplicationComposers.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/testing/ApplicationComposers.java?rev=1573165&r1=1573164&r2=1573165&view=diff
==============================================================================
--- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/testing/ApplicationComposers.java (original)
+++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/testing/ApplicationComposers.java Sat Mar  1 12:30:10 2014
@@ -26,6 +26,7 @@ import org.apache.openejb.assembler.clas
 import org.apache.openejb.assembler.classic.Assembler;
 import org.apache.openejb.assembler.classic.OpenEjbConfiguration;
 import org.apache.openejb.assembler.classic.WebAppBuilder;
+import org.apache.openejb.cdi.OptimizedLoaderService;
 import org.apache.openejb.cdi.ScopeHelper;
 import org.apache.openejb.config.AppModule;
 import org.apache.openejb.config.ConfigurationFactory;
@@ -65,6 +66,7 @@ import org.apache.openejb.util.URLs;
 import org.apache.openejb.web.LightweightWebAppBuilder;
 import org.apache.webbeans.inject.OWBInjector;
 import org.apache.webbeans.spi.ContextsService;
+import org.apache.webbeans.spi.LoaderService;
 import org.apache.webbeans.web.lifecycle.test.MockHttpSession;
 import org.apache.webbeans.web.lifecycle.test.MockServletContext;
 import org.apache.xbean.finder.AnnotationFinder;
@@ -78,6 +80,7 @@ import org.xml.sax.InputSource;
 import javax.enterprise.context.ConversationScoped;
 import javax.enterprise.context.RequestScoped;
 import javax.enterprise.context.SessionScoped;
+import javax.enterprise.inject.spi.Extension;
 import javax.naming.Context;
 import javax.naming.InitialContext;
 import java.io.File;
@@ -322,6 +325,11 @@ public final class ApplicationComposers 
 
         SystemInstance.init(configuration);
 
+        final CdiExtensions cdiExtensions = testClass.getAnnotation(CdiExtensions.class);
+        if (cdiExtensions != null) {
+            SystemInstance.get().setComponent(LoaderService.class, new ExtensionAwareOptimizedLoaderService(cdiExtensions.value()));
+        }
+
         // save the test under test to be able to retrieve it from extensions
         // /!\ has to be done before all other init
         SystemInstance.get().setComponent(TestInstance.class, new TestInstance(testClass, testInstance));
@@ -860,4 +868,25 @@ public final class ApplicationComposers 
             // no-op: not an issue
         }
     }
+
+    protected static class ExtensionAwareOptimizedLoaderService extends OptimizedLoaderService {
+        private final Class<? extends Extension>[] extensions;
+
+        protected ExtensionAwareOptimizedLoaderService(final Class<? extends Extension>[] extensions) {
+            this.extensions = extensions;
+        }
+
+        @Override
+        protected List<? extends Extension> loadExtensions(final ClassLoader classLoader) {
+            final List<Extension> list = new ArrayList<Extension>();
+            for (final Class<? extends Extension> e : extensions) {
+                try {
+                    list.add(e.newInstance());
+                } catch (final Exception e1) {
+                    throw new OpenEJBRuntimeException(e1);
+                }
+            }
+            return list;
+        }
+    }
 }

Copied: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/testing/CdiExtensions.java (from r1573154, tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/testing/Classes.java)
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/testing/CdiExtensions.java?p2=tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/testing/CdiExtensions.java&p1=tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/testing/Classes.java&r1=1573154&r2=1573165&rev=1573165&view=diff
==============================================================================
--- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/testing/Classes.java (original)
+++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/testing/CdiExtensions.java Sat Mar  1 12:30:10 2014
@@ -16,17 +16,16 @@
  */
 package org.apache.openejb.testing;
 
+import javax.enterprise.inject.spi.Extension;
 import java.lang.annotation.ElementType;
+import java.lang.annotation.Inherited;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
 
-@Target(ElementType.METHOD)
+@Inherited
+@Target(ElementType.TYPE)
 @Retention(RetentionPolicy.RUNTIME)
-public @interface Classes {
-    Class<?>[] value() default {};
-    Class<?>[] cdiInterceptors() default {};
-    Class<?>[] cdiDecorators() default {};
-    Class<?>[] cdiAlternatives() default {};
-    boolean cdi() default false;
+public @interface CdiExtensions {
+    Class<? extends Extension>[] value() default {};
 }

Added: tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/cdi/AnExtension.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/cdi/AnExtension.java?rev=1573165&view=auto
==============================================================================
--- tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/cdi/AnExtension.java (added)
+++ tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/cdi/AnExtension.java Sat Mar  1 12:30:10 2014
@@ -0,0 +1,24 @@
+/**
+ * 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.cdi;
+
+import javax.enterprise.inject.spi.Extension;
+
+// just here for org.apache.openejb.cdi.AppComposerCdiExtensionTest
+public class AnExtension implements Extension {
+    // no need of body
+}

Added: tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/cdi/AppComposerCdiExtensionTest.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/cdi/AppComposerCdiExtensionTest.java?rev=1573165&view=auto
==============================================================================
--- tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/cdi/AppComposerCdiExtensionTest.java (added)
+++ tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/cdi/AppComposerCdiExtensionTest.java Sat Mar  1 12:30:10 2014
@@ -0,0 +1,53 @@
+/**
+ * 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.cdi;
+
+import org.apache.openejb.jee.EjbJar;
+import org.apache.openejb.junit.ApplicationComposer;
+import org.apache.openejb.testing.CdiExtensions;
+import org.apache.openejb.testing.Classes;
+import org.apache.openejb.testing.Module;
+import org.apache.openejb.util.reflection.Reflections;
+import org.apache.webbeans.config.WebBeansContext;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import javax.enterprise.inject.spi.Extension;
+import java.util.Map;
+
+import static org.junit.Assert.assertEquals;
+
+@CdiExtensions(AppComposerCdiExtensionTest.ThisTestExtensionWithoutSPIFiles.class)
+@RunWith(ApplicationComposer.class)
+public class AppComposerCdiExtensionTest {
+    @Module
+    @Classes(cdi = true)
+    public EjbJar jar() {
+        return new EjbJar();
+    }
+
+    @Test
+    public void checkOnlyConfiguredExtensionsArePresent() {
+        final Map<?, ?> extensions = Map.class.cast(Reflections.get(WebBeansContext.currentInstance().getExtensionLoader(), "extensions"));
+        assertEquals(1, extensions.size());
+        assertEquals(ThisTestExtensionWithoutSPIFiles.class, extensions.values().iterator().next().getClass());
+    }
+
+    public static class ThisTestExtensionWithoutSPIFiles implements Extension {
+        // no need of body
+    }
+}

Added: tomee/tomee/trunk/container/openejb-core/src/test/resources/META-INF/services/javax.enterprise.inject.spi.Extension
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/test/resources/META-INF/services/javax.enterprise.inject.spi.Extension?rev=1573165&view=auto
==============================================================================
--- tomee/tomee/trunk/container/openejb-core/src/test/resources/META-INF/services/javax.enterprise.inject.spi.Extension (added)
+++ tomee/tomee/trunk/container/openejb-core/src/test/resources/META-INF/services/javax.enterprise.inject.spi.Extension Sat Mar  1 12:30:10 2014
@@ -0,0 +1 @@
+org.apache.openejb.cdi.AnExtension