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 2017/05/21 21:47:07 UTC

[22/40] archiva-redback-core git commit: Add JPA Key Provider

Add JPA Key Provider


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/13aa63a4
Tree: http://git-wip-us.apache.org/repos/asf/archiva-redback-core/tree/13aa63a4
Diff: http://git-wip-us.apache.org/repos/asf/archiva-redback-core/diff/13aa63a4

Branch: refs/heads/master
Commit: 13aa63a4e52d72c3a591cd9b7afe2534bf59eca9
Parents: 5420374
Author: Martin Stockhammer <ma...@apache.org>
Authored: Fri Nov 4 08:02:57 2016 +0100
Committer: Martin Stockhammer <ma...@apache.org>
Committed: Fri Nov 4 08:02:57 2016 +0100

----------------------------------------------------------------------
 .../resources/META-INF/persistence-hsqldb.xml   |   1 +
 .../src/main/resources/META-INF/persistence.xml |   1 +
 redback-keys/redback-keys-providers/pom.xml     |   1 +
 .../redback-keys-jpa/pom.xml                    | 101 ++++++++++++
 .../archiva/redback/keys/jpa/JpaKeyManager.java | 156 +++++++++++++++++++
 .../keys/jpa/model/JpaAuthenticationKey.java    |  88 +++++++++++
 .../src/main/resources/spring-context.xml       |  33 ++++
 .../redback/keys/jpa/JpaKeyManagerTest.java     |  65 ++++++++
 .../src/test/resources/spring-context.xml       |  61 ++++++++
 .../redback/keys/KeyManagerTestCase.java        |  10 +-
 10 files changed, 512 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/archiva-redback-core/blob/13aa63a4/redback-common/redback-common-jpa/src/main/resources/META-INF/persistence-hsqldb.xml
----------------------------------------------------------------------
diff --git a/redback-common/redback-common-jpa/src/main/resources/META-INF/persistence-hsqldb.xml b/redback-common/redback-common-jpa/src/main/resources/META-INF/persistence-hsqldb.xml
index 6f37758..82da347 100644
--- a/redback-common/redback-common-jpa/src/main/resources/META-INF/persistence-hsqldb.xml
+++ b/redback-common/redback-common-jpa/src/main/resources/META-INF/persistence-hsqldb.xml
@@ -26,6 +26,7 @@
     <class>org.apache.archiva.redback.rbac.jpa.model.JpaPermission</class>
     <class>org.apache.archiva.redback.rbac.jpa.model.JpaRole</class>
     <class>org.apache.archiva.redback.rbac.jpa.model.JpaUserAssignment</class>
+    <class>org.apache.archiva.redback.keys.jpa.model.JpaAuthenticationKey</class>
     <properties>
       <property name="openjpa.ConnectionURL" value="jdbc:hsqldb:mem:redback_database"/>
       <property name="openjpa.ConnectionDriverName" value="org.hsqldb.jdbcDriver"/>

http://git-wip-us.apache.org/repos/asf/archiva-redback-core/blob/13aa63a4/redback-common/redback-common-jpa/src/main/resources/META-INF/persistence.xml
----------------------------------------------------------------------
diff --git a/redback-common/redback-common-jpa/src/main/resources/META-INF/persistence.xml b/redback-common/redback-common-jpa/src/main/resources/META-INF/persistence.xml
index 5c1fa80..6d9f1af 100644
--- a/redback-common/redback-common-jpa/src/main/resources/META-INF/persistence.xml
+++ b/redback-common/redback-common-jpa/src/main/resources/META-INF/persistence.xml
@@ -27,6 +27,7 @@
         <class>org.apache.archiva.redback.rbac.jpa.model.JpaPermission</class>
         <class>org.apache.archiva.redback.rbac.jpa.model.JpaRole</class>
         <class>org.apache.archiva.redback.rbac.jpa.model.JpaUserAssignment</class>
+        <class>org.apache.archiva.redback.keys.jpa.model.JpaAuthenticationKey</class>
         <properties>
           <property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)"/>
           <property name="openjpa.jdbc.SchemaFactory" value="native(ForeignKeys=true)" />

http://git-wip-us.apache.org/repos/asf/archiva-redback-core/blob/13aa63a4/redback-keys/redback-keys-providers/pom.xml
----------------------------------------------------------------------
diff --git a/redback-keys/redback-keys-providers/pom.xml b/redback-keys/redback-keys-providers/pom.xml
index ee07fd9..4cc46ab 100644
--- a/redback-keys/redback-keys-providers/pom.xml
+++ b/redback-keys/redback-keys-providers/pom.xml
@@ -31,5 +31,6 @@
     <module>redback-keys-jdo</module>
     <module>redback-keys-memory</module>
     <module>redback-keys-cached</module>
+      <module>redback-keys-jpa</module>
   </modules>
 </project>

http://git-wip-us.apache.org/repos/asf/archiva-redback-core/blob/13aa63a4/redback-keys/redback-keys-providers/redback-keys-jpa/pom.xml
----------------------------------------------------------------------
diff --git a/redback-keys/redback-keys-providers/redback-keys-jpa/pom.xml b/redback-keys/redback-keys-providers/redback-keys-jpa/pom.xml
new file mode 100644
index 0000000..f61e614
--- /dev/null
+++ b/redback-keys/redback-keys-providers/redback-keys-jpa/pom.xml
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>redback-keys-providers</artifactId>
+        <groupId>org.apache.archiva.redback</groupId>
+        <version>2.5-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>redback-keys-jpa</artifactId>
+    <packaging>jar</packaging>
+    <name>Redback :: Key Management Provider :: JPA</name>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.archiva.redback</groupId>
+            <artifactId>redback-keys-api</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.archiva.redback</groupId>
+            <artifactId>redback-common-jpa</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-context-support</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>javax.annotation</groupId>
+            <artifactId>jsr250-api</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.archiva.redback</groupId>
+            <artifactId>redback-keys-tests</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.openjpa</groupId>
+            <artifactId>openjpa</artifactId>
+            <version>${openjpa.version}</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>org.hsqldb</groupId>
+            <artifactId>hsqldb</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-simple</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.openjpa</groupId>
+                <artifactId>openjpa-maven-plugin</artifactId>
+                <version>2.4.1</version>
+                <configuration>
+                    <includes>**/model/*.class</includes>
+                    <addDefaultConstructor>true</addDefaultConstructor>
+                    <enforcePropertyRestrictions>true</enforcePropertyRestrictions>
+                </configuration>
+                <executions>
+                    <execution>
+                        <id>enhancer</id>
+                        <phase>process-classes</phase>
+                        <goals>
+                            <goal>enhance</goal>
+                        </goals>
+                    </execution>
+                </executions>
+                <dependencies>
+                    <dependency>
+                        <groupId>org.apache.openjpa</groupId>
+                        <artifactId>openjpa</artifactId>
+                        <!-- set the version to be the same as the level in your runtime -->
+                        <version>${openjpa.version}</version>
+                    </dependency>
+                </dependencies>
+            </plugin>
+        </plugins>
+    </build>
+
+
+</project>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/archiva-redback-core/blob/13aa63a4/redback-keys/redback-keys-providers/redback-keys-jpa/src/main/java/org/apache/archiva/redback/keys/jpa/JpaKeyManager.java
----------------------------------------------------------------------
diff --git a/redback-keys/redback-keys-providers/redback-keys-jpa/src/main/java/org/apache/archiva/redback/keys/jpa/JpaKeyManager.java b/redback-keys/redback-keys-providers/redback-keys-jpa/src/main/java/org/apache/archiva/redback/keys/jpa/JpaKeyManager.java
new file mode 100644
index 0000000..ab4a001
--- /dev/null
+++ b/redback-keys/redback-keys-providers/redback-keys-jpa/src/main/java/org/apache/archiva/redback/keys/jpa/JpaKeyManager.java
@@ -0,0 +1,156 @@
+package org.apache.archiva.redback.keys.jpa;
+
+import org.apache.archiva.redback.keys.AbstractKeyManager;
+import org.apache.archiva.redback.keys.AuthenticationKey;
+import org.apache.archiva.redback.keys.KeyManagerException;
+import org.apache.archiva.redback.keys.KeyNotFoundException;
+import org.apache.archiva.redback.keys.jpa.model.JpaAuthenticationKey;
+import org.codehaus.plexus.util.StringUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.persistence.*;
+import java.util.Calendar;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+/**
+ * Created by martin on 27.10.16.
+ */
+@Service( "keyManager#jpa" )
+public class JpaKeyManager extends AbstractKeyManager {
+
+    @PersistenceContext(unitName = "redback-jpa")
+    EntityManager em;
+
+    // JpaUserManager is a singleton and initialization should be thread safe
+    private AtomicBoolean initialized = new AtomicBoolean(false);
+
+    public void setEntityManager(EntityManager em) {
+        this.em = em;
+    }
+
+    private EntityManager getEm() {
+        if (initialized.compareAndSet(false,true)) {
+            Query q = em.createQuery("SELECT COUNT(u.key) FROM JpaAuthenticationKey u");
+            boolean dbInit = q.getFirstResult()==0;
+        }
+        return em;
+    }
+
+    public String getId()
+    {
+        return "JPA Key Manager - " + this.getClass().getName();
+    }
+
+
+    @Override
+    @Transactional
+    public AuthenticationKey createKey( String principal, String purpose, int expirationMinutes )
+            throws KeyManagerException
+    {
+        JpaAuthenticationKey authkey = new JpaAuthenticationKey();
+        authkey.setKey( super.generateUUID() );
+        authkey.setForPrincipal( principal );
+        authkey.setPurpose( purpose );
+
+        Calendar now = getNowGMT();
+        authkey.setDateCreated( now.getTime() );
+
+        if ( expirationMinutes >= 0 )
+        {
+            Calendar expiration = getNowGMT();
+            expiration.add( Calendar.MINUTE, expirationMinutes );
+            authkey.setDateExpires( expiration.getTime() );
+        }
+
+        return addKey( authkey );
+    }
+
+    @Transactional
+    @Override
+    public AuthenticationKey addKey(AuthenticationKey key) {
+        final EntityManager em = getEm();
+        AuthenticationKey mergedKey = em.merge((JpaAuthenticationKey)key);
+        return mergedKey;
+    }
+
+    @Transactional
+    @Override
+    public void eraseDatabase()
+    {
+        final EntityManager em = getEm();
+        Query q = em.createQuery("DELETE FROM JpaAuthenticationKey k");
+        q.executeUpdate();
+    }
+
+    @Transactional
+    @Override
+    public AuthenticationKey findKey(final String key) throws KeyNotFoundException, KeyManagerException {
+        final EntityManager em = getEm();
+        if ( StringUtils.isEmpty( key ) )
+        {
+            throw new KeyNotFoundException( "Empty key not found." );
+        }
+
+        try
+        {
+            TypedQuery<JpaAuthenticationKey> q =
+                    em.createQuery("SELECT k FROM JpaAuthenticationKey k WHERE k.key = :key",JpaAuthenticationKey.class);
+            q.setParameter("key",key);
+            JpaAuthenticationKey authkey = q.getSingleResult();
+            if ( authkey == null )
+            {
+                throw new KeyNotFoundException( "Key [" + key + "] not found." );
+            }
+            assertNotExpired( authkey );
+
+            return authkey;
+        } catch (NoResultException ex) {
+            throw new KeyNotFoundException("Key [" + key + "] not found.");
+        } catch (KeyNotFoundException ex) {
+            throw ex;
+        } catch (Throwable ex) {
+            log.error("Error while trying to retrieve JpaAuthenticationKey {}", key);
+            throw new KeyManagerException("Error while retrieving key "+key+": "+ex.getMessage(), ex);
+        }
+    }
+
+    @Transactional
+    @Override
+    protected void assertNotExpired(AuthenticationKey authkey) throws KeyManagerException {
+        super.assertNotExpired(authkey);
+    }
+
+    @Transactional
+    @Override
+    public void deleteKey(AuthenticationKey key) throws KeyManagerException {
+        final EntityManager em = getEm();
+        em.remove((JpaAuthenticationKey)key);
+    }
+
+    @Transactional
+    @Override
+    public void deleteKey(String key) throws KeyManagerException {
+        try {
+            JpaAuthenticationKey foundKey = (JpaAuthenticationKey)findKey(key);
+            em.remove(foundKey);
+        } catch (KeyNotFoundException ex) {
+            // Ignore
+        } catch (Exception ex) {
+            log.error("Error occured while trying to find key {}: {}", key, ex.getMessage());
+            throw new KeyManagerException("Error while retrieving key "+key, ex);
+        }
+    }
+
+    @Override
+    public List<AuthenticationKey> getAllKeys() {
+        final EntityManager em = getEm();
+        Query q= em.createQuery("SELECT x from JpaAuthenticationKey x");
+        return q.getResultList();
+    }
+
+
+
+
+}

http://git-wip-us.apache.org/repos/asf/archiva-redback-core/blob/13aa63a4/redback-keys/redback-keys-providers/redback-keys-jpa/src/main/java/org/apache/archiva/redback/keys/jpa/model/JpaAuthenticationKey.java
----------------------------------------------------------------------
diff --git a/redback-keys/redback-keys-providers/redback-keys-jpa/src/main/java/org/apache/archiva/redback/keys/jpa/model/JpaAuthenticationKey.java b/redback-keys/redback-keys-providers/redback-keys-jpa/src/main/java/org/apache/archiva/redback/keys/jpa/model/JpaAuthenticationKey.java
new file mode 100644
index 0000000..fba9952
--- /dev/null
+++ b/redback-keys/redback-keys-providers/redback-keys-jpa/src/main/java/org/apache/archiva/redback/keys/jpa/model/JpaAuthenticationKey.java
@@ -0,0 +1,88 @@
+package org.apache.archiva.redback.keys.jpa.model;
+
+import org.apache.archiva.redback.keys.AuthenticationKey;
+
+import javax.persistence.Column;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import java.util.Date;
+
+/**
+ * Created by martin on 27.10.16.
+ */
+@javax.persistence.Entity
+@Table(name="JDOAUTHENTICATIONKEY")
+public class JpaAuthenticationKey implements AuthenticationKey {
+
+    @Column(name="AUTHKEY")
+    @Id
+    private String key;
+
+    @Column(name="FOR_PRINCIPAL")
+    private String forPrincipal;
+
+    @Column(name="PURPOSE")
+    private String purpose;
+
+    @Column(name="DATE_CREATED")
+    private Date dateCreated;
+
+    @Column(name="DATE_EXPIRES")
+    private Date dateExpires;
+
+    public String getKey() {
+        return key;
+    }
+
+    public void setKey(String key) {
+        this.key = key;
+    }
+
+    public String getForPrincipal() {
+        return forPrincipal;
+    }
+
+    public void setForPrincipal(String forPrincipal) {
+        this.forPrincipal = forPrincipal;
+    }
+
+    public String getPurpose() {
+        return purpose;
+    }
+
+    public void setPurpose(String purpose) {
+        this.purpose = purpose;
+    }
+
+    public Date getDateCreated() {
+        return dateCreated;
+    }
+
+    public void setDateCreated(Date dateCreated) {
+        this.dateCreated = dateCreated;
+    }
+
+    public Date getDateExpires() {
+        return dateExpires;
+    }
+
+    public void setDateExpires(Date dateExpires) {
+        this.dateExpires = dateExpires;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+
+        JpaAuthenticationKey that = (JpaAuthenticationKey) o;
+
+        return key.equals(that.key);
+
+    }
+
+    @Override
+    public int hashCode() {
+        return key.hashCode();
+    }
+}

http://git-wip-us.apache.org/repos/asf/archiva-redback-core/blob/13aa63a4/redback-keys/redback-keys-providers/redback-keys-jpa/src/main/resources/spring-context.xml
----------------------------------------------------------------------
diff --git a/redback-keys/redback-keys-providers/redback-keys-jpa/src/main/resources/spring-context.xml b/redback-keys/redback-keys-providers/redback-keys-jpa/src/main/resources/spring-context.xml
new file mode 100644
index 0000000..6d066fd
--- /dev/null
+++ b/redback-keys/redback-keys-providers/redback-keys-jpa/src/main/resources/spring-context.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0"?>
+
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements.  See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership.  The ASF licenses this file
+  ~ to you under the Apache License, Version 2.0 (the
+  ~ "License"); you may not use this file except in compliance
+  ~ with the License.  You may obtain a copy of the License at
+  ~
+  ~   http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+  -->
+<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/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
+
+  <context:annotation-config />
+  <context:component-scan base-package="org.apache.archiva.redback.keys.jpa" />
+
+</beans>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/archiva-redback-core/blob/13aa63a4/redback-keys/redback-keys-providers/redback-keys-jpa/src/test/java/org/apache/archiva/redback/keys/jpa/JpaKeyManagerTest.java
----------------------------------------------------------------------
diff --git a/redback-keys/redback-keys-providers/redback-keys-jpa/src/test/java/org/apache/archiva/redback/keys/jpa/JpaKeyManagerTest.java b/redback-keys/redback-keys-providers/redback-keys-jpa/src/test/java/org/apache/archiva/redback/keys/jpa/JpaKeyManagerTest.java
new file mode 100644
index 0000000..0c34fbf
--- /dev/null
+++ b/redback-keys/redback-keys-providers/redback-keys-jpa/src/test/java/org/apache/archiva/redback/keys/jpa/JpaKeyManagerTest.java
@@ -0,0 +1,65 @@
+package org.apache.archiva.redback.keys.jpa;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.apache.archiva.redback.keys.KeyManager;
+import org.apache.archiva.redback.keys.KeyManagerTestCase;
+import org.junit.Before;
+import org.junit.Test;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.persistence.EntityManagerFactory;
+
+/**
+ * JdoKeyManagerTest 
+ *
+ * @author <a href="mailto:martin_s@apache.org">Martin Stockhammer</a>
+ *
+ */
+@Transactional
+public class JpaKeyManagerTest
+    extends KeyManagerTestCase
+{
+
+    @Inject
+    EntityManagerFactory entityManagerFactory;
+
+    @Inject
+    @Named(value = "keyManager#jpa")
+    KeyManager keyManager;
+
+
+    @Before
+    public void setUp()
+        throws Exception {
+
+        super.setUp();
+        super.setKeyManager(keyManager);
+
+    }
+
+    @Test
+    public void initialize() {
+        assertNotNull(keyManager);
+    }
+    
+}

http://git-wip-us.apache.org/repos/asf/archiva-redback-core/blob/13aa63a4/redback-keys/redback-keys-providers/redback-keys-jpa/src/test/resources/spring-context.xml
----------------------------------------------------------------------
diff --git a/redback-keys/redback-keys-providers/redback-keys-jpa/src/test/resources/spring-context.xml b/redback-keys/redback-keys-providers/redback-keys-jpa/src/test/resources/spring-context.xml
new file mode 100644
index 0000000..2dea185
--- /dev/null
+++ b/redback-keys/redback-keys-providers/redback-keys-jpa/src/test/resources/spring-context.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0"?>
+
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements.  See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership.  The ASF licenses this file
+  ~ to you under the Apache License, Version 2.0 (the
+  ~ "License"); you may not use this file except in compliance
+  ~ with the License.  You may obtain a copy of the License at
+  ~
+  ~   http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+  -->
+<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/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
+
+  <context:component-scan base-package="org.apache.archiva.redback.keys.jpa" />
+
+
+
+  <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/13aa63a4/redback-keys/redback-keys-tests/src/main/java/org/apache/archiva/redback/keys/KeyManagerTestCase.java
----------------------------------------------------------------------
diff --git a/redback-keys/redback-keys-tests/src/main/java/org/apache/archiva/redback/keys/KeyManagerTestCase.java b/redback-keys/redback-keys-tests/src/main/java/org/apache/archiva/redback/keys/KeyManagerTestCase.java
index 1cf154f..b3c0f3c 100644
--- a/redback-keys/redback-keys-tests/src/main/java/org/apache/archiva/redback/keys/KeyManagerTestCase.java
+++ b/redback-keys/redback-keys-tests/src/main/java/org/apache/archiva/redback/keys/KeyManagerTestCase.java
@@ -23,10 +23,7 @@ import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 
 import java.text.SimpleDateFormat;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Date;
-import java.util.List;
+import java.util.*;
 
 /**
  * KeyManagerTestCase
@@ -115,11 +112,14 @@ public class KeyManagerTestCase
         assertEquals( "bar", created2.getForPrincipal() );
         assertEquals( "Something", created2.getPurpose() );
 
-        List<AuthenticationKey> keys = getKeyManager().getAllKeys();
+        System.out.println("foo key "+created1.getKey());
+        System.out.println("bar key "+created2.getKey());
+        List<AuthenticationKey> keys = new ArrayList(getKeyManager().getAllKeys());
         Collections.sort( keys, new Comparator<AuthenticationKey>()
         {
             public int compare( AuthenticationKey key1, AuthenticationKey key2 )
             {
+                System.out.println("Compare "+key2.getForPrincipal()+key2.getKey()+" - "+key1.getForPrincipal()+key1.getKey());
                 return key2.getForPrincipal().compareTo( key1.getForPrincipal() );
             }
         } );