You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@archiva.apache.org by ol...@apache.org on 2013/05/16 14:12:22 UTC

svn commit: r1483314 - in /archiva/sandbox/trunk/metadata-store-cassandra: ./ src/main/java/org/apache/archiva/metadata/repository/jpa/ src/main/java/org/apache/archiva/metadata/repository/jpa/model/ src/test/java/org/apache/archiva/metadata/repository...

Author: olamy
Date: Thu May 16 12:12:21 2013
New Revision: 1483314

URL: http://svn.apache.org/r1483314
Log:
use astyanax

Modified:
    archiva/sandbox/trunk/metadata-store-cassandra/pom.xml
    archiva/sandbox/trunk/metadata-store-cassandra/src/main/java/org/apache/archiva/metadata/repository/jpa/ArchivaEntityManagerFactory.java
    archiva/sandbox/trunk/metadata-store-cassandra/src/main/java/org/apache/archiva/metadata/repository/jpa/CassandraMetadataRepository.java
    archiva/sandbox/trunk/metadata-store-cassandra/src/main/java/org/apache/archiva/metadata/repository/jpa/CassandraRepositorySessionFactory.java
    archiva/sandbox/trunk/metadata-store-cassandra/src/main/java/org/apache/archiva/metadata/repository/jpa/DefaultArchivaEntityManagerFactory.java
    archiva/sandbox/trunk/metadata-store-cassandra/src/main/java/org/apache/archiva/metadata/repository/jpa/model/Namespace.java
    archiva/sandbox/trunk/metadata-store-cassandra/src/main/java/org/apache/archiva/metadata/repository/jpa/model/Repository.java
    archiva/sandbox/trunk/metadata-store-cassandra/src/test/java/org/apache/archiva/metadata/repository/jpa/RepositoriesNamespaceTest.java

Modified: archiva/sandbox/trunk/metadata-store-cassandra/pom.xml
URL: http://svn.apache.org/viewvc/archiva/sandbox/trunk/metadata-store-cassandra/pom.xml?rev=1483314&r1=1483313&r2=1483314&view=diff
==============================================================================
--- archiva/sandbox/trunk/metadata-store-cassandra/pom.xml (original)
+++ archiva/sandbox/trunk/metadata-store-cassandra/pom.xml Thu May 16 12:12:21 2013
@@ -89,9 +89,9 @@
     </dependency>
 
     <dependency>
-      <groupId>com.alvazan</groupId>
-      <artifactId>playorm</artifactId>
-      <version>1.5</version>
+      <groupId>com.netflix.astyanax</groupId>
+      <artifactId>astyanax-entity-mapper</artifactId>
+      <version>1.56.37</version>
       <exclusions>
         <exclusion>
           <groupId>stax</groupId>
@@ -101,6 +101,18 @@
     </dependency>
 
     <dependency>
+      <groupId>com.netflix.astyanax</groupId>
+      <artifactId>astyanax-core</artifactId>
+      <version>1.56.37</version>
+    </dependency>
+
+    <dependency>
+      <groupId>com.netflix.astyanax</groupId>
+      <artifactId>astyanax-thrift</artifactId>
+      <version>1.56.37</version>
+    </dependency>
+
+    <dependency>
       <groupId>org.apache.logging.log4j</groupId>
       <artifactId>log4j-jcl</artifactId>
     </dependency>

Modified: archiva/sandbox/trunk/metadata-store-cassandra/src/main/java/org/apache/archiva/metadata/repository/jpa/ArchivaEntityManagerFactory.java
URL: http://svn.apache.org/viewvc/archiva/sandbox/trunk/metadata-store-cassandra/src/main/java/org/apache/archiva/metadata/repository/jpa/ArchivaEntityManagerFactory.java?rev=1483314&r1=1483313&r2=1483314&view=diff
==============================================================================
--- archiva/sandbox/trunk/metadata-store-cassandra/src/main/java/org/apache/archiva/metadata/repository/jpa/ArchivaEntityManagerFactory.java (original)
+++ archiva/sandbox/trunk/metadata-store-cassandra/src/main/java/org/apache/archiva/metadata/repository/jpa/ArchivaEntityManagerFactory.java Thu May 16 12:12:21 2013
@@ -19,6 +19,8 @@ package org.apache.archiva.metadata.repo
  * under the License.
  */
 
+import com.netflix.astyanax.Keyspace;
+
 import javax.persistence.EntityManager;
 
 /**
@@ -27,4 +29,7 @@ import javax.persistence.EntityManager;
 public interface ArchivaEntityManagerFactory
 {
     EntityManager getEntityManager();
+
+    Keyspace getKeyspace();
+
 }

Modified: archiva/sandbox/trunk/metadata-store-cassandra/src/main/java/org/apache/archiva/metadata/repository/jpa/CassandraMetadataRepository.java
URL: http://svn.apache.org/viewvc/archiva/sandbox/trunk/metadata-store-cassandra/src/main/java/org/apache/archiva/metadata/repository/jpa/CassandraMetadataRepository.java?rev=1483314&r1=1483313&r2=1483314&view=diff
==============================================================================
--- archiva/sandbox/trunk/metadata-store-cassandra/src/main/java/org/apache/archiva/metadata/repository/jpa/CassandraMetadataRepository.java (original)
+++ archiva/sandbox/trunk/metadata-store-cassandra/src/main/java/org/apache/archiva/metadata/repository/jpa/CassandraMetadataRepository.java Thu May 16 12:12:21 2013
@@ -19,6 +19,9 @@ package org.apache.archiva.metadata.repo
  * under the License.
  */
 
+import com.google.common.base.Function;
+import com.netflix.astyanax.Keyspace;
+import com.netflix.astyanax.entitystore.DefaultEntityManager;
 import org.apache.archiva.configuration.ArchivaConfiguration;
 import org.apache.archiva.metadata.model.ArtifactMetadata;
 import org.apache.archiva.metadata.model.MetadataFacet;
@@ -31,21 +34,21 @@ import org.apache.archiva.metadata.repos
 import org.apache.archiva.metadata.repository.MetadataResolutionException;
 import org.apache.archiva.metadata.repository.jpa.model.Namespace;
 import org.apache.archiva.metadata.repository.jpa.model.Repository;
+import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Service;
 
-import javax.annotation.PostConstruct;
 import javax.persistence.EntityManager;
-import javax.persistence.Persistence;
+import javax.persistence.PersistenceException;
 import javax.persistence.TypedQuery;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Date;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
-import java.util.Properties;
+import java.util.Set;
 
 /**
  * @author Olivier Lamy
@@ -62,26 +65,83 @@ public class CassandraMetadataRepository
 
     private final Map<String, MetadataFacetFactory> metadataFacetFactories;
 
+    private Keyspace keyspace;
+
+    com.netflix.astyanax.entitystore.EntityManager<Repository, String> repositoryEntityManager;
+
+    com.netflix.astyanax.entitystore.EntityManager<Namespace, String> namespaceEntityManager;
+
     public CassandraMetadataRepository( Map<String, MetadataFacetFactory> metadataFacetFactories,
-                                        ArchivaConfiguration configuration, EntityManager entityManager )
+                                        ArchivaConfiguration configuration, EntityManager entityManager,
+                                        Keyspace keyspace )
     {
         this.metadataFacetFactories = metadataFacetFactories;
         this.configuration = configuration;
         this.entityManager = entityManager;
+        this.keyspace = keyspace;
+
+        repositoryEntityManager =
+            new DefaultEntityManager.Builder<Repository, String>().withEntityType( Repository.class ).withKeyspace(
+                keyspace ).build();
+
+        repositoryEntityManager.createStorage( null );
+
+        namespaceEntityManager =
+            new DefaultEntityManager.Builder<Namespace, String>().withEntityType( Namespace.class ).withKeyspace(
+                keyspace ).build();
+
+        namespaceEntityManager.createStorage( null );
+    }
+
+    public com.netflix.astyanax.entitystore.EntityManager<Repository, String> getRepositoryEntityManager()
+    {
+        return repositoryEntityManager;
+    }
+
+    public com.netflix.astyanax.entitystore.EntityManager<Namespace, String> getNamespaceEntityManager()
+    {
+        return namespaceEntityManager;
     }
 
     @Override
     public void updateNamespace( String repositoryId, String namespaceId )
         throws MetadataRepositoryException
     {
+        Repository repository = this.repositoryEntityManager.get( repositoryId );
+
+        if ( repository == null )
+        {
+            repository = new Repository( repositoryId );
+
+            Namespace namespace = new Namespace( namespaceId, repository );
+            //namespace.setRepository( repository );
+            //repository.getNamespaces().add( namespace );
+            this.repositoryEntityManager.put( repository );
+            this.namespaceEntityManager.put( namespace );
+        }
+        // FIXME add a Namespace id builder
+        Namespace namespace = namespaceEntityManager.get( namespaceId + "-" + repositoryId );
+        if ( namespace == null )
+        {
+            namespace = new Namespace( namespaceId, repository );
+            namespaceEntityManager.put( namespace );
+        }
+
+    }
+
+
+    public void updateNamespaceKundera( String repositoryId, String namespaceId )
+        throws MetadataRepositoryException
+    {
+
         Repository repository = this.entityManager.find( Repository.class, repositoryId );
 
         if ( repository == null )
         {
             repository = new Repository( repositoryId );
 
-            Namespace namespace = new Namespace( namespaceId );
-            namespace.setRepository( repository );
+            Namespace namespace = new Namespace( namespaceId, repository );
+            //namespace.setRepository( repository );
             //repository.getNamespaces().add( namespace );
             this.entityManager.persist( repository );
             this.entityManager.persist( namespace );
@@ -89,8 +149,8 @@ public class CassandraMetadataRepository
         else
         {
 
-            Namespace namespace = new Namespace( namespaceId );
-            namespace.setRepository( repository );
+            Namespace namespace = new Namespace( namespaceId, repository );
+            //namespace.setRepository( repository );
             entityManager.persist( namespace );
             // contains the namespace ?
             /*
@@ -105,7 +165,18 @@ public class CassandraMetadataRepository
     }
 
     @Override
-    public void removeNamespace( String repositoryId, String namespace )
+    public void removeNamespace( String repositoryId, String namespaceId )
+        throws MetadataRepositoryException
+    {
+        Namespace namespace = namespaceEntityManager.get( namespaceId + "-" + repositoryId );
+        if ( namespace != null )
+        {
+            namespaceEntityManager.remove( namespace );
+        }
+    }
+
+
+    public void removeNamespaceKundera( String repositoryId, String namespace )
         throws MetadataRepositoryException
     {
         TypedQuery<Namespace> typedQuery =
@@ -123,7 +194,11 @@ public class CassandraMetadataRepository
     public void removeRepository( String repositoryId )
         throws MetadataRepositoryException
     {
-        //To change body of implemented methods use File | Settings | File Templates.
+        Repository repository = repositoryEntityManager.get( repositoryId );
+        if ( repository != null )
+        {
+            repositoryEntityManager.remove( repository );
+        }
     }
 
     @Override
@@ -131,6 +206,27 @@ public class CassandraMetadataRepository
         throws MetadataRepositoryException
     {
         logger.debug( "getRepositories" );
+
+        List<Repository> repositories = repositoryEntityManager.getAll();
+        if ( repositories == null )
+        {
+            return Collections.emptyList();
+        }
+        List<String> repoIds = new ArrayList<String>( repositories.size() );
+        for ( Repository repository : repositories )
+        {
+            repoIds.add( repository.getName() );
+        }
+        logger.debug( "getRepositories found: {}", repoIds );
+        return repoIds;
+
+    }
+
+
+    public Collection<String> getRepositoriesKundera()
+        throws MetadataRepositoryException
+    {
+        logger.debug( "getRepositories" );
         TypedQuery<Repository> typedQuery = entityManager.createQuery( "select r from Repository r", Repository.class );
         List<Repository> repositories = typedQuery.getResultList();
         if ( repositories == null )
@@ -161,8 +257,69 @@ public class CassandraMetadataRepository
         return null;  //To change body of implemented methods use File | Settings | File Templates.
     }
 
+    public List<String> getNamespaces( final String repoId )
+        throws MetadataResolutionException
+    {
+        try
+        {
+            logger.debug( "getNamespaces for repository '{}'", repoId );
+            //TypedQuery<Repository> typedQuery =
+            //    entityManager.createQuery( "select n from Namespace n where n.repository_id=:id", Namespace.class );
+
+            //List<Repository> namespaces = typedQuery.setParameter( "id", repoId ).getResultList();
+
+            Repository repository = repositoryEntityManager.get( repoId );
+
+            if ( repository == null )
+            {
+                return Collections.emptyList();
+            }
+
+            // FIXME find correct cql query
+            //String query = "select * from namespace where repository.id = '" + repoId + "';";
+
+            //List<Namespace> namespaces = namespaceEntityManager.find( query );
+
+            final Set<Namespace> namespaces = new HashSet<Namespace>();
+
+            namespaceEntityManager.visitAll( new Function<Namespace, Boolean>()
+            {
+                // @Nullable add dependency ?
+                @Override
+                public Boolean apply( Namespace namespace )
+                {
+                    if ( namespace != null && namespace.getRepository() != null && StringUtils.equalsIgnoreCase( repoId,
+                                                                                                                 namespace.getRepository().getId() ) )
+                    {
+                        namespaces.add( namespace );
+                    }
+                    return Boolean.TRUE;
+                }
+            } );
+
+            repository.setNamespaces( new ArrayList<Namespace>( namespaces ) );
+
+            if ( repository == null || repository.getNamespaces().isEmpty() )
+            {
+                return Collections.emptyList();
+            }
+            List<String> namespaceIds = new ArrayList<String>( repository.getNamespaces().size() );
+
+            for ( Namespace n : repository.getNamespaces() )
+            {
+                namespaceIds.add( n.getName() );
+            }
+
+            logger.debug( "getNamespaces for repository '{}' found {}", repoId, namespaceIds.size() );
+            return namespaceIds;
+        }
+        catch ( PersistenceException e )
+        {
+            throw new MetadataResolutionException( e.getMessage(), e );
+        }
+    }
 
-    public List<String> getNamespaces( String repoId )
+    public List<String> getNamespacesKundera( String repoId )
         throws MetadataResolutionException
     {
         logger.debug( "getNamespaces for repository '{}'", repoId );
@@ -173,7 +330,7 @@ public class CassandraMetadataRepository
 
         Repository repository = entityManager.find( Repository.class, repoId );
 
-        if ( repository == null || repository.getNamespaces().isEmpty())
+        if ( repository == null || repository.getNamespaces().isEmpty() )
         {
             return Collections.emptyList();
         }

Modified: archiva/sandbox/trunk/metadata-store-cassandra/src/main/java/org/apache/archiva/metadata/repository/jpa/CassandraRepositorySessionFactory.java
URL: http://svn.apache.org/viewvc/archiva/sandbox/trunk/metadata-store-cassandra/src/main/java/org/apache/archiva/metadata/repository/jpa/CassandraRepositorySessionFactory.java?rev=1483314&r1=1483313&r2=1483314&view=diff
==============================================================================
--- archiva/sandbox/trunk/metadata-store-cassandra/src/main/java/org/apache/archiva/metadata/repository/jpa/CassandraRepositorySessionFactory.java (original)
+++ archiva/sandbox/trunk/metadata-store-cassandra/src/main/java/org/apache/archiva/metadata/repository/jpa/CassandraRepositorySessionFactory.java Thu May 16 12:12:21 2013
@@ -19,6 +19,16 @@ package org.apache.archiva.metadata.repo
  * under the License.
  */
 
+import com.google.common.collect.ImmutableMap;
+import com.netflix.astyanax.AstyanaxContext;
+import com.netflix.astyanax.Keyspace;
+import com.netflix.astyanax.connectionpool.NodeDiscoveryType;
+import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
+import com.netflix.astyanax.connectionpool.impl.ConnectionPoolConfigurationImpl;
+import com.netflix.astyanax.connectionpool.impl.ConnectionPoolType;
+import com.netflix.astyanax.connectionpool.impl.CountingConnectionPoolMonitor;
+import com.netflix.astyanax.impl.AstyanaxConfigurationImpl;
+import com.netflix.astyanax.thrift.ThriftFamilyFactory;
 import org.apache.archiva.configuration.ArchivaConfiguration;
 import org.apache.archiva.metadata.model.MetadataFacetFactory;
 import org.apache.archiva.metadata.repository.MetadataRepository;
@@ -33,10 +43,8 @@ import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 import javax.inject.Named;
 import javax.persistence.EntityManager;
-import javax.persistence.Persistence;
 import java.util.HashMap;
 import java.util.Map;
-import java.util.Properties;
 
 /**
  * @author Olivier Lamy
@@ -63,6 +71,7 @@ public class CassandraRepositorySessionF
 
     private EntityManager entityManager;
 
+
     @PostConstruct
     public void initialize()
     {
@@ -78,15 +87,18 @@ public class CassandraRepositorySessionF
         {
             metadataFacetFactories.put( StringUtils.substringAfterLast( entry.getKey(), "#" ), entry.getValue() );
         }
+
+
     }
 
 
     @Override
     public RepositorySession createSession()
     {
-        MetadataRepository metadataRepository =
-            new CassandraMetadataRepository( metadataFacetFactories, configuration, entityManager );
-
+        CassandraMetadataRepository metadataRepository =
+            new CassandraMetadataRepository( metadataFacetFactories, configuration, entityManager,
+                                             archivaEntityManagerFactory.getKeyspace() );
         return new RepositorySession( metadataRepository, metadataResolver );
     }
+
 }

Modified: archiva/sandbox/trunk/metadata-store-cassandra/src/main/java/org/apache/archiva/metadata/repository/jpa/DefaultArchivaEntityManagerFactory.java
URL: http://svn.apache.org/viewvc/archiva/sandbox/trunk/metadata-store-cassandra/src/main/java/org/apache/archiva/metadata/repository/jpa/DefaultArchivaEntityManagerFactory.java?rev=1483314&r1=1483313&r2=1483314&view=diff
==============================================================================
--- archiva/sandbox/trunk/metadata-store-cassandra/src/main/java/org/apache/archiva/metadata/repository/jpa/DefaultArchivaEntityManagerFactory.java (original)
+++ archiva/sandbox/trunk/metadata-store-cassandra/src/main/java/org/apache/archiva/metadata/repository/jpa/DefaultArchivaEntityManagerFactory.java Thu May 16 12:12:21 2013
@@ -19,6 +19,16 @@ package org.apache.archiva.metadata.repo
  * under the License.
  */
 
+import com.google.common.collect.ImmutableMap;
+import com.netflix.astyanax.AstyanaxContext;
+import com.netflix.astyanax.Keyspace;
+import com.netflix.astyanax.connectionpool.NodeDiscoveryType;
+import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
+import com.netflix.astyanax.connectionpool.impl.ConnectionPoolConfigurationImpl;
+import com.netflix.astyanax.connectionpool.impl.ConnectionPoolType;
+import com.netflix.astyanax.connectionpool.impl.CountingConnectionPoolMonitor;
+import com.netflix.astyanax.impl.AstyanaxConfigurationImpl;
+import com.netflix.astyanax.thrift.ThriftFamilyFactory;
 import org.springframework.context.ApplicationContext;
 import org.springframework.stereotype.Service;
 
@@ -41,10 +51,43 @@ public class DefaultArchivaEntityManager
 
     private EntityManager entityManager;
 
+    private static final String CLUSTER_NAME = "archiva";
+
+    private static final String KEYSPACE_NAME = "ArchivaKeySpace";
+
+    private Keyspace keyspace;
+
+    private AstyanaxContext<Keyspace> keyspaceContext;
+
+
     @PostConstruct
     public void initialize()
+        throws ConnectionException
     {
-        entityManager = Persistence.createEntityManagerFactory( "archiva", new Properties() ).createEntityManager();
+
+        //entityManager = Persistence.createEntityManagerFactory( "archiva", new Properties() ).createEntityManager();
+
+        keyspaceContext = new AstyanaxContext.Builder().forCluster( CLUSTER_NAME ).forKeyspace(
+            KEYSPACE_NAME ).withAstyanaxConfiguration(
+            new AstyanaxConfigurationImpl().setDiscoveryType( NodeDiscoveryType.RING_DESCRIBE ).setConnectionPoolType(
+                ConnectionPoolType.TOKEN_AWARE ) ).withConnectionPoolConfiguration(
+            new ConnectionPoolConfigurationImpl( CLUSTER_NAME + "_" + KEYSPACE_NAME ).setSocketTimeout(
+                30000 ).setMaxTimeoutWhenExhausted( 2000 ).setMaxConnsPerHost( 20 ).setInitConnsPerHost( 10 ).setSeeds(
+                "localhost:9160" ) ).withConnectionPoolMonitor( new CountingConnectionPoolMonitor() ).buildKeyspace(
+            ThriftFamilyFactory.getInstance() );
+
+        keyspaceContext.start();
+
+        keyspace = keyspaceContext.getClient();
+
+        ImmutableMap<String, Object> options = ImmutableMap.<String, Object>builder().put( "strategy_options",
+                                                                                           ImmutableMap.<String, Object>builder().put(
+                                                                                               "replication_factor",
+                                                                                               "1" ).build() ).put(
+            "strategy_class", "SimpleStrategy" ).build();
+
+        keyspace.createKeyspace( options );
+
     }
 
     @Override
@@ -52,4 +95,10 @@ public class DefaultArchivaEntityManager
     {
         return entityManager;
     }
+
+    @Override
+    public Keyspace getKeyspace()
+    {
+        return keyspace;
+    }
 }

Modified: archiva/sandbox/trunk/metadata-store-cassandra/src/main/java/org/apache/archiva/metadata/repository/jpa/model/Namespace.java
URL: http://svn.apache.org/viewvc/archiva/sandbox/trunk/metadata-store-cassandra/src/main/java/org/apache/archiva/metadata/repository/jpa/model/Namespace.java?rev=1483314&r1=1483313&r2=1483314&view=diff
==============================================================================
--- archiva/sandbox/trunk/metadata-store-cassandra/src/main/java/org/apache/archiva/metadata/repository/jpa/model/Namespace.java (original)
+++ archiva/sandbox/trunk/metadata-store-cassandra/src/main/java/org/apache/archiva/metadata/repository/jpa/model/Namespace.java Thu May 16 12:12:21 2013
@@ -19,22 +19,13 @@ package org.apache.archiva.metadata.repo
  * under the License.
  */
 
-import com.alvazan.orm.api.base.anno.NoSqlId;
-import com.alvazan.orm.api.base.anno.NoSqlIndexed;
-import com.alvazan.orm.api.base.anno.NoSqlManyToOne;
-
-import javax.persistence.Basic;
 import javax.persistence.CascadeType;
 import javax.persistence.Column;
-import javax.persistence.Embeddable;
-import javax.persistence.Embedded;
 import javax.persistence.Entity;
 import javax.persistence.FetchType;
 import javax.persistence.Id;
 import javax.persistence.JoinColumn;
-import javax.persistence.JoinTable;
 import javax.persistence.ManyToOne;
-import javax.persistence.OneToOne;
 import javax.persistence.Table;
 import java.io.Serializable;
 
@@ -43,7 +34,7 @@ import java.io.Serializable;
  * @author Olivier Lamy
  */
 @Entity
-@Table( name = "namespace", schema = "ArchivaKeySpace@archiva")
+//@Table( name = "namespace", schema = "ArchivaKeySpace@archiva")
 public class Namespace
     implements Serializable
 {
@@ -51,19 +42,19 @@ public class Namespace
     private static final long serialVersionUID = 1L;
 
     @Id
-    @NoSqlId
     @Column(name = "id")
     private String id;
 
     @Column(name = "name")
-    @NoSqlIndexed
     private String name;
 
-    @ManyToOne(cascade = { CascadeType.ALL }, fetch = FetchType.EAGER)
-    @JoinColumn(name = "repository_id")
-    @NoSqlManyToOne(columnName = "repository_id")
+    @Column(name = "repository")
     private Repository repository;
 
+    //@ManyToOne(cascade = { CascadeType.ALL }, fetch = FetchType.EAGER)
+    //@JoinColumn(name = "repository_id")
+    //private transient Repository repository;
+
 
     public Namespace()
     {
@@ -71,10 +62,11 @@ public class Namespace
     }
 
 
-    public Namespace( String id )
+    public Namespace( String id, Repository repository )
     {
-        this.id = id;
+        this.id = id + "-" + repository.getId();
         this.name = id;
+        this.repository = repository;
     }
 
     public String getId()
@@ -97,7 +89,6 @@ public class Namespace
         this.name = name;
     }
 
-
     public Repository getRepository()
     {
         return repository;
@@ -108,6 +99,17 @@ public class Namespace
         this.repository = repository;
     }
 
+    /*
+    public String getRepositoryId()
+    {
+        return repositoryId;
+    }
+
+    public void setRepositoryId( String repositoryId )
+    {
+        this.repositoryId = repositoryId;
+    }*/
+
     @Override
     public boolean equals( Object o )
     {
@@ -126,6 +128,10 @@ public class Namespace
         {
             return false;
         }
+        if ( !repository.getId().equals( namespace.repository.getId() ) )
+        {
+            return false;
+        }
 
         return true;
     }
@@ -133,7 +139,9 @@ public class Namespace
     @Override
     public int hashCode()
     {
-        return id.hashCode();
+        int result = id.hashCode();
+        result = 31 * result + repository.getId().hashCode();
+        return result;
     }
 
     @Override
@@ -142,7 +150,8 @@ public class Namespace
         final StringBuilder sb = new StringBuilder( "Namespace{" );
         sb.append( "id='" ).append( id ).append( '\'' );
         sb.append( ", name='" ).append( name ).append( '\'' );
-        sb.append( ", repository=" ).append( repository );
+        sb.append( ", repository='" ).append( repository ).append( '\'' );
+        //sb.append( ", repository=" ).append( repository );
         sb.append( '}' );
         return sb.toString();
     }

Modified: archiva/sandbox/trunk/metadata-store-cassandra/src/main/java/org/apache/archiva/metadata/repository/jpa/model/Repository.java
URL: http://svn.apache.org/viewvc/archiva/sandbox/trunk/metadata-store-cassandra/src/main/java/org/apache/archiva/metadata/repository/jpa/model/Repository.java?rev=1483314&r1=1483313&r2=1483314&view=diff
==============================================================================
--- archiva/sandbox/trunk/metadata-store-cassandra/src/main/java/org/apache/archiva/metadata/repository/jpa/model/Repository.java (original)
+++ archiva/sandbox/trunk/metadata-store-cassandra/src/main/java/org/apache/archiva/metadata/repository/jpa/model/Repository.java Thu May 16 12:12:21 2013
@@ -19,20 +19,10 @@ package org.apache.archiva.metadata.repo
  * under the License.
  */
 
-import com.alvazan.orm.api.base.anno.NoSqlId;
-import com.alvazan.orm.api.base.anno.NoSqlIndexed;
-import com.alvazan.orm.api.base.anno.NoSqlOneToMany;
-
-import javax.persistence.CascadeType;
 import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
 import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.JoinTable;
-import javax.persistence.ManyToMany;
 import javax.persistence.OneToMany;
 import javax.persistence.Table;
 import java.io.Serializable;
@@ -52,17 +42,13 @@ public class Repository
     private static final long serialVersionUID = 1L;
 
     @Id
-    @NoSqlId
     @Column( name = "id" )
     private String id;
 
     @Column(name = "name")
-    @NoSqlIndexed
     private String name;
 
-    @OneToMany( fetch = FetchType.EAGER, mappedBy = "namespace")
-    @NoSqlOneToMany(columnName = "repository_id")
-    private List<Namespace> namespaces = new ArrayList<Namespace>();
+    private transient List<Namespace> namespaces = new ArrayList<Namespace>();
 
     public Repository()
     {
@@ -145,7 +131,7 @@ public class Repository
         final StringBuilder sb = new StringBuilder( "Repository{" );
         sb.append( "id='" ).append( id ).append( '\'' );
         sb.append( ", name='" ).append( name ).append( '\'' );
-        //sb.append( ", namespaces=" ).append( namespaces );
+        sb.append( ", namespaces=" ).append( namespaces );
         sb.append( '}' );
         return sb.toString();
     }

Modified: archiva/sandbox/trunk/metadata-store-cassandra/src/test/java/org/apache/archiva/metadata/repository/jpa/RepositoriesNamespaceTest.java
URL: http://svn.apache.org/viewvc/archiva/sandbox/trunk/metadata-store-cassandra/src/test/java/org/apache/archiva/metadata/repository/jpa/RepositoriesNamespaceTest.java?rev=1483314&r1=1483313&r2=1483314&view=diff
==============================================================================
--- archiva/sandbox/trunk/metadata-store-cassandra/src/test/java/org/apache/archiva/metadata/repository/jpa/RepositoriesNamespaceTest.java (original)
+++ archiva/sandbox/trunk/metadata-store-cassandra/src/test/java/org/apache/archiva/metadata/repository/jpa/RepositoriesNamespaceTest.java Thu May 16 12:12:21 2013
@@ -22,11 +22,9 @@ package org.apache.archiva.metadata.repo
 import org.apache.archiva.metadata.repository.jpa.model.Namespace;
 import org.apache.archiva.metadata.repository.jpa.model.Repository;
 import org.apache.archiva.test.utils.ArchivaSpringJUnit4ClassRunner;
-import org.apache.cassandra.dht.BootStrapper;
 import org.fest.assertions.api.Assertions;
 import org.junit.After;
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.slf4j.Logger;
@@ -35,10 +33,6 @@ import org.springframework.test.context.
 
 import javax.inject.Inject;
 import javax.inject.Named;
-import javax.persistence.EntityManager;
-import javax.persistence.Query;
-import javax.persistence.TypedQuery;
-import java.util.List;
 
 /**
  * @author Olivier Lamy
@@ -58,7 +52,6 @@ public class RepositoriesNamespaceTest
     @Named( value = "archivaEntityManagerFactory#jpa-archiva" )
     ArchivaEntityManagerFactory archivaEntityManagerFactory;
 
-    EntityManager em;
 
     CassandraMetadataRepository cmr;
 
@@ -66,8 +59,9 @@ public class RepositoriesNamespaceTest
     public void setup()
         throws Exception
     {
-        em = archivaEntityManagerFactory.getEntityManager();
-        cmr = new CassandraMetadataRepository( null, null, em );
+
+        cmr = new CassandraMetadataRepository( null, null, null, archivaEntityManagerFactory.getKeyspace() );
+
     }
 
     @After
@@ -83,7 +77,7 @@ public class RepositoriesNamespaceTest
     public void testMetadataRepo()
         throws Exception
     {
-        //com.alvazan.orm.api.base.Bootstrap.create( null ).createEntityManager().
+
         Repository r = null;
         Namespace n = null;
 
@@ -92,25 +86,29 @@ public class RepositoriesNamespaceTest
 
             cmr.updateNamespace( "release", "org" );
 
-            r = em.find( Repository.class, "release" );
+            r = cmr.getRepositoryEntityManager().get( "release" );
 
             Assertions.assertThat( r ).isNotNull();
 
-            Assertions.assertThat( cmr.getRepositories()).isNotEmpty().hasSize( 1 );
+            Assertions.assertThat( cmr.getRepositories() ).isNotEmpty().hasSize( 1 );
             Assertions.assertThat( cmr.getNamespaces( "release" ) ).isNotEmpty().hasSize( 1 );
 
-            n = em.find( Namespace.class, "org" );
+            n = cmr.getNamespaceEntityManager().get( "org" + "-" + "release" );
 
             Assertions.assertThat( n ).isNotNull();
             Assertions.assertThat( n.getRepository() ).isNotNull();
 
             cmr.updateNamespace( "release", "org.apache" );
 
-            r = em.find( Repository.class, "release" );
+            r = cmr.getRepositoryEntityManager().get( "release" );
 
             Assertions.assertThat( r ).isNotNull();
             Assertions.assertThat( cmr.getNamespaces( "release" ) ).isNotEmpty().hasSize( 2 );
-
+        }
+        catch ( Exception e )
+        {
+            logger.error( e.getMessage(), e );
+            throw e;
         }
         finally
         {
@@ -121,19 +119,9 @@ public class RepositoriesNamespaceTest
     protected void clearReposAndNamespace()
         throws Exception
     {
-        TypedQuery<Repository> queryR = em.createQuery( "SELECT r FROM Repository r", Repository.class );
-        for ( Repository r : queryR.getResultList() )
+        if ( true )
         {
-            em.remove( r );
+            return;
         }
-
-        TypedQuery<Namespace> query = em.createQuery( "SELECT n FROM Namespace n", Namespace.class );
-        for ( Namespace n : query.getResultList() )
-        {
-            em.remove( n );
-        }
-
-
-        em.clear();
     }
 }