mirror of https://github.com/apache/archiva.git
all tests pass so move out metadata-store-cassandra from sandbox
git-svn-id: https://svn.apache.org/repos/asf/archiva/trunk@1491410 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
db3e35c07c
commit
152cf7cd78
|
@ -0,0 +1,305 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!--
|
||||||
|
~ 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.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<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">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<parent>
|
||||||
|
<artifactId>plugins</artifactId>
|
||||||
|
<groupId>org.apache.archiva</groupId>
|
||||||
|
<version>1.4.0-SNAPSHOT</version>
|
||||||
|
</parent>
|
||||||
|
<artifactId>metadata-store-cassandra</artifactId>
|
||||||
|
<packaging>bundle</packaging>
|
||||||
|
<name>Archiva Core Plugins :: Cassandra JPA Storage for Metadata</name>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<cassandraVersion>1.2.5</cassandraVersion>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>commons-lang</groupId>
|
||||||
|
<artifactId>commons-lang</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.archiva</groupId>
|
||||||
|
<artifactId>metadata-repository-api</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.archiva</groupId>
|
||||||
|
<artifactId>metadata-repository-api</artifactId>
|
||||||
|
<classifier>tests</classifier>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.archiva</groupId>
|
||||||
|
<artifactId>archiva-test-utils</artifactId>
|
||||||
|
<version>${project.version}</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
<exclusions>
|
||||||
|
<exclusion>
|
||||||
|
<groupId>org.slf4j</groupId>
|
||||||
|
<artifactId>slf4j-simple</artifactId>
|
||||||
|
</exclusion>
|
||||||
|
</exclusions>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>net.sf.beanlib</groupId>
|
||||||
|
<artifactId>beanlib</artifactId>
|
||||||
|
<exclusions>
|
||||||
|
<exclusion>
|
||||||
|
<groupId>cglib</groupId>
|
||||||
|
<artifactId>cglib</artifactId>
|
||||||
|
</exclusion>
|
||||||
|
<exclusion>
|
||||||
|
<groupId>aopalliance</groupId>
|
||||||
|
<artifactId>aopalliance</artifactId>
|
||||||
|
</exclusion>
|
||||||
|
<exclusion>
|
||||||
|
<groupId>log4j</groupId>
|
||||||
|
<artifactId>log4j</artifactId>
|
||||||
|
</exclusion>
|
||||||
|
</exclusions>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.geronimo.specs</groupId>
|
||||||
|
<artifactId>geronimo-jpa_2.0_spec</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.netflix.astyanax</groupId>
|
||||||
|
<artifactId>astyanax-entity-mapper</artifactId>
|
||||||
|
<version>1.56.37</version>
|
||||||
|
<exclusions>
|
||||||
|
<exclusion>
|
||||||
|
<groupId>stax</groupId>
|
||||||
|
<artifactId>stax-api</artifactId>
|
||||||
|
</exclusion>
|
||||||
|
<exclusion>
|
||||||
|
<groupId>log4j</groupId>
|
||||||
|
<artifactId>log4j</artifactId>
|
||||||
|
</exclusion>
|
||||||
|
<exclusion>
|
||||||
|
<groupId>org.slf4j</groupId>
|
||||||
|
<artifactId>slf4j-log4j12</artifactId>
|
||||||
|
</exclusion>
|
||||||
|
<exclusion>
|
||||||
|
<groupId>org.apache.cassandra</groupId>
|
||||||
|
<artifactId>cassandra-thrift</artifactId>
|
||||||
|
</exclusion>
|
||||||
|
<exclusion>
|
||||||
|
<groupId>javax.persistence</groupId>
|
||||||
|
<artifactId>persistence-api</artifactId>
|
||||||
|
</exclusion>
|
||||||
|
<exclusion>
|
||||||
|
<groupId>org.jboss.netty</groupId>
|
||||||
|
<artifactId>netty</artifactId>
|
||||||
|
</exclusion>
|
||||||
|
</exclusions>
|
||||||
|
</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>
|
||||||
|
<exclusions>
|
||||||
|
<exclusion>
|
||||||
|
<groupId>org.apache.cassandra</groupId>
|
||||||
|
<artifactId>cassandra-thrift</artifactId>
|
||||||
|
</exclusion>
|
||||||
|
</exclusions>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.cassandra</groupId>
|
||||||
|
<artifactId>cassandra-all</artifactId>
|
||||||
|
<version>${cassandraVersion}</version>
|
||||||
|
<exclusions>
|
||||||
|
<exclusion>
|
||||||
|
<groupId>log4j</groupId>
|
||||||
|
<artifactId>log4j</artifactId>
|
||||||
|
</exclusion>
|
||||||
|
<exclusion>
|
||||||
|
<groupId>org.slf4j</groupId>
|
||||||
|
<artifactId>slf4j-log4j12</artifactId>
|
||||||
|
</exclusion>
|
||||||
|
<exclusion>
|
||||||
|
<groupId>org.mortbay.jetty</groupId>
|
||||||
|
<artifactId>jetty</artifactId>
|
||||||
|
</exclusion>
|
||||||
|
</exclusions>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.logging.log4j</groupId>
|
||||||
|
<artifactId>log4j-jcl</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework</groupId>
|
||||||
|
<artifactId>spring-test</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.easytesting</groupId>
|
||||||
|
<artifactId>fest-assert-core</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.logging.log4j</groupId>
|
||||||
|
<artifactId>log4j-slf4j-impl</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.logging.log4j</groupId>
|
||||||
|
<artifactId>log4j-1.2-api</artifactId>
|
||||||
|
<version>${log4j.version}</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.lmax</groupId>
|
||||||
|
<artifactId>disruptor</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.codehaus.jackson</groupId>
|
||||||
|
<artifactId>jackson-core-asl</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.codehaus.jackson</groupId>
|
||||||
|
<artifactId>jackson-mapper-asl</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
</dependencies>
|
||||||
|
<build>
|
||||||
|
<testResources>
|
||||||
|
<testResource>
|
||||||
|
<directory>src/test/filtered-resources</directory>
|
||||||
|
<filtering>true</filtering>
|
||||||
|
</testResource>
|
||||||
|
</testResources>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.felix</groupId>
|
||||||
|
<artifactId>maven-bundle-plugin</artifactId>
|
||||||
|
<configuration>
|
||||||
|
<instructions>
|
||||||
|
<Bundle-SymbolicName>org.apache.archiva.metadata.repository.cassandra</Bundle-SymbolicName>
|
||||||
|
<Bundle-Version>${project.version}</Bundle-Version>
|
||||||
|
<Export-Package>
|
||||||
|
org.apache.archiva.metadata.repository.cassandra;version=${project.version};-split-package:=merge-first
|
||||||
|
</Export-Package>
|
||||||
|
<Import-Package>
|
||||||
|
|
||||||
|
</Import-Package>
|
||||||
|
</instructions>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.codehaus.mojo</groupId>
|
||||||
|
<artifactId>build-helper-maven-plugin</artifactId>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>reserve-ports</id>
|
||||||
|
<phase>process-test-resources</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>reserve-network-port</goal>
|
||||||
|
</goals>
|
||||||
|
<configuration>
|
||||||
|
<portNames>
|
||||||
|
<portName>cassandraPort</portName>
|
||||||
|
</portNames>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
<!-- TODO use dynamic port -->
|
||||||
|
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.codehaus.mojo</groupId>
|
||||||
|
<artifactId>cassandra-maven-plugin</artifactId>
|
||||||
|
<version>1.2.1-1</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>start-cassandra</id>
|
||||||
|
<phase>test-compile</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>start</goal>
|
||||||
|
</goals>
|
||||||
|
<configuration>
|
||||||
|
<rpcPort>${cassandraPort}</rpcPort>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
|
<execution>
|
||||||
|
<id>stop-cassandra</id>
|
||||||
|
<phase>test</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>stop</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.cassandra</groupId>
|
||||||
|
<artifactId>cassandra-all</artifactId>
|
||||||
|
<version>${cassandraVersion}</version>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
<pluginManagement>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-surefire-plugin</artifactId>
|
||||||
|
<configuration>
|
||||||
|
<systemPropertyVariables>
|
||||||
|
<cassandraPort>${cassandraPort}</cassandraPort>
|
||||||
|
</systemPropertyVariables>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</pluginManagement>
|
||||||
|
</build>
|
||||||
|
|
||||||
|
<repositories>
|
||||||
|
<repository>
|
||||||
|
<id>archiva.snapshots</id>
|
||||||
|
<url>https://archiva-repository.apache.org/archiva/repository/snapshots/</url>
|
||||||
|
<releases>
|
||||||
|
<enabled>false</enabled>
|
||||||
|
</releases>
|
||||||
|
<snapshots>
|
||||||
|
<enabled>true</enabled>
|
||||||
|
</snapshots>
|
||||||
|
</repository>
|
||||||
|
</repositories>
|
||||||
|
|
||||||
|
</project>
|
|
@ -0,0 +1,31 @@
|
||||||
|
package org.apache.archiva.metadata.repository.cassandra;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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 com.netflix.astyanax.Keyspace;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Olivier Lamy
|
||||||
|
*/
|
||||||
|
public interface CassandraEntityManagerFactory
|
||||||
|
{
|
||||||
|
Keyspace getKeyspace();
|
||||||
|
|
||||||
|
}
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,87 @@
|
||||||
|
package org.apache.archiva.metadata.repository.cassandra;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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.configuration.ArchivaConfiguration;
|
||||||
|
import org.apache.archiva.metadata.model.MetadataFacetFactory;
|
||||||
|
import org.apache.archiva.metadata.repository.MetadataResolver;
|
||||||
|
import org.apache.archiva.metadata.repository.RepositorySession;
|
||||||
|
import org.apache.archiva.metadata.repository.RepositorySessionFactory;
|
||||||
|
import org.apache.commons.lang.StringUtils;
|
||||||
|
import org.springframework.context.ApplicationContext;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import javax.annotation.PostConstruct;
|
||||||
|
import javax.inject.Inject;
|
||||||
|
import javax.inject.Named;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Olivier Lamy
|
||||||
|
*/
|
||||||
|
@Service( "repositorySessionFactory#cassandra" )
|
||||||
|
public class CassandraRepositorySessionFactory
|
||||||
|
implements RepositorySessionFactory
|
||||||
|
{
|
||||||
|
|
||||||
|
private Map<String, MetadataFacetFactory> metadataFacetFactories;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
@Named( value = "archivaConfiguration#default" )
|
||||||
|
private ArchivaConfiguration configuration;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private MetadataResolver metadataResolver;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private ApplicationContext applicationContext;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private CassandraEntityManagerFactory cassandraEntityManagerFactory;
|
||||||
|
|
||||||
|
@PostConstruct
|
||||||
|
public void initialize()
|
||||||
|
{
|
||||||
|
Map<String, MetadataFacetFactory> tmpMetadataFacetFactories =
|
||||||
|
applicationContext.getBeansOfType( MetadataFacetFactory.class );
|
||||||
|
// olamy with spring the "id" is now "metadataFacetFactory#hint"
|
||||||
|
// whereas was only hint with plexus so let remove metadataFacetFactory#
|
||||||
|
metadataFacetFactories = new HashMap<String, MetadataFacetFactory>( tmpMetadataFacetFactories.size() );
|
||||||
|
|
||||||
|
for ( Map.Entry<String, MetadataFacetFactory> entry : tmpMetadataFacetFactories.entrySet() )
|
||||||
|
{
|
||||||
|
metadataFacetFactories.put( StringUtils.substringAfterLast( entry.getKey(), "#" ), entry.getValue() );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public RepositorySession createSession()
|
||||||
|
{
|
||||||
|
CassandraMetadataRepository metadataRepository =
|
||||||
|
new CassandraMetadataRepository( metadataFacetFactories, configuration,
|
||||||
|
cassandraEntityManagerFactory.getKeyspace() );
|
||||||
|
return new RepositorySession( metadataRepository, metadataResolver );
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,95 @@
|
||||||
|
package org.apache.archiva.metadata.repository.cassandra;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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 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;
|
||||||
|
|
||||||
|
import javax.annotation.PostConstruct;
|
||||||
|
import javax.inject.Inject;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* FIXME make all configuration not hardcoded :-)
|
||||||
|
*
|
||||||
|
* @author Olivier Lamy
|
||||||
|
*/
|
||||||
|
@Service("archivaEntityManagerFactory#cassandra")
|
||||||
|
public class DefaultCassandraEntityManagerFactory
|
||||||
|
implements CassandraEntityManagerFactory
|
||||||
|
{
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private ApplicationContext applicationContext;
|
||||||
|
|
||||||
|
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
|
||||||
|
{
|
||||||
|
String cassandraHost = System.getProperty( "cassandraHost", "localhost" );
|
||||||
|
String cassandraPort = System.getProperty( "cassandraPort" );
|
||||||
|
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(
|
||||||
|
cassandraHost + ":" + cassandraPort ) ).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
|
||||||
|
public Keyspace getKeyspace()
|
||||||
|
{
|
||||||
|
return keyspace;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,331 @@
|
||||||
|
package org.apache.archiva.metadata.repository.cassandra.model;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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 javax.persistence.Column;
|
||||||
|
import javax.persistence.Entity;
|
||||||
|
import javax.persistence.Id;
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Cassandra storage model for {@link org.apache.archiva.metadata.model.ArtifactMetadata}
|
||||||
|
*
|
||||||
|
* @author Olivier Lamy
|
||||||
|
*/
|
||||||
|
@Entity
|
||||||
|
public class ArtifactMetadataModel
|
||||||
|
implements Serializable
|
||||||
|
{
|
||||||
|
|
||||||
|
// repositoryId + namespaceId + project + projectVersion + id
|
||||||
|
@Id
|
||||||
|
private String artifactMetadataModelId;
|
||||||
|
|
||||||
|
@Column(name = "id")
|
||||||
|
private String id;
|
||||||
|
|
||||||
|
@Column(name = "repositoryId")
|
||||||
|
private String repositoryId;
|
||||||
|
|
||||||
|
@Column(name = "namespace")
|
||||||
|
private String namespace;
|
||||||
|
|
||||||
|
@Column(name = "project")
|
||||||
|
private String project;
|
||||||
|
|
||||||
|
@Column(name = "projectVersion")
|
||||||
|
private String projectVersion;
|
||||||
|
|
||||||
|
@Column(name = "version")
|
||||||
|
private String version;
|
||||||
|
|
||||||
|
@Column(name = "fileLastModified")
|
||||||
|
private long fileLastModified;
|
||||||
|
|
||||||
|
@Column(name = "size")
|
||||||
|
private long size;
|
||||||
|
|
||||||
|
@Column(name = "md5")
|
||||||
|
private String md5;
|
||||||
|
|
||||||
|
@Column(name = "sha1")
|
||||||
|
private String sha1;
|
||||||
|
|
||||||
|
@Column(name = "whenGathered")
|
||||||
|
private long whenGathered;
|
||||||
|
|
||||||
|
public ArtifactMetadataModel()
|
||||||
|
{
|
||||||
|
// no op
|
||||||
|
}
|
||||||
|
|
||||||
|
public ArtifactMetadataModel( String artifactMetadataModelId, String id, String repositoryId, String namespace,
|
||||||
|
String project, String projectVersion, String version, Date fileLastModified,
|
||||||
|
long size, String md5, String sha1, Date whenGathered )
|
||||||
|
{
|
||||||
|
this.artifactMetadataModelId = artifactMetadataModelId;
|
||||||
|
this.id = id;
|
||||||
|
this.repositoryId = repositoryId;
|
||||||
|
this.namespace = namespace;
|
||||||
|
this.project = project;
|
||||||
|
this.projectVersion = projectVersion;
|
||||||
|
this.version = version;
|
||||||
|
this.fileLastModified = ( fileLastModified != null ? fileLastModified.getTime() : 0 );
|
||||||
|
this.size = size;
|
||||||
|
this.md5 = md5;
|
||||||
|
this.sha1 = sha1;
|
||||||
|
this.whenGathered = whenGathered != null ? whenGathered.getTime() : new Date().getTime();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getArtifactMetadataModelId()
|
||||||
|
{
|
||||||
|
return artifactMetadataModelId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setArtifactMetadataModelId( String artifactMetadataModelId )
|
||||||
|
{
|
||||||
|
this.artifactMetadataModelId = artifactMetadataModelId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getId()
|
||||||
|
{
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId( String id )
|
||||||
|
{
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getRepositoryId()
|
||||||
|
{
|
||||||
|
return repositoryId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRepositoryId( String repositoryId )
|
||||||
|
{
|
||||||
|
this.repositoryId = repositoryId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getNamespace()
|
||||||
|
{
|
||||||
|
return namespace;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setNamespace( String namespace )
|
||||||
|
{
|
||||||
|
this.namespace = namespace;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getProject()
|
||||||
|
{
|
||||||
|
return project;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setProject( String project )
|
||||||
|
{
|
||||||
|
this.project = project;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getProjectVersion()
|
||||||
|
{
|
||||||
|
return projectVersion;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setProjectVersion( String projectVersion )
|
||||||
|
{
|
||||||
|
this.projectVersion = projectVersion;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getVersion()
|
||||||
|
{
|
||||||
|
return version;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setVersion( String version )
|
||||||
|
{
|
||||||
|
this.version = version;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getFileLastModified()
|
||||||
|
{
|
||||||
|
return fileLastModified;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFileLastModified( long fileLastModified )
|
||||||
|
{
|
||||||
|
this.fileLastModified = fileLastModified;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getSize()
|
||||||
|
{
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSize( long size )
|
||||||
|
{
|
||||||
|
this.size = size;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getMd5()
|
||||||
|
{
|
||||||
|
return md5;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMd5( String md5 )
|
||||||
|
{
|
||||||
|
this.md5 = md5;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSha1()
|
||||||
|
{
|
||||||
|
return sha1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSha1( String sha1 )
|
||||||
|
{
|
||||||
|
this.sha1 = sha1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Date getWhenGathered()
|
||||||
|
{
|
||||||
|
return new Date( whenGathered );
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setWhenGathered( long whenGathered )
|
||||||
|
{
|
||||||
|
this.whenGathered = whenGathered;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals( Object o )
|
||||||
|
{
|
||||||
|
if ( this == o )
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if ( o == null || getClass() != o.getClass() )
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
ArtifactMetadataModel that = (ArtifactMetadataModel) o;
|
||||||
|
|
||||||
|
if ( !artifactMetadataModelId.equals( that.artifactMetadataModelId ) )
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode()
|
||||||
|
{
|
||||||
|
return artifactMetadataModelId.hashCode();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString()
|
||||||
|
{
|
||||||
|
final StringBuilder sb = new StringBuilder( "ArtifactMetadataModel{" );
|
||||||
|
sb.append( "artifactMetadataModelId='" ).append( artifactMetadataModelId ).append( '\'' );
|
||||||
|
sb.append( ", id='" ).append( id ).append( '\'' );
|
||||||
|
sb.append( ", repositoryId='" ).append( repositoryId ).append( '\'' );
|
||||||
|
sb.append( ", namespace='" ).append( namespace ).append( '\'' );
|
||||||
|
sb.append( ", project='" ).append( project ).append( '\'' );
|
||||||
|
sb.append( ", projectVersion='" ).append( projectVersion ).append( '\'' );
|
||||||
|
sb.append( ", version='" ).append( version ).append( '\'' );
|
||||||
|
sb.append( ", fileLastModified=" ).append( fileLastModified );
|
||||||
|
sb.append( ", size=" ).append( size );
|
||||||
|
sb.append( ", md5='" ).append( md5 ).append( '\'' );
|
||||||
|
sb.append( ", sha1='" ).append( sha1 ).append( '\'' );
|
||||||
|
sb.append( ", whenGathered=" ).append( whenGathered );
|
||||||
|
sb.append( '}' );
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class KeyBuilder
|
||||||
|
{
|
||||||
|
|
||||||
|
private String project;
|
||||||
|
|
||||||
|
private String id;
|
||||||
|
|
||||||
|
private String namespaceId;
|
||||||
|
|
||||||
|
private String repositoryId;
|
||||||
|
|
||||||
|
private String projectVersion;
|
||||||
|
|
||||||
|
public KeyBuilder()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public KeyBuilder withId( String id )
|
||||||
|
{
|
||||||
|
this.id = id;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public KeyBuilder withNamespace( Namespace namespace )
|
||||||
|
{
|
||||||
|
this.namespaceId = namespace.getName();
|
||||||
|
this.repositoryId = namespace.getRepository().getId();
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public KeyBuilder withNamespace( String namespaceId )
|
||||||
|
{
|
||||||
|
this.namespaceId = namespaceId;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public KeyBuilder withProject( String project )
|
||||||
|
{
|
||||||
|
this.project = project;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public KeyBuilder withProjectVersion( String projectVersion )
|
||||||
|
{
|
||||||
|
this.projectVersion = projectVersion;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public KeyBuilder withRepositoryId( String repositoryId )
|
||||||
|
{
|
||||||
|
this.repositoryId = repositoryId;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String build()
|
||||||
|
{
|
||||||
|
//repositoryId + namespaceId + project + projectVersion + id
|
||||||
|
// FIXME add some controls
|
||||||
|
return this.repositoryId + "-" + this.namespaceId + "-" + this.project + "-" + this.projectVersion + "-"
|
||||||
|
+ this.id;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,229 @@
|
||||||
|
package org.apache.archiva.metadata.repository.cassandra.model;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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 javax.persistence.Column;
|
||||||
|
import javax.persistence.Entity;
|
||||||
|
import javax.persistence.Id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Cassandra storage model for {@link org.apache.archiva.metadata.model.MetadataFacet}
|
||||||
|
*
|
||||||
|
* @author Olivier Lamy
|
||||||
|
*/
|
||||||
|
@Entity
|
||||||
|
public class MetadataFacetModel
|
||||||
|
{
|
||||||
|
// id is repositoryId + namespaceId + projectId + facetId + name + mapKey
|
||||||
|
@Id
|
||||||
|
@Column( name = "id" )
|
||||||
|
private String id;
|
||||||
|
|
||||||
|
@Column( name = "artifactMetadataModel" )
|
||||||
|
private ArtifactMetadataModel artifactMetadataModel;
|
||||||
|
|
||||||
|
@Column( name = "facetId" )
|
||||||
|
private String facetId;
|
||||||
|
|
||||||
|
@Column( name = "name" )
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
@Column( name = "key" )
|
||||||
|
private String key;
|
||||||
|
|
||||||
|
@Column( name = "value" )
|
||||||
|
private String value;
|
||||||
|
|
||||||
|
public MetadataFacetModel()
|
||||||
|
{
|
||||||
|
// no op
|
||||||
|
}
|
||||||
|
|
||||||
|
public MetadataFacetModel( String id, ArtifactMetadataModel artifactMetadataModel, String facetId, String key,
|
||||||
|
String value, String name )
|
||||||
|
{
|
||||||
|
this.id = id;
|
||||||
|
this.artifactMetadataModel = artifactMetadataModel;
|
||||||
|
this.key = key;
|
||||||
|
this.value = value;
|
||||||
|
this.name = name;
|
||||||
|
this.facetId = facetId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getFacetId()
|
||||||
|
{
|
||||||
|
return facetId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFacetId( String facetId )
|
||||||
|
{
|
||||||
|
this.facetId = facetId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getId()
|
||||||
|
{
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId( String id )
|
||||||
|
{
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ArtifactMetadataModel getArtifactMetadataModel()
|
||||||
|
{
|
||||||
|
return artifactMetadataModel;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setArtifactMetadataModel( ArtifactMetadataModel artifactMetadataModel )
|
||||||
|
{
|
||||||
|
this.artifactMetadataModel = artifactMetadataModel;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName()
|
||||||
|
{
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName( String name )
|
||||||
|
{
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getKey()
|
||||||
|
{
|
||||||
|
return key;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setKey( String key )
|
||||||
|
{
|
||||||
|
this.key = key;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getValue()
|
||||||
|
{
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setValue( String value )
|
||||||
|
{
|
||||||
|
this.value = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals( Object o )
|
||||||
|
{
|
||||||
|
if ( this == o )
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if ( o == null || getClass() != o.getClass() )
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
MetadataFacetModel that = (MetadataFacetModel) o;
|
||||||
|
|
||||||
|
if ( !id.equals( that.id ) )
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode()
|
||||||
|
{
|
||||||
|
return id.hashCode();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString()
|
||||||
|
{
|
||||||
|
final StringBuilder sb = new StringBuilder( "MetadataFacetModel{" );
|
||||||
|
sb.append( "id='" ).append( id ).append( '\'' );
|
||||||
|
sb.append( ", artifactMetadataModel=" ).append( artifactMetadataModel );
|
||||||
|
sb.append( ", key='" ).append( key ).append( '\'' );
|
||||||
|
sb.append( ", value='" ).append( value ).append( '\'' );
|
||||||
|
sb.append( '}' );
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class KeyBuilder
|
||||||
|
{
|
||||||
|
|
||||||
|
private ArtifactMetadataModel artifactMetadataModel;
|
||||||
|
|
||||||
|
private String key;
|
||||||
|
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
private String facetId;
|
||||||
|
|
||||||
|
private String repositoryId;
|
||||||
|
|
||||||
|
public KeyBuilder()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public KeyBuilder withArtifactMetadataModel( ArtifactMetadataModel artifactMetadataModel )
|
||||||
|
{
|
||||||
|
this.artifactMetadataModel = artifactMetadataModel;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public KeyBuilder withKey( String key )
|
||||||
|
{
|
||||||
|
this.key = key;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public KeyBuilder withName( String name )
|
||||||
|
{
|
||||||
|
this.name = name;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public KeyBuilder withFacetId( String facetId )
|
||||||
|
{
|
||||||
|
this.facetId = facetId;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public KeyBuilder withRepositoryId( String repositoryId )
|
||||||
|
{
|
||||||
|
this.repositoryId = repositoryId;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String build()
|
||||||
|
{
|
||||||
|
// FIXME add some controls
|
||||||
|
// getArtifactMetadataModelId can have no namespace, no project and no projectid for statistics
|
||||||
|
// only repositoryId with artifactMetadataModel
|
||||||
|
return ( this.artifactMetadataModel == null
|
||||||
|
? this.repositoryId
|
||||||
|
: this.artifactMetadataModel.getArtifactMetadataModelId() ) + "-" + this.facetId + "-" + this.name + "-"
|
||||||
|
+ this.key;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,190 @@
|
||||||
|
package org.apache.archiva.metadata.repository.cassandra.model;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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 javax.persistence.Column;
|
||||||
|
import javax.persistence.Entity;
|
||||||
|
import javax.persistence.Id;
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Olivier Lamy
|
||||||
|
*/
|
||||||
|
@Entity
|
||||||
|
//@Table( name = "namespace", schema = "ArchivaKeySpace@archiva")
|
||||||
|
public class Namespace
|
||||||
|
implements Serializable
|
||||||
|
{
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
@Id
|
||||||
|
@Column(name = "id")
|
||||||
|
private String id;
|
||||||
|
|
||||||
|
@Column(name = "name")
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
@Column(name = "repository")
|
||||||
|
private Repository repository;
|
||||||
|
|
||||||
|
//@ManyToOne(cascade = { CascadeType.ALL }, fetch = FetchType.EAGER)
|
||||||
|
//@JoinColumn(name = "repository_id")
|
||||||
|
//private transient Repository repository;
|
||||||
|
|
||||||
|
|
||||||
|
public Namespace()
|
||||||
|
{
|
||||||
|
// no op
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public Namespace( String id, Repository repository )
|
||||||
|
{
|
||||||
|
this.id = new KeyBuilder().withNamespace( id ).withRepositoryId( repository.getId() ).build();
|
||||||
|
this.name = id;
|
||||||
|
this.repository = repository;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getId()
|
||||||
|
{
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId( String id )
|
||||||
|
{
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName()
|
||||||
|
{
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName( String name )
|
||||||
|
{
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Repository getRepository()
|
||||||
|
{
|
||||||
|
return repository;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRepository( Repository repository )
|
||||||
|
{
|
||||||
|
this.repository = repository;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
public String getRepositoryId()
|
||||||
|
{
|
||||||
|
return repositoryId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRepositoryId( String repositoryId )
|
||||||
|
{
|
||||||
|
this.repositoryId = repositoryId;
|
||||||
|
}*/
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals( Object o )
|
||||||
|
{
|
||||||
|
if ( this == o )
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if ( o == null || getClass() != o.getClass() )
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
Namespace namespace = (Namespace) o;
|
||||||
|
|
||||||
|
if ( !id.equals( namespace.id ) )
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if ( !repository.getId().equals( namespace.repository.getId() ) )
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode()
|
||||||
|
{
|
||||||
|
int result = id.hashCode();
|
||||||
|
result = 31 * result + repository.getId().hashCode();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString()
|
||||||
|
{
|
||||||
|
final StringBuilder sb = new StringBuilder( "Namespace{" );
|
||||||
|
sb.append( "id='" ).append( id ).append( '\'' );
|
||||||
|
sb.append( ", name='" ).append( name ).append( '\'' );
|
||||||
|
sb.append( ", repository='" ).append( repository ).append( '\'' );
|
||||||
|
sb.append( '}' );
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class KeyBuilder
|
||||||
|
{
|
||||||
|
|
||||||
|
private String namespace;
|
||||||
|
|
||||||
|
private String repositoryId;
|
||||||
|
|
||||||
|
public KeyBuilder()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public KeyBuilder withNamespace( Namespace namespace )
|
||||||
|
{
|
||||||
|
this.namespace = namespace.getName();
|
||||||
|
this.repositoryId = namespace.getRepository().getId();
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public KeyBuilder withNamespace( String namespace )
|
||||||
|
{
|
||||||
|
this.namespace = namespace;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public KeyBuilder withRepositoryId( String repositoryId )
|
||||||
|
{
|
||||||
|
this.repositoryId = repositoryId;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String build()
|
||||||
|
{
|
||||||
|
// FIXME add some controls
|
||||||
|
return this.repositoryId + "-" + this.namespace;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,163 @@
|
||||||
|
package org.apache.archiva.metadata.repository.cassandra.model;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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 javax.persistence.Column;
|
||||||
|
import javax.persistence.Entity;
|
||||||
|
import javax.persistence.Id;
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Olivier Lamy
|
||||||
|
*/
|
||||||
|
@Entity
|
||||||
|
public class Project
|
||||||
|
implements Serializable
|
||||||
|
{
|
||||||
|
@Id
|
||||||
|
@Column( name = "projectKey" )
|
||||||
|
private String projectKey;
|
||||||
|
|
||||||
|
@Column( name = "projectId" )
|
||||||
|
private String projectId;
|
||||||
|
|
||||||
|
|
||||||
|
@Column( name = "repository" )
|
||||||
|
private Namespace namespace;
|
||||||
|
|
||||||
|
public Project()
|
||||||
|
{
|
||||||
|
// no op
|
||||||
|
}
|
||||||
|
|
||||||
|
public Project( String projectKey, String projectId, Namespace namespace )
|
||||||
|
{
|
||||||
|
this.projectId = projectId;
|
||||||
|
this.projectKey = projectKey;
|
||||||
|
this.namespace = namespace;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getProjectKey()
|
||||||
|
{
|
||||||
|
return projectKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setProjectKey( String projectKey )
|
||||||
|
{
|
||||||
|
this.projectKey = projectKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Namespace getNamespace()
|
||||||
|
{
|
||||||
|
return namespace;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setNamespace( Namespace namespace )
|
||||||
|
{
|
||||||
|
this.namespace = namespace;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getProjectId()
|
||||||
|
{
|
||||||
|
return projectId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setProjectId( String projectId )
|
||||||
|
{
|
||||||
|
this.projectId = projectId;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals( Object o )
|
||||||
|
{
|
||||||
|
if ( this == o )
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if ( o == null || getClass() != o.getClass() )
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
Project project = (Project) o;
|
||||||
|
|
||||||
|
if ( !projectKey.equals( project.projectKey ) )
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if ( !namespace.equals( project.namespace ) )
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode()
|
||||||
|
{
|
||||||
|
int result = projectKey.hashCode();
|
||||||
|
result = 31 * result + namespace.hashCode();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString()
|
||||||
|
{
|
||||||
|
final StringBuilder sb = new StringBuilder( "Project{" );
|
||||||
|
sb.append( "projectKey='" ).append( projectKey ).append( '\'' );
|
||||||
|
sb.append( ", projectId='" ).append( projectId ).append( '\'' );
|
||||||
|
sb.append( ", namespace=" ).append( namespace );
|
||||||
|
sb.append( '}' );
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class KeyBuilder
|
||||||
|
{
|
||||||
|
|
||||||
|
private Namespace namespace;
|
||||||
|
|
||||||
|
private String projectId;
|
||||||
|
|
||||||
|
public KeyBuilder()
|
||||||
|
{
|
||||||
|
// no op
|
||||||
|
}
|
||||||
|
|
||||||
|
public KeyBuilder withNamespace( Namespace namespace )
|
||||||
|
{
|
||||||
|
this.namespace = namespace;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public KeyBuilder withProjectId( String projectId )
|
||||||
|
{
|
||||||
|
this.projectId = projectId;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public String build()
|
||||||
|
{
|
||||||
|
// FIXME add some controls
|
||||||
|
return new Namespace.KeyBuilder().withNamespace( this.namespace ).build() + "-" + this.projectId;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,354 @@
|
||||||
|
package org.apache.archiva.metadata.repository.cassandra.model;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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.metadata.model.CiManagement;
|
||||||
|
import org.apache.archiva.metadata.model.Dependency;
|
||||||
|
import org.apache.archiva.metadata.model.IssueManagement;
|
||||||
|
import org.apache.archiva.metadata.model.License;
|
||||||
|
import org.apache.archiva.metadata.model.MailingList;
|
||||||
|
import org.apache.archiva.metadata.model.Organization;
|
||||||
|
import org.apache.archiva.metadata.model.Scm;
|
||||||
|
|
||||||
|
import javax.persistence.Column;
|
||||||
|
import javax.persistence.Entity;
|
||||||
|
import javax.persistence.Id;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Olivier Lamy
|
||||||
|
*/
|
||||||
|
@Entity
|
||||||
|
public class ProjectVersionMetadataModel
|
||||||
|
{
|
||||||
|
// repositoryId + namespace + projectId + id (version)
|
||||||
|
@Id
|
||||||
|
private String rowId;
|
||||||
|
|
||||||
|
@Column( name = "namespace" )
|
||||||
|
private Namespace namespace;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* id is the version
|
||||||
|
*/
|
||||||
|
@Column( name = "id" )
|
||||||
|
private String id;
|
||||||
|
|
||||||
|
@Column( name = "projectId" )
|
||||||
|
private String projectId;
|
||||||
|
|
||||||
|
@Column(name = "url")
|
||||||
|
private String url;
|
||||||
|
|
||||||
|
@Column(name = "name")
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
@Column(name = "description")
|
||||||
|
private String description;
|
||||||
|
|
||||||
|
@Column(name = "organization")
|
||||||
|
private Organization organization;
|
||||||
|
|
||||||
|
@Column(name = "issueManagement")
|
||||||
|
private IssueManagement issueManagement;
|
||||||
|
|
||||||
|
@Column(name = "scm")
|
||||||
|
private Scm scm;
|
||||||
|
|
||||||
|
@Column(name = "ciManagement")
|
||||||
|
private CiManagement ciManagement;
|
||||||
|
|
||||||
|
// FIXME store those values in a separate table
|
||||||
|
@Column(name = "licenses")
|
||||||
|
private List<License> licenses = new ArrayList<License>();
|
||||||
|
|
||||||
|
@Column(name = "mailingLists")
|
||||||
|
private List<MailingList> mailingLists = new ArrayList<MailingList>();
|
||||||
|
|
||||||
|
@Column(name = "dependencies")
|
||||||
|
private List<Dependency> dependencies = new ArrayList<Dependency>();
|
||||||
|
|
||||||
|
@Column(name = "incomplete")
|
||||||
|
private boolean incomplete;
|
||||||
|
|
||||||
|
public String getProjectId()
|
||||||
|
{
|
||||||
|
return projectId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setProjectId( String projectId )
|
||||||
|
{
|
||||||
|
this.projectId = projectId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getRowId()
|
||||||
|
{
|
||||||
|
return rowId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRowId( String rowId )
|
||||||
|
{
|
||||||
|
this.rowId = rowId;
|
||||||
|
}
|
||||||
|
|
||||||
|
// FIXME must be renamed getVersion !!!
|
||||||
|
public String getId()
|
||||||
|
{
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId( String id )
|
||||||
|
{
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getUrl()
|
||||||
|
{
|
||||||
|
return url;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUrl( String url )
|
||||||
|
{
|
||||||
|
this.url = url;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName()
|
||||||
|
{
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName( String name )
|
||||||
|
{
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDescription()
|
||||||
|
{
|
||||||
|
return description;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDescription( String description )
|
||||||
|
{
|
||||||
|
this.description = description;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Organization getOrganization()
|
||||||
|
{
|
||||||
|
return organization;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setOrganization( Organization organization )
|
||||||
|
{
|
||||||
|
this.organization = organization;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IssueManagement getIssueManagement()
|
||||||
|
{
|
||||||
|
return issueManagement;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setIssueManagement( IssueManagement issueManagement )
|
||||||
|
{
|
||||||
|
this.issueManagement = issueManagement;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Scm getScm()
|
||||||
|
{
|
||||||
|
return scm;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setScm( Scm scm )
|
||||||
|
{
|
||||||
|
this.scm = scm;
|
||||||
|
}
|
||||||
|
|
||||||
|
public CiManagement getCiManagement()
|
||||||
|
{
|
||||||
|
return ciManagement;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCiManagement( CiManagement ciManagement )
|
||||||
|
{
|
||||||
|
this.ciManagement = ciManagement;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isIncomplete()
|
||||||
|
{
|
||||||
|
return incomplete;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setIncomplete( boolean incomplete )
|
||||||
|
{
|
||||||
|
this.incomplete = incomplete;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Namespace getNamespace()
|
||||||
|
{
|
||||||
|
return namespace;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setNamespace( Namespace namespace )
|
||||||
|
{
|
||||||
|
this.namespace = namespace;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<License> getLicenses()
|
||||||
|
{
|
||||||
|
return licenses;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLicenses( List<License> licenses )
|
||||||
|
{
|
||||||
|
this.licenses = licenses;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<MailingList> getMailingLists()
|
||||||
|
{
|
||||||
|
return mailingLists;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMailingLists( List<MailingList> mailingLists )
|
||||||
|
{
|
||||||
|
this.mailingLists = mailingLists;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Dependency> getDependencies()
|
||||||
|
{
|
||||||
|
return dependencies;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDependencies( List<Dependency> dependencies )
|
||||||
|
{
|
||||||
|
this.dependencies = dependencies;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString()
|
||||||
|
{
|
||||||
|
final StringBuilder sb = new StringBuilder( "ProjectVersionMetadataModel{" );
|
||||||
|
sb.append( "rowId='" ).append( rowId ).append( '\'' );
|
||||||
|
sb.append( ", namespace=" ).append( namespace );
|
||||||
|
sb.append( ", id='" ).append( id ).append( '\'' );
|
||||||
|
sb.append( ", projectId='" ).append( projectId ).append( '\'' );
|
||||||
|
sb.append( ", url='" ).append( url ).append( '\'' );
|
||||||
|
sb.append( ", name='" ).append( name ).append( '\'' );
|
||||||
|
sb.append( ", description='" ).append( description ).append( '\'' );
|
||||||
|
sb.append( ", organization=" ).append( organization );
|
||||||
|
sb.append( ", issueManagement=" ).append( issueManagement );
|
||||||
|
sb.append( ", scm=" ).append( scm );
|
||||||
|
sb.append( ", ciManagement=" ).append( ciManagement );
|
||||||
|
sb.append( ", incomplete=" ).append( incomplete );
|
||||||
|
sb.append( '}' );
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals( Object o )
|
||||||
|
{
|
||||||
|
if ( this == o )
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if ( o == null || getClass() != o.getClass() )
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
ProjectVersionMetadataModel that = (ProjectVersionMetadataModel) o;
|
||||||
|
|
||||||
|
if ( !rowId.equals( that.rowId ) )
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode()
|
||||||
|
{
|
||||||
|
return rowId.hashCode();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class KeyBuilder
|
||||||
|
{
|
||||||
|
|
||||||
|
private String namespace;
|
||||||
|
|
||||||
|
private String repositoryId;
|
||||||
|
|
||||||
|
private String projectId;
|
||||||
|
|
||||||
|
private String id;
|
||||||
|
|
||||||
|
public KeyBuilder()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public KeyBuilder withNamespace( Namespace namespace )
|
||||||
|
{
|
||||||
|
this.namespace = namespace.getName();
|
||||||
|
this.repositoryId = namespace.getRepository().getId();
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public KeyBuilder withNamespace( String namespace )
|
||||||
|
{
|
||||||
|
this.namespace = namespace;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public KeyBuilder withRepository( String repositoryId )
|
||||||
|
{
|
||||||
|
this.repositoryId = repositoryId;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public KeyBuilder withRepository( Repository repository )
|
||||||
|
{
|
||||||
|
this.repositoryId = repository.getId();
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public KeyBuilder withProjectId( String projectId )
|
||||||
|
{
|
||||||
|
this.projectId = projectId;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public KeyBuilder withId( String id )
|
||||||
|
{
|
||||||
|
this.id = id;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String build()
|
||||||
|
{
|
||||||
|
// FIXME add some controls
|
||||||
|
return this.repositoryId + "-" + this.namespace + "-" + this.projectId + ( this.id == null
|
||||||
|
? ""
|
||||||
|
: "-" + this.id );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,136 @@
|
||||||
|
package org.apache.archiva.metadata.repository.cassandra.model;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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 javax.persistence.Column;
|
||||||
|
import javax.persistence.Entity;
|
||||||
|
import javax.persistence.Id;
|
||||||
|
import javax.persistence.Table;
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Olivier Lamy
|
||||||
|
*/
|
||||||
|
@Entity
|
||||||
|
@Table(name = "repository", schema = "ArchivaKeySpace@archiva")
|
||||||
|
public class Repository
|
||||||
|
implements Serializable
|
||||||
|
{
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
@Id
|
||||||
|
@Column( name = "id" )
|
||||||
|
private String id;
|
||||||
|
|
||||||
|
@Column(name = "name")
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
private transient List<Namespace> namespaces = new ArrayList<Namespace>();
|
||||||
|
|
||||||
|
public Repository()
|
||||||
|
{
|
||||||
|
// no op
|
||||||
|
}
|
||||||
|
|
||||||
|
public Repository( String id )
|
||||||
|
{
|
||||||
|
this.id = id;
|
||||||
|
this.name = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getId()
|
||||||
|
{
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId( String id )
|
||||||
|
{
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName()
|
||||||
|
{
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName( String name )
|
||||||
|
{
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public List<Namespace> getNamespaces()
|
||||||
|
{
|
||||||
|
if ( this.namespaces == null )
|
||||||
|
{
|
||||||
|
this.namespaces = new ArrayList<Namespace>();
|
||||||
|
}
|
||||||
|
return namespaces;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setNamespaces( List<Namespace> namespaces )
|
||||||
|
{
|
||||||
|
this.namespaces = namespaces;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals( Object o )
|
||||||
|
{
|
||||||
|
if ( this == o )
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if ( o == null || getClass() != o.getClass() )
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
Repository that = (Repository) o;
|
||||||
|
|
||||||
|
if ( !id.equals( that.id ) )
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode()
|
||||||
|
{
|
||||||
|
return id.hashCode();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString()
|
||||||
|
{
|
||||||
|
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( '}' );
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
}
|
|
@ -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"
|
||||||
|
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"
|
||||||
|
default-lazy-init="true">
|
||||||
|
|
||||||
|
<context:annotation-config/>
|
||||||
|
<context:component-scan base-package="org.apache.archiva.metadata.repository.cassandra"/>
|
||||||
|
|
||||||
|
</beans>
|
|
@ -0,0 +1,25 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!--
|
||||||
|
~ 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"
|
||||||
|
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
|
||||||
|
|
||||||
|
</beans>
|
|
@ -0,0 +1,113 @@
|
||||||
|
package org.apache.archiva.metadata.repository.cassandra;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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.metadata.model.MetadataFacetFactory;
|
||||||
|
import org.apache.archiva.metadata.repository.AbstractMetadataRepositoryTest;
|
||||||
|
import org.apache.archiva.metadata.repository.cassandra.model.ArtifactMetadataModel;
|
||||||
|
import org.apache.archiva.metadata.repository.cassandra.model.MetadataFacetModel;
|
||||||
|
import org.apache.archiva.metadata.repository.cassandra.model.Namespace;
|
||||||
|
import org.apache.archiva.metadata.repository.cassandra.model.Project;
|
||||||
|
import org.apache.archiva.metadata.repository.cassandra.model.ProjectVersionMetadataModel;
|
||||||
|
import org.apache.archiva.metadata.repository.cassandra.model.Repository;
|
||||||
|
import org.apache.commons.io.FileUtils;
|
||||||
|
import org.junit.After;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
import javax.inject.Named;
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Olivier Lamy
|
||||||
|
*/
|
||||||
|
public class CassandraMetadataRepositoryTest
|
||||||
|
extends AbstractMetadataRepositoryTest
|
||||||
|
{
|
||||||
|
private Logger logger = LoggerFactory.getLogger( getClass() );
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
@Named( value = "archivaEntityManagerFactory#cassandra" )
|
||||||
|
CassandraEntityManagerFactory cassandraEntityManagerFactory;
|
||||||
|
|
||||||
|
CassandraMetadataRepository cmr;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setUp()
|
||||||
|
throws Exception
|
||||||
|
{
|
||||||
|
super.setUp();
|
||||||
|
|
||||||
|
File directory = new File( "target/test-repositories" );
|
||||||
|
if ( directory.exists() )
|
||||||
|
{
|
||||||
|
FileUtils.deleteDirectory( directory );
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, MetadataFacetFactory> factories = createTestMetadataFacetFactories();
|
||||||
|
|
||||||
|
this.cmr = new CassandraMetadataRepository( factories, null, cassandraEntityManagerFactory.getKeyspace() );
|
||||||
|
this.repository = this.cmr;
|
||||||
|
|
||||||
|
clearReposAndNamespace();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@After
|
||||||
|
public void shutdown()
|
||||||
|
throws Exception
|
||||||
|
{
|
||||||
|
clearReposAndNamespace();
|
||||||
|
super.tearDown();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void clearReposAndNamespace()
|
||||||
|
throws Exception
|
||||||
|
{
|
||||||
|
List<Project> projects = cmr.getProjectEntityManager().getAll();
|
||||||
|
|
||||||
|
cmr.getProjectEntityManager().remove( projects );
|
||||||
|
|
||||||
|
List<Namespace> namespaces = cmr.getNamespaceEntityManager().getAll();
|
||||||
|
|
||||||
|
cmr.getNamespaceEntityManager().remove( namespaces );
|
||||||
|
|
||||||
|
List<Repository> repositories = cmr.getRepositoryEntityManager().getAll();
|
||||||
|
|
||||||
|
cmr.getRepositoryEntityManager().remove( repositories );
|
||||||
|
|
||||||
|
List<ArtifactMetadataModel> artifactMetadataModels = cmr.getArtifactMetadataModelEntityManager().getAll();
|
||||||
|
cmr.getArtifactMetadataModelEntityManager().remove( artifactMetadataModels );
|
||||||
|
|
||||||
|
List<MetadataFacetModel> metadataFacetModels = cmr.getMetadataFacetModelEntityManager().getAll();
|
||||||
|
cmr.getMetadataFacetModelEntityManager().remove( metadataFacetModels );
|
||||||
|
|
||||||
|
List<ProjectVersionMetadataModel> projectVersionMetadataModels =
|
||||||
|
cmr.getProjectVersionMetadataModelEntityManager().getAll();
|
||||||
|
cmr.getProjectVersionMetadataModelEntityManager().remove( projectVersionMetadataModels );
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,133 @@
|
||||||
|
package org.apache.archiva.metadata.repository.cassandra;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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.metadata.repository.cassandra.model.Namespace;
|
||||||
|
import org.apache.archiva.metadata.repository.cassandra.model.Project;
|
||||||
|
import org.apache.archiva.metadata.repository.cassandra.model.Repository;
|
||||||
|
import org.apache.archiva.test.utils.ArchivaSpringJUnit4ClassRunner;
|
||||||
|
import org.fest.assertions.api.Assertions;
|
||||||
|
import org.junit.After;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.springframework.test.context.ContextConfiguration;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
import javax.inject.Named;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Olivier Lamy
|
||||||
|
*/
|
||||||
|
@RunWith(ArchivaSpringJUnit4ClassRunner.class)
|
||||||
|
@ContextConfiguration(locations = { "classpath*:/META-INF/spring-context.xml", "classpath*:/spring-context.xml" })
|
||||||
|
public class RepositoriesNamespaceTest
|
||||||
|
{
|
||||||
|
|
||||||
|
private Logger logger = LoggerFactory.getLogger( getClass() );
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
@Named(value = "archivaEntityManagerFactory#cassandra")
|
||||||
|
CassandraEntityManagerFactory cassandraEntityManagerFactory;
|
||||||
|
|
||||||
|
|
||||||
|
CassandraMetadataRepository cmr;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setup()
|
||||||
|
throws Exception
|
||||||
|
{
|
||||||
|
|
||||||
|
cmr = new CassandraMetadataRepository( null, null, cassandraEntityManagerFactory.getKeyspace() );
|
||||||
|
clearReposAndNamespace();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
public void shutdown()
|
||||||
|
throws Exception
|
||||||
|
{
|
||||||
|
clearReposAndNamespace();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testMetadataRepo()
|
||||||
|
throws Exception
|
||||||
|
{
|
||||||
|
|
||||||
|
Repository r = null;
|
||||||
|
Namespace n = null;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
|
||||||
|
cmr.updateNamespace( "release", "org" );
|
||||||
|
|
||||||
|
r = cmr.getRepositoryEntityManager().get( "release" );
|
||||||
|
|
||||||
|
Assertions.assertThat( r ).isNotNull();
|
||||||
|
|
||||||
|
Assertions.assertThat( cmr.getRepositories() ).isNotEmpty().hasSize( 1 );
|
||||||
|
Assertions.assertThat( cmr.getNamespaces( "release" ) ).isNotEmpty().hasSize( 1 );
|
||||||
|
|
||||||
|
n = cmr.getNamespaceEntityManager().get( "release" + "-" + "org" );
|
||||||
|
|
||||||
|
Assertions.assertThat( n ).isNotNull();
|
||||||
|
Assertions.assertThat( n.getRepository() ).isNotNull();
|
||||||
|
|
||||||
|
cmr.updateNamespace( "release", "org.apache" );
|
||||||
|
|
||||||
|
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
|
||||||
|
{
|
||||||
|
clearReposAndNamespace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void clearReposAndNamespace()
|
||||||
|
throws Exception
|
||||||
|
{
|
||||||
|
List<Project> projects = cmr.getProjectEntityManager().getAll();
|
||||||
|
|
||||||
|
cmr.getProjectEntityManager().remove( projects );
|
||||||
|
|
||||||
|
List<Namespace> namespaces = cmr.getNamespaceEntityManager().getAll();
|
||||||
|
|
||||||
|
cmr.getNamespaceEntityManager().remove( namespaces );
|
||||||
|
|
||||||
|
List<Repository> repositories = cmr.getRepositoryEntityManager().getAll();
|
||||||
|
|
||||||
|
cmr.getRepositoryEntityManager().remove( repositories );
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,44 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
|
<!--
|
||||||
|
~ 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.
|
||||||
|
-->
|
||||||
|
|
||||||
|
|
||||||
|
<configuration status="debug">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<appenders>
|
||||||
|
<Console name="console" target="SYSTEM_OUT">
|
||||||
|
<!--PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/-->
|
||||||
|
<PatternLayout pattern="%highlight{%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n}" />
|
||||||
|
</Console>
|
||||||
|
|
||||||
|
</appenders>
|
||||||
|
<loggers>
|
||||||
|
|
||||||
|
|
||||||
|
<logger name="org.apache.archiva.metadata.repository.cassandra.CassandraMetadataRepository" level="debug"/>
|
||||||
|
|
||||||
|
<root level="info" includeLocation="true">
|
||||||
|
<appender-ref ref="console"/>
|
||||||
|
</root>
|
||||||
|
</loggers>
|
||||||
|
</configuration>
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue