You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwebbeans.apache.org by rm...@apache.org on 2016/10/24 14:29:01 UTC

svn commit: r1766412 - in /openwebbeans/microwave/trunk: microwave-core/src/main/java/org/apache/microwave/ microwave-core/src/main/java/org/apache/microwave/openwebbeans/ microwave-core/src/main/resources/META-INF/services/ microwave-jpa/ microwave-jp...

Author: rmannibucau
Date: Mon Oct 24 14:29:01 2016
New Revision: 1766412

URL: http://svn.apache.org/viewvc?rev=1766412&view=rev
Log:
making the unit info build optional if datasource is not ambiguous

Added:
    openwebbeans/microwave/trunk/microwave-core/src/main/java/org/apache/microwave/openwebbeans/AnyLiteral.java
      - copied, changed from r1766367, openwebbeans/microwave/trunk/microwave-jpa/src/main/java/org/apache/microwave/jpa/internal/AnyLiteral.java
    openwebbeans/microwave/trunk/microwave-core/src/main/java/org/apache/microwave/openwebbeans/DefaultLiteral.java
    openwebbeans/microwave/trunk/microwave-core/src/main/java/org/apache/microwave/openwebbeans/MicrowaveBeansExtension.java
    openwebbeans/microwave/trunk/microwave-core/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension
Modified:
    openwebbeans/microwave/trunk/microwave-core/src/main/java/org/apache/microwave/Microwave.java
    openwebbeans/microwave/trunk/microwave-core/src/main/java/org/apache/microwave/openwebbeans/KnowClassesFilter.java
    openwebbeans/microwave/trunk/microwave-jpa/README.adoc
    openwebbeans/microwave/trunk/microwave-jpa/src/main/java/org/apache/microwave/jpa/internal/EntityManagerBean.java
    openwebbeans/microwave/trunk/microwave-jpa/src/main/java/org/apache/microwave/jpa/internal/JpaExtension.java
    openwebbeans/microwave/trunk/microwave-jpa/src/test/java/org/apache/microwave/jpa/internal/JpaExtensionTest.java
    openwebbeans/microwave/trunk/microwave-jpa/src/test/java/org/app/JPADao.java

Modified: openwebbeans/microwave/trunk/microwave-core/src/main/java/org/apache/microwave/Microwave.java
URL: http://svn.apache.org/viewvc/openwebbeans/microwave/trunk/microwave-core/src/main/java/org/apache/microwave/Microwave.java?rev=1766412&r1=1766411&r2=1766412&view=diff
==============================================================================
--- openwebbeans/microwave/trunk/microwave-core/src/main/java/org/apache/microwave/Microwave.java (original)
+++ openwebbeans/microwave/trunk/microwave-core/src/main/java/org/apache/microwave/Microwave.java Mon Oct 24 14:29:01 2016
@@ -208,13 +208,10 @@ public class Microwave implements AutoCl
 
         ctx.addServletContainerInitializer((c, ctx1) -> {
             ctx.getServletContext().setAttribute("microwave.configuration", configuration);
-            try {
-                new OWBAutoSetup().onStartup(c, ctx1);
-                new CxfCdiAutoSetup().onStartup(c, ctx1);
-                new TomcatAutoInitializer().onStartup(c, ctx1);
-            } finally {
-                ctx.getServletContext().removeAttribute("microwave.configuration");
-            }
+
+            new OWBAutoSetup().onStartup(c, ctx1);
+            new CxfCdiAutoSetup().onStartup(c, ctx1);
+            new TomcatAutoInitializer().onStartup(c, ctx1);
         }, emptySet());
 
         ofNullable(meta.consumer).ifPresent(c -> c.accept(ctx));

Copied: openwebbeans/microwave/trunk/microwave-core/src/main/java/org/apache/microwave/openwebbeans/AnyLiteral.java (from r1766367, openwebbeans/microwave/trunk/microwave-jpa/src/main/java/org/apache/microwave/jpa/internal/AnyLiteral.java)
URL: http://svn.apache.org/viewvc/openwebbeans/microwave/trunk/microwave-core/src/main/java/org/apache/microwave/openwebbeans/AnyLiteral.java?p2=openwebbeans/microwave/trunk/microwave-core/src/main/java/org/apache/microwave/openwebbeans/AnyLiteral.java&p1=openwebbeans/microwave/trunk/microwave-jpa/src/main/java/org/apache/microwave/jpa/internal/AnyLiteral.java&r1=1766367&r2=1766412&rev=1766412&view=diff
==============================================================================
--- openwebbeans/microwave/trunk/microwave-jpa/src/main/java/org/apache/microwave/jpa/internal/AnyLiteral.java (original)
+++ openwebbeans/microwave/trunk/microwave-core/src/main/java/org/apache/microwave/openwebbeans/AnyLiteral.java Mon Oct 24 14:29:01 2016
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.microwave.jpa.internal;
+package org.apache.microwave.openwebbeans;
 
 import javax.enterprise.inject.Any;
 import javax.enterprise.util.AnnotationLiteral;

Added: openwebbeans/microwave/trunk/microwave-core/src/main/java/org/apache/microwave/openwebbeans/DefaultLiteral.java
URL: http://svn.apache.org/viewvc/openwebbeans/microwave/trunk/microwave-core/src/main/java/org/apache/microwave/openwebbeans/DefaultLiteral.java?rev=1766412&view=auto
==============================================================================
--- openwebbeans/microwave/trunk/microwave-core/src/main/java/org/apache/microwave/openwebbeans/DefaultLiteral.java (added)
+++ openwebbeans/microwave/trunk/microwave-core/src/main/java/org/apache/microwave/openwebbeans/DefaultLiteral.java Mon Oct 24 14:29:01 2016
@@ -0,0 +1,51 @@
+/*
+ * 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 Default
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.microwave.openwebbeans;
+
+import javax.enterprise.inject.Default;
+import javax.enterprise.util.AnnotationLiteral;
+import java.lang.annotation.Annotation;
+
+public class DefaultLiteral extends AnnotationLiteral<Default> implements Default {
+    public static final DefaultLiteral INSTANCE = new DefaultLiteral();
+
+    private static final String TOSTRING = "@javax.enterprise.inject.Default()";
+    private static final long serialVersionUID = 8867272511520063730L;
+
+    @Override
+    public Class<? extends Annotation> annotationType() {
+        return Default.class;
+    }
+
+    @Override
+    public boolean equals(final Object other) {
+        return Default.class.isInstance(other)
+                || (AnnotationLiteral.class.isInstance(other) && AnnotationLiteral.class.cast(other).annotationType() == annotationType());
+    }
+
+    @Override
+    public int hashCode() {
+        return 0;
+    }
+
+    @Override
+    public String toString() {
+        return TOSTRING;
+    }
+}

Modified: openwebbeans/microwave/trunk/microwave-core/src/main/java/org/apache/microwave/openwebbeans/KnowClassesFilter.java
URL: http://svn.apache.org/viewvc/openwebbeans/microwave/trunk/microwave-core/src/main/java/org/apache/microwave/openwebbeans/KnowClassesFilter.java?rev=1766412&r1=1766411&r2=1766412&view=diff
==============================================================================
--- openwebbeans/microwave/trunk/microwave-core/src/main/java/org/apache/microwave/openwebbeans/KnowClassesFilter.java (original)
+++ openwebbeans/microwave/trunk/microwave-core/src/main/java/org/apache/microwave/openwebbeans/KnowClassesFilter.java Mon Oct 24 14:29:01 2016
@@ -147,7 +147,6 @@ public class KnowClassesFilter implement
         included.add("org.apache.myfaces.cdi");
         // included.add("org.apache.myfaces.application.cdi");
         included.add("org.apache.myfaces.flow.cdi");
-        included.add("org.apache.microwave.cxf.MicrowaveBus");
 
         delegateSkip = new OptimizedExclusionFilter(excluded);
         delegateAccept = new OptimizedExclusionFilter(included);

Added: openwebbeans/microwave/trunk/microwave-core/src/main/java/org/apache/microwave/openwebbeans/MicrowaveBeansExtension.java
URL: http://svn.apache.org/viewvc/openwebbeans/microwave/trunk/microwave-core/src/main/java/org/apache/microwave/openwebbeans/MicrowaveBeansExtension.java?rev=1766412&view=auto
==============================================================================
--- openwebbeans/microwave/trunk/microwave-core/src/main/java/org/apache/microwave/openwebbeans/MicrowaveBeansExtension.java (added)
+++ openwebbeans/microwave/trunk/microwave-core/src/main/java/org/apache/microwave/openwebbeans/MicrowaveBeansExtension.java Mon Oct 24 14:29:01 2016
@@ -0,0 +1,34 @@
+/*
+ * 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.microwave.openwebbeans;
+
+import org.apache.microwave.cxf.MicrowaveBus;
+
+import javax.enterprise.event.Observes;
+import javax.enterprise.inject.spi.BeanManager;
+import javax.enterprise.inject.spi.BeforeBeanDiscovery;
+import javax.enterprise.inject.spi.Extension;
+import java.util.stream.Stream;
+
+public class MicrowaveBeansExtension implements Extension {
+    void addBeansFromJava(@Observes final BeforeBeanDiscovery bbd, final BeanManager bm) {
+        // stream not really needed but here for the pattern in case we need other beans
+        Stream.of(MicrowaveBus.class).forEach(type -> bbd.addAnnotatedType(bm.createAnnotatedType(type)));
+    }
+}

Added: openwebbeans/microwave/trunk/microwave-core/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension
URL: http://svn.apache.org/viewvc/openwebbeans/microwave/trunk/microwave-core/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension?rev=1766412&view=auto
==============================================================================
--- openwebbeans/microwave/trunk/microwave-core/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension (added)
+++ openwebbeans/microwave/trunk/microwave-core/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension Mon Oct 24 14:29:01 2016
@@ -0,0 +1 @@
+org.apache.microwave.openwebbeans.MicrowaveBeansExtension

Modified: openwebbeans/microwave/trunk/microwave-jpa/README.adoc
URL: http://svn.apache.org/viewvc/openwebbeans/microwave/trunk/microwave-jpa/README.adoc?rev=1766412&r1=1766411&r2=1766412&view=diff
==============================================================================
--- openwebbeans/microwave/trunk/microwave-jpa/README.adoc (original)
+++ openwebbeans/microwave/trunk/microwave-jpa/README.adoc Mon Oct 24 14:29:01 2016
@@ -23,13 +23,17 @@ public class JpaConfig {
 }
 ----
 
+TIP: if your application uses a single persistence unit this is optional and
+a default one will be created if a single DataSource bean is available as Bean<?>.
+
 The datasource can be produces as you wish using your own configuration mecanism:
 
 [source,java]
 ----
 @ApplicationScoped
 public class JpaConfig {
-    @Produces // dbcp2 datasource
+    @Produces // dbcp2 datasource for instance
+    @ApplicationScoped
     public DataSource dataSource() {
         final BasicDataSource source = new BasicDataSource();
         source.setDriver(new Driver());

Modified: openwebbeans/microwave/trunk/microwave-jpa/src/main/java/org/apache/microwave/jpa/internal/EntityManagerBean.java
URL: http://svn.apache.org/viewvc/openwebbeans/microwave/trunk/microwave-jpa/src/main/java/org/apache/microwave/jpa/internal/EntityManagerBean.java?rev=1766412&r1=1766411&r2=1766412&view=diff
==============================================================================
--- openwebbeans/microwave/trunk/microwave-jpa/src/main/java/org/apache/microwave/jpa/internal/EntityManagerBean.java (original)
+++ openwebbeans/microwave/trunk/microwave-jpa/src/main/java/org/apache/microwave/jpa/internal/EntityManagerBean.java Mon Oct 24 14:29:01 2016
@@ -5,7 +5,6 @@ import org.apache.microwave.jpa.api.Enti
 import javax.enterprise.context.spi.CreationalContext;
 import javax.enterprise.inject.Vetoed;
 import javax.enterprise.inject.spi.Bean;
-import javax.enterprise.inject.spi.BeanManager;
 import javax.enterprise.inject.spi.InjectionPoint;
 import javax.enterprise.inject.spi.PassivationCapable;
 import javax.persistence.EntityManager;
@@ -40,7 +39,7 @@ public class EntityManagerBean implement
         this.synchronization = synchronization;
     }
 
-    void init(final BeanManager bm, final PersistenceUnitInfo info) {
+    void init(final PersistenceUnitInfo info) {
         final PersistenceProvider provider;
         try {
             provider = PersistenceProvider.class.cast(

Modified: openwebbeans/microwave/trunk/microwave-jpa/src/main/java/org/apache/microwave/jpa/internal/JpaExtension.java
URL: http://svn.apache.org/viewvc/openwebbeans/microwave/trunk/microwave-jpa/src/main/java/org/apache/microwave/jpa/internal/JpaExtension.java?rev=1766412&r1=1766411&r2=1766412&view=diff
==============================================================================
--- openwebbeans/microwave/trunk/microwave-jpa/src/main/java/org/apache/microwave/jpa/internal/JpaExtension.java (original)
+++ openwebbeans/microwave/trunk/microwave-jpa/src/main/java/org/apache/microwave/jpa/internal/JpaExtension.java Mon Oct 24 14:29:01 2016
@@ -18,8 +18,9 @@
  */
 package org.apache.microwave.jpa.internal;
 
-import org.apache.microwave.jpa.api.Unit;
+import org.apache.microwave.Microwave;
 import org.apache.microwave.jpa.api.PersistenceUnitInfoBuilder;
+import org.apache.microwave.jpa.api.Unit;
 
 import javax.enterprise.context.spi.CreationalContext;
 import javax.enterprise.event.Observes;
@@ -35,15 +36,20 @@ import javax.enterprise.inject.spi.WithA
 import javax.persistence.Embeddable;
 import javax.persistence.Entity;
 import javax.persistence.MappedSuperclass;
+import javax.persistence.SynchronizationType;
 import javax.persistence.spi.PersistenceUnitInfo;
+import javax.servlet.ServletContext;
+import javax.sql.DataSource;
 import java.lang.annotation.Annotation;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.stream.Stream;
 
+import static java.util.Optional.ofNullable;
 import static java.util.function.Function.identity;
 import static java.util.stream.Collectors.toMap;
 
@@ -56,7 +62,7 @@ import static java.util.stream.Collector
 public class JpaExtension implements Extension {
     private final EntityManagerContext entityManagerContext = new EntityManagerContext();
     private final List<String> jpaClasses = new ArrayList<>();
-    private final Map<String, EntityManagerBean> entityManagerBeans = new HashMap<>();
+    private final Map<UnitKey, EntityManagerBean> entityManagerBeans = new HashMap<>();
     private final Collection<Bean<?>> unitBuilders = new ArrayList<>(2);
 
     void addInternals(@Observes final BeforeBeanDiscovery bbd, final BeanManager bm) {
@@ -65,10 +71,10 @@ public class JpaExtension implements Ext
     }
 
     void collectEntityManagerInjections(@Observes final ProcessBean<?> bean) {
-        final Map<String, EntityManagerBean> beans = bean.getBean().getInjectionPoints().stream()
+        final Map<UnitKey, EntityManagerBean> beans = bean.getBean().getInjectionPoints().stream()
                 .filter(i -> i.getAnnotated().isAnnotationPresent(Unit.class))
                 .map(i -> i.getAnnotated().getAnnotation(Unit.class))
-                .collect(toMap(Unit::name, unit -> new EntityManagerBean(entityManagerContext, unit.name(), unit.synchronization())));
+                .collect(toMap(u -> new UnitKey(u.name(), u.synchronization()), unit -> new EntityManagerBean(entityManagerContext, unit.name(), unit.synchronization())));
         entityManagerBeans.putAll(beans);
     }
 
@@ -107,16 +113,77 @@ public class JpaExtension implements Ext
                 }).collect(toMap(PersistenceUnitInfo::getPersistenceUnitName, identity()));
 
         entityManagerBeans.forEach((k, e) -> {
-            final PersistenceUnitInfo info = infoIndex.get(k);
+            PersistenceUnitInfo info = infoIndex.get(k.unitName);
             if (info == null) {
+                info = tryCreateDefaultPersistenceUnit(k.unitName, bm);
+            }
+            if (info == null) { // not valid
                 adv.addDeploymentProblem(new IllegalArgumentException("Didn't find any PersistenceUnitInfoBuilder for " + k));
             } else {
-                e.init(bm, info);
+                e.init(info);
             }
         });
     }
 
-    public EntityManagerContext getEntityManagerContext() {
+    private PersistenceUnitInfo tryCreateDefaultPersistenceUnit(final String unitName, final BeanManager bm) {
+        final Set<Bean<?>> beans = bm.getBeans(DataSource.class);
+        final Bean<?> bean = bm.resolve(beans);
+        if (bean == null || !bm.isNormalScope(bean.getScope())) {
+            return null;
+        }
+
+        final DataSource ds = DataSource.class.cast(bm.getReference(bean, DataSource.class, bm.createCreationalContext(null)));
+
+        final PersistenceUnitInfoBuilder builder = new PersistenceUnitInfoBuilder()
+                .setManagedClassNames(jpaClasses)
+                .setExcludeUnlistedClasses(true)
+                .setUnitName(unitName)
+                .setDataSource(ds);
+
+        // only not portable part, we could make it optional
+        final ServletContext sc = ServletContext.class.cast(bm.getReference(bm.resolve(bm.getBeans(ServletContext.class)), ServletContext.class, bm.createCreationalContext(null)));
+        final Microwave.Builder config = Microwave.Builder.class.cast(sc.getAttribute("microwave.configuration"));
+        if (config != null) {
+            ofNullable(config.getProperties()).ifPresent(p -> p.stringPropertyNames().stream()
+                    .filter(k -> k.startsWith("jpa.property."))
+                    .forEach(k -> builder.addProperty(k.substring("jpa.property.".length()), p.getProperty(k))));
+        }
+
+        return builder.toInfo();
+    }
+
+    EntityManagerContext getEntityManagerContext() {
         return entityManagerContext;
     }
+
+    private static class UnitKey {
+        private final String unitName;
+        private final SynchronizationType synchronizationType;
+        private final int hash;
+
+        private UnitKey(final String unitName, final SynchronizationType synchronizationType) {
+            this.unitName = unitName;
+            this.synchronizationType = synchronizationType;
+            this.hash = 31 * unitName.hashCode() + synchronizationType.hashCode();
+        }
+
+        @Override
+        public boolean equals(final Object o) {
+            if (this == o) {
+                return true;
+            }
+            if (o == null || getClass() != o.getClass()) {
+                return false;
+            }
+
+            final UnitKey unitKey = UnitKey.class.cast(o);
+            return unitName.equals(unitKey.unitName) && synchronizationType == unitKey.synchronizationType;
+
+        }
+
+        @Override
+        public int hashCode() {
+            return hash;
+        }
+    }
 }

Modified: openwebbeans/microwave/trunk/microwave-jpa/src/test/java/org/apache/microwave/jpa/internal/JpaExtensionTest.java
URL: http://svn.apache.org/viewvc/openwebbeans/microwave/trunk/microwave-jpa/src/test/java/org/apache/microwave/jpa/internal/JpaExtensionTest.java?rev=1766412&r1=1766411&r2=1766412&view=diff
==============================================================================
--- openwebbeans/microwave/trunk/microwave-jpa/src/test/java/org/apache/microwave/jpa/internal/JpaExtensionTest.java (original)
+++ openwebbeans/microwave/trunk/microwave-jpa/src/test/java/org/apache/microwave/jpa/internal/JpaExtensionTest.java Mon Oct 24 14:29:01 2016
@@ -18,6 +18,7 @@
  */
 package org.apache.microwave.jpa.internal;
 
+import org.apache.microwave.Microwave;
 import org.apache.microwave.junit.MicrowaveRule;
 import org.app.JPADao;
 import org.junit.Rule;
@@ -29,7 +30,12 @@ import static org.junit.Assert.assertEqu
 
 public class JpaExtensionTest {
     @Rule
-    public final MicrowaveRule rule = new MicrowaveRule().inject(this);
+    public final MicrowaveRule rule = new MicrowaveRule(
+            new Microwave.Builder().randomHttpPort()
+                    .property("jpa.property.openjpa.RuntimeUnenhancedClasses", "supported")
+                    .property("jpa.property.openjpa.jdbc.SynchronizeMappings", "buildSchema"),
+            "")
+            .inject(this);
 
     @Inject
     private JPADao service;

Modified: openwebbeans/microwave/trunk/microwave-jpa/src/test/java/org/app/JPADao.java
URL: http://svn.apache.org/viewvc/openwebbeans/microwave/trunk/microwave-jpa/src/test/java/org/app/JPADao.java?rev=1766412&r1=1766411&r2=1766412&view=diff
==============================================================================
--- openwebbeans/microwave/trunk/microwave-jpa/src/test/java/org/app/JPADao.java (original)
+++ openwebbeans/microwave/trunk/microwave-jpa/src/test/java/org/app/JPADao.java Mon Oct 24 14:29:01 2016
@@ -20,7 +20,6 @@ package org.app;
 
 import org.apache.commons.dbcp2.BasicDataSource;
 import org.apache.microwave.jpa.api.Jpa;
-import org.apache.microwave.jpa.api.PersistenceUnitInfoBuilder;
 import org.apache.microwave.jpa.api.Unit;
 import org.h2.Driver;
 
@@ -55,23 +54,13 @@ public class JPADao {
     @ApplicationScoped
     public static class JpaConfig {
         @Produces
+        @ApplicationScoped
         public DataSource dataSource() {
             final BasicDataSource source = new BasicDataSource();
             source.setDriver(new Driver());
             source.setUrl("jdbc:h2:mem:jpaextensiontest");
             return source;
         }
-
-        @Produces
-        public PersistenceUnitInfoBuilder unit(final DataSource ds) {
-            return new PersistenceUnitInfoBuilder()
-                    .setUnitName("test")
-                    .setDataSource(ds)
-                    .setExcludeUnlistedClasses(true)
-                    .addManagedClazz(User.class)
-                    .addProperty("openjpa.RuntimeUnenhancedClasses", "supported")
-                    .addProperty("openjpa.jdbc.SynchronizeMappings", "buildSchema");
-        }
     }
 
     @Entity