From 9d47d401aa2a150aa96e14e20d3098b822566fba Mon Sep 17 00:00:00 2001 From: Romain manni-Bucau Date: Tue, 8 Mar 2016 17:38:48 +0100 Subject: [PATCH] adding openwebbeans module --- .../OpenWebBeansObjectFactoryTest.java" | 29 +++++++ openwebbeans/pom.xml | 58 ++++++++++++++ .../api/openwebbeans/OpenWebBeansConfig.java | 5 ++ .../cucumber/api/openwebbeans/README.java | 5 ++ .../cucumber/api/openwebbeans/package.html | 6 ++ .../OpenWebBeansObjectFactory.java | 80 +++++++++++++++++++ .../runtime/java/openwebbeans/Belly.java | 13 +++ .../java/openwebbeans/BellyStepdefs.java | 24 ++++++ .../runtime/java/openwebbeans/Config.java | 11 +++ .../OpenWebBeansObjectFactoryTest.java | 4 + .../java/openwebbeans/RunCukesTest.java | 8 ++ .../runtime/java/openwebbeans/UnusedGlue.java | 20 +++++ .../src/test/resources/META-INF/beans.xml | 7 ++ .../runtime/java/openwebbeans/cukes.feature | 5 ++ pom.xml | 2 + 15 files changed, 277 insertions(+) create mode 100644 "openwebbeans\021src/test/java/cucumber/runtime/java/openwebbeans/OpenWebBeansObjectFactoryTest.java" create mode 100644 openwebbeans/pom.xml create mode 100644 openwebbeans/src/main/java/cucumber/api/openwebbeans/OpenWebBeansConfig.java create mode 100644 openwebbeans/src/main/java/cucumber/api/openwebbeans/README.java create mode 100644 openwebbeans/src/main/java/cucumber/api/openwebbeans/package.html create mode 100644 openwebbeans/src/main/java/cucumber/runtime/java/openwebbeans/OpenWebBeansObjectFactory.java create mode 100644 openwebbeans/src/test/java/cucumber/runtime/java/openwebbeans/Belly.java create mode 100644 openwebbeans/src/test/java/cucumber/runtime/java/openwebbeans/BellyStepdefs.java create mode 100644 openwebbeans/src/test/java/cucumber/runtime/java/openwebbeans/Config.java create mode 100644 openwebbeans/src/test/java/cucumber/runtime/java/openwebbeans/OpenWebBeansObjectFactoryTest.java create mode 100644 openwebbeans/src/test/java/cucumber/runtime/java/openwebbeans/RunCukesTest.java create mode 100644 openwebbeans/src/test/java/cucumber/runtime/java/openwebbeans/UnusedGlue.java create mode 100644 openwebbeans/src/test/resources/META-INF/beans.xml create mode 100644 openwebbeans/src/test/resources/cucumber/runtime/java/openwebbeans/cukes.feature diff --git "a/openwebbeans\021src/test/java/cucumber/runtime/java/openwebbeans/OpenWebBeansObjectFactoryTest.java" "b/openwebbeans\021src/test/java/cucumber/runtime/java/openwebbeans/OpenWebBeansObjectFactoryTest.java" new file mode 100644 index 0000000000..e788a7c1fd --- /dev/null +++ "b/openwebbeans\021src/test/java/cucumber/runtime/java/openwebbeans/OpenWebBeansObjectFactoryTest.java" @@ -0,0 +1,29 @@ +package cucumber.runtime.java.openwebbeans; + +import cucumber.api.java.ObjectFactory; +import org.junit.Test; + +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNotSame; + +public class OpenWebBeansObjectFactoryTest { + @Test + public void shouldGiveUsNewInstancesForEachScenario() { + ObjectFactory factory = new OpenWebBeansObjectFactory(); + factory.addClass(BellyStepdefs.class); + + // Scenario 1 + factory.start(); + BellyStepdefs o1 = factory.getInstance(BellyStepdefs.class); + factory.stop(); + + // Scenario 2 + factory.start(); + BellyStepdefs o2 = factory.getInstance(BellyStepdefs.class); + factory.stop(); + + assertNotNull(o1); + assertNotSame(o1, o2); + } + +} diff --git a/openwebbeans/pom.xml b/openwebbeans/pom.xml new file mode 100644 index 0000000000..75f7c4d4b3 --- /dev/null +++ b/openwebbeans/pom.xml @@ -0,0 +1,58 @@ + + 4.0.0 + + + info.cukes + cucumber-jvm + ../pom.xml + 1.2.5-SNAPSHOT + + + cucumber-openwebbeans + jar + Cucumber-JVM: OpenWebBeans + + + + info.cukes + cucumber-java + + + info.cukes + cucumber-jvm-deps + provided + + + info.cukes + gherkin + provided + + + javax.enterprise + cdi-api + provided + + + org.apache.openwebbeans + openwebbeans-impl + ${openwebbeans.version} + provided + + + + info.cukes + cucumber-junit + test + + + junit + junit + test + + + net.sourceforge.cobertura + cobertura + test + + + diff --git a/openwebbeans/src/main/java/cucumber/api/openwebbeans/OpenWebBeansConfig.java b/openwebbeans/src/main/java/cucumber/api/openwebbeans/OpenWebBeansConfig.java new file mode 100644 index 0000000000..19463887ad --- /dev/null +++ b/openwebbeans/src/main/java/cucumber/api/openwebbeans/OpenWebBeansConfig.java @@ -0,0 +1,5 @@ +package cucumber.api.openwebbeans; + +public interface OpenWebBeansConfig { + boolean userManaged(); +} diff --git a/openwebbeans/src/main/java/cucumber/api/openwebbeans/README.java b/openwebbeans/src/main/java/cucumber/api/openwebbeans/README.java new file mode 100644 index 0000000000..2b51f063ef --- /dev/null +++ b/openwebbeans/src/main/java/cucumber/api/openwebbeans/README.java @@ -0,0 +1,5 @@ +package cucumber.api.openwebbeans; + + +public class README { +} diff --git a/openwebbeans/src/main/java/cucumber/api/openwebbeans/package.html b/openwebbeans/src/main/java/cucumber/api/openwebbeans/package.html new file mode 100644 index 0000000000..fdcb36a952 --- /dev/null +++ b/openwebbeans/src/main/java/cucumber/api/openwebbeans/package.html @@ -0,0 +1,6 @@ + +

+ There is no API for this module, but by including the cucumber-openwebbeans jar + on your CLASSPATH your Step Definitions will be instantiated by OpenWebBeans. +

+ diff --git a/openwebbeans/src/main/java/cucumber/runtime/java/openwebbeans/OpenWebBeansObjectFactory.java b/openwebbeans/src/main/java/cucumber/runtime/java/openwebbeans/OpenWebBeansObjectFactory.java new file mode 100644 index 0000000000..992d04c227 --- /dev/null +++ b/openwebbeans/src/main/java/cucumber/runtime/java/openwebbeans/OpenWebBeansObjectFactory.java @@ -0,0 +1,80 @@ +package cucumber.runtime.java.openwebbeans; + +import cucumber.api.java.ObjectFactory; +import cucumber.api.openwebbeans.OpenWebBeansConfig; +import org.apache.webbeans.config.WebBeansContext; +import org.apache.webbeans.container.BeanManagerImpl; +import org.apache.webbeans.context.creational.CreationalContextImpl; +import org.apache.webbeans.spi.ContainerLifecycle; + +import javax.enterprise.context.spi.CreationalContext; +import javax.enterprise.inject.spi.Bean; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.ServiceLoader; + +public class OpenWebBeansObjectFactory implements ObjectFactory { + private final Map, Object> notNormalScopedInstances = new HashMap, Object>(); + private final Collection> contexts = new ArrayList>(); + private WebBeansContext webBeansContext; + private boolean managed; + + @Override + public void start() { + webBeansContext = WebBeansContext.currentInstance(); + final ContainerLifecycle cl = webBeansContext.getService(ContainerLifecycle.class); + + final Iterator config = ServiceLoader.load(OpenWebBeansConfig.class).iterator(); + managed = !config.hasNext() || !config.next().userManaged(); + if (managed) { + cl.startApplication(null); + } + } + + @Override + public void stop() { + synchronized (contexts) { + for (final CreationalContext cc : contexts) { + cc.release(); + } + contexts.clear(); + notNormalScopedInstances.clear(); + } + if (managed) { + webBeansContext.getService(ContainerLifecycle.class).stopApplication(null); + } + } + + @Override + public boolean addClass(final Class clazz) { + return true; + } + + @Override + public T getInstance(Class type) { + final Object instance = notNormalScopedInstances.get(type); + if (instance != null) { + return type.cast(instance); + } + + final BeanManagerImpl bm = webBeansContext.getBeanManagerImpl(); + final Bean bean = bm.resolve(bm.getBeans(type)); + final CreationalContextImpl creationalContext = bm.createCreationalContext(null); + T created = type.cast(bm.getReference(bean, type, creationalContext)); + if (!bm.isNormalScope(bean.getScope())) { + synchronized (contexts) { + contexts.add(creationalContext); + final Object existing = notNormalScopedInstances.put(type, created); + if (existing != null) { + created = type.cast(existing); + creationalContext.release(); + } + } + } + return created; + } +} + diff --git a/openwebbeans/src/test/java/cucumber/runtime/java/openwebbeans/Belly.java b/openwebbeans/src/test/java/cucumber/runtime/java/openwebbeans/Belly.java new file mode 100644 index 0000000000..ce84b99765 --- /dev/null +++ b/openwebbeans/src/test/java/cucumber/runtime/java/openwebbeans/Belly.java @@ -0,0 +1,13 @@ +package cucumber.runtime.java.openwebbeans; + +public class Belly { + private int cukes; + + public void setCukes(int cukes) { + this.cukes = cukes; + } + + public int getCukes() { + return cukes; + } +} diff --git a/openwebbeans/src/test/java/cucumber/runtime/java/openwebbeans/BellyStepdefs.java b/openwebbeans/src/test/java/cucumber/runtime/java/openwebbeans/BellyStepdefs.java new file mode 100644 index 0000000000..8ba9d03be6 --- /dev/null +++ b/openwebbeans/src/test/java/cucumber/runtime/java/openwebbeans/BellyStepdefs.java @@ -0,0 +1,24 @@ +package cucumber.runtime.java.openwebbeans; + +import cucumber.api.java.en.Given; +import cucumber.api.java.en.Then; + +import javax.inject.Inject; + +import static org.junit.Assert.assertEquals; + +public class BellyStepdefs { + + @Inject + private Belly belly; + + @Given("^I have (\\d+) cukes in my belly") + public void haveCukes(int n) { + belly.setCukes(n); + } + + @Then("^there are (\\d+) cukes in my belly") + public void checkCukes(int n) { + assertEquals(n, belly.getCukes()); + } +} diff --git a/openwebbeans/src/test/java/cucumber/runtime/java/openwebbeans/Config.java b/openwebbeans/src/test/java/cucumber/runtime/java/openwebbeans/Config.java new file mode 100644 index 0000000000..42a2a7a7cd --- /dev/null +++ b/openwebbeans/src/test/java/cucumber/runtime/java/openwebbeans/Config.java @@ -0,0 +1,11 @@ +package cucumber.runtime.java.openwebbeans; + +import cucumber.api.openwebbeans.OpenWebBeansConfig; + +// not mandatory but allow to start it manually somewhere else +public class Config implements OpenWebBeansConfig { + @Override + public boolean userManaged() { + return false; + } +} diff --git a/openwebbeans/src/test/java/cucumber/runtime/java/openwebbeans/OpenWebBeansObjectFactoryTest.java b/openwebbeans/src/test/java/cucumber/runtime/java/openwebbeans/OpenWebBeansObjectFactoryTest.java new file mode 100644 index 0000000000..3b8e63ed5a --- /dev/null +++ b/openwebbeans/src/test/java/cucumber/runtime/java/openwebbeans/OpenWebBeansObjectFactoryTest.java @@ -0,0 +1,4 @@ +package cucumber.runtime.java.openwebbeans; + +public class OpenWebBeansObjectFactoryTest { +} diff --git a/openwebbeans/src/test/java/cucumber/runtime/java/openwebbeans/RunCukesTest.java b/openwebbeans/src/test/java/cucumber/runtime/java/openwebbeans/RunCukesTest.java new file mode 100644 index 0000000000..2f89caa58a --- /dev/null +++ b/openwebbeans/src/test/java/cucumber/runtime/java/openwebbeans/RunCukesTest.java @@ -0,0 +1,8 @@ +package cucumber.runtime.java.openwebbeans; + +import cucumber.api.junit.Cucumber; +import org.junit.runner.RunWith; + +@RunWith(Cucumber.class) +public class RunCukesTest { +} diff --git a/openwebbeans/src/test/java/cucumber/runtime/java/openwebbeans/UnusedGlue.java b/openwebbeans/src/test/java/cucumber/runtime/java/openwebbeans/UnusedGlue.java new file mode 100644 index 0000000000..7eb1a0b9cc --- /dev/null +++ b/openwebbeans/src/test/java/cucumber/runtime/java/openwebbeans/UnusedGlue.java @@ -0,0 +1,20 @@ +package cucumber.runtime.java.openwebbeans; + +import cucumber.api.java.Before; +import cucumber.api.java.en.Given; + +public class UnusedGlue { + public UnusedGlue() { + throw new IllegalStateException(); + } + + @Given("unused") + public void unused() { + throw new IllegalStateException(); + } + + @Before("@unused") + public void unusedHook() { + throw new IllegalStateException(); + } +} diff --git a/openwebbeans/src/test/resources/META-INF/beans.xml b/openwebbeans/src/test/resources/META-INF/beans.xml new file mode 100644 index 0000000000..d96ad300df --- /dev/null +++ b/openwebbeans/src/test/resources/META-INF/beans.xml @@ -0,0 +1,7 @@ + + + \ No newline at end of file diff --git a/openwebbeans/src/test/resources/cucumber/runtime/java/openwebbeans/cukes.feature b/openwebbeans/src/test/resources/cucumber/runtime/java/openwebbeans/cukes.feature new file mode 100644 index 0000000000..c6aa1d8814 --- /dev/null +++ b/openwebbeans/src/test/resources/cucumber/runtime/java/openwebbeans/cukes.feature @@ -0,0 +1,5 @@ +Feature: Cukes + + Scenario: Eat some cukes + Given I have 4 cukes in my belly + Then there are 4 cukes in my belly \ No newline at end of file diff --git a/pom.xml b/pom.xml index 77c344fff6..1c0d042290 100644 --- a/pom.xml +++ b/pom.xml @@ -50,6 +50,7 @@ 2.2.11.Final 1.2 4.7.1 + 1.6.2 2.2 7.0 1 @@ -559,6 +560,7 @@ groovy rhino openejb + openwebbeans scala needle android