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 20:31:27 UTC
svn commit: r1766442 - in /openwebbeans/microwave/trunk/microwave-jpa:
README.adoc
src/main/java/org/apache/microwave/jpa/internal/EntityManagerBean.java
src/main/java/org/apache/microwave/jpa/internal/JpaExtension.java
Author: rmannibucau
Date: Mon Oct 24 20:31:27 2016
New Revision: 1766442
URL: http://svn.apache.org/viewvc?rev=1766442&view=rev
Log:
global jpa properties configuration + cdi/bval link with jpa
Modified:
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
Modified: openwebbeans/microwave/trunk/microwave-jpa/README.adoc
URL: http://svn.apache.org/viewvc/openwebbeans/microwave/trunk/microwave-jpa/README.adoc?rev=1766442&r1=1766441&r2=1766442&view=diff
==============================================================================
--- openwebbeans/microwave/trunk/microwave-jpa/README.adoc (original)
+++ openwebbeans/microwave/trunk/microwave-jpa/README.adoc Mon Oct 24 20:31:27 2016
@@ -43,6 +43,8 @@ public class JpaConfig {
}
----
+NOTE: it is recommanded to ensure the `DataSource` is normal-scoped to not get surprises in term of behavior.
+
Finally you can inject your entity manager using `@Unit`. Ensure to
decorate with `@Jpa` a class/method before using the entity manager to activate
the jpa CDI context:
@@ -93,3 +95,8 @@ public class JPADao {
}
}
----
+
+== Integration with Bean Validation
+
+The extension will try to find a `ValidatorFactory` in CDI context and will provide ir to the JPA provider
+if the `ValidationMode` is not `NONE` and a `Bean<ValidatorFactory>` exists.
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=1766442&r1=1766441&r2=1766442&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 20:31:27 2016
@@ -5,11 +5,13 @@ 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;
import javax.persistence.EntityManagerFactory;
import javax.persistence.SynchronizationType;
+import javax.persistence.ValidationMode;
import javax.persistence.spi.PersistenceProvider;
import javax.persistence.spi.PersistenceUnitInfo;
import java.lang.annotation.Annotation;
@@ -22,6 +24,7 @@ import java.util.function.Supplier;
import static java.util.Arrays.asList;
import static java.util.Collections.emptySet;
import static java.util.Collections.singletonList;
+import static java.util.Optional.ofNullable;
@Vetoed
public class EntityManagerBean implements Bean<EntityManager>, PassivationCapable {
@@ -39,7 +42,7 @@ public class EntityManagerBean implement
this.synchronization = synchronization;
}
- void init(final PersistenceUnitInfo info) {
+ void init(final PersistenceUnitInfo info, final BeanManager bm) {
final PersistenceProvider provider;
try {
provider = PersistenceProvider.class.cast(
@@ -48,11 +51,27 @@ public class EntityManagerBean implement
throw new IllegalArgumentException("Bad provider: " + info.getPersistenceProviderClassName());
}
final EntityManagerFactory factory = provider.createContainerEntityManagerFactory(info, new HashMap() {{
- // TODO: bval + CDI integ
+ put("javax.persistence.bean.manager", bm);
+ if (ValidationMode.NONE != info.getValidationMode()) {
+ ofNullable(findValidatorFactory(bm)).ifPresent(factory -> put("javax.persistence.validation.factory", factory));
+ }
}});
instanceFactory = synchronization == SynchronizationType.SYNCHRONIZED ? factory::createEntityManager : () -> factory.createEntityManager(synchronization);
}
+ private Object findValidatorFactory(final BeanManager bm) {
+ try {
+ final Class<?> type = Thread.currentThread().getContextClassLoader().loadClass("javax.validation.ValidatorFactory");
+ final Bean<?> bean = bm.resolve(bm.getBeans(type));
+ if (bean == null || !bm.isNormalScope(bean.getScope())) {
+ return null;
+ }
+ return bm.getReference(bean, type, bm.createCreationalContext(null));
+ } catch (final NoClassDefFoundError | ClassNotFoundException e) {
+ return null;
+ }
+ }
+
@Override
public EntityManager create(final CreationalContext<EntityManager> context) {
final EntityManager entityManager = instanceFactory.get();
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=1766442&r1=1766441&r2=1766442&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 20:31:27 2016
@@ -102,6 +102,20 @@ public class JpaExtension implements Ext
}
void initBeans(@Observes final AfterDeploymentValidation adv, final BeanManager bm) {
+ if (entityManagerBeans.isEmpty()) {
+ return;
+ }
+
+ // only not portable part is this config read, could be 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"));
+ final Map<String, String> props = new HashMap<>();
+ if (config != null) {
+ ofNullable(config.getProperties()).ifPresent(p -> p.stringPropertyNames().stream()
+ .filter(k -> k.startsWith("jpa.property."))
+ .forEach(k -> props.put(k.substring("jpa.property.".length()), p.getProperty(k))));
+ }
+
final Map<String, PersistenceUnitInfo> infoIndex = unitBuilders.stream()
.map(bean -> {
final CreationalContext<?> cc = bm.createCreationalContext(null);
@@ -114,6 +128,7 @@ public class JpaExtension implements Ext
if (builder.getManagedClasses().isEmpty()) {
builder.setManagedClassNames(jpaClasses).setExcludeUnlistedClasses(true);
}
+ props.forEach(builder::addProperty);
return builder.toInfo();
} finally {
cc.release();
@@ -123,17 +138,17 @@ public class JpaExtension implements Ext
entityManagerBeans.forEach((k, e) -> {
PersistenceUnitInfo info = infoIndex.get(k.unitName);
if (info == null) {
- info = tryCreateDefaultPersistenceUnit(k.unitName, bm);
+ info = tryCreateDefaultPersistenceUnit(k.unitName, bm, props);
}
if (info == null) { // not valid
adv.addDeploymentProblem(new IllegalArgumentException("Didn't find any PersistenceUnitInfoBuilder for " + k));
} else {
- e.init(info);
+ e.init(info, bm);
}
});
}
- private PersistenceUnitInfo tryCreateDefaultPersistenceUnit(final String unitName, final BeanManager bm) {
+ private PersistenceUnitInfo tryCreateDefaultPersistenceUnit(final String unitName, final BeanManager bm, final Map<String, String> props) {
final Set<Bean<?>> beans = bm.getBeans(DataSource.class);
final Bean<?> bean = bm.resolve(beans);
if (bean == null || !bm.isNormalScope(bean.getScope())) {
@@ -148,14 +163,7 @@ public class JpaExtension implements Ext
.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))));
- }
+ props.forEach(builder::addProperty);
return builder.toInfo();
}