You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@archiva.apache.org by ma...@apache.org on 2016/10/21 18:12:42 UTC

archiva-redback-core git commit: Add transaction annotation and dependencies

Repository: archiva-redback-core
Updated Branches:
  refs/heads/jpa c4fc7ffc7 -> 6f7fa9056


Add transaction annotation and dependencies


Project: http://git-wip-us.apache.org/repos/asf/archiva-redback-core/repo
Commit: http://git-wip-us.apache.org/repos/asf/archiva-redback-core/commit/6f7fa905
Tree: http://git-wip-us.apache.org/repos/asf/archiva-redback-core/tree/6f7fa905
Diff: http://git-wip-us.apache.org/repos/asf/archiva-redback-core/diff/6f7fa905

Branch: refs/heads/jpa
Commit: 6f7fa9056264ae7ce98192cdb0946dce97ab65a2
Parents: c4fc7ff
Author: Martin Stockhammer <ma...@apache.org>
Authored: Fri Oct 21 20:11:47 2016 +0200
Committer: Martin Stockhammer <ma...@apache.org>
Committed: Fri Oct 21 20:11:47 2016 +0200

----------------------------------------------------------------------
 pom.xml                                         | 10 ++
 .../redback-common-integrations/pom.xml         |  8 --
 .../redback-rbac-jpa/pom.xml                    |  9 +-
 .../redback/rbac/jpa/JpaRbacManager.java        | 98 ++++++++++----------
 .../redback/rbac/jpa/model/JpaPermission.java   |  4 +-
 .../archiva/redback/rbac/jpa/model/JpaRole.java |  4 +-
 .../rbac/jpa/model/JpaUserAssignment.java       |  3 +-
 .../redback/rbac/jpa/JpaRbacManagerTest.java    | 22 +++--
 .../src/test/resources/spring-context.xml       | 31 ++++++-
 .../src/test/resources/test.properties          |  7 +-
 .../redback-users-jpa/pom.xml                   |  5 +
 .../redback/users/jpa/JpaUserManager.java       |  3 +-
 .../redback/users/jpa/model/JpaUser.java        | 36 ++++++-
 .../redback/users/jpa/JpaUserManagerTest.java   | 32 ++++---
 .../src/test/resources/spring-context.xml       | 32 ++++++-
 15 files changed, 207 insertions(+), 97 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/archiva-redback-core/blob/6f7fa905/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 975be68..cdb4c89 100644
--- a/pom.xml
+++ b/pom.xml
@@ -534,6 +534,16 @@
         <version>${springVersion}</version>
       </dependency>
       <dependency>
+        <groupId>org.springframework</groupId>
+        <artifactId>spring-tx</artifactId>
+        <version>${springVersion}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.springframework</groupId>
+        <artifactId>spring-orm</artifactId>
+        <version>${springVersion}</version>
+      </dependency>
+      <dependency>
         <groupId>javax.annotation</groupId>
         <artifactId>jsr250-api</artifactId>
         <version>1.0</version>

http://git-wip-us.apache.org/repos/asf/archiva-redback-core/blob/6f7fa905/redback-integrations/redback-common-integrations/pom.xml
----------------------------------------------------------------------
diff --git a/redback-integrations/redback-common-integrations/pom.xml b/redback-integrations/redback-common-integrations/pom.xml
index 656dcf2..34921ce 100644
--- a/redback-integrations/redback-common-integrations/pom.xml
+++ b/redback-integrations/redback-common-integrations/pom.xml
@@ -83,14 +83,6 @@
     </dependency>
     <dependency>
       <groupId>org.apache.archiva.redback</groupId>
-      <artifactId>redback-users-jpa</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.archiva.redback</groupId>
-      <artifactId>redback-rbac-jpa</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.archiva.redback</groupId>
       <artifactId>redback-users-configurable</artifactId>
     </dependency>
     <dependency>

http://git-wip-us.apache.org/repos/asf/archiva-redback-core/blob/6f7fa905/redback-rbac/redback-rbac-providers/redback-rbac-jpa/pom.xml
----------------------------------------------------------------------
diff --git a/redback-rbac/redback-rbac-providers/redback-rbac-jpa/pom.xml b/redback-rbac/redback-rbac-providers/redback-rbac-jpa/pom.xml
index ba1c0bd..665af80 100644
--- a/redback-rbac/redback-rbac-providers/redback-rbac-jpa/pom.xml
+++ b/redback-rbac/redback-rbac-providers/redback-rbac-jpa/pom.xml
@@ -53,7 +53,14 @@
       <groupId>org.apache.archiva.redback</groupId>
       <artifactId>redback-common-jpa</artifactId>
     </dependency>
-
+    <dependency>
+      <groupId>org.springframework</groupId>
+      <artifactId>spring-tx</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework</groupId>
+      <artifactId>spring-orm</artifactId>
+    </dependency>
     <dependency>
       <groupId>org.apache.openjpa</groupId>
       <artifactId>openjpa</artifactId>

http://git-wip-us.apache.org/repos/asf/archiva-redback-core/blob/6f7fa905/redback-rbac/redback-rbac-providers/redback-rbac-jpa/src/main/java/org/apache/archiva/redback/rbac/jpa/JpaRbacManager.java
----------------------------------------------------------------------
diff --git a/redback-rbac/redback-rbac-providers/redback-rbac-jpa/src/main/java/org/apache/archiva/redback/rbac/jpa/JpaRbacManager.java b/redback-rbac/redback-rbac-providers/redback-rbac-jpa/src/main/java/org/apache/archiva/redback/rbac/jpa/JpaRbacManager.java
index 184df40..8689566 100644
--- a/redback-rbac/redback-rbac-providers/redback-rbac-jpa/src/main/java/org/apache/archiva/redback/rbac/jpa/JpaRbacManager.java
+++ b/redback-rbac/redback-rbac-providers/redback-rbac-jpa/src/main/java/org/apache/archiva/redback/rbac/jpa/JpaRbacManager.java
@@ -23,6 +23,7 @@ import org.apache.archiva.redback.rbac.*;
 import org.apache.archiva.redback.rbac.jpa.model.*;
 import org.apache.openjpa.persistence.Type;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.PostConstruct;
 import javax.inject.Inject;
@@ -59,21 +60,26 @@ public class JpaRbacManager extends AbstractRBACManager  {
         return role;
     }
 
+    @Transactional
     @Override
     public Role saveRole(Role role) throws RbacObjectInvalidException, RbacManagerException {
         RBACObjectAssertions.assertValid( role );
         final EntityManager em = getEm();
-        em.getTransaction().begin();
-        em.persist(role);
-
-        em.getTransaction().commit();
-        fireRbacRoleSaved(role);
-        for (Permission perm : role.getPermissions()) {
+        Role mergedRole = em.merge(role);
+        fireRbacRoleSaved(mergedRole);
+        for (Permission perm : mergedRole.getPermissions()) {
             fireRbacPermissionSaved(perm);
         }
-        return role;
+        return mergedRole;
     }
 
+    @Transactional
+    @Override
+    public void addChildRole(Role role, Role childRole) throws RbacObjectInvalidException, RbacManagerException {
+        super.addChildRole(role, childRole);
+    }
+
+    @Transactional
     @Override
     public void saveRoles(Collection<Role> roles) throws RbacObjectInvalidException, RbacManagerException {
         if ( roles == null )
@@ -83,17 +89,17 @@ public class JpaRbacManager extends AbstractRBACManager  {
         }
 
         final EntityManager em = getEm();
-        em.getTransaction().begin();
+        List<Role> merged = new ArrayList<Role>();
         for (Role role : roles ) {
             RBACObjectAssertions.assertValid(role);
-            em.persist(role);
+            merged.add(em.merge(role));
         }
-        em.getTransaction().commit();
-        for (Role role : roles) {
+        for (Role role : merged) {
             fireRbacRoleSaved(role);
         }
     }
 
+
     @Override
     public Role getRole(String roleName) throws RbacObjectNotFoundException, RbacManagerException {
         final EntityManager em = getEm();
@@ -109,6 +115,7 @@ public class JpaRbacManager extends AbstractRBACManager  {
         return q.getResultList();
     }
 
+    @Transactional
     @Override
     public void removeRole(Role role) throws RbacObjectNotFoundException, RbacObjectInvalidException, RbacManagerException {
         RBACObjectAssertions.assertValid(role);
@@ -120,14 +127,12 @@ public class JpaRbacManager extends AbstractRBACManager  {
             throw new RbacPermanentException( "Unable to delete permanent role [" + role.getName() + "]" );
         }
         final EntityManager em = getEm();
-        em.getTransaction().begin();
         JpaRole myRole = em.find(JpaRole.class, role.getName());
         if (myRole == null) {
             throw new RbacObjectNotFoundException("Role not found "+role.getName());
         }
         myRole.setPermissions(new ArrayList<Permission>());
         em.remove(myRole);
-        em.getTransaction().commit();
         fireRbacRoleRemoved(myRole);
     }
 
@@ -159,6 +164,7 @@ public class JpaRbacManager extends AbstractRBACManager  {
         return permission;
     }
 
+    @Transactional
     @Override
     public Permission savePermission(Permission permission) throws RbacObjectInvalidException, RbacManagerException {
         RBACObjectAssertions.assertValid(permission);
@@ -166,11 +172,9 @@ public class JpaRbacManager extends AbstractRBACManager  {
             throw new RbacObjectInvalidException("The permission object ist not instance of JpaPermission");
         }
         final EntityManager em = getEm();
-        em.getTransaction().begin();
-        em.persist(permission);
-        em.getTransaction().commit();
-        fireRbacPermissionSaved(permission);
-        return permission;
+        Permission savedPermission = em.merge(permission);
+        fireRbacPermissionSaved(savedPermission);
+        return savedPermission;
     }
 
     @Override
@@ -192,6 +196,7 @@ public class JpaRbacManager extends AbstractRBACManager  {
         return (List<Permission>)(List<?>)q.getResultList();
     }
 
+    @Transactional
     @Override
     public void removePermission(Permission permission) throws RbacObjectNotFoundException, RbacObjectInvalidException, RbacManagerException {
         RBACObjectAssertions.assertValid(permission);
@@ -203,13 +208,11 @@ public class JpaRbacManager extends AbstractRBACManager  {
             throw new RbacPermanentException( "Unable to delete permanent permission [" + permission.getName() + "]" );
         }
         final EntityManager em = getEm();
-        em.getTransaction().begin();
-        Permission p = em.find(JpaPermission.class, permission.getName());
+        JpaPermission p = em.find(JpaPermission.class, permission.getName());
         if (p == null) {
             throw new RbacObjectNotFoundException("Permission " + permission.getName() + " not found");
         }
         em.remove(p);
-        em.getTransaction().commit();
         fireRbacPermissionRemoved(p);
     }
 
@@ -220,6 +223,7 @@ public class JpaRbacManager extends AbstractRBACManager  {
         return op;
     }
 
+    @Transactional
     @Override
     public Operation saveOperation(Operation operation) throws RbacObjectInvalidException, RbacManagerException {
         RBACObjectAssertions.assertValid(operation);
@@ -227,10 +231,8 @@ public class JpaRbacManager extends AbstractRBACManager  {
             throw new RbacObjectInvalidException("Operation is not JpaOperation object");
         }
         final EntityManager em = getEm();
-        em.getTransaction().begin();
-        em.persist(operation);
-        em.getTransaction().commit();
-        return operation;
+        Operation savedOperation = em.merge(operation);
+        return savedOperation;
     }
 
     @Override
@@ -250,6 +252,7 @@ public class JpaRbacManager extends AbstractRBACManager  {
         return q.getResultList();
     }
 
+    @Transactional
     @Override
     public void removeOperation(Operation operation) throws RbacObjectNotFoundException, RbacObjectInvalidException, RbacManagerException {
         RBACObjectAssertions.assertValid(operation);
@@ -261,14 +264,11 @@ public class JpaRbacManager extends AbstractRBACManager  {
             throw new RbacPermanentException( "Unable to delete permanent operation [" + operation.getName() + "]" );
         }
         final EntityManager em = getEm();
-        em.getTransaction().begin();
-        Operation op = em.find(JpaOperation.class, operation.getName());
+        JpaOperation op = em.find(JpaOperation.class, operation.getName());
         if (op==null) {
             throw new RbacObjectNotFoundException("Operation not found "+operation.getName());
         }
         em.remove(op);
-        em.getTransaction().commit();
-
     }
 
     @Override
@@ -278,6 +278,7 @@ public class JpaRbacManager extends AbstractRBACManager  {
         return resource;
     }
 
+    @Transactional
     @Override
     public Resource saveResource(Resource resource) throws RbacObjectInvalidException, RbacManagerException {
         RBACObjectAssertions.assertValid(resource);
@@ -285,10 +286,17 @@ public class JpaRbacManager extends AbstractRBACManager  {
             throw new RbacObjectInvalidException("Resource is not JpaResource");
         }
         final EntityManager em = getEm();
-        em.getTransaction().begin();
-        em.persist(resource);
-        em.getTransaction().commit();
-        return resource;
+        Resource savedResource = em.merge(resource);
+        return savedResource;
+    }
+
+    // Overriding to add the transactional attribute here
+    @Transactional
+    @Override
+    public Resource getGlobalResource()
+            throws RbacManagerException
+    {
+        return super.getGlobalResource();
     }
 
     @Override
@@ -308,6 +316,7 @@ public class JpaRbacManager extends AbstractRBACManager  {
         return (List<Resource>)(List<?>)q.getResultList();
     }
 
+    @Transactional
     @Override
     public void removeResource(Resource resource) throws RbacObjectNotFoundException, RbacObjectInvalidException, RbacManagerException {
         RBACObjectAssertions.assertValid(resource);
@@ -318,13 +327,11 @@ public class JpaRbacManager extends AbstractRBACManager  {
             throw new RbacObjectInvalidException("Unable to delete permanent resource ["+resource.getIdentifier()+ "]");
         }
         final EntityManager em = getEm();
-        em.getTransaction().begin();
-        Resource res = em.find(JpaResource.class, resource.getIdentifier());
+        JpaResource res = em.find(JpaResource.class, resource.getIdentifier());
         if (res==null) {
             throw new RbacObjectNotFoundException("Resource "+resource.getIdentifier()+" not found");
         }
         em.remove(res);
-        em.getTransaction().commit();
     }
 
     @Override
@@ -334,6 +341,7 @@ public class JpaRbacManager extends AbstractRBACManager  {
         return ua;
     }
 
+    @Transactional
     @Override
     public UserAssignment saveUserAssignment(UserAssignment userAssignment) throws RbacObjectInvalidException, RbacManagerException {
         RBACObjectAssertions.assertValid(userAssignment);
@@ -341,11 +349,9 @@ public class JpaRbacManager extends AbstractRBACManager  {
             throw new RbacObjectInvalidException("Cannto save object that is not JpaUserAssignment");
         }
         final EntityManager em = getEm();
-        em.getTransaction().begin();
-        em.persist(userAssignment);
-        em.getTransaction().commit();
-        fireRbacUserAssignmentSaved(userAssignment);
-        return userAssignment;
+        UserAssignment savedAssignment = em.merge(userAssignment);
+        fireRbacUserAssignmentSaved(savedAssignment);
+        return savedAssignment;
     }
 
     @Override
@@ -373,6 +379,7 @@ public class JpaRbacManager extends AbstractRBACManager  {
         return q.getResultList();
     }
 
+    @Transactional
     @Override
     public void removeUserAssignment(UserAssignment userAssignment) throws RbacObjectNotFoundException, RbacObjectInvalidException, RbacManagerException {
         RBACObjectAssertions.assertValid(userAssignment);
@@ -380,22 +387,20 @@ public class JpaRbacManager extends AbstractRBACManager  {
             throw new RbacObjectInvalidException("Cannot remove permanent object "+userAssignment.getPrincipal());
         }
         final EntityManager em = getEm();
-        em.getTransaction().begin();
-        UserAssignment ua = em.find(UserAssignment.class, userAssignment.getPrincipal());
+        JpaUserAssignment ua = em.find(JpaUserAssignment.class, userAssignment.getPrincipal());
         if (ua==null) {
             throw new RbacObjectNotFoundException("User assignment not found "+userAssignment.getPrincipal());
         }
         em.remove(ua);
-        em.getTransaction().commit();
         fireRbacUserAssignmentRemoved(userAssignment);
     }
 
+    @Transactional
     @Override
     public void eraseDatabase() {
         final EntityManager em = getEm();
         // Deletion is a bit tricky, because the JPA bulk delete queries do not cascade
         // or keep foreign keys into account. 
-        em.getTransaction().begin();
         TypedQuery<JpaPermission> tqp = em.createQuery("SELECT r FROM JpaPermission r",JpaPermission.class);
         for(JpaPermission p : tqp.getResultList()) {
             p.setOperation(null);
@@ -424,10 +429,9 @@ public class JpaRbacManager extends AbstractRBACManager  {
         for(JpaUserAssignment ua : tqu.getResultList()) {
             em.remove(ua);
         }
-        em.getTransaction().commit();
+        em.flush();
         em.clear();
 
-
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/archiva-redback-core/blob/6f7fa905/redback-rbac/redback-rbac-providers/redback-rbac-jpa/src/main/java/org/apache/archiva/redback/rbac/jpa/model/JpaPermission.java
----------------------------------------------------------------------
diff --git a/redback-rbac/redback-rbac-providers/redback-rbac-jpa/src/main/java/org/apache/archiva/redback/rbac/jpa/model/JpaPermission.java b/redback-rbac/redback-rbac-providers/redback-rbac-jpa/src/main/java/org/apache/archiva/redback/rbac/jpa/model/JpaPermission.java
index 4ac6989..1e83d2b 100644
--- a/redback-rbac/redback-rbac-providers/redback-rbac-jpa/src/main/java/org/apache/archiva/redback/rbac/jpa/model/JpaPermission.java
+++ b/redback-rbac/redback-rbac-providers/redback-rbac-jpa/src/main/java/org/apache/archiva/redback/rbac/jpa/model/JpaPermission.java
@@ -41,13 +41,13 @@ public class JpaPermission implements Permission,Serializable {
     private String description;
     @Column(name="PERMANENT")
     private boolean permanent;
-    @ManyToOne(cascade = CascadeType.PERSIST)
+    @ManyToOne(cascade = CascadeType.ALL)
     @JoinColumn(
             name="OPERATION_NAME_OID",
             referencedColumnName = "NAME"
     )
     private JpaOperation operation;
-    @ManyToOne(cascade = CascadeType.PERSIST)
+    @ManyToOne(cascade = CascadeType.ALL)
     @JoinColumn(
             name="RESOURCE_IDENTIFIER_OID",
             referencedColumnName = "IDENTIFIER"

http://git-wip-us.apache.org/repos/asf/archiva-redback-core/blob/6f7fa905/redback-rbac/redback-rbac-providers/redback-rbac-jpa/src/main/java/org/apache/archiva/redback/rbac/jpa/model/JpaRole.java
----------------------------------------------------------------------
diff --git a/redback-rbac/redback-rbac-providers/redback-rbac-jpa/src/main/java/org/apache/archiva/redback/rbac/jpa/model/JpaRole.java b/redback-rbac/redback-rbac-providers/redback-rbac-jpa/src/main/java/org/apache/archiva/redback/rbac/jpa/model/JpaRole.java
index 98c4bf2..5a7cdc7 100644
--- a/redback-rbac/redback-rbac-providers/redback-rbac-jpa/src/main/java/org/apache/archiva/redback/rbac/jpa/model/JpaRole.java
+++ b/redback-rbac/redback-rbac-providers/redback-rbac-jpa/src/main/java/org/apache/archiva/redback/rbac/jpa/model/JpaRole.java
@@ -46,7 +46,7 @@ public class JpaRole extends AbstractRole implements Serializable {
     private boolean assignable;
     @Column(name="PERMANENT")
     private boolean permanent;
-    @ManyToMany(cascade = CascadeType.PERSIST)
+    @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
     @OrderColumn(name="INTEGER_IDX")
     @JoinTable(
             name="SECURITY_ROLE_PERMISSION_MAP",
@@ -57,7 +57,7 @@ public class JpaRole extends AbstractRole implements Serializable {
     )
     List<JpaPermission> permissions = new ArrayList<JpaPermission>();
 
-    @ElementCollection
+    @ElementCollection(fetch = FetchType.EAGER)
     @OrderColumn(name="INTEGER_IDX")
     @CollectionTable(
             name="SECURITY_ROLE_CHILDROLE_MAP",

http://git-wip-us.apache.org/repos/asf/archiva-redback-core/blob/6f7fa905/redback-rbac/redback-rbac-providers/redback-rbac-jpa/src/main/java/org/apache/archiva/redback/rbac/jpa/model/JpaUserAssignment.java
----------------------------------------------------------------------
diff --git a/redback-rbac/redback-rbac-providers/redback-rbac-jpa/src/main/java/org/apache/archiva/redback/rbac/jpa/model/JpaUserAssignment.java b/redback-rbac/redback-rbac-providers/redback-rbac-jpa/src/main/java/org/apache/archiva/redback/rbac/jpa/model/JpaUserAssignment.java
index 65ed8af..f0b3d54 100644
--- a/redback-rbac/redback-rbac-providers/redback-rbac-jpa/src/main/java/org/apache/archiva/redback/rbac/jpa/model/JpaUserAssignment.java
+++ b/redback-rbac/redback-rbac-providers/redback-rbac-jpa/src/main/java/org/apache/archiva/redback/rbac/jpa/model/JpaUserAssignment.java
@@ -25,6 +25,7 @@ import javax.persistence.CollectionTable;
 import javax.persistence.Column;
 import javax.persistence.ElementCollection;
 import javax.persistence.Entity;
+import javax.persistence.FetchType;
 import javax.persistence.Id;
 import javax.persistence.JoinColumn;
 import javax.persistence.OrderColumn;
@@ -44,7 +45,7 @@ public class JpaUserAssignment extends AbstractUserAssignment implements Seriali
     @Id
     @Column(name="PRINCIPAL")
     private String principal;
-    @ElementCollection
+    @ElementCollection(fetch = FetchType.EAGER)
     @Column(name="STRING_ELE")
     @OrderColumn(name="INTEGER_IDX")
     @CollectionTable(

http://git-wip-us.apache.org/repos/asf/archiva-redback-core/blob/6f7fa905/redback-rbac/redback-rbac-providers/redback-rbac-jpa/src/test/java/org/apache/archiva/redback/rbac/jpa/JpaRbacManagerTest.java
----------------------------------------------------------------------
diff --git a/redback-rbac/redback-rbac-providers/redback-rbac-jpa/src/test/java/org/apache/archiva/redback/rbac/jpa/JpaRbacManagerTest.java b/redback-rbac/redback-rbac-providers/redback-rbac-jpa/src/test/java/org/apache/archiva/redback/rbac/jpa/JpaRbacManagerTest.java
index 3c5bc9f..cfc34f4 100644
--- a/redback-rbac/redback-rbac-providers/redback-rbac-jpa/src/test/java/org/apache/archiva/redback/rbac/jpa/JpaRbacManagerTest.java
+++ b/redback-rbac/redback-rbac-providers/redback-rbac-jpa/src/test/java/org/apache/archiva/redback/rbac/jpa/JpaRbacManagerTest.java
@@ -20,10 +20,12 @@ package org.apache.archiva.redback.rbac.jpa;
  */
 
 import org.apache.archiva.redback.common.jdo.test.StoreManagerDebug;
+import org.apache.archiva.redback.rbac.RBACManager;
 import org.apache.archiva.redback.rbac.RbacManagerException;
 import org.apache.archiva.redback.tests.AbstractRbacManagerTestCase;
 import org.junit.Before;
 import org.springframework.test.annotation.DirtiesContext;
+import org.springframework.transaction.annotation.Transactional;
 
 import javax.inject.Inject;
 import javax.inject.Named;
@@ -39,13 +41,15 @@ import java.util.Properties;
  * @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
  */
 @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
+@Transactional
 public class JpaRbacManagerTest
     extends AbstractRbacManagerTestCase
 {
 
     @Inject
     @Named(value = "rbacManager#jpa")
-    JpaRbacManager rbacManager;
+    RBACManager rbacManager;
+
 
     public static int EVENTCOUNT = 2;
 
@@ -64,15 +68,15 @@ public class JpaRbacManagerTest
     {
 
         super.setUp();
-        Properties props = new Properties();
-        InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("test.properties");
-        assert is!=null;
-        props.load(is);
-        is.close();
-        EntityManagerFactory emf = Persistence.createEntityManagerFactory("redback-jpa",props);
-
+//        Properties props = new Properties();
+//        InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("test.properties");
+//        assert is!=null;
+//        props.load(is);
+//        is.close();
+//        EntityManagerFactory emf = Persistence.createEntityManagerFactory("redback-jpa",props);
+//
         log.info("test setup");
-        rbacManager.setEntityManager(emf.createEntityManager());
+        // rbacManager.setEntityManager(emf.createEntityManager());
         super.setRbacManager(rbacManager);
         assertNotNull(rbacManager);
         log.info("injected rbac manager "+rbacManager);

http://git-wip-us.apache.org/repos/asf/archiva-redback-core/blob/6f7fa905/redback-rbac/redback-rbac-providers/redback-rbac-jpa/src/test/resources/spring-context.xml
----------------------------------------------------------------------
diff --git a/redback-rbac/redback-rbac-providers/redback-rbac-jpa/src/test/resources/spring-context.xml b/redback-rbac/redback-rbac-providers/redback-rbac-jpa/src/test/resources/spring-context.xml
index abee0b5..0f09c8a 100644
--- a/redback-rbac/redback-rbac-providers/redback-rbac-jpa/src/test/resources/spring-context.xml
+++ b/redback-rbac/redback-rbac-providers/redback-rbac-jpa/src/test/resources/spring-context.xml
@@ -20,11 +20,11 @@
   -->
 <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-       xmlns:context="http://www.springframework.org/schema/context"
+       xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
            http://www.springframework.org/schema/context
-           http://www.springframework.org/schema/context/spring-context-3.0.xsd">
+           http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
 
   <context:component-scan base-package="org.apache.archiva.redback.rbac.jpa" />
 
@@ -37,4 +37,31 @@
 
   <alias name="commons-configuration" alias="test-conf"/>
 
+
+  <bean name="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
+    <property name="jpaVendorAdapter" >
+      <bean class="org.springframework.orm.jpa.vendor.OpenJpaVendorAdapter" />
+    </property>
+    <property name="persistenceXmlLocation" value="classpath:META-INF/persistence-hsqldb.xml" />
+    <property name="jpaPropertyMap">
+      <map>
+        <entry key="openjpa.ConnectionURL" value="jdbc:hsqldb:mem:redback_database" />
+        <entry key="openjpa.ConnectionDriverName" value="org.hsqldb.jdbcDriver" />
+        <entry key="openjpa.ConnectionUserName" value="sa" />
+        <entry key="openjpa.ConnectionPassword" value="" />
+        <entry key="openjpa.Log" value="DefaultLevel=TRACE, Runtime=TRACE, Tool=INFO, SQL=TRACE" />
+        <entry key="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)" />
+        <entry key="openjpa.jdbc.MappingDefaults"
+               value="ForeignKeyDeleteAction=restrict,JoinForeignKeyDeleteAction=restrict"/>
+      </map>
+    </property>
+
+  </bean>
+
+  <bean name="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager" >
+    <property name="entityManagerFactory" ref="entityManagerFactory" />
+  </bean>
+
+  <tx:annotation-driven />
+
 </beans>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/archiva-redback-core/blob/6f7fa905/redback-rbac/redback-rbac-providers/redback-rbac-jpa/src/test/resources/test.properties
----------------------------------------------------------------------
diff --git a/redback-rbac/redback-rbac-providers/redback-rbac-jpa/src/test/resources/test.properties b/redback-rbac/redback-rbac-providers/redback-rbac-jpa/src/test/resources/test.properties
index df848c4..2456923 100644
--- a/redback-rbac/redback-rbac-providers/redback-rbac-jpa/src/test/resources/test.properties
+++ b/redback-rbac/redback-rbac-providers/redback-rbac-jpa/src/test/resources/test.properties
@@ -14,9 +14,4 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-openjpa.ConnectionURL=jdbc:hsqldb:mem:reback-jpa
-openjpa.ConnectionDriverName=org.hsqldb.jdbcDriver
-openjpa.ConnectionUserName=sa
-openjpa.ConnectionPassword=
-openjp.Log=DefaultLevel=WARN,Tool=INFO
-openjpa.jdbc.SynchronizeMappings=buildSchema(ForeignKeys=true)
\ No newline at end of file
+

http://git-wip-us.apache.org/repos/asf/archiva-redback-core/blob/6f7fa905/redback-users/redback-users-providers/redback-users-jpa/pom.xml
----------------------------------------------------------------------
diff --git a/redback-users/redback-users-providers/redback-users-jpa/pom.xml b/redback-users/redback-users-providers/redback-users-jpa/pom.xml
index 29c24f4..a73e9f2 100644
--- a/redback-users/redback-users-providers/redback-users-jpa/pom.xml
+++ b/redback-users/redback-users-providers/redback-users-jpa/pom.xml
@@ -58,6 +58,11 @@
       <artifactId>spring-tx</artifactId>
       <version>${springVersion}</version>
     </dependency>
+    <dependency>
+      <groupId>org.springframework</groupId>
+      <artifactId>spring-orm</artifactId>
+      <version>${springVersion}</version>
+    </dependency>
 
     <dependency>
       <groupId>org.hsqldb</groupId>

http://git-wip-us.apache.org/repos/asf/archiva-redback-core/blob/6f7fa905/redback-users/redback-users-providers/redback-users-jpa/src/main/java/org/apache/archiva/redback/users/jpa/JpaUserManager.java
----------------------------------------------------------------------
diff --git a/redback-users/redback-users-providers/redback-users-jpa/src/main/java/org/apache/archiva/redback/users/jpa/JpaUserManager.java b/redback-users/redback-users-providers/redback-users-jpa/src/main/java/org/apache/archiva/redback/users/jpa/JpaUserManager.java
index 4429ed8..f60088b 100644
--- a/redback-users/redback-users-providers/redback-users-jpa/src/main/java/org/apache/archiva/redback/users/jpa/JpaUserManager.java
+++ b/redback-users/redback-users-providers/redback-users-jpa/src/main/java/org/apache/archiva/redback/users/jpa/JpaUserManager.java
@@ -23,6 +23,7 @@ import org.apache.archiva.redback.policy.UserSecurityPolicy;
 import org.apache.archiva.redback.users.*;
 import org.apache.archiva.redback.users.jpa.model.JpaUser;
 import org.apache.commons.lang.StringUtils;
+import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.PostConstruct;
@@ -37,7 +38,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
 /**
  * Created by martin on 20.09.16.
  */
-@org.springframework.stereotype.Service("userManager#jpa")
+@Service("userManager#jpa")
 public class JpaUserManager extends AbstractUserManager {
 
 

http://git-wip-us.apache.org/repos/asf/archiva-redback-core/blob/6f7fa905/redback-users/redback-users-providers/redback-users-jpa/src/main/java/org/apache/archiva/redback/users/jpa/model/JpaUser.java
----------------------------------------------------------------------
diff --git a/redback-users/redback-users-providers/redback-users-jpa/src/main/java/org/apache/archiva/redback/users/jpa/model/JpaUser.java b/redback-users/redback-users-providers/redback-users-jpa/src/main/java/org/apache/archiva/redback/users/jpa/model/JpaUser.java
index 9b00c8e..f1c79e2 100644
--- a/redback-users/redback-users-providers/redback-users-jpa/src/main/java/org/apache/archiva/redback/users/jpa/model/JpaUser.java
+++ b/redback-users/redback-users-providers/redback-users-jpa/src/main/java/org/apache/archiva/redback/users/jpa/model/JpaUser.java
@@ -23,6 +23,7 @@ import javax.persistence.CollectionTable;
 import javax.persistence.Column;
 import javax.persistence.ElementCollection;
 import javax.persistence.Entity;
+import javax.persistence.FetchType;
 import javax.persistence.Id;
 import javax.persistence.JoinColumn;
 import javax.persistence.OrderColumn;
@@ -49,7 +50,7 @@ public class JpaUser implements org.apache.archiva.redback.users.User {
     private String encodedPassword;
     @Column(name="LAST_PASSWORD_CHANGE")
     private Date lastPasswordChange;
-    @ElementCollection
+    @ElementCollection(fetch = FetchType.EAGER)
     @OrderColumn(name="INTEGER_IDX")
     @Column(name="STRING_ELE")
     @CollectionTable(name="JDOUSER_PREVIOUSENCODEDPASSWORDS",
@@ -136,18 +137,28 @@ public class JpaUser implements org.apache.archiva.redback.users.User {
 
     @Override
     public List<String> getPreviousEncodedPasswords() {
+        if (previousEncodedPasswords==null) {
+            setPreviousEncodedPasswords(new ArrayList<String>());
+        }
+        assert previousEncodedPasswords != null;
         return previousEncodedPasswords;
     }
 
     @Override
     public void setPreviousEncodedPasswords(List<String> encodedPasswordList) {
-        this.previousEncodedPasswords.clear();
-        this.previousEncodedPasswords.addAll(encodedPasswordList);
+        if (previousEncodedPasswords==null) {
+            previousEncodedPasswords = new ArrayList<String>();
+        }
+        previousEncodedPasswords.clear();
+        previousEncodedPasswords.addAll(encodedPasswordList);
     }
 
     @Override
     public void addPreviousEncodedPassword(String encodedPassword) {
-        this.previousEncodedPasswords.add(encodedPassword);
+        if (previousEncodedPasswords==null) {
+            previousEncodedPasswords = new ArrayList<String>();
+        }
+        previousEncodedPasswords.add(encodedPassword);
     }
 
     @Override
@@ -224,4 +235,21 @@ public class JpaUser implements org.apache.archiva.redback.users.User {
     public String getUserManagerId() {
         return "jpa";
     }
+
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+
+        JpaUser jpaUser = (JpaUser) o;
+
+        return username.equals(jpaUser.username);
+
+    }
+
+    @Override
+    public int hashCode() {
+        return username.hashCode();
+    }
 }

http://git-wip-us.apache.org/repos/asf/archiva-redback-core/blob/6f7fa905/redback-users/redback-users-providers/redback-users-jpa/src/test/java/org/apache/archiva/redback/users/jpa/JpaUserManagerTest.java
----------------------------------------------------------------------
diff --git a/redback-users/redback-users-providers/redback-users-jpa/src/test/java/org/apache/archiva/redback/users/jpa/JpaUserManagerTest.java b/redback-users/redback-users-providers/redback-users-jpa/src/test/java/org/apache/archiva/redback/users/jpa/JpaUserManagerTest.java
index 75cda6d..9772697 100644
--- a/redback-users/redback-users-providers/redback-users-jpa/src/test/java/org/apache/archiva/redback/users/jpa/JpaUserManagerTest.java
+++ b/redback-users/redback-users-providers/redback-users-jpa/src/test/java/org/apache/archiva/redback/users/jpa/JpaUserManagerTest.java
@@ -22,11 +22,22 @@ package org.apache.archiva.redback.users.jpa;
 import org.apache.archiva.redback.policy.UserSecurityPolicy;
 import org.apache.archiva.redback.users.User;
 import org.apache.archiva.redback.users.UserManager;
+import org.apache.archiva.redback.users.UserManagerException;
+import org.apache.archiva.redback.users.UserNotFoundException;
+import org.apache.archiva.redback.users.jpa.model.JpaUser;
 import org.apache.archiva.redback.users.provider.test.AbstractUserManagerTestCase;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.junit.Before;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.test.context.transaction.TransactionConfiguration;
+import org.springframework.transaction.annotation.Transactional;
 
 import javax.inject.Inject;
 import javax.inject.Named;
@@ -40,14 +51,17 @@ import java.util.Properties;
 /**
  * Created by martin on 21.09.16.
  */
-
+@Transactional
 public class JpaUserManagerTest extends AbstractUserManagerTestCase {
 
     Log log = LogFactory.getLog(JpaUserManagerTest.class);
 
     @Inject
     @Named("userManager#jpa")
-    JpaUserManager jpaUserManager;
+    UserManager jpaUserManager;
+
+    @Inject
+    EntityManagerFactory entityManagerFactory;
 
 
     @Inject
@@ -58,28 +72,20 @@ public class JpaUserManagerTest extends AbstractUserManagerTestCase {
     public void setUp() throws Exception {
 
         super.setUp();
-        Properties props = new Properties();
-        InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("test.properties");
-        assert is!=null;
-        props.load(is);
-        is.close();
-        EntityManagerFactory emf = Persistence.createEntityManagerFactory("redback-jpa",props);
-
-        jpaUserManager.setEntityManager(emf.createEntityManager());
-        super.setUserManager(jpaUserManager);
         assertNotNull(jpaUserManager);
+        super.setUserManager(jpaUserManager);
         log.info("injected usermanager "+jpaUserManager);
 
-    // create the factory defined by the "openjpa" entity-manager entry
-  
     }
 
     @Test
     public void testInit() {
+        assertNotNull(jpaUserManager);
         jpaUserManager.initialize();
     }
 
 
 
 
+
 }

http://git-wip-us.apache.org/repos/asf/archiva-redback-core/blob/6f7fa905/redback-users/redback-users-providers/redback-users-jpa/src/test/resources/spring-context.xml
----------------------------------------------------------------------
diff --git a/redback-users/redback-users-providers/redback-users-jpa/src/test/resources/spring-context.xml b/redback-users/redback-users-providers/redback-users-jpa/src/test/resources/spring-context.xml
index 4d7802e..b67e1e9 100644
--- a/redback-users/redback-users-providers/redback-users-jpa/src/test/resources/spring-context.xml
+++ b/redback-users/redback-users-providers/redback-users-jpa/src/test/resources/spring-context.xml
@@ -21,10 +21,11 @@
 <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:context="http://www.springframework.org/schema/context"
+       xmlns:tx="http://www.springframework.org/schema/tx"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
            http://www.springframework.org/schema/context 
-           http://www.springframework.org/schema/context/spring-context-3.0.xsd">
+           http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
 
   <context:component-scan base-package="org.apache.archiva.redback.users.jpa" />
 
@@ -47,4 +48,33 @@
 
   <alias name="commons-configuration" alias="test-conf"/>
 
+
+
+  <bean name="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
+    <property name="jpaVendorAdapter" >
+      <bean class="org.springframework.orm.jpa.vendor.OpenJpaVendorAdapter" />
+    </property>
+    <property name="persistenceXmlLocation" value="classpath:META-INF/persistence-hsqldb.xml" />
+    <property name="jpaPropertyMap">
+      <map>
+        <entry key="openjpa.ConnectionURL" value="jdbc:hsqldb:mem:redback_database" />
+        <entry key="openjpa.ConnectionDriverName" value="org.hsqldb.jdbcDriver" />
+        <entry key="openjpa.ConnectionUserName" value="sa" />
+        <entry key="openjpa.ConnectionPassword" value="" />
+        <entry key="openjpa.Log" value="DefaultLevel=TRACE, Runtime=TRACE, Tool=INFO, SQL=TRACE" />
+        <entry key="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)" />
+        <entry key="openjpa.jdbc.MappingDefaults"
+                  value="ForeignKeyDeleteAction=restrict,JoinForeignKeyDeleteAction=restrict"/>
+      </map>
+    </property>
+
+  </bean>
+
+  <bean name="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager" >
+    <property name="entityManagerFactory" ref="entityManagerFactory" />
+  </bean>
+
+  <tx:annotation-driven />
+
+
 </beans>
\ No newline at end of file