Seam SVN: r13670 - in modules/persistence/trunk: impl/src/main/java/org/jboss/seam/persistence and 1 other directory.
by seam-commits@lists.jboss.org
Author: swd847
Date: 2010-08-31 04:13:33 -0400 (Tue, 31 Aug 2010)
New Revision: 13670
Added:
modules/persistence/trunk/api/src/main/java/org/jboss/seam/persistence/SeamPersistenceProvider.java
Removed:
modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/SeamPersistenceProvider.java
Log:
move SeamPersistenceProvider to API
Copied: modules/persistence/trunk/api/src/main/java/org/jboss/seam/persistence/SeamPersistenceProvider.java (from rev 13669, modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/SeamPersistenceProvider.java)
===================================================================
--- modules/persistence/trunk/api/src/main/java/org/jboss/seam/persistence/SeamPersistenceProvider.java (rev 0)
+++ modules/persistence/trunk/api/src/main/java/org/jboss/seam/persistence/SeamPersistenceProvider.java 2010-08-31 08:13:33 UTC (rev 13670)
@@ -0,0 +1,127 @@
+package org.jboss.seam.persistence;
+
+import java.lang.reflect.Method;
+import java.util.Set;
+
+import javax.persistence.EntityManager;
+import javax.transaction.Synchronization;
+
+import org.jboss.seam.persistence.transaction.FlushModeType;
+
+/**
+ * The interface can be implemented to provide extra functionality to a seam
+ * managed persistence context.
+ *
+ * seam-persistence contains a default implementation and a hinbernate based
+ * implementation.
+ *
+ * @author Stuart Douglas
+ *
+ */
+public interface SeamPersistenceProvider
+{
+
+ /**
+ * sets the flush mode
+ */
+ public abstract void setFlushMode(EntityManager entityManager, FlushModeType type);
+
+ /**
+ * Should return true if this is the correct persistence provider for the
+ * given entity manager factory
+ *
+ */
+ public abstract boolean isCorrectProvider(EntityManager em);
+
+ /**
+ * Set the flush mode to manual-only flushing. Called when an atomic
+ * persistence context is required.
+ */
+ public abstract void setFlushModeManual(EntityManager entityManager);
+
+ /**
+ * <p>
+ * Gets the FlushMode the persistence contexts should use during rendering
+ * </p>
+ * <p>
+ * Ideally, this should be MANUAL since changes should never flush to the
+ * database while in render response and the cost of a dirty check can be
+ * avoided. However, since the MANUAL mode is not officially part of the JPA
+ * specification, the default implementation will perform no operation.
+ * </p>
+ */
+ public abstract FlushModeType getRenderFlushMode();
+
+ /**
+ * Does the persistence context have unflushed changes? If it does not,
+ * persistence context replication can be optimized.
+ *
+ * @return true to indicate that there are unflushed changes
+ */
+ public abstract boolean isDirty(EntityManager entityManager);
+
+ /**
+ * Get the value of the entity identifier attribute.
+ *
+ * @param bean a managed entity instance
+ */
+ public abstract Object getId(Object bean, EntityManager entityManager);
+
+ /**
+ * Get the name of the entity
+ *
+ * @param bean
+ * @param entityManager
+ *
+ * @throws IllegalArgumentException if the passed object is not an entity
+ */
+ public abstract String getName(Object bean, EntityManager entityManager) throws IllegalArgumentException;
+
+ /**
+ * Get the value of the entity version attribute.
+ *
+ * @param bean a managed entity instance
+ */
+ public abstract Object getVersion(Object bean, EntityManager entityManager);
+
+ public abstract void checkVersion(Object bean, EntityManager entityManager, Object oldVersion, Object version);
+
+ /**
+ * Enable a Filter. This is here just especially for Hibernate, since we well
+ * know that other products don't have such cool features.
+ *
+ * public void enableFilter(Filter filter, EntityManager entityManager) {
+ * throw new UnsupportedOperationException("Use of filters requires Hibernate as the persistence provider. Please use Hibernate or remove the filters configuration."
+ * ); }
+ */
+ /**
+ * Register a Synchronization with the current transaction.
+ */
+ public abstract boolean registerSynchronization(Synchronization sync, EntityManager entityManager);
+
+ /**
+ * Wrap the delegate before returning it to the application
+ */
+ public abstract Object proxyDelegate(Object delegate);
+
+ public abstract EntityManager proxyEntityManager(EntityManager entityManager);
+
+ public abstract Set<Class<?>> getAdditionalEntityManagerInterfaces();
+
+ /**
+ * Returns the class of an entity bean instance
+ *
+ * @param bean The entity bean instance
+ * @return The class of the entity bean
+ */
+ public abstract Class<?> getBeanClass(Object bean);
+
+ public abstract Method getPostLoadMethod(Object bean, EntityManager entityManager);
+
+ public abstract Method getPrePersistMethod(Object bean, EntityManager entityManager);
+
+ public abstract Method getPreUpdateMethod(Object bean, EntityManager entityManager);
+
+ public abstract Method getPreRemoveMethod(Object bean, EntityManager entityManager);
+
+}
\ No newline at end of file
Deleted: modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/SeamPersistenceProvider.java
===================================================================
--- modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/SeamPersistenceProvider.java 2010-08-30 23:56:10 UTC (rev 13669)
+++ modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/SeamPersistenceProvider.java 2010-08-31 08:13:33 UTC (rev 13670)
@@ -1,127 +0,0 @@
-package org.jboss.seam.persistence;
-
-import java.lang.reflect.Method;
-import java.util.Set;
-
-import javax.persistence.EntityManager;
-import javax.transaction.Synchronization;
-
-import org.jboss.seam.persistence.transaction.FlushModeType;
-
-/**
- * The interface can be implemented to provide extra functionality to a seam
- * managed persistence context.
- *
- * seam-persistence contains a default implementation and a hinbernate based
- * implementation.
- *
- * @author Stuart Douglas
- *
- */
-public interface SeamPersistenceProvider
-{
-
- /**
- * sets the flush mode
- */
- public abstract void setFlushMode(EntityManager entityManager, FlushModeType type);
-
- /**
- * Should return true if this is the correct persistence provider for the
- * given entity manager factory
- *
- */
- public abstract boolean isCorrectProvider(EntityManager em);
-
- /**
- * Set the flush mode to manual-only flushing. Called when an atomic
- * persistence context is required.
- */
- public abstract void setFlushModeManual(EntityManager entityManager);
-
- /**
- * <p>
- * Gets the FlushMode the persistence contexts should use during rendering
- * </p>
- * <p>
- * Ideally, this should be MANUAL since changes should never flush to the
- * database while in render response and the cost of a dirty check can be
- * avoided. However, since the MANUAL mode is not officially part of the JPA
- * specification, the default implementation will perform no operation.
- * </p>
- */
- public abstract FlushModeType getRenderFlushMode();
-
- /**
- * Does the persistence context have unflushed changes? If it does not,
- * persistence context replication can be optimized.
- *
- * @return true to indicate that there are unflushed changes
- */
- public abstract boolean isDirty(EntityManager entityManager);
-
- /**
- * Get the value of the entity identifier attribute.
- *
- * @param bean a managed entity instance
- */
- public abstract Object getId(Object bean, EntityManager entityManager);
-
- /**
- * Get the name of the entity
- *
- * @param bean
- * @param entityManager
- *
- * @throws IllegalArgumentException if the passed object is not an entity
- */
- public abstract String getName(Object bean, EntityManager entityManager) throws IllegalArgumentException;
-
- /**
- * Get the value of the entity version attribute.
- *
- * @param bean a managed entity instance
- */
- public abstract Object getVersion(Object bean, EntityManager entityManager);
-
- public abstract void checkVersion(Object bean, EntityManager entityManager, Object oldVersion, Object version);
-
- /**
- * Enable a Filter. This is here just especially for Hibernate, since we well
- * know that other products don't have such cool features.
- *
- * public void enableFilter(Filter filter, EntityManager entityManager) {
- * throw new UnsupportedOperationException("Use of filters requires Hibernate as the persistence provider. Please use Hibernate or remove the filters configuration."
- * ); }
- */
- /**
- * Register a Synchronization with the current transaction.
- */
- public abstract boolean registerSynchronization(Synchronization sync, EntityManager entityManager);
-
- /**
- * Wrap the delegate before returning it to the application
- */
- public abstract Object proxyDelegate(Object delegate);
-
- public abstract EntityManager proxyEntityManager(EntityManager entityManager);
-
- public abstract Set<Class<?>> getAdditionalEntityManagerInterfaces();
-
- /**
- * Returns the class of an entity bean instance
- *
- * @param bean The entity bean instance
- * @return The class of the entity bean
- */
- public abstract Class<?> getBeanClass(Object bean);
-
- public abstract Method getPostLoadMethod(Object bean, EntityManager entityManager);
-
- public abstract Method getPrePersistMethod(Object bean, EntityManager entityManager);
-
- public abstract Method getPreUpdateMethod(Object bean, EntityManager entityManager);
-
- public abstract Method getPreRemoveMethod(Object bean, EntityManager entityManager);
-
-}
\ No newline at end of file
13 years, 9 months
Seam SVN: r13669 - in modules/persistence/trunk/impl/src: main/java/org/jboss/seam/persistence/transaction and 3 other directories.
by seam-commits@lists.jboss.org
Author: swd847
Date: 2010-08-30 19:56:10 -0400 (Mon, 30 Aug 2010)
New Revision: 13669
Added:
modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/DefaultPersistenceProvider.java
modules/persistence/trunk/impl/src/main/resources/META-INF/services/org.jboss.seam.persistence.SeamPersistenceProvider
Modified:
modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/HibernatePersistenceProvider.java
modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/ManagedPersistenceContext.java
modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/ManagedPersistenceContextBeanLifecycle.java
modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/ManagedPersistenceContextExtension.java
modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/ManagedPersistenceContextProxyHandler.java
modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/PersistenceContextProxyHandler.java
modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/PersistenceContextsImpl.java
modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/SeamPersistenceProvider.java
modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/transaction/EntityTransaction.java
modules/persistence/trunk/impl/src/test/java/org/jboss/seam/persistence/test/HibernateSearchTest.java
modules/persistence/trunk/impl/src/test/java/org/jboss/seam/persistence/test/ManagedPersistenceContextFlushModeTest.java
modules/persistence/trunk/impl/src/test/java/org/jboss/seam/persistence/transactions/test/TransactionAttributeInterceptorTest.java
modules/persistence/trunk/impl/src/test/java/org/jboss/seam/persistence/transactions/test/TransactionInterceptorTest.java
modules/persistence/trunk/impl/src/test/java/org/jboss/seam/persistence/transactions/test/TransactionScopedTest.java
modules/persistence/trunk/impl/src/test/java/org/jboss/seam/persistence/transactions/test/UserTransactionTest.java
Log:
change persistence providers to use a ServiceLoader approach
Copied: modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/DefaultPersistenceProvider.java (from rev 13665, modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/SeamPersistenceProvider.java)
===================================================================
--- modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/DefaultPersistenceProvider.java (rev 0)
+++ modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/DefaultPersistenceProvider.java 2010-08-30 23:56:10 UTC (rev 13669)
@@ -0,0 +1,219 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc., and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.seam.persistence;
+
+import java.lang.reflect.Method;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.persistence.EntityManager;
+import javax.persistence.OptimisticLockException;
+import javax.transaction.Synchronization;
+
+import org.jboss.seam.persistence.transaction.FlushModeType;
+import org.jboss.weld.extensions.defaultbean.DefaultBean;
+
+/**
+ * Abstraction layer for persistence providers (JPA implementations). This class
+ * provides a working base implementation that can be optimized for performance
+ * and non-standardized features by extending and overriding the methods.
+ *
+ * The methods on this class are a great todo list for the next rev of the JPA
+ * spec ;-)
+ *
+ * @author Gavin King
+ * @author Pete Muir
+ * @author Stuart Douglas
+ *
+ */
+@DefaultBean(type = DefaultPersistenceProvider.class)
+public class DefaultPersistenceProvider implements SeamPersistenceProvider
+{
+ public enum Feature
+ {
+ /**
+ * Identifies whether this JPA provider supports using a wildcard as the
+ * subject of a count query.
+ *
+ * <p>
+ * Here's a count query that uses a wildcard as the subject.
+ * </p>
+ *
+ * <pre>
+ * select count(*) from Vehicle v
+ * </pre>
+ * <p>
+ * Per the JPA 1.0 spec, using a wildcard as a subject of a count query is
+ * not permitted. Instead, the subject must be the entity or the alias, as
+ * in this count query:
+ * </p>
+ *
+ * <pre>
+ * select count(v) from Vehicle v
+ * </pre>
+ * <p>
+ * Hibernate supports the wildcard syntax as an vendor extension.
+ * Furthermore, Hibernate produces an invalid SQL query when using the
+ * compliant subject if the entity has a composite primary key. Therefore,
+ * we prefer to use the wildcard syntax if it is supported.
+ * </p>
+ */
+ WILDCARD_AS_COUNT_QUERY_SUBJECT
+ }
+
+ protected Set<Feature> featureSet = new HashSet<Feature>();
+
+ /**
+ * Indicate whether this JPA provider supports the feature defined by the
+ * provided Feature enum value.
+ */
+ public boolean supportsFeature(Feature feature)
+ {
+ return featureSet.contains(feature);
+ }
+
+ public boolean isCorrectProvider(EntityManager em)
+ {
+ return true;
+ }
+
+ public void setFlushMode(EntityManager entityManager, FlushModeType type)
+ {
+ switch (type)
+ {
+ case AUTO:
+ entityManager.setFlushMode(javax.persistence.FlushModeType.AUTO);
+ break;
+ case COMMIT:
+ entityManager.setFlushMode(javax.persistence.FlushModeType.COMMIT);
+ break;
+ case MANUAL:
+ setFlushModeManual(entityManager);
+ break;
+ default:
+ throw new RuntimeException("Unkown flush mode: " + type);
+ }
+ }
+
+ public void setFlushModeManual(EntityManager entityManager)
+ {
+ throw new UnsupportedOperationException("Use of FlushMode.MANUAL requires Hibernate as the persistence provider. Please use Hibernate, a custom persistenceProvider, or remove the MANUAL flush mode setting.");
+ }
+
+ public FlushModeType getRenderFlushMode()
+ {
+ return FlushModeType.COMMIT;
+ }
+
+ public boolean isDirty(EntityManager entityManager)
+ {
+ return true; // best we can do!
+ }
+
+ public Object getId(Object bean, EntityManager entityManager)
+ {
+ // return Entity.forBean(bean).getIdentifier(bean);
+ return null;
+ }
+
+ public String getName(Object bean, EntityManager entityManager) throws IllegalArgumentException
+ {
+ return null;
+ // return Entity.forBean(bean).getName();
+ }
+
+ public Object getVersion(Object bean, EntityManager entityManager)
+ {
+ return null;
+ // return Entity.forBean(bean).getVersion(bean);
+ }
+
+ public void checkVersion(Object bean, EntityManager entityManager, Object oldVersion, Object version)
+ {
+ boolean equal;
+ if (oldVersion instanceof Date)
+ {
+ equal = ((Date) oldVersion).getTime() == ((Date) version).getTime();
+ }
+ else
+ {
+ equal = oldVersion.equals(version);
+ }
+ if (!equal)
+ {
+ throw new OptimisticLockException("Current database version number does not match passivated version number");
+ }
+ }
+
+ public boolean registerSynchronization(Synchronization sync, EntityManager entityManager)
+ {
+ return false; // best we can do!
+ }
+
+ public Object proxyDelegate(Object delegate)
+ {
+ return delegate;
+ }
+
+ public EntityManager proxyEntityManager(EntityManager entityManager)
+ {
+ return entityManager;
+ }
+
+ public Set<Class<?>> getAdditionalEntityManagerInterfaces()
+ {
+ return Collections.emptySet();
+ }
+
+ public Class<?> getBeanClass(Object bean)
+ {
+ return null;
+ // return Entity.forBean(bean).getBeanClass();
+ }
+
+ public Method getPostLoadMethod(Object bean, EntityManager entityManager)
+ {
+ return null;
+ // return Entity.forBean(bean).getPostLoadMethod();
+ }
+
+ public Method getPrePersistMethod(Object bean, EntityManager entityManager)
+ {
+ return null;
+ // return Entity.forBean(bean).getPrePersistMethod();
+ }
+
+ public Method getPreUpdateMethod(Object bean, EntityManager entityManager)
+ {
+ return null;
+ // return Entity.forBean(bean).getPreUpdateMethod();
+ }
+
+ public Method getPreRemoveMethod(Object bean, EntityManager entityManager)
+ {
+ return null;
+ // return Entity.forBean(bean).getPreRemoveMethod();
+ }
+
+}
Modified: modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/HibernatePersistenceProvider.java
===================================================================
--- modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/HibernatePersistenceProvider.java 2010-08-30 22:33:36 UTC (rev 13668)
+++ modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/HibernatePersistenceProvider.java 2010-08-30 23:56:10 UTC (rev 13669)
@@ -4,7 +4,6 @@
import java.util.Collections;
import java.util.Set;
-import javax.enterprise.inject.Instance;
import javax.inject.Inject;
import javax.persistence.EntityManager;
import javax.transaction.Synchronization;
@@ -27,12 +26,9 @@
* @author Stuart Douglas
*
*/
-public class HibernatePersistenceProvider extends SeamPersistenceProvider
+public class HibernatePersistenceProvider extends DefaultPersistenceProvider
{
- @Inject
- Instance<PersistenceContextsImpl> persistenceContexts;
-
private static Logger log = LoggerFactory.getLogger(HibernatePersistenceProvider.class);
private static Method FULL_TEXT_SESSION_CONSTRUCTOR;
private static Method FULL_TEXT_ENTITYMANAGER_CONSTRUCTOR;
@@ -91,6 +87,12 @@
}
@Override
+ public boolean isCorrectProvider(EntityManager em)
+ {
+ return em.getDelegate() instanceof Session;
+ }
+
+ @Override
public void setFlushModeManual(EntityManager entityManager)
{
try
@@ -104,9 +106,9 @@
}
@Override
- public void setRenderFlushMode()
+ public FlushModeType getRenderFlushMode()
{
- persistenceContexts.get().changeFlushMode(FlushModeType.MANUAL, true);
+ return FlushModeType.MANUAL;
}
@Override
Modified: modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/ManagedPersistenceContext.java
===================================================================
--- modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/ManagedPersistenceContext.java 2010-08-30 22:33:36 UTC (rev 13668)
+++ modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/ManagedPersistenceContext.java 2010-08-30 23:56:10 UTC (rev 13669)
@@ -41,4 +41,6 @@
public Class<?> getBeanType();
+ public SeamPersistenceProvider getProvider();
+
}
Modified: modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/ManagedPersistenceContextBeanLifecycle.java
===================================================================
--- modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/ManagedPersistenceContextBeanLifecycle.java 2010-08-30 22:33:36 UTC (rev 13668)
+++ modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/ManagedPersistenceContextBeanLifecycle.java 2010-08-30 23:56:10 UTC (rev 13669)
@@ -26,6 +26,8 @@
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
+import java.util.ArrayList;
+import java.util.List;
import java.util.Set;
import javax.enterprise.context.ContextNotActiveException;
@@ -54,19 +56,22 @@
private final Constructor<?> proxyConstructor;
+ private SeamPersistenceProvider persistenceProvider;
+
private PersistenceContexts persistenceContexts;
- private SeamPersistenceProvider persistenceProvider;
-
protected final Annotation[] qualifiers;
protected final BeanManager manager;
private EntityManagerFactory emf;
- public ManagedPersistenceContextBeanLifecycle(Set<Annotation> qualifiers, ClassLoader loader, BeanManager manager, Set<Class<?>> additionalinterfaces)
+ private final List<SeamPersistenceProvider> persistenceProviders;
+
+ public ManagedPersistenceContextBeanLifecycle(Set<Annotation> qualifiers, ClassLoader loader, BeanManager manager, Set<Class<?>> additionalinterfaces, List<SeamPersistenceProvider> persistenceProviders)
{
this.manager = manager;
+ this.persistenceProviders = new ArrayList<SeamPersistenceProvider>(persistenceProviders);
Class<?>[] interfaces = new Class[additionalinterfaces.size() + 3];
int count = 0;
for (Class<?> i : additionalinterfaces)
@@ -92,6 +97,7 @@
{
this.qualifiers[i++] = a;
}
+
}
/**
@@ -103,10 +109,10 @@
{
EntityManagerFactory emf = getEntityManagerFactory();
EntityManager entityManager = emf.createEntityManager();
- entityManager = getPersistenceProvider().proxyEntityManager(entityManager);
- ManagedPersistenceContextProxyHandler handler = new ManagedPersistenceContextProxyHandler(entityManager, manager, bean.getQualifiers(), getPersistenceContexts());
+ entityManager = getPersistenceProvider(entityManager).proxyEntityManager(entityManager);
+ ManagedPersistenceContextProxyHandler handler = new ManagedPersistenceContextProxyHandler(entityManager, manager, bean.getQualifiers(), getPersistenceContexts(), getPersistenceProvider(entityManager));
EntityManager proxy = (EntityManager) proxyConstructor.newInstance(handler);
- getPersistenceProvider().setFlushMode(proxy, getPersistenceContexts().getFlushMode());
+ getPersistenceProvider(entityManager).setFlushMode(proxy, getPersistenceContexts().getFlushMode());
return proxy;
}
catch (Exception e)
@@ -144,17 +150,18 @@
return persistenceContexts;
}
- private SeamPersistenceProvider getPersistenceProvider()
+ private SeamPersistenceProvider getPersistenceProvider(EntityManager em)
{
if (persistenceProvider == null)
{
- Bean<SeamPersistenceProvider> bean = (Bean) manager.resolve(manager.getBeans(SeamPersistenceProvider.class, DefaultLiteral.INSTANCE));
- if (bean == null)
+ for (SeamPersistenceProvider i : persistenceProviders)
{
- throw new RuntimeException("Could not find SeamPersistenceProvider bean");
+ if (i.isCorrectProvider(em))
+ {
+ persistenceProvider = i;
+ break;
+ }
}
- CreationalContext<SeamPersistenceProvider> ctx = manager.createCreationalContext(bean);
- persistenceProvider = (SeamPersistenceProvider) manager.getReference(bean, SeamPersistenceProvider.class, ctx);
}
return persistenceProvider;
}
Modified: modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/ManagedPersistenceContextExtension.java
===================================================================
--- modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/ManagedPersistenceContextExtension.java 2010-08-30 22:33:36 UTC (rev 13668)
+++ modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/ManagedPersistenceContextExtension.java 2010-08-30 23:56:10 UTC (rev 13669)
@@ -22,7 +22,9 @@
package org.jboss.seam.persistence;
import java.lang.annotation.Annotation;
+import java.util.ArrayList;
import java.util.HashSet;
+import java.util.List;
import java.util.Set;
import javax.enterprise.context.Dependent;
@@ -33,6 +35,7 @@
import javax.enterprise.inject.spi.AnnotatedMethod;
import javax.enterprise.inject.spi.Bean;
import javax.enterprise.inject.spi.BeanManager;
+import javax.enterprise.inject.spi.BeforeBeanDiscovery;
import javax.enterprise.inject.spi.Extension;
import javax.enterprise.inject.spi.ProcessAnnotatedType;
import javax.persistence.EntityManager;
@@ -44,6 +47,7 @@
import org.jboss.weld.extensions.literal.AnyLiteral;
import org.jboss.weld.extensions.literal.ApplicationScopedLiteral;
import org.jboss.weld.extensions.literal.DefaultLiteral;
+import org.jboss.weld.extensions.util.service.ServiceLoader;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -60,8 +64,21 @@
Set<Bean<?>> beans = new HashSet<Bean<?>>();
+ List<SeamPersistenceProvider> persistenceProviders = new ArrayList<SeamPersistenceProvider>();
+
private static final Logger log = LoggerFactory.getLogger(ManagedPersistenceContextExtension.class);
+ public void beforeBeanDiscovery(@Observes BeforeBeanDiscovery event)
+ {
+ ServiceLoader<SeamPersistenceProvider> providers = ServiceLoader.load(SeamPersistenceProvider.class);
+ for (SeamPersistenceProvider i : providers)
+ {
+ persistenceProviders.add(i);
+ }
+ // this is always the last one considered
+ persistenceProviders.add(new DefaultPersistenceProvider());
+ }
+
/**
* loops through the fields on an AnnotatedType looking for a @PersistnceUnit
* producer field that is annotated {@link SeamManaged}. Then a corresponding
@@ -113,13 +130,12 @@
// This allows the user to manually configure an EntityManagerFactory
// and return it from a producer method
}
- // not look for SMPC's that are configured programatically via a producer
- // method the producer method has its scope changes to application scoped
- // this allows for programati config of the SMPC
+ // now look for SMPC's that are configured programatically via a producer
+ // method. This looks for both EMF's and SessionFactories
+ // The producer method has its scope changes to application scoped
+ // this allows for programatic config of the SMPC
for (AnnotatedMethod<? super T> m : event.getAnnotatedType().getMethods())
{
- // look for a seam managed persistence unit declaration on EE resource
- // producer fields
if (m.isAnnotationPresent(SeamManaged.class) && m.isAnnotationPresent(Produces.class) && EntityManagerFactory.class.isAssignableFrom(m.getJavaMember().getReturnType()))
{
if (modifiedType == null)
@@ -145,51 +161,34 @@
qualifiers.add(new DefaultLiteral());
}
qualifiers.add(AnyLiteral.INSTANCE);
- // we need to remove the scope, they are not nessesarily supported
- // on producer fields
+ // we need to change the scope to application scoped
modifiedType.removeFromMethod(m.getJavaMember(), scope);
modifiedType.addToMethod(m.getJavaMember(), ApplicationScopedLiteral.INSTANCE);
registerManagedPersistenceContext(qualifiers, scope, manager, event.getAnnotatedType().getJavaClass().getClassLoader());
}
- // now look for producer methods that produce an EntityManagerFactory.
- // This allows the user to manually configure an EntityManagerFactory
- // and return it from a producer method
}
if (modifiedType != null)
{
event.setAnnotatedType(modifiedType.create());
}
- // prevent the install of HibernatePersistenceProvider is hibernate is not
- // present
- if (event.getAnnotatedType().getJavaClass() == HibernatePersistenceProvider.class)
- {
- try
- {
- if (Thread.currentThread().getContextClassLoader() != null)
- {
- Thread.currentThread().getContextClassLoader().loadClass("org.hibernate.Session");
- }
- else
- {
- Class.forName("org.hibernate.Session");
- }
- }
- catch (ClassNotFoundException e)
- {
- event.veto();
- log.debug("Hibernate is not availbile", e);
- }
- }
}
- public void registerManagedPersistenceContext(Set<Annotation> qualifiers, Class<? extends Annotation> scope, BeanManager manager, ClassLoader loader)
+ private void registerManagedPersistenceContext(Set<Annotation> qualifiers, Class<? extends Annotation> scope, BeanManager manager, ClassLoader loader)
{
- // TODO: this is a massive hack. We need a much better way of doing this
- HibernatePersistenceProvider prov = new HibernatePersistenceProvider();
- Set<Class<?>> additionalInterfaces = prov.getAdditionalEntityManagerInterfaces();
+ // we need to add all additional interfaces from our
+ // SeamPersistenceProvider to the bean as at this stage we have no way of
+ // knowing which persistence provider is actually in use this only time
+ // that this may cause slightly odd behaviour is if two providers are on
+ // the class path, in which case the entity manager may be assignable to
+ // additional interfaces that it does not support.
+ Set<Class<?>> additionalInterfaces = new HashSet<Class<?>>();
+ for (SeamPersistenceProvider i : persistenceProviders)
+ {
+ additionalInterfaces.addAll(i.getAdditionalEntityManagerInterfaces());
+ }
// create the new bean to be registered later
- ManagedPersistenceContextBeanLifecycle lifecycle = new ManagedPersistenceContextBeanLifecycle(qualifiers, loader, manager, additionalInterfaces);
+ ManagedPersistenceContextBeanLifecycle lifecycle = new ManagedPersistenceContextBeanLifecycle(qualifiers, loader, manager, additionalInterfaces, persistenceProviders);
AnnotatedTypeBuilder<EntityManager> typeBuilder = new AnnotatedTypeBuilder().setJavaClass(EntityManager.class);
BeanBuilder<EntityManager> builder = new BeanBuilder<EntityManager>(manager).defineBeanFromAnnotatedType(typeBuilder.create());
builder.setQualifiers(qualifiers);
Modified: modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/ManagedPersistenceContextProxyHandler.java
===================================================================
--- modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/ManagedPersistenceContextProxyHandler.java 2010-08-30 22:33:36 UTC (rev 13668)
+++ modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/ManagedPersistenceContextProxyHandler.java 2010-08-30 23:56:10 UTC (rev 13669)
@@ -65,9 +65,9 @@
static final Logger log = LoggerFactory.getLogger(ManagedPersistenceContextProxyHandler.class);
- public ManagedPersistenceContextProxyHandler(EntityManager delegate, BeanManager beanManager, Set<Annotation> qualifiers, PersistenceContexts persistenceContexts)
+ public ManagedPersistenceContextProxyHandler(EntityManager delegate, BeanManager beanManager, Set<Annotation> qualifiers, PersistenceContexts persistenceContexts, SeamPersistenceProvider provider)
{
- super(delegate, beanManager, qualifiers);
+ super(delegate, beanManager, qualifiers, provider);
this.delegate = delegate;
this.userTransactionInstance = InstanceResolver.getInstance(SeamTransaction.class, beanManager, DefaultTransactionLiteral.INSTANCE);
this.persistenceContexts = persistenceContexts;
Modified: modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/PersistenceContextProxyHandler.java
===================================================================
--- modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/PersistenceContextProxyHandler.java 2010-08-30 22:33:36 UTC (rev 13668)
+++ modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/PersistenceContextProxyHandler.java 2010-08-30 23:56:10 UTC (rev 13669)
@@ -55,17 +55,20 @@
private final Instance<Expressions> expressionsInstance;
- private final Instance<SeamPersistenceProvider> persistenceProvider;
+ private final Instance<DefaultPersistenceProvider> persistenceProvider;
private final Set<Annotation> qualifiers;
+ private final SeamPersistenceProvider provider;
+
static final Logger log = LoggerFactory.getLogger(ManagedPersistenceContextProxyHandler.class);
- public PersistenceContextProxyHandler(EntityManager delegate, BeanManager beanManager, Set<Annotation> qualifiers)
+ public PersistenceContextProxyHandler(EntityManager delegate, BeanManager beanManager, Set<Annotation> qualifiers, SeamPersistenceProvider provider)
{
this.delegate = delegate;
+ this.provider = provider;
expressionsInstance = InstanceResolver.getInstance(Expressions.class, beanManager);
- persistenceProvider = InstanceResolver.getInstance(SeamPersistenceProvider.class, beanManager);
+ persistenceProvider = InstanceResolver.getInstance(DefaultPersistenceProvider.class, beanManager);
this.qualifiers = new HashSet<Annotation>(qualifiers);
}
@@ -88,6 +91,10 @@
{
return Collections.unmodifiableSet(qualifiers);
}
+ if ("getPersistenceProvider".equals(method.getName()) && method.getParameterTypes().length == 0)
+ {
+ return provider;
+ }
return method.invoke(delegate, args);
}
Modified: modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/PersistenceContextsImpl.java
===================================================================
--- modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/PersistenceContextsImpl.java 2010-08-30 22:33:36 UTC (rev 13668)
+++ modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/PersistenceContextsImpl.java 2010-08-30 23:56:10 UTC (rev 13669)
@@ -47,7 +47,7 @@
Instance<ManagedPersistenceContext> persistenceContexts;
@Inject
- Instance<SeamPersistenceProvider> persistenceProvider;
+ Instance<DefaultPersistenceProvider> persistenceProvider;
@Inject
public void create(FlushModeManager manager)
@@ -110,10 +110,10 @@
private void changeFlushModes()
{
-
for (ManagedPersistenceContext context : persistenceContexts)
{
if (set.contains(new PersistenceContextDefintition(context.getQualifiers(), context.getBeanType())))
+ {
try
{
context.changeFlushMode(flushMode);
@@ -124,14 +124,28 @@
// warning to the developer
log.warn(uoe.getMessage());
}
+ }
}
}
public void beforeRender()
{
- // some JPA providers may not support MANUAL flushing
- // defer the decision to the provider manager component
- persistenceProvider.get().setRenderFlushMode();
+ for (ManagedPersistenceContext context : persistenceContexts)
+ {
+ if (set.contains(new PersistenceContextDefintition(context.getQualifiers(), context.getBeanType())))
+ {
+ try
+ {
+ context.changeFlushMode(context.getProvider().getRenderFlushMode());
+ }
+ catch (UnsupportedOperationException uoe)
+ {
+ // we won't be nasty and throw and exception, but we'll log a
+ // warning to the developer
+ log.warn(uoe.getMessage());
+ }
+ }
+ }
}
public void afterRender()
Modified: modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/SeamPersistenceProvider.java
===================================================================
--- modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/SeamPersistenceProvider.java 2010-08-30 22:33:36 UTC (rev 13668)
+++ modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/SeamPersistenceProvider.java 2010-08-30 23:56:10 UTC (rev 13669)
@@ -1,137 +1,47 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright 2010, Red Hat, Inc., and individual contributors
- * by the @authors tag. See the copyright.txt in the distribution for a
- * full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
package org.jboss.seam.persistence;
import java.lang.reflect.Method;
-import java.util.Collections;
-import java.util.Date;
-import java.util.HashSet;
import java.util.Set;
import javax.persistence.EntityManager;
-import javax.persistence.OptimisticLockException;
-import javax.persistence.PersistenceContexts;
import javax.transaction.Synchronization;
import org.jboss.seam.persistence.transaction.FlushModeType;
-import org.jboss.weld.extensions.defaultbean.DefaultBean;
/**
- * Abstraction layer for persistence providers (JPA implementations). This class
- * provides a working base implementation that can be optimized for performance
- * and non-standardized features by extending and overriding the methods.
+ * The interface can be implemented to provide extra functionality to a seam
+ * managed persistence context.
*
- * The methods on this class are a great todo list for the next rev of the JPA
- * spec ;-)
+ * seam-persistence contains a default implementation and a hinbernate based
+ * implementation.
*
- * @author Gavin King
- * @author Pete Muir
* @author Stuart Douglas
*
*/
-@DefaultBean(type = SeamPersistenceProvider.class)
-public class SeamPersistenceProvider
+public interface SeamPersistenceProvider
{
- public enum Feature
- {
- /**
- * Identifies whether this JPA provider supports using a wildcard as the
- * subject of a count query.
- *
- * <p>
- * Here's a count query that uses a wildcard as the subject.
- * </p>
- *
- * <pre>
- * select count(*) from Vehicle v
- * </pre>
- * <p>
- * Per the JPA 1.0 spec, using a wildcard as a subject of a count query is
- * not permitted. Instead, the subject must be the entity or the alias, as
- * in this count query:
- * </p>
- *
- * <pre>
- * select count(v) from Vehicle v
- * </pre>
- * <p>
- * Hibernate supports the wildcard syntax as an vendor extension.
- * Furthermore, Hibernate produces an invalid SQL query when using the
- * compliant subject if the entity has a composite primary key. Therefore,
- * we prefer to use the wildcard syntax if it is supported.
- * </p>
- */
- WILDCARD_AS_COUNT_QUERY_SUBJECT
- }
- protected Set<Feature> featureSet = new HashSet<Feature>();
-
/**
- * Indicate whether this JPA provider supports the feature defined by the
- * provided Feature enum value.
+ * sets the flush mode
*/
- public boolean supportsFeature(Feature feature)
- {
- return featureSet.contains(feature);
- }
+ public abstract void setFlushMode(EntityManager entityManager, FlushModeType type);
/**
- * sets the flush mode
+ * Should return true if this is the correct persistence provider for the
+ * given entity manager factory
+ *
*/
- public void setFlushMode(EntityManager entityManager, FlushModeType type)
- {
- switch (type)
- {
- case AUTO:
- entityManager.setFlushMode(javax.persistence.FlushModeType.AUTO);
- break;
- case COMMIT:
- entityManager.setFlushMode(javax.persistence.FlushModeType.COMMIT);
- break;
- case MANUAL:
- setFlushModeManual(entityManager);
- break;
- default:
- throw new RuntimeException("Unkown flush mode: " + type);
- }
- }
+ public abstract boolean isCorrectProvider(EntityManager em);
/**
* Set the flush mode to manual-only flushing. Called when an atomic
* persistence context is required.
*/
- public void setFlushModeManual(EntityManager entityManager)
- {
- throw new UnsupportedOperationException("Use of FlushMode.MANUAL requires Hibernate as the persistence provider. Please use Hibernate, a custom persistenceProvider, or remove the MANUAL flush mode setting.");
- }
+ public abstract void setFlushModeManual(EntityManager entityManager);
/**
* <p>
- * Set the FlushMode the persistence contexts should use during rendering by
- * calling {@link PersistenceContexts#changeFlushMode(FlushModeType, true)}.
- * The actual changing of the flush mode is handled by the
- * {@link PersistenceContexts} instance. The boolean argument should be true
- * to indicate that this is a temporary change and that the old flush mode
- * should be restored after render.
+ * Gets the FlushMode the persistence contexts should use during rendering
* </p>
* <p>
* Ideally, this should be MANUAL since changes should never flush to the
@@ -140,10 +50,7 @@
* specification, the default implementation will perform no operation.
* </p>
*/
- public void setRenderFlushMode()
- {
- // no-op in default implementation
- }
+ public abstract FlushModeType getRenderFlushMode();
/**
* Does the persistence context have unflushed changes? If it does not,
@@ -151,21 +58,14 @@
*
* @return true to indicate that there are unflushed changes
*/
- public boolean isDirty(EntityManager entityManager)
- {
- return true; // best we can do!
- }
+ public abstract boolean isDirty(EntityManager entityManager);
/**
* Get the value of the entity identifier attribute.
*
* @param bean a managed entity instance
*/
- public Object getId(Object bean, EntityManager entityManager)
- {
- // return Entity.forBean(bean).getIdentifier(bean);
- return null;
- }
+ public abstract Object getId(Object bean, EntityManager entityManager);
/**
* Get the name of the entity
@@ -175,39 +75,16 @@
*
* @throws IllegalArgumentException if the passed object is not an entity
*/
- public String getName(Object bean, EntityManager entityManager) throws IllegalArgumentException
- {
- return null;
- // return Entity.forBean(bean).getName();
- }
+ public abstract String getName(Object bean, EntityManager entityManager) throws IllegalArgumentException;
/**
* Get the value of the entity version attribute.
*
* @param bean a managed entity instance
*/
- public Object getVersion(Object bean, EntityManager entityManager)
- {
- return null;
- // return Entity.forBean(bean).getVersion(bean);
- }
+ public abstract Object getVersion(Object bean, EntityManager entityManager);
- public void checkVersion(Object bean, EntityManager entityManager, Object oldVersion, Object version)
- {
- boolean equal;
- if (oldVersion instanceof Date)
- {
- equal = ((Date) oldVersion).getTime() == ((Date) version).getTime();
- }
- else
- {
- equal = oldVersion.equals(version);
- }
- if (!equal)
- {
- throw new OptimisticLockException("Current database version number does not match passivated version number");
- }
- }
+ public abstract void checkVersion(Object bean, EntityManager entityManager, Object oldVersion, Object version);
/**
* Enable a Filter. This is here just especially for Hibernate, since we well
@@ -220,28 +97,16 @@
/**
* Register a Synchronization with the current transaction.
*/
- public boolean registerSynchronization(Synchronization sync, EntityManager entityManager)
- {
- return false; // best we can do!
- }
+ public abstract boolean registerSynchronization(Synchronization sync, EntityManager entityManager);
/**
* Wrap the delegate before returning it to the application
*/
- public Object proxyDelegate(Object delegate)
- {
- return delegate;
- }
+ public abstract Object proxyDelegate(Object delegate);
- public EntityManager proxyEntityManager(EntityManager entityManager)
- {
- return entityManager;
- }
+ public abstract EntityManager proxyEntityManager(EntityManager entityManager);
- public Set<Class<?>> getAdditionalEntityManagerInterfaces()
- {
- return Collections.emptySet();
- }
+ public abstract Set<Class<?>> getAdditionalEntityManagerInterfaces();
/**
* Returns the class of an entity bean instance
@@ -249,34 +114,14 @@
* @param bean The entity bean instance
* @return The class of the entity bean
*/
- public Class getBeanClass(Object bean)
- {
- return null;
- // return Entity.forBean(bean).getBeanClass();
- }
+ public abstract Class<?> getBeanClass(Object bean);
- public Method getPostLoadMethod(Object bean, EntityManager entityManager)
- {
- return null;
- // return Entity.forBean(bean).getPostLoadMethod();
- }
+ public abstract Method getPostLoadMethod(Object bean, EntityManager entityManager);
- public Method getPrePersistMethod(Object bean, EntityManager entityManager)
- {
- return null;
- // return Entity.forBean(bean).getPrePersistMethod();
- }
+ public abstract Method getPrePersistMethod(Object bean, EntityManager entityManager);
- public Method getPreUpdateMethod(Object bean, EntityManager entityManager)
- {
- return null;
- // return Entity.forBean(bean).getPreUpdateMethod();
- }
+ public abstract Method getPreUpdateMethod(Object bean, EntityManager entityManager);
- public Method getPreRemoveMethod(Object bean, EntityManager entityManager)
- {
- return null;
- // return Entity.forBean(bean).getPreRemoveMethod();
- }
+ public abstract Method getPreRemoveMethod(Object bean, EntityManager entityManager);
-}
+}
\ No newline at end of file
Modified: modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/transaction/EntityTransaction.java
===================================================================
--- modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/transaction/EntityTransaction.java 2010-08-30 22:33:36 UTC (rev 13668)
+++ modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/transaction/EntityTransaction.java 2010-08-30 23:56:10 UTC (rev 13669)
@@ -33,7 +33,7 @@
import javax.transaction.Synchronization;
import javax.transaction.SystemException;
-import org.jboss.seam.persistence.SeamPersistenceProvider;
+import org.jboss.seam.persistence.DefaultPersistenceProvider;
import org.jboss.weld.extensions.core.Veto;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -58,7 +58,7 @@
private EntityManager entityManager;
@Inject
- private Instance<SeamPersistenceProvider> persistenceProvider;
+ private Instance<DefaultPersistenceProvider> persistenceProvider;
@Inject
public void init(Synchronizations sync)
Added: modules/persistence/trunk/impl/src/main/resources/META-INF/services/org.jboss.seam.persistence.SeamPersistenceProvider
===================================================================
--- modules/persistence/trunk/impl/src/main/resources/META-INF/services/org.jboss.seam.persistence.SeamPersistenceProvider (rev 0)
+++ modules/persistence/trunk/impl/src/main/resources/META-INF/services/org.jboss.seam.persistence.SeamPersistenceProvider 2010-08-30 23:56:10 UTC (rev 13669)
@@ -0,0 +1 @@
+org.jboss.seam.persistence.HibernatePersistenceProvider
\ No newline at end of file
Modified: modules/persistence/trunk/impl/src/test/java/org/jboss/seam/persistence/test/HibernateSearchTest.java
===================================================================
--- modules/persistence/trunk/impl/src/test/java/org/jboss/seam/persistence/test/HibernateSearchTest.java 2010-08-30 22:33:36 UTC (rev 13668)
+++ modules/persistence/trunk/impl/src/test/java/org/jboss/seam/persistence/test/HibernateSearchTest.java 2010-08-30 23:56:10 UTC (rev 13669)
@@ -73,6 +73,7 @@
war.addWebResource("META-INF/persistence-search.xml", "classes/META-INF/persistence.xml");
war.addWebResource(new ByteArrayAsset(new byte[0]), "beans.xml");
war.addWebResource("META-INF/services/javax.enterprise.inject.spi.Extension", "classes/META-INF/services/javax.enterprise.inject.spi.Extension");
+ war.addWebResource("META-INF/services/org.jboss.seam.persistence.SeamPersistenceProvider", "classes/META-INF/services/org.jboss.seam.persistence.SeamPersistenceProvider");
return war;
}
Modified: modules/persistence/trunk/impl/src/test/java/org/jboss/seam/persistence/test/ManagedPersistenceContextFlushModeTest.java
===================================================================
--- modules/persistence/trunk/impl/src/test/java/org/jboss/seam/persistence/test/ManagedPersistenceContextFlushModeTest.java 2010-08-30 22:33:36 UTC (rev 13668)
+++ modules/persistence/trunk/impl/src/test/java/org/jboss/seam/persistence/test/ManagedPersistenceContextFlushModeTest.java 2010-08-30 23:56:10 UTC (rev 13669)
@@ -73,6 +73,7 @@
war.addWebResource("META-INF/persistence.xml", "classes/META-INF/persistence.xml");
war.addWebResource(new ByteArrayAsset(new byte[0]), "beans.xml");
war.addWebResource("META-INF/services/javax.enterprise.inject.spi.Extension", "classes/META-INF/services/javax.enterprise.inject.spi.Extension");
+ war.addWebResource("META-INF/services/org.jboss.seam.persistence.SeamPersistenceProvider", "classes/META-INF/services/org.jboss.seam.persistence.SeamPersistenceProvider");
return war;
}
Modified: modules/persistence/trunk/impl/src/test/java/org/jboss/seam/persistence/transactions/test/TransactionAttributeInterceptorTest.java
===================================================================
--- modules/persistence/trunk/impl/src/test/java/org/jboss/seam/persistence/transactions/test/TransactionAttributeInterceptorTest.java 2010-08-30 22:33:36 UTC (rev 13668)
+++ modules/persistence/trunk/impl/src/test/java/org/jboss/seam/persistence/transactions/test/TransactionAttributeInterceptorTest.java 2010-08-30 23:56:10 UTC (rev 13669)
@@ -37,7 +37,7 @@
import org.jboss.arquillian.api.Deployment;
import org.jboss.arquillian.junit.Arquillian;
-import org.jboss.seam.persistence.SeamPersistenceProvider;
+import org.jboss.seam.persistence.DefaultPersistenceProvider;
import org.jboss.seam.persistence.transaction.DefaultTransaction;
import org.jboss.seam.persistence.transaction.SeamTransaction;
import org.jboss.seam.persistence.transaction.TransactionExtension;
@@ -76,7 +76,7 @@
war.addLibraries(MavenArtifactResolver.resolve(ArtifactNames.WELD_EXTENSIONS));
war.addLibraries(MavenArtifactResolver.resolve(ArtifactNames.SEAM_PERSISTENCE_API));
war.addPackage(TransactionExtension.class.getPackage());
- war.addPackage(SeamPersistenceProvider.class.getPackage());
+ war.addPackage(DefaultPersistenceProvider.class.getPackage());
war.addPackage(TransactionScopeExtension.class.getPackage());
war.addPackage(NamingUtils.class.getPackage());
war.addClasses(TransactionAttributeInterceptorTest.class, TransactionAttributeManagedBean.class, HelloService.class, Hotel.class, EntityManagerProvider.class, DontRollBackException.class);
Modified: modules/persistence/trunk/impl/src/test/java/org/jboss/seam/persistence/transactions/test/TransactionInterceptorTest.java
===================================================================
--- modules/persistence/trunk/impl/src/test/java/org/jboss/seam/persistence/transactions/test/TransactionInterceptorTest.java 2010-08-30 22:33:36 UTC (rev 13668)
+++ modules/persistence/trunk/impl/src/test/java/org/jboss/seam/persistence/transactions/test/TransactionInterceptorTest.java 2010-08-30 23:56:10 UTC (rev 13669)
@@ -37,7 +37,7 @@
import org.jboss.arquillian.api.Deployment;
import org.jboss.arquillian.junit.Arquillian;
-import org.jboss.seam.persistence.SeamPersistenceProvider;
+import org.jboss.seam.persistence.DefaultPersistenceProvider;
import org.jboss.seam.persistence.transaction.DefaultTransaction;
import org.jboss.seam.persistence.transaction.SeamTransaction;
import org.jboss.seam.persistence.transaction.TransactionExtension;
@@ -78,7 +78,7 @@
war.addPackage(TransactionExtension.class.getPackage());
war.addPackage(TransactionScopeExtension.class.getPackage());
war.addPackage(NamingUtils.class.getPackage());
- war.addPackage(SeamPersistenceProvider.class.getPackage());
+ war.addPackage(DefaultPersistenceProvider.class.getPackage());
war.addClasses(TransactionInterceptorTest.class, TransactionManagedBean.class, HelloService.class, Hotel.class, EntityManagerProvider.class, DontRollBackException.class);
war.addWebResource("META-INF/persistence.xml", "classes/META-INF/persistence.xml");
war.addWebResource(new ByteArrayAsset(("<beans><interceptors><class>" + TransactionInterceptor.class.getName() + "</class></interceptors></beans>").getBytes()), "beans.xml");
Modified: modules/persistence/trunk/impl/src/test/java/org/jboss/seam/persistence/transactions/test/TransactionScopedTest.java
===================================================================
--- modules/persistence/trunk/impl/src/test/java/org/jboss/seam/persistence/transactions/test/TransactionScopedTest.java 2010-08-30 22:33:36 UTC (rev 13668)
+++ modules/persistence/trunk/impl/src/test/java/org/jboss/seam/persistence/transactions/test/TransactionScopedTest.java 2010-08-30 23:56:10 UTC (rev 13669)
@@ -13,7 +13,7 @@
import org.jboss.arquillian.api.Deployment;
import org.jboss.arquillian.junit.Arquillian;
-import org.jboss.seam.persistence.SeamPersistenceProvider;
+import org.jboss.seam.persistence.DefaultPersistenceProvider;
import org.jboss.seam.persistence.transaction.DefaultTransaction;
import org.jboss.seam.persistence.transaction.SeamTransaction;
import org.jboss.seam.persistence.transaction.TransactionExtension;
@@ -41,7 +41,7 @@
war.addLibraries(MavenArtifactResolver.resolve(ArtifactNames.SEAM_PERSISTENCE_API));
war.addPackage(TransactionExtension.class.getPackage());
war.addPackage(TransactionScopeExtension.class.getPackage());
- war.addPackage(SeamPersistenceProvider.class.getPackage());
+ war.addPackage(DefaultPersistenceProvider.class.getPackage());
war.addPackage(NamingUtils.class.getPackage());
war.addClasses(TransactionScopedTest.class, Hotel.class, HelloService.class, TransactionScopedObject.class);
war.addWebResource("META-INF/persistence.xml", "classes/META-INF/persistence.xml");
Modified: modules/persistence/trunk/impl/src/test/java/org/jboss/seam/persistence/transactions/test/UserTransactionTest.java
===================================================================
--- modules/persistence/trunk/impl/src/test/java/org/jboss/seam/persistence/transactions/test/UserTransactionTest.java 2010-08-30 22:33:36 UTC (rev 13668)
+++ modules/persistence/trunk/impl/src/test/java/org/jboss/seam/persistence/transactions/test/UserTransactionTest.java 2010-08-30 23:56:10 UTC (rev 13669)
@@ -15,7 +15,6 @@
import org.jboss.arquillian.api.Deployment;
import org.jboss.arquillian.junit.Arquillian;
-import org.jboss.seam.persistence.SeamPersistenceProvider;
import org.jboss.seam.persistence.transaction.DefaultTransaction;
import org.jboss.seam.persistence.transaction.SeamTransaction;
import org.jboss.seam.persistence.transaction.TransactionExtension;
@@ -42,7 +41,6 @@
war.addLibraries(MavenArtifactResolver.resolve(ArtifactNames.SEAM_PERSISTENCE_API));
war.addPackage(TransactionExtension.class.getPackage());
war.addClasses(UserTransactionTest.class, Hotel.class, HelloService.class);
- war.addClass(SeamPersistenceProvider.class);
war.addPackage(NamingUtils.class.getPackage());
war.addWebResource("META-INF/persistence.xml", "classes/META-INF/persistence.xml");
war.addWebResource(new ByteArrayAsset(new byte[0]), "beans.xml");
13 years, 9 months
Seam SVN: r13668 - modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence.
by seam-commits@lists.jboss.org
Author: swd847
Date: 2010-08-30 18:33:36 -0400 (Mon, 30 Aug 2010)
New Revision: 13668
Modified:
modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/ManagedPersistenceContextBeanLifecycle.java
modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/ManagedPersistenceContextExtension.java
Log:
allow for programatic configuration of the SMPC in a non EE environment
Modified: modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/ManagedPersistenceContextBeanLifecycle.java
===================================================================
--- modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/ManagedPersistenceContextBeanLifecycle.java 2010-08-30 22:32:58 UTC (rev 13667)
+++ modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/ManagedPersistenceContextBeanLifecycle.java 2010-08-30 22:33:36 UTC (rev 13668)
@@ -176,4 +176,5 @@
}
return emf;
}
+
}
Modified: modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/ManagedPersistenceContextExtension.java
===================================================================
--- modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/ManagedPersistenceContextExtension.java 2010-08-30 22:32:58 UTC (rev 13667)
+++ modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/ManagedPersistenceContextExtension.java 2010-08-30 22:33:36 UTC (rev 13668)
@@ -30,15 +30,19 @@
import javax.enterprise.inject.Produces;
import javax.enterprise.inject.spi.AfterBeanDiscovery;
import javax.enterprise.inject.spi.AnnotatedField;
+import javax.enterprise.inject.spi.AnnotatedMethod;
import javax.enterprise.inject.spi.Bean;
import javax.enterprise.inject.spi.BeanManager;
import javax.enterprise.inject.spi.Extension;
import javax.enterprise.inject.spi.ProcessAnnotatedType;
import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
import javax.persistence.PersistenceUnit;
import org.jboss.weld.extensions.annotated.AnnotatedTypeBuilder;
import org.jboss.weld.extensions.bean.BeanBuilder;
+import org.jboss.weld.extensions.literal.AnyLiteral;
+import org.jboss.weld.extensions.literal.ApplicationScopedLiteral;
import org.jboss.weld.extensions.literal.DefaultLiteral;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -72,7 +76,7 @@
{
// look for a seam managed persistence unit declaration on EE resource
// producer fields
- if (f.isAnnotationPresent(SeamManaged.class) && f.isAnnotationPresent(PersistenceUnit.class) && f.isAnnotationPresent(Produces.class))
+ if (f.isAnnotationPresent(SeamManaged.class) && f.isAnnotationPresent(PersistenceUnit.class) && f.isAnnotationPresent(Produces.class) && EntityManagerFactory.class.isAssignableFrom(f.getJavaMember().getType()))
{
if (modifiedType == null)
{
@@ -96,6 +100,7 @@
{
qualifiers.add(new DefaultLiteral());
}
+ qualifiers.add(AnyLiteral.INSTANCE);
// we need to remove the scope, they are not nessesarily supported
// on producer fields
if (scope != Dependent.class)
@@ -108,6 +113,49 @@
// This allows the user to manually configure an EntityManagerFactory
// and return it from a producer method
}
+ // not look for SMPC's that are configured programatically via a producer
+ // method the producer method has its scope changes to application scoped
+ // this allows for programati config of the SMPC
+ for (AnnotatedMethod<? super T> m : event.getAnnotatedType().getMethods())
+ {
+ // look for a seam managed persistence unit declaration on EE resource
+ // producer fields
+ if (m.isAnnotationPresent(SeamManaged.class) && m.isAnnotationPresent(Produces.class) && EntityManagerFactory.class.isAssignableFrom(m.getJavaMember().getReturnType()))
+ {
+ if (modifiedType == null)
+ {
+ modifiedType = new AnnotatedTypeBuilder().readFromType(event.getAnnotatedType());
+ }
+ Set<Annotation> qualifiers = new HashSet<Annotation>();
+ Class<? extends Annotation> scope = Dependent.class;
+ // get the qualifier and scope for the new bean
+ for (Annotation a : m.getAnnotations())
+ {
+ if (manager.isQualifier(a.annotationType()))
+ {
+ qualifiers.add(a);
+ }
+ else if (manager.isScope(a.annotationType()))
+ {
+ scope = a.annotationType();
+ }
+ }
+ if (qualifiers.isEmpty())
+ {
+ qualifiers.add(new DefaultLiteral());
+ }
+ qualifiers.add(AnyLiteral.INSTANCE);
+ // we need to remove the scope, they are not nessesarily supported
+ // on producer fields
+ modifiedType.removeFromMethod(m.getJavaMember(), scope);
+ modifiedType.addToMethod(m.getJavaMember(), ApplicationScopedLiteral.INSTANCE);
+ registerManagedPersistenceContext(qualifiers, scope, manager, event.getAnnotatedType().getJavaClass().getClassLoader());
+ }
+ // now look for producer methods that produce an EntityManagerFactory.
+ // This allows the user to manually configure an EntityManagerFactory
+ // and return it from a producer method
+ }
+
if (modifiedType != null)
{
event.setAnnotatedType(modifiedType.create());
@@ -141,6 +189,7 @@
HibernatePersistenceProvider prov = new HibernatePersistenceProvider();
Set<Class<?>> additionalInterfaces = prov.getAdditionalEntityManagerInterfaces();
// create the new bean to be registered later
+ ManagedPersistenceContextBeanLifecycle lifecycle = new ManagedPersistenceContextBeanLifecycle(qualifiers, loader, manager, additionalInterfaces);
AnnotatedTypeBuilder<EntityManager> typeBuilder = new AnnotatedTypeBuilder().setJavaClass(EntityManager.class);
BeanBuilder<EntityManager> builder = new BeanBuilder<EntityManager>(manager).defineBeanFromAnnotatedType(typeBuilder.create());
builder.setQualifiers(qualifiers);
@@ -148,7 +197,6 @@
builder.getTypes().add(ManagedPersistenceContext.class);
builder.getTypes().addAll(additionalInterfaces);
builder.getTypes().add(Object.class);
- ManagedPersistenceContextBeanLifecycle lifecycle = new ManagedPersistenceContextBeanLifecycle(qualifiers, loader, manager, additionalInterfaces);
builder.setBeanLifecycle(lifecycle);
beans.add(builder.create());
}
13 years, 9 months
Seam SVN: r13667 - modules/persistence/trunk/impl/src/test/java/org/jboss/seam/persistence/test.
by seam-commits@lists.jboss.org
Author: swd847
Date: 2010-08-30 18:32:58 -0400 (Mon, 30 Aug 2010)
New Revision: 13667
Modified:
modules/persistence/trunk/impl/src/test/java/org/jboss/seam/persistence/test/ManagedPersistenceContextFlushModeTest.java
Log:
update flush mode test
Modified: modules/persistence/trunk/impl/src/test/java/org/jboss/seam/persistence/test/ManagedPersistenceContextFlushModeTest.java
===================================================================
--- modules/persistence/trunk/impl/src/test/java/org/jboss/seam/persistence/test/ManagedPersistenceContextFlushModeTest.java 2010-08-30 13:53:42 UTC (rev 13666)
+++ modules/persistence/trunk/impl/src/test/java/org/jboss/seam/persistence/test/ManagedPersistenceContextFlushModeTest.java 2010-08-30 22:32:58 UTC (rev 13667)
@@ -21,6 +21,7 @@
*/
package org.jboss.seam.persistence.test;
+import javax.enterprise.inject.spi.BeanManager;
import javax.inject.Inject;
import javax.persistence.EntityManager;
import javax.transaction.HeuristicMixedException;
@@ -36,7 +37,9 @@
import org.jboss.arquillian.api.Deployment;
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.seam.persistence.FlushModeManager;
+import org.jboss.seam.persistence.ManagedPersistenceContext;
import org.jboss.seam.persistence.PersistenceContextExtension;
+import org.jboss.seam.persistence.PersistenceContexts;
import org.jboss.seam.persistence.transaction.FlushModeType;
import org.jboss.seam.persistence.transaction.TransactionExtension;
import org.jboss.seam.persistence.transaction.scope.TransactionScopeExtension;
@@ -79,11 +82,34 @@
@Inject
EntityManager em;
+ @Inject
+ ManagedPersistenceContext context;
+
+ @Inject
+ PersistenceContexts pc;
+
+ @Inject
+ BeanManager bm;
+
@Test
- public void testPersistnceContextFlushMode() throws NotSupportedException, SystemException, SecurityException, IllegalStateException, RollbackException, HeuristicMixedException, HeuristicRollbackException
+ public void testPersistenceContextDefaultFlushMode() throws NotSupportedException, SystemException, SecurityException, IllegalStateException, RollbackException, HeuristicMixedException, HeuristicRollbackException
{
manager.setFlushModeType(FlushModeType.MANUAL);
Assert.assertEquals(FlushMode.MANUAL, ((Session) em.getDelegate()).getFlushMode());
}
+ @Test
+ public void testChangedTouchedPersistenceContextFlushMode()
+ {
+ try
+ {
+ em.setFlushMode(javax.persistence.FlushModeType.AUTO);
+ pc.changeFlushMode(FlushModeType.MANUAL);
+ Assert.assertEquals(FlushMode.MANUAL, ((Session) em.getDelegate()).getFlushMode());
+ }
+ finally
+ {
+ em.setFlushMode(javax.persistence.FlushModeType.AUTO);
+ }
+ }
}
13 years, 9 months
Seam SVN: r13666 - branches/community/Seam_2_2/src/main/org/jboss/seam/persistence.
by seam-commits@lists.jboss.org
Author: epbernard
Date: 2010-08-30 09:53:42 -0400 (Mon, 30 Aug 2010)
New Revision: 13666
Modified:
branches/community/Seam_2_2/src/main/org/jboss/seam/persistence/HibernatePersistenceProvider.java
Log:
JBSEAM-4649 JBSEAM-4700 Fix issues with Hibernate Search 3.2 and AS 6 (incorrect discovery sequence and double proxying leading to exceptions)
Modified: branches/community/Seam_2_2/src/main/org/jboss/seam/persistence/HibernatePersistenceProvider.java
===================================================================
--- branches/community/Seam_2_2/src/main/org/jboss/seam/persistence/HibernatePersistenceProvider.java 2010-08-30 09:35:25 UTC (rev 13665)
+++ branches/community/Seam_2_2/src/main/org/jboss/seam/persistence/HibernatePersistenceProvider.java 2010-08-30 13:53:42 UTC (rev 13666)
@@ -53,44 +53,49 @@
private static Method FULL_TEXT_ENTITYMANAGER_CONSTRUCTOR;
static
{
- try
+ boolean hibernateSearchPresent = false;
+ try
{
- String version = null;
- try {
- Class searchVersionClass = Class.forName("org.hibernate.search.Version");
- Field versionField = searchVersionClass.getDeclaredField("VERSION");
- version = (String) versionField.get(null);
- }
- catch (Exception e)
+ Class.forName("org.hibernate.search.Version");
+ hibernateSearchPresent = true;
+ }
+ catch (Exception e)
+ {
+ log.debug("Hibernate Search not present", e);
+ }
+ if (hibernateSearchPresent)
+ {
+ try
{
- log.debug("no Hibernate Search, sorry :-(", e);
- }
- if (version != null) {
Class searchClass = Class.forName("org.hibernate.search.Search");
- try {
+ try
+ {
FULL_TEXT_SESSION_CONSTRUCTOR = searchClass.getDeclaredMethod("getFullTextSession", Session.class);
}
- catch (NoSuchMethodException noSuchMethod) {
+ catch (NoSuchMethodException noSuchMethod)
+ {
log.debug("org.hibernate.search.Search.getFullTextSession(Session) not found, trying deprecated method name createFullTextSession");
FULL_TEXT_SESSION_CONSTRUCTOR = searchClass.getDeclaredMethod("createFullTextSession", Session.class);
}
FULL_TEXT_SESSION_PROXY_CLASS = Class.forName("org.jboss.seam.persistence.FullTextHibernateSessionProxy");
Class jpaSearchClass = Class.forName("org.hibernate.search.jpa.Search");
- try {
+ try
+ {
FULL_TEXT_ENTITYMANAGER_CONSTRUCTOR = jpaSearchClass.getDeclaredMethod("getFullTextEntityManager", EntityManager.class);
}
- catch (NoSuchMethodException noSuchMethod) {
+ catch (NoSuchMethodException noSuchMethod)
+ {
log.debug("org.hibernate.search.jpa.getFullTextSession(EntityManager) not found, trying deprecated method name createFullTextEntityManager");
FULL_TEXT_ENTITYMANAGER_CONSTRUCTOR = jpaSearchClass.getDeclaredMethod("createFullTextEntityManager", EntityManager.class);
}
FULL_TEXT_ENTITYMANAGER_PROXY_CLASS = Class.forName("org.jboss.seam.persistence.FullTextEntityManagerProxy");
log.debug("Hibernate Search is available :-)");
}
- }
- catch (Exception e)
- {
- log.debug("no Hibernate Search, sorry :-(", e);
- }
+ catch (Exception e)
+ {
+ log.debug("Unable to load Hibernate Search for ORM", e);
+ }
+ }
}
@Override
@@ -109,22 +114,42 @@
{
if (FULL_TEXT_SESSION_PROXY_CLASS==null)
{
- return (Session) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),
- new Class[] { HibernateSessionProxy.class },
- new HibernateSessionInvocationHandler(session));
+ if ( session instanceof HibernateSessionProxy )
+ {
+ return session;
+ }
+ else
+ {
+ return (Session) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),
+ new Class[] { HibernateSessionProxy.class },
+ new HibernateSessionInvocationHandler(session));
+ }
}
else
{
- try {
- return (Session) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),
- new Class[] { FULL_TEXT_SESSION_PROXY_CLASS },
- new HibernateSessionInvocationHandler((Session) FULL_TEXT_SESSION_CONSTRUCTOR.invoke(null, session)));
+ try
+ {
+ if ( FULL_TEXT_SESSION_PROXY_CLASS.isAssignableFrom( session.getClass() ) )
+ {
+ return session;
+ }
+ else {
+ return (Session) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),
+ new Class[] { FULL_TEXT_SESSION_PROXY_CLASS },
+ new HibernateSessionInvocationHandler((Session) FULL_TEXT_SESSION_CONSTRUCTOR.invoke(null, session)));
+ }
}
catch(Exception e) {
log.warn("Unable to wrap into a FullTextSessionProxy, regular SessionProxy returned", e);
- return (Session) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),
- new Class[] { HibernateSessionProxy.class },
- new HibernateSessionInvocationHandler(session));
+ if ( session instanceof HibernateSessionProxy )
+ {
+ return session;
+ }
+ else {
+ return (Session) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),
+ new Class[] { HibernateSessionProxy.class },
+ new HibernateSessionInvocationHandler(session));
+ }
}
}
}
@@ -241,12 +266,15 @@
org.hibernate.Filter filter = getSession(entityManager).enableFilter( f.getName() );
for ( Map.Entry<String, ValueExpression> me: f.getParameters().entrySet() )
{
- Object filterValue = me.getValue().getValue();
- if ( filterValue instanceof Collection ) {
- filter.setParameterList(me.getKey(), (Collection) filterValue);
- } else {
- filter.setParameter(me.getKey(), filterValue);
- }
+ Object filterValue = me.getValue().getValue();
+ if ( filterValue instanceof Collection )
+ {
+ filter.setParameterList(me.getKey(), (Collection) filterValue);
+ }
+ else
+ {
+ filter.setParameter(me.getKey(), filterValue);
+ }
}
filter.validate();
}
13 years, 9 months
Seam SVN: r13665 - in modules/persistence/trunk/impl/src: test/java/org/jboss/seam/persistence/test and 1 other directory.
by seam-commits@lists.jboss.org
Author: swd847
Date: 2010-08-30 05:35:25 -0400 (Mon, 30 Aug 2010)
New Revision: 13665
Added:
modules/persistence/trunk/impl/src/test/java/org/jboss/seam/persistence/test/ManagedPersistenceContextFlushModeTest.java
Modified:
modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/FlushModeManager.java
modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/HibernatePersistenceProvider.java
modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/ManagedPersistenceContextBeanLifecycle.java
modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/ManagedPersistenceContextExtension.java
modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/SeamPersistenceProvider.java
Log:
add ability to set the default flush mode for the SMPC
Modified: modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/FlushModeManager.java
===================================================================
--- modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/FlushModeManager.java 2010-08-30 08:54:49 UTC (rev 13664)
+++ modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/FlushModeManager.java 2010-08-30 09:35:25 UTC (rev 13665)
@@ -31,5 +31,11 @@
*/
public interface FlushModeManager
{
+ /**
+ *
+ * @return the default flush mode for all seam managed persistence contexts
+ */
public FlushModeType getFlushModeType();
+
+ public void setFlushModeType(FlushModeType flushModeType);
}
Modified: modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/HibernatePersistenceProvider.java
===================================================================
--- modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/HibernatePersistenceProvider.java 2010-08-30 08:54:49 UTC (rev 13664)
+++ modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/HibernatePersistenceProvider.java 2010-08-30 09:35:25 UTC (rev 13665)
@@ -50,8 +50,7 @@
}
catch (Exception e)
{
- e.printStackTrace();
- log.info("no Hibernate Search", e);
+ log.debug("no Hibernate Search", e);
}
if (version != null)
{
@@ -81,8 +80,7 @@
}
catch (Exception e)
{
- e.printStackTrace();
- log.info("no Hibernate Search", e);
+ log.debug("no Hibernate Search", e);
}
}
Modified: modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/ManagedPersistenceContextBeanLifecycle.java
===================================================================
--- modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/ManagedPersistenceContextBeanLifecycle.java 2010-08-30 08:54:49 UTC (rev 13664)
+++ modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/ManagedPersistenceContextBeanLifecycle.java 2010-08-30 09:35:25 UTC (rev 13665)
@@ -106,6 +106,7 @@
entityManager = getPersistenceProvider().proxyEntityManager(entityManager);
ManagedPersistenceContextProxyHandler handler = new ManagedPersistenceContextProxyHandler(entityManager, manager, bean.getQualifiers(), getPersistenceContexts());
EntityManager proxy = (EntityManager) proxyConstructor.newInstance(handler);
+ getPersistenceProvider().setFlushMode(proxy, getPersistenceContexts().getFlushMode());
return proxy;
}
catch (Exception e)
Modified: modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/ManagedPersistenceContextExtension.java
===================================================================
--- modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/ManagedPersistenceContextExtension.java 2010-08-30 08:54:49 UTC (rev 13664)
+++ modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/ManagedPersistenceContextExtension.java 2010-08-30 09:35:25 UTC (rev 13665)
@@ -40,6 +40,8 @@
import org.jboss.weld.extensions.annotated.AnnotatedTypeBuilder;
import org.jboss.weld.extensions.bean.BeanBuilder;
import org.jboss.weld.extensions.literal.DefaultLiteral;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
/**
* Extension the wraps producer methods/fields that produce an entity manager to
@@ -54,6 +56,8 @@
Set<Bean<?>> beans = new HashSet<Bean<?>>();
+ private static final Logger log = LoggerFactory.getLogger(ManagedPersistenceContextExtension.class);
+
/**
* loops through the fields on an AnnotatedType looking for a @PersistnceUnit
* producer field that is annotated {@link SeamManaged}. Then a corresponding
@@ -126,6 +130,7 @@
catch (ClassNotFoundException e)
{
event.veto();
+ log.debug("Hibernate is not availbile", e);
}
}
}
Modified: modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/SeamPersistenceProvider.java
===================================================================
--- modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/SeamPersistenceProvider.java 2010-08-30 08:54:49 UTC (rev 13664)
+++ modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/SeamPersistenceProvider.java 2010-08-30 09:35:25 UTC (rev 13665)
@@ -106,8 +106,10 @@
break;
case COMMIT:
entityManager.setFlushMode(javax.persistence.FlushModeType.COMMIT);
+ break;
case MANUAL:
setFlushModeManual(entityManager);
+ break;
default:
throw new RuntimeException("Unkown flush mode: " + type);
}
Added: modules/persistence/trunk/impl/src/test/java/org/jboss/seam/persistence/test/ManagedPersistenceContextFlushModeTest.java
===================================================================
--- modules/persistence/trunk/impl/src/test/java/org/jboss/seam/persistence/test/ManagedPersistenceContextFlushModeTest.java (rev 0)
+++ modules/persistence/trunk/impl/src/test/java/org/jboss/seam/persistence/test/ManagedPersistenceContextFlushModeTest.java 2010-08-30 09:35:25 UTC (rev 13665)
@@ -0,0 +1,89 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc., and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.seam.persistence.test;
+
+import javax.inject.Inject;
+import javax.persistence.EntityManager;
+import javax.transaction.HeuristicMixedException;
+import javax.transaction.HeuristicRollbackException;
+import javax.transaction.NotSupportedException;
+import javax.transaction.RollbackException;
+import javax.transaction.SystemException;
+
+import junit.framework.Assert;
+
+import org.hibernate.FlushMode;
+import org.hibernate.Session;
+import org.jboss.arquillian.api.Deployment;
+import org.jboss.arquillian.junit.Arquillian;
+import org.jboss.seam.persistence.FlushModeManager;
+import org.jboss.seam.persistence.PersistenceContextExtension;
+import org.jboss.seam.persistence.transaction.FlushModeType;
+import org.jboss.seam.persistence.transaction.TransactionExtension;
+import org.jboss.seam.persistence.transaction.scope.TransactionScopeExtension;
+import org.jboss.seam.persistence.util.NamingUtils;
+import org.jboss.seam.transactions.test.util.ArtifactNames;
+import org.jboss.seam.transactions.test.util.HelloService;
+import org.jboss.seam.transactions.test.util.Hotel;
+import org.jboss.seam.transactions.test.util.ManagedPersistenceContextProvider;
+import org.jboss.seam.transactions.test.util.MavenArtifactResolver;
+import org.jboss.shrinkwrap.api.Archive;
+import org.jboss.shrinkwrap.api.ShrinkWrap;
+import org.jboss.shrinkwrap.api.asset.ByteArrayAsset;
+import org.jboss.shrinkwrap.api.spec.WebArchive;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+(a)RunWith(Arquillian.class)
+public class ManagedPersistenceContextFlushModeTest
+{
+ @Deployment
+ public static Archive<?> createTestArchive()
+ {
+ WebArchive war = ShrinkWrap.createDomain().getArchiveFactory().create(WebArchive.class, "test.war");
+ war.addLibraries(MavenArtifactResolver.resolve(ArtifactNames.WELD_EXTENSIONS));
+ war.addLibraries(MavenArtifactResolver.resolve(ArtifactNames.SEAM_PERSISTENCE_API));
+ war.addPackage(TransactionExtension.class.getPackage());
+ war.addPackage(PersistenceContextExtension.class.getPackage());
+ war.addPackage(TransactionScopeExtension.class.getPackage());
+ war.addPackage(NamingUtils.class.getPackage());
+ war.addClasses(ManagedPersistenceContextFlushModeTest.class, Hotel.class, ManagedPersistenceContextProvider.class, HelloService.class);
+ war.addWebResource("META-INF/persistence.xml", "classes/META-INF/persistence.xml");
+ war.addWebResource(new ByteArrayAsset(new byte[0]), "beans.xml");
+ war.addWebResource("META-INF/services/javax.enterprise.inject.spi.Extension", "classes/META-INF/services/javax.enterprise.inject.spi.Extension");
+ return war;
+ }
+
+ @Inject
+ FlushModeManager manager;
+
+ @Inject
+ EntityManager em;
+
+ @Test
+ public void testPersistnceContextFlushMode() throws NotSupportedException, SystemException, SecurityException, IllegalStateException, RollbackException, HeuristicMixedException, HeuristicRollbackException
+ {
+ manager.setFlushModeType(FlushModeType.MANUAL);
+ Assert.assertEquals(FlushMode.MANUAL, ((Session) em.getDelegate()).getFlushMode());
+ }
+
+}
13 years, 9 months
Seam SVN: r13664 - in modules/persistence/trunk/impl: src/main/java/org/jboss/seam/persistence and 3 other directories.
by seam-commits@lists.jboss.org
Author: swd847
Date: 2010-08-30 04:54:49 -0400 (Mon, 30 Aug 2010)
New Revision: 13664
Added:
modules/persistence/trunk/impl/src/test/java/org/jboss/seam/persistence/test/HibernateSearchTest.java
modules/persistence/trunk/impl/src/test/java/org/jboss/seam/transactions/test/util/IndexedHotel.java
modules/persistence/trunk/impl/src/test/resources/META-INF/persistence-search.xml
Modified:
modules/persistence/trunk/impl/pom.xml
modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/HibernatePersistenceProvider.java
modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/ManagedPersistenceContextBeanLifecycle.java
modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/ManagedPersistenceContextExtension.java
modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/SeamPersistenceProvider.java
modules/persistence/trunk/impl/src/test/java/org/jboss/seam/transactions/test/util/ArtifactNames.java
Log:
hibernate search integration
Modified: modules/persistence/trunk/impl/pom.xml
===================================================================
--- modules/persistence/trunk/impl/pom.xml 2010-08-30 07:00:01 UTC (rev 13663)
+++ modules/persistence/trunk/impl/pom.xml 2010-08-30 08:54:49 UTC (rev 13664)
@@ -108,7 +108,12 @@
<type>jar</type>
<scope>compile</scope>
</dependency>
-
+ <dependency>
+ <groupId>org.hibernate</groupId>
+ <artifactId>hibernate-search</artifactId>
+ <version>3.2.1.Final</version>
+ <optional>true</optional>
+ </dependency>
<dependency>
<groupId>org.jboss.arquillian</groupId>
<artifactId>arquillian-junit</artifactId>
Modified: modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/HibernatePersistenceProvider.java
===================================================================
--- modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/HibernatePersistenceProvider.java 2010-08-30 07:00:01 UTC (rev 13663)
+++ modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/HibernatePersistenceProvider.java 2010-08-30 08:54:49 UTC (rev 13664)
@@ -1,7 +1,8 @@
package org.jboss.seam.persistence;
-import java.lang.reflect.Field;
import java.lang.reflect.Method;
+import java.util.Collections;
+import java.util.Set;
import javax.enterprise.inject.Instance;
import javax.inject.Inject;
@@ -13,7 +14,7 @@
import org.hibernate.TransientObjectException;
import org.hibernate.proxy.HibernateProxy;
import org.jboss.seam.persistence.transaction.FlushModeType;
-import org.jboss.weld.extensions.core.Veto;
+import org.jboss.weld.extensions.util.Reflections;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -26,7 +27,6 @@
* @author Stuart Douglas
*
*/
-@Veto
public class HibernatePersistenceProvider extends SeamPersistenceProvider
{
@@ -34,10 +34,9 @@
Instance<PersistenceContextsImpl> persistenceContexts;
private static Logger log = LoggerFactory.getLogger(HibernatePersistenceProvider.class);
- private static Class<?> FULL_TEXT_SESSION_PROXY_CLASS;
private static Method FULL_TEXT_SESSION_CONSTRUCTOR;
- private static Class<?> FULL_TEXT_ENTITYMANAGER_PROXY_CLASS;
private static Method FULL_TEXT_ENTITYMANAGER_CONSTRUCTOR;
+ private static Class<?> FULL_TEXT_ENTITYMANAGER;
static
{
try
@@ -45,17 +44,18 @@
String version = null;
try
{
- Class<?> searchVersionClass = Class.forName("org.hibernate.search.Version");
- Field versionField = searchVersionClass.getDeclaredField("VERSION");
- version = (String) versionField.get(null);
+ Class<?> searchVersionClass = Reflections.classForName("org.hibernate.search.Version");
+ Method versionMethod = searchVersionClass.getDeclaredMethod("getVersionString");
+ version = (String) versionMethod.invoke(null);
}
catch (Exception e)
{
- log.debug("no Hibernate Search, sorry :-(", e);
+ e.printStackTrace();
+ log.info("no Hibernate Search", e);
}
if (version != null)
{
- Class<?> searchClass = Class.forName("org.hibernate.search.Search");
+ Class<?> searchClass = Reflections.classForName("org.hibernate.search.Search");
try
{
FULL_TEXT_SESSION_CONSTRUCTOR = searchClass.getDeclaredMethod("getFullTextSession", Session.class);
@@ -65,8 +65,7 @@
log.debug("org.hibernate.search.Search.getFullTextSession(Session) not found, trying deprecated method name createFullTextSession");
FULL_TEXT_SESSION_CONSTRUCTOR = searchClass.getDeclaredMethod("createFullTextSession", Session.class);
}
- FULL_TEXT_SESSION_PROXY_CLASS = Class.forName("org.jboss.seam.persistence.FullTextHibernateSessionProxy");
- Class<?> jpaSearchClass = Class.forName("org.hibernate.search.jpa.Search");
+ Class<?> jpaSearchClass = Reflections.classForName("org.hibernate.search.jpa.Search");
try
{
FULL_TEXT_ENTITYMANAGER_CONSTRUCTOR = jpaSearchClass.getDeclaredMethod("getFullTextEntityManager", EntityManager.class);
@@ -76,13 +75,14 @@
log.debug("org.hibernate.search.jpa.getFullTextSession(EntityManager) not found, trying deprecated method name createFullTextEntityManager");
FULL_TEXT_ENTITYMANAGER_CONSTRUCTOR = jpaSearchClass.getDeclaredMethod("createFullTextEntityManager", EntityManager.class);
}
- FULL_TEXT_ENTITYMANAGER_PROXY_CLASS = Class.forName("org.jboss.seam.persistence.FullTextEntityManagerProxy");
- log.debug("Hibernate Search is available :-)");
+ FULL_TEXT_ENTITYMANAGER = Reflections.classForName("org.hibernate.search.jpa.FullTextEntityManager");
+ log.info("Hibernate Search is available");
}
}
catch (Exception e)
{
- log.debug("no Hibernate Search, sorry :-(", e);
+ e.printStackTrace();
+ log.info("no Hibernate Search", e);
}
}
@@ -201,7 +201,7 @@
*/
static Session proxySession(Session session)
{
- if (FULL_TEXT_SESSION_PROXY_CLASS == null)
+ if (FULL_TEXT_SESSION_CONSTRUCTOR == null)
{
return session;
}
@@ -243,7 +243,7 @@
@Override
public EntityManager proxyEntityManager(EntityManager entityManager)
{
- if (FULL_TEXT_ENTITYMANAGER_PROXY_CLASS == null)
+ if (FULL_TEXT_ENTITYMANAGER_CONSTRUCTOR == null)
{
return super.proxyEntityManager(entityManager);
}
@@ -262,6 +262,15 @@
}
}
+ public Set<Class<?>> getAdditionalEntityManagerInterfaces()
+ {
+ if (FULL_TEXT_ENTITYMANAGER == null)
+ {
+ return Collections.emptySet();
+ }
+ return (Set) Collections.singleton(FULL_TEXT_ENTITYMANAGER);
+ }
+
/**
* Occurs when Hibernate is in the classpath, but this particular
* EntityManager is not from Hibernate
Modified: modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/ManagedPersistenceContextBeanLifecycle.java
===================================================================
--- modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/ManagedPersistenceContextBeanLifecycle.java 2010-08-30 07:00:01 UTC (rev 13663)
+++ modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/ManagedPersistenceContextBeanLifecycle.java 2010-08-30 08:54:49 UTC (rev 13664)
@@ -48,12 +48,12 @@
*/
public class ManagedPersistenceContextBeanLifecycle implements BeanLifecycle<EntityManager>
{
+ private static final Logger log = LoggerFactory.getLogger(ManagedPersistenceContextBeanLifecycle.class);
+
private final Class<?> proxyClass;
private final Constructor<?> proxyConstructor;
- private static final Logger log = LoggerFactory.getLogger(ManagedPersistenceContextBeanLifecycle.class);
-
private PersistenceContexts persistenceContexts;
private SeamPersistenceProvider persistenceProvider;
@@ -64,10 +64,20 @@
private EntityManagerFactory emf;
- public ManagedPersistenceContextBeanLifecycle(Set<Annotation> qualifiers, ClassLoader loader, BeanManager manager)
+ public ManagedPersistenceContextBeanLifecycle(Set<Annotation> qualifiers, ClassLoader loader, BeanManager manager, Set<Class<?>> additionalinterfaces)
{
this.manager = manager;
- proxyClass = Proxy.getProxyClass(loader, EntityManager.class, Serializable.class, ManagedPersistenceContext.class);
+ Class<?>[] interfaces = new Class[additionalinterfaces.size() + 3];
+ int count = 0;
+ for (Class<?> i : additionalinterfaces)
+ {
+ interfaces[count++] = i;
+ }
+
+ interfaces[count++] = EntityManager.class;
+ interfaces[count++] = Serializable.class;
+ interfaces[count++] = ManagedPersistenceContext.class;
+ proxyClass = Proxy.getProxyClass(loader, interfaces);
try
{
proxyConstructor = proxyClass.getConstructor(InvocationHandler.class);
Modified: modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/ManagedPersistenceContextExtension.java
===================================================================
--- modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/ManagedPersistenceContextExtension.java 2010-08-30 07:00:01 UTC (rev 13663)
+++ modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/ManagedPersistenceContextExtension.java 2010-08-30 08:54:49 UTC (rev 13664)
@@ -132,14 +132,18 @@
public void registerManagedPersistenceContext(Set<Annotation> qualifiers, Class<? extends Annotation> scope, BeanManager manager, ClassLoader loader)
{
- // create the new bean to be registerd later
+ // TODO: this is a massive hack. We need a much better way of doing this
+ HibernatePersistenceProvider prov = new HibernatePersistenceProvider();
+ Set<Class<?>> additionalInterfaces = prov.getAdditionalEntityManagerInterfaces();
+ // create the new bean to be registered later
AnnotatedTypeBuilder<EntityManager> typeBuilder = new AnnotatedTypeBuilder().setJavaClass(EntityManager.class);
BeanBuilder<EntityManager> builder = new BeanBuilder<EntityManager>(manager).defineBeanFromAnnotatedType(typeBuilder.create());
builder.setQualifiers(qualifiers);
builder.setScope(scope);
builder.getTypes().add(ManagedPersistenceContext.class);
+ builder.getTypes().addAll(additionalInterfaces);
builder.getTypes().add(Object.class);
- ManagedPersistenceContextBeanLifecycle lifecycle = new ManagedPersistenceContextBeanLifecycle(qualifiers, loader, manager);
+ ManagedPersistenceContextBeanLifecycle lifecycle = new ManagedPersistenceContextBeanLifecycle(qualifiers, loader, manager, additionalInterfaces);
builder.setBeanLifecycle(lifecycle);
beans.add(builder.create());
}
Modified: modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/SeamPersistenceProvider.java
===================================================================
--- modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/SeamPersistenceProvider.java 2010-08-30 07:00:01 UTC (rev 13663)
+++ modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/SeamPersistenceProvider.java 2010-08-30 08:54:49 UTC (rev 13664)
@@ -22,6 +22,7 @@
package org.jboss.seam.persistence;
import java.lang.reflect.Method;
+import java.util.Collections;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
@@ -235,6 +236,11 @@
return entityManager;
}
+ public Set<Class<?>> getAdditionalEntityManagerInterfaces()
+ {
+ return Collections.emptySet();
+ }
+
/**
* Returns the class of an entity bean instance
*
Added: modules/persistence/trunk/impl/src/test/java/org/jboss/seam/persistence/test/HibernateSearchTest.java
===================================================================
--- modules/persistence/trunk/impl/src/test/java/org/jboss/seam/persistence/test/HibernateSearchTest.java (rev 0)
+++ modules/persistence/trunk/impl/src/test/java/org/jboss/seam/persistence/test/HibernateSearchTest.java 2010-08-30 08:54:49 UTC (rev 13664)
@@ -0,0 +1,119 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc., and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.seam.persistence.test;
+
+import javax.inject.Inject;
+import javax.transaction.HeuristicMixedException;
+import javax.transaction.HeuristicRollbackException;
+import javax.transaction.NotSupportedException;
+import javax.transaction.RollbackException;
+import javax.transaction.SystemException;
+
+import org.apache.lucene.analysis.standard.StandardAnalyzer;
+import org.apache.lucene.queryParser.MultiFieldQueryParser;
+import org.apache.lucene.queryParser.ParseException;
+import org.hibernate.search.jpa.FullTextEntityManager;
+import org.jboss.arquillian.api.Deployment;
+import org.jboss.arquillian.junit.Arquillian;
+import org.jboss.seam.persistence.PersistenceContextExtension;
+import org.jboss.seam.persistence.transaction.DefaultTransaction;
+import org.jboss.seam.persistence.transaction.SeamTransaction;
+import org.jboss.seam.persistence.transaction.TransactionExtension;
+import org.jboss.seam.persistence.transaction.scope.TransactionScopeExtension;
+import org.jboss.seam.persistence.util.NamingUtils;
+import org.jboss.seam.transactions.test.util.ArtifactNames;
+import org.jboss.seam.transactions.test.util.HelloService;
+import org.jboss.seam.transactions.test.util.IndexedHotel;
+import org.jboss.seam.transactions.test.util.ManagedPersistenceContextProvider;
+import org.jboss.seam.transactions.test.util.MavenArtifactResolver;
+import org.jboss.shrinkwrap.api.Archive;
+import org.jboss.shrinkwrap.api.ShrinkWrap;
+import org.jboss.shrinkwrap.api.asset.ByteArrayAsset;
+import org.jboss.shrinkwrap.api.spec.WebArchive;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+(a)RunWith(Arquillian.class)
+public class HibernateSearchTest
+{
+ @Deployment
+ public static Archive<?> createTestArchive()
+ {
+ WebArchive war = ShrinkWrap.createDomain().getArchiveFactory().create(WebArchive.class, "test.war");
+ war.addLibraries(MavenArtifactResolver.resolve(ArtifactNames.WELD_EXTENSIONS));
+ war.addLibraries(MavenArtifactResolver.resolve(ArtifactNames.SEAM_PERSISTENCE_API));
+ war.addLibraries(MavenArtifactResolver.resolve(ArtifactNames.HIBERNATE_SEARCH));
+ war.addLibraries(MavenArtifactResolver.resolve(ArtifactNames.LUCENE_ANALYZERS));
+ war.addLibraries(MavenArtifactResolver.resolve(ArtifactNames.LUCENE_CORE));
+ war.addPackage(TransactionExtension.class.getPackage());
+ war.addPackage(PersistenceContextExtension.class.getPackage());
+ war.addPackage(TransactionScopeExtension.class.getPackage());
+ war.addPackage(NamingUtils.class.getPackage());
+ war.addClasses(HibernateSearchTest.class, IndexedHotel.class, ManagedPersistenceContextProvider.class, HelloService.class);
+ war.addWebResource("META-INF/persistence-search.xml", "classes/META-INF/persistence.xml");
+ war.addWebResource(new ByteArrayAsset(new byte[0]), "beans.xml");
+ war.addWebResource("META-INF/services/javax.enterprise.inject.spi.Extension", "classes/META-INF/services/javax.enterprise.inject.spi.Extension");
+ return war;
+ }
+
+ @Inject
+ @DefaultTransaction
+ SeamTransaction transaction;
+
+ @Inject
+ FullTextEntityManager em;
+
+ @Test
+ public void testFullTextEntityManager() throws NotSupportedException, SystemException, SecurityException, IllegalStateException, RollbackException, HeuristicMixedException, HeuristicRollbackException
+ {
+ Assert.assertTrue(em instanceof FullTextEntityManager);
+ }
+
+ @Test
+ public void testSearchingForHotel() throws NotSupportedException, SystemException, SecurityException, IllegalStateException, RollbackException, HeuristicMixedException, HeuristicRollbackException, ParseException
+ {
+ transaction.begin();
+ IndexedHotel h = new IndexedHotel("Hilton", "Fake St", "Wollongong", "NSW", "2518", "Australia");
+ em.persist(h);
+ em.flush();
+ transaction.commit();
+
+ transaction.begin();
+ h = new IndexedHotel("Other Hotel", "Real St ", "Wollongong", "NSW", "2518", "Australia");
+ em.persist(h);
+ em.flush();
+ transaction.commit();
+
+ transaction.begin();
+ String[] fields = new String[] { "name" };
+ MultiFieldQueryParser parser = new MultiFieldQueryParser(fields, new StandardAnalyzer());
+ org.apache.lucene.search.Query query = parser.parse("Other");
+
+ // wrap Lucene query in a javax.persistence.Query
+ javax.persistence.Query persistenceQuery = em.createFullTextQuery(query, IndexedHotel.class);
+ IndexedHotel hotel = (IndexedHotel) persistenceQuery.getSingleResult();
+ Assert.assertTrue(hotel.getName().equals("Other Hotel"));
+ transaction.commit();
+
+ }
+}
Modified: modules/persistence/trunk/impl/src/test/java/org/jboss/seam/transactions/test/util/ArtifactNames.java
===================================================================
--- modules/persistence/trunk/impl/src/test/java/org/jboss/seam/transactions/test/util/ArtifactNames.java 2010-08-30 07:00:01 UTC (rev 13663)
+++ modules/persistence/trunk/impl/src/test/java/org/jboss/seam/transactions/test/util/ArtifactNames.java 2010-08-30 08:54:49 UTC (rev 13664)
@@ -4,5 +4,8 @@
{
public static final String WELD_EXTENSIONS = "org.jboss.weld:weld-extensions";
public static final String SEAM_PERSISTENCE_API = "org.jboss.seam.persistence:seam-persistence-api";
+ public static final String HIBERNATE_SEARCH = "org.hibernate:hibernate-search";
+ public static final String LUCENE_CORE = "org.apache.lucene:lucene-core";
+ public static final String LUCENE_ANALYZERS = "org.apache.lucene:lucene-analyzers";
}
Added: modules/persistence/trunk/impl/src/test/java/org/jboss/seam/transactions/test/util/IndexedHotel.java
===================================================================
--- modules/persistence/trunk/impl/src/test/java/org/jboss/seam/transactions/test/util/IndexedHotel.java (rev 0)
+++ modules/persistence/trunk/impl/src/test/java/org/jboss/seam/transactions/test/util/IndexedHotel.java 2010-08-30 08:54:49 UTC (rev 13664)
@@ -0,0 +1,236 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.seam.transactions.test.util;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+import javax.inject.Inject;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.Transient;
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+
+import org.hibernate.search.annotations.Field;
+import org.hibernate.search.annotations.Index;
+import org.hibernate.search.annotations.Indexed;
+import org.hibernate.search.annotations.Store;
+import org.jboss.weld.extensions.core.Veto;
+
+/**
+ * <p>
+ * <strong>Hotel</strong> is the model/entity class that represents a hotel.
+ * </p>
+ *
+ * @author Gavin King
+ * @author Dan Allen
+ */
+@Entity
+@Table(name = "hotel")
+@Indexed
+@Veto
+public class IndexedHotel implements Serializable
+{
+ private Long id;
+ private String name;
+ private String address;
+ private String city;
+ private String state;
+ private String zip;
+ private String country;
+ private Integer stars;
+ private BigDecimal price;
+
+ @Inject
+ private HelloService helloService;
+
+ private boolean initalizerCalled = false;
+
+ public IndexedHotel()
+ {
+ }
+
+ @Inject
+ public void create()
+ {
+ initalizerCalled = true;
+ }
+
+ public String sayHello()
+ {
+ return helloService.sayHello();
+ }
+
+ public IndexedHotel(final String name, final String address, final String city, final String state, final String zip, final String country)
+ {
+ this.name = name;
+ this.address = address;
+ this.city = city;
+ this.state = state;
+ this.zip = zip;
+ this.country = country;
+ }
+
+ public IndexedHotel(final int price, final int stars, final String name, final String address, final String city, final String state, final String zip, final String country)
+ {
+ this.price = new BigDecimal(price);
+ this.stars = stars;
+ this.name = name;
+ this.address = address;
+ this.city = city;
+ this.state = state;
+ this.zip = zip;
+ this.country = country;
+ }
+
+ @Id
+ @GeneratedValue
+ public Long getId()
+ {
+ return id;
+ }
+
+ public void setId(final Long id)
+ {
+ this.id = id;
+ }
+
+ @Size(max = 50)
+ @NotNull
+ @Field(index = Index.TOKENIZED, store = Store.NO)
+ public String getName()
+ {
+ return name;
+ }
+
+ public void setName(final String name)
+ {
+ this.name = name;
+ }
+
+ @Size(max = 100)
+ @NotNull
+ public String getAddress()
+ {
+ return address;
+ }
+
+ public void setAddress(final String address)
+ {
+ this.address = address;
+ }
+
+ @Size(max = 40)
+ @NotNull
+ public String getCity()
+ {
+ return city;
+ }
+
+ public void setCity(final String city)
+ {
+ this.city = city;
+ }
+
+ @Size(min = 3, max = 6)
+ @NotNull
+ public String getZip()
+ {
+ return zip;
+ }
+
+ public void setZip(final String zip)
+ {
+ this.zip = zip;
+ }
+
+ @Size(min = 2, max = 10)
+ public String getState()
+ {
+ return state;
+ }
+
+ public void setState(final String state)
+ {
+ this.state = state;
+ }
+
+ @Size(min = 2, max = 40)
+ @NotNull
+ public String getCountry()
+ {
+ return country;
+ }
+
+ public void setCountry(final String country)
+ {
+ this.country = country;
+ }
+
+ @Min(1)
+ @Max(5)
+ public Integer getStars()
+ {
+ return stars;
+ }
+
+ public void setStars(final Integer stars)
+ {
+ this.stars = stars;
+ }
+
+ @Column(precision = 6, scale = 2)
+ public BigDecimal getPrice()
+ {
+ return price;
+ }
+
+ public void setPrice(final BigDecimal price)
+ {
+ this.price = price;
+ }
+
+ @Transient
+ public String getLocation()
+ {
+ return city + ", " + state + ", " + country;
+ }
+
+ @Override
+ public String toString()
+ {
+ return "Hotel(" + name + "," + address + "," + city + "," + zip + ")";
+ }
+
+ @Transient
+ public boolean isInitalizerCalled()
+ {
+ return initalizerCalled;
+ }
+
+}
Added: modules/persistence/trunk/impl/src/test/resources/META-INF/persistence-search.xml
===================================================================
--- modules/persistence/trunk/impl/src/test/resources/META-INF/persistence-search.xml (rev 0)
+++ modules/persistence/trunk/impl/src/test/resources/META-INF/persistence-search.xml 2010-08-30 08:54:49 UTC (rev 13664)
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<persistence xmlns="http://java.sun.com/xml/ns/persistence"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
+ version="2.0">
+ <persistence-unit name="transactionPu">
+ <!--
+ <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
+ -->
+ <provider>org.hibernate.ejb.HibernatePersistence</provider>
+ <jta-data-source>java:/DefaultDS</jta-data-source>
+ <class>org.jboss.seam.transactions.test.util.IndexedHotel</class>
+ <exclude-unlisted-classes/>
+ <properties>
+ <!-- Properties for Hibernate (default provider for JBoss AS) -->
+ <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
+ <property name="hibernate.show_sql" value="true"/>
+ <!-- Only format when you need to debug, because it slows things down -->
+ <property name="hibernate.format_sql" value="false"/>
+ <property name="hibernate.search.default.directory_provider"
+ value="org.hibernate.search.store.FSDirectoryProvider"/>
+
+ <property name="hibernate.search.default.indexBase"
+ value="/tmp/"/>
+ <!-- Properties for EclipseLink (default provider for GlassFish) -->
+ <property name="eclipselink.ddl-generation" value="drop-and-create-tables"/>
+ <property name="eclipselink.logging.level" value="FINE"/>
+ </properties>
+ </persistence-unit>
+</persistence>
13 years, 9 months
Seam SVN: r13663 - in modules/persistence/trunk/impl/src: test/java/org/jboss/seam/persistence/test and 1 other directories.
by seam-commits@lists.jboss.org
Author: swd847
Date: 2010-08-30 03:00:01 -0400 (Mon, 30 Aug 2010)
New Revision: 13663
Added:
modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/ManagedPersistenceContext.java
Removed:
modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/AbstractManagedPersistenceContextBeanLifecycle.java
modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/PersistenceContext.java
Modified:
modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/HibernatePersistenceProvider.java
modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/ManagedPersistenceContextBeanLifecycle.java
modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/ManagedPersistenceContextExtension.java
modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/ManagedPersistenceContextProxyHandler.java
modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/PersistenceContexts.java
modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/PersistenceContextsImpl.java
modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/SeamPersistenceProvider.java
modules/persistence/trunk/impl/src/test/java/org/jboss/seam/persistence/test/EntityInjectionTest.java
modules/persistence/trunk/impl/src/test/java/org/jboss/seam/persistence/test/ManagedPersistenceContextELTest.java
modules/persistence/trunk/impl/src/test/java/org/jboss/seam/persistence/test/ManagedPersistenceContextTest.java
modules/persistence/trunk/impl/src/test/java/org/jboss/seam/persistence/transactions/test/TransactionAttributeInterceptorTest.java
modules/persistence/trunk/impl/src/test/java/org/jboss/seam/persistence/transactions/test/TransactionInterceptorTest.java
Log:
refactor the SMPC implementation
Deleted: modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/AbstractManagedPersistenceContextBeanLifecycle.java
===================================================================
--- modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/AbstractManagedPersistenceContextBeanLifecycle.java 2010-08-28 02:48:04 UTC (rev 13662)
+++ modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/AbstractManagedPersistenceContextBeanLifecycle.java 2010-08-30 07:00:01 UTC (rev 13663)
@@ -1,121 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright 2010, Red Hat, Inc., and individual contributors
- * by the @authors tag. See the copyright.txt in the distribution for a
- * full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.jboss.seam.persistence;
-
-import java.io.Serializable;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationHandler;
-import java.lang.reflect.Proxy;
-
-import javax.enterprise.context.ContextNotActiveException;
-import javax.enterprise.context.spi.CreationalContext;
-import javax.enterprise.inject.spi.Bean;
-import javax.enterprise.inject.spi.BeanManager;
-import javax.persistence.EntityManager;
-import javax.persistence.EntityManagerFactory;
-
-import org.jboss.weld.extensions.bean.BeanLifecycle;
-import org.jboss.weld.extensions.literal.DefaultLiteral;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Class that is responsible for creating and destroying the seam managed
- * persistence context
- *
- * @author Stuart Douglas
- *
- */
-public abstract class AbstractManagedPersistenceContextBeanLifecycle implements BeanLifecycle<EntityManager>
-{
-
- private final Class<?> proxyClass;
-
- private final Constructor<?> proxyConstructor;
-
- private final BeanManager manager;
-
- private static final Logger log = LoggerFactory.getLogger(AbstractManagedPersistenceContextBeanLifecycle.class);
-
- private PersistenceContexts persistenceContexts;
-
- protected AbstractManagedPersistenceContextBeanLifecycle(BeanManager manager, ClassLoader loader)
- {
- this.manager = manager;
- proxyClass = Proxy.getProxyClass(loader, EntityManager.class, Serializable.class, PersistenceContext.class);
-
- try
- {
- proxyConstructor = proxyClass.getConstructor(InvocationHandler.class);
- }
- catch (Exception e)
- {
- throw new RuntimeException(e);
- }
- }
-
- /**
- * creates the proxy
- */
- public EntityManager create(Bean<EntityManager> bean, CreationalContext<EntityManager> arg0)
- {
- try
- {
- EntityManagerFactory emf = getEntityManagerFactory();
- EntityManager entityManager = emf.createEntityManager();
- ManagedPersistenceContextProxyHandler handler = new ManagedPersistenceContextProxyHandler(entityManager, manager, bean.getQualifiers(), getPersistenceContexts());
- EntityManager proxy = (EntityManager) proxyConstructor.newInstance(handler);
- return proxy;
- }
- catch (Exception e)
- {
- throw new RuntimeException(e);
- }
- }
-
- public void destroy(Bean<EntityManager> bean, EntityManager em, CreationalContext<EntityManager> arg1)
- {
- em.close();
- arg1.release();
- try
- {
- getPersistenceContexts().untouch((PersistenceContext) em);
- }
- catch (ContextNotActiveException e)
- {
- log.debug("Could not untouch PersistenceContext as conversation scope not active");
- }
- }
-
- protected abstract EntityManagerFactory getEntityManagerFactory();
-
- private PersistenceContexts getPersistenceContexts()
- {
- if (persistenceContexts == null)
- {
- Bean<PersistenceContexts> bean = (Bean) manager.resolve(manager.getBeans(PersistenceContexts.class, DefaultLiteral.INSTANCE));
- CreationalContext<PersistenceContexts> ctx = manager.createCreationalContext(bean);
- persistenceContexts = (PersistenceContexts) manager.getReference(bean, PersistenceContexts.class, ctx);
- }
- return persistenceContexts;
- }
-}
Modified: modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/HibernatePersistenceProvider.java
===================================================================
--- modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/HibernatePersistenceProvider.java 2010-08-28 02:48:04 UTC (rev 13662)
+++ modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/HibernatePersistenceProvider.java 2010-08-30 07:00:01 UTC (rev 13663)
@@ -8,15 +8,12 @@
import javax.persistence.EntityManager;
import javax.transaction.Synchronization;
-import org.hibernate.EntityMode;
import org.hibernate.FlushMode;
import org.hibernate.Session;
-import org.hibernate.StaleStateException;
import org.hibernate.TransientObjectException;
-import org.hibernate.metadata.ClassMetadata;
import org.hibernate.proxy.HibernateProxy;
-import org.hibernate.type.VersionType;
import org.jboss.seam.persistence.transaction.FlushModeType;
+import org.jboss.weld.extensions.core.Veto;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -29,6 +26,7 @@
* @author Stuart Douglas
*
*/
+@Veto
public class HibernatePersistenceProvider extends SeamPersistenceProvider
{
@@ -36,9 +34,9 @@
Instance<PersistenceContextsImpl> persistenceContexts;
private static Logger log = LoggerFactory.getLogger(HibernatePersistenceProvider.class);
- private static Class FULL_TEXT_SESSION_PROXY_CLASS;
+ private static Class<?> FULL_TEXT_SESSION_PROXY_CLASS;
private static Method FULL_TEXT_SESSION_CONSTRUCTOR;
- private static Class FULL_TEXT_ENTITYMANAGER_PROXY_CLASS;
+ private static Class<?> FULL_TEXT_ENTITYMANAGER_PROXY_CLASS;
private static Method FULL_TEXT_ENTITYMANAGER_CONSTRUCTOR;
static
{
@@ -47,7 +45,7 @@
String version = null;
try
{
- Class searchVersionClass = Class.forName("org.hibernate.search.Version");
+ Class<?> searchVersionClass = Class.forName("org.hibernate.search.Version");
Field versionField = searchVersionClass.getDeclaredField("VERSION");
version = (String) versionField.get(null);
}
@@ -57,7 +55,7 @@
}
if (version != null)
{
- Class searchClass = Class.forName("org.hibernate.search.Search");
+ Class<?> searchClass = Class.forName("org.hibernate.search.Search");
try
{
FULL_TEXT_SESSION_CONSTRUCTOR = searchClass.getDeclaredMethod("getFullTextSession", Session.class);
@@ -68,7 +66,7 @@
FULL_TEXT_SESSION_CONSTRUCTOR = searchClass.getDeclaredMethod("createFullTextSession", Session.class);
}
FULL_TEXT_SESSION_PROXY_CLASS = Class.forName("org.jboss.seam.persistence.FullTextHibernateSessionProxy");
- Class jpaSearchClass = Class.forName("org.hibernate.search.jpa.Search");
+ Class<?> jpaSearchClass = Class.forName("org.hibernate.search.jpa.Search");
try
{
FULL_TEXT_ENTITYMANAGER_CONSTRUCTOR = jpaSearchClass.getDeclaredMethod("getFullTextEntityManager", EntityManager.class);
@@ -151,32 +149,6 @@
}
@Override
- public Object getVersion(Object bean, EntityManager entityManager)
- {
- try
- {
- return getVersion(bean, getSession(entityManager));
- }
- catch (NotHibernateException nhe)
- {
- return super.getVersion(bean, entityManager);
- }
- }
-
- @Override
- public void checkVersion(Object bean, EntityManager entityManager, Object oldVersion, Object version)
- {
- try
- {
- checkVersion(bean, getSession(entityManager), oldVersion, version);
- }
- catch (NotHibernateException nhe)
- {
- super.checkVersion(bean, entityManager, oldVersion, version);
- }
- }
-
- @Override
public boolean registerSynchronization(Synchronization sync, EntityManager entityManager)
{
try
@@ -210,69 +182,83 @@
}
}
- public static void checkVersion(Object value, Session session, Object oldVersion, Object version)
+ private Session getSession(EntityManager entityManager)
{
- ClassMetadata classMetadata = getClassMetadata(value, session);
- VersionType versionType = (VersionType) classMetadata.getPropertyTypes()[classMetadata.getVersionProperty()];
- if (!versionType.isEqual(oldVersion, version))
+ Object delegate = entityManager.getDelegate();
+ if (delegate instanceof Session)
{
- throw new StaleStateException("current database version number does not match passivated version number");
+ return (Session) delegate;
}
+ else
+ {
+ throw new NotHibernateException();
+ }
}
- public static Object getVersion(Object value, Session session)
+ /**
+ * Wrap the Hibernate Session in a proxy that implements FullTextSession if
+ * Hibernate Search is available in the classpath.
+ */
+ static Session proxySession(Session session)
{
- ClassMetadata classMetadata = getClassMetadata(value, session);
- return classMetadata != null && classMetadata.isVersioned() ? classMetadata.getVersion(value, EntityMode.POJO) : null;
- }
-
- private static ClassMetadata getClassMetadata(Object value, Session session)
- {
- Class entityClass = getEntityClass(value);
- ClassMetadata classMetadata = null;
- if (entityClass != null)
+ if (FULL_TEXT_SESSION_PROXY_CLASS == null)
{
- classMetadata = session.getSessionFactory().getClassMetadata(entityClass);
- if (classMetadata == null)
+ return session;
+ }
+ else
+ {
+ try
{
- throw new IllegalArgumentException("Could not find ClassMetadata object for entity class: " + entityClass.getName());
+ return (Session) FULL_TEXT_SESSION_CONSTRUCTOR.invoke(null, session);
}
+ catch (Exception e)
+ {
+ log.warn("Unable to wrap into a FullTextSessionProxy, regular SessionProxy returned", e);
+ return session;
+ }
}
- return classMetadata;
}
/**
- * Returns the class of the specified Hibernate entity
+ * Wrap the delegate Hibernate Session in a proxy that implements
+ * FullTextSession if Hibernate Search is available in the classpath.
*/
@Override
- public Class getBeanClass(Object bean)
+ public Object proxyDelegate(Object delegate)
{
- return getEntityClass(bean);
+ try
+ {
+ return proxySession((Session) delegate);
+ }
+ catch (NotHibernateException nhe)
+ {
+ return super.proxyDelegate(delegate);
+ }
+ catch (Exception e)
+ {
+ throw new RuntimeException("could not proxy delegate", e);
+ }
}
- public static Class getEntityClass(Object bean)
+ @Override
+ public EntityManager proxyEntityManager(EntityManager entityManager)
{
- /*
- * Class clazz = null; try { clazz = Entity.forBean(bean).getBeanClass();
- * } catch (NotEntityException e) { // It's ok, try some other methods }
- *
- * if (clazz == null) { clazz = Hibernate.getClass(bean); }
- *
- * return clazz;
- */
- return null;
- }
-
- private Session getSession(EntityManager entityManager)
- {
- Object delegate = entityManager.getDelegate();
- if (delegate instanceof Session)
+ if (FULL_TEXT_ENTITYMANAGER_PROXY_CLASS == null)
{
- return (Session) delegate;
+ return super.proxyEntityManager(entityManager);
}
else
{
- throw new NotHibernateException();
+ try
+ {
+ return (EntityManager) FULL_TEXT_ENTITYMANAGER_CONSTRUCTOR.invoke(null, super.proxyEntityManager(entityManager));
+ }
+ catch (Exception e)
+ {
+ // throw new
+ // RuntimeException("could not proxy FullTextEntityManager", e);
+ return super.proxyEntityManager(entityManager);
+ }
}
}
Copied: modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/ManagedPersistenceContext.java (from rev 13639, modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/PersistenceContext.java)
===================================================================
--- modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/ManagedPersistenceContext.java (rev 0)
+++ modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/ManagedPersistenceContext.java 2010-08-30 07:00:01 UTC (rev 13663)
@@ -0,0 +1,44 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc., and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.seam.persistence;
+
+import java.lang.annotation.Annotation;
+import java.util.Set;
+
+import org.jboss.seam.persistence.transaction.FlushModeType;
+
+/**
+ * Support for changing flushmodes for an existing persistence context.
+ *
+ * @author Gavin King
+ * @author Stuart Douglas
+ *
+ */
+public interface ManagedPersistenceContext
+{
+ public void changeFlushMode(FlushModeType flushMode);
+
+ public Set<Annotation> getQualifiers();
+
+ public Class<?> getBeanType();
+
+}
Modified: modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/ManagedPersistenceContextBeanLifecycle.java
===================================================================
--- modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/ManagedPersistenceContextBeanLifecycle.java 2010-08-28 02:48:04 UTC (rev 13662)
+++ modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/ManagedPersistenceContextBeanLifecycle.java 2010-08-30 07:00:01 UTC (rev 13663)
@@ -21,41 +21,134 @@
*/
package org.jboss.seam.persistence;
+import java.io.Serializable;
import java.lang.annotation.Annotation;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Proxy;
import java.util.Set;
+import javax.enterprise.context.ContextNotActiveException;
import javax.enterprise.context.spi.CreationalContext;
import javax.enterprise.inject.spi.Bean;
import javax.enterprise.inject.spi.BeanManager;
+import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
+import org.jboss.weld.extensions.bean.BeanLifecycle;
+import org.jboss.weld.extensions.literal.DefaultLiteral;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
/**
* SMPC lifecycle for SMPC's configured via @SeamManaged
*
* @author Stuart Douglas
*
*/
-public class ManagedPersistenceContextBeanLifecycle extends AbstractManagedPersistenceContextBeanLifecycle
+public class ManagedPersistenceContextBeanLifecycle implements BeanLifecycle<EntityManager>
{
+ private final Class<?> proxyClass;
+ private final Constructor<?> proxyConstructor;
+
+ private static final Logger log = LoggerFactory.getLogger(ManagedPersistenceContextBeanLifecycle.class);
+
+ private PersistenceContexts persistenceContexts;
+
+ private SeamPersistenceProvider persistenceProvider;
+
protected final Annotation[] qualifiers;
+
protected final BeanManager manager;
private EntityManagerFactory emf;
public ManagedPersistenceContextBeanLifecycle(Set<Annotation> qualifiers, ClassLoader loader, BeanManager manager)
{
- super(manager, loader);
+ this.manager = manager;
+ proxyClass = Proxy.getProxyClass(loader, EntityManager.class, Serializable.class, ManagedPersistenceContext.class);
+ try
+ {
+ proxyConstructor = proxyClass.getConstructor(InvocationHandler.class);
+ }
+ catch (Exception e)
+ {
+ throw new RuntimeException(e);
+ }
this.qualifiers = new Annotation[qualifiers.size()];
int i = 0;
for (Annotation a : qualifiers)
{
this.qualifiers[i++] = a;
}
- this.manager = manager;
}
/**
+ * creates the proxy
+ */
+ public EntityManager create(Bean<EntityManager> bean, CreationalContext<EntityManager> arg0)
+ {
+ try
+ {
+ EntityManagerFactory emf = getEntityManagerFactory();
+ EntityManager entityManager = emf.createEntityManager();
+ entityManager = getPersistenceProvider().proxyEntityManager(entityManager);
+ ManagedPersistenceContextProxyHandler handler = new ManagedPersistenceContextProxyHandler(entityManager, manager, bean.getQualifiers(), getPersistenceContexts());
+ EntityManager proxy = (EntityManager) proxyConstructor.newInstance(handler);
+ return proxy;
+ }
+ catch (Exception e)
+ {
+ throw new RuntimeException(e);
+ }
+ }
+
+ public void destroy(Bean<EntityManager> bean, EntityManager em, CreationalContext<EntityManager> arg1)
+ {
+ em.close();
+ arg1.release();
+ try
+ {
+ getPersistenceContexts().untouch((ManagedPersistenceContext) em);
+ }
+ catch (ContextNotActiveException e)
+ {
+ log.debug("Could not untouch PersistenceContext as conversation scope not active");
+ }
+ }
+
+ private PersistenceContexts getPersistenceContexts()
+ {
+ if (persistenceContexts == null)
+ {
+ Bean<PersistenceContexts> bean = (Bean) manager.resolve(manager.getBeans(PersistenceContexts.class, DefaultLiteral.INSTANCE));
+ if (bean == null)
+ {
+ throw new RuntimeException("Could not find PersistenceContexts bean");
+ }
+ CreationalContext<PersistenceContexts> ctx = manager.createCreationalContext(bean);
+ persistenceContexts = (PersistenceContexts) manager.getReference(bean, PersistenceContexts.class, ctx);
+ }
+ return persistenceContexts;
+ }
+
+ private SeamPersistenceProvider getPersistenceProvider()
+ {
+ if (persistenceProvider == null)
+ {
+ Bean<SeamPersistenceProvider> bean = (Bean) manager.resolve(manager.getBeans(SeamPersistenceProvider.class, DefaultLiteral.INSTANCE));
+ if (bean == null)
+ {
+ throw new RuntimeException("Could not find SeamPersistenceProvider bean");
+ }
+ CreationalContext<SeamPersistenceProvider> ctx = manager.createCreationalContext(bean);
+ persistenceProvider = (SeamPersistenceProvider) manager.getReference(bean, SeamPersistenceProvider.class, ctx);
+ }
+ return persistenceProvider;
+ }
+
+ /**
* lazily resolve the relevant EMF
*/
protected EntityManagerFactory getEntityManagerFactory()
Modified: modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/ManagedPersistenceContextExtension.java
===================================================================
--- modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/ManagedPersistenceContextExtension.java 2010-08-28 02:48:04 UTC (rev 13662)
+++ modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/ManagedPersistenceContextExtension.java 2010-08-30 07:00:01 UTC (rev 13663)
@@ -108,6 +108,26 @@
{
event.setAnnotatedType(modifiedType.create());
}
+ // prevent the install of HibernatePersistenceProvider is hibernate is not
+ // present
+ if (event.getAnnotatedType().getJavaClass() == HibernatePersistenceProvider.class)
+ {
+ try
+ {
+ if (Thread.currentThread().getContextClassLoader() != null)
+ {
+ Thread.currentThread().getContextClassLoader().loadClass("org.hibernate.Session");
+ }
+ else
+ {
+ Class.forName("org.hibernate.Session");
+ }
+ }
+ catch (ClassNotFoundException e)
+ {
+ event.veto();
+ }
+ }
}
public void registerManagedPersistenceContext(Set<Annotation> qualifiers, Class<? extends Annotation> scope, BeanManager manager, ClassLoader loader)
@@ -117,7 +137,7 @@
BeanBuilder<EntityManager> builder = new BeanBuilder<EntityManager>(manager).defineBeanFromAnnotatedType(typeBuilder.create());
builder.setQualifiers(qualifiers);
builder.setScope(scope);
- builder.getTypes().add(PersistenceContext.class);
+ builder.getTypes().add(ManagedPersistenceContext.class);
builder.getTypes().add(Object.class);
ManagedPersistenceContextBeanLifecycle lifecycle = new ManagedPersistenceContextBeanLifecycle(qualifiers, loader, manager);
builder.setBeanLifecycle(lifecycle);
Modified: modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/ManagedPersistenceContextProxyHandler.java
===================================================================
--- modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/ManagedPersistenceContextProxyHandler.java 2010-08-28 02:48:04 UTC (rev 13662)
+++ modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/ManagedPersistenceContextProxyHandler.java 2010-08-30 07:00:01 UTC (rev 13663)
@@ -25,7 +25,6 @@
import java.lang.annotation.Annotation;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
-import java.util.HashSet;
import java.util.Set;
import javax.enterprise.context.ContextNotActiveException;
@@ -58,8 +57,6 @@
private final Instance<SeamTransaction> userTransactionInstance;
- private final Set<Annotation> qualifiers;
-
private transient boolean synchronizationRegistered;
private final PersistenceContexts persistenceContexts;
@@ -73,7 +70,6 @@
super(delegate, beanManager, qualifiers);
this.delegate = delegate;
this.userTransactionInstance = InstanceResolver.getInstance(SeamTransaction.class, beanManager, DefaultTransactionLiteral.INSTANCE);
- this.qualifiers = new HashSet<Annotation>(qualifiers);
this.persistenceContexts = persistenceContexts;
}
@@ -83,7 +79,7 @@
{
joinTransaction();
}
- touch((PersistenceContext) proxy);
+ touch((ManagedPersistenceContext) proxy);
return super.invoke(proxy, method, args);
}
@@ -108,7 +104,7 @@
}
}
- void touch(PersistenceContext delegate)
+ void touch(ManagedPersistenceContext delegate)
{
if (!persistenceContextsTouched)
{
Deleted: modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/PersistenceContext.java
===================================================================
--- modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/PersistenceContext.java 2010-08-28 02:48:04 UTC (rev 13662)
+++ modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/PersistenceContext.java 2010-08-30 07:00:01 UTC (rev 13663)
@@ -1,43 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright 2010, Red Hat, Inc., and individual contributors
- * by the @authors tag. See the copyright.txt in the distribution for a
- * full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.jboss.seam.persistence;
-
-import java.lang.annotation.Annotation;
-import java.util.Set;
-
-import org.jboss.seam.persistence.transaction.FlushModeType;
-
-/**
- * Support for changing flushmodes for an existing persistence context.
- *
- * @author Gavin King
- * @author Stuart Douglas
- *
- */
-public interface PersistenceContext
-{
- public void changeFlushMode(FlushModeType flushMode);
-
- public Set<Annotation> getQualifiers();
-
- public Class<?> getBeanType();
-}
Modified: modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/PersistenceContexts.java
===================================================================
--- modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/PersistenceContexts.java 2010-08-28 02:48:04 UTC (rev 13662)
+++ modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/PersistenceContexts.java 2010-08-30 07:00:01 UTC (rev 13663)
@@ -13,9 +13,9 @@
public abstract Set<PersistenceContextDefintition> getTouchedContexts();
- public abstract void touch(PersistenceContext context);
+ public abstract void touch(ManagedPersistenceContext context);
- public abstract void untouch(PersistenceContext context);
+ public abstract void untouch(ManagedPersistenceContext context);
public abstract void changeFlushMode(FlushModeType flushMode);
Modified: modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/PersistenceContextsImpl.java
===================================================================
--- modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/PersistenceContextsImpl.java 2010-08-28 02:48:04 UTC (rev 13662)
+++ modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/PersistenceContextsImpl.java 2010-08-30 07:00:01 UTC (rev 13663)
@@ -44,7 +44,7 @@
@Inject
@Any
- Instance<PersistenceContext> persistenceContexts;
+ Instance<ManagedPersistenceContext> persistenceContexts;
@Inject
Instance<SeamPersistenceProvider> persistenceProvider;
@@ -73,12 +73,12 @@
return Collections.unmodifiableSet(set);
}
- public void touch(PersistenceContext context)
+ public void touch(ManagedPersistenceContext context)
{
set.add(new PersistenceContextDefintition(context.getQualifiers(), context.getBeanType()));
}
- public void untouch(PersistenceContext context)
+ public void untouch(ManagedPersistenceContext context)
{
set.remove(new PersistenceContextDefintition(context.getQualifiers(), context.getBeanType()));
}
@@ -111,7 +111,7 @@
private void changeFlushModes()
{
- for (PersistenceContext context : persistenceContexts)
+ for (ManagedPersistenceContext context : persistenceContexts)
{
if (set.contains(new PersistenceContextDefintition(context.getQualifiers(), context.getBeanType())))
try
Modified: modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/SeamPersistenceProvider.java
===================================================================
--- modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/SeamPersistenceProvider.java 2010-08-28 02:48:04 UTC (rev 13662)
+++ modules/persistence/trunk/impl/src/main/java/org/jboss/seam/persistence/SeamPersistenceProvider.java 2010-08-30 07:00:01 UTC (rev 13663)
@@ -32,6 +32,7 @@
import javax.transaction.Synchronization;
import org.jboss.seam.persistence.transaction.FlushModeType;
+import org.jboss.weld.extensions.defaultbean.DefaultBean;
/**
* Abstraction layer for persistence providers (JPA implementations). This class
@@ -46,6 +47,7 @@
* @author Stuart Douglas
*
*/
+@DefaultBean(type = SeamPersistenceProvider.class)
public class SeamPersistenceProvider
{
public enum Feature
@@ -228,6 +230,11 @@
return delegate;
}
+ public EntityManager proxyEntityManager(EntityManager entityManager)
+ {
+ return entityManager;
+ }
+
/**
* Returns the class of an entity bean instance
*
Modified: modules/persistence/trunk/impl/src/test/java/org/jboss/seam/persistence/test/EntityInjectionTest.java
===================================================================
--- modules/persistence/trunk/impl/src/test/java/org/jboss/seam/persistence/test/EntityInjectionTest.java 2010-08-28 02:48:04 UTC (rev 13662)
+++ modules/persistence/trunk/impl/src/test/java/org/jboss/seam/persistence/test/EntityInjectionTest.java 2010-08-30 07:00:01 UTC (rev 13663)
@@ -36,6 +36,7 @@
import org.jboss.seam.persistence.transaction.DefaultTransaction;
import org.jboss.seam.persistence.transaction.SeamTransaction;
import org.jboss.seam.persistence.transaction.TransactionExtension;
+import org.jboss.seam.persistence.transaction.scope.TransactionScopeExtension;
import org.jboss.seam.persistence.util.NamingUtils;
import org.jboss.seam.transactions.test.util.ArtifactNames;
import org.jboss.seam.transactions.test.util.HelloService;
@@ -66,6 +67,7 @@
war.addLibraries(MavenArtifactResolver.resolve(ArtifactNames.WELD_EXTENSIONS));
war.addLibraries(MavenArtifactResolver.resolve(ArtifactNames.SEAM_PERSISTENCE_API));
war.addPackage(TransactionExtension.class.getPackage());
+ war.addPackage(TransactionScopeExtension.class.getPackage());
war.addPackage(InjectionEventListener.class.getPackage());
war.addPackage(NamingUtils.class.getPackage());
war.addClasses(EntityInjectionTest.class, Hotel.class, ManagedPersistenceContextProvider.class, HelloService.class);
Modified: modules/persistence/trunk/impl/src/test/java/org/jboss/seam/persistence/test/ManagedPersistenceContextELTest.java
===================================================================
--- modules/persistence/trunk/impl/src/test/java/org/jboss/seam/persistence/test/ManagedPersistenceContextELTest.java 2010-08-28 02:48:04 UTC (rev 13662)
+++ modules/persistence/trunk/impl/src/test/java/org/jboss/seam/persistence/test/ManagedPersistenceContextELTest.java 2010-08-30 07:00:01 UTC (rev 13663)
@@ -35,6 +35,7 @@
import org.jboss.seam.persistence.transaction.DefaultTransaction;
import org.jboss.seam.persistence.transaction.SeamTransaction;
import org.jboss.seam.persistence.transaction.TransactionExtension;
+import org.jboss.seam.persistence.transaction.scope.TransactionScopeExtension;
import org.jboss.seam.persistence.util.NamingUtils;
import org.jboss.seam.transactions.test.util.ArtifactNames;
import org.jboss.seam.transactions.test.util.HelloService;
@@ -61,6 +62,7 @@
war.addPackage(TransactionExtension.class.getPackage());
war.addPackage(PersistenceContextExtension.class.getPackage());
war.addPackage(TransactionExtension.class.getPackage());
+ war.addPackage(TransactionScopeExtension.class.getPackage());
war.addPackage(NamingUtils.class.getPackage());
war.addClasses(ManagedPersistenceContextELTest.class, Hotel.class, ManagedPersistenceContextProvider.class, HotelNameProducer.class, HelloService.class);
war.addWebResource("META-INF/persistence.xml", "classes/META-INF/persistence.xml");
Modified: modules/persistence/trunk/impl/src/test/java/org/jboss/seam/persistence/test/ManagedPersistenceContextTest.java
===================================================================
--- modules/persistence/trunk/impl/src/test/java/org/jboss/seam/persistence/test/ManagedPersistenceContextTest.java 2010-08-28 02:48:04 UTC (rev 13662)
+++ modules/persistence/trunk/impl/src/test/java/org/jboss/seam/persistence/test/ManagedPersistenceContextTest.java 2010-08-30 07:00:01 UTC (rev 13663)
@@ -39,6 +39,7 @@
import org.jboss.seam.persistence.transaction.DefaultTransaction;
import org.jboss.seam.persistence.transaction.SeamTransaction;
import org.jboss.seam.persistence.transaction.TransactionExtension;
+import org.jboss.seam.persistence.transaction.scope.TransactionScopeExtension;
import org.jboss.seam.persistence.util.NamingUtils;
import org.jboss.seam.transactions.test.util.ArtifactNames;
import org.jboss.seam.transactions.test.util.HelloService;
@@ -63,6 +64,7 @@
war.addLibraries(MavenArtifactResolver.resolve(ArtifactNames.SEAM_PERSISTENCE_API));
war.addPackage(TransactionExtension.class.getPackage());
war.addPackage(PersistenceContextExtension.class.getPackage());
+ war.addPackage(TransactionScopeExtension.class.getPackage());
war.addPackage(NamingUtils.class.getPackage());
war.addClasses(ManagedPersistenceContextTest.class, Hotel.class, ManagedPersistenceContextProvider.class, HelloService.class);
war.addWebResource("META-INF/persistence.xml", "classes/META-INF/persistence.xml");
Modified: modules/persistence/trunk/impl/src/test/java/org/jboss/seam/persistence/transactions/test/TransactionAttributeInterceptorTest.java
===================================================================
--- modules/persistence/trunk/impl/src/test/java/org/jboss/seam/persistence/transactions/test/TransactionAttributeInterceptorTest.java 2010-08-28 02:48:04 UTC (rev 13662)
+++ modules/persistence/trunk/impl/src/test/java/org/jboss/seam/persistence/transactions/test/TransactionAttributeInterceptorTest.java 2010-08-30 07:00:01 UTC (rev 13663)
@@ -42,6 +42,7 @@
import org.jboss.seam.persistence.transaction.SeamTransaction;
import org.jboss.seam.persistence.transaction.TransactionExtension;
import org.jboss.seam.persistence.transaction.TransactionInterceptor;
+import org.jboss.seam.persistence.transaction.scope.TransactionScopeExtension;
import org.jboss.seam.persistence.util.NamingUtils;
import org.jboss.seam.transactions.test.util.ArtifactNames;
import org.jboss.seam.transactions.test.util.DontRollBackException;
@@ -76,6 +77,7 @@
war.addLibraries(MavenArtifactResolver.resolve(ArtifactNames.SEAM_PERSISTENCE_API));
war.addPackage(TransactionExtension.class.getPackage());
war.addPackage(SeamPersistenceProvider.class.getPackage());
+ war.addPackage(TransactionScopeExtension.class.getPackage());
war.addPackage(NamingUtils.class.getPackage());
war.addClasses(TransactionAttributeInterceptorTest.class, TransactionAttributeManagedBean.class, HelloService.class, Hotel.class, EntityManagerProvider.class, DontRollBackException.class);
war.addWebResource("META-INF/persistence.xml", "classes/META-INF/persistence.xml");
Modified: modules/persistence/trunk/impl/src/test/java/org/jboss/seam/persistence/transactions/test/TransactionInterceptorTest.java
===================================================================
--- modules/persistence/trunk/impl/src/test/java/org/jboss/seam/persistence/transactions/test/TransactionInterceptorTest.java 2010-08-28 02:48:04 UTC (rev 13662)
+++ modules/persistence/trunk/impl/src/test/java/org/jboss/seam/persistence/transactions/test/TransactionInterceptorTest.java 2010-08-30 07:00:01 UTC (rev 13663)
@@ -42,6 +42,7 @@
import org.jboss.seam.persistence.transaction.SeamTransaction;
import org.jboss.seam.persistence.transaction.TransactionExtension;
import org.jboss.seam.persistence.transaction.TransactionInterceptor;
+import org.jboss.seam.persistence.transaction.scope.TransactionScopeExtension;
import org.jboss.seam.persistence.util.NamingUtils;
import org.jboss.seam.transactions.test.util.ArtifactNames;
import org.jboss.seam.transactions.test.util.DontRollBackException;
@@ -75,6 +76,7 @@
war.addLibraries(MavenArtifactResolver.resolve(ArtifactNames.WELD_EXTENSIONS));
war.addLibraries(MavenArtifactResolver.resolve(ArtifactNames.SEAM_PERSISTENCE_API));
war.addPackage(TransactionExtension.class.getPackage());
+ war.addPackage(TransactionScopeExtension.class.getPackage());
war.addPackage(NamingUtils.class.getPackage());
war.addPackage(SeamPersistenceProvider.class.getPackage());
war.addClasses(TransactionInterceptorTest.class, TransactionManagedBean.class, HelloService.class, Hotel.class, EntityManagerProvider.class, DontRollBackException.class);
13 years, 9 months
Seam SVN: r13662 - in modules/xml/trunk/impl/src: main/java/org/jboss/seam/xml/model and 3 other directories.
by seam-commits@lists.jboss.org
Author: swd847
Date: 2010-08-27 22:48:04 -0400 (Fri, 27 Aug 2010)
New Revision: 13662
Added:
modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/util/Reflections.java
Removed:
modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/model/AbstractFieldXmlItem.java
modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/model/FieldXmlItem.java
Modified:
modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/bootstrap/XmlExtension.java
modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/model/ClassXmlItem.java
modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/model/PropertyXmlItem.java
modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/parser/namespace/PackageNamespaceElementResolver.java
modules/xml/trunk/impl/src/test/java/org/jboss/seam/xml/test/NamespaceResolverTest.java
Log:
refactor property xml items to use PropertyQuery
Modified: modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/bootstrap/XmlExtension.java
===================================================================
--- modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/bootstrap/XmlExtension.java 2010-08-28 01:45:24 UTC (rev 13661)
+++ modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/bootstrap/XmlExtension.java 2010-08-28 02:48:04 UTC (rev 13662)
@@ -129,7 +129,7 @@
{
for (String i : r.getProblems())
{
- errors.add(new RuntimeException(i));
+ errors.add(new Exception(i));
}
}
for (BeanResult<?> b : r.getFlattenedBeans())
Deleted: modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/model/AbstractFieldXmlItem.java
===================================================================
--- modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/model/AbstractFieldXmlItem.java 2010-08-28 01:45:24 UTC (rev 13661)
+++ modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/model/AbstractFieldXmlItem.java 2010-08-28 02:48:04 UTC (rev 13662)
@@ -1,179 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright 2010, Red Hat, Inc., and individual contributors
- * by the @authors tag. See the copyright.txt in the distribution for a
- * full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.jboss.seam.xml.model;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import javax.enterprise.inject.spi.BeanManager;
-
-import org.jboss.seam.xml.core.BeanResult;
-import org.jboss.seam.xml.fieldset.ArrayFieldSet;
-import org.jboss.seam.xml.fieldset.CollectionFieldSet;
-import org.jboss.seam.xml.fieldset.FieldValueObject;
-import org.jboss.seam.xml.fieldset.MapFieldSet;
-import org.jboss.seam.xml.fieldset.SimpleFieldValue;
-import org.jboss.seam.xml.util.TypeOccuranceInformation;
-import org.jboss.seam.xml.util.XmlConfigurationException;
-import org.jboss.weld.extensions.util.properties.Property;
-
-/**
- * represents either a field or a property of a bean
- *
- * @author stuart
- *
- */
-public abstract class AbstractFieldXmlItem extends AbstractXmlItem
-{
-
- protected Property<?> property;
- protected FieldValueObject fieldValue;
- protected HashSet<TypeOccuranceInformation> allowed = new HashSet<TypeOccuranceInformation>();
- private final Class<?> overridenFieldType;
- List<BeanResult<?>> inlineBeans = new ArrayList<BeanResult<?>>();
-
- public AbstractFieldXmlItem(XmlItemType type, XmlItem parent, Class<?> javaClass, String innerText, Map<String, String> attributes, Class<?> overridenFieldType, String document, int lineno)
- {
- super(type, parent, javaClass, innerText, attributes, document, lineno);
- this.overridenFieldType = overridenFieldType;
- }
-
- public FieldValueObject getFieldValue()
- {
- return fieldValue;
- }
-
- @Override
- public boolean resolveChildren(BeanManager manager)
- {
- List<EntryXmlItem> mapEntries = new ArrayList<EntryXmlItem>();
- List<ValueXmlItem> valueEntries = new ArrayList<ValueXmlItem>();
- if (fieldValue == null)
- {
- for (XmlItem i : children)
- {
- if (i.getType() == XmlItemType.VALUE)
- {
- valueEntries.add((ValueXmlItem) i);
- }
- else if (i.getType() == XmlItemType.ENTRY)
- {
- mapEntries.add((EntryXmlItem) i);
- }
-
- }
- }
- if (!mapEntries.isEmpty() || !valueEntries.isEmpty())
- {
- if (Map.class.isAssignableFrom(getFieldType()))
- {
- if (!valueEntries.isEmpty())
- {
- throw new XmlConfigurationException("Map fields cannot have <value> elements as children,only <entry> elements Field:" + getDeclaringClass().getName() + '.' + getFieldName(), getDocument(), getLineno());
- }
- if (!mapEntries.isEmpty())
- {
- for (EntryXmlItem entry : mapEntries)
- {
- // resolve inline beans if nessesary
- Set<BeanResult<?>> beans = entry.getBeanResults(manager);
- inlineBeans.addAll(beans);
-
- }
- fieldValue = new MapFieldSet(property, mapEntries);
- }
- }
- else if (Collection.class.isAssignableFrom(getFieldType()) || getFieldType().isArray())
- {
- if (!mapEntries.isEmpty())
- {
- throw new XmlConfigurationException("Collection fields must be set using <value> not <entry> Field:" + getDeclaringClass().getName() + '.' + getFieldName(), getDocument(), getLineno());
- }
- if (!valueEntries.isEmpty())
- {
- for (ValueXmlItem value : valueEntries)
- {
- // resolve inline beans if nessesary
- BeanResult<?> result = value.getBeanResult(manager);
- if (result != null)
- {
- inlineBeans.add(result);
- }
- }
- if (getFieldType().isArray())
- {
- fieldValue = new ArrayFieldSet(property, valueEntries);
- }
- else
- {
- fieldValue = new CollectionFieldSet(property, valueEntries);
- }
- }
- }
- else
- {
- if (!mapEntries.isEmpty())
- {
- throw new XmlConfigurationException("Only Map fields can be set using <entry> Field:" + getDeclaringClass().getName() + '.' + getFieldName(), getDocument(), getLineno());
- }
- if (valueEntries.size() != 1)
- {
- throw new XmlConfigurationException("Non collection fields can only have a single <value> element Field:" + getDeclaringClass().getName() + '.' + getFieldName(), getDocument(), getLineno());
- }
- ValueXmlItem value = valueEntries.get(0);
- BeanResult<?> result = value.getBeanResult(manager);
- fieldValue = new SimpleFieldValue(parent.getJavaClass(), property, value.getValue(), overridenFieldType);
- if (result != null)
- {
- inlineBeans.add(result);
- }
- }
- }
- return true;
- }
-
- public Set<TypeOccuranceInformation> getAllowedItem()
- {
- return allowed;
- }
-
- public abstract Class<?> getFieldType();
-
- public abstract String getFieldName();
-
- public abstract Class<?> getDeclaringClass();
-
- public Collection<? extends BeanResult> getInlineBeans()
- {
- return inlineBeans;
- }
-
- public Class<?> getOverridenFieldType()
- {
- return overridenFieldType;
- }
-
-}
\ No newline at end of file
Modified: modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/model/ClassXmlItem.java
===================================================================
--- modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/model/ClassXmlItem.java 2010-08-28 01:45:24 UTC (rev 13661)
+++ modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/model/ClassXmlItem.java 2010-08-28 02:48:04 UTC (rev 13662)
@@ -24,7 +24,6 @@
import java.lang.annotation.Annotation;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
-import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
@@ -45,6 +44,11 @@
import org.jboss.seam.xml.util.XmlConfigurationException;
import org.jboss.weld.extensions.annotated.AnnotatedTypeBuilder;
import org.jboss.weld.extensions.util.Reflections;
+import org.jboss.weld.extensions.util.properties.Properties;
+import org.jboss.weld.extensions.util.properties.Property;
+import org.jboss.weld.extensions.util.properties.query.NamedPropertyCriteria;
+import org.jboss.weld.extensions.util.properties.query.PropertyQueries;
+import org.jboss.weld.extensions.util.properties.query.PropertyQuery;
public class ClassXmlItem extends AbstractXmlItem
{
@@ -69,38 +73,22 @@
return allowed;
}
- public Set<AbstractFieldXmlItem> getShorthandFieldValues()
+ public Set<PropertyXmlItem> getShorthandFieldValues()
{
- Set<AbstractFieldXmlItem> values = new HashSet<AbstractFieldXmlItem>();
+ Set<PropertyXmlItem> values = new HashSet<PropertyXmlItem>();
for (Entry<String, String> e : attributes.entrySet())
{
-
- Field field = Reflections.findDeclaredField(getJavaClass(), e.getKey());
- if (field != null)
+ PropertyQuery<Object> query = PropertyQueries.createQuery(getJavaClass());
+ query.addCriteria(new NamedPropertyCriteria(e.getKey()));
+ Property<?> property = query.getFirstResult();
+ if (property != null)
{
- values.add(new FieldXmlItem(this, field, e.getValue(), null, document, lineno));
+ values.add(new PropertyXmlItem(this, property, e.getValue(), null, document, lineno));
}
else
{
- String methodName = "set" + Character.toUpperCase(e.getKey().charAt(0)) + e.getKey().substring(1);
- if (Reflections.methodExists(getJavaClass(), methodName))
- {
- Set<Method> methods = Reflections.getAllDeclaredMethods(getJavaClass());
- for (Method m : methods)
- {
- if (m.getName().equals(methodName) && m.getParameterTypes().length == 1)
- {
- values.add(new PropertyXmlItem(this, e.getKey(), m, e.getValue(), document, lineno));
- break;
- }
- }
- }
- else
- {
- throw new XmlConfigurationException("Could not resolve field: " + e.getKey(), document, lineno);
- }
+ throw new XmlConfigurationException("Could not resolve field: " + e.getKey(), document, lineno);
}
-
}
return values;
}
@@ -126,7 +114,7 @@
// get all the field values from the bean
Set<String> configuredFields = new HashSet<String>();
List<FieldValueObject> fields = new ArrayList<FieldValueObject>();
- for (AbstractFieldXmlItem xi : getChildrenOfType(AbstractFieldXmlItem.class))
+ for (PropertyXmlItem xi : getChildrenOfType(PropertyXmlItem.class))
{
inlineBeans.addAll(xi.getInlineBeans());
FieldValueObject f = xi.getFieldValue();
@@ -137,7 +125,7 @@
}
}
- for (AbstractFieldXmlItem f : getShorthandFieldValues())
+ for (PropertyXmlItem f : getShorthandFieldValues())
{
if (configuredFields.contains(f.getFieldName()))
{
@@ -170,13 +158,20 @@
constList.add(item);
}
}
- for (FieldXmlItem item : getChildrenOfType(FieldXmlItem.class))
+ for (PropertyXmlItem item : getChildrenOfType(PropertyXmlItem.class))
{
- for (AnnotationXmlItem fi : item.getChildrenOfType(AnnotationXmlItem.class))
+ if (item.getField() != null)
{
- Annotation a = AnnotationUtils.createAnnotation(fi);
- type.addToField(item.getField(), a);
+ for (AnnotationXmlItem fi : item.getChildrenOfType(AnnotationXmlItem.class))
+ {
+ Annotation a = AnnotationUtils.createAnnotation(fi);
+ type.addToField(item.getField(), a);
+ }
}
+ else if (!item.getChildrenOfType(AnnotationXmlItem.class).isEmpty())
+ {
+ throw new XmlConfigurationException("Property's that do not have an underlying field may not have annotations added to them", item.getDocument(), item.getLineno());
+ }
}
for (MethodXmlItem item : getChildrenOfType(MethodXmlItem.class))
{
@@ -232,23 +227,13 @@
{
boolean override = !getChildrenOfType(ReplacesXmlItem.class).isEmpty();
boolean extend = !getChildrenOfType(ModifiesXmlItem.class).isEmpty();
- Field member;
- try
- {
- member = VirtualProducerField.class.getField("field");
- }
- catch (Exception e)
- {
- throw new RuntimeException(e);
- }
-
- BeanResultType beanType = BeanResultType.ADD;
if (override || extend)
{
throw new XmlConfigurationException("A virtual producer field may not containe <override> or <extend> tags", getDocument(), getLineno());
}
+ Field member = org.jboss.seam.xml.util.Reflections.getField(VirtualProducerField.class, "field");
ClassXmlItem vclass = new ClassXmlItem(null, VirtualProducerField.class, Collections.EMPTY_MAP, document, lineno);
- FieldXmlItem field = new FieldXmlItem(vclass, member, null, getJavaClass(), document, lineno);
+ PropertyXmlItem field = new PropertyXmlItem(vclass, Properties.createProperty(member), null, getJavaClass(), document, lineno);
vclass.addChild(field);
for (XmlItem i : this.getChildren())
{
Deleted: modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/model/FieldXmlItem.java
===================================================================
--- modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/model/FieldXmlItem.java 2010-08-28 01:45:24 UTC (rev 13661)
+++ modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/model/FieldXmlItem.java 2010-08-28 02:48:04 UTC (rev 13662)
@@ -1,110 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright 2010, Red Hat, Inc., and individual contributors
- * by the @authors tag. See the copyright.txt in the distribution for a
- * full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.jboss.seam.xml.model;
-
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-
-import org.jboss.seam.xml.fieldset.ConstantFieldValue;
-import org.jboss.seam.xml.fieldset.ELFieldValue;
-import org.jboss.seam.xml.fieldset.FieldValue;
-import org.jboss.seam.xml.fieldset.SimpleFieldValue;
-import org.jboss.seam.xml.util.TypeOccuranceInformation;
-import org.jboss.weld.extensions.util.properties.Properties;
-import org.jboss.weld.extensions.util.properties.Property;
-
-public class FieldXmlItem extends AbstractFieldXmlItem
-{
-
- private final Field field;
-
- public FieldXmlItem(XmlItem parent, Field c, String innerText, Class<?> overridenFieldType, String document, int lineno)
- {
- super(XmlItemType.FIELD, parent, parent.getJavaClass(), innerText, null, overridenFieldType, document, lineno);
- this.field = c;
- this.property = getFieldValueSetter(c);
-
- if (innerText != null && innerText.length() > 0)
- {
- FieldValue fv;
- if (innerText.matches("^#\\{.*\\}$"))
- {
- fv = new ELFieldValue(innerText);
- }
- else
- {
- fv = new ConstantFieldValue(innerText);
- }
- fieldValue = new SimpleFieldValue(parent.getJavaClass(), property, fv, overridenFieldType);
- }
- allowed.add(TypeOccuranceInformation.of(XmlItemType.ANNOTATION, null, null));
- allowed.add(TypeOccuranceInformation.of(XmlItemType.VALUE, null, null));
- allowed.add(TypeOccuranceInformation.of(XmlItemType.ENTRY, null, null));
- }
-
- public Field getField()
- {
- return field;
- }
-
- private Property getFieldValueSetter(Field field)
- {
- String fieldName = field.getName();
- String methodName = "set" + Character.toUpperCase(fieldName.charAt(0)) + fieldName.substring(1);
- Method setter = null;
- try
- {
- setter = field.getDeclaringClass().getMethod(methodName, field.getType());
- }
- catch (SecurityException e)
- {
-
- }
- catch (NoSuchMethodException e)
- {
-
- }
- if (setter != null)
- {
- return Properties.createProperty(setter);
- }
- return Properties.createProperty(field);
- }
-
- @Override
- public Class<?> getDeclaringClass()
- {
- return field.getDeclaringClass();
- }
-
- @Override
- public String getFieldName()
- {
- return field.getName();
- }
-
- @Override
- public Class<?> getFieldType()
- {
- return field.getType();
- }
-}
Modified: modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/model/PropertyXmlItem.java
===================================================================
--- modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/model/PropertyXmlItem.java 2010-08-28 01:45:24 UTC (rev 13661)
+++ modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/model/PropertyXmlItem.java 2010-08-28 02:48:04 UTC (rev 13662)
@@ -21,29 +21,55 @@
*/
package org.jboss.seam.xml.model;
-import java.lang.reflect.Method;
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import javax.enterprise.inject.spi.BeanManager;
+
+import org.jboss.seam.xml.core.BeanResult;
+import org.jboss.seam.xml.fieldset.ArrayFieldSet;
+import org.jboss.seam.xml.fieldset.CollectionFieldSet;
import org.jboss.seam.xml.fieldset.ConstantFieldValue;
import org.jboss.seam.xml.fieldset.ELFieldValue;
import org.jboss.seam.xml.fieldset.FieldValue;
import org.jboss.seam.xml.fieldset.FieldValueObject;
+import org.jboss.seam.xml.fieldset.MapFieldSet;
import org.jboss.seam.xml.fieldset.SimpleFieldValue;
-import org.jboss.weld.extensions.util.properties.Properties;
+import org.jboss.seam.xml.util.TypeOccuranceInformation;
+import org.jboss.seam.xml.util.XmlConfigurationException;
+import org.jboss.weld.extensions.util.properties.Property;
-public class PropertyXmlItem extends AbstractFieldXmlItem
+public class PropertyXmlItem extends AbstractXmlItem
{
+ private final Property<?> property;
+ private final HashSet<TypeOccuranceInformation> allowed = new HashSet<TypeOccuranceInformation>();
+ private final Class<?> fieldType;
+ private final List<BeanResult<?>> inlineBeans = new ArrayList<BeanResult<?>>();
- private final String name;
- private final Class<?> type;
- private final Class<?> declaringClass;
+ private FieldValueObject fieldValue;
- public PropertyXmlItem(XmlItem parent, String name, Method setter, String innerText, String document, int lineno)
+ public PropertyXmlItem(XmlItem parent, Property<?> property, String innerText, String document, int lineno)
{
- super(XmlItemType.FIELD, parent, parent.getJavaClass(), innerText, null, null, document, lineno);
- this.name = name;
- this.type = setter.getParameterTypes()[0];
- this.declaringClass = setter.getDeclaringClass();
- this.property = Properties.createProperty(setter);
+ this(parent, property, innerText, null, document, lineno);
+ }
+
+ public PropertyXmlItem(XmlItem parent, Property<?> property, String innerText, Class<?> overridenFieldType, String document, int lineno)
+ {
+ super(XmlItemType.FIELD, parent, parent.getJavaClass(), innerText, null, document, lineno);
+ this.property = property;
+ if (overridenFieldType == null)
+ {
+ this.fieldType = property.getJavaClass();
+ }
+ else
+ {
+ this.fieldType = overridenFieldType;
+ }
if (innerText != null && innerText.length() > 0)
{
FieldValue fv;
@@ -55,8 +81,11 @@
{
fv = new ConstantFieldValue(innerText);
}
- fieldValue = new SimpleFieldValue(parent.getJavaClass(), property, fv, null);
+ fieldValue = new SimpleFieldValue(parent.getJavaClass(), property, fv, fieldType);
}
+ allowed.add(new TypeOccuranceInformation(XmlItemType.VALUE, null, null));
+ allowed.add(new TypeOccuranceInformation(XmlItemType.ANNOTATION, null, null));
+ allowed.add(new TypeOccuranceInformation(XmlItemType.ENTRY, null, null));
}
public FieldValueObject getFieldValue()
@@ -65,21 +94,137 @@
}
@Override
+ public boolean resolveChildren(BeanManager manager)
+ {
+ List<EntryXmlItem> mapEntries = new ArrayList<EntryXmlItem>();
+ List<ValueXmlItem> valueEntries = new ArrayList<ValueXmlItem>();
+ if (fieldValue == null)
+ {
+ for (XmlItem i : children)
+ {
+ if (i.getType() == XmlItemType.VALUE)
+ {
+ valueEntries.add((ValueXmlItem) i);
+ }
+ else if (i.getType() == XmlItemType.ENTRY)
+ {
+ mapEntries.add((EntryXmlItem) i);
+ }
+
+ }
+ }
+ if (!mapEntries.isEmpty() || !valueEntries.isEmpty())
+ {
+ if (Map.class.isAssignableFrom(getFieldType()))
+ {
+ if (!valueEntries.isEmpty())
+ {
+ throw new XmlConfigurationException("Map fields cannot have <value> elements as children,only <entry> elements Field:" + getDeclaringClass().getName() + '.' + getFieldName(), getDocument(), getLineno());
+ }
+ if (!mapEntries.isEmpty())
+ {
+ for (EntryXmlItem entry : mapEntries)
+ {
+ // resolve inline beans if nessesary
+ Set<BeanResult<?>> beans = entry.getBeanResults(manager);
+ inlineBeans.addAll(beans);
+
+ }
+ fieldValue = new MapFieldSet(property, mapEntries);
+ }
+ }
+ else if (Collection.class.isAssignableFrom(getFieldType()) || getFieldType().isArray())
+ {
+ if (!mapEntries.isEmpty())
+ {
+ throw new XmlConfigurationException("Collection fields must be set using <value> not <entry> Field:" + getDeclaringClass().getName() + '.' + getFieldName(), getDocument(), getLineno());
+ }
+ if (!valueEntries.isEmpty())
+ {
+ for (ValueXmlItem value : valueEntries)
+ {
+ // resolve inline beans if nessesary
+ BeanResult<?> result = value.getBeanResult(manager);
+ if (result != null)
+ {
+ inlineBeans.add(result);
+ }
+ }
+ if (getFieldType().isArray())
+ {
+ fieldValue = new ArrayFieldSet(property, valueEntries);
+ }
+ else
+ {
+ fieldValue = new CollectionFieldSet(property, valueEntries);
+ }
+ }
+ }
+ else
+ {
+ if (!mapEntries.isEmpty())
+ {
+ throw new XmlConfigurationException("Only Map fields can be set using <entry> Field:" + getDeclaringClass().getName() + '.' + getFieldName(), getDocument(), getLineno());
+ }
+ if (valueEntries.size() != 1)
+ {
+ throw new XmlConfigurationException("Non collection fields can only have a single <value> element Field:" + getDeclaringClass().getName() + '.' + getFieldName(), getDocument(), getLineno());
+ }
+ ValueXmlItem value = valueEntries.get(0);
+ BeanResult<?> result = value.getBeanResult(manager);
+ fieldValue = new SimpleFieldValue(parent.getJavaClass(), property, value.getValue(), fieldType);
+ if (result != null)
+ {
+ inlineBeans.add(result);
+ }
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Returns the field that corresponds to the property, or null if it does not
+ * exist
+ *
+ * @return
+ */
+ public Field getField()
+ {
+ if (property.getMember() instanceof Field)
+ {
+ return (Field) property.getMember();
+ }
+ return org.jboss.seam.xml.util.Reflections.getField(parent.getJavaClass(), property.getName());
+ }
+
+ public Set<TypeOccuranceInformation> getAllowedItem()
+ {
+ return allowed;
+ }
+
+ public Collection<? extends BeanResult> getInlineBeans()
+ {
+ return inlineBeans;
+ }
+
public Class<?> getDeclaringClass()
{
- return declaringClass;
+ return property.getDeclaringClass();
}
- @Override
public String getFieldName()
{
- return name;
+ return property.getName();
}
- @Override
public Class<?> getFieldType()
{
- return type;
+ return fieldType;
}
+ public Property<?> getProperty()
+ {
+ return property;
+ }
+
}
Modified: modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/parser/namespace/PackageNamespaceElementResolver.java
===================================================================
--- modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/parser/namespace/PackageNamespaceElementResolver.java 2010-08-28 01:45:24 UTC (rev 13661)
+++ modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/parser/namespace/PackageNamespaceElementResolver.java 2010-08-28 02:48:04 UTC (rev 13662)
@@ -21,8 +21,6 @@
*/
package org.jboss.seam.xml.parser.namespace;
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
@@ -30,7 +28,6 @@
import org.jboss.seam.xml.model.AnnotationXmlItem;
import org.jboss.seam.xml.model.ClassXmlItem;
-import org.jboss.seam.xml.model.FieldXmlItem;
import org.jboss.seam.xml.model.MethodXmlItem;
import org.jboss.seam.xml.model.ParameterXmlItem;
import org.jboss.seam.xml.model.PropertyXmlItem;
@@ -40,6 +37,10 @@
import org.jboss.seam.xml.util.TypeOccuranceInformation;
import org.jboss.seam.xml.util.XmlConfigurationException;
import org.jboss.weld.extensions.util.Reflections;
+import org.jboss.weld.extensions.util.properties.Property;
+import org.jboss.weld.extensions.util.properties.query.NamedPropertyCriteria;
+import org.jboss.weld.extensions.util.properties.query.PropertyQueries;
+import org.jboss.weld.extensions.util.properties.query.PropertyQuery;
public class PackageNamespaceElementResolver implements NamespaceElementResolver
{
@@ -121,35 +122,23 @@
public static XmlItem resolveMethodOrField(String name, XmlItem parent, String innerText, String document, int lineno)
{
Class<?> p = parent.getJavaClass();
- Field f = null;
boolean methodFound = Reflections.methodExists(p, name);
- f = Reflections.findDeclaredField(p, name);
+ PropertyQuery<Object> query = PropertyQueries.createQuery(parent.getJavaClass());
+ query.addCriteria(new NamedPropertyCriteria(name));
+ Property<?> property = query.getFirstResult();
- if (methodFound && f != null)
+ if (methodFound && property != null)
{
- throw new XmlConfigurationException(parent.getJavaClass().getName() + " has both a method and a field named " + name + " and so cannot be configured via XML", document, lineno);
+ throw new XmlConfigurationException(parent.getJavaClass().getName() + " has both a method and a property named " + name + " and so cannot be configured via XML", document, lineno);
}
if (methodFound)
{
return new MethodXmlItem(parent, name, document, lineno);
}
- else if (f != null)
+ else if (property != null)
{
- return new FieldXmlItem(parent, f, innerText, null, document, lineno);
+ return new PropertyXmlItem(parent, property, innerText, null, document, lineno);
}
-
- String methodName = "set" + Character.toUpperCase(name.charAt(0)) + name.substring(1);
- if (Reflections.methodExists(p, methodName))
- {
- Set<Method> methods = Reflections.getAllDeclaredMethods(p);
- for (Method m : methods)
- {
- if (m.getName().equals(methodName) && m.getParameterTypes().length == 1)
- {
- return new PropertyXmlItem(parent, name, m, innerText, document, lineno);
- }
- }
- }
return null;
}
}
Added: modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/util/Reflections.java
===================================================================
--- modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/util/Reflections.java (rev 0)
+++ modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/util/Reflections.java 2010-08-28 02:48:04 UTC (rev 13662)
@@ -0,0 +1,48 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc., and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.seam.xml.util;
+
+import java.lang.reflect.Field;
+
+public class Reflections
+{
+ /**
+ * returns the field or null if not found
+ */
+ public static Field getField(Class<?> c, String name)
+ {
+ Class<?> i = c;
+ while (i != Object.class && i != null)
+ {
+ try
+ {
+ return i.getDeclaredField(name);
+ }
+ catch (Exception e)
+ {
+
+ }
+ i = i.getSuperclass();
+ }
+ return null;
+ }
+}
Modified: modules/xml/trunk/impl/src/test/java/org/jboss/seam/xml/test/NamespaceResolverTest.java
===================================================================
--- modules/xml/trunk/impl/src/test/java/org/jboss/seam/xml/test/NamespaceResolverTest.java 2010-08-28 01:45:24 UTC (rev 13661)
+++ modules/xml/trunk/impl/src/test/java/org/jboss/seam/xml/test/NamespaceResolverTest.java 2010-08-28 02:48:04 UTC (rev 13662)
@@ -26,9 +26,8 @@
import junit.framework.Assert;
-import org.jboss.seam.xml.model.AbstractFieldXmlItem;
-import org.jboss.seam.xml.model.FieldXmlItem;
import org.jboss.seam.xml.model.MethodXmlItem;
+import org.jboss.seam.xml.model.PropertyXmlItem;
import org.jboss.seam.xml.model.XmlItem;
import org.jboss.seam.xml.model.XmlItemType;
import org.jboss.seam.xml.parser.SaxNode;
@@ -74,8 +73,8 @@
Assert.assertTrue("Wrong method was resolved", ((MethodXmlItem) method).getMethod().getParameterTypes().length == 0);
XmlItem field = resolver.getItemForNamespace(new SaxNode("field1", null, null, null, null, 0), item);
- Assert.assertTrue("Element of wrong type returned", ((AbstractFieldXmlItem) field).getType() == XmlItemType.FIELD);
- Assert.assertTrue("field was not set", ((FieldXmlItem) field).getField() != null);
+ Assert.assertTrue("Element of wrong type returned", ((PropertyXmlItem) field).getType() == XmlItemType.FIELD);
+ Assert.assertTrue("field was not set", ((PropertyXmlItem) field).getField() != null);
}
13 years, 9 months
Seam SVN: r13661 - in modules/xml/trunk/impl/src: main/java/org/jboss/seam/xml/core and 7 other directories.
by seam-commits@lists.jboss.org
Author: swd847
Date: 2010-08-27 21:45:24 -0400 (Fri, 27 Aug 2010)
New Revision: 13661
Added:
modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/core/VirtualProducerField.java
modules/xml/trunk/impl/src/test/java/org/jboss/seam/xml/test/virtualproducer/
modules/xml/trunk/impl/src/test/java/org/jboss/seam/xml/test/virtualproducer/VirtualProducerFieldTest.java
modules/xml/trunk/impl/src/test/java/org/jboss/seam/xml/test/virtualproducer/VirtualProducerQualifier.java
modules/xml/trunk/impl/src/test/resources/org/jboss/seam/xml/test/virtualproducer/
modules/xml/trunk/impl/src/test/resources/org/jboss/seam/xml/test/virtualproducer/virtualproducer.xml
Modified:
modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/bootstrap/XmlExtension.java
modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/fieldset/SimpleFieldValue.java
modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/model/AbstractFieldXmlItem.java
modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/model/ClassXmlItem.java
modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/model/FieldXmlItem.java
modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/model/ModelBuilder.java
modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/model/PropertyXmlItem.java
modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/model/ResultType.java
modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/parser/namespace/PackageNamespaceElementResolver.java
Log:
virtual producer fields, still needs more work
Modified: modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/bootstrap/XmlExtension.java
===================================================================
--- modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/bootstrap/XmlExtension.java 2010-08-28 00:25:27 UTC (rev 13660)
+++ modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/bootstrap/XmlExtension.java 2010-08-28 01:45:24 UTC (rev 13661)
@@ -36,10 +36,6 @@
import javax.enterprise.event.Observes;
import javax.enterprise.inject.spi.AfterBeanDiscovery;
import javax.enterprise.inject.spi.Annotated;
-import javax.enterprise.inject.spi.AnnotatedConstructor;
-import javax.enterprise.inject.spi.AnnotatedField;
-import javax.enterprise.inject.spi.AnnotatedMethod;
-import javax.enterprise.inject.spi.AnnotatedParameter;
import javax.enterprise.inject.spi.AnnotatedType;
import javax.enterprise.inject.spi.BeanManager;
import javax.enterprise.inject.spi.BeforeBeanDiscovery;
@@ -59,8 +55,6 @@
import org.jboss.seam.xml.parser.ParserMain;
import org.jboss.seam.xml.parser.SaxNode;
import org.jboss.seam.xml.util.FileDataReader;
-import org.jboss.weld.extensions.annotated.AnnotatedTypeBuilder;
-import org.jboss.weld.extensions.core.Exact;
import org.jboss.weld.extensions.util.AnnotationInstanceProvider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -166,7 +160,7 @@
bb.getBuilder().addToClass(new AnnotationLiteral<XmlConfiguredBean>()
{
});
- AnnotatedType<?> tp = fixExactSupport(bb.getBuilder()).create();
+ AnnotatedType<?> tp = bb.getBuilder().create();
log.info("Adding XML Defined Bean: " + tp.getJavaClass().getName());
event.addAnnotatedType(tp);
}
@@ -267,48 +261,4 @@
return false;
}
- /**
- * temprary hack to support @Exact in seam-xml, remove once WELD-485 is
- * resolved
- */
- public <X> AnnotatedTypeBuilder<X> fixExactSupport(AnnotatedTypeBuilder<X> old)
- {
- AnnotatedType<X> pat = old.create();
- AnnotatedTypeBuilder<X> builder = new AnnotatedTypeBuilder<X>().readFromType(pat);
- // support for @Exact
- // fields
- for (AnnotatedField<? super X> f : pat.getFields())
- {
- if (f.isAnnotationPresent(Exact.class))
- {
- Class<?> type = f.getAnnotation(Exact.class).value();
- builder.overrideFieldType(f.getJavaMember(), type);
- }
- }
- // method parameters
- for (AnnotatedMethod<? super X> m : pat.getMethods())
- {
- for (AnnotatedParameter<? super X> p : m.getParameters())
- {
- if (p.isAnnotationPresent(Exact.class))
- {
- Class<?> type = p.getAnnotation(Exact.class).value();
- builder.overrideMethodParameterType(m.getJavaMember(), p.getPosition(), type);
- }
- }
- }
- // constructor parameters
- for (AnnotatedConstructor<X> c : pat.getConstructors())
- {
- for (AnnotatedParameter<? super X> p : c.getParameters())
- {
- if (p.isAnnotationPresent(Exact.class))
- {
- Class<?> type = p.getAnnotation(Exact.class).value();
- builder.overrideConstructorParameterType(c.getJavaMember(), p.getPosition(), type);
- }
- }
- }
- return builder;
- }
}
Added: modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/core/VirtualProducerField.java
===================================================================
--- modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/core/VirtualProducerField.java (rev 0)
+++ modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/core/VirtualProducerField.java 2010-08-28 01:45:24 UTC (rev 13661)
@@ -0,0 +1,33 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc., and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.seam.xml.core;
+
+/**
+ * This class used to reigister virtual producer fields
+ *
+ * @author stuart
+ *
+ */
+public class VirtualProducerField
+{
+ public Object field;
+}
Modified: modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/fieldset/SimpleFieldValue.java
===================================================================
--- modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/fieldset/SimpleFieldValue.java 2010-08-28 00:25:27 UTC (rev 13660)
+++ modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/fieldset/SimpleFieldValue.java 2010-08-28 01:45:24 UTC (rev 13661)
@@ -39,17 +39,20 @@
private final FieldValue value;
- public SimpleFieldValue(Class<?> javaObject, final Property f, FieldValue value)
+ private final Class<?> type;
+
+ public SimpleFieldValue(Class<?> javaObject, final Property<?> f, FieldValue value, Class<?> type)
{
this.field = f;
this.value = value;
+ this.type = type == null ? field.getJavaClass() : type;
}
public void setValue(Object instance, CreationalContext<?> ctx, BeanManager manager)
{
try
{
- field.setValue(instance, value.value(field.getJavaClass(), ctx, manager));
+ field.setValue(instance, value.value(type, ctx, manager));
}
catch (Exception e)
{
Modified: modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/model/AbstractFieldXmlItem.java
===================================================================
--- modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/model/AbstractFieldXmlItem.java 2010-08-28 00:25:27 UTC (rev 13660)
+++ modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/model/AbstractFieldXmlItem.java 2010-08-28 01:45:24 UTC (rev 13661)
@@ -49,14 +49,16 @@
public abstract class AbstractFieldXmlItem extends AbstractXmlItem
{
- protected Property property;
+ protected Property<?> property;
protected FieldValueObject fieldValue;
protected HashSet<TypeOccuranceInformation> allowed = new HashSet<TypeOccuranceInformation>();
+ private final Class<?> overridenFieldType;
List<BeanResult<?>> inlineBeans = new ArrayList<BeanResult<?>>();
- public AbstractFieldXmlItem(XmlItemType type, XmlItem parent, Class<?> javaClass, String innerText, Map<String, String> attributes, String document, int lineno)
+ public AbstractFieldXmlItem(XmlItemType type, XmlItem parent, Class<?> javaClass, String innerText, Map<String, String> attributes, Class<?> overridenFieldType, String document, int lineno)
{
super(type, parent, javaClass, innerText, attributes, document, lineno);
+ this.overridenFieldType = overridenFieldType;
}
public FieldValueObject getFieldValue()
@@ -143,7 +145,7 @@
}
ValueXmlItem value = valueEntries.get(0);
BeanResult<?> result = value.getBeanResult(manager);
- fieldValue = new SimpleFieldValue(parent.getJavaClass(), property, value.getValue());
+ fieldValue = new SimpleFieldValue(parent.getJavaClass(), property, value.getValue(), overridenFieldType);
if (result != null)
{
inlineBeans.add(result);
@@ -169,4 +171,9 @@
return inlineBeans;
}
+ public Class<?> getOverridenFieldType()
+ {
+ return overridenFieldType;
+ }
+
}
\ No newline at end of file
Modified: modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/model/ClassXmlItem.java
===================================================================
--- modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/model/ClassXmlItem.java 2010-08-28 00:25:27 UTC (rev 13660)
+++ modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/model/ClassXmlItem.java 2010-08-28 01:45:24 UTC (rev 13661)
@@ -26,6 +26,7 @@
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
@@ -38,6 +39,7 @@
import org.jboss.seam.xml.core.BeanResult;
import org.jboss.seam.xml.core.BeanResultType;
+import org.jboss.seam.xml.core.VirtualProducerField;
import org.jboss.seam.xml.fieldset.FieldValueObject;
import org.jboss.seam.xml.util.TypeOccuranceInformation;
import org.jboss.seam.xml.util.XmlConfigurationException;
@@ -58,6 +60,8 @@
allowed.add(TypeOccuranceInformation.of(XmlItemType.PARAMETERS, null, null));
allowed.add(TypeOccuranceInformation.of(XmlItemType.REPLACE, null, null));
allowed.add(TypeOccuranceInformation.of(XmlItemType.MODIFIES, null, null));
+ allowed.add(TypeOccuranceInformation.of(XmlItemType.VALUE, null, null));
+ allowed.add(TypeOccuranceInformation.of(XmlItemType.ENTRY, null, null));
}
public Set<TypeOccuranceInformation> getAllowedItem()
@@ -74,7 +78,7 @@
Field field = Reflections.findDeclaredField(getJavaClass(), e.getKey());
if (field != null)
{
- values.add(new FieldXmlItem(this, field, e.getValue(), document, lineno));
+ values.add(new FieldXmlItem(this, field, e.getValue(), null, document, lineno));
}
else
{
@@ -224,6 +228,39 @@
return result;
}
+ public BeanResult<?> createVirtualFieldBeanResult(BeanManager manager)
+ {
+ boolean override = !getChildrenOfType(ReplacesXmlItem.class).isEmpty();
+ boolean extend = !getChildrenOfType(ModifiesXmlItem.class).isEmpty();
+ Field member;
+ try
+ {
+ member = VirtualProducerField.class.getField("field");
+ }
+ catch (Exception e)
+ {
+ throw new RuntimeException(e);
+ }
+
+ BeanResultType beanType = BeanResultType.ADD;
+ if (override || extend)
+ {
+ throw new XmlConfigurationException("A virtual producer field may not containe <override> or <extend> tags", getDocument(), getLineno());
+ }
+ ClassXmlItem vclass = new ClassXmlItem(null, VirtualProducerField.class, Collections.EMPTY_MAP, document, lineno);
+ FieldXmlItem field = new FieldXmlItem(vclass, member, null, getJavaClass(), document, lineno);
+ vclass.addChild(field);
+ for (XmlItem i : this.getChildren())
+ {
+ field.addChild(i);
+ }
+ field.resolveChildren(manager);
+ BeanResult<?> result = vclass.createBeanResult(manager);
+ AnnotatedTypeBuilder<?> builder = result.getBuilder();
+ builder.overrideFieldType(member, this.getJavaClass());
+ return result;
+ }
+
private Constructor<?> resolveConstructor(List<ParameterXmlItem> constList)
{
Class<?>[] params = new Class[constList.size()];
Modified: modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/model/FieldXmlItem.java
===================================================================
--- modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/model/FieldXmlItem.java 2010-08-28 00:25:27 UTC (rev 13660)
+++ modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/model/FieldXmlItem.java 2010-08-28 01:45:24 UTC (rev 13661)
@@ -37,9 +37,9 @@
private final Field field;
- public FieldXmlItem(XmlItem parent, Field c, String innerText, String document, int lineno)
+ public FieldXmlItem(XmlItem parent, Field c, String innerText, Class<?> overridenFieldType, String document, int lineno)
{
- super(XmlItemType.FIELD, parent, parent.getJavaClass(), innerText, null, document, lineno);
+ super(XmlItemType.FIELD, parent, parent.getJavaClass(), innerText, null, overridenFieldType, document, lineno);
this.field = c;
this.property = getFieldValueSetter(c);
@@ -54,7 +54,7 @@
{
fv = new ConstantFieldValue(innerText);
}
- fieldValue = new SimpleFieldValue(parent.getJavaClass(), property, fv);
+ fieldValue = new SimpleFieldValue(parent.getJavaClass(), property, fv, overridenFieldType);
}
allowed.add(TypeOccuranceInformation.of(XmlItemType.ANNOTATION, null, null));
allowed.add(TypeOccuranceInformation.of(XmlItemType.VALUE, null, null));
Modified: modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/model/ModelBuilder.java
===================================================================
--- modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/model/ModelBuilder.java 2010-08-28 00:25:27 UTC (rev 13660)
+++ modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/model/ModelBuilder.java 2010-08-28 01:45:24 UTC (rev 13661)
@@ -27,6 +27,7 @@
import java.util.Map;
import java.util.Set;
+import javax.enterprise.inject.Produces;
import javax.enterprise.inject.Stereotype;
import javax.enterprise.inject.spi.BeanManager;
import javax.inject.Qualifier;
@@ -133,8 +134,19 @@
{
ret.addVeto(beanResult.getType());
}
-
}
+ else if (resultType == ResultType.VIRTUAL_PRODUCER)
+ {
+ ClassXmlItem cxml = (ClassXmlItem) xmlItem;
+ // get the AnnotatedType information
+ BeanResult<?> beanResult = cxml.createVirtualFieldBeanResult(manager);
+ ret.addBean(beanResult);
+ // <override> or <speciailizes> need to veto the bean
+ if (beanResult.getBeanType() != BeanResultType.ADD)
+ {
+ ret.addVeto(beanResult.getType());
+ }
+ }
else if (resultType == ResultType.QUALIFIER)
{
ret.addQualifier((Class) xmlItem.getJavaClass());
@@ -228,6 +240,17 @@
ret = ResultType.QUALIFIER;
}
}
+ else if (it.getJavaClass() == Produces.class)
+ {
+ if (ret != null)
+ {
+ throw new XmlConfigurationException("Element cannot be both an virtual producer field and a " + ret.toString(), item.getDocument(), item.getLineno());
+ }
+ else
+ {
+ ret = ResultType.VIRTUAL_PRODUCER;
+ }
+ }
else if (it.getJavaClass() == Stereotype.class)
{
if (ret != null)
Modified: modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/model/PropertyXmlItem.java
===================================================================
--- modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/model/PropertyXmlItem.java 2010-08-28 00:25:27 UTC (rev 13660)
+++ modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/model/PropertyXmlItem.java 2010-08-28 01:45:24 UTC (rev 13661)
@@ -39,7 +39,7 @@
public PropertyXmlItem(XmlItem parent, String name, Method setter, String innerText, String document, int lineno)
{
- super(XmlItemType.FIELD, parent, parent.getJavaClass(), innerText, null, document, lineno);
+ super(XmlItemType.FIELD, parent, parent.getJavaClass(), innerText, null, null, document, lineno);
this.name = name;
this.type = setter.getParameterTypes()[0];
this.declaringClass = setter.getDeclaringClass();
@@ -55,7 +55,7 @@
{
fv = new ConstantFieldValue(innerText);
}
- fieldValue = new SimpleFieldValue(parent.getJavaClass(), property, fv);
+ fieldValue = new SimpleFieldValue(parent.getJavaClass(), property, fv, null);
}
}
Modified: modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/model/ResultType.java
===================================================================
--- modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/model/ResultType.java 2010-08-28 00:25:27 UTC (rev 13660)
+++ modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/model/ResultType.java 2010-08-28 01:45:24 UTC (rev 13661)
@@ -23,5 +23,5 @@
public enum ResultType
{
- BEAN, INTERCEPTOR_BINDING, STEREOTYPE, QUALIFIER, VETO;
+ BEAN, INTERCEPTOR_BINDING, STEREOTYPE, QUALIFIER, VIRTUAL_PRODUCER;
}
Modified: modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/parser/namespace/PackageNamespaceElementResolver.java
===================================================================
--- modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/parser/namespace/PackageNamespaceElementResolver.java 2010-08-28 00:25:27 UTC (rev 13660)
+++ modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/parser/namespace/PackageNamespaceElementResolver.java 2010-08-28 01:45:24 UTC (rev 13661)
@@ -135,7 +135,7 @@
}
else if (f != null)
{
- return new FieldXmlItem(parent, f, innerText, document, lineno);
+ return new FieldXmlItem(parent, f, innerText, null, document, lineno);
}
String methodName = "set" + Character.toUpperCase(name.charAt(0)) + name.substring(1);
Added: modules/xml/trunk/impl/src/test/java/org/jboss/seam/xml/test/virtualproducer/VirtualProducerFieldTest.java
===================================================================
--- modules/xml/trunk/impl/src/test/java/org/jboss/seam/xml/test/virtualproducer/VirtualProducerFieldTest.java (rev 0)
+++ modules/xml/trunk/impl/src/test/java/org/jboss/seam/xml/test/virtualproducer/VirtualProducerFieldTest.java 2010-08-28 01:45:24 UTC (rev 13661)
@@ -0,0 +1,49 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc., and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.seam.xml.test.virtualproducer;
+
+import javax.enterprise.util.AnnotationLiteral;
+
+import junit.framework.Assert;
+
+import org.jboss.seam.xml.test.AbstractXMLTest;
+import org.junit.Test;
+
+public class VirtualProducerFieldTest extends AbstractXMLTest
+{
+
+ @Override
+ protected String getXmlFileName()
+ {
+ return "virtualproducer.xml";
+ }
+
+ @Test
+ public void testSimpleVirtualProducerField()
+ {
+ String value = getReference(String.class, new AnnotationLiteral<VirtualProducerQualifier>()
+ {
+ });
+ Assert.assertEquals("Hello World", value);
+
+ }
+}
Added: modules/xml/trunk/impl/src/test/java/org/jboss/seam/xml/test/virtualproducer/VirtualProducerQualifier.java
===================================================================
--- modules/xml/trunk/impl/src/test/java/org/jboss/seam/xml/test/virtualproducer/VirtualProducerQualifier.java (rev 0)
+++ modules/xml/trunk/impl/src/test/java/org/jboss/seam/xml/test/virtualproducer/VirtualProducerQualifier.java 2010-08-28 01:45:24 UTC (rev 13661)
@@ -0,0 +1,16 @@
+package org.jboss.seam.xml.test.virtualproducer;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+import javax.inject.Qualifier;
+
+(a)Retention(RetentionPolicy.RUNTIME)
+@Target(value = { ElementType.FIELD, ElementType.METHOD, ElementType.TYPE })
+@Qualifier
+public @interface VirtualProducerQualifier
+{
+
+}
Added: modules/xml/trunk/impl/src/test/resources/org/jboss/seam/xml/test/virtualproducer/virtualproducer.xml
===================================================================
--- modules/xml/trunk/impl/src/test/resources/org/jboss/seam/xml/test/virtualproducer/virtualproducer.xml (rev 0)
+++ modules/xml/trunk/impl/src/test/resources/org/jboss/seam/xml/test/virtualproducer/virtualproducer.xml 2010-08-28 01:45:24 UTC (rev 13661)
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="urn:java:ee"
+ xmlns:test="urn:java:org.jboss.seam.xml.test.virtualproducer">
+
+ <String>
+ <Produces/>
+ <test:VirtualProducerQualifier/>
+ <value>Hello World</value>
+ </String>
+
+</beans>
\ No newline at end of file
13 years, 9 months