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