Seam SVN: r13407 - branches/enterprise/JBPAPP_4_3_FP01/build.
by seam-commits@lists.jboss.org
Author: manaRH
Date: 2010-07-15 09:14:30 -0400 (Thu, 15 Jul 2010)
New Revision: 13407
Modified:
branches/enterprise/JBPAPP_4_3_FP01/build/settings.xml
Log:
updated current maven repository settings
Modified: branches/enterprise/JBPAPP_4_3_FP01/build/settings.xml
===================================================================
--- branches/enterprise/JBPAPP_4_3_FP01/build/settings.xml 2010-07-15 13:14:06 UTC (rev 13406)
+++ branches/enterprise/JBPAPP_4_3_FP01/build/settings.xml 2010-07-15 13:14:30 UTC (rev 13407)
@@ -234,8 +234,68 @@
</properties>
</profile>
-->
+
+ <profile>
+ <id>jboss-public-repository</id>
+ <repositories>
+ <repository>
+ <id>jboss-public-repository-group</id>
+ <name>JBoss Public Maven Repository Group</name>
+ <url>https://repository.jboss.org/nexus/content/groups/public/</url>
+ <layout>default</layout>
+ <releases>
+ <enabled>true</enabled>
+ <updatePolicy>never</updatePolicy>
+ </releases>
+ <snapshots>
+ <enabled>true</enabled>
+ <updatePolicy>never</updatePolicy>
+ </snapshots>
+ </repository>
+ </repositories>
+ <pluginRepositories>
+ <pluginRepository>
+ <id>jboss-public-repository-group</id>
+ <name>JBoss Public Maven Repository Group</name>
+ <url>https://repository.jboss.org/nexus/content/groups/public/</url>
+ <layout>default</layout>
+ <releases>
+ <enabled>true</enabled>
+ <updatePolicy>never</updatePolicy>
+ </releases>
+ <snapshots>
+ <enabled>true</enabled>
+ <updatePolicy>never</updatePolicy>
+ </snapshots>
+ </pluginRepository>
+ </pluginRepositories>
+ </profile>
+
+
+ <profile>
+ <id>jboss-deprecated-repository</id>
+ <repositories>
+ <repository>
+ <id>jboss-deprecated-repository</id>
+ <name>JBoss Deprecated Maven Repository</name>
+ <url>https://repository.jboss.org/nexus/content/repositories/deprecated/</url>
+ <layout>default</layout>
+ <releases>
+ <enabled>true</enabled>
+ <updatePolicy>never</updatePolicy>
+ </releases>
+ <snapshots>
+ <enabled>false</enabled>
+ <updatePolicy>never</updatePolicy>
+ </snapshots>
+ </repository>
+ </repositories>
+ </profile>
+
+
</profiles>
+
<!-- activeProfiles
| List of profiles that are active for all builds.
|
@@ -244,4 +304,11 @@
<activeProfile>anotherAlwaysActiveProfile</activeProfile>
</activeProfiles>
-->
+
+
+ <activeProfiles>
+ <activeProfile>jboss-public-repository</activeProfile>
+ <activeProfile>jboss-deprecated-repository</activeProfile>
+ </activeProfiles>
+
</settings>
13 years, 10 months
Seam SVN: r13406 - in modules/persistence/trunk/src: main/resources/META-INF and 2 other directories.
by seam-commits@lists.jboss.org
Author: swd847
Date: 2010-07-15 09:14:06 -0400 (Thu, 15 Jul 2010)
New Revision: 13406
Added:
modules/persistence/trunk/src/test/java/org/jboss/seam/transactions/test/TransactionInterceptorTest.java
modules/persistence/trunk/src/test/java/org/jboss/seam/transactions/test/TransactionManagedBean.java
modules/persistence/trunk/src/test/java/org/jboss/seam/transactions/test/util/EntityManagerProvider.java
Modified:
modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/TransactionInterceptor.java
modules/persistence/trunk/src/main/resources/META-INF/beans.xml
modules/persistence/trunk/src/test/java/org/jboss/seam/transactions/test/SimpleTest.java
Log:
added test of the transaction interceptor
Modified: modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/TransactionInterceptor.java
===================================================================
--- modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/TransactionInterceptor.java 2010-07-15 12:52:34 UTC (rev 13405)
+++ modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/TransactionInterceptor.java 2010-07-15 13:14:06 UTC (rev 13406)
@@ -7,6 +7,7 @@
import javax.inject.Inject;
import javax.interceptor.AroundInvoke;
+import javax.interceptor.Interceptor;
import javax.interceptor.InvocationContext;
/**
@@ -16,6 +17,7 @@
* @author Shane Bryzak
*/
@Transactional
+@Interceptor
public class TransactionInterceptor
{
private static final long serialVersionUID = -4364203056333738988L;
Modified: modules/persistence/trunk/src/main/resources/META-INF/beans.xml
===================================================================
--- modules/persistence/trunk/src/main/resources/META-INF/beans.xml 2010-07-15 12:52:34 UTC (rev 13405)
+++ modules/persistence/trunk/src/main/resources/META-INF/beans.xml 2010-07-15 13:14:06 UTC (rev 13406)
@@ -8,4 +8,7 @@
xsi:schemaLocation="
http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
+ <interceptors>
+ <class>org.jboss.seam.transaction.TransactionInterceptor</class>
+ </interceptors>
</beans>
Modified: modules/persistence/trunk/src/test/java/org/jboss/seam/transactions/test/SimpleTest.java
===================================================================
--- modules/persistence/trunk/src/test/java/org/jboss/seam/transactions/test/SimpleTest.java 2010-07-15 12:52:34 UTC (rev 13405)
+++ modules/persistence/trunk/src/test/java/org/jboss/seam/transactions/test/SimpleTest.java 2010-07-15 13:14:06 UTC (rev 13406)
@@ -34,7 +34,11 @@
public static Archive<?> createTestArchive()
{
- WebArchive war = ShrinkWrap.create("test.war", WebArchive.class).addLibraries(MavenArtifactResolver.resolve(ArtifactNames.WELD_EXTENSIONS)).addPackage(Transaction.class.getPackage()).addPackage(SimpleTest.class.getPackage()).addWebResource("META-INF/persistence.xml", "classes/META-INF/persistence.xml").addWebResource(new ByteArrayAsset(new byte[0]), "beans.xml");
+ WebArchive war = ShrinkWrap.create(WebArchive.class);
+ war.addLibraries(MavenArtifactResolver.resolve(ArtifactNames.WELD_EXTENSIONS));
+ war.addPackage(Transaction.class.getPackage()).addClasses(SimpleTest.class, Hotel.class);
+ war.addWebResource("META-INF/persistence.xml", "classes/META-INF/persistence.xml");
+ war.addWebResource(new ByteArrayAsset(new byte[0]), "beans.xml");
return war;
}
Added: modules/persistence/trunk/src/test/java/org/jboss/seam/transactions/test/TransactionInterceptorTest.java
===================================================================
--- modules/persistence/trunk/src/test/java/org/jboss/seam/transactions/test/TransactionInterceptorTest.java (rev 0)
+++ modules/persistence/trunk/src/test/java/org/jboss/seam/transactions/test/TransactionInterceptorTest.java 2010-07-15 13:14:06 UTC (rev 13406)
@@ -0,0 +1,79 @@
+package org.jboss.seam.transactions.test;
+
+import java.util.List;
+
+import javax.inject.Inject;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+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.jboss.arquillian.api.Deployment;
+import org.jboss.arquillian.junit.Arquillian;
+import org.jboss.seam.transaction.Transaction;
+import org.jboss.seam.transaction.TransactionInterceptor;
+import org.jboss.seam.transaction.UserTransaction;
+import org.jboss.seam.transactions.test.util.ArtifactNames;
+import org.jboss.seam.transactions.test.util.EntityManagerProvider;
+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 TransactionInterceptorTest
+{
+ @Deployment
+ public static Archive<?> createTestArchive()
+ {
+
+ WebArchive war = ShrinkWrap.create("test.war", WebArchive.class);
+ war.addLibraries(MavenArtifactResolver.resolve(ArtifactNames.WELD_EXTENSIONS));
+ war.addPackage(Transaction.class.getPackage());
+ war.addClasses(TransactionInterceptorTest.class, TransactionManagedBean.class, Hotel.class, EntityManagerProvider.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");
+
+ return war;
+ }
+
+ @Inject
+ TransactionManagedBean bean;
+
+ @Inject
+ UserTransaction transaction;
+
+ @PersistenceContext
+ EntityManager em;
+
+ @Test
+ public void testTransactionInterceptor() throws NotSupportedException, SystemException, SecurityException, IllegalStateException, RollbackException, HeuristicMixedException, HeuristicRollbackException
+ {
+
+ bean.addHotel();
+
+ try
+ {
+ bean.failToAddHotel();
+ }
+ catch (Exception e)
+ {
+
+ }
+
+ transaction.begin();
+ em.joinTransaction();
+ List<Hotel> hotels = em.createQuery("select h from Hotel h").getResultList();
+ Assert.assertTrue("Wrong number of hotels: " + hotels.size(), hotels.size() == 1);
+ transaction.rollback();
+
+ }
+}
Added: modules/persistence/trunk/src/test/java/org/jboss/seam/transactions/test/TransactionManagedBean.java
===================================================================
--- modules/persistence/trunk/src/test/java/org/jboss/seam/transactions/test/TransactionManagedBean.java (rev 0)
+++ modules/persistence/trunk/src/test/java/org/jboss/seam/transactions/test/TransactionManagedBean.java 2010-07-15 13:14:06 UTC (rev 13406)
@@ -0,0 +1,32 @@
+package org.jboss.seam.transactions.test;
+
+import javax.inject.Inject;
+import javax.persistence.EntityManager;
+
+import org.jboss.seam.transaction.TransactionPropagation;
+import org.jboss.seam.transaction.Transactional;
+
+(a)Transactional(TransactionPropagation.REQUIRED)
+public class TransactionManagedBean
+{
+
+ @Inject
+ EntityManager entityManager;
+
+ public void addHotel()
+ {
+ entityManager.joinTransaction();
+ Hotel h = new Hotel("test", "Fake St", "Wollongong", "NSW", "2518", "Australia");
+ entityManager.persist(h);
+ entityManager.flush();
+ }
+
+ public void failToAddHotel()
+ {
+ entityManager.joinTransaction();
+ Hotel h = new Hotel("test2", "Fake St", "Wollongong", "NSW", "2518", "Australia");
+ entityManager.persist(h);
+ entityManager.flush();
+ throw new RuntimeException("Roll back transaction");
+ }
+}
Added: modules/persistence/trunk/src/test/java/org/jboss/seam/transactions/test/util/EntityManagerProvider.java
===================================================================
--- modules/persistence/trunk/src/test/java/org/jboss/seam/transactions/test/util/EntityManagerProvider.java (rev 0)
+++ modules/persistence/trunk/src/test/java/org/jboss/seam/transactions/test/util/EntityManagerProvider.java 2010-07-15 13:14:06 UTC (rev 13406)
@@ -0,0 +1,12 @@
+package org.jboss.seam.transactions.test.util;
+
+import javax.enterprise.inject.Produces;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+
+public class EntityManagerProvider
+{
+ @PersistenceContext
+ @Produces
+ EntityManager entityManager;
+}
13 years, 10 months
Seam SVN: r13405 - in modules/persistence/trunk: src/main/java/org/jboss/seam/transaction and 9 other directories.
by seam-commits@lists.jboss.org
Author: swd847
Date: 2010-07-15 08:52:34 -0400 (Thu, 15 Jul 2010)
New Revision: 13405
Added:
modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/AbstractUserTransaction.java
modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/CMTTransaction.java
modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/EJB.java
modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/EjbSynchronizations.java
modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/LocalEjbSynchronizations.java
modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/Naming.java
modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/NoTransaction.java
modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/SeSynchronizations.java
modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/SynchronizationRegistry.java
modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/Synchronizations.java
modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/Transaction.java
modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/TransactionExtension.java
modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/TransactionInterceptor.java
modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/UTTransaction.java
modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/UserTransaction.java
modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/Work.java
modules/persistence/trunk/src/test/java/org/jboss/seam/transactions/
modules/persistence/trunk/src/test/java/org/jboss/seam/transactions/test/
modules/persistence/trunk/src/test/java/org/jboss/seam/transactions/test/Hotel.java
modules/persistence/trunk/src/test/java/org/jboss/seam/transactions/test/SimpleTest.java
modules/persistence/trunk/src/test/java/org/jboss/seam/transactions/test/util/
modules/persistence/trunk/src/test/java/org/jboss/seam/transactions/test/util/ArtifactNames.java
modules/persistence/trunk/src/test/java/org/jboss/seam/transactions/test/util/MavenArtifactResolver.java
modules/persistence/trunk/src/test/resources-glassfish/
modules/persistence/trunk/src/test/resources-glassfish/sun-resources.xml
modules/persistence/trunk/src/test/resources-jbossas/
modules/persistence/trunk/src/test/resources-jbossas/jndi.properties
modules/persistence/trunk/src/test/resources-jbossas/seam-transactions-test-ds.xml
modules/persistence/trunk/src/test/resources/META-INF/
modules/persistence/trunk/src/test/resources/META-INF/persistence.xml
modules/persistence/trunk/src/test/resources/META-INF/seam-beans.xml
modules/persistence/trunk/src/test/resources/arquillian.xml
Modified:
modules/persistence/trunk/pom.xml
modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/TransactionPropagation.java
modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/Transactional.java
Log:
initial port of seam 2 transaction management
Modified: modules/persistence/trunk/pom.xml
===================================================================
--- modules/persistence/trunk/pom.xml 2010-07-15 12:28:14 UTC (rev 13404)
+++ modules/persistence/trunk/pom.xml 2010-07-15 12:52:34 UTC (rev 13405)
@@ -15,8 +15,16 @@
<properties>
<seam.version>3.0.0.b01</seam.version>
+ <arquillian.version>1.0.0-SNAPSHOT</arquillian.version>
+ <junit.version>4.8.1</junit.version>
+ <jboss.home>${env.JBOSS_HOME}</jboss.home>
+ <jboss.domain>default</jboss.domain>
+ <glassfish.version>3.0.1-b19</glassfish.version>
+ <jboss-as-client.version>6.0.0-SNAPSHOT</jboss-as-client.version>
+ <jboss-javaee6-spec.version>1.0.0.Beta4</jboss-javaee6-spec.version>
+ <jboss-server-manager.version>1.0.3.GA</jboss-server-manager.version>
</properties>
-
+
<prerequisites>
<maven>3.0</maven>
</prerequisites>
@@ -30,12 +38,32 @@
<type>pom</type>
<scope>import</scope>
</dependency>
+
+ <dependency>
+ <groupId>org.jboss.arquillian</groupId>
+ <artifactId>arquillian-junit</artifactId>
+ <version>${arquillian.version}</version>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>${junit.version}</version>
+ </dependency>
+
</dependencies>
+
+
</dependencyManagement>
<dependencies>
-
<dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ </dependency>
+
+ <dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
</dependency>
@@ -67,9 +95,142 @@
<scope>provided</scope>
</dependency>
+ <dependency>
+ <groupId>org.jboss.spec</groupId>
+ <artifactId>jboss-javaee-6.0</artifactId>
+ <version>${jboss-javaee6-spec.version}</version>
+ <type>pom</type>
+ <scope>provided</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.jboss.weld</groupId>
+ <artifactId>weld-extensions</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ <type>jar</type>
+ <scope>compile</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.jboss.arquillian</groupId>
+ <artifactId>arquillian-junit</artifactId>
+ <scope>test</scope>
+ </dependency>
</dependencies>
+ <profiles>
+ <profile>
+ <id>default</id>
+ <activation>
+ <activeByDefault>true</activeByDefault>
+ </activation>
+ <build>
+ <plugins>
+ <plugin>
+ <artifactId>maven-surefire-plugin</artifactId>
+ <configuration>
+ <skip>true</skip>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+ </profile>
+
+ <profile>
+ <id>jbossas-remote-60</id>
+ <dependencies>
+ <dependency>
+ <groupId>org.jboss.arquillian.container</groupId>
+ <artifactId>arquillian-jbossas-remote-6</artifactId>
+ <version>${arquillian.version}</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.jboss.spec</groupId>
+ <artifactId>jboss-javaee-6.0</artifactId>
+ <version>${jboss-javaee6-spec.version}</version>
+ <type>pom</type>
+ <scope>provided</scope>
+ </dependency>
+ <!-- need for org.jnp.interfaces.NamingContextFactory -->
+ <dependency>
+ <groupId>org.jboss.jbossas</groupId>
+ <artifactId>jboss-as-client</artifactId>
+ <version>${jboss-as-client.version}</version>
+ <type>pom</type>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+ <build>
+ <testResources>
+ <testResource>
+ <directory>src/test/resources</directory>
+ </testResource>
+ <testResource>
+ <directory>src/test/resources-jbossas</directory>
+ </testResource>
+ </testResources>
+ </build>
+ </profile>
+
+ <profile>
+ <id>glassfish-embedded-30</id>
+ <dependencies>
+ <dependency>
+ <groupId>org.jboss.arquillian.container</groupId>
+ <artifactId>arquillian-glassfish-embedded-30</artifactId>
+ <version>${arquillian.version}</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.glassfish.extras</groupId>
+ <artifactId>glassfish-embedded-all</artifactId>
+ <version>${glassfish.version}</version>
+ <scope>provided</scope>
+ </dependency>
+ </dependencies>
+ <build>
+ <testResources>
+ <testResource>
+ <directory>src/test/resources</directory>
+ </testResource>
+ <testResource>
+ <directory>src/test/resources-glassfish</directory>
+ </testResource>
+ </testResources>
+ </build>
+ </profile>
+
+ <profile>
+ <id>glassfish-remote-30</id>
+ <dependencies>
+ <dependency>
+ <groupId>org.jboss.arquillian.container</groupId>
+ <artifactId>arquillian-glassfish-remote-30</artifactId>
+ <version>${arquillian.version}</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.glassfish.extras</groupId>
+ <artifactId>glassfish-embedded-all</artifactId>
+ <version>${glassfish.version}</version>
+ <scope>provided</scope>
+ </dependency>
+ </dependencies>
+ <build>
+ <testResources>
+ <testResource>
+ <directory>src/test/resources</directory>
+ </testResource>
+ <testResource>
+ <directory>src/test/resources-glassfish</directory>
+ </testResource>
+ </testResources>
+ </build>
+ </profile>
+ </profiles>
+
<scm>
<connection>scm:svn:http://anonsvn.jboss.org/repos/seam/modules/persistence/trunk</connection>
<developerConnection>scm:svn:https://svn.jboss.org/repos/seam/modules/persistence/trunk</developerConnection>
@@ -77,3 +238,4 @@
</scm>
</project>
+
Added: modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/AbstractUserTransaction.java
===================================================================
--- modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/AbstractUserTransaction.java (rev 0)
+++ modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/AbstractUserTransaction.java 2010-07-15 12:52:34 UTC (rev 13405)
@@ -0,0 +1,86 @@
+package org.jboss.seam.transaction;
+
+import static javax.transaction.Status.STATUS_ACTIVE;
+import static javax.transaction.Status.STATUS_COMMITTED;
+import static javax.transaction.Status.STATUS_MARKED_ROLLBACK;
+import static javax.transaction.Status.STATUS_NO_TRANSACTION;
+import static javax.transaction.Status.STATUS_ROLLEDBACK;
+
+import javax.persistence.EntityManager;
+import javax.transaction.Synchronization;
+import javax.transaction.SystemException;
+
+/**
+ * Base implementation of UserTransaction
+ *
+ * @author Gavin King
+ *
+ */
+public abstract class AbstractUserTransaction implements UserTransaction
+{
+
+ private final Synchronizations synchronizations;
+
+ public AbstractUserTransaction(Synchronizations synchronizations)
+ {
+ this.synchronizations = synchronizations;
+ }
+
+ public boolean isActive() throws SystemException
+ {
+ return getStatus() == STATUS_ACTIVE;
+ }
+
+ public boolean isActiveOrMarkedRollback() throws SystemException
+ {
+ int status = getStatus();
+ return status == STATUS_ACTIVE || status == STATUS_MARKED_ROLLBACK;
+ }
+
+ public boolean isRolledBackOrMarkedRollback() throws SystemException
+ {
+ int status = getStatus();
+ return status == STATUS_ROLLEDBACK || status == STATUS_MARKED_ROLLBACK;
+ }
+
+ public boolean isMarkedRollback() throws SystemException
+ {
+ return getStatus() == STATUS_MARKED_ROLLBACK;
+ }
+
+ public boolean isNoTransaction() throws SystemException
+ {
+ return getStatus() == STATUS_NO_TRANSACTION;
+ }
+
+ public boolean isRolledBack() throws SystemException
+ {
+ return getStatus() == STATUS_ROLLEDBACK;
+ }
+
+ public boolean isCommitted() throws SystemException
+ {
+ return getStatus() == STATUS_COMMITTED;
+ }
+
+ public boolean isConversationContextRequired()
+ {
+ return false;
+ }
+
+ public abstract void registerSynchronization(Synchronization sync);
+
+ public void enlist(EntityManager entityManager) throws SystemException
+ {
+ if (isActiveOrMarkedRollback())
+ {
+ entityManager.joinTransaction();
+ }
+ }
+
+ public Synchronizations getSynchronizations()
+ {
+ return synchronizations;
+ }
+
+}
Added: modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/CMTTransaction.java
===================================================================
--- modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/CMTTransaction.java (rev 0)
+++ modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/CMTTransaction.java 2010-07-15 12:52:34 UTC (rev 13405)
@@ -0,0 +1,128 @@
+package org.jboss.seam.transaction;
+
+import javax.ejb.EJBContext;
+import javax.transaction.HeuristicMixedException;
+import javax.transaction.HeuristicRollbackException;
+import javax.transaction.NotSupportedException;
+import javax.transaction.RollbackException;
+import javax.transaction.Status;
+import javax.transaction.Synchronization;
+import javax.transaction.SystemException;
+import javax.transaction.UserTransaction;
+
+import org.jboss.weld.extensions.core.Veto;
+
+/**
+ * Wraps EJBContext transaction management in a UserTransaction interface. Note
+ * that container managed transactions cannot be controlled by the application,
+ * so begin(), commit() and rollback() are disallowed in a CMT.
+ *
+ * @author Mike Youngstrom
+ * @author Gavin King
+ * @author Stuart Douglas
+ *
+ */
+@Veto
+public class CMTTransaction extends AbstractUserTransaction
+{
+
+ private final EJBContext ejbContext;
+
+ public CMTTransaction(EJBContext ejbContext, Synchronizations sync)
+ {
+ super(sync);
+ this.ejbContext = ejbContext;
+ if (ejbContext == null)
+ {
+ throw new IllegalArgumentException("null EJBContext");
+ }
+ }
+
+ public void begin() throws NotSupportedException, SystemException
+ {
+ ejbContext.getUserTransaction().begin();
+ getSynchronizations().afterTransactionBegin();
+ }
+
+ public void commit() throws RollbackException, HeuristicMixedException, HeuristicRollbackException, SecurityException, IllegalStateException, SystemException
+ {
+ UserTransaction userTransaction = ejbContext.getUserTransaction();
+ boolean success = false;
+ Synchronizations synchronizations = getSynchronizations();
+ synchronizations.beforeTransactionCommit();
+ try
+ {
+ userTransaction.commit();
+ success = true;
+ }
+ finally
+ {
+ synchronizations.afterTransactionCommit(success);
+ }
+ }
+
+ public void rollback() throws IllegalStateException, SecurityException, SystemException
+ {
+ UserTransaction userTransaction = ejbContext.getUserTransaction();
+ try
+ {
+ userTransaction.rollback();
+ }
+ finally
+ {
+ getSynchronizations().afterTransactionRollback();
+ }
+ }
+
+ public int getStatus() throws SystemException
+ {
+ try
+ {
+ // TODO: not correct for SUPPORTS or NEVER!
+ if (!ejbContext.getRollbackOnly())
+ {
+ return Status.STATUS_ACTIVE;
+ }
+ else
+ {
+ return Status.STATUS_MARKED_ROLLBACK;
+ }
+ }
+ catch (IllegalStateException ise)
+ {
+ try
+ {
+ return ejbContext.getUserTransaction().getStatus();
+ }
+ catch (IllegalStateException is)
+ {
+ return Status.STATUS_NO_TRANSACTION;
+ }
+ }
+ }
+
+ public void setRollbackOnly() throws IllegalStateException, SystemException
+ {
+ ejbContext.setRollbackOnly();
+ }
+
+ public void setTransactionTimeout(int timeout) throws SystemException
+ {
+ ejbContext.getUserTransaction().setTransactionTimeout(timeout);
+ }
+
+ @Override
+ public void registerSynchronization(Synchronization sync)
+ {
+ Synchronizations synchronizations = getSynchronizations();
+ if (synchronizations.isAwareOfContainerTransactions())
+ {
+ synchronizations.registerSynchronization(sync);
+ }
+ else
+ {
+ throw new UnsupportedOperationException("cannot register synchronization with container transaction, use <transaction:ejb-transaction/>");
+ }
+ }
+
+}
Added: modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/EJB.java
===================================================================
--- modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/EJB.java (rev 0)
+++ modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/EJB.java 2010-07-15 12:52:34 UTC (rev 13405)
@@ -0,0 +1,39 @@
+package org.jboss.seam.transaction;
+
+import javax.ejb.EJBContext;
+import javax.naming.NameNotFoundException;
+import javax.naming.NamingException;
+
+/**
+ * utility class to look up the EJBContext
+ *
+ *
+ */
+public class EJB
+{
+ public static String ejbContextName = "java:comp.ejb3/EJBContext";
+ public static final String STANDARD_EJB_CONTEXT_NAME = "java:comp/EJBContext";
+
+ public static EJBContext getEJBContext() throws NamingException
+ {
+ try
+ {
+ return (EJBContext) Naming.getInitialContext().lookup(ejbContextName);
+ }
+ catch (NameNotFoundException nnfe)
+ {
+ return (EJBContext) Naming.getInitialContext().lookup(STANDARD_EJB_CONTEXT_NAME);
+ }
+ }
+
+ protected static String getEjbContextName()
+ {
+ return ejbContextName;
+ }
+
+ protected static void setEjbContextName(String ejbContextName)
+ {
+ EJB.ejbContextName = ejbContextName;
+ }
+
+}
Added: modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/EjbSynchronizations.java
===================================================================
--- modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/EjbSynchronizations.java (rev 0)
+++ modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/EjbSynchronizations.java 2010-07-15 12:52:34 UTC (rev 13405)
@@ -0,0 +1,109 @@
+package org.jboss.seam.transaction;
+
+import java.rmi.RemoteException;
+import java.util.LinkedList;
+
+import javax.ejb.EJBException;
+import javax.ejb.Remove;
+import javax.ejb.SessionSynchronization;
+import javax.ejb.Stateful;
+import javax.ejb.TransactionAttribute;
+import javax.ejb.TransactionAttributeType;
+import javax.enterprise.context.RequestScoped;
+import javax.transaction.Synchronization;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Receives JTA transaction completion notifications from the EJB container, and
+ * passes them on to the registered Synchronizations. This implementation is
+ * fully aware of container managed transactions and is able to register
+ * Synchronizations for the container transaction.
+ *
+ * @author Gavin King
+ *
+ */
+@Stateful
+@RequestScoped
+(a)TransactionAttribute(TransactionAttributeType.SUPPORTS)
+public class EjbSynchronizations implements LocalEjbSynchronizations, SessionSynchronization
+{
+ private static final Logger log = LoggerFactory.getLogger(EjbSynchronizations.class);
+
+ // maintain two lists to work around a bug in JBoss EJB3 where a new
+ // SessionSynchronization
+ // gets registered each time the bean is called
+ protected LinkedList<SynchronizationRegistry> synchronizations = new LinkedList<SynchronizationRegistry>();
+ protected LinkedList<SynchronizationRegistry> committing = new LinkedList<SynchronizationRegistry>();
+
+ public void afterBegin()
+ {
+ log.debug("afterBegin");
+ synchronizations.addLast(new SynchronizationRegistry());
+ }
+
+ public void beforeCompletion() throws EJBException, RemoteException
+ {
+ log.debug("beforeCompletion");
+ SynchronizationRegistry sync = synchronizations.removeLast();
+ sync.beforeTransactionCompletion();
+ committing.addLast(sync);
+ }
+
+ public void afterCompletion(boolean success) throws EJBException, RemoteException
+ {
+ log.debug("afterCompletion");
+ if (committing.isEmpty())
+ {
+ if (success)
+ {
+ throw new IllegalStateException("beforeCompletion was never called");
+ }
+ else
+ {
+ synchronizations.removeLast().afterTransactionCompletion(false);
+ }
+ }
+ else
+ {
+ committing.removeFirst().afterTransactionCompletion(success);
+ }
+ }
+
+ public boolean isAwareOfContainerTransactions()
+ {
+ return true;
+ }
+
+ public void afterTransactionBegin()
+ {
+ // noop, let JTA notify us
+ }
+
+ public void afterTransactionCommit(boolean success)
+ {
+ // noop, let JTA notify us
+ }
+
+ public void afterTransactionRollback()
+ {
+ // noop, let JTA notify us
+ }
+
+ public void beforeTransactionCommit()
+ {
+ // noop, let JTA notify us
+ }
+
+ public void registerSynchronization(Synchronization sync)
+ {
+ synchronizations.getLast().registerSynchronization(sync);
+ }
+
+ @Remove
+ public void destroy()
+ {
+ }
+
+}
Added: modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/LocalEjbSynchronizations.java
===================================================================
--- modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/LocalEjbSynchronizations.java (rev 0)
+++ modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/LocalEjbSynchronizations.java 2010-07-15 12:52:34 UTC (rev 13405)
@@ -0,0 +1,15 @@
+package org.jboss.seam.transaction;
+
+import javax.ejb.Local;
+
+/**
+ * Local interface for EjbTransaction
+ *
+ * @author Gavin King
+ *
+ */
+@Local
+public interface LocalEjbSynchronizations extends Synchronizations
+{
+ public void destroy();
+}
Added: modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/Naming.java
===================================================================
--- modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/Naming.java (rev 0)
+++ modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/Naming.java 2010-07-15 12:52:34 UTC (rev 13405)
@@ -0,0 +1,89 @@
+/*
+ * JBoss, Home of Professional Open Source
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package org.jboss.seam.transaction;
+
+import java.util.Hashtable;
+
+import javax.naming.InitialContext;
+import javax.naming.NamingException;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * this has been ported to seam and hacked to make it work
+ *
+ * we need to figure out what we are doing with JNDI in seam 3 and make this go
+ * away
+ *
+ * @author stuart
+ *
+ */
+public final class Naming
+{
+ private static final Logger log = LoggerFactory.getLogger(Naming.class);
+ private static Hashtable initialContextProperties;
+
+ private static InitialContext initialContext;
+
+ public static InitialContext getInitialContext(Hashtable<String, String> props) throws NamingException
+ {
+ if (props == null)
+ {
+ // throw new
+ // IllegalStateException("JNDI properties not initialized, Seam was not started correctly");
+ }
+ props = new Hashtable<String, String>();
+
+ if (log.isDebugEnabled())
+ {
+ log.debug("JNDI InitialContext properties:" + props);
+ }
+
+ try
+ {
+ return props.size() == 0 ? new InitialContext() : new InitialContext(props);
+ }
+ catch (NamingException e)
+ {
+ log.debug("Could not obtain initial context");
+ throw e;
+ }
+
+ }
+
+ public static InitialContext getInitialContext() throws NamingException
+ {
+ if (initialContext == null)
+ initInitialContext();
+
+ return initialContext;
+ }
+
+ private static synchronized void initInitialContext() throws NamingException
+ {
+ if (initialContext == null)
+ {
+ initialContext = getInitialContext(initialContextProperties);
+ }
+ }
+
+ private Naming()
+ {
+ }
+
+ public static void setInitialContextProperties(Hashtable initialContextProperties)
+ {
+ Naming.initialContextProperties = initialContextProperties;
+ initialContext = null;
+ }
+
+ public static Hashtable getInitialContextProperties()
+ {
+ return initialContextProperties;
+ }
+}
Added: modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/NoTransaction.java
===================================================================
--- modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/NoTransaction.java (rev 0)
+++ modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/NoTransaction.java 2010-07-15 12:52:34 UTC (rev 13405)
@@ -0,0 +1,72 @@
+package org.jboss.seam.transaction;
+
+import javax.persistence.EntityManager;
+import javax.transaction.HeuristicMixedException;
+import javax.transaction.HeuristicRollbackException;
+import javax.transaction.NotSupportedException;
+import javax.transaction.RollbackException;
+import javax.transaction.Status;
+import javax.transaction.Synchronization;
+import javax.transaction.SystemException;
+
+import org.jboss.weld.extensions.core.Veto;
+
+/**
+ * When no kind of transaction management exists.
+ *
+ * @author Mike Youngstrom
+ * @author Gavin King
+ *
+ */
+@Veto
+public class NoTransaction extends AbstractUserTransaction
+{
+
+ public NoTransaction()
+ {
+ super(null);
+ }
+
+ public void begin() throws NotSupportedException, SystemException
+ {
+ throw new UnsupportedOperationException("no transaction");
+ }
+
+ public void commit() throws RollbackException, HeuristicMixedException, HeuristicRollbackException, SecurityException, IllegalStateException, SystemException
+ {
+ throw new UnsupportedOperationException("no transaction");
+ }
+
+ public int getStatus() throws SystemException
+ {
+ return Status.STATUS_NO_TRANSACTION;
+ }
+
+ public void rollback() throws IllegalStateException, SecurityException, SystemException
+ {
+ throw new UnsupportedOperationException("no transaction");
+ }
+
+ public void setRollbackOnly() throws IllegalStateException, SystemException
+ {
+ throw new UnsupportedOperationException("no transaction");
+ }
+
+ public void setTransactionTimeout(int timeout) throws SystemException
+ {
+ throw new UnsupportedOperationException("no transaction");
+ }
+
+ @Override
+ public void registerSynchronization(Synchronization sync)
+ {
+ throw new UnsupportedOperationException("no transaction");
+ }
+
+ @Override
+ public void enlist(EntityManager entityManager) throws SystemException
+ {
+ // no-op
+ }
+
+}
Added: modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/SeSynchronizations.java
===================================================================
--- modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/SeSynchronizations.java (rev 0)
+++ modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/SeSynchronizations.java 2010-07-15 12:52:34 UTC (rev 13405)
@@ -0,0 +1,71 @@
+package org.jboss.seam.transaction;
+
+import java.util.Stack;
+
+import javax.enterprise.context.RequestScoped;
+import javax.enterprise.inject.Alternative;
+import javax.transaction.Synchronization;
+
+/**
+ * This implementation does not have access to the JTA TransactionManager, so it
+ * is not fully aware of container managed transaction lifecycle, and is not
+ * able to register Synchronizations with a container managed transaction.
+ *
+ * This is an alternative, and as such must be enabled in beans.xml.
+ *
+ * @author Gavin King
+ * @author Stuart Douglas
+ */
+@RequestScoped
+@Alternative
+public class SeSynchronizations implements Synchronizations
+{
+ protected Stack<SynchronizationRegistry> synchronizations = new Stack<SynchronizationRegistry>();
+
+ public void afterTransactionBegin()
+ {
+ synchronizations.push(new SynchronizationRegistry());
+ }
+
+ public void afterTransactionCommit(boolean success)
+ {
+ if (!synchronizations.isEmpty())
+ {
+ synchronizations.pop().afterTransactionCompletion(success);
+ }
+ }
+
+ public void afterTransactionRollback()
+ {
+ if (!synchronizations.isEmpty())
+ {
+ synchronizations.pop().afterTransactionCompletion(false);
+ }
+ }
+
+ public void beforeTransactionCommit()
+ {
+ if (!synchronizations.isEmpty())
+ {
+ synchronizations.peek().beforeTransactionCompletion();
+ }
+ }
+
+ public void registerSynchronization(Synchronization sync)
+ {
+ if (synchronizations.isEmpty())
+ {
+ throw new IllegalStateException("Transaction begin not detected, try installing transaction:ejb-transaction in components.xml");
+ }
+ else
+ {
+ synchronizations.peek().registerSynchronization(sync);
+ }
+ }
+
+ public boolean isAwareOfContainerTransactions()
+ {
+ return false;
+ }
+
+}
Added: modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/SynchronizationRegistry.java
===================================================================
--- modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/SynchronizationRegistry.java (rev 0)
+++ modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/SynchronizationRegistry.java 2010-07-15 12:52:34 UTC (rev 13405)
@@ -0,0 +1,71 @@
+package org.jboss.seam.transaction;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.transaction.Status;
+import javax.transaction.Synchronization;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * A list of Synchronizations to be invoked before and after transaction
+ * completion. This class is used when we can't register a synchronization
+ * directly with JTA.
+ *
+ * @author Gavin King
+ *
+ */
+class SynchronizationRegistry
+{
+ private static final Logger log = LoggerFactory.getLogger(SynchronizationRegistry.class);
+
+ private List<Synchronization> synchronizations = new ArrayList<Synchronization>();
+
+ void registerSynchronization(Synchronization sync)
+ {
+ synchronizations.add(sync);
+ }
+
+ void afterTransactionCompletion(boolean success)
+ {
+ // if ( Events.exists() )
+ // {
+ // Events.instance().raiseEvent("org.jboss.seam.afterTransactionCompletion",
+ // success);
+ // }
+ for (Synchronization sync : synchronizations)
+ {
+ try
+ {
+ sync.afterCompletion(success ? Status.STATUS_COMMITTED : Status.STATUS_ROLLEDBACK);
+ }
+ catch (Exception e)
+ {
+ log.error("Exception processing transaction Synchronization after completion", e);
+ }
+ }
+ synchronizations.clear();
+ }
+
+ void beforeTransactionCompletion()
+ {
+ // if ( Events.exists() )
+ // {
+ // Events.instance().raiseEvent("org.jboss.seam.beforeTransactionCompletion");
+ // }
+ for (Synchronization sync : synchronizations)
+ {
+ try
+ {
+ sync.beforeCompletion();
+ }
+ catch (Exception e)
+ {
+ log.error("Exception processing transaction Synchronization before completion", e);
+ }
+ }
+ }
+
+}
Added: modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/Synchronizations.java
===================================================================
--- modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/Synchronizations.java (rev 0)
+++ modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/Synchronizations.java 2010-07-15 12:52:34 UTC (rev 13405)
@@ -0,0 +1,24 @@
+package org.jboss.seam.transaction;
+
+import javax.transaction.Synchronization;
+
+/**
+ * Interface for registering transaction synchronizations
+ *
+ * @author Gavin King
+ *
+ */
+public interface Synchronizations
+{
+ public void afterTransactionBegin();
+
+ public void afterTransactionCommit(boolean success);
+
+ public void afterTransactionRollback();
+
+ public void beforeTransactionCommit();
+
+ public void registerSynchronization(Synchronization sync);
+
+ public boolean isAwareOfContainerTransactions();
+}
\ No newline at end of file
Added: modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/Transaction.java
===================================================================
--- modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/Transaction.java (rev 0)
+++ modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/Transaction.java 2010-07-15 12:52:34 UTC (rev 13405)
@@ -0,0 +1,85 @@
+package org.jboss.seam.transaction;
+
+import javax.enterprise.context.ApplicationScoped;
+import javax.enterprise.inject.Produces;
+import javax.inject.Inject;
+import javax.naming.InitialContext;
+import javax.naming.NameNotFoundException;
+import javax.naming.NamingException;
+
+/**
+ * Supports injection of a Seam UserTransaction object that wraps the current
+ * JTA transaction or EJB container managed transaction.
+ *
+ * @author Mike Youngstrom
+ * @author Gavin King
+ *
+ */
+@ApplicationScoped
+public class Transaction
+{
+
+ @Inject
+ Synchronizations synchronizations;
+
+ @Produces
+ public UserTransaction getTransaction() throws NamingException
+ {
+ try
+ {
+ return createUTTransaction();
+ }
+ catch (NameNotFoundException nnfe)
+ {
+ try
+ {
+ return createCMTTransaction();
+ }
+ catch (NameNotFoundException nnfe2)
+ {
+ return createNoTransaction();
+ }
+ }
+ }
+
+ protected UserTransaction createNoTransaction()
+ {
+ return new NoTransaction();
+ }
+
+ protected UserTransaction createCMTTransaction() throws NamingException
+ {
+ return new CMTTransaction(EJB.getEJBContext(), synchronizations);
+ }
+
+ protected UserTransaction createUTTransaction() throws NamingException
+ {
+ return new UTTransaction(getUserTransaction(), synchronizations);
+ }
+
+ protected javax.transaction.UserTransaction getUserTransaction() throws NamingException
+ {
+ InitialContext context = Naming.getInitialContext();
+ try
+ {
+ return (javax.transaction.UserTransaction) context.lookup("java:comp/UserTransaction");
+ }
+ catch (NameNotFoundException nnfe)
+ {
+ try
+ {
+ // Embedded JBoss has no java:comp/UserTransaction
+ javax.transaction.UserTransaction ut = (javax.transaction.UserTransaction) context.lookup("UserTransaction");
+ ut.getStatus(); // for glassfish, which can return an unusable UT
+ return ut;
+ }
+ catch (Exception e)
+ {
+ throw nnfe;
+ }
+ }
+ }
+
+}
+
+
Added: modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/TransactionExtension.java
===================================================================
--- modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/TransactionExtension.java (rev 0)
+++ modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/TransactionExtension.java 2010-07-15 12:52:34 UTC (rev 13405)
@@ -0,0 +1,12 @@
+package org.jboss.seam.transaction;
+
+/**
+ * Extension than provides a {@link UserTransaction}
+ *
+ * @author stuart
+ *
+ */
+public class TransactionExtension
+{
+
+}
Added: modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/TransactionInterceptor.java
===================================================================
--- modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/TransactionInterceptor.java (rev 0)
+++ modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/TransactionInterceptor.java 2010-07-15 12:52:34 UTC (rev 13405)
@@ -0,0 +1,118 @@
+package org.jboss.seam.transaction;
+
+import java.lang.reflect.AnnotatedElement;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.inject.Inject;
+import javax.interceptor.AroundInvoke;
+import javax.interceptor.InvocationContext;
+
+/**
+ * Implements transaction propagation rules for Seam JavaBean components.
+ *
+ * @author Gavin King
+ * @author Shane Bryzak
+ */
+@Transactional
+public class TransactionInterceptor
+{
+ private static final long serialVersionUID = -4364203056333738988L;
+
+ transient private Map<AnnotatedElement, TransactionMetadata> transactionMetadata = new HashMap<AnnotatedElement, TransactionMetadata>();
+
+ @Inject
+ UserTransaction transaction;
+
+ private class TransactionMetadata
+ {
+ private boolean annotationPresent;
+ TransactionPropagation propType;
+
+ public TransactionMetadata(AnnotatedElement element)
+ {
+ annotationPresent = element.isAnnotationPresent(Transactional.class);
+
+ if (annotationPresent)
+ {
+ propType = element.getAnnotation(Transactional.class).value();
+ }
+ }
+
+ public boolean isAnnotationPresent()
+ {
+ return annotationPresent;
+ }
+
+ public boolean isNewTransactionRequired(boolean transactionActive)
+ {
+ return propType != null && propType.isNewTransactionRequired(transactionActive);
+ }
+ }
+
+ private TransactionMetadata lookupTransactionMetadata(AnnotatedElement element)
+ {
+ if (transactionMetadata == null)
+ {
+ transactionMetadata = new HashMap<AnnotatedElement, TransactionMetadata>();
+ }
+
+ TransactionMetadata metadata = transactionMetadata.get(element);
+
+ if (metadata == null)
+ {
+ metadata = loadMetadata(element);
+ }
+
+ return metadata;
+ }
+
+ private synchronized TransactionMetadata loadMetadata(AnnotatedElement element)
+ {
+ if (!transactionMetadata.containsKey(element))
+ {
+ TransactionMetadata metadata = new TransactionMetadata(element);
+ transactionMetadata.put(element, metadata);
+ return metadata;
+ }
+
+ return transactionMetadata.get(element);
+ }
+
+ @AroundInvoke
+ public Object aroundInvoke(final InvocationContext invocation) throws Exception
+ {
+ return new Work()
+ {
+
+ @Override
+ protected Object work() throws Exception
+ {
+ return invocation.proceed();
+ }
+
+ @Override
+ protected boolean isNewTransactionRequired(boolean transactionActive)
+ {
+ return isNewTransactionRequired(invocation.getMethod(), invocation.getTarget().getClass(), transactionActive);
+ }
+
+ private boolean isNewTransactionRequired(Method method, Class<?> beanClass, boolean transactionActive)
+ {
+ TransactionMetadata metadata = lookupTransactionMetadata(method);
+ if (metadata.isAnnotationPresent())
+ {
+ return metadata.isNewTransactionRequired(transactionActive);
+ }
+ else
+ {
+ metadata = lookupTransactionMetadata(beanClass);
+ return metadata.isNewTransactionRequired(transactionActive);
+ }
+ }
+
+ }.workInTransaction(transaction);
+ }
+
+}
Modified: modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/TransactionPropagation.java
===================================================================
--- modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/TransactionPropagation.java 2010-07-15 12:28:14 UTC (rev 13404)
+++ modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/TransactionPropagation.java 2010-07-15 12:52:34 UTC (rev 13405)
@@ -3,6 +3,38 @@
/**
* @author Dan Allen
*/
-public enum TransactionPropagation {
+public enum TransactionPropagation
+{
REQUIRED, SUPPORTS, MANDATORY, NEVER;
+
+ public boolean isNewTransactionRequired(boolean transactionActive)
+ {
+ switch (this)
+ {
+ case REQUIRED:
+ return !transactionActive;
+ case SUPPORTS:
+ return false;
+ case MANDATORY:
+ if (!transactionActive)
+ {
+ throw new IllegalStateException("No transaction active on call to MANDATORY method");
+ }
+ else
+ {
+ return false;
+ }
+ case NEVER:
+ if (transactionActive)
+ {
+ throw new IllegalStateException("Transaction active on call to NEVER method");
+ }
+ else
+ {
+ return false;
+ }
+ default:
+ throw new IllegalArgumentException();
+ }
+ }
}
\ No newline at end of file
Modified: modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/Transactional.java
===================================================================
--- modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/Transactional.java 2010-07-15 12:28:14 UTC (rev 13404)
+++ modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/Transactional.java 2010-07-15 12:52:34 UTC (rev 13405)
@@ -14,12 +14,14 @@
@Inherited
@InterceptorBinding
@Retention(RetentionPolicy.RUNTIME)
-(a)Target({ElementType.METHOD, ElementType.TYPE})
-public @interface Transactional {
+@Target( { ElementType.METHOD, ElementType.TYPE })
+public @interface Transactional
+{
/**
* The transaction propagation type.
- *
+ *
* @return REQUIRED by default
*/
- @Nonbinding TransactionPropagation value() default TransactionPropagation.REQUIRED;
+ @Nonbinding
+ TransactionPropagation value() default TransactionPropagation.REQUIRED;
}
\ No newline at end of file
Added: modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/UTTransaction.java
===================================================================
--- modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/UTTransaction.java (rev 0)
+++ modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/UTTransaction.java 2010-07-15 12:52:34 UTC (rev 13405)
@@ -0,0 +1,96 @@
+package org.jboss.seam.transaction;
+
+import javax.transaction.HeuristicMixedException;
+import javax.transaction.HeuristicRollbackException;
+import javax.transaction.NotSupportedException;
+import javax.transaction.RollbackException;
+import javax.transaction.Synchronization;
+import javax.transaction.SystemException;
+
+import org.jboss.weld.extensions.core.Veto;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Wraps JTA transaction management in a Seam UserTransaction interface.
+ *
+ * @author Mike Youngstrom
+ * @author Gavin King
+ *
+ */
+@Veto
+public class UTTransaction extends AbstractUserTransaction
+{
+ private static final Logger log = LoggerFactory.getLogger(UTTransaction.class);
+
+ private final javax.transaction.UserTransaction delegate;
+
+ UTTransaction(javax.transaction.UserTransaction delegate, Synchronizations sync)
+ {
+ super(sync);
+ this.delegate = delegate;
+ if (delegate == null)
+ {
+ throw new IllegalArgumentException("null UserTransaction");
+ }
+ }
+
+ public void begin() throws NotSupportedException, SystemException
+ {
+ log.debug("beginning JTA transaction");
+ delegate.begin();
+ getSynchronizations().afterTransactionBegin();
+ }
+
+ public void commit() throws RollbackException, HeuristicMixedException, HeuristicRollbackException, SecurityException, IllegalStateException, SystemException
+ {
+ log.debug("committing JTA transaction");
+ boolean success = false;
+ Synchronizations synchronizations = getSynchronizations();
+ synchronizations.beforeTransactionCommit();
+ try
+ {
+ delegate.commit();
+ success = true;
+ }
+ finally
+ {
+ synchronizations.afterTransactionCommit(success);
+ }
+ }
+
+ public void rollback() throws IllegalStateException, SecurityException, SystemException
+ {
+ log.debug("rolling back JTA transaction");
+ try
+ {
+ delegate.rollback();
+ }
+ finally
+ {
+ getSynchronizations().afterTransactionRollback();
+ }
+ }
+
+ public int getStatus() throws SystemException
+ {
+ return delegate.getStatus();
+ }
+
+ public void setRollbackOnly() throws IllegalStateException, SystemException
+ {
+ delegate.setRollbackOnly();
+ }
+
+ public void setTransactionTimeout(int timeout) throws SystemException
+ {
+ delegate.setTransactionTimeout(timeout);
+ }
+
+ @Override
+ public void registerSynchronization(Synchronization sync)
+ {
+ getSynchronizations().registerSynchronization(sync);
+ }
+
+}
Added: modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/UserTransaction.java
===================================================================
--- modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/UserTransaction.java (rev 0)
+++ modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/UserTransaction.java 2010-07-15 12:52:34 UTC (rev 13405)
@@ -0,0 +1,36 @@
+package org.jboss.seam.transaction;
+
+import javax.persistence.EntityManager;
+import javax.transaction.Synchronization;
+import javax.transaction.SystemException;
+
+/**
+ * Extends the standard UserTransaction interface with a couple of helpful
+ * methods.
+ *
+ * @author Gavin King
+ *
+ */
+public interface UserTransaction extends javax.transaction.UserTransaction
+{
+
+ public boolean isActive() throws SystemException;
+
+ public boolean isActiveOrMarkedRollback() throws SystemException;
+
+ public boolean isRolledBackOrMarkedRollback() throws SystemException;
+
+ public boolean isMarkedRollback() throws SystemException;
+
+ public boolean isNoTransaction() throws SystemException;
+
+ public boolean isRolledBack() throws SystemException;
+
+ public boolean isCommitted() throws SystemException;
+
+ public boolean isConversationContextRequired();
+
+ public abstract void registerSynchronization(Synchronization sync);
+
+ public void enlist(EntityManager entityManager) throws SystemException;
+}
Added: modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/Work.java
===================================================================
--- modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/Work.java (rev 0)
+++ modules/persistence/trunk/src/main/java/org/jboss/seam/transaction/Work.java 2010-07-15 12:52:34 UTC (rev 13405)
@@ -0,0 +1,84 @@
+package org.jboss.seam.transaction;
+
+import javax.ejb.ApplicationException;
+import javax.transaction.Status;
+import javax.transaction.UserTransaction;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Performs work in a JTA transaction.
+ *
+ * @author Gavin King
+ */
+public abstract class Work<T>
+{
+ private static final Logger log = LoggerFactory.getLogger(Work.class);
+
+ protected abstract T work() throws Exception;
+
+ protected boolean isNewTransactionRequired(boolean transactionActive)
+ {
+ return !transactionActive;
+ }
+
+ public final T workInTransaction(org.jboss.seam.transaction.UserTransaction transaction) throws Exception
+ {
+ boolean transactionActive = transaction.isActiveOrMarkedRollback() || transaction.isRolledBack();
+ // TODO: temp workaround, what should we really do in this case??
+ boolean newTransactionRequired = isNewTransactionRequired(transactionActive);
+ UserTransaction userTransaction = newTransactionRequired ? transaction : null;
+
+ try
+ {
+ if (newTransactionRequired)
+ {
+ log.debug("beginning transaction");
+ userTransaction.begin();
+ }
+
+ T result = work();
+ if (newTransactionRequired)
+ {
+ if (transaction.isMarkedRollback())
+ {
+ log.debug("rolling back transaction");
+ userTransaction.rollback();
+ }
+ else
+ {
+ log.debug("committing transaction");
+ userTransaction.commit();
+ }
+ }
+ return result;
+ }
+ catch (Exception e)
+ {
+ if (newTransactionRequired && userTransaction.getStatus() != Status.STATUS_NO_TRANSACTION && isRollbackRequired(e, true))
+ {
+ log.debug("rolling back transaction");
+ userTransaction.rollback();
+ }
+ throw e;
+ }
+
+ }
+
+ public static boolean isRollbackRequired(Exception e, boolean isJavaBean)
+ {
+ Class<? extends Exception> clazz = e.getClass();
+ return (isSystemException(e, isJavaBean, clazz)) || (clazz.isAnnotationPresent(ApplicationException.class) && clazz.getAnnotation(ApplicationException.class).rollback());
+ }
+
+ private static boolean isSystemException(Exception e, boolean isJavaBean, Class<? extends Exception> clazz)
+ {
+ return isJavaBean && (e instanceof RuntimeException) && !clazz.isAnnotationPresent(ApplicationException.class);
+ // &&
+ // TODO: this is hackish, maybe just turn off RollackInterceptor for
+ // @Converter/@Validator components
+ // !JSF.VALIDATOR_EXCEPTION.isInstance(e) &&
+ // !JSF.CONVERTER_EXCEPTION.isInstance(e);
+ }
+}
Added: modules/persistence/trunk/src/test/java/org/jboss/seam/transactions/test/Hotel.java
===================================================================
--- modules/persistence/trunk/src/test/java/org/jboss/seam/transactions/test/Hotel.java (rev 0)
+++ modules/persistence/trunk/src/test/java/org/jboss/seam/transactions/test/Hotel.java 2010-07-15 12:52:34 UTC (rev 13405)
@@ -0,0 +1,205 @@
+/*
+ * 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;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+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.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")
+@Veto
+public class Hotel 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;
+
+ public Hotel()
+ {
+ }
+
+ public Hotel(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 Hotel(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
+ 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 + ")";
+ }
+}
Added: modules/persistence/trunk/src/test/java/org/jboss/seam/transactions/test/SimpleTest.java
===================================================================
--- modules/persistence/trunk/src/test/java/org/jboss/seam/transactions/test/SimpleTest.java (rev 0)
+++ modules/persistence/trunk/src/test/java/org/jboss/seam/transactions/test/SimpleTest.java 2010-07-15 12:52:34 UTC (rev 13405)
@@ -0,0 +1,75 @@
+package org.jboss.seam.transactions.test;
+
+import java.util.List;
+
+import javax.inject.Inject;
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.PersistenceUnit;
+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.jboss.arquillian.api.Deployment;
+import org.jboss.arquillian.junit.Arquillian;
+import org.jboss.seam.transaction.Transaction;
+import org.jboss.seam.transaction.UserTransaction;
+import org.jboss.seam.transactions.test.util.ArtifactNames;
+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 SimpleTest
+{
+ @Deployment
+ public static Archive<?> createTestArchive()
+ {
+
+ WebArchive war = ShrinkWrap.create("test.war", WebArchive.class).addLibraries(MavenArtifactResolver.resolve(ArtifactNames.WELD_EXTENSIONS)).addPackage(Transaction.class.getPackage()).addPackage(SimpleTest.class.getPackage()).addWebResource("META-INF/persistence.xml", "classes/META-INF/persistence.xml").addWebResource(new ByteArrayAsset(new byte[0]), "beans.xml");
+
+ return war;
+ }
+
+ @Inject
+ UserTransaction transaction;
+
+ @PersistenceUnit
+ EntityManagerFactory emf;
+
+ @Test
+ public void simpleTest() throws NotSupportedException, SystemException, SecurityException, IllegalStateException, RollbackException, HeuristicMixedException, HeuristicRollbackException
+ {
+ transaction.begin();
+ EntityManager em = emf.createEntityManager();
+ em.joinTransaction();
+ Hotel h = new Hotel("test", "Fake St", "Wollongong", "NSW", "2518", "Australia");
+ em.persist(h);
+ em.flush();
+ transaction.commit();
+
+ transaction.begin();
+ em = emf.createEntityManager();
+ em.joinTransaction();
+ h = new Hotel("test2", "Fake St", "Wollongong", "NSW", "2518", "Australia");
+ em.persist(h);
+ em.flush();
+ transaction.rollback();
+
+ transaction.begin();
+ em = emf.createEntityManager();
+ em.joinTransaction();
+ List<Hotel> hotels = em.createQuery("select h from Hotel h").getResultList();
+ Assert.assertTrue(hotels.size() == 1);
+ transaction.rollback();
+
+ }
+}
Added: modules/persistence/trunk/src/test/java/org/jboss/seam/transactions/test/util/ArtifactNames.java
===================================================================
--- modules/persistence/trunk/src/test/java/org/jboss/seam/transactions/test/util/ArtifactNames.java (rev 0)
+++ modules/persistence/trunk/src/test/java/org/jboss/seam/transactions/test/util/ArtifactNames.java 2010-07-15 12:52:34 UTC (rev 13405)
@@ -0,0 +1,7 @@
+package org.jboss.seam.transactions.test.util;
+
+public class ArtifactNames
+{
+ public static final String WELD_EXTENSIONS = "org.jboss.weld:weld-extensions:1.0.0-SNAPSHOT";
+
+}
Added: modules/persistence/trunk/src/test/java/org/jboss/seam/transactions/test/util/MavenArtifactResolver.java
===================================================================
--- modules/persistence/trunk/src/test/java/org/jboss/seam/transactions/test/util/MavenArtifactResolver.java (rev 0)
+++ modules/persistence/trunk/src/test/java/org/jboss/seam/transactions/test/util/MavenArtifactResolver.java 2010-07-15 12:52:34 UTC (rev 13405)
@@ -0,0 +1,25 @@
+package org.jboss.seam.transactions.test.util;
+
+import java.io.File;
+
+public class MavenArtifactResolver
+{
+ private static final String LOCAL_MAVEN_REPO =
+ System.getProperty("user.home") + File.separatorChar +
+ ".m2" + File.separatorChar + "repository";
+
+ public static File resolve(String groupId, String artifactId, String version)
+ {
+ return new File(LOCAL_MAVEN_REPO + File.separatorChar +
+ groupId.replace(".", File.separator) + File.separatorChar +
+ artifactId + File.separatorChar +
+ version + File.separatorChar +
+ artifactId + "-" + version + ".jar");
+ }
+
+ public static File resolve(String qualifiedArtifactId)
+ {
+ String[] segments = qualifiedArtifactId.split(":");
+ return resolve(segments[0], segments[1], segments[2]);
+ }
+}
Added: modules/persistence/trunk/src/test/resources/META-INF/persistence.xml
===================================================================
--- modules/persistence/trunk/src/test/resources/META-INF/persistence.xml (rev 0)
+++ modules/persistence/trunk/src/test/resources/META-INF/persistence.xml 2010-07-15 12:52:34 UTC (rev 13405)
@@ -0,0 +1,26 @@
+<?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.Hotel</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"/>
+
+ <!-- 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>
Added: modules/persistence/trunk/src/test/resources/META-INF/seam-beans.xml
===================================================================
--- modules/persistence/trunk/src/test/resources/META-INF/seam-beans.xml (rev 0)
+++ modules/persistence/trunk/src/test/resources/META-INF/seam-beans.xml 2010-07-15 12:52:34 UTC (rev 13405)
@@ -0,0 +1,30 @@
+<!--
+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.
+-->
+<beans xmlns="http://java.sun.com/xml/ns/javaee"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:s="urn:java:seam:core"
+ xmlns:i18n="urn:java:org.jboss.seam.international.locale"
+ xsi:schemaLocation="
+ http://java.sun.com/xml/ns/javaee
+ http://docs.jboss.org/cdi/beans_1_0.xsd">
+
+</beans>
Added: modules/persistence/trunk/src/test/resources/arquillian.xml
===================================================================
--- modules/persistence/trunk/src/test/resources/arquillian.xml (rev 0)
+++ modules/persistence/trunk/src/test/resources/arquillian.xml 2010-07-15 12:52:34 UTC (rev 13405)
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<arquillian xmlns="http://jboss.com/arquillian"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:gfembedded="urn:arq:org.jboss.arquillian.glassfish.embedded30"
+ xmlns:gfremote="urn:arq:org.jboss.arquillian.container.glassfish.remote30">
+
+ <engine>
+ <deploymentExportPath>/tmp/</deploymentExportPath>
+ </engine>
+
+ <gfremote:container>
+ <gfremote:remoteServerHttpPort>7070</gfremote:remoteServerHttpPort>
+ </gfremote:container>
+
+ <gfembedded:container>
+ <gfembedded:sunResourcesXml>src/test/resources-glassfish/sun-resources.xml</gfembedded:sunResourcesXml>
+ </gfembedded:container>
+
+</arquillian>
Added: modules/persistence/trunk/src/test/resources-glassfish/sun-resources.xml
===================================================================
--- modules/persistence/trunk/src/test/resources-glassfish/sun-resources.xml (rev 0)
+++ modules/persistence/trunk/src/test/resources-glassfish/sun-resources.xml 2010-07-15 12:52:34 UTC (rev 13405)
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE resources PUBLIC "-//Sun Microsystems, Inc.//DTD Application Server 9.0 Resource Definitions //EN"
+ "http://www.sun.com/software/appserver/dtds/sun-resources_1_4.dtd">
+<resources>
+ <jdbc-resource pool-name="ArquillianEmbeddedDerbyPool"
+ jndi-name="jdbc/__arquillian"/>
+ <jdbc-connection-pool name="ArquillianEmbeddedDerbyPool"
+ res-type="javax.sql.DataSource"
+ datasource-classname="org.apache.derby.jdbc.EmbeddedDataSource"
+ is-isolation-level-guaranteed="false">
+ <property name="databaseName" value="target/databases/derby"/>
+ <property name="createDatabase" value="create"/>
+ </jdbc-connection-pool>
+ <!--
+ <jdbc-resource pool-name="ArquillianEmbeddedH2Pool"
+ jndi-name="jdbc/__arquillian"/>
+ <jdbc-connection-pool name="ArquillianEmbeddedH2Pool"
+ res-type="javax.sql.DataSource"
+ datasource-classname="org.h2.jdbcx.JdbcDataSource">
+ <property name="user" value="sa"/>
+ <property name="password" value=""/>
+ <property name="url" value="jdbc:h2:file:target/databases/h2/db"/>
+ </jdbc-connection-pool>
+ -->
+</resources>
Added: modules/persistence/trunk/src/test/resources-jbossas/jndi.properties
===================================================================
--- modules/persistence/trunk/src/test/resources-jbossas/jndi.properties (rev 0)
+++ modules/persistence/trunk/src/test/resources-jbossas/jndi.properties 2010-07-15 12:52:34 UTC (rev 13405)
@@ -0,0 +1,3 @@
+java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
+java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
+java.naming.provider.url=jnp://localhost:1099
Added: modules/persistence/trunk/src/test/resources-jbossas/seam-transactions-test-ds.xml
===================================================================
--- modules/persistence/trunk/src/test/resources-jbossas/seam-transactions-test-ds.xml (rev 0)
+++ modules/persistence/trunk/src/test/resources-jbossas/seam-transactions-test-ds.xml 2010-07-15 12:52:34 UTC (rev 13405)
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE datasources
+ PUBLIC "-//JBoss//DTD JBOSS JCA Config 1.5//EN"
+ "http://www.jboss.org/j2ee/dtd/jboss-ds_1_5.dtd">
+<datasources>
+ <local-tx-datasource>
+ <jndi-name>jdbc/__default</jndi-name>
+ <use-java-context>false</use-java-context>
+ <connection-url>jdbc:hsqldb:.</connection-url>
+ <driver-class>org.hsqldb.jdbcDriver</driver-class>
+ <user-name>sa</user-name>
+ <password></password>
+ <min-pool-size>5</min-pool-size>
+ <max-pool-size>20</max-pool-size>
+ </local-tx-datasource>
+</datasources>
13 years, 10 months
Seam SVN: r13404 - modules/security/trunk/examples/idmconsole/src/main/java/org/jboss/seam/security/examples/idmconsole/model.
by seam-commits@lists.jboss.org
Author: shane.bryzak(a)jboss.com
Date: 2010-07-15 08:28:14 -0400 (Thu, 15 Jul 2010)
New Revision: 13404
Added:
modules/security/trunk/examples/idmconsole/src/main/java/org/jboss/seam/security/examples/idmconsole/model/RelationshipName.java
Log:
oops, will be needing this
Added: modules/security/trunk/examples/idmconsole/src/main/java/org/jboss/seam/security/examples/idmconsole/model/RelationshipName.java
===================================================================
--- modules/security/trunk/examples/idmconsole/src/main/java/org/jboss/seam/security/examples/idmconsole/model/RelationshipName.java (rev 0)
+++ modules/security/trunk/examples/idmconsole/src/main/java/org/jboss/seam/security/examples/idmconsole/model/RelationshipName.java 2010-07-15 12:28:14 UTC (rev 13404)
@@ -0,0 +1,42 @@
+package org.jboss.seam.security.examples.idmconsole.model;
+
+import java.io.Serializable;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * This is a simple lookup table containing relationship (i.e. role) names.
+ *
+ * @author Shane Bryzak
+ */
+@Entity
+public class RelationshipName implements Serializable
+{
+ private static final long serialVersionUID = 8775236263787825703L;
+
+ private Long id;
+ private String name;
+
+ @Id @GeneratedValue
+ public Long getId()
+ {
+ return id;
+ }
+
+ public void setId(Long id)
+ {
+ this.id = id;
+ }
+
+ public String getName()
+ {
+ return name;
+ }
+
+ public void setName(String name)
+ {
+ this.name = name;
+ }
+}
13 years, 10 months
Seam SVN: r13403 - in modules/security/trunk: examples/idmconsole/src/main/webapp and 4 other directories.
by seam-commits@lists.jboss.org
Author: shane.bryzak(a)jboss.com
Date: 2010-07-15 08:25:53 -0400 (Thu, 15 Jul 2010)
New Revision: 13403
Modified:
modules/security/trunk/examples/idmconsole/src/main/resources/import.sql
modules/security/trunk/examples/idmconsole/src/main/webapp/WEB-INF/security-rules.drl
modules/security/trunk/examples/idmconsole/src/main/webapp/manageusers.xhtml
modules/security/trunk/examples/idmconsole/src/main/webapp/userdetail.xhtml
modules/security/trunk/impl/src/main/java/org/jboss/seam/security/management/JpaIdentityStore.java
modules/security/trunk/impl/src/main/java/org/jboss/seam/security/management/action/UserAction.java
modules/security/trunk/impl/src/main/java/org/jboss/seam/security/management/picketlink/IdentitySessionProducer.java
Log:
implement more identity store methods
Modified: modules/security/trunk/examples/idmconsole/src/main/resources/import.sql
===================================================================
--- modules/security/trunk/examples/idmconsole/src/main/resources/import.sql 2010-07-15 04:17:18 UTC (rev 13402)
+++ modules/security/trunk/examples/idmconsole/src/main/resources/import.sql 2010-07-15 12:25:53 UTC (rev 13403)
@@ -1,3 +1,6 @@
+insert into RelationshipName(id, name) values (1, 'admin');
+insert into RelationshipName(id, name) values (2, 'manager');
+
insert into IdentityObjectType(id, name) values (1, 'USER');
insert into IdentityObjectType(id, name) values (2, 'GROUP');
@@ -10,7 +13,7 @@
insert into IdentityObjectCredential (id, identity_object_id, credential_type_id, value) values (1, 1, 1, 'password');
insert into IdentityObjectCredential (id, identity_object_id, credential_type_id, value) values (2, 2, 1, 'demo');
-insert into IdentityObjectRelationshipType (id, name) values (1, 'MEMBER_OF');
-insert into IdentityObjectRelationshipType (id, name) values (2, 'ROLE');
+insert into IdentityObjectRelationshipType (id, name) values (1, 'JBOSS_IDENTITY_MEMBERSHIP');
+insert into IdentityObjectRelationshipType (id, name) values (2, 'JBOSS_IDENTITY_ROLE');
insert into IdentityObjectRelationship (id, name, relationship_type_id, from_identity_id, to_identity_id) values (1, 'admin', 2, 1, 3);
Modified: modules/security/trunk/examples/idmconsole/src/main/webapp/WEB-INF/security-rules.drl
===================================================================
--- modules/security/trunk/examples/idmconsole/src/main/webapp/WEB-INF/security-rules.drl 2010-07-15 04:17:18 UTC (rev 13402)
+++ modules/security/trunk/examples/idmconsole/src/main/webapp/WEB-INF/security-rules.drl 2010-07-15 12:25:53 UTC (rev 13403)
@@ -43,3 +43,11 @@
check.grant();
end
+rule ManageRelationships
+ no-loop
+ activation-group "permissions"
+when
+ check: PermissionCheck(resource == "seam.relationship", granted == false)
+then
+ check.grant();
+end
Modified: modules/security/trunk/examples/idmconsole/src/main/webapp/manageusers.xhtml
===================================================================
--- modules/security/trunk/examples/idmconsole/src/main/webapp/manageusers.xhtml 2010-07-15 04:17:18 UTC (rev 13402)
+++ modules/security/trunk/examples/idmconsole/src/main/webapp/manageusers.xhtml 2010-07-15 12:25:53 UTC (rev 13403)
@@ -43,12 +43,12 @@
Action
</f:facet>
- <ui:fragment rendered="#{identity.hasPermission('seam.user', 'update')}">
+ <ui:fragment rendered="#{identity.hasPermission('seam.identity', 'update')}">
<h:commandLink id="edit" value="Edit" action="#{userAction.editUser(user.username)}"/>
<span> | </span>
</ui:fragment>
<h:link id="delete" value="Delete" action="#{userAction.deleteUser(user.username)}"
- rendered="#{identity.hasPermission('seam.user', 'delete')}"
+ rendered="#{identity.hasPermission('seam.identity', 'delete')}"
onclick="return confirmDelete()"/>
</h:column>
</h:dataTable>
Modified: modules/security/trunk/examples/idmconsole/src/main/webapp/userdetail.xhtml
===================================================================
--- modules/security/trunk/examples/idmconsole/src/main/webapp/userdetail.xhtml 2010-07-15 04:17:18 UTC (rev 13402)
+++ modules/security/trunk/examples/idmconsole/src/main/webapp/userdetail.xhtml 2010-07-15 12:25:53 UTC (rev 13403)
@@ -49,13 +49,11 @@
</div>
<div class="formRow">
- <h:outputLabel for="roles" value="Member of" styleClass="formLabel"/>
- <div class="selectMany">
- <h:selectManyCheckbox id="roles" value="#{userAction.roles}" layout="pageDirection" styleClass="roles">
- <!--s:selectItems value="#{identityManager.listGrantableRoles}" var="role" label="#{role}"/-->
- </h:selectManyCheckbox>
- </div>
- <div class="validationError"><h:message for="roles"/></div>
+ <h:outputLabel value="Member of" styleClass="formLabel"/>
+ <ui:repeat value="#{userAction.roles}" var="role">
+ #{role.roleType.name}<span> in group </span>#{role.group.name}<br/>
+ </ui:repeat>
+
</div>
<div class="formRow">
Modified: modules/security/trunk/impl/src/main/java/org/jboss/seam/security/management/JpaIdentityStore.java
===================================================================
--- modules/security/trunk/impl/src/main/java/org/jboss/seam/security/management/JpaIdentityStore.java 2010-07-15 04:17:18 UTC (rev 13402)
+++ modules/security/trunk/impl/src/main/java/org/jboss/seam/security/management/JpaIdentityStore.java 2010-07-15 12:25:53 UTC (rev 13403)
@@ -29,6 +29,7 @@
import org.jboss.weld.extensions.util.properties.query.PropertyQueries;
import org.jboss.weld.extensions.util.properties.query.TypedPropertyCriteria;
import org.picketlink.idm.common.exception.IdentityException;
+import org.picketlink.idm.impl.store.FeaturesMetaDataImpl;
import org.picketlink.idm.spi.configuration.IdentityStoreConfigurationContext;
import org.picketlink.idm.spi.configuration.metadata.IdentityObjectAttributeMetaData;
import org.picketlink.idm.spi.exception.OperationNotSupportedException;
@@ -40,6 +41,7 @@
import org.picketlink.idm.spi.model.IdentityObjectType;
import org.picketlink.idm.spi.search.IdentityObjectSearchCriteria;
import org.picketlink.idm.spi.store.FeaturesMetaData;
+import org.picketlink.idm.spi.store.IdentityObjectSearchCriteriaType;
import org.picketlink.idm.spi.store.IdentityStoreInvocationContext;
import org.picketlink.idm.spi.store.IdentityStoreSession;
/*import org.slf4j.Logger;
@@ -60,6 +62,7 @@
public static final String OPTION_IDENTITY_CLASS_NAME = "identityEntityClassName";
public static final String OPTION_CREDENTIAL_CLASS_NAME = "credentialEntityClassName";
public static final String OPTION_RELATIONSHIP_CLASS_NAME = "relationshipEntityClassName";
+ public static final String OPTION_RELATIONSHIP_NAME_CLASS_NAME = "relationshipNameEntityClassName";
private static final String DEFAULT_USER_IDENTITY_TYPE = "USER";
private static final String DEFAULT_ROLE_IDENTITY_TYPE = "ROLE";
@@ -83,11 +86,13 @@
private static final String PROPERTY_RELATIONSHIP_TYPE = "RELATIONSHIP_TYPE";
private static final String PROPERTY_RELATIONSHIP_TYPE_NAME = "RELATIONSHIP_TYPE_NAME";
private static final String PROPERTY_RELATIONSHIP_NAME = "RELATIONSHIP_NAME";
+
+ // Distinct from PROPERTY_RELATIONSHIP NAME - this property refers to the name field in the RELATIONSHIP_NAME entity
+ private static final String PROPERTY_RELATIONSHIP_NAME_NAME = "RELATIONSHIP_NAME_NAME";
private static final String PROPERTY_ATTRIBUTE_NAME = "ATTRIBUTE_NAME";
private static final String PROPERTY_ATTRIBUTE_VALUE = "ATTRIBUTE_VALUE";
- private static final String PROPERTY_ROLE_TYPE_NAME = "ROLE_TYPE_NAME";
+ private static final String PROPERTY_ROLE_TYPE_NAME = "ROLE_TYPE_NAME";
-
private class EntityToSpiConverter
{
private static final String IDENTITY_TYPE_CACHE_PREFIX = "identity_type:";
@@ -115,8 +120,8 @@
else
{
IdentityObject obj = new IdentityObjectImpl(
- (String) identityIdProperty.getValue(entity),
- (String) identityNameProperty.getValue(entity),
+ identityIdProperty.getValue(entity).toString(),
+ identityNameProperty.getValue(entity).toString(),
convertToIdentityObjectType(identityTypeProperty.getValue(entity)));
cache.put(entity, obj);
@@ -176,6 +181,7 @@
private Class<?> relationshipClass;
private Class<?> attributeClass;
private Class<?> roleTypeClass;
+ private Class<?> relationshipNameClass;
private String userIdentityType = DEFAULT_USER_IDENTITY_TYPE;
private String roleIdentityType = DEFAULT_ROLE_IDENTITY_TYPE;
@@ -194,6 +200,8 @@
*/
private Map<String,Property<Object>> attributeProperties = new HashMap<String,Property<Object>>();
+ private FeaturesMetaData featuresMetaData;
+
private class PropertyTypeCriteria implements PropertyCriteria
{
private PropertyType pt;
@@ -223,7 +231,7 @@
public void bootstrap(IdentityStoreConfigurationContext configurationContext)
throws IdentityException
- {
+ {
String clsName = configurationContext.getStoreConfigurationMetaData()
.getOptionSingleValue(OPTION_IDENTITY_CLASS_NAME);
@@ -233,7 +241,7 @@
}
catch (ClassNotFoundException e)
{
- throw new IdentityException("Error bootstrapping JpaIdentityStore - no identity entity class found: " + clsName);
+ throw new IdentityException("Error bootstrapping JpaIdentityStore - invalid identity entity class: " + clsName);
}
if (identityClass == null)
@@ -253,7 +261,7 @@
}
catch (ClassNotFoundException e)
{
- throw new IdentityException("Error bootstrapping JpaIdentityStore - no credential entity class found: " + clsName);
+ throw new IdentityException("Error bootstrapping JpaIdentityStore - invalid credential entity class: " + clsName);
}
}
@@ -266,9 +274,27 @@
}
catch (ClassNotFoundException e)
{
- throw new IdentityException("Error bootstrapping JpaIdentityStore - no relationship entity class found: " + clsName);
+ throw new IdentityException("Error bootstrapping JpaIdentityStore - invalid relationship entity class: " + clsName);
}
+ boolean namedRelationshipsSupported = false;
+
+ clsName = configurationContext.getStoreConfigurationMetaData()
+ .getOptionSingleValue(OPTION_RELATIONSHIP_NAME_CLASS_NAME);
+
+ if (clsName != null)
+ {
+ try
+ {
+ relationshipNameClass = Class.forName(clsName);
+ namedRelationshipsSupported = true;
+ }
+ catch (ClassNotFoundException e)
+ {
+ throw new IdentityException("Error bootstrapping JpaIdentityStore - invalid relationship name entity class: " + clsName);
+ }
+ }
+
configureIdentityId();
configureIdentityName();
configureIdentityType();
@@ -277,6 +303,19 @@
configureRelationships();
configureAttributes();
configureRoleTypeNames();
+
+ if (namedRelationshipsSupported)
+ {
+ configureRelationshipNames();
+ }
+
+ featuresMetaData = new FeaturesMetaDataImpl(
+ configurationContext.getStoreConfigurationMetaData(),
+ new HashSet<IdentityObjectSearchCriteriaType>(),
+ false,
+ namedRelationshipsSupported,
+ new HashSet<String>()
+ );
}
protected void configureIdentityId() throws IdentityException
@@ -911,6 +950,15 @@
}
}
+ protected void configureRelationshipNames()
+ {
+ Property<Object> relationshipNameProp = findNamedProperty(relationshipNameClass, "name");
+ if (relationshipNameProp != null)
+ {
+ modelProperties.put(PROPERTY_RELATIONSHIP_NAME_NAME, relationshipNameProp);
+ }
+ }
+
public String getUserIdentityType()
{
return userIdentityType;
@@ -1120,8 +1168,24 @@
protected Object lookupRelationshipType(IdentityObjectRelationshipType relationshipType, EntityManager em)
{
- // TODO implement
- return null;
+ Property<?> relationshipTypeNameProp = modelProperties.get(PROPERTY_RELATIONSHIP_TYPE_NAME);
+
+ if (relationshipTypeNameProp != null)
+ {
+ CriteriaBuilder builder = em.getCriteriaBuilder();
+ CriteriaQuery<?> criteria = builder.createQuery(relationshipTypeNameProp.getDeclaringClass());
+ Root<?> root = criteria.from(relationshipTypeNameProp.getDeclaringClass());
+
+ List<Predicate> predicates = new ArrayList<Predicate>();
+ predicates.add(builder.equal(root.get(relationshipTypeNameProp.getName()), relationshipType.getName()));
+ criteria.where(predicates.toArray(new Predicate[0]));
+
+ return em.createQuery(criteria).getSingleResult();
+ }
+ else
+ {
+ return relationshipType.getName();
+ }
}
public String createRelationshipName(IdentityStoreInvocationContext ctx,
@@ -1287,12 +1351,35 @@
}
public Set<String> getRelationshipNames(IdentityStoreInvocationContext ctx,
- IdentityObject identity, IdentityObjectSearchCriteria criteria)
+ IdentityObject identity, IdentityObjectSearchCriteria searchCriteria)
throws IdentityException, OperationNotSupportedException
{
- System.out.println("*** Invoked unimplemented method getRelationshipNames()");
- // TODO Auto-generated method stub
- return null;
+ Set<String> names = new HashSet<String>();
+
+ if (!featuresMetaData.isNamedRelationshipsSupported()) return names;
+
+ EntityManager em = getEntityManager(ctx);
+
+ CriteriaBuilder builder = em.getCriteriaBuilder();
+ CriteriaQuery<?> criteria = builder.createQuery(relationshipClass);
+ Root<?> root = criteria.from(relationshipClass);
+
+ Property<?> identityFromProperty = modelProperties.get(PROPERTY_RELATIONSHIP_FROM);
+ Property<?> relationshipNameProperty = modelProperties.get(PROPERTY_RELATIONSHIP_NAME);
+
+ List<Predicate> predicates = new ArrayList<Predicate>();
+ predicates.add(builder.equal(root.get(identityFromProperty.getName()),
+ lookupIdentity(identity, em)));
+
+ criteria.where(predicates.toArray(new Predicate[0]));
+
+ List<?> results = em.createQuery(criteria).getResultList();
+ for (Object result : results)
+ {
+ names.add((String) relationshipNameProperty.getValue(result));
+ }
+
+ return names;
}
public Map<String, String> getRelationshipProperties(
@@ -1306,10 +1393,8 @@
}
public FeaturesMetaData getSupportedFeatures()
- {
- System.out.println("*** Invoked unimplemented method getSupportedFeatures()");
- // TODO Auto-generated method stub
- return null;
+ {
+ return featuresMetaData;
}
public void removeIdentityObject(
@@ -1461,13 +1546,74 @@
}
public Set<IdentityObjectRelationship> resolveRelationships(
- IdentityStoreInvocationContext invocationCxt, IdentityObject identity,
+ IdentityStoreInvocationContext ctx, IdentityObject identity,
IdentityObjectRelationshipType relationshipType, boolean parent,
boolean named, String name) throws IdentityException
{
- // TODO Auto-generated method stub
- System.out.println("*** Invoked unimplemented method resolveRelationships()");
- return null;
+ Set<IdentityObjectRelationship> relationships = new HashSet<IdentityObjectRelationship>();
+
+ EntityManager em = getEntityManager(ctx);
+
+ CriteriaBuilder builder = em.getCriteriaBuilder();
+ CriteriaQuery<?> criteria = builder.createQuery(relationshipClass);
+ Root<?> root = criteria.from(relationshipClass);
+
+ Property<?> relationshipFromProp = modelProperties.get(PROPERTY_RELATIONSHIP_FROM);
+ Property<?> relationshipToProp = modelProperties.get(PROPERTY_RELATIONSHIP_TO);
+ Property<?> relationshipTypeProp = modelProperties.get(PROPERTY_RELATIONSHIP_TYPE);
+ Property<?> relationshipNameProp = modelProperties.get(PROPERTY_RELATIONSHIP_NAME);
+
+ List<Predicate> predicates = new ArrayList<Predicate>();
+
+ if (parent)
+ {
+ predicates.add(builder.equal(root.get(relationshipToProp.getName()),
+ lookupIdentity(identity, em)));
+ }
+ else
+ {
+ predicates.add(builder.equal(root.get(relationshipFromProp.getName()),
+ lookupIdentity(identity, em)));
+ }
+
+ if (relationshipType != null)
+ {
+ predicates.add(builder.equal(root.get(relationshipTypeProp.getName()),
+ lookupRelationshipType(relationshipType, em)));
+ }
+
+ if (named)
+ {
+ if (name != null)
+ {
+ predicates.add(builder.equal(root.get(relationshipNameProp.getName()),
+ name));
+ }
+ else
+ {
+ predicates.add(builder.isNotNull(root.get(relationshipNameProp.getName())));
+ }
+ }
+
+ criteria.where(predicates.toArray(new Predicate[0]));
+
+ List<?> results = em.createQuery(criteria).getResultList();
+
+ EntityToSpiConverter converter = new EntityToSpiConverter();
+
+ for (Object result : results)
+ {
+ IdentityObjectRelationship relationship = new IdentityObjectRelationshipImpl(
+ converter.convertToIdentityObject(relationshipFromProp.getValue(result)),
+ converter.convertToIdentityObject(relationshipToProp.getValue(result)),
+ (String) relationshipNameProp.getValue(result),
+ converter.convertToRelationshipType(relationshipTypeProp.getValue(result))
+ );
+
+ relationships.add(relationship);
+ }
+
+ return relationships;
}
public void setRelationshipNameProperties(
Modified: modules/security/trunk/impl/src/main/java/org/jboss/seam/security/management/action/UserAction.java
===================================================================
--- modules/security/trunk/impl/src/main/java/org/jboss/seam/security/management/action/UserAction.java 2010-07-15 04:17:18 UTC (rev 13402)
+++ modules/security/trunk/impl/src/main/java/org/jboss/seam/security/management/action/UserAction.java 2010-07-15 12:25:53 UTC (rev 13403)
@@ -30,7 +30,7 @@
private String username;
private String password;
private String confirm;
- private List<Role> roles;
+ private Collection<Role> roles;
private boolean enabled;
private boolean newUserFlag;
@@ -49,7 +49,7 @@
{
conversation.begin();
this.username = username;
- //roles = identityManager.getGrantedRoles(username);
+ roles = identityManager.getGrantedRoles(username);
enabled = identityManager.isUserEnabled(username);
newUserFlag = false;
}
@@ -203,7 +203,7 @@
this.confirm = confirm;
}
- public List<Role> getRoles()
+ public Collection<Role> getRoles()
{
return roles;
}
Modified: modules/security/trunk/impl/src/main/java/org/jboss/seam/security/management/picketlink/IdentitySessionProducer.java
===================================================================
--- modules/security/trunk/impl/src/main/java/org/jboss/seam/security/management/picketlink/IdentitySessionProducer.java 2010-07-15 04:17:18 UTC (rev 13402)
+++ modules/security/trunk/impl/src/main/java/org/jboss/seam/security/management/picketlink/IdentitySessionProducer.java 2010-07-15 12:25:53 UTC (rev 13403)
@@ -66,6 +66,9 @@
options.put(JpaIdentityStore.OPTION_RELATIONSHIP_CLASS_NAME,
createOptionList("org.jboss.seam.security.examples.idmconsole.model.IdentityObjectRelationship"));
+ options.put(JpaIdentityStore.OPTION_RELATIONSHIP_NAME_CLASS_NAME,
+ createOptionList("org.jboss.seam.security.examples.idmconsole.model.RelationshipName"));
+
store.setOptions(options);
stores.add(store);
metadata.setIdentityStores(stores);
13 years, 10 months
Seam SVN: r13402 - modules/security/trunk/impl/src/main/java/org/jboss/seam/security/jaas.
by seam-commits@lists.jboss.org
Author: shane.bryzak(a)jboss.com
Date: 2010-07-15 00:17:18 -0400 (Thu, 15 Jul 2010)
New Revision: 13402
Modified:
modules/security/trunk/impl/src/main/java/org/jboss/seam/security/jaas/JaasAuthenticator.java
Log:
a bit more javadoc, naming convention
Modified: modules/security/trunk/impl/src/main/java/org/jboss/seam/security/jaas/JaasAuthenticator.java
===================================================================
--- modules/security/trunk/impl/src/main/java/org/jboss/seam/security/jaas/JaasAuthenticator.java 2010-07-15 04:14:40 UTC (rev 13401)
+++ modules/security/trunk/impl/src/main/java/org/jboss/seam/security/jaas/JaasAuthenticator.java 2010-07-15 04:17:18 UTC (rev 13402)
@@ -23,13 +23,14 @@
import org.slf4j.LoggerFactory;
/**
- * An authenticator for authenticating with JAAS
+ * An authenticator for authenticating with JAAS. The jaasConfigName property
+ * _must_ be configured to point to a valid JAAS configuration name, typically
+ * defined in a file called login-config.xml in the application server.
*
* @author Shane Bryzak
*
*/
-@Alternative @RequestScoped
-public class JaasAuthenticator implements Authenticator
+public @RequestScoped @Alternative class JaasAuthenticator implements Authenticator
{
Logger log = LoggerFactory.getLogger(JaasAuthenticator.class);
13 years, 10 months
Seam SVN: r13401 - in modules/security/trunk: impl/src/main/java/org/jboss/seam/security and 1 other directories.
by seam-commits@lists.jboss.org
Author: shane.bryzak(a)jboss.com
Date: 2010-07-15 00:14:40 -0400 (Thu, 15 Jul 2010)
New Revision: 13401
Added:
modules/security/trunk/impl/src/main/java/org/jboss/seam/security/UserImpl.java
modules/security/trunk/impl/src/main/java/org/jboss/seam/security/jaas/JaasAuthenticator.java
Removed:
modules/security/trunk/impl/src/main/java/org/jboss/seam/security/JaasConfiguration.java
modules/security/trunk/impl/src/main/java/org/jboss/seam/security/callbacks/
modules/security/trunk/impl/src/main/java/org/jboss/seam/security/jaas/SeamLoginModule.java
Modified:
modules/security/trunk/api/src/main/java/org/jboss/seam/security/events/LoginFailedEvent.java
modules/security/trunk/impl/src/main/java/org/jboss/seam/security/IdentityImpl.java
Log:
refactor jaas stuff out of identity
Modified: modules/security/trunk/api/src/main/java/org/jboss/seam/security/events/LoginFailedEvent.java
===================================================================
--- modules/security/trunk/api/src/main/java/org/jboss/seam/security/events/LoginFailedEvent.java 2010-07-15 03:21:39 UTC (rev 13400)
+++ modules/security/trunk/api/src/main/java/org/jboss/seam/security/events/LoginFailedEvent.java 2010-07-15 04:14:40 UTC (rev 13401)
@@ -1,7 +1,5 @@
package org.jboss.seam.security.events;
-import javax.security.auth.login.LoginException;
-
/**
* This event is fired when an authentication attempt fails
*
@@ -9,14 +7,14 @@
*/
public class LoginFailedEvent
{
- private LoginException loginException;
+ private Exception loginException;
- public LoginFailedEvent(LoginException loginException)
+ public LoginFailedEvent(Exception loginException)
{
this.loginException = loginException;
}
- public LoginException getLoginException()
+ public Exception getLoginException()
{
return loginException;
}
Modified: modules/security/trunk/impl/src/main/java/org/jboss/seam/security/IdentityImpl.java
===================================================================
--- modules/security/trunk/impl/src/main/java/org/jboss/seam/security/IdentityImpl.java 2010-07-15 03:21:39 UTC (rev 13400)
+++ modules/security/trunk/impl/src/main/java/org/jboss/seam/security/IdentityImpl.java 2010-07-15 04:14:40 UTC (rev 13401)
@@ -1,9 +1,6 @@
package org.jboss.seam.security;
-import java.io.IOException;
import java.io.Serializable;
-import java.security.Principal;
-import java.security.acl.Group;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
@@ -17,19 +14,7 @@
import javax.enterprise.inject.spi.BeanManager;
import javax.inject.Inject;
import javax.inject.Named;
-import javax.security.auth.Subject;
-import javax.security.auth.callback.Callback;
-import javax.security.auth.callback.CallbackHandler;
-import javax.security.auth.callback.NameCallback;
-import javax.security.auth.callback.PasswordCallback;
-import javax.security.auth.callback.UnsupportedCallbackException;
-import javax.security.auth.login.Configuration;
-import javax.security.auth.login.LoginContext;
-import javax.security.auth.login.LoginException;
-import org.jboss.seam.security.callbacks.AuthenticatorCallback;
-import org.jboss.seam.security.callbacks.IdentityCallback;
-import org.jboss.seam.security.callbacks.IdentityManagerCallback;
import org.jboss.seam.security.events.AlreadyLoggedInEvent;
import org.jboss.seam.security.events.LoggedInEvent;
import org.jboss.seam.security.events.LoginFailedEvent;
@@ -43,7 +28,6 @@
import org.jboss.seam.security.management.IdentityManager;
import org.jboss.seam.security.permission.PermissionMapper;
import org.picketlink.idm.api.User;
-import org.picketlink.idm.impl.api.PasswordCredential;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -56,6 +40,10 @@
{
private static final long serialVersionUID = 3751659008033189259L;
+ private static final String RESPONSE_LOGIN_SUCCESS = "success";
+ private static final String RESPONSE_LOGIN_FAILED = "failed";
+ private static final String RESPONSE_LOGIN_EXCEPTION = "exception";
+
protected static boolean securityEnabled = true;
public static final String ROLES_GROUP = "Roles";
@@ -71,10 +59,7 @@
@Inject Instance<RequestSecurityState> requestSecurityState;
private User user;
- private Subject subject;
- private String jaasConfigName = null;
-
/**
* Contains a group name to group type:role list mapping of roles assigned
* during the authentication process
@@ -206,41 +191,39 @@
if (requestSecurityState.get().isSilentLogin())
{
manager.fireEvent(new LoggedInEvent(user));
- return "loggedIn";
+ return RESPONSE_LOGIN_SUCCESS;
}
manager.fireEvent(new AlreadyLoggedInEvent());
- return "loggedIn";
+ return RESPONSE_LOGIN_SUCCESS;
}
- authenticate();
-
- if (!isLoggedIn())
+ boolean success = authenticate();
+
+ if (success)
{
- throw new LoginException();
+ if (log.isDebugEnabled())
+ {
+ log.debug("Login successful for: " + credentials);
+ }
+ manager.fireEvent(new LoggedInEvent(user));
+ return RESPONSE_LOGIN_SUCCESS;
}
- if ( log.isDebugEnabled() )
- {
- log.debug("Login successful for: " + credentials);
- }
-
- manager.fireEvent(new LoggedInEvent(user));
- return "loggedIn";
+ credentials.invalidate();
+ return RESPONSE_LOGIN_FAILED;
}
- catch (LoginException ex)
+ catch (Exception ex)
{
- credentials.invalidate();
-
if ( log.isDebugEnabled() )
{
log.debug("Login failed for: " + credentials, ex);
}
manager.fireEvent(new LoginFailedEvent(ex));
+
+ return RESPONSE_LOGIN_EXCEPTION;
}
-
- return null;
}
public void quietLogin()
@@ -263,38 +246,74 @@
}
}
}
- catch (LoginException ex)
+ catch (Exception ex)
{
credentials.invalidate();
}
}
-
- /**
- *
- * @throws LoginException
- */
- public synchronized void authenticate()
- throws LoginException
- {
- // If we're already authenticated, then don't authenticate again
- if (!isLoggedIn() && !credentials.isInvalid())
- {
- user = null;
- subject = new Subject();
- authenticate( getLoginContext() );
- }
- }
-
- protected void authenticate(LoginContext loginContext)
- throws LoginException
+ protected boolean authenticate()
{
try
{
authenticating = true;
+
+ user = null;
+
preAuthenticate();
- loginContext.login();
- postAuthenticate();
+
+ Authenticator authenticator;
+
+ Set<Bean<?>> authenticators = manager.getBeans(Authenticator.class);
+ if (authenticators.size() == 1)
+ {
+ @SuppressWarnings("unchecked")
+ Bean<Authenticator> authenticatorBean = (Bean<Authenticator>) authenticators.iterator().next();
+ authenticator = (Authenticator) manager.getReference(authenticatorBean, Authenticator.class, manager.createCreationalContext(authenticatorBean));
+ }
+ else if (authenticators.size() > 1)
+ {
+ throw new IllegalStateException("More than one Authenticator bean found - please ensure " +
+ "only one Authenticator implementation is provided");
+ }
+ else
+ {
+ authenticator = null;
+ }
+
+ boolean success = false;
+
+ if (authenticator != null)
+ {
+ success = authenticator.authenticate();
+ }
+ else
+ {
+ // Otherwise if identity management is enabled, use it.
+ if (identityManager != null)
+ {
+ success = identityManager.authenticate(credentials.getUsername(),
+ credentials.getCredential());
+
+ if (success)
+ {
+ // TODO implement role population
+ //for (Role role : identityManager.getImpliedRoles(username))
+ //{
+ // idCallback.getIdentity().addRole(role.getRoleType().getName(),
+ // role.getGroup().getName(), role.getGroup().getGroupType());
+ //}
+ }
+ }
+ }
+
+ if (success)
+ {
+ user = new UserImpl(credentials.getUsername());
+ postAuthenticate();
+ }
+
+ return success;
}
finally
{
@@ -321,20 +340,7 @@
* different post-authentication logic should occur.
*/
protected void postAuthenticate()
- {
- // Populate the working memory with the user's principals
- for ( Principal p : subject.getPrincipals() )
- {
- if ( !(p instanceof Group))
- {
- if (user == null)
- {
- user = new UserImpl(p.getName());
- break;
- }
- }
- }
-
+ {
if (isLoggedIn())
{
if (!preAuthenticationRoles.isEmpty())
@@ -362,8 +368,6 @@
preAuthenticationGroups.clear();
}
}
-
- credentials.setCredential(null);
manager.fireEvent(new PostAuthenticateEvent());
}
@@ -373,95 +377,10 @@
*/
public void unAuthenticate()
{
- user = null;
-
+ user = null;
credentials.clear();
}
-
- protected LoginContext getLoginContext() throws LoginException
- {
- if (getJaasConfigName() != null)
- {
- return new LoginContext(getJaasConfigName(), subject,
- createCallbackHandler());
- }
-
- @SuppressWarnings("unchecked")
- Bean<Configuration> configBean = (Bean<Configuration>) manager.getBeans(Configuration.class).iterator().next();
- Configuration config = (Configuration) manager.getReference(configBean, Configuration.class, manager.createCreationalContext(configBean));
-
- return new LoginContext(JaasConfiguration.DEFAULT_JAAS_CONFIG_NAME, subject,
- createCallbackHandler(), config);
- }
-
- /**
- * Creates a callback handler that can handle a standard username/password
- * callback, using the credentials username and password properties
- */
- public CallbackHandler createCallbackHandler()
- {
- final Identity identity = this;
- final Authenticator authenticator;
-
- Set<Bean<?>> authenticators = manager.getBeans(Authenticator.class);
- if (authenticators.size() == 1)
- {
- @SuppressWarnings("unchecked")
- Bean<Authenticator> authenticatorBean = (Bean<Authenticator>) authenticators.iterator().next();
- authenticator = (Authenticator) manager.getReference(authenticatorBean, Authenticator.class, manager.createCreationalContext(authenticatorBean));
- }
- else if (authenticators.size() > 1)
- {
- throw new IllegalStateException("More than one Authenticator bean found - please ensure " +
- "only one Authenticator implementation is provided");
- }
- else
- {
- authenticator = null;
- }
-
- return new CallbackHandler()
- {
- public void handle(Callback[] callbacks)
- throws IOException, UnsupportedCallbackException
- {
- for (int i=0; i < callbacks.length; i++)
- {
- if (callbacks[i] instanceof NameCallback)
- {
- ( (NameCallback) callbacks[i] ).setName(credentials.getUsername());
- }
- else if (callbacks[i] instanceof PasswordCallback)
- {
- if (credentials.getCredential() instanceof PasswordCredential)
- {
- PasswordCredential credential = (PasswordCredential) credentials.getCredential();
- ( (PasswordCallback) callbacks[i] ).setPassword( credential.getValue() != null ?
- credential.getValue().toCharArray() : null );
- }
- }
- else if (callbacks[i] instanceof IdentityCallback)
- {
- ((IdentityCallback ) callbacks[i]).setIdentity(identity);
- }
- else if (callbacks[i] instanceof AuthenticatorCallback)
- {
- ((AuthenticatorCallback) callbacks[i]).setAuthenticator(authenticator);
- }
- else if (callbacks[i] instanceof IdentityManagerCallback)
- {
- ((IdentityManagerCallback) callbacks[i]).setIdentityManager(identityManager);
- }
- else
- {
- log.warn("Unsupported callback " + callbacks[i]);
- }
- }
- }
- };
- }
-
public void logout()
{
if (isLoggedIn())
@@ -629,17 +548,7 @@
return permissionMapper.resolvePermission(target, action);
}
-
- public String getJaasConfigName()
- {
- return jaasConfigName;
- }
- public void setJaasConfigName(String jaasConfigName)
- {
- this.jaasConfigName = jaasConfigName;
- }
-
public synchronized void runAs(RunAsOperation operation)
{
User savedUser = getUser();
Deleted: modules/security/trunk/impl/src/main/java/org/jboss/seam/security/JaasConfiguration.java
===================================================================
--- modules/security/trunk/impl/src/main/java/org/jboss/seam/security/JaasConfiguration.java 2010-07-15 03:21:39 UTC (rev 13400)
+++ modules/security/trunk/impl/src/main/java/org/jboss/seam/security/JaasConfiguration.java 2010-07-15 04:14:40 UTC (rev 13401)
@@ -1,53 +0,0 @@
-package org.jboss.seam.security;
-
-import java.util.HashMap;
-
-import javax.enterprise.context.ApplicationScoped;
-import javax.enterprise.inject.Produces;
-import javax.security.auth.login.AppConfigurationEntry;
-import javax.security.auth.login.Configuration;
-import javax.security.auth.login.AppConfigurationEntry.LoginModuleControlFlag;
-
-import org.jboss.seam.security.jaas.SeamLoginModule;
-
-/**
- * Producer for the JAAS Configuration used by Seam Security.
- *
- * @author Shane Bryzak
- *
- */
-public class JaasConfiguration
-{
- static final String DEFAULT_JAAS_CONFIG_NAME = "default";
-
- protected Configuration createConfiguration()
- {
- return new Configuration()
- {
- private AppConfigurationEntry[] aces = { createAppConfigurationEntry() };
-
- @Override
- public AppConfigurationEntry[] getAppConfigurationEntry(String name)
- {
- return DEFAULT_JAAS_CONFIG_NAME.equals(name) ? aces : null;
- }
-
- @Override
- public void refresh() {}
- };
- }
-
- protected AppConfigurationEntry createAppConfigurationEntry()
- {
- return new AppConfigurationEntry(
- SeamLoginModule.class.getName(),
- LoginModuleControlFlag.REQUIRED,
- new HashMap<String,String>()
- );
- }
-
- @Produces @ApplicationScoped Configuration getConfiguration()
- {
- return createConfiguration();
- }
-}
Added: modules/security/trunk/impl/src/main/java/org/jboss/seam/security/UserImpl.java
===================================================================
--- modules/security/trunk/impl/src/main/java/org/jboss/seam/security/UserImpl.java (rev 0)
+++ modules/security/trunk/impl/src/main/java/org/jboss/seam/security/UserImpl.java 2010-07-15 04:14:40 UTC (rev 13401)
@@ -0,0 +1,29 @@
+package org.jboss.seam.security;
+
+import org.picketlink.idm.api.User;
+
+/**
+ * Simple implementation of user
+ *
+ * @author Shane Bryzak
+ *
+ */
+public class UserImpl implements User
+{
+ private String id;
+
+ public UserImpl(String id)
+ {
+ this.id = id;
+ }
+
+ public String getId()
+ {
+ return id;
+ }
+
+ public String getKey()
+ {
+ return id;
+ }
+}
Added: modules/security/trunk/impl/src/main/java/org/jboss/seam/security/jaas/JaasAuthenticator.java
===================================================================
--- modules/security/trunk/impl/src/main/java/org/jboss/seam/security/jaas/JaasAuthenticator.java (rev 0)
+++ modules/security/trunk/impl/src/main/java/org/jboss/seam/security/jaas/JaasAuthenticator.java 2010-07-15 04:14:40 UTC (rev 13401)
@@ -0,0 +1,118 @@
+package org.jboss.seam.security.jaas;
+
+import java.io.IOException;
+
+import javax.enterprise.context.RequestScoped;
+import javax.enterprise.inject.Alternative;
+import javax.enterprise.inject.spi.BeanManager;
+import javax.inject.Inject;
+import javax.security.auth.Subject;
+import javax.security.auth.callback.Callback;
+import javax.security.auth.callback.CallbackHandler;
+import javax.security.auth.callback.NameCallback;
+import javax.security.auth.callback.PasswordCallback;
+import javax.security.auth.callback.UnsupportedCallbackException;
+import javax.security.auth.login.LoginContext;
+import javax.security.auth.login.LoginException;
+
+import org.jboss.seam.security.Authenticator;
+import org.jboss.seam.security.Credentials;
+import org.jboss.seam.security.Identity;
+import org.picketlink.idm.impl.api.PasswordCredential;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * An authenticator for authenticating with JAAS
+ *
+ * @author Shane Bryzak
+ *
+ */
+@Alternative @RequestScoped
+public class JaasAuthenticator implements Authenticator
+{
+ Logger log = LoggerFactory.getLogger(JaasAuthenticator.class);
+
+ @Inject Identity identity;
+ @Inject Credentials credentials;
+ @Inject BeanManager manager;
+
+ private Subject subject;
+
+ private String jaasConfigName = null;
+
+ public JaasAuthenticator()
+ {
+ subject = new Subject();
+ }
+
+ public boolean authenticate()
+ {
+ if (getJaasConfigName() == null)
+ {
+ throw new IllegalStateException("jaasConfigName cannot be null. Please set it to a valid JAAS configuration name.");
+ }
+
+ try
+ {
+ getLoginContext().login();
+ return true;
+ }
+ catch (LoginException e)
+ {
+ log.error("JAAS authentication failed", e);
+ return false;
+ }
+ }
+
+ protected LoginContext getLoginContext() throws LoginException
+ {
+ return new LoginContext(getJaasConfigName(), subject,
+ createCallbackHandler());
+ }
+
+ /**
+ * Creates a callback handler that can handle a standard username/password
+ * callback, using the credentials username and password properties
+ */
+ public CallbackHandler createCallbackHandler()
+ {
+ return new CallbackHandler()
+ {
+ public void handle(Callback[] callbacks)
+ throws IOException, UnsupportedCallbackException
+ {
+ for (int i=0; i < callbacks.length; i++)
+ {
+ if (callbacks[i] instanceof NameCallback)
+ {
+ ( (NameCallback) callbacks[i] ).setName(credentials.getUsername());
+ }
+ else if (callbacks[i] instanceof PasswordCallback)
+ {
+ if (credentials.getCredential() instanceof PasswordCredential)
+ {
+ PasswordCredential credential = (PasswordCredential) credentials.getCredential();
+ ( (PasswordCallback) callbacks[i] ).setPassword( credential.getValue() != null ?
+ credential.getValue().toCharArray() : null );
+ }
+ }
+ else
+ {
+ log.warn("Unsupported callback " + callbacks[i]);
+ }
+ }
+ }
+ };
+ }
+
+ public String getJaasConfigName()
+ {
+ return jaasConfigName;
+ }
+
+ public void setJaasConfigName(String jaasConfigName)
+ {
+ this.jaasConfigName = jaasConfigName;
+ }
+}
Deleted: modules/security/trunk/impl/src/main/java/org/jboss/seam/security/jaas/SeamLoginModule.java
===================================================================
--- modules/security/trunk/impl/src/main/java/org/jboss/seam/security/jaas/SeamLoginModule.java 2010-07-15 03:21:39 UTC (rev 13400)
+++ modules/security/trunk/impl/src/main/java/org/jboss/seam/security/jaas/SeamLoginModule.java 2010-07-15 04:14:40 UTC (rev 13401)
@@ -1,141 +0,0 @@
-package org.jboss.seam.security.jaas;
-
-import java.security.Principal;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-import javax.security.auth.Subject;
-import javax.security.auth.callback.Callback;
-import javax.security.auth.callback.CallbackHandler;
-import javax.security.auth.callback.NameCallback;
-import javax.security.auth.callback.PasswordCallback;
-import javax.security.auth.login.LoginException;
-import javax.security.auth.spi.LoginModule;
-
-import org.jboss.seam.security.callbacks.AuthenticatorCallback;
-import org.jboss.seam.security.callbacks.IdentityCallback;
-import org.jboss.seam.security.callbacks.IdentityManagerCallback;
-import org.jboss.seam.security.management.IdentityManager;
-import org.picketlink.idm.impl.api.PasswordCredential;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Performs authentication using a Seam component or Identity Management
- *
- * @author Shane Bryzak
- */
-public class SeamLoginModule implements LoginModule
-{
- private Logger log = LoggerFactory.getLogger(SeamLoginModule.class);
-
- protected Set<String> roles = new HashSet<String>();
-
- protected Subject subject;
- protected Map<String,?> options;
- protected CallbackHandler callbackHandler;
-
- protected String username;
-
- public class SimplePrincipal implements Principal
- {
- private String name;
-
- public SimplePrincipal(String name)
- {
- this.name = name;
- }
-
- public String getName()
- {
- return name;
- }
- }
-
- public boolean abort() throws LoginException
- {
- return true;
- }
-
- public boolean commit() throws LoginException
- {
- subject.getPrincipals().add(new SimplePrincipal(username));
- return true;
- }
-
- public void initialize(Subject subject, CallbackHandler callbackHandler,
- Map<String, ?> sharedState, Map<String, ?> options)
- {
- this.subject = subject;
- this.options = options;
- this.callbackHandler = callbackHandler;
- }
-
- public boolean login()
- throws LoginException
- {
- PasswordCallback cbPassword = null;
- try
- {
- NameCallback cbName = new NameCallback("Enter username");
- cbPassword = new PasswordCallback("Enter password", false);
-
- IdentityCallback idCallback = new IdentityCallback();
- AuthenticatorCallback authCallback = new AuthenticatorCallback();
- IdentityManagerCallback idmCallback = new IdentityManagerCallback();
-
- // Get the username, password and identity from the callback handler
- callbackHandler.handle(new Callback[] { cbName, cbPassword, idCallback, authCallback, idmCallback });
-
- username = cbName.getName();
-
- // If an authenticator method has been specified, use that to authenticate
- if (authCallback.getAuthenticator() != null)
- {
- return authCallback.getAuthenticator().authenticate();
- }
-
- // Otherwise if identity management is enabled, use it.
- IdentityManager identityManager = idmCallback.getIdentityManager();
- if (identityManager != null)
- {
- boolean success = identityManager.authenticate(username,
- new PasswordCredential(new String(cbPassword.getPassword())));
-
- if (success)
- {
- // TODO implement role population
- //for (Role role : identityManager.getImpliedRoles(username))
- //{
- // idCallback.getIdentity().addRole(role.getRoleType().getName(),
- // role.getGroup().getName(), role.getGroup().getGroupType());
- //}
- }
-
- return success;
- }
- else
- {
- log.error("No Authenticator bean found.");
- throw new LoginException("No Authenticator bean found");
- }
- }
- catch (Exception ex)
- {
- log.error("Error logging in", ex);
- LoginException le = new LoginException(ex.getMessage());
- le.initCause(ex);
- throw le;
- }
- finally
- {
- cbPassword.clearPassword();
- }
- }
-
- public boolean logout() throws LoginException
- {
- return true;
- }
-}
13 years, 10 months
Seam SVN: r13400 - modules/security/trunk/impl/src/main/java/org/jboss/seam/security/jaas.
by seam-commits@lists.jboss.org
Author: shane.bryzak(a)jboss.com
Date: 2010-07-14 23:21:39 -0400 (Wed, 14 Jul 2010)
New Revision: 13400
Modified:
modules/security/trunk/impl/src/main/java/org/jboss/seam/security/jaas/SeamLoginModule.java
Log:
fix authentication
Modified: modules/security/trunk/impl/src/main/java/org/jboss/seam/security/jaas/SeamLoginModule.java
===================================================================
--- modules/security/trunk/impl/src/main/java/org/jboss/seam/security/jaas/SeamLoginModule.java 2010-07-15 03:15:53 UTC (rev 13399)
+++ modules/security/trunk/impl/src/main/java/org/jboss/seam/security/jaas/SeamLoginModule.java 2010-07-15 03:21:39 UTC (rev 13400)
@@ -1,5 +1,6 @@
package org.jboss.seam.security.jaas;
+import java.security.Principal;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
@@ -37,6 +38,21 @@
protected String username;
+ public class SimplePrincipal implements Principal
+ {
+ private String name;
+
+ public SimplePrincipal(String name)
+ {
+ this.name = name;
+ }
+
+ public String getName()
+ {
+ return name;
+ }
+ }
+
public boolean abort() throws LoginException
{
return true;
@@ -44,7 +60,7 @@
public boolean commit() throws LoginException
{
- //subject.getPrincipals().add(new SimplePrincipal(username));
+ subject.getPrincipals().add(new SimplePrincipal(username));
return true;
}
13 years, 10 months
Seam SVN: r13399 - in modules/security/trunk: api/src/main/java/org/jboss/seam/security/events and 7 other directories.
by seam-commits@lists.jboss.org
Author: shane.bryzak(a)jboss.com
Date: 2010-07-14 23:15:53 -0400 (Wed, 14 Jul 2010)
New Revision: 13399
Modified:
modules/security/trunk/api/src/main/java/org/jboss/seam/security/Identity.java
modules/security/trunk/api/src/main/java/org/jboss/seam/security/events/LoggedInEvent.java
modules/security/trunk/api/src/main/java/org/jboss/seam/security/events/PostLoggedOutEvent.java
modules/security/trunk/api/src/main/java/org/jboss/seam/security/permission/IdentifierStrategy.java
modules/security/trunk/examples/idmconsole/src/main/resources/import.sql
modules/security/trunk/impl/src/main/java/org/jboss/seam/security/EntitySecurityListener.java
modules/security/trunk/impl/src/main/java/org/jboss/seam/security/HibernateSecurityInterceptor.java
modules/security/trunk/impl/src/main/java/org/jboss/seam/security/IdentityImpl.java
modules/security/trunk/impl/src/main/java/org/jboss/seam/security/JpaTokenStore.java
modules/security/trunk/impl/src/main/java/org/jboss/seam/security/NotLoggedInException.java
modules/security/trunk/impl/src/main/java/org/jboss/seam/security/RememberMe.java
modules/security/trunk/impl/src/main/java/org/jboss/seam/security/RunAsOperation.java
modules/security/trunk/impl/src/main/java/org/jboss/seam/security/SecurityException.java
modules/security/trunk/impl/src/main/java/org/jboss/seam/security/SecurityInterceptor.java
modules/security/trunk/impl/src/main/java/org/jboss/seam/security/jaas/SeamLoginModule.java
modules/security/trunk/impl/src/main/java/org/jboss/seam/security/management/IdentityManagerImpl.java
modules/security/trunk/impl/src/main/java/org/jboss/seam/security/management/JpaIdentityStore.java
modules/security/trunk/impl/src/main/java/org/jboss/seam/security/management/action/RoleAction.java
modules/security/trunk/impl/src/main/java/org/jboss/seam/security/permission/ClassIdentifierStrategy.java
modules/security/trunk/impl/src/main/java/org/jboss/seam/security/permission/EntityIdentifierStrategy.java
modules/security/trunk/impl/src/main/java/org/jboss/seam/security/permission/IdentifierPolicy.java
modules/security/trunk/impl/src/main/java/org/jboss/seam/security/permission/PermissionManager.java
modules/security/trunk/impl/src/main/java/org/jboss/seam/security/permission/PermissionMapper.java
modules/security/trunk/impl/src/main/java/org/jboss/seam/security/permission/PersistentPermissionResolver.java
modules/security/trunk/impl/src/main/java/org/jboss/seam/security/permission/RoleCheck.java
modules/security/trunk/impl/src/main/java/org/jboss/seam/security/permission/RuleBasedPermissionResolver.java
Log:
refactored Identity, fix compiler warnings
Modified: modules/security/trunk/api/src/main/java/org/jboss/seam/security/Identity.java
===================================================================
--- modules/security/trunk/api/src/main/java/org/jboss/seam/security/Identity.java 2010-07-15 02:32:37 UTC (rev 13398)
+++ modules/security/trunk/api/src/main/java/org/jboss/seam/security/Identity.java 2010-07-15 03:15:53 UTC (rev 13399)
@@ -5,6 +5,8 @@
import javax.security.auth.Subject;
+import org.picketlink.idm.api.User;
+
/**
* API for authorization and authentication via Seam security.
*
@@ -29,20 +31,13 @@
boolean tryLogin();
/**
- * Return the currently authenticated Principal
+ * Returns the currently authenticated user
*
* @return
*/
- Principal getPrincipal();
+ User getUser();
/**
- * Return the Subject for the current session.
- *
- * @return
- */
- Subject getSubject();
-
- /**
* Performs an authorization check, based on the specified security expression string.
*
* @param expr The security expression string to evaluate
Modified: modules/security/trunk/api/src/main/java/org/jboss/seam/security/events/LoggedInEvent.java
===================================================================
--- modules/security/trunk/api/src/main/java/org/jboss/seam/security/events/LoggedInEvent.java 2010-07-15 02:32:37 UTC (rev 13398)
+++ modules/security/trunk/api/src/main/java/org/jboss/seam/security/events/LoggedInEvent.java 2010-07-15 03:15:53 UTC (rev 13399)
@@ -1,6 +1,6 @@
package org.jboss.seam.security.events;
-import java.security.Principal;
+import org.picketlink.idm.api.User;
/**
* This event is raised when user successfully logs in.
@@ -9,15 +9,15 @@
*/
public class LoggedInEvent
{
- private Principal principal;
+ private User user;
- public LoggedInEvent(Principal principal)
+ public LoggedInEvent(User user)
{
- this.principal = principal;
+ this.user = user;
}
- public Principal getPrincipal()
+ public User getUser()
{
- return principal;
+ return user;
}
}
Modified: modules/security/trunk/api/src/main/java/org/jboss/seam/security/events/PostLoggedOutEvent.java
===================================================================
--- modules/security/trunk/api/src/main/java/org/jboss/seam/security/events/PostLoggedOutEvent.java 2010-07-15 02:32:37 UTC (rev 13398)
+++ modules/security/trunk/api/src/main/java/org/jboss/seam/security/events/PostLoggedOutEvent.java 2010-07-15 03:15:53 UTC (rev 13399)
@@ -1,6 +1,6 @@
package org.jboss.seam.security.events;
-import java.security.Principal;
+import org.picketlink.idm.api.User;
/**
* This event is raised just after the user unauthenticates
@@ -9,15 +9,15 @@
*/
public class PostLoggedOutEvent
{
- private Principal principal;
+ private User user;
- public PostLoggedOutEvent(Principal principal)
+ public PostLoggedOutEvent(User user)
{
- this.principal = principal;
+ this.user = user;
}
- public Principal getPrincipal()
+ public User getUser()
{
- return principal;
+ return user;
}
}
Modified: modules/security/trunk/api/src/main/java/org/jboss/seam/security/permission/IdentifierStrategy.java
===================================================================
--- modules/security/trunk/api/src/main/java/org/jboss/seam/security/permission/IdentifierStrategy.java 2010-07-15 02:32:37 UTC (rev 13398)
+++ modules/security/trunk/api/src/main/java/org/jboss/seam/security/permission/IdentifierStrategy.java 2010-07-15 03:15:53 UTC (rev 13399)
@@ -7,6 +7,6 @@
*/
public interface IdentifierStrategy
{
- boolean canIdentify(Class targetClass);
+ boolean canIdentify(Class<?> targetClass);
String getIdentifier(Object target);
}
Modified: modules/security/trunk/examples/idmconsole/src/main/resources/import.sql
===================================================================
--- modules/security/trunk/examples/idmconsole/src/main/resources/import.sql 2010-07-15 02:32:37 UTC (rev 13398)
+++ modules/security/trunk/examples/idmconsole/src/main/resources/import.sql 2010-07-15 03:15:53 UTC (rev 13399)
@@ -13,4 +13,4 @@
insert into IdentityObjectRelationshipType (id, name) values (1, 'MEMBER_OF');
insert into IdentityObjectRelationshipType (id, name) values (2, 'ROLE');
-insert into IdentityObjectRelationship (id, name, relationship_type_id, identity_from_id, identity_to_id) values (1, 'admin', 2, 1, 3);
+insert into IdentityObjectRelationship (id, name, relationship_type_id, from_identity_id, to_identity_id) values (1, 'admin', 2, 1, 3);
Modified: modules/security/trunk/impl/src/main/java/org/jboss/seam/security/EntitySecurityListener.java
===================================================================
--- modules/security/trunk/impl/src/main/java/org/jboss/seam/security/EntitySecurityListener.java 2010-07-15 02:32:37 UTC (rev 13398)
+++ modules/security/trunk/impl/src/main/java/org/jboss/seam/security/EntitySecurityListener.java 2010-07-15 03:15:53 UTC (rev 13399)
@@ -1,5 +1,5 @@
package org.jboss.seam.security;
-
+/*
import static org.jboss.seam.security.EntityAction.DELETE;
import static org.jboss.seam.security.EntityAction.INSERT;
import static org.jboss.seam.security.EntityAction.READ;
@@ -9,8 +9,8 @@
import javax.persistence.PrePersist;
import javax.persistence.PreRemove;
import javax.persistence.PreUpdate;
+*/
-
/**
* Facilitates security checks for entity beans.
*
Modified: modules/security/trunk/impl/src/main/java/org/jboss/seam/security/HibernateSecurityInterceptor.java
===================================================================
--- modules/security/trunk/impl/src/main/java/org/jboss/seam/security/HibernateSecurityInterceptor.java 2010-07-15 02:32:37 UTC (rev 13398)
+++ modules/security/trunk/impl/src/main/java/org/jboss/seam/security/HibernateSecurityInterceptor.java 2010-07-15 03:15:53 UTC (rev 13399)
@@ -1,5 +1,7 @@
package org.jboss.seam.security;
+import org.hibernate.EmptyInterceptor;
+/*
import static org.jboss.seam.security.EntityAction.DELETE;
import static org.jboss.seam.security.EntityAction.INSERT;
import static org.jboss.seam.security.EntityAction.READ;
@@ -7,9 +9,8 @@
import java.io.Serializable;
-import org.hibernate.EmptyInterceptor;
import org.hibernate.Interceptor;
-import org.hibernate.type.Type;
+import org.hibernate.type.Type;*/
//import org.jboss.seam.Entity.NotEntityException;
/**
@@ -20,6 +21,8 @@
*/
public class HibernateSecurityInterceptor extends EmptyInterceptor
{
+ private static final long serialVersionUID = 4418010755107869488L;
+
/*
private Interceptor wrappedInterceptor;
Modified: modules/security/trunk/impl/src/main/java/org/jboss/seam/security/IdentityImpl.java
===================================================================
--- modules/security/trunk/impl/src/main/java/org/jboss/seam/security/IdentityImpl.java 2010-07-15 02:32:37 UTC (rev 13398)
+++ modules/security/trunk/impl/src/main/java/org/jboss/seam/security/IdentityImpl.java 2010-07-15 03:15:53 UTC (rev 13399)
@@ -42,6 +42,7 @@
import org.jboss.seam.security.events.QuietLoginEvent;
import org.jboss.seam.security.management.IdentityManager;
import org.jboss.seam.security.permission.PermissionMapper;
+import org.picketlink.idm.api.User;
import org.picketlink.idm.impl.api.PasswordCredential;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -69,8 +70,9 @@
@Inject Instance<RequestSecurityState> requestSecurityState;
- private Principal principal;
+ private User user;
private Subject subject;
+
private String jaasConfigName = null;
/**
@@ -103,12 +105,6 @@
* Flag that indicates we are in the process of authenticating
*/
private boolean authenticating = false;
-
- @Inject
- public void create()
- {
- subject = new Subject();
- }
public static boolean isSecurityEnabled()
{
@@ -122,13 +118,13 @@
public boolean isLoggedIn()
{
- // If there is a principal set, then the user is logged in.
- return getPrincipal() != null;
+ // If there is a user set, then the user is logged in.
+ return user != null;
}
public boolean tryLogin()
{
- if (!authenticating && getPrincipal() == null && credentials.isSet() &&
+ if (!authenticating && getUser() == null && credentials.isSet() &&
!requestSecurityState.get().isLoginTried())
{
requestSecurityState.get().setLoginTried(true);
@@ -137,17 +133,7 @@
return isLoggedIn();
}
-
- public Principal getPrincipal()
- {
- return principal;
- }
- public Subject getSubject()
- {
- return subject;
- }
-
/**
* Performs an authorization check, based on the specified security expression.
*
@@ -219,7 +205,7 @@
// and then return.
if (requestSecurityState.get().isSilentLogin())
{
- manager.fireEvent(new LoggedInEvent(principal));
+ manager.fireEvent(new LoggedInEvent(user));
return "loggedIn";
}
@@ -239,7 +225,7 @@
log.debug("Login successful for: " + credentials);
}
- manager.fireEvent(new LoggedInEvent(principal));
+ manager.fireEvent(new LoggedInEvent(user));
return "loggedIn";
}
catch (LoginException ex)
@@ -293,7 +279,7 @@
// If we're already authenticated, then don't authenticate again
if (!isLoggedIn() && !credentials.isInvalid())
{
- principal = null;
+ user = null;
subject = new Subject();
authenticate( getLoginContext() );
}
@@ -330,20 +316,20 @@
}
/**
- * Extracts the principal from the subject, and populates the roles of the
- * authenticated user. This method may be overridden by a subclass if
+ * Extracts the principal from the subject, and uses it to create the User object.
+ * This method may be overridden by a subclass if
* different post-authentication logic should occur.
*/
protected void postAuthenticate()
{
// Populate the working memory with the user's principals
- for ( Principal p : getSubject().getPrincipals() )
+ for ( Principal p : subject.getPrincipals() )
{
if ( !(p instanceof Group))
{
- if (principal == null)
+ if (user == null)
{
- principal = p;
+ user = new UserImpl(p.getName());
break;
}
}
@@ -387,17 +373,16 @@
*/
public void unAuthenticate()
{
- principal = null;
- subject = new Subject();
+ user = null;
credentials.clear();
}
protected LoginContext getLoginContext() throws LoginException
- {
+ {
if (getJaasConfigName() != null)
{
- return new LoginContext(getJaasConfigName(), getSubject(),
+ return new LoginContext(getJaasConfigName(), subject,
createCallbackHandler());
}
@@ -405,7 +390,7 @@
Bean<Configuration> configBean = (Bean<Configuration>) manager.getBeans(Configuration.class).iterator().next();
Configuration config = (Configuration) manager.getReference(configBean, Configuration.class, manager.createCreationalContext(configBean));
- return new LoginContext(JaasConfiguration.DEFAULT_JAAS_CONFIG_NAME, getSubject(),
+ return new LoginContext(JaasConfiguration.DEFAULT_JAAS_CONFIG_NAME, subject,
createCallbackHandler(), config);
}
@@ -481,7 +466,7 @@
{
if (isLoggedIn())
{
- PostLoggedOutEvent loggedOutEvent = new PostLoggedOutEvent(principal);
+ PostLoggedOutEvent loggedOutEvent = new PostLoggedOutEvent(user);
manager.fireEvent(new PreLoggedOutEvent());
unAuthenticate();
@@ -657,28 +642,27 @@
public synchronized void runAs(RunAsOperation operation)
{
- Principal savedPrincipal = getPrincipal();
- Subject savedSubject = getSubject();
+ User savedUser = getUser();
+ if (systemOp == null)
+ {
+ systemOp = new ThreadLocal<Boolean>();
+ }
+
+ boolean savedSystemOp = systemOp.get();
+
try
{
- principal = operation.getPrincipal();
- subject = operation.getSubject();
+ user = operation.getUser();
- if (systemOp == null)
- {
- systemOp = new ThreadLocal<Boolean>();
- }
-
systemOp.set(operation.isSystemOperation());
operation.execute();
}
finally
{
- systemOp.set(false);
- principal = savedPrincipal;
- subject = savedSubject;
+ systemOp.set(savedSystemOp);
+ user = savedUser;
}
}
@@ -687,4 +671,9 @@
// TODO Auto-generated method stub
}
+
+ public User getUser()
+ {
+ return user;
+ }
}
Modified: modules/security/trunk/impl/src/main/java/org/jboss/seam/security/JpaTokenStore.java
===================================================================
--- modules/security/trunk/impl/src/main/java/org/jboss/seam/security/JpaTokenStore.java 2010-07-15 02:32:37 UTC (rev 13398)
+++ modules/security/trunk/impl/src/main/java/org/jboss/seam/security/JpaTokenStore.java 2010-07-15 03:15:53 UTC (rev 13399)
@@ -10,8 +10,8 @@
import javax.persistence.NoResultException;
import javax.persistence.Query;
-import org.jboss.seam.security.annotations.TokenUsername;
-import org.jboss.seam.security.annotations.TokenValue;
+//import org.jboss.seam.security.annotations.TokenUsername;
+//import org.jboss.seam.security.annotations.TokenValue;
import org.jboss.weld.extensions.util.properties.Property;
/**
Modified: modules/security/trunk/impl/src/main/java/org/jboss/seam/security/NotLoggedInException.java
===================================================================
--- modules/security/trunk/impl/src/main/java/org/jboss/seam/security/NotLoggedInException.java 2010-07-15 02:32:37 UTC (rev 13398)
+++ modules/security/trunk/impl/src/main/java/org/jboss/seam/security/NotLoggedInException.java 2010-07-15 03:15:53 UTC (rev 13399)
@@ -1,11 +1,11 @@
package org.jboss.seam.security;
-//import javax.ejb.ApplicationException;
-
/**
* Thrown when an unauthenticated user attempts to execute a restricted action.
*
* @author Shane Bryzak
*/
-//@ApplicationException(rollback=true)
-public class NotLoggedInException extends SecurityException {}
+public class NotLoggedInException extends SecurityException
+{
+ private static final long serialVersionUID = -2708471484839030465L;
+}
Modified: modules/security/trunk/impl/src/main/java/org/jboss/seam/security/RememberMe.java
===================================================================
--- modules/security/trunk/impl/src/main/java/org/jboss/seam/security/RememberMe.java 2010-07-15 02:32:37 UTC (rev 13398)
+++ modules/security/trunk/impl/src/main/java/org/jboss/seam/security/RememberMe.java 2010-07-15 03:15:53 UTC (rev 13399)
@@ -325,6 +325,7 @@
boolean value;
}
+ /*
private class DecodedToken
{
private String username;
@@ -356,5 +357,5 @@
{
return value;
}
- }
+ }*/
}
Modified: modules/security/trunk/impl/src/main/java/org/jboss/seam/security/RunAsOperation.java
===================================================================
--- modules/security/trunk/impl/src/main/java/org/jboss/seam/security/RunAsOperation.java 2010-07-15 02:32:37 UTC (rev 13398)
+++ modules/security/trunk/impl/src/main/java/org/jboss/seam/security/RunAsOperation.java 2010-07-15 03:15:53 UTC (rev 13399)
@@ -5,6 +5,8 @@
import javax.security.auth.Subject;
+import org.picketlink.idm.api.User;
+
/**
* Defines a security operation that can be executed within a particular
* security context.
@@ -13,15 +15,12 @@
*/
public abstract class RunAsOperation
{
- private Principal principal;
- private Subject subject;
+ private User user;
private boolean systemOp = false;
public RunAsOperation()
{
- //principal = new SimplePrincipal(null);
- subject = new Subject();
}
/**
@@ -37,26 +36,23 @@
public abstract void execute();
- public Principal getPrincipal()
+ public User getUser()
{
- return principal;
+ return user;
}
- public Subject getSubject()
- {
- return subject;
- }
-
public RunAsOperation addRole(String role)
{
- for ( Group sg : getSubject().getPrincipals(Group.class) )
+ // FIXME this all has to change
+
+ /*for ( Group sg : getSubject().getPrincipals(Group.class) )
{
if ( IdentityImpl.ROLES_GROUP.equals( sg.getName() ) )
{
//sg.addMember(new SimplePrincipal(role));
break;
}
- }
+ }*/
// TODO fix this
//SimpleGroup roleGroup = new SimpleGroup(IdentityImpl.ROLES_GROUP);
Modified: modules/security/trunk/impl/src/main/java/org/jboss/seam/security/SecurityException.java
===================================================================
--- modules/security/trunk/impl/src/main/java/org/jboss/seam/security/SecurityException.java 2010-07-15 02:32:37 UTC (rev 13398)
+++ modules/security/trunk/impl/src/main/java/org/jboss/seam/security/SecurityException.java 2010-07-15 03:15:53 UTC (rev 13399)
@@ -9,6 +9,8 @@
*/
public abstract class SecurityException extends RuntimeException
{
+ private static final long serialVersionUID = 789326682407249952L;
+
public SecurityException()
{
super();
Modified: modules/security/trunk/impl/src/main/java/org/jboss/seam/security/SecurityInterceptor.java
===================================================================
--- modules/security/trunk/impl/src/main/java/org/jboss/seam/security/SecurityInterceptor.java 2010-07-15 02:32:37 UTC (rev 13398)
+++ modules/security/trunk/impl/src/main/java/org/jboss/seam/security/SecurityInterceptor.java 2010-07-15 03:15:53 UTC (rev 13399)
@@ -41,6 +41,7 @@
private class Restriction
{
+ @SuppressWarnings("unused")
private String expression;
private String permissionTarget;
Modified: modules/security/trunk/impl/src/main/java/org/jboss/seam/security/jaas/SeamLoginModule.java
===================================================================
--- modules/security/trunk/impl/src/main/java/org/jboss/seam/security/jaas/SeamLoginModule.java 2010-07-15 02:32:37 UTC (rev 13398)
+++ modules/security/trunk/impl/src/main/java/org/jboss/seam/security/jaas/SeamLoginModule.java 2010-07-15 03:15:53 UTC (rev 13399)
@@ -16,7 +16,6 @@
import org.jboss.seam.security.callbacks.IdentityCallback;
import org.jboss.seam.security.callbacks.IdentityManagerCallback;
import org.jboss.seam.security.management.IdentityManager;
-import org.picketlink.idm.api.Role;
import org.picketlink.idm.impl.api.PasswordCredential;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Modified: modules/security/trunk/impl/src/main/java/org/jboss/seam/security/management/IdentityManagerImpl.java
===================================================================
--- modules/security/trunk/impl/src/main/java/org/jboss/seam/security/management/IdentityManagerImpl.java 2010-07-15 02:32:37 UTC (rev 13398)
+++ modules/security/trunk/impl/src/main/java/org/jboss/seam/security/management/IdentityManagerImpl.java 2010-07-15 03:15:53 UTC (rev 13399)
@@ -9,16 +9,14 @@
import javax.enterprise.inject.spi.BeanManager;
import javax.inject.Inject;
-import org.jboss.seam.transaction.Transactional;
import org.jboss.seam.security.GroupImpl;
import org.jboss.seam.security.Identity;
import org.jboss.seam.security.UserImpl;
import org.jboss.seam.security.util.Strings;
+import org.jboss.seam.transaction.Transactional;
import org.picketlink.idm.api.Credential;
import org.picketlink.idm.api.Group;
-import org.picketlink.idm.api.IdentitySearchCriteria;
import org.picketlink.idm.api.IdentitySession;
-import org.picketlink.idm.api.IdentityType;
import org.picketlink.idm.api.Role;
import org.picketlink.idm.api.RoleType;
import org.picketlink.idm.api.User;
Modified: modules/security/trunk/impl/src/main/java/org/jboss/seam/security/management/JpaIdentityStore.java
===================================================================
--- modules/security/trunk/impl/src/main/java/org/jboss/seam/security/management/JpaIdentityStore.java 2010-07-15 02:32:37 UTC (rev 13398)
+++ modules/security/trunk/impl/src/main/java/org/jboss/seam/security/management/JpaIdentityStore.java 2010-07-15 03:15:53 UTC (rev 13399)
@@ -42,8 +42,8 @@
import org.picketlink.idm.spi.store.FeaturesMetaData;
import org.picketlink.idm.spi.store.IdentityStoreInvocationContext;
import org.picketlink.idm.spi.store.IdentityStoreSession;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+/*import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;*/
/**
* IdentityStore implementation that allows identity related data to be
@@ -55,7 +55,7 @@
{
private static final long serialVersionUID = 7729139146633529501L;
- private Logger log = LoggerFactory.getLogger(JpaIdentityStore.class);
+ //private Logger log = LoggerFactory.getLogger(JpaIdentityStore.class);
public static final String OPTION_IDENTITY_CLASS_NAME = "identityEntityClassName";
public static final String OPTION_CREDENTIAL_CLASS_NAME = "credentialEntityClassName";
@@ -1208,7 +1208,7 @@
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<?> criteria = builder.createQuery(identityClass);
- Root<?> root = criteria.from(identityClass);
+ criteria.from(identityClass);
Property<?> identityNameProp = modelProperties.get(PROPERTY_IDENTITY_NAME);
Modified: modules/security/trunk/impl/src/main/java/org/jboss/seam/security/management/action/RoleAction.java
===================================================================
--- modules/security/trunk/impl/src/main/java/org/jboss/seam/security/management/action/RoleAction.java 2010-07-15 02:32:37 UTC (rev 13398)
+++ modules/security/trunk/impl/src/main/java/org/jboss/seam/security/management/action/RoleAction.java 2010-07-15 03:15:53 UTC (rev 13399)
@@ -1,7 +1,6 @@
package org.jboss.seam.security.management.action;
import java.io.Serializable;
-import java.util.ArrayList;
import java.util.List;
import javax.enterprise.context.Conversation;
@@ -75,7 +74,7 @@
private String saveExistingRole()
{
- // TODO rewrite
+ // FIXME rewrite
/*List<String> grantedRoles = identityManager.getRoleGroups(role);
if (grantedRoles != null)
Modified: modules/security/trunk/impl/src/main/java/org/jboss/seam/security/permission/ClassIdentifierStrategy.java
===================================================================
--- modules/security/trunk/impl/src/main/java/org/jboss/seam/security/permission/ClassIdentifierStrategy.java 2010-07-15 02:32:37 UTC (rev 13398)
+++ modules/security/trunk/impl/src/main/java/org/jboss/seam/security/permission/ClassIdentifierStrategy.java 2010-07-15 03:15:53 UTC (rev 13399)
@@ -15,24 +15,24 @@
@Dependent
public class ClassIdentifierStrategy implements IdentifierStrategy
{
- private Map<Class,String> identifierNames = new ConcurrentHashMap<Class,String>();
+ private Map<Class<?>,String> identifierNames = new ConcurrentHashMap<Class<?>,String>();
- public boolean canIdentify(Class targetClass)
+ public boolean canIdentify(Class<?> targetClass)
{
return Class.class.equals(targetClass);
}
public String getIdentifier(Object target)
{
- if (!(target instanceof Class))
+ if (!(target instanceof Class<?>))
{
throw new IllegalArgumentException("Target [" + target + "] must be instance of Class");
}
- return getIdentifierName((Class) target);
+ return getIdentifierName((Class<?>) target);
}
- private String getIdentifierName(Class cls)
+ private String getIdentifierName(Class<?> cls)
{
if (!identifierNames.containsKey(cls))
{
Modified: modules/security/trunk/impl/src/main/java/org/jboss/seam/security/permission/EntityIdentifierStrategy.java
===================================================================
--- modules/security/trunk/impl/src/main/java/org/jboss/seam/security/permission/EntityIdentifierStrategy.java 2010-07-15 02:32:37 UTC (rev 13398)
+++ modules/security/trunk/impl/src/main/java/org/jboss/seam/security/permission/EntityIdentifierStrategy.java 2010-07-15 03:15:53 UTC (rev 13399)
@@ -19,7 +19,7 @@
*/
public class EntityIdentifierStrategy implements IdentifierStrategy
{
- private Map<Class,String> identifierNames = new ConcurrentHashMap<Class,String>();
+ private Map<Class<?>,String> identifierNames = new ConcurrentHashMap<Class<?>,String>();
//@Inject PersistenceProvider persistenceProvider;
//@Inject Expressions expressions;
@@ -27,22 +27,20 @@
@Inject BeanManager manager;
@Inject Instance<EntityManager> entityManagerInstance;
- public boolean canIdentify(Class targetClass)
+ public boolean canIdentify(Class<?> targetClass)
{
return targetClass.isAnnotationPresent(Entity.class);
}
public String getIdentifier(Object target)
- {
- /**
- return String.format("%s:%s", getIdentifierName(target.getClass()),
-
- persistenceProvider.getId(target, lookupEntityManager()).toString());
- */
- return null;
+ {
+ return String.format("%s:%s", getIdentifierName(target.getClass()),
+ // FIXME
+ null);
+ //persistenceProvider.getId(target, lookupEntityManager()).toString());
}
- private String getIdentifierName(Class cls)
+ private String getIdentifierName(Class<?> cls)
{
if (!identifierNames.containsKey(cls))
{
@@ -68,11 +66,4 @@
return identifierNames.get(cls);
}
-
- private EntityManager lookupEntityManager()
- {
- //return entityManager.getValue();
- //return BeanManagerHelper.getInstanceByType(manager, EntityManager.class);
- return entityManagerInstance.get();
- }
}
Modified: modules/security/trunk/impl/src/main/java/org/jboss/seam/security/permission/IdentifierPolicy.java
===================================================================
--- modules/security/trunk/impl/src/main/java/org/jboss/seam/security/permission/IdentifierPolicy.java 2010-07-15 02:32:37 UTC (rev 13398)
+++ modules/security/trunk/impl/src/main/java/org/jboss/seam/security/permission/IdentifierPolicy.java 2010-07-15 03:15:53 UTC (rev 13399)
@@ -20,7 +20,7 @@
@ApplicationScoped
public class IdentifierPolicy
{
- private Map<Class,IdentifierStrategy> strategies = new ConcurrentHashMap<Class,IdentifierStrategy>();
+ private Map<Class<?>,IdentifierStrategy> strategies = new ConcurrentHashMap<Class<?>,IdentifierStrategy>();
private Set<IdentifierStrategy> registeredStrategies = new HashSet<IdentifierStrategy>();
Modified: modules/security/trunk/impl/src/main/java/org/jboss/seam/security/permission/PermissionManager.java
===================================================================
--- modules/security/trunk/impl/src/main/java/org/jboss/seam/security/permission/PermissionManager.java 2010-07-15 02:32:37 UTC (rev 13398)
+++ modules/security/trunk/impl/src/main/java/org/jboss/seam/security/permission/PermissionManager.java 2010-07-15 03:15:53 UTC (rev 13399)
@@ -7,8 +7,8 @@
import javax.inject.Named;
import org.jboss.seam.security.Identity;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+/*import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;*/
/**
* Permission management component, used to grant or revoke permissions on specific objects or of
@@ -25,7 +25,7 @@
public static final String PERMISSION_GRANT = "seam.grant-permission";
public static final String PERMISSION_REVOKE = "seam.revoke-permission";
- private Logger log = LoggerFactory.getLogger(PermissionManager.class);
+ //private Logger log = LoggerFactory.getLogger(PermissionManager.class);
@Inject PermissionStore permissionStore;
@Inject Identity identity;
Modified: modules/security/trunk/impl/src/main/java/org/jboss/seam/security/permission/PermissionMapper.java
===================================================================
--- modules/security/trunk/impl/src/main/java/org/jboss/seam/security/permission/PermissionMapper.java 2010-07-15 02:32:37 UTC (rev 13398)
+++ modules/security/trunk/impl/src/main/java/org/jboss/seam/security/permission/PermissionMapper.java 2010-07-15 03:15:53 UTC (rev 13399)
@@ -10,12 +10,10 @@
import java.util.Set;
import javax.enterprise.context.ApplicationScoped;
-import javax.enterprise.context.SessionScoped;
import javax.enterprise.context.spi.CreationalContext;
-import javax.inject.Inject;
-import javax.enterprise.inject.Produces;
import javax.enterprise.inject.spi.Bean;
import javax.enterprise.inject.spi.BeanManager;
+import javax.inject.Inject;
/**
* Maps permission checks to resolver chains
@@ -27,12 +25,13 @@
{
private static final long serialVersionUID = 7692687882996064772L;
- private Map<Class<?>,Map<String,String>> resolverChains = new HashMap<Class<?>,Map<String,String>>();
+ //private Map<Class<?>,Map<String,String>> resolverChains = new HashMap<Class<?>,Map<String,String>>();
private List<PermissionResolver> defaultResolverChain;
@Inject BeanManager manager;
+ @SuppressWarnings("unchecked")
@Inject
public void init()
{
Modified: modules/security/trunk/impl/src/main/java/org/jboss/seam/security/permission/PersistentPermissionResolver.java
===================================================================
--- modules/security/trunk/impl/src/main/java/org/jboss/seam/security/permission/PersistentPermissionResolver.java 2010-07-15 02:32:37 UTC (rev 13398)
+++ modules/security/trunk/impl/src/main/java/org/jboss/seam/security/permission/PersistentPermissionResolver.java 2010-07-15 03:15:53 UTC (rev 13399)
@@ -45,7 +45,7 @@
List<Permission> permissions = permissionStore.listPermissions(target, action);
- String username = identity.getPrincipal().getName();
+ String username = identity.getUser().getId();
if (permissions != null)
{
@@ -85,7 +85,7 @@
List<Permission> permissions = permissionStore.listPermissions(targets, action);
- String username = identity.getPrincipal().getName();
+ String username = identity.getUser().getId();
Iterator<?> iter = targets.iterator();
while (iter.hasNext())
Modified: modules/security/trunk/impl/src/main/java/org/jboss/seam/security/permission/RoleCheck.java
===================================================================
--- modules/security/trunk/impl/src/main/java/org/jboss/seam/security/permission/RoleCheck.java 2010-07-15 02:32:37 UTC (rev 13398)
+++ modules/security/trunk/impl/src/main/java/org/jboss/seam/security/permission/RoleCheck.java 2010-07-15 03:15:53 UTC (rev 13399)
@@ -9,6 +9,8 @@
*/
public class RoleCheck implements Serializable
{
+ private static final long serialVersionUID = -9129682144406056768L;
+
private String name;
private boolean granted;
Modified: modules/security/trunk/impl/src/main/java/org/jboss/seam/security/permission/RuleBasedPermissionResolver.java
===================================================================
--- modules/security/trunk/impl/src/main/java/org/jboss/seam/security/permission/RuleBasedPermissionResolver.java 2010-07-15 02:32:37 UTC (rev 13398)
+++ modules/security/trunk/impl/src/main/java/org/jboss/seam/security/permission/RuleBasedPermissionResolver.java 2010-07-15 03:15:53 UTC (rev 13399)
@@ -1,7 +1,6 @@
package org.jboss.seam.security.permission;
import java.io.Serializable;
-import java.security.Principal;
import java.security.acl.Group;
import java.util.ArrayList;
import java.util.Enumeration;
@@ -15,9 +14,8 @@
import javax.enterprise.event.Observes;
import org.drools.KnowledgeBase;
-import org.drools.RuleBase;
-import org.drools.StatefulSession;
-import org.drools.ClassObjectFilter;
+/*import org.drools.StatefulSession;
+import org.drools.ClassObjectFilter;*/
import org.drools.runtime.StatefulKnowledgeSession;
import org.drools.runtime.rule.FactHandle;
//import org.jboss.seam.drools.SeamGlobalResolver;
@@ -25,8 +23,8 @@
import org.jboss.seam.security.IdentityImpl;
import org.jboss.seam.security.events.PostLoggedOutEvent;
import org.jboss.seam.security.events.PostAuthenticateEvent;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+/*import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;*/
/**
* A permission resolver that uses a Drools rule base to perform permission checks
@@ -38,7 +36,7 @@
{
private static final long serialVersionUID = -7572627522601793024L;
- private Logger log = LoggerFactory.getLogger(RuleBasedPermissionResolver.class);
+ //private Logger log = LoggerFactory.getLogger(RuleBasedPermissionResolver.class);
private StatefulKnowledgeSession securityContext;
@@ -148,6 +146,7 @@
// Check if there are any additional requirements
securityContext.fireAllRules();
+ /*
if (check.hasRequirements())
{
for (String requirement : check.getRequirements())
@@ -159,7 +158,7 @@
handles.add (securityContext.insert(value));
}
}
- }
+ }*/
synchronizeContext();
@@ -197,18 +196,18 @@
{
if (getSecurityContext() != null)
{
- getSecurityContext().insert(identity.getPrincipal());
+ getSecurityContext().insert(identity.getUser());
- for ( Group sg : identity.getSubject().getPrincipals(Group.class) )
+/* for ( Group sg : identity.getSubject().getPrincipals(Group.class) )
{
if ( IdentityImpl.ROLES_GROUP.equals( sg.getName() ) )
{
Enumeration<?> e = sg.members();
while (e.hasMoreElements())
- {
- Principal role = (Principal) e.nextElement();
+ {*/
+ //Principal role = (Principal) e.nextElement();
- boolean found = false;
+ //boolean found = false;
//Iterator<?> iter = getSecurityContext().getObjects(
// new ClassObjectFilter(RoleImpl.class)).iterator();
@@ -230,9 +229,9 @@
getSecurityContext().insert(new RoleImpl(role.getName()));
}*/
- }
- }
- }
+ // }
+ // }
+ // }
//Iterator<?> iter = getSecurityContext().getObjects(new ClassObjectFilter(RoleImpl.class)).iterator();
//while (iter.hasNext())
@@ -277,7 +276,7 @@
{
if (getSecurityContext() != null)
{
- getSecurityContext().insert(identity.getPrincipal());
+ getSecurityContext().insert(identity.getUser());
// If we were authenticated with the JpaIdentityStore, then insert the authenticated
// UserAccount into the security context.
13 years, 10 months
Seam SVN: r13398 - in modules/security/trunk: impl/src/main/java/org/jboss/seam/security and 4 other directories.
by seam-commits@lists.jboss.org
Author: shane.bryzak(a)jboss.com
Date: 2010-07-14 22:32:37 -0400 (Wed, 14 Jul 2010)
New Revision: 13398
Removed:
modules/security/trunk/impl/src/main/java/org/jboss/seam/security/SimplePrincipal.java
modules/security/trunk/impl/src/main/java/org/jboss/seam/security/management/NoSuchRoleException.java
modules/security/trunk/impl/src/main/java/org/jboss/seam/security/management/NoSuchUserException.java
Modified:
modules/security/trunk/api/src/main/java/org/jboss/seam/security/management/IdentityManager.java
modules/security/trunk/impl/src/main/java/org/jboss/seam/security/AuthorizationException.java
modules/security/trunk/impl/src/main/java/org/jboss/seam/security/RememberMe.java
modules/security/trunk/impl/src/main/java/org/jboss/seam/security/RunAsOperation.java
modules/security/trunk/impl/src/main/java/org/jboss/seam/security/jaas/SeamLoginModule.java
modules/security/trunk/impl/src/main/java/org/jboss/seam/security/management/IdentityManagerImpl.java
modules/security/trunk/impl/src/main/java/org/jboss/seam/security/management/JpaIdentityStore.java
modules/security/trunk/impl/src/main/java/org/jboss/seam/security/management/action/UserAction.java
modules/security/trunk/impl/src/main/java/org/jboss/seam/security/management/action/UserSearch.java
modules/security/trunk/impl/src/main/java/org/jboss/seam/security/permission/PersistentPermissionResolver.java
Log:
more role-related stuff, cleanup
Modified: modules/security/trunk/api/src/main/java/org/jboss/seam/security/management/IdentityManager.java
===================================================================
--- modules/security/trunk/api/src/main/java/org/jboss/seam/security/management/IdentityManager.java 2010-07-15 01:31:24 UTC (rev 13397)
+++ modules/security/trunk/api/src/main/java/org/jboss/seam/security/management/IdentityManager.java 2010-07-15 02:32:37 UTC (rev 13398)
@@ -1,10 +1,12 @@
package org.jboss.seam.security.management;
+import java.util.Collection;
import java.util.List;
import org.picketlink.idm.api.Credential;
import org.picketlink.idm.api.IdentityType;
import org.picketlink.idm.api.Role;
+import org.picketlink.idm.api.User;
/**
* Identity Management API, allows management of users, groups and roles.
@@ -195,9 +197,9 @@
* all users.
*
* @param filter The filter used to perform the search.
- * @return A list of users that match the specified filter.
+ * @return A collection of users that match the specified filter.
*/
- List<String> findUsers(String filter);
+ Collection<User> findUsers(String filter);
/**
* Returns a list of all the role types.
@@ -214,7 +216,7 @@
* @param name The user for which to return a list of roles
* @return List containing the names of the granted roles
*/
- List<Role> getGrantedRoles(String name);
+ Collection<Role> getGrantedRoles(String name);
/**
* Returns a list of roles that are either explicitly or indirectly granted to the specified user.
@@ -230,9 +232,9 @@
* @param roleType The role type of the role
* @param groupName The name of the group the role has been granted in
* @param groupType The type of the group
- * @return A List of IdentityType objects having membership of the specified role
+ * @return A Collection of User objects having membership of the specified role
*/
- List<IdentityType> listRoleMembers(String roleType, String groupName, String groupType);
+ Collection<User> listRoleMembers(String roleType, String groupName, String groupType);
/**
* Performs an authentication check using the specified username and credential.
Modified: modules/security/trunk/impl/src/main/java/org/jboss/seam/security/AuthorizationException.java
===================================================================
--- modules/security/trunk/impl/src/main/java/org/jboss/seam/security/AuthorizationException.java 2010-07-15 01:31:24 UTC (rev 13397)
+++ modules/security/trunk/impl/src/main/java/org/jboss/seam/security/AuthorizationException.java 2010-07-15 02:32:37 UTC (rev 13398)
@@ -1,7 +1,7 @@
package org.jboss.seam.security;
/**
- * Thrown when an authenticated user has insufficient rights to carry out an action.
+ * Thrown when an authenticated user has insufficient rights to perform an operation.
*
* @author Shane Bryzak
*/
Modified: modules/security/trunk/impl/src/main/java/org/jboss/seam/security/RememberMe.java
===================================================================
--- modules/security/trunk/impl/src/main/java/org/jboss/seam/security/RememberMe.java 2010-07-15 01:31:24 UTC (rev 13397)
+++ modules/security/trunk/impl/src/main/java/org/jboss/seam/security/RememberMe.java 2010-07-15 02:32:37 UTC (rev 13398)
@@ -174,7 +174,7 @@
}
// Set the principal
- identity.getSubject().getPrincipals().add(new SimplePrincipal(username));
+ // identity.getSubject().getPrincipals().add(new SimplePrincipal(username));
identityImpl.postAuthenticate();
autoLoggedIn = true;
Modified: modules/security/trunk/impl/src/main/java/org/jboss/seam/security/RunAsOperation.java
===================================================================
--- modules/security/trunk/impl/src/main/java/org/jboss/seam/security/RunAsOperation.java 2010-07-15 01:31:24 UTC (rev 13397)
+++ modules/security/trunk/impl/src/main/java/org/jboss/seam/security/RunAsOperation.java 2010-07-15 02:32:37 UTC (rev 13398)
@@ -20,7 +20,7 @@
public RunAsOperation()
{
- principal = new SimplePrincipal(null);
+ //principal = new SimplePrincipal(null);
subject = new Subject();
}
@@ -53,7 +53,7 @@
{
if ( IdentityImpl.ROLES_GROUP.equals( sg.getName() ) )
{
- sg.addMember(new SimplePrincipal(role));
+ //sg.addMember(new SimplePrincipal(role));
break;
}
}
Deleted: modules/security/trunk/impl/src/main/java/org/jboss/seam/security/SimplePrincipal.java
===================================================================
--- modules/security/trunk/impl/src/main/java/org/jboss/seam/security/SimplePrincipal.java 2010-07-15 01:31:24 UTC (rev 13397)
+++ modules/security/trunk/impl/src/main/java/org/jboss/seam/security/SimplePrincipal.java 2010-07-15 02:32:37 UTC (rev 13398)
@@ -1,54 +0,0 @@
-package org.jboss.seam.security;
-
-import java.io.Serializable;
-import java.security.Principal;
-
-/**
- * Simple implementation of the Principal interface, supporting a named user.
- *
- * @author Shane Bryzak
- */
-public class SimplePrincipal implements Principal, Serializable
-{
- private static final long serialVersionUID = 5609375932836425908L;
-
- private String name;
-
- public SimplePrincipal(String name)
- {
- this.name = name;
- }
-
- public String getName()
- {
- return name;
- }
-
- @Override
- public boolean equals(Object obj)
- {
- if (obj instanceof Principal)
- {
- Principal other = (Principal) obj;
- return name == null ?
- other.getName() == null :
- name.equals( other.getName() );
- }
- else
- {
- return false;
- }
- }
-
- @Override
- public int hashCode()
- {
- return name != null ? name.hashCode() : super.hashCode();
- }
-
- @Override
- public String toString()
- {
- return name;
- }
-}
Modified: modules/security/trunk/impl/src/main/java/org/jboss/seam/security/jaas/SeamLoginModule.java
===================================================================
--- modules/security/trunk/impl/src/main/java/org/jboss/seam/security/jaas/SeamLoginModule.java 2010-07-15 01:31:24 UTC (rev 13397)
+++ modules/security/trunk/impl/src/main/java/org/jboss/seam/security/jaas/SeamLoginModule.java 2010-07-15 02:32:37 UTC (rev 13398)
@@ -12,7 +12,6 @@
import javax.security.auth.login.LoginException;
import javax.security.auth.spi.LoginModule;
-import org.jboss.seam.security.SimplePrincipal;
import org.jboss.seam.security.callbacks.AuthenticatorCallback;
import org.jboss.seam.security.callbacks.IdentityCallback;
import org.jboss.seam.security.callbacks.IdentityManagerCallback;
@@ -46,7 +45,7 @@
public boolean commit() throws LoginException
{
- subject.getPrincipals().add(new SimplePrincipal(username));
+ //subject.getPrincipals().add(new SimplePrincipal(username));
return true;
}
Modified: modules/security/trunk/impl/src/main/java/org/jboss/seam/security/management/IdentityManagerImpl.java
===================================================================
--- modules/security/trunk/impl/src/main/java/org/jboss/seam/security/management/IdentityManagerImpl.java 2010-07-15 01:31:24 UTC (rev 13397)
+++ modules/security/trunk/impl/src/main/java/org/jboss/seam/security/management/IdentityManagerImpl.java 2010-07-15 02:32:37 UTC (rev 13398)
@@ -10,17 +10,24 @@
import javax.inject.Inject;
import org.jboss.seam.transaction.Transactional;
+import org.jboss.seam.security.GroupImpl;
import org.jboss.seam.security.Identity;
+import org.jboss.seam.security.UserImpl;
import org.jboss.seam.security.util.Strings;
import org.picketlink.idm.api.Credential;
+import org.picketlink.idm.api.Group;
+import org.picketlink.idm.api.IdentitySearchCriteria;
import org.picketlink.idm.api.IdentitySession;
import org.picketlink.idm.api.IdentityType;
import org.picketlink.idm.api.Role;
+import org.picketlink.idm.api.RoleType;
import org.picketlink.idm.api.User;
import org.picketlink.idm.api.query.QueryException;
import org.picketlink.idm.api.query.UserQuery;
import org.picketlink.idm.api.query.UserQueryBuilder;
+import org.picketlink.idm.common.exception.FeatureNotSupportedException;
import org.picketlink.idm.common.exception.IdentityException;
+import org.picketlink.idm.impl.api.IdentitySearchCriteriaImpl;
import org.picketlink.idm.impl.api.model.SimpleUser;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -36,6 +43,7 @@
private static final long serialVersionUID = 6864253169970552893L;
public static final String RESOURCE_IDENTITY = "seam.identity";
+ public static final String RESOURCE_RELATIONSHIP = "seam.relationship";
public static final String PERMISSION_CREATE = "create";
public static final String PERMISSION_READ = "read";
@@ -222,7 +230,7 @@
return false;
}
- public List<String> findUsers(String filter)
+ public Collection<User> findUsers(String filter)
{
identity.checkPermission(RESOURCE_IDENTITY, PERMISSION_READ);
UserQueryBuilder builder = identitySession.createUserQueryBuilder();
@@ -230,16 +238,7 @@
try
{
- Collection<User> users = identitySession.execute(userQuery);
-
- List<String> userList = new ArrayList<String>();
-
- for (User user : users)
- {
- userList.add(user.getId());
- }
-
- return userList;
+ return identitySession.execute(userQuery);
}
catch (QueryException ex)
{
@@ -268,10 +267,30 @@
* @param name The user for which to return a list of roles
* @return List containing the names of the granted roles
*/
- public List<Role> getGrantedRoles(String username)
+ public Collection<Role> getGrantedRoles(String username)
{
- //return roleIdentityStore.listGrantedRoles(username);
- return null;
+ identity.checkPermission(RESOURCE_RELATIONSHIP, PERMISSION_READ);
+ try
+ {
+ Collection<Role> roles = new ArrayList<Role>();
+
+ Collection<RoleType> roleTypes = identitySession.getRoleManager().findUserRoleTypes(new UserImpl(username));
+
+ for (RoleType roleType : roleTypes)
+ {
+ roles.addAll(identitySession.getRoleManager().findRoles(username, roleType.getName()));
+ }
+
+ return roles;
+ }
+ catch (IdentityException e)
+ {
+ throw new RuntimeException(e);
+ }
+ catch (FeatureNotSupportedException e)
+ {
+ throw new RuntimeException(e);
+ }
}
/**
@@ -286,11 +305,24 @@
return null;
}
- public List<IdentityType> listRoleMembers(String roleType, String groupName, String groupType)
+ public Collection<User> listRoleMembers(String roleType, String groupName, String groupType)
{
- //identity.checkPermission(ROLE_PERMISSION_NAME, PERMISSION_READ);
- //return roleIdentityStore.listRoleMembers(roleType, groupName, groupType);
- return null;
+ identity.checkPermission(RESOURCE_RELATIONSHIP, PERMISSION_READ);
+ Group group = new GroupImpl(groupType, groupName);
+ IdentitySearchCriteriaImpl criteria = new IdentitySearchCriteriaImpl();
+
+ try
+ {
+ return identitySession.getRoleManager().findUsersWithRelatedRole(group, criteria);
+ }
+ catch (IdentityException e)
+ {
+ throw new RuntimeException(e);
+ }
+ catch (FeatureNotSupportedException e)
+ {
+ throw new RuntimeException(e);
+ }
}
public boolean authenticate(String username, Credential credential)
Modified: modules/security/trunk/impl/src/main/java/org/jboss/seam/security/management/JpaIdentityStore.java
===================================================================
--- modules/security/trunk/impl/src/main/java/org/jboss/seam/security/management/JpaIdentityStore.java 2010-07-15 01:31:24 UTC (rev 13397)
+++ modules/security/trunk/impl/src/main/java/org/jboss/seam/security/management/JpaIdentityStore.java 2010-07-15 02:32:37 UTC (rev 13398)
@@ -1103,7 +1103,7 @@
return em.createQuery(criteria).getSingleResult();
}
- protected Object lookupCredentialType(String name, EntityManager em)
+ protected Object lookupCredentialTypeEntity(String name, EntityManager em)
{
Property<?> credentialTypeNameProp = modelProperties.get(PROPERTY_CREDENTIAL_TYPE_NAME);
@@ -1238,7 +1238,6 @@
objs.add(new IdentityObjectImpl(name, name, type));
}
- // TODO Auto-generated method stub
return objs;
}
@@ -1249,6 +1248,8 @@
{
List<IdentityObject> objs = new ArrayList<IdentityObject>();
+ System.out.println("*** Invoked unimplemented method findIdentityObject()");
+
// TODO Auto-generated method stub
return objs;
}
@@ -1262,6 +1263,7 @@
IdentityStoreInvocationContext invocationCtx,
IdentityObjectType identityType) throws IdentityException
{
+ System.out.println("*** Invoked unimplemented method getIdentityObjectsCount()");
// TODO Auto-generated method stub
return 0;
}
@@ -1270,6 +1272,7 @@
IdentityStoreInvocationContext ctx, String name)
throws IdentityException, OperationNotSupportedException
{
+ System.out.println("*** Invoked unimplemented method getRelationshipNameProperties()");
// TODO Auto-generated method stub
return null;
}
@@ -1278,6 +1281,7 @@
IdentityObjectSearchCriteria criteria) throws IdentityException,
OperationNotSupportedException
{
+ System.out.println("*** Invoked unimplemented method getRelationshipNames()");
// TODO Auto-generated method stub
return null;
}
@@ -1286,6 +1290,7 @@
IdentityObject identity, IdentityObjectSearchCriteria criteria)
throws IdentityException, OperationNotSupportedException
{
+ System.out.println("*** Invoked unimplemented method getRelationshipNames()");
// TODO Auto-generated method stub
return null;
}
@@ -1295,12 +1300,14 @@
IdentityObjectRelationship relationship) throws IdentityException,
OperationNotSupportedException
{
+ System.out.println("*** Invoked unimplemented method getRelationshipProperties()");
// TODO Auto-generated method stub
return null;
}
public FeaturesMetaData getSupportedFeatures()
{
+ System.out.println("*** Invoked unimplemented method getSupportedFeatures()");
// TODO Auto-generated method stub
return null;
}
@@ -1363,6 +1370,7 @@
public String removeRelationshipName(IdentityStoreInvocationContext ctx,
String name) throws IdentityException, OperationNotSupportedException
{
+ System.out.println("*** Invoked unimplemented method removeRelationshipName()");
// TODO Auto-generated method stub
return null;
}
@@ -1372,7 +1380,7 @@
throws IdentityException, OperationNotSupportedException
{
// TODO Auto-generated method stub
-
+ System.out.println("*** Invoked unimplemented method removeRelationshipNameProperties()");
}
public void removeRelationshipProperties(IdentityStoreInvocationContext ctx,
@@ -1380,7 +1388,7 @@
throws IdentityException, OperationNotSupportedException
{
// TODO Auto-generated method stub
-
+ System.out.println("*** Invoked unimplemented method removeRelationshipProperties()");
}
public void removeRelationships(
@@ -1389,7 +1397,7 @@
throws IdentityException
{
// TODO Auto-generated method stub
-
+ System.out.println("*** Invoked unimplemented method removeRelationships()");
}
public Set<IdentityObjectRelationship> resolveRelationships(
@@ -1458,6 +1466,7 @@
boolean named, String name) throws IdentityException
{
// TODO Auto-generated method stub
+ System.out.println("*** Invoked unimplemented method resolveRelationships()");
return null;
}
@@ -1467,6 +1476,7 @@
OperationNotSupportedException
{
// TODO Auto-generated method stub
+ System.out.println("*** Invoked unimplemented method setRelationshipNameProperties()");
}
@@ -1475,7 +1485,7 @@
throws IdentityException, OperationNotSupportedException
{
// TODO Auto-generated method stub
-
+ System.out.println("*** Invoked unimplemented method setRelationshipProperties()");
}
public void updateCredential(IdentityStoreInvocationContext ctx,
@@ -1483,7 +1493,7 @@
throws IdentityException
{
// TODO Auto-generated method stub
-
+ System.out.println("*** Invoked unimplemented method updateCredential()");
}
public boolean validateCredential(IdentityStoreInvocationContext ctx,
@@ -1518,7 +1528,7 @@
else
{
predicates.add(builder.equal(root.get(credentialType.getName()),
- lookupCredentialType(credential.getType().getName(), em)));
+ lookupCredentialTypeEntity(credential.getType().getName(), em)));
}
}
Deleted: modules/security/trunk/impl/src/main/java/org/jboss/seam/security/management/NoSuchRoleException.java
===================================================================
--- modules/security/trunk/impl/src/main/java/org/jboss/seam/security/management/NoSuchRoleException.java 2010-07-15 01:31:24 UTC (rev 13397)
+++ modules/security/trunk/impl/src/main/java/org/jboss/seam/security/management/NoSuchRoleException.java 2010-07-15 02:32:37 UTC (rev 13398)
@@ -1,21 +0,0 @@
-package org.jboss.seam.security.management;
-
-/**
- * Thrown when an operation is performed on a non-existent role.
- *
- * @author Shane Bryzak
- */
-public class NoSuchRoleException extends RuntimeException
-{
- private static final long serialVersionUID = 7711431103948571607L;
-
- public NoSuchRoleException(String message)
- {
- super(message);
- }
-
- public NoSuchRoleException(String message, Throwable cause)
- {
- super(message, cause);
- }
-}
Deleted: modules/security/trunk/impl/src/main/java/org/jboss/seam/security/management/NoSuchUserException.java
===================================================================
--- modules/security/trunk/impl/src/main/java/org/jboss/seam/security/management/NoSuchUserException.java 2010-07-15 01:31:24 UTC (rev 13397)
+++ modules/security/trunk/impl/src/main/java/org/jboss/seam/security/management/NoSuchUserException.java 2010-07-15 02:32:37 UTC (rev 13398)
@@ -1,21 +0,0 @@
-package org.jboss.seam.security.management;
-
-/**
- * Thrown when an operation is attempted on a non-existent user.
- *
- * @author Shane Bryzak
- */
-public class NoSuchUserException extends RuntimeException
-{
- private static final long serialVersionUID = -6117983356287782094L;
-
- public NoSuchUserException(String message)
- {
- super(message);
- }
-
- public NoSuchUserException(String message, Throwable cause)
- {
- super(message, cause);
- }
-}
Modified: modules/security/trunk/impl/src/main/java/org/jboss/seam/security/management/action/UserAction.java
===================================================================
--- modules/security/trunk/impl/src/main/java/org/jboss/seam/security/management/action/UserAction.java 2010-07-15 01:31:24 UTC (rev 13397)
+++ modules/security/trunk/impl/src/main/java/org/jboss/seam/security/management/action/UserAction.java 2010-07-15 02:32:37 UTC (rev 13398)
@@ -2,6 +2,7 @@
import java.io.Serializable;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.List;
import javax.enterprise.context.Conversation;
@@ -118,7 +119,7 @@
}
}
- List<Role> grantedRoles = identityManager.getGrantedRoles(username);
+ Collection<Role> grantedRoles = identityManager.getGrantedRoles(username);
if (grantedRoles != null)
{
Modified: modules/security/trunk/impl/src/main/java/org/jboss/seam/security/management/action/UserSearch.java
===================================================================
--- modules/security/trunk/impl/src/main/java/org/jboss/seam/security/management/action/UserSearch.java 2010-07-15 01:31:24 UTC (rev 13397)
+++ modules/security/trunk/impl/src/main/java/org/jboss/seam/security/management/action/UserSearch.java 2010-07-15 02:32:37 UTC (rev 13398)
@@ -2,6 +2,7 @@
import java.io.Serializable;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.List;
import javax.enterprise.context.SessionScoped;
@@ -9,6 +10,8 @@
import javax.inject.Named;
import org.jboss.seam.security.management.IdentityManager;
+import org.picketlink.idm.api.Role;
+import org.picketlink.idm.api.User;
@Named
@SessionScoped
@@ -24,29 +27,29 @@
{
users = new ArrayList<UserDTO>();
- List<String> usernames = identityManager.findUsers(null);
- for (String username : usernames)
+ Collection<User> results = identityManager.findUsers(null);
+ for (User user : results)
{
UserDTO dto = new UserDTO();
- dto.setUsername(username);
- dto.setEnabled(identityManager.isUserEnabled(username));
+ dto.setUsername(user.getId());
+ dto.setEnabled(identityManager.isUserEnabled(user.getId()));
users.add(dto);
}
}
public String getUserRoles(String username)
{
- // TODO rewrite
- //List<String> roles = identityManager.getGrantedRoles(username);
+ Collection<Role> roles = identityManager.getGrantedRoles(username);
//if (roles == null) return "";
StringBuilder sb = new StringBuilder();
- //for (String role : roles)
- //{
- // sb.append((sb.length() > 0 ? ", " : "") + role);
- //}
+ for (Role role : roles)
+ {
+ sb.append((sb.length() > 0 ? ", " : "") + role.getRoleType().getName() +
+ ":" + role.getGroup().getName());
+ }
return sb.toString();
}
Modified: modules/security/trunk/impl/src/main/java/org/jboss/seam/security/permission/PersistentPermissionResolver.java
===================================================================
--- modules/security/trunk/impl/src/main/java/org/jboss/seam/security/permission/PersistentPermissionResolver.java 2010-07-15 01:31:24 UTC (rev 13397)
+++ modules/security/trunk/impl/src/main/java/org/jboss/seam/security/permission/PersistentPermissionResolver.java 2010-07-15 02:32:37 UTC (rev 13398)
@@ -9,7 +9,6 @@
import javax.inject.Inject;
import org.jboss.seam.security.Identity;
-import org.jboss.seam.security.SimplePrincipal;
/**
* Resolves dynamically-assigned permissions, mapped to a user or a role, and kept in persistent
@@ -52,7 +51,7 @@
{
for (Permission permission : permissions)
{
- if (permission.getIdentity() instanceof SimplePrincipal &&
+ if (//permission.getIdentity() instanceof SimplePrincipal &&
username.equals(permission.getIdentity().getName()))
{
return true;
@@ -97,7 +96,7 @@
{
if (permission.getResource().equals(target))
{
- if (permission.getIdentity() instanceof SimplePrincipal &&
+ if (//permission.getIdentity() instanceof SimplePrincipal &&
username.equals(permission.getIdentity().getName()))
{
iter.remove();
13 years, 10 months