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.base.Predicate; import com.google.common.collect.Iterables; import me.prettyprint.cassandra.serializers.LongSerializer; import me.prettyprint.cassandra.serializers.StringSerializer; import me.prettyprint.cassandra.service.template.ColumnFamilyResult; import me.prettyprint.cassandra.service.template.ColumnFamilyTemplate; import me.prettyprint.cassandra.service.template.ColumnFamilyUpdater; import me.prettyprint.cassandra.service.template.ThriftColumnFamilyTemplate; import me.prettyprint.hector.api.Keyspace; import me.prettyprint.hector.api.beans.ColumnSlice; import me.prettyprint.hector.api.beans.OrderedRows; import me.prettyprint.hector.api.beans.Row; import me.prettyprint.hector.api.exceptions.HInvalidRequestException; import me.prettyprint.hector.api.factory.HFactory; import me.prettyprint.hector.api.mutation.MutationResult; import me.prettyprint.hector.api.mutation.Mutator; import me.prettyprint.hector.api.query.QueryResult; import me.prettyprint.hector.api.query.RangeSlicesQuery; import org.apache.archiva.configuration.ArchivaConfiguration; import org.apache.archiva.metadata.model.ArtifactMetadata; import org.apache.archiva.metadata.model.CiManagement; import org.apache.archiva.metadata.model.Dependency; import org.apache.archiva.metadata.model.FacetedMetadata; 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.MetadataFacet; import org.apache.archiva.metadata.model.MetadataFacetFactory; import org.apache.archiva.metadata.model.Organization; import org.apache.archiva.metadata.model.ProjectMetadata; import org.apache.archiva.metadata.model.ProjectVersionMetadata; import org.apache.archiva.metadata.model.ProjectVersionReference; import org.apache.archiva.metadata.model.Scm; import org.apache.archiva.metadata.repository.MetadataRepository; import org.apache.archiva.metadata.repository.MetadataRepositoryException; import org.apache.archiva.metadata.repository.MetadataResolutionException; 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.lang.StringUtils; import org.modelmapper.ModelMapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.persistence.PersistenceException; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; import java.util.UUID; import static org.apache.archiva.metadata.repository.cassandra.CassandraUtils.*; import static org.apache.archiva.metadata.repository.cassandra.model.ColumnNames.*; /** * @author Olivier Lamy * @since 2.0.0 */ public class CassandraMetadataRepository implements MetadataRepository { private Logger logger = LoggerFactory.getLogger( getClass() ); private ArchivaConfiguration configuration; private final Map<String, MetadataFacetFactory> metadataFacetFactories; private final CassandraArchivaManager cassandraArchivaManager; private final ColumnFamilyTemplate<String, String> projectVersionMetadataTemplate; private final ColumnFamilyTemplate<String, String> projectTemplate; private final ColumnFamilyTemplate<String, String> artifactMetadataTemplate; private final ColumnFamilyTemplate<String, String> metadataFacetTemplate; private final ColumnFamilyTemplate<String, String> mailingListTemplate; private final ColumnFamilyTemplate<String, String> licenseTemplate; private final ColumnFamilyTemplate<String, String> dependencyTemplate; private final Keyspace keyspace; private final StringSerializer ss = StringSerializer.get(); public CassandraMetadataRepository( Map<String, MetadataFacetFactory> metadataFacetFactories, ArchivaConfiguration configuration, CassandraArchivaManager cassandraArchivaManager ) { this.metadataFacetFactories = metadataFacetFactories; this.configuration = configuration; this.cassandraArchivaManager = cassandraArchivaManager; this.keyspace = cassandraArchivaManager.getKeyspace(); this.projectVersionMetadataTemplate = new ThriftColumnFamilyTemplate<>( cassandraArchivaManager.getKeyspace(), // cassandraArchivaManager.getProjectVersionMetadataFamilyName(), // StringSerializer.get(), // StringSerializer.get() ); this.projectTemplate = new ThriftColumnFamilyTemplate<>( cassandraArchivaManager.getKeyspace(), // cassandraArchivaManager.getProjectFamilyName(), // // StringSerializer.get(), // StringSerializer.get() ); this.artifactMetadataTemplate = new ThriftColumnFamilyTemplate<>( cassandraArchivaManager.getKeyspace(), // cassandraArchivaManager.getArtifactMetadataFamilyName(), StringSerializer.get(), // StringSerializer.get() ); this.metadataFacetTemplate = new ThriftColumnFamilyTemplate<>( cassandraArchivaManager.getKeyspace(), // cassandraArchivaManager.getMetadataFacetFamilyName(), // StringSerializer.get(), // StringSerializer.get() ); this.mailingListTemplate = new ThriftColumnFamilyTemplate<>( cassandraArchivaManager.getKeyspace(), // cassandraArchivaManager.getMailingListFamilyName(), // StringSerializer.get(), // StringSerializer.get() ); this.licenseTemplate = new ThriftColumnFamilyTemplate<>( cassandraArchivaManager.getKeyspace(), // cassandraArchivaManager.getLicenseFamilyName(), // StringSerializer.get(), // StringSerializer.get() ); this.dependencyTemplate = new ThriftColumnFamilyTemplate<>( cassandraArchivaManager.getKeyspace(), // cassandraArchivaManager.getDependencyFamilyName(), // StringSerializer.get(), // StringSerializer.get() ); } /** * if the repository doesn't exist it will be created * * @param repositoryId * @return */ public Repository getOrCreateRepository( String repositoryId ) throws MetadataRepositoryException { String cf = cassandraArchivaManager.getRepositoryFamilyName(); QueryResult<OrderedRows<String, String, String>> result = HFactory // .createRangeSlicesQuery( keyspace, StringSerializer.get(), StringSerializer.get(), StringSerializer.get() ) // .setColumnFamily( cf ) // .setColumnNames( REPOSITORY_NAME.toString() ) // .addEqualsExpression( REPOSITORY_NAME.toString(), repositoryId ) // .execute(); if ( result.get().getCount() < 1 ) { // we need to create the repository Repository repository = new Repository( repositoryId ); try { MutationResult mutationResult = HFactory.createMutator( keyspace, StringSerializer.get() ) // .addInsertion( repositoryId, cf, CassandraUtils.column( REPOSITORY_NAME.toString(), repository.getName() ) ) // .execute(); logger.debug( "time to insert repository: {}", mutationResult.getExecutionTimeMicro() ); return repository; } catch ( HInvalidRequestException e ) { logger.error( e.getMessage(), e ); throw new MetadataRepositoryException( e.getMessage(), e ); } } return new Repository( result.get().getList().get( 0 ).getColumnSlice().getColumnByName( REPOSITORY_NAME.toString() ).getValue() ); } protected Repository getRepository( String repositoryId ) throws MetadataRepositoryException { QueryResult<OrderedRows<String, String, String>> result = HFactory // .createRangeSlicesQuery( keyspace, StringSerializer.get(), StringSerializer.get(), StringSerializer.get() ) // .setColumnFamily( cassandraArchivaManager.getRepositoryFamilyName() ) // .setColumnNames( REPOSITORY_NAME.toString() ) // .addEqualsExpression( REPOSITORY_NAME.toString(), repositoryId ) // .execute(); return ( result.get().getCount() > 0 ) ? new Repository( repositoryId ) : null; } @Override public void updateNamespace( String repositoryId, String namespaceId ) throws MetadataRepositoryException { updateOrAddNamespace( repositoryId, namespaceId ); } private Namespace updateOrAddNamespace( String repositoryId, String namespaceId ) throws MetadataRepositoryException { try { Repository repository = getOrCreateRepository( repositoryId ); String key = new Namespace.KeyBuilder().withNamespace( namespaceId ).withRepositoryId( repositoryId ).build(); Namespace namespace = getNamespace( repositoryId, namespaceId ); if ( namespace == null ) { String cf = cassandraArchivaManager.getNamespaceFamilyName(); namespace = new Namespace( namespaceId, repository ); HFactory.createMutator( keyspace, StringSerializer.get() ) // values .addInsertion( key, cf, CassandraUtils.column( NAME.toString(), namespace.getName() ) ) // .addInsertion( key, cf, CassandraUtils.column( REPOSITORY_NAME.toString(), repository.getName() ) ) // .execute(); } return namespace; } catch ( HInvalidRequestException e ) { logger.error( e.getMessage(), e ); throw new MetadataRepositoryException( e.getMessage(), e ); } } protected Namespace getNamespace( String repositoryId, String namespaceId ) { QueryResult<OrderedRows<String, String, String>> result = HFactory // .createRangeSlicesQuery( keyspace, ss, ss, ss ) // .setColumnFamily( cassandraArchivaManager.getNamespaceFamilyName() ) // .setColumnNames( REPOSITORY_NAME.toString(), NAME.toString() ) // .addEqualsExpression( REPOSITORY_NAME.toString(), repositoryId ) // .addEqualsExpression( NAME.toString(), namespaceId ) // .execute(); if ( result.get().getCount() > 0 ) { ColumnSlice<String, String> columnSlice = result.get().getList().get( 0 ).getColumnSlice(); return new Namespace( getStringValue( columnSlice, NAME.toString() ), // new Repository( getStringValue( columnSlice, REPOSITORY_NAME.toString() ) ) ); } return null; } @Override public void removeNamespace( String repositoryId, String namespaceId ) throws MetadataRepositoryException { try { String key = new Namespace.KeyBuilder() // .withNamespace( namespaceId ) // .withRepositoryId( repositoryId ) // .build(); HFactory.createMutator( cassandraArchivaManager.getKeyspace(), new StringSerializer() ) // .addDeletion( key, cassandraArchivaManager.getNamespaceFamilyName() ) // .execute(); QueryResult<OrderedRows<String, String, String>> result = HFactory // .createRangeSlicesQuery( keyspace, ss, ss, ss ) // .setColumnFamily( cassandraArchivaManager.getProjectFamilyName() ) // .setColumnNames( REPOSITORY_NAME.toString() ) // .addEqualsExpression( REPOSITORY_NAME.toString(), repositoryId ) // .addEqualsExpression( NAMESPACE_ID.toString(), namespaceId ) // .execute(); for ( Row<String, String, String> row : result.get() ) { this.projectTemplate.deleteRow( row.getKey() ); } result = HFactory // .createRangeSlicesQuery( keyspace, ss, ss, ss ) // .setColumnFamily( cassandraArchivaManager.getProjectVersionMetadataFamilyName() ) // .setColumnNames( REPOSITORY_NAME.toString() ) // .addEqualsExpression( REPOSITORY_NAME.toString(), repositoryId ) // .addEqualsExpression( NAMESPACE_ID.toString(), namespaceId ) // .execute(); for ( Row<String, String, String> row : result.get() ) { this.projectVersionMetadataTemplate.deleteRow( row.getKey() ); removeMailingList( row.getKey() ); } result = HFactory // .createRangeSlicesQuery( keyspace, ss, ss, ss ) // .setColumnFamily( cassandraArchivaManager.getArtifactMetadataFamilyName() ) // .setColumnNames( REPOSITORY_NAME.toString() ) // .addEqualsExpression( REPOSITORY_NAME.toString(), repositoryId ) // .addEqualsExpression( NAMESPACE_ID.toString(), namespaceId ) // .execute(); for ( Row<String, String, String> row : result.get() ) { this.artifactMetadataTemplate.deleteRow( row.getKey() ); } result = HFactory // .createRangeSlicesQuery( keyspace, ss, ss, ss ) // .setColumnFamily( cassandraArchivaManager.getMetadataFacetFamilyName() ) // .setColumnNames( REPOSITORY_NAME.toString() ) // .addEqualsExpression( REPOSITORY_NAME.toString(), repositoryId ) // .addEqualsExpression( NAMESPACE_ID.toString(), namespaceId ) // .execute(); for ( Row<String, String, String> row : result.get() ) { this.metadataFacetTemplate.deleteRow( row.getKey() ); } } catch ( HInvalidRequestException e ) { logger.error( e.getMessage(), e ); throw new MetadataRepositoryException( e.getMessage(), e ); } } @Override public void removeRepository( final String repositoryId ) throws MetadataRepositoryException { // TODO use cql queries to delete all List<String> namespacesKey = new ArrayList<>(); QueryResult<OrderedRows<String, String, String>> result = HFactory // .createRangeSlicesQuery( keyspace, ss, ss, ss ) // .setColumnFamily( cassandraArchivaManager.getNamespaceFamilyName() ) // .setColumnNames( REPOSITORY_NAME.toString() ) // .addEqualsExpression( REPOSITORY_NAME.toString(), repositoryId ) // .execute(); for ( Row<String, String, String> row : result.get().getList() ) { namespacesKey.add( row.getKey() ); } HFactory.createMutator( cassandraArchivaManager.getKeyspace(), ss ) // .addDeletion( namespacesKey, cassandraArchivaManager.getNamespaceFamilyName() ) // .execute(); //delete repositoryId HFactory.createMutator( cassandraArchivaManager.getKeyspace(), ss ) // .addDeletion( repositoryId, cassandraArchivaManager.getRepositoryFamilyName() ) // .execute(); result = HFactory // .createRangeSlicesQuery( keyspace, ss, ss, ss ) // .setColumnFamily( cassandraArchivaManager.getProjectFamilyName() ) // .setColumnNames( REPOSITORY_NAME.toString() ) // .addEqualsExpression( REPOSITORY_NAME.toString(), repositoryId ) // .execute(); for ( Row<String, String, String> row : result.get() ) { this.projectTemplate.deleteRow( row.getKey() ); } result = HFactory // .createRangeSlicesQuery( keyspace, ss, ss, ss ) // .setColumnFamily( cassandraArchivaManager.getProjectVersionMetadataFamilyName() ) // .setColumnNames( REPOSITORY_NAME.toString() ) // .addEqualsExpression( REPOSITORY_NAME.toString(), repositoryId ) // .execute(); for ( Row<String, String, String> row : result.get() ) { this.projectVersionMetadataTemplate.deleteRow( row.getKey() ); removeMailingList( row.getKey() ); } result = HFactory // .createRangeSlicesQuery( keyspace, ss, ss, ss ) // .setColumnFamily( cassandraArchivaManager.getArtifactMetadataFamilyName() ) // .setColumnNames( REPOSITORY_NAME.toString() ) // .addEqualsExpression( REPOSITORY_NAME.toString(), repositoryId ) // .execute(); for ( Row<String, String, String> row : result.get() ) { this.artifactMetadataTemplate.deleteRow( row.getKey() ); } result = HFactory // .createRangeSlicesQuery( keyspace, ss, ss, ss ) // .setColumnFamily( cassandraArchivaManager.getMetadataFacetFamilyName() ) // .setColumnNames( REPOSITORY_NAME.toString() ) // .addEqualsExpression( REPOSITORY_NAME.toString(), repositoryId ) // .execute(); for ( Row<String, String, String> row : result.get() ) { this.metadataFacetTemplate.deleteRow( row.getKey() ); } } @Override public Collection<String> getRepositories() throws MetadataRepositoryException { try { logger.debug( "getRepositories" ); final QueryResult<OrderedRows<String, String, String>> cResult = // HFactory.createRangeSlicesQuery( cassandraArchivaManager.getKeyspace(), // ss, ss, ss ) // .setColumnFamily( cassandraArchivaManager.getRepositoryFamilyName() ) // .setColumnNames( REPOSITORY_NAME.toString() ) // .setRange( null, null, false, Integer.MAX_VALUE ) // .execute(); List<String> repoIds = new ArrayList<>( cResult.get().getCount() ); for ( Row<String, String, String> row : cResult.get() ) { repoIds.add( getStringValue( row.getColumnSlice(), REPOSITORY_NAME.toString() ) ); } return repoIds; } catch ( PersistenceException e ) { throw new MetadataRepositoryException( e.getMessage(), e ); } } // FIXME this one need peformance improvement maybe a cache? @Override public Collection<String> getRootNamespaces( final String repoId ) throws MetadataResolutionException { QueryResult<OrderedRows<String, String, String>> result = HFactory // .createRangeSlicesQuery( keyspace, ss, ss, ss ) // .setColumnFamily( cassandraArchivaManager.getNamespaceFamilyName() ) // .setColumnNames( NAME.toString() ) // .addEqualsExpression( REPOSITORY_NAME.toString(), repoId ) // .execute(); Set<String> namespaces = new HashSet<String>( result.get().getCount() ); for ( Row<String, String, String> row : result.get() ) { namespaces.add( StringUtils.substringBefore( getStringValue( row.getColumnSlice(), NAME.toString() ), "." ) ); } return namespaces; } // FIXME this one need peformance improvement maybe a cache? @Override public Collection<String> getNamespaces( final String repoId, final String namespaceId ) throws MetadataResolutionException { QueryResult<OrderedRows<String, String, String>> result = HFactory // .createRangeSlicesQuery( keyspace, ss, ss, ss ) // .setColumnFamily( cassandraArchivaManager.getNamespaceFamilyName() ) // .setColumnNames( NAME.toString() ) // .addEqualsExpression( REPOSITORY_NAME.toString(), repoId ) // .execute(); List<String> namespaces = new ArrayList<>( result.get().getCount() ); for ( Row<String, String, String> row : result.get() ) { String currentNamespace = getStringValue( row.getColumnSlice(), NAME.toString() ); if ( StringUtils.startsWith( currentNamespace, namespaceId ) // && ( StringUtils.length( currentNamespace ) > StringUtils.length( namespaceId ) ) ) { // store after namespaceId '.' but before next '.' // call org namespace org.apache.maven.shared -> stored apache String calledNamespace = StringUtils.endsWith( namespaceId, "." ) ? namespaceId : namespaceId + "."; String storedNamespace = StringUtils.substringAfter( currentNamespace, calledNamespace ); storedNamespace = StringUtils.substringBefore( storedNamespace, "." ); namespaces.add( storedNamespace ); } } return namespaces; } // only use for testing purpose protected List<String> getNamespaces( final String repoId ) throws MetadataResolutionException { QueryResult<OrderedRows<String, String, String>> result = HFactory // .createRangeSlicesQuery( keyspace, ss, ss, ss ) // .setColumnFamily( cassandraArchivaManager.getNamespaceFamilyName() ) // .setColumnNames( NAME.toString() ) // .addEqualsExpression( REPOSITORY_NAME.toString(), repoId ) // .execute(); List<String> namespaces = new ArrayList<>( result.get().getCount() ); for ( Row<String, String, String> row : result.get() ) { namespaces.add( getStringValue( row.getColumnSlice(), NAME.toString() ) ); } return namespaces; } @Override public void updateProject( String repositoryId, ProjectMetadata projectMetadata ) throws MetadataRepositoryException { QueryResult<OrderedRows<String, String, String>> result = HFactory // .createRangeSlicesQuery( keyspace, ss, ss, ss ) // .setColumnFamily( cassandraArchivaManager.getProjectFamilyName() ) // .setColumnNames( PROJECT_ID.toString() ) // .addEqualsExpression( REPOSITORY_NAME.toString(), repositoryId ) // .addEqualsExpression( NAMESPACE_ID.toString(), projectMetadata.getNamespace() ) // .addEqualsExpression( PROJECT_ID.toString(), projectMetadata.getId() ) // .execute(); // project exists ? if yes return nothing to update here if ( result.get().getCount() > 0 ) { return; } else { Namespace namespace = updateOrAddNamespace( repositoryId, projectMetadata.getNamespace() ); String key = new Project.KeyBuilder().withProjectId( projectMetadata.getId() ).withNamespace( namespace ).build(); String cf = cassandraArchivaManager.getProjectFamilyName(); projectTemplate.createMutator() // values .addInsertion( key, cf, CassandraUtils.column( PROJECT_ID.toString(), projectMetadata.getId() ) ) // .addInsertion( key, cf, CassandraUtils.column( REPOSITORY_NAME.toString(), repositoryId ) ) // .addInsertion( key, cf, CassandraUtils.column( NAMESPACE_ID.toString(), projectMetadata.getNamespace() ) )// .execute(); } } @Override public Collection<String> getProjects( final String repoId, final String namespace ) throws MetadataResolutionException { QueryResult<OrderedRows<String, String, String>> result = HFactory // .createRangeSlicesQuery( keyspace, ss, ss, ss ) // .setColumnFamily( cassandraArchivaManager.getProjectFamilyName() ) // .setColumnNames( PROJECT_ID.toString() ) // .addEqualsExpression( REPOSITORY_NAME.toString(), repoId ) // .addEqualsExpression( NAMESPACE_ID.toString(), namespace ) // .execute(); final Set<String> projects = new HashSet<String>( result.get().getCount() ); for ( Row<String, String, String> row : result.get() ) { projects.add( getStringValue( row.getColumnSlice(), PROJECT_ID.toString() ) ); } return projects; } @Override public void removeProject( final String repositoryId, final String namespaceId, final String projectId ) throws MetadataRepositoryException { String key = new Project.KeyBuilder() // .withProjectId( projectId ) // .withNamespace( new Namespace( namespaceId, new Repository( repositoryId ) ) ) // .build(); this.projectTemplate.deleteRow( key ); QueryResult<OrderedRows<String, String, String>> result = HFactory // .createRangeSlicesQuery( keyspace, ss, ss, ss ) // .setColumnFamily( cassandraArchivaManager.getProjectVersionMetadataFamilyName() ) // .setColumnNames( ID.toString() ) // .addEqualsExpression( REPOSITORY_NAME.toString(), repositoryId ) // .addEqualsExpression( NAMESPACE_ID.toString(), namespaceId ) // .addEqualsExpression( PROJECT_ID.toString(), projectId ) // .execute(); for ( Row<String, String, String> row : result.get() ) { this.projectVersionMetadataTemplate.deleteRow( row.getKey() ); removeMailingList( row.getKey() ); } result = HFactory // .createRangeSlicesQuery( keyspace, ss, ss, ss ) // .setColumnFamily( cassandraArchivaManager.getArtifactMetadataFamilyName() ) // .setColumnNames( PROJECT_ID.toString() ) // .addEqualsExpression( REPOSITORY_NAME.toString(), repositoryId ) // .addEqualsExpression( NAMESPACE_ID.toString(), namespaceId ) // .addEqualsExpression( PROJECT_ID.toString(), projectId ) // .execute(); for ( Row<String, String, String> row : result.get() ) { this.artifactMetadataTemplate.deleteRow( row.getKey() ); } } @Override public Collection<String> getProjectVersions( final String repoId, final String namespace, final String projectId ) throws MetadataResolutionException { QueryResult<OrderedRows<String, String, String>> result = HFactory // .createRangeSlicesQuery( keyspace, ss, ss, ss ) // .setColumnFamily( cassandraArchivaManager.getProjectVersionMetadataFamilyName() ) // .setColumnNames( PROJECT_VERSION.toString() ) // .addEqualsExpression( REPOSITORY_NAME.toString(), repoId ) // .addEqualsExpression( NAMESPACE_ID.toString(), namespace ) // .addEqualsExpression( PROJECT_ID.toString(), projectId ) // .execute(); int count = result.get().getCount(); if ( count < 1 ) { return Collections.emptyList(); } Set<String> versions = new HashSet<String>( count ); for ( Row<String, String, String> orderedRows : result.get() ) { versions.add( getStringValue( orderedRows.getColumnSlice(), PROJECT_VERSION.toString() ) ); } return versions; } @Override public ProjectMetadata getProject( final String repoId, final String namespace, final String id ) throws MetadataResolutionException { QueryResult<OrderedRows<String, String, String>> result = HFactory // .createRangeSlicesQuery( keyspace, ss, ss, ss ) // .setColumnFamily( cassandraArchivaManager.getProjectFamilyName() ) // .setColumnNames( PROJECT_ID.toString() ) // .addEqualsExpression( REPOSITORY_NAME.toString(), repoId ) // .addEqualsExpression( NAMESPACE_ID.toString(), namespace ) // .addEqualsExpression( PROJECT_ID.toString(), id ) // .execute(); int count = result.get().getCount(); if ( count < 1 ) { return null; } ProjectMetadata projectMetadata = new ProjectMetadata(); projectMetadata.setId( id ); projectMetadata.setNamespace( namespace ); logger.debug( "getProject repoId: {}, namespace: {}, projectId: {} -> {}", repoId, namespace, id, projectMetadata ); return projectMetadata; } protected ProjectVersionMetadataModel mapProjectVersionMetadataModel( ColumnSlice<String, String> columnSlice ) { ProjectVersionMetadataModel projectVersionMetadataModel = new ProjectVersionMetadataModel(); projectVersionMetadataModel.setId( getStringValue( columnSlice, ID.toString() ) ); projectVersionMetadataModel.setDescription( getStringValue( columnSlice, DESCRIPTION.toString() ) ); projectVersionMetadataModel.setName( getStringValue( columnSlice, NAME.toString() ) ); Namespace namespace = new Namespace( getStringValue( columnSlice, NAMESPACE_ID.toString() ), // new Repository( getStringValue( columnSlice, REPOSITORY_NAME.toString() ) ) ); projectVersionMetadataModel.setNamespace( namespace ); projectVersionMetadataModel.setIncomplete( Boolean.parseBoolean( getStringValue( columnSlice, "incomplete" ) ) ); projectVersionMetadataModel.setProjectId( getStringValue( columnSlice, PROJECT_ID.toString() ) ); projectVersionMetadataModel.setUrl( getStringValue( columnSlice, URL.toString() ) ); return projectVersionMetadataModel; } @Override public void updateProjectVersion( String repositoryId, String namespaceId, String projectId, ProjectVersionMetadata versionMetadata ) throws MetadataRepositoryException { try { Namespace namespace = getNamespace( repositoryId, namespaceId ); if ( namespace == null ) { updateOrAddNamespace( repositoryId, namespaceId ); } if ( getProject( repositoryId, namespaceId, projectId ) == null ) { ProjectMetadata projectMetadata = new ProjectMetadata(); projectMetadata.setNamespace( namespaceId ); projectMetadata.setId( projectId ); updateProject( repositoryId, projectMetadata ); } } catch ( MetadataResolutionException e ) { throw new MetadataRepositoryException( e.getMessage(), e ); } QueryResult<OrderedRows<String, String, String>> result = HFactory // .createRangeSlicesQuery( keyspace, ss, ss, ss ) // .setColumnFamily( cassandraArchivaManager.getProjectVersionMetadataFamilyName() ) // .setColumnNames( PROJECT_VERSION.toString() ) // .addEqualsExpression( REPOSITORY_NAME.toString(), repositoryId ) // .addEqualsExpression( NAMESPACE_ID.toString(), namespaceId ) // .addEqualsExpression( PROJECT_ID.toString(), projectId ) // .addEqualsExpression( PROJECT_VERSION.toString(), versionMetadata.getId() ) // .execute(); ProjectVersionMetadataModel projectVersionMetadataModel = null; boolean creation = true; if ( result.get().getCount() > 0 ) { projectVersionMetadataModel = mapProjectVersionMetadataModel( result.get().getList().get( 0 ).getColumnSlice() ); creation = false; } else { projectVersionMetadataModel = getModelMapper().map( versionMetadata, ProjectVersionMetadataModel.class ); } projectVersionMetadataModel.setProjectId( projectId ); projectVersionMetadataModel.setNamespace( new Namespace( namespaceId, new Repository( repositoryId ) ) ); projectVersionMetadataModel.setCiManagement( versionMetadata.getCiManagement() ); projectVersionMetadataModel.setIssueManagement( versionMetadata.getIssueManagement() ); projectVersionMetadataModel.setOrganization( versionMetadata.getOrganization() ); projectVersionMetadataModel.setScm( versionMetadata.getScm() ); projectVersionMetadataModel.setMailingLists( versionMetadata.getMailingLists() ); projectVersionMetadataModel.setDependencies( versionMetadata.getDependencies() ); projectVersionMetadataModel.setLicenses( versionMetadata.getLicenses() ); // we don't test of repository and namespace really exist ! String key = new ProjectVersionMetadataModel.KeyBuilder() // .withRepository( repositoryId ) // .withNamespace( namespaceId ) // .withProjectId( projectId ) // .withProjectVersion( versionMetadata.getVersion() ) // .withId( versionMetadata.getId() ) // .build(); // FIXME nested objects to store!!! if ( creation ) { String cf = cassandraArchivaManager.getProjectVersionMetadataFamilyName(); Mutator<String> mutator = projectVersionMetadataTemplate.createMutator() // values .addInsertion( key, cf, column( PROJECT_ID.toString(), projectId ) ) // .addInsertion( key, cf, column( REPOSITORY_NAME.toString(), repositoryId ) ) // .addInsertion( key, cf, column( NAMESPACE_ID.toString(), namespaceId ) )// .addInsertion( key, cf, column( PROJECT_VERSION.toString(), versionMetadata.getVersion() ) ); // addInsertion( mutator, key, cf, DESCRIPTION.toString(), versionMetadata.getDescription() ); addInsertion( mutator, key, cf, NAME.toString(), versionMetadata.getName() ); addInsertion( mutator, key, cf, "incomplete", Boolean.toString( versionMetadata.isIncomplete() ) ); addInsertion( mutator, key, cf, URL.toString(), versionMetadata.getUrl() ); { CiManagement ci = versionMetadata.getCiManagement(); if ( ci != null ) { addInsertion( mutator, key, cf, "ciManagement.system", ci.getSystem() ); addInsertion( mutator, key, cf, "ciManagement.url", ci.getUrl() ); } } { IssueManagement issueManagement = versionMetadata.getIssueManagement(); if ( issueManagement != null ) { addInsertion( mutator, key, cf, "issueManagement.system", issueManagement.getSystem() ); addInsertion( mutator, key, cf, "issueManagement.url", issueManagement.getUrl() ); } } { Organization organization = versionMetadata.getOrganization(); if ( organization != null ) { addInsertion( mutator, key, cf, "organization.name", organization.getName() ); addInsertion( mutator, key, cf, "organization.url", organization.getUrl() ); } } { Scm scm = versionMetadata.getScm(); if ( scm != null ) { addInsertion( mutator, key, cf, "scm.url", scm.getUrl() ); addInsertion( mutator, key, cf, "scm.connection", scm.getConnection() ); addInsertion( mutator, key, cf, "scm.developerConnection", scm.getDeveloperConnection() ); } } recordMailingList( key, versionMetadata.getMailingLists() ); recordLicenses( key, versionMetadata.getLicenses() ); recordDependencies( key, versionMetadata.getDependencies(), repositoryId ); MutationResult mutationResult = mutator.execute(); } else { ColumnFamilyUpdater<String, String> updater = projectVersionMetadataTemplate.createUpdater( key ); addUpdateStringValue( updater, PROJECT_ID.toString(), projectId ); addUpdateStringValue( updater, REPOSITORY_NAME.toString(), repositoryId ); addUpdateStringValue( updater, NAMESPACE_ID.toString(), namespaceId ); addUpdateStringValue( updater, PROJECT_VERSION.toString(), versionMetadata.getVersion() ); addUpdateStringValue( updater, DESCRIPTION.toString(), versionMetadata.getDescription() ); addUpdateStringValue( updater, NAME.toString(), versionMetadata.getName() ); updater.setString( "incomplete", Boolean.toString( versionMetadata.isIncomplete() ) ); addUpdateStringValue( updater, URL.toString(), versionMetadata.getUrl() ); { CiManagement ci = versionMetadata.getCiManagement(); if ( ci != null ) { addUpdateStringValue( updater, "ciManagement.system", ci.getSystem() ); addUpdateStringValue( updater, "ciManagement.url", ci.getUrl() ); } } { IssueManagement issueManagement = versionMetadata.getIssueManagement(); if ( issueManagement != null ) { addUpdateStringValue( updater, "issueManagement.system", issueManagement.getSystem() ); addUpdateStringValue( updater, "issueManagement.url", issueManagement.getUrl() ); } } { Organization organization = versionMetadata.getOrganization(); if ( organization != null ) { addUpdateStringValue( updater, "organization.name", organization.getName() ); addUpdateStringValue( updater, "organization.url", organization.getUrl() ); } } { Scm scm = versionMetadata.getScm(); if ( scm != null ) { addUpdateStringValue( updater, "scm.url", scm.getUrl() ); addUpdateStringValue( updater, "scm.connection", scm.getConnection() ); addUpdateStringValue( updater, "scm.developerConnection", scm.getDeveloperConnection() ); } } // update is a delete record removeMailingList( key ); recordMailingList( key, versionMetadata.getMailingLists() ); removeLicenses( key ); recordLicenses( key, versionMetadata.getLicenses() ); removeDependencies( key ); recordDependencies( key, versionMetadata.getDependencies(), repositoryId ); projectVersionMetadataTemplate.update( updater ); } ArtifactMetadataModel artifactMetadataModel = new ArtifactMetadataModel(); artifactMetadataModel.setRepositoryId( repositoryId ); artifactMetadataModel.setNamespace( namespaceId ); artifactMetadataModel.setProject( projectId ); artifactMetadataModel.setProjectVersion( versionMetadata.getVersion() ); artifactMetadataModel.setVersion( versionMetadata.getVersion() ); updateFacets( versionMetadata, artifactMetadataModel ); } @Override public ProjectVersionMetadata getProjectVersion( final String repoId, final String namespace, final String projectId, final String projectVersion ) throws MetadataResolutionException { QueryResult<OrderedRows<String, String, String>> result = HFactory // .createRangeSlicesQuery( keyspace, ss, ss, ss ) // .setColumnFamily( cassandraArchivaManager.getProjectVersionMetadataFamilyName() ) // .setColumnNames( PROJECT_VERSION.toString() ) // .addEqualsExpression( REPOSITORY_NAME.toString(), repoId ) // .addEqualsExpression( NAMESPACE_ID.toString(), namespace ) // .addEqualsExpression( PROJECT_ID.toString(), projectId ) // .addEqualsExpression( PROJECT_VERSION.toString(), projectVersion ) // .execute(); if ( result.get().getCount() < 1 ) { return null; } String key = result.get().iterator().next().getKey(); ColumnFamilyResult<String, String> columnFamilyResult = this.projectVersionMetadataTemplate.queryColumns( key ); if ( !columnFamilyResult.hasResults() ) { return null; } ProjectVersionMetadata projectVersionMetadata = new ProjectVersionMetadata(); projectVersionMetadata.setId( columnFamilyResult.getString( PROJECT_VERSION.toString() ) ); projectVersionMetadata.setDescription( columnFamilyResult.getString( DESCRIPTION.toString() ) ); projectVersionMetadata.setName( columnFamilyResult.getString( NAME.toString() ) ); projectVersionMetadata.setIncomplete( Boolean.parseBoolean( columnFamilyResult.getString( "incomplete" ) ) ); projectVersionMetadata.setUrl( columnFamilyResult.getString( URL.toString() ) ); { String ciUrl = columnFamilyResult.getString( "ciManagement.url" ); String ciSystem = columnFamilyResult.getString( "ciManagement.system" ); if ( StringUtils.isNotEmpty( ciSystem ) || StringUtils.isNotEmpty( ciUrl ) ) { projectVersionMetadata.setCiManagement( new CiManagement( ciSystem, ciUrl ) ); } } { String issueUrl = columnFamilyResult.getString( "issueManagement.url" ); String issueSystem = columnFamilyResult.getString( "issueManagement.system" ); if ( StringUtils.isNotEmpty( issueSystem ) || StringUtils.isNotEmpty( issueUrl ) ) { projectVersionMetadata.setIssueManagement( new IssueManagement( issueSystem, issueUrl ) ); } } { String organizationUrl = columnFamilyResult.getString( "organization.url" ); String organizationName = columnFamilyResult.getString( "organization.name" ); if ( StringUtils.isNotEmpty( organizationUrl ) || StringUtils.isNotEmpty( organizationName ) ) { projectVersionMetadata.setOrganization( new Organization( organizationName, organizationUrl ) ); } } { String devConn = columnFamilyResult.getString( "scm.developerConnection" ); String conn = columnFamilyResult.getString( "scm.connection" ); String url = columnFamilyResult.getString( "scm.url" ); if ( StringUtils.isNotEmpty( devConn ) || StringUtils.isNotEmpty( conn ) || StringUtils.isNotEmpty( url ) ) { projectVersionMetadata.setScm( new Scm( conn, devConn, url ) ); } } projectVersionMetadata.setMailingLists( getMailingLists( key ) ); projectVersionMetadata.setLicenses( getLicenses( key ) ); projectVersionMetadata.setDependencies( getDependencies( key ) ); // facets result = HFactory // .createRangeSlicesQuery( keyspace, ss, ss, ss ) // .setColumnFamily( cassandraArchivaManager.getMetadataFacetFamilyName() ) // .setColumnNames( FACET_ID.toString(), KEY.toString(), VALUE.toString(), NAME.toString() ) // .addEqualsExpression( REPOSITORY_NAME.toString(), repoId ) // .addEqualsExpression( NAMESPACE_ID.toString(), namespace ) // .addEqualsExpression( PROJECT_ID.toString(), projectId ) // .addEqualsExpression( PROJECT_VERSION.toString(), projectVersion ) // .execute(); Map<String, Map<String, String>> metadataFacetsPerFacetIds = new HashMap<>(); for ( Row<String, String, String> row : result.get() ) { ColumnSlice<String, String> columnSlice = row.getColumnSlice(); String facetId = getStringValue( columnSlice, FACET_ID.toString() ); Map<String, String> metaValues = metadataFacetsPerFacetIds.get( facetId ); if ( metaValues == null ) { metaValues = new HashMap<>(); metadataFacetsPerFacetIds.put( facetId, metaValues ); } metaValues.put( getStringValue( columnSlice, KEY.toString() ), getStringValue( columnSlice, VALUE.toString() ) ); } if ( !metadataFacetsPerFacetIds.isEmpty() ) { for ( Map.Entry<String, Map<String, String>> entry : metadataFacetsPerFacetIds.entrySet() ) { MetadataFacetFactory metadataFacetFactory = metadataFacetFactories.get( entry.getKey() ); if ( metadataFacetFactory != null ) { MetadataFacet metadataFacet = metadataFacetFactory.createMetadataFacet(); metadataFacet.fromProperties( entry.getValue() ); projectVersionMetadata.addFacet( metadataFacet ); } } } return projectVersionMetadata; } protected void recordMailingList( String projectVersionMetadataKey, List<MailingList> mailingLists ) { if ( mailingLists == null || mailingLists.isEmpty() ) { return; } Mutator<String> mailingMutator = this.mailingListTemplate.createMutator(); for ( MailingList mailingList : mailingLists ) { // we don't care about the key as the real used one with the projectVersionMetadata String keyMailingList = UUID.randomUUID().toString(); String cfMailingList = cassandraArchivaManager.getMailingListFamilyName(); addInsertion( mailingMutator, keyMailingList, cfMailingList, "projectVersionMetadataModel.key", projectVersionMetadataKey ); addInsertion( mailingMutator, keyMailingList, cfMailingList, NAME.toString(), mailingList.getName() ); addInsertion( mailingMutator, keyMailingList, cfMailingList, "mainArchiveUrl", mailingList.getMainArchiveUrl() ); addInsertion( mailingMutator, keyMailingList, cfMailingList, "postAddress", mailingList.getPostAddress() ); addInsertion( mailingMutator, keyMailingList, cfMailingList, "subscribeAddress", mailingList.getSubscribeAddress() ); addInsertion( mailingMutator, keyMailingList, cfMailingList, "unsubscribeAddress", mailingList.getUnsubscribeAddress() ); int idx = 0; for ( String otherArchive : mailingList.getOtherArchives() ) { addInsertion( mailingMutator, keyMailingList, cfMailingList, "otherArchive." + idx, otherArchive ); idx++; } } mailingMutator.execute(); } protected void removeMailingList( String projectVersionMetadataKey ) { QueryResult<OrderedRows<String, String, String>> result = HFactory.createRangeSlicesQuery( cassandraArchivaManager.getKeyspace(), ss, ss, ss ) // .setColumnFamily( cassandraArchivaManager.getMailingListFamilyName() ) // .setColumnNames( NAME.toString() ) // .setRowCount( Integer.MAX_VALUE ) // .addEqualsExpression( "projectVersionMetadataModel.key", projectVersionMetadataKey ) // .execute(); if ( result.get().getCount() < 1 ) { return; } for ( Row<String, String, String> row : result.get() ) { this.mailingListTemplate.deleteRow( row.getKey() ); } } protected List<MailingList> getMailingLists( String projectVersionMetadataKey ) { List<MailingList> mailingLists = new ArrayList<>(); QueryResult<OrderedRows<String, String, String>> result = HFactory.createRangeSlicesQuery( cassandraArchivaManager.getKeyspace(), ss, ss, ss ) // .setColumnFamily( cassandraArchivaManager.getMailingListFamilyName() ) // .setColumnNames( NAME.toString() ) // .setRowCount( Integer.MAX_VALUE ) // .addEqualsExpression( "projectVersionMetadataModel.key", projectVersionMetadataKey ) // .execute(); for ( Row<String, String, String> row : result.get() ) { ColumnFamilyResult<String, String> columnFamilyResult = this.mailingListTemplate.queryColumns( row.getKey() ); MailingList mailingList = new MailingList(); mailingList.setName( columnFamilyResult.getString( NAME.toString() ) ); mailingList.setMainArchiveUrl( columnFamilyResult.getString( "mainArchiveUrl" ) ); mailingList.setPostAddress( columnFamilyResult.getString( "postAddress" ) ); mailingList.setSubscribeAddress( columnFamilyResult.getString( "subscribeAddress" ) ); mailingList.setUnsubscribeAddress( columnFamilyResult.getString( "unsubscribeAddress" ) ); List<String> otherArchives = new ArrayList<>(); for ( String columnName : columnFamilyResult.getColumnNames() ) { if ( StringUtils.startsWith( columnName, "otherArchive." ) ) { otherArchives.add( columnFamilyResult.getString( columnName ) ); } } mailingList.setOtherArchives( otherArchives ); mailingLists.add( mailingList ); } return mailingLists; } protected void recordLicenses( String projectVersionMetadataKey, List<License> licenses ) { if ( licenses == null || licenses.isEmpty() ) { return; } Mutator<String> licenseMutator = this.licenseTemplate.createMutator(); for ( License license : licenses ) { // we don't care about the key as the real used one with the projectVersionMetadata String keyLicense = UUID.randomUUID().toString(); String cfLicense = cassandraArchivaManager.getLicenseFamilyName(); addInsertion( licenseMutator, keyLicense, cfLicense, "projectVersionMetadataModel.key", projectVersionMetadataKey ); addInsertion( licenseMutator, keyLicense, cfLicense, NAME.toString(), license.getName() ); addInsertion( licenseMutator, keyLicense, cfLicense, URL.toString(), license.getUrl() ); } licenseMutator.execute(); } protected void removeLicenses( String projectVersionMetadataKey ) { QueryResult<OrderedRows<String, String, String>> result = HFactory.createRangeSlicesQuery( cassandraArchivaManager.getKeyspace(), ss, ss, ss ) // .setColumnFamily( cassandraArchivaManager.getLicenseFamilyName() ) // .setColumnNames( NAME.toString() ) // .setRowCount( Integer.MAX_VALUE ) // .addEqualsExpression( "projectVersionMetadataModel.key", projectVersionMetadataKey ) // .execute(); for ( Row<String, String, String> row : result.get() ) { this.licenseTemplate.deleteRow( row.getKey() ); } } protected List<License> getLicenses( String projectVersionMetadataKey ) { List<License> licenses = new ArrayList<>(); QueryResult<OrderedRows<String, String, String>> result = HFactory.createRangeSlicesQuery( cassandraArchivaManager.getKeyspace(), ss, ss, ss ) // .setColumnFamily( cassandraArchivaManager.getLicenseFamilyName() ) // .setColumnNames( "projectVersionMetadataModel.key" ) // .setRowCount( Integer.MAX_VALUE ) // .addEqualsExpression( "projectVersionMetadataModel.key", projectVersionMetadataKey ) // .execute(); for ( Row<String, String, String> row : result.get() ) { ColumnFamilyResult<String, String> columnFamilyResult = this.licenseTemplate.queryColumns( row.getKey() ); licenses.add( new License( columnFamilyResult.getString( NAME.toString() ), columnFamilyResult.getString( URL.toString() ) ) ); } return licenses; } protected void recordDependencies( String projectVersionMetadataKey, List<Dependency> dependencies, String repositoryId ) { if ( dependencies == null || dependencies.isEmpty() ) { return; } Mutator<String> dependencyMutator = this.dependencyTemplate.createMutator(); for ( Dependency dependency : dependencies ) { // we don't care about the key as the real used one with the projectVersionMetadata String keyDependency = UUID.randomUUID().toString(); String cfDependency = cassandraArchivaManager.getDependencyFamilyName(); addInsertion( dependencyMutator, keyDependency, cfDependency, "projectVersionMetadataModel.key", projectVersionMetadataKey ); addInsertion( dependencyMutator, keyDependency, cfDependency, REPOSITORY_NAME.toString(), repositoryId ); addInsertion( dependencyMutator, keyDependency, cfDependency, "classifier", dependency.getClassifier() ); addInsertion( dependencyMutator, keyDependency, cfDependency, "optional", Boolean.toString( dependency.isOptional() ) ); addInsertion( dependencyMutator, keyDependency, cfDependency, "scope", dependency.getScope() ); addInsertion( dependencyMutator, keyDependency, cfDependency, "systemPath", dependency.getSystemPath() ); addInsertion( dependencyMutator, keyDependency, cfDependency, "type", dependency.getType() ); addInsertion( dependencyMutator, keyDependency, cfDependency, ARTIFACT_ID.toString(), dependency.getArtifactId() ); addInsertion( dependencyMutator, keyDependency, cfDependency, GROUP_ID.toString(), dependency.getGroupId() ); addInsertion( dependencyMutator, keyDependency, cfDependency, VERSION.toString(), dependency.getVersion() ); } dependencyMutator.execute(); } protected void removeDependencies( String projectVersionMetadataKey ) { QueryResult<OrderedRows<String, String, String>> result = HFactory.createRangeSlicesQuery( cassandraArchivaManager.getKeyspace(), ss, ss, ss ) // .setColumnFamily( cassandraArchivaManager.getDependencyFamilyName() ) // .setColumnNames( GROUP_ID.toString() ) // .setRowCount( Integer.MAX_VALUE ) // .addEqualsExpression( "projectVersionMetadataModel.key", projectVersionMetadataKey ) // .execute(); for ( Row<String, String, String> row : result.get() ) { this.dependencyTemplate.deleteRow( row.getKey() ); } } protected List<Dependency> getDependencies( String projectVersionMetadataKey ) { List<Dependency> dependencies = new ArrayList<>(); QueryResult<OrderedRows<String, String, String>> result = HFactory.createRangeSlicesQuery( cassandraArchivaManager.getKeyspace(), ss, ss, ss ) // .setColumnFamily( cassandraArchivaManager.getDependencyFamilyName() ) // .setColumnNames( "projectVersionMetadataModel.key" ) // .setRowCount( Integer.MAX_VALUE ) // .addEqualsExpression( "projectVersionMetadataModel.key", projectVersionMetadataKey ) // .execute(); for ( Row<String, String, String> row : result.get() ) { ColumnFamilyResult<String, String> columnFamilyResult = this.dependencyTemplate.queryColumns( row.getKey() ); Dependency dependency = new Dependency(); dependency.setClassifier( columnFamilyResult.getString( "classifier" ) ); dependency.setOptional( Boolean.parseBoolean( columnFamilyResult.getString( "optional" ) ) ); dependency.setScope( columnFamilyResult.getString( "scope" ) ); dependency.setSystemPath( columnFamilyResult.getString( "systemPath" ) ); dependency.setType( columnFamilyResult.getString( "type" ) ); dependency.setArtifactId( columnFamilyResult.getString( ARTIFACT_ID.toString() ) ); dependency.setGroupId( columnFamilyResult.getString( GROUP_ID.toString() ) ); dependency.setVersion( columnFamilyResult.getString( VERSION.toString() ) ); dependencies.add( dependency ); } return dependencies; } @Override public void updateArtifact( String repositoryId, String namespaceId, String projectId, String projectVersion, ArtifactMetadata artifactMeta ) throws MetadataRepositoryException { Namespace namespace = getNamespace( repositoryId, namespaceId ); if ( namespace == null ) { namespace = updateOrAddNamespace( repositoryId, namespaceId ); } ProjectMetadata projectMetadata = new ProjectMetadata(); projectMetadata.setId( projectId ); projectMetadata.setNamespace( namespaceId ); updateProject( repositoryId, projectMetadata ); String key = new ArtifactMetadataModel.KeyBuilder().withNamespace( namespace ).withProject( projectId ).withId( artifactMeta.getId() ).withProjectVersion( projectVersion ).build(); // exists? boolean exists = this.artifactMetadataTemplate.isColumnsExist( key ); if ( exists ) { // updater ColumnFamilyUpdater<String, String> updater = this.artifactMetadataTemplate.createUpdater( key ); updater.setLong( FILE_LAST_MODIFIED.toString(), artifactMeta.getFileLastModified().getTime() ); updater.setLong( WHEN_GATHERED.toString(), artifactMeta.getWhenGathered().getTime() ); updater.setLong( SIZE.toString(), artifactMeta.getSize() ); addUpdateStringValue( updater, MD5.toString(), artifactMeta.getMd5() ); addUpdateStringValue( updater, SHA1.toString(), artifactMeta.getSha1() ); addUpdateStringValue( updater, VERSION.toString(), artifactMeta.getVersion() ); this.artifactMetadataTemplate.update( updater ); } else { String cf = this.cassandraArchivaManager.getArtifactMetadataFamilyName(); // create this.artifactMetadataTemplate.createMutator() // .addInsertion( key, cf, column( ID.toString(), artifactMeta.getId() ) )// .addInsertion( key, cf, column( REPOSITORY_NAME.toString(), repositoryId ) ) // .addInsertion( key, cf, column( NAMESPACE_ID.toString(), namespaceId ) ) // .addInsertion( key, cf, column( PROJECT.toString(), artifactMeta.getProject() ) ) // .addInsertion( key, cf, column( PROJECT_VERSION.toString(), projectVersion ) ) // .addInsertion( key, cf, column( VERSION.toString(), artifactMeta.getVersion() ) ) // .addInsertion( key, cf, column( FILE_LAST_MODIFIED.toString(), artifactMeta.getFileLastModified().getTime() ) ) // .addInsertion( key, cf, column( SIZE.toString(), artifactMeta.getSize() ) ) // .addInsertion( key, cf, column( MD5.toString(), artifactMeta.getMd5() ) ) // .addInsertion( key, cf, column( SHA1.toString(), artifactMeta.getSha1() ) ) // .addInsertion( key, cf, column( WHEN_GATHERED.toString(), artifactMeta.getWhenGathered().getTime() ) )// .execute(); } key = new ProjectVersionMetadataModel.KeyBuilder() // .withRepository( repositoryId ) // .withNamespace( namespace ) // .withProjectId( projectId ) // .withProjectVersion( projectVersion ) // .withId( artifactMeta.getId() ) // .build(); QueryResult<OrderedRows<String, String, String>> result = HFactory // .createRangeSlicesQuery( keyspace, ss, ss, ss ) // .setColumnFamily( cassandraArchivaManager.getProjectVersionMetadataFamilyName() ) // .setColumnNames( VERSION.toString() ) // .addEqualsExpression( REPOSITORY_NAME.toString(), repositoryId ) // .addEqualsExpression( NAMESPACE_ID.toString(), namespaceId ) // .addEqualsExpression( PROJECT_ID.toString(), projectId ) // .addEqualsExpression( PROJECT_VERSION.toString(), projectVersion ) // .addEqualsExpression( VERSION.toString(), artifactMeta.getVersion() ) // .execute(); exists = result.get().getCount() > 0; if ( !exists ) { String cf = this.cassandraArchivaManager.getProjectVersionMetadataFamilyName(); projectVersionMetadataTemplate.createMutator() // .addInsertion( key, cf, column( NAMESPACE_ID.toString(), namespace.getName() ) ) // .addInsertion( key, cf, column( REPOSITORY_NAME.toString(), repositoryId ) ) // .addInsertion( key, cf, column( PROJECT_VERSION.toString(), projectVersion ) ) // .addInsertion( key, cf, column( PROJECT_ID.toString(), projectId ) ) // .addInsertion( key, cf, column( VERSION.toString(), artifactMeta.getVersion() ) ) // .execute(); } ArtifactMetadataModel artifactMetadataModel = new ArtifactMetadataModel(); artifactMetadataModel.setRepositoryId( repositoryId ); artifactMetadataModel.setNamespace( namespaceId ); artifactMetadataModel.setProject( projectId ); artifactMetadataModel.setProjectVersion( projectVersion ); artifactMetadataModel.setVersion( artifactMeta.getVersion() ); artifactMetadataModel.setFileLastModified( artifactMeta.getFileLastModified() == null ? new Date().getTime() : artifactMeta.getFileLastModified().getTime() ); // now facets updateFacets( artifactMeta, artifactMetadataModel ); } @Override public Collection<String> getArtifactVersions( final String repoId, final String namespace, final String projectId, final String projectVersion ) throws MetadataResolutionException { QueryResult<OrderedRows<String, String, String>> result = HFactory // .createRangeSlicesQuery( keyspace, ss, ss, ss ) // .setColumnFamily( cassandraArchivaManager.getProjectVersionMetadataFamilyName() ) // .setColumnNames( VERSION.toString() ) // .addEqualsExpression( REPOSITORY_NAME.toString(), repoId ) // .addEqualsExpression( NAMESPACE_ID.toString(), namespace ) // .addEqualsExpression( PROJECT_ID.toString(), projectId ) // .addEqualsExpression( PROJECT_VERSION.toString(), projectVersion ) // .execute(); final Set<String> versions = new HashSet<String>(); for ( Row<String, String, String> row : result.get() ) { versions.add( getStringValue( row.getColumnSlice(), VERSION.toString() ) ); } return versions; } /** * iterate over available facets to remove/add from the artifactMetadata * * @param facetedMetadata * @param artifactMetadataModel only use for the key */ private void updateFacets( final FacetedMetadata facetedMetadata, final ArtifactMetadataModel artifactMetadataModel ) { String cf = cassandraArchivaManager.getMetadataFacetFamilyName(); for ( final String facetId : metadataFacetFactories.keySet() ) { MetadataFacet metadataFacet = facetedMetadata.getFacet( facetId ); if ( metadataFacet == null ) { continue; } // clean first QueryResult<OrderedRows<String, String, String>> result = HFactory.createRangeSlicesQuery( keyspace, ss, ss, ss ) // .setColumnFamily( cf ) // .setColumnNames( REPOSITORY_NAME.toString() ) // .addEqualsExpression( REPOSITORY_NAME.toString(), artifactMetadataModel.getRepositoryId() ) // .addEqualsExpression( NAMESPACE_ID.toString(), artifactMetadataModel.getNamespace() ) // .addEqualsExpression( PROJECT_ID.toString(), artifactMetadataModel.getProject() ) // .addEqualsExpression( PROJECT_VERSION.toString(), artifactMetadataModel.getProjectVersion() ) // .addEqualsExpression( FACET_ID.toString(), facetId ) // .execute(); for ( Row<String, String, String> row : result.get().getList() ) { this.metadataFacetTemplate.deleteRow( row.getKey() ); } Map<String, String> properties = metadataFacet.toProperties(); for ( Map.Entry<String, String> entry : properties.entrySet() ) { String key = new MetadataFacetModel.KeyBuilder().withKey( entry.getKey() ).withArtifactMetadataModel( artifactMetadataModel ).withFacetId( facetId ).withName( metadataFacet.getName() ).build(); Mutator<String> mutator = metadataFacetTemplate.createMutator() // .addInsertion( key, cf, column( REPOSITORY_NAME.toString(), artifactMetadataModel.getRepositoryId() ) ) // .addInsertion( key, cf, column( NAMESPACE_ID.toString(), artifactMetadataModel.getNamespace() ) ) // .addInsertion( key, cf, column( PROJECT_ID.toString(), artifactMetadataModel.getProject() ) ) // .addInsertion( key, cf, column( PROJECT_VERSION.toString(), artifactMetadataModel.getProjectVersion() ) ) // .addInsertion( key, cf, column( FACET_ID.toString(), facetId ) ) // .addInsertion( key, cf, column( KEY.toString(), entry.getKey() ) ) // .addInsertion( key, cf, column( VALUE.toString(), entry.getValue() ) ); if ( metadataFacet.getName() != null ) { mutator.addInsertion( key, cf, column( NAME.toString(), metadataFacet.getName() ) ); } mutator.execute(); } } } @Override public List<String> getMetadataFacets( final String repositoryId, final String facetId ) throws MetadataRepositoryException { QueryResult<OrderedRows<String, String, String>> result = HFactory // .createRangeSlicesQuery( keyspace, ss, ss, ss ) // .setColumnFamily( cassandraArchivaManager.getMetadataFacetFamilyName() ) // .setColumnNames( NAME.toString() ) // .addEqualsExpression( REPOSITORY_NAME.toString(), repositoryId ) // .addEqualsExpression( FACET_ID.toString(), facetId ) // .execute(); final List<String> facets = new ArrayList<>(); for ( Row<String, String, String> row : result.get() ) { facets.add( getStringValue( row.getColumnSlice(), NAME.toString() ) ); } return facets; } @Override public boolean hasMetadataFacet( String repositoryId, String facetId ) throws MetadataRepositoryException { return !getMetadataFacets( repositoryId, facetId ).isEmpty(); } @Override public MetadataFacet getMetadataFacet( final String repositoryId, final String facetId, final String name ) throws MetadataRepositoryException { MetadataFacetFactory metadataFacetFactory = metadataFacetFactories.get( facetId ); if ( metadataFacetFactory == null ) { return null; } QueryResult<OrderedRows<String, String, String>> result = HFactory // .createRangeSlicesQuery( keyspace, ss, ss, ss ) // .setColumnFamily( cassandraArchivaManager.getMetadataFacetFamilyName() ) // .setColumnNames( KEY.toString(), VALUE.toString() ) // .addEqualsExpression( REPOSITORY_NAME.toString(), repositoryId ) // .addEqualsExpression( FACET_ID.toString(), facetId ) // .addEqualsExpression( NAME.toString(), name ) // .execute(); MetadataFacet metadataFacet = metadataFacetFactory.createMetadataFacet( repositoryId, name ); int size = result.get().getCount(); if ( size < 1 ) { return null; } Map<String, String> map = new HashMap<>( size ); for ( Row<String, String, String> row : result.get() ) { ColumnSlice<String, String> columnSlice = row.getColumnSlice(); map.put( getStringValue( columnSlice, KEY.toString() ), getStringValue( columnSlice, VALUE.toString() ) ); } metadataFacet.fromProperties( map ); return metadataFacet; } @Override public void addMetadataFacet( String repositoryId, MetadataFacet metadataFacet ) throws MetadataRepositoryException { if ( metadataFacet == null ) { return; } if ( metadataFacet.toProperties().isEmpty() ) { String key = new MetadataFacetModel.KeyBuilder().withRepositoryId( repositoryId ).withFacetId( metadataFacet.getFacetId() ).withName( metadataFacet.getName() ).build(); boolean exists = this.metadataFacetTemplate.isColumnsExist( key ); if ( exists ) { ColumnFamilyUpdater<String, String> updater = this.metadataFacetTemplate.createUpdater( key ); addUpdateStringValue( updater, FACET_ID.toString(), metadataFacet.getFacetId() ); addUpdateStringValue( updater, NAME.toString(), metadataFacet.getName() ); this.metadataFacetTemplate.update( updater ); } else { String cf = this.cassandraArchivaManager.getMetadataFacetFamilyName(); this.metadataFacetTemplate.createMutator() // .addInsertion( key, cf, column( REPOSITORY_NAME.toString(), repositoryId ) ) // .addInsertion( key, cf, column( FACET_ID.toString(), metadataFacet.getFacetId() ) ) // .addInsertion( key, cf, column( NAME.toString(), metadataFacet.getName() ) ) // .execute(); } } else { for ( Map.Entry<String, String> entry : metadataFacet.toProperties().entrySet() ) { String key = new MetadataFacetModel.KeyBuilder().withRepositoryId( repositoryId ).withFacetId( metadataFacet.getFacetId() ).withName( metadataFacet.getName() ).withKey( entry.getKey() ).build(); boolean exists = this.metadataFacetTemplate.isColumnsExist( key ); if ( !exists ) { String cf = this.cassandraArchivaManager.getMetadataFacetFamilyName(); this.metadataFacetTemplate.createMutator() // .addInsertion( key, cf, column( REPOSITORY_NAME.toString(), repositoryId ) ) // .addInsertion( key, cf, column( FACET_ID.toString(), metadataFacet.getFacetId() ) ) // .addInsertion( key, cf, column( NAME.toString(), metadataFacet.getName() ) ) // .addInsertion( key, cf, column( KEY.toString(), entry.getKey() ) ) // .addInsertion( key, cf, column( VALUE.toString(), entry.getValue() ) ) // .execute(); } else { ColumnFamilyUpdater<String, String> updater = this.metadataFacetTemplate.createUpdater( key ); addUpdateStringValue( updater, VALUE.toString(), entry.getValue() ); this.metadataFacetTemplate.update( updater ); } } } } @Override public void removeMetadataFacets( final String repositoryId, final String facetId ) throws MetadataRepositoryException { QueryResult<OrderedRows<String, String, String>> result = HFactory // .createRangeSlicesQuery( keyspace, ss, ss, ss ) // .setColumnFamily( cassandraArchivaManager.getMetadataFacetFamilyName() ) // .setColumnNames( KEY.toString(), VALUE.toString() ) // .addEqualsExpression( REPOSITORY_NAME.toString(), repositoryId ) // .addEqualsExpression( FACET_ID.toString(), facetId ) // .execute(); for ( Row<String, String, String> row : result.get() ) { this.metadataFacetTemplate.deleteRow( row.getKey() ); } } @Override public void removeMetadataFacet( final String repositoryId, final String facetId, final String name ) throws MetadataRepositoryException { QueryResult<OrderedRows<String, String, String>> result = HFactory // .createRangeSlicesQuery( keyspace, ss, ss, ss ) // .setColumnFamily( cassandraArchivaManager.getMetadataFacetFamilyName() ) // .setColumnNames( KEY.toString(), VALUE.toString() ) // .addEqualsExpression( REPOSITORY_NAME.toString(), repositoryId ) // .addEqualsExpression( FACET_ID.toString(), facetId ) // .addEqualsExpression( NAME.toString(), name ) // .execute(); for ( Row<String, String, String> row : result.get() ) { this.metadataFacetTemplate.deleteRow( row.getKey() ); } } @Override public List<ArtifactMetadata> getArtifactsByDateRange( final String repositoryId, final Date startTime, final Date endTime ) throws MetadataRepositoryException { LongSerializer ls = LongSerializer.get(); RangeSlicesQuery<String, String, Long> query = HFactory // .createRangeSlicesQuery( keyspace, ss, ss, ls ) // .setColumnFamily( cassandraArchivaManager.getArtifactMetadataFamilyName() ) // .setColumnNames( ArtifactMetadataModel.COLUMNS ); // if ( startTime != null ) { query = query.addGteExpression( WHEN_GATHERED.toString(), startTime.getTime() ); } if ( endTime != null ) { query = query.addLteExpression( WHEN_GATHERED.toString(), endTime.getTime() ); } QueryResult<OrderedRows<String, String, Long>> result = query.execute(); List<ArtifactMetadata> artifactMetadatas = new ArrayList<>( result.get().getCount() ); for ( Row<String, String, Long> row : result.get() ) { ColumnSlice<String, Long> columnSlice = row.getColumnSlice(); String repositoryName = getAsStringValue( columnSlice, REPOSITORY_NAME.toString() ); if ( StringUtils.equals( repositoryName, repositoryId ) ) { artifactMetadatas.add( mapArtifactMetadataLongColumnSlice( columnSlice ) ); } } return artifactMetadatas; } protected ArtifactMetadata mapArtifactMetadataLongColumnSlice( ColumnSlice<String, Long> columnSlice ) { ArtifactMetadata artifactMetadata = new ArtifactMetadata(); artifactMetadata.setNamespace( getAsStringValue( columnSlice, NAMESPACE_ID.toString() ) ); artifactMetadata.setSize( getLongValue( columnSlice, SIZE.toString() ) ); artifactMetadata.setId( getAsStringValue( columnSlice, ID.toString() ) ); artifactMetadata.setFileLastModified( getLongValue( columnSlice, FILE_LAST_MODIFIED.toString() ) ); artifactMetadata.setMd5( getAsStringValue( columnSlice, MD5.toString() ) ); artifactMetadata.setProject( getAsStringValue( columnSlice, PROJECT.toString() ) ); artifactMetadata.setProjectVersion( getAsStringValue( columnSlice, PROJECT_VERSION.toString() ) ); artifactMetadata.setRepositoryId( getAsStringValue( columnSlice, REPOSITORY_NAME.toString() ) ); artifactMetadata.setSha1( getAsStringValue( columnSlice, SHA1.toString() ) ); artifactMetadata.setVersion( getAsStringValue( columnSlice, VERSION.toString() ) ); Long whenGathered = getLongValue( columnSlice, WHEN_GATHERED.toString() ); if ( whenGathered != null ) { artifactMetadata.setWhenGathered( new Date( whenGathered ) ); } return artifactMetadata; } protected ArtifactMetadata mapArtifactMetadataStringColumnSlice( ColumnSlice<String, String> columnSlice ) { ArtifactMetadata artifactMetadata = new ArtifactMetadata(); artifactMetadata.setNamespace( getStringValue( columnSlice, NAMESPACE_ID.toString() ) ); artifactMetadata.setSize( getAsLongValue( columnSlice, SIZE.toString() ) ); artifactMetadata.setId( getStringValue( columnSlice, ID.toString() ) ); artifactMetadata.setFileLastModified( getAsLongValue( columnSlice, FILE_LAST_MODIFIED.toString() ) ); artifactMetadata.setMd5( getStringValue( columnSlice, MD5.toString() ) ); artifactMetadata.setProject( getStringValue( columnSlice, PROJECT.toString() ) ); artifactMetadata.setProjectVersion( getStringValue( columnSlice, PROJECT_VERSION.toString() ) ); artifactMetadata.setRepositoryId( getStringValue( columnSlice, REPOSITORY_NAME.toString() ) ); artifactMetadata.setSha1( getStringValue( columnSlice, SHA1.toString() ) ); artifactMetadata.setVersion( getStringValue( columnSlice, VERSION.toString() ) ); Long whenGathered = getAsLongValue( columnSlice, WHEN_GATHERED.toString() ); if ( whenGathered != null ) { artifactMetadata.setWhenGathered( new Date( whenGathered ) ); } return artifactMetadata; } @Override public Collection<ArtifactMetadata> getArtifactsByChecksum( final String repositoryId, final String checksum ) throws MetadataRepositoryException { // cql cannot run or in queries so running twice the query Map<String, ArtifactMetadata> artifactMetadataMap = new HashMap<>(); RangeSlicesQuery<String, String, String> query = HFactory // .createRangeSlicesQuery( keyspace, ss, ss, ss ) // .setColumnFamily( cassandraArchivaManager.getArtifactMetadataFamilyName() ) // .setColumnNames( ArtifactMetadataModel.COLUMNS ); // query = query.addEqualsExpression( SHA1.toString(), checksum ).addEqualsExpression( REPOSITORY_NAME.toString(), repositoryId ); QueryResult<OrderedRows<String, String, String>> result = query.execute(); for ( Row<String, String, String> row : result.get() ) { ColumnSlice<String, String> columnSlice = row.getColumnSlice(); artifactMetadataMap.put( row.getKey(), mapArtifactMetadataStringColumnSlice( columnSlice ) ); } query = HFactory // .createRangeSlicesQuery( keyspace, ss, ss, ss ) // .setColumnFamily( cassandraArchivaManager.getArtifactMetadataFamilyName() ) // .setColumnNames( NAMESPACE_ID.toString(), SIZE.toString(), ID.toString(), FILE_LAST_MODIFIED.toString(), MD5.toString(), PROJECT.toString(), PROJECT_VERSION.toString(), REPOSITORY_NAME.toString(), VERSION.toString(), WHEN_GATHERED.toString(), SHA1.toString() ); // query = query.addEqualsExpression( MD5.toString(), checksum ).addEqualsExpression( REPOSITORY_NAME.toString(), repositoryId ); result = query.execute(); for ( Row<String, String, String> row : result.get() ) { ColumnSlice<String, String> columnSlice = row.getColumnSlice(); artifactMetadataMap.put( row.getKey(), mapArtifactMetadataStringColumnSlice( columnSlice ) ); } return artifactMetadataMap.values(); } /** * Project version and artifact level metadata are stored in the same place, no distinctions in Cassandra * implementation, just calls {@link #getArtifactsByMetadata(String, String, String)} */ @Override public List<ArtifactMetadata> getArtifactsByProjectVersionMetadata( String key, String value, String repositoryId ) throws MetadataRepositoryException { return getArtifactsByMetadata( key, value, repositoryId ); } @Override public List<ArtifactMetadata> getArtifactsByMetadata( String key, String value, String repositoryId ) throws MetadataRepositoryException { RangeSlicesQuery<String, String, String> query = HFactory.createRangeSlicesQuery( keyspace, ss, ss, ss ) // .setColumnFamily( cassandraArchivaManager.getMetadataFacetFamilyName() ) // .setColumnNames( MetadataFacetModel.COLUMNS ) // .addEqualsExpression( VALUE.toString(), value ); if ( key != null ) { query.addEqualsExpression( KEY.toString(), key ); // } if ( repositoryId != null ) { query.addEqualsExpression( "repositoryName", repositoryId ); } QueryResult<OrderedRows<String, String, String>> metadataFacetResult = query.execute(); if ( metadataFacetResult.get() == null || metadataFacetResult.get().getCount() < 1 ) { return Collections.emptyList(); } List<ArtifactMetadata> artifactMetadatas = new LinkedList<ArtifactMetadata>(); // TODO doing multiple queries, there should be a way to get all the artifactMetadatas for any number of // projects for ( Row<String, String, String> row : metadataFacetResult.get() ) { QueryResult<OrderedRows<String, String, String>> artifactMetadataResult = HFactory.createRangeSlicesQuery( keyspace, ss, ss, ss ) // .setColumnFamily( cassandraArchivaManager.getArtifactMetadataFamilyName() ) // .setColumnNames( ArtifactMetadataModel.COLUMNS ) // .setRowCount( Integer.MAX_VALUE ) // .addEqualsExpression( REPOSITORY_NAME.toString(), getStringValue( row.getColumnSlice(), REPOSITORY_NAME ) ) // .addEqualsExpression( NAMESPACE_ID.toString(), getStringValue( row.getColumnSlice(), NAMESPACE_ID ) ) // .addEqualsExpression( PROJECT.toString(), getStringValue( row.getColumnSlice(), PROJECT_ID ) ) // .addEqualsExpression( PROJECT_VERSION.toString(), getStringValue( row.getColumnSlice(), PROJECT_VERSION ) ) // .execute(); if ( artifactMetadataResult.get() == null || artifactMetadataResult.get().getCount() < 1 ) { return Collections.emptyList(); } for ( Row<String, String, String> artifactMetadataRow : artifactMetadataResult.get() ) { artifactMetadatas.add( mapArtifactMetadataStringColumnSlice( artifactMetadataRow.getColumnSlice() ) ); } } return mapArtifactMetadataToArtifact( metadataFacetResult, artifactMetadatas ); } @Override public List<ArtifactMetadata> getArtifactsByProperty( String key, String value, String repositoryId ) throws MetadataRepositoryException { QueryResult<OrderedRows<String, String, String>> result = HFactory.createRangeSlicesQuery( keyspace, ss, ss, ss ) // .setColumnFamily( cassandraArchivaManager.getProjectVersionMetadataFamilyName() ) // .setColumnNames( PROJECT_ID.toString(), REPOSITORY_NAME.toString(), NAMESPACE_ID.toString(), PROJECT_VERSION.toString() ) // .addEqualsExpression( key, value ) // .execute(); int count = result.get().getCount(); if ( count < 1 ) { return Collections.emptyList(); } List<ArtifactMetadata> artifacts = new LinkedList<ArtifactMetadata>(); for ( Row<String, String, String> row : result.get() ) { // TODO doing multiple queries, there should be a way to get all the artifactMetadatas for any number of // projects try { artifacts.addAll( getArtifacts( getStringValue( row.getColumnSlice(), REPOSITORY_NAME ), getStringValue( row.getColumnSlice(), NAMESPACE_ID ), getStringValue( row.getColumnSlice(), PROJECT_ID ), getStringValue( row.getColumnSlice(), PROJECT_VERSION ) ) ); } catch ( MetadataResolutionException e ) { // never raised throw new IllegalStateException( e ); } } return artifacts; } @Override public void removeArtifact( final String repositoryId, final String namespace, final String project, final String version, final String id ) throws MetadataRepositoryException { logger.debug( "removeArtifact repositoryId: '{}', namespace: '{}', project: '{}', version: '{}', id: '{}'", repositoryId, namespace, project, version, id ); String key = new ArtifactMetadataModel.KeyBuilder().withRepositoryId( repositoryId ).withNamespace( namespace ).withId( id ).withProjectVersion( version ).withProject( project ).build(); this.artifactMetadataTemplate.deleteRow( key ); key = new ProjectVersionMetadataModel.KeyBuilder() // .withRepository( repositoryId ) // .withNamespace( namespace ) // .withProjectId( project ) // .withProjectVersion( version ) // .withId( id ) // .build(); this.projectVersionMetadataTemplate.deleteRow( key ); } @Override public void removeArtifact( ArtifactMetadata artifactMetadata, String baseVersion ) throws MetadataRepositoryException { logger.debug( "removeArtifact repositoryId: '{}', namespace: '{}', project: '{}', version: '{}', id: '{}'", artifactMetadata.getRepositoryId(), artifactMetadata.getNamespace(), artifactMetadata.getProject(), baseVersion, artifactMetadata.getId() ); String key = new ArtifactMetadataModel.KeyBuilder().withRepositoryId( artifactMetadata.getRepositoryId() ).withNamespace( artifactMetadata.getNamespace() ).withId( artifactMetadata.getId() ).withProjectVersion( baseVersion ).withProject( artifactMetadata.getProject() ).build(); this.artifactMetadataTemplate.deleteRow( key ); } @Override public void removeArtifact( final String repositoryId, final String namespace, final String project, final String version, final MetadataFacet metadataFacet ) throws MetadataRepositoryException { RangeSlicesQuery<String, String, String> query = HFactory // .createRangeSlicesQuery( keyspace, ss, ss, ss ) // .setColumnFamily( cassandraArchivaManager.getArtifactMetadataFamilyName() ) // .setColumnNames( NAMESPACE_ID.toString() ); // query = query.addEqualsExpression( REPOSITORY_NAME.toString(), repositoryId ) // .addEqualsExpression( NAMESPACE_ID.toString(), namespace ) // .addEqualsExpression( PROJECT.toString(), project ) // .addEqualsExpression( VERSION.toString(), version ); QueryResult<OrderedRows<String, String, String>> result = query.execute(); for ( Row<String, String, String> row : result.get() ) { this.artifactMetadataTemplate.deleteRow( row.getKey() ); } } @Override public List<ArtifactMetadata> getArtifacts( final String repositoryId ) throws MetadataRepositoryException { RangeSlicesQuery<String, String, String> query = HFactory // .createRangeSlicesQuery( keyspace, ss, ss, ss ) // .setColumnFamily( cassandraArchivaManager.getArtifactMetadataFamilyName() ) // .setColumnNames( ArtifactMetadataModel.COLUMNS ); // query = query.addEqualsExpression( REPOSITORY_NAME.toString(), repositoryId ); QueryResult<OrderedRows<String, String, String>> result = query.execute(); List<ArtifactMetadata> artifactMetadatas = new ArrayList<>( result.get().getCount() ); for ( Row<String, String, String> row : result.get() ) { ColumnSlice<String, String> columnSlice = row.getColumnSlice(); artifactMetadatas.add( mapArtifactMetadataStringColumnSlice( columnSlice ) ); } return artifactMetadatas; } @Override public Collection<ProjectVersionReference> getProjectReferences( String repoId, String namespace, String projectId, String projectVersion ) throws MetadataResolutionException { QueryResult<OrderedRows<String, String, String>> result = HFactory // .createRangeSlicesQuery( keyspace, ss, ss, ss ) // .setColumnFamily( cassandraArchivaManager.getDependencyFamilyName() ) // .setColumnNames( "projectVersionMetadataModel.key" ) // .addEqualsExpression( REPOSITORY_NAME.toString(), repoId ) // .addEqualsExpression( GROUP_ID.toString(), namespace ) // .addEqualsExpression( ARTIFACT_ID.toString(), projectId ) // .addEqualsExpression( VERSION.toString(), projectVersion ) // .execute(); List<String> dependenciesIds = new ArrayList<>( result.get().getCount() ); for ( Row<String, String, String> row : result.get().getList() ) { dependenciesIds.add( getStringValue( row.getColumnSlice(), "projectVersionMetadataModel.key" ) ); } List<ProjectVersionReference> references = new ArrayList<>( result.get().getCount() ); for ( String key : dependenciesIds ) { ColumnFamilyResult<String, String> columnFamilyResult = this.projectVersionMetadataTemplate.queryColumns( key ); references.add( new ProjectVersionReference( ProjectVersionReference.ReferenceType.DEPENDENCY, // columnFamilyResult.getString( PROJECT_ID.toString() ), // columnFamilyResult.getString( NAMESPACE_ID.toString() ), // columnFamilyResult.getString( PROJECT_VERSION.toString() ) ) ); } return references; } @Override public void removeProjectVersion( final String repoId, final String namespace, final String projectId, final String projectVersion ) throws MetadataRepositoryException { QueryResult<OrderedRows<String, String, String>> result = HFactory // .createRangeSlicesQuery( keyspace, ss, ss, ss ) // .setColumnFamily( cassandraArchivaManager.getProjectVersionMetadataFamilyName() ) // .setColumnNames( VERSION.toString() ) // .addEqualsExpression( REPOSITORY_NAME.toString(), repoId ) // .addEqualsExpression( NAMESPACE_ID.toString(), namespace ) // .addEqualsExpression( PROJECT_ID.toString(), projectId ) // .addEqualsExpression( PROJECT_VERSION.toString(), projectVersion ) // .execute(); for ( Row<String, String, String> row : result.get().getList() ) { this.projectVersionMetadataTemplate.deleteRow( row.getKey() ); removeMailingList( row.getKey() ); removeLicenses( row.getKey() ); removeDependencies( row.getKey() ); } RangeSlicesQuery<String, String, String> query = HFactory // .createRangeSlicesQuery( keyspace, ss, ss, ss ) // .setColumnFamily( cassandraArchivaManager.getArtifactMetadataFamilyName() ) // .setColumnNames( NAMESPACE_ID.toString() ); // query = query.addEqualsExpression( REPOSITORY_NAME.toString(), repoId ) // .addEqualsExpression( NAMESPACE_ID.toString(), namespace ) // .addEqualsExpression( PROJECT.toString(), projectId ) // .addEqualsExpression( PROJECT_VERSION.toString(), projectVersion ); result = query.execute(); for ( Row<String, String, String> row : result.get() ) { this.artifactMetadataTemplate.deleteRow( row.getKey() ); } } @Override public Collection<ArtifactMetadata> getArtifacts( final String repoId, final String namespace, final String projectId, final String projectVersion ) throws MetadataResolutionException { QueryResult<OrderedRows<String, String, String>> result = HFactory.createRangeSlicesQuery( keyspace, ss, ss, ss ) // .setColumnFamily( cassandraArchivaManager.getArtifactMetadataFamilyName() ) // .setColumnNames( ArtifactMetadataModel.COLUMNS )// .setRowCount( Integer.MAX_VALUE ) // .addEqualsExpression( REPOSITORY_NAME.toString(), repoId ) // .addEqualsExpression( NAMESPACE_ID.toString(), namespace ) // .addEqualsExpression( PROJECT.toString(), projectId ) // .addEqualsExpression( PROJECT_VERSION.toString(), projectVersion ) // .execute(); if ( result.get() == null || result.get().getCount() < 1 ) { return Collections.emptyList(); } List<ArtifactMetadata> artifactMetadatas = new ArrayList<>( result.get().getCount() ); for ( Row<String, String, String> row : result.get() ) { artifactMetadatas.add( mapArtifactMetadataStringColumnSlice( row.getColumnSlice() ) ); } result = HFactory.createRangeSlicesQuery( keyspace, ss, ss, ss ) // .setColumnFamily( cassandraArchivaManager.getMetadataFacetFamilyName() ) // .setColumnNames( MetadataFacetModel.COLUMNS ) // .setRowCount( Integer.MAX_VALUE ) // .addEqualsExpression( REPOSITORY_NAME.toString(), repoId ) // .addEqualsExpression( NAMESPACE_ID.toString(), namespace ) // .addEqualsExpression( PROJECT_ID.toString(), projectId ) // .addEqualsExpression( PROJECT_VERSION.toString(), projectVersion ) // .execute(); return mapArtifactMetadataToArtifact(result, artifactMetadatas); } /** * Attach metadata to each of the ArtifactMetadata objects */ private List<ArtifactMetadata> mapArtifactMetadataToArtifact(QueryResult<OrderedRows<String, String, String>> result, List<ArtifactMetadata> artifactMetadatas) { if ( result.get() == null || result.get().getCount() < 1 ) { return artifactMetadatas; } final List<MetadataFacetModel> metadataFacetModels = new ArrayList<>( result.get().getCount() ); for ( Row<String, String, String> row : result.get() ) { ColumnSlice<String, String> columnSlice = row.getColumnSlice(); MetadataFacetModel metadataFacetModel = new MetadataFacetModel(); metadataFacetModel.setFacetId( getStringValue( columnSlice, FACET_ID.toString() ) ); metadataFacetModel.setName( getStringValue( columnSlice, NAME.toString() ) ); metadataFacetModel.setValue( getStringValue( columnSlice, VALUE.toString() ) ); metadataFacetModel.setKey( getStringValue( columnSlice, KEY.toString() ) ); metadataFacetModel.setProjectVersion( getStringValue( columnSlice, PROJECT_VERSION.toString() ) ); metadataFacetModels.add( metadataFacetModel ); } // rebuild MetadataFacet for artifacts for ( final ArtifactMetadata artifactMetadata : artifactMetadatas ) { Iterable<MetadataFacetModel> metadataFacetModelIterable = Iterables.filter( metadataFacetModels, new Predicate<MetadataFacetModel>() { @Override public boolean apply( MetadataFacetModel metadataFacetModel ) { if ( metadataFacetModel != null ) { return StringUtils.equals( artifactMetadata.getVersion(), metadataFacetModel.getProjectVersion() ); } return false; } } ); Iterator<MetadataFacetModel> iterator = metadataFacetModelIterable.iterator(); Map<String, List<MetadataFacetModel>> metadataFacetValuesPerFacetId = new HashMap<>(); while ( iterator.hasNext() ) { MetadataFacetModel metadataFacetModel = iterator.next(); List<MetadataFacetModel> values = metadataFacetValuesPerFacetId.get( metadataFacetModel.getName() ); if ( values == null ) { values = new ArrayList<>(); metadataFacetValuesPerFacetId.put( metadataFacetModel.getFacetId(), values ); } values.add( metadataFacetModel ); } for ( Map.Entry<String, List<MetadataFacetModel>> entry : metadataFacetValuesPerFacetId.entrySet() ) { MetadataFacetFactory metadataFacetFactory = metadataFacetFactories.get( entry.getKey() ); if ( metadataFacetFactory != null ) { List<MetadataFacetModel> facetModels = entry.getValue(); if ( !facetModels.isEmpty() ) { MetadataFacet metadataFacet = metadataFacetFactory.createMetadataFacet(); Map<String, String> props = new HashMap<>( facetModels.size() ); for ( MetadataFacetModel metadataFacetModel : facetModels ) { props.put( metadataFacetModel.getKey(), metadataFacetModel.getValue() ); } metadataFacet.fromProperties( props ); artifactMetadata.addFacet( metadataFacet ); } } } } return artifactMetadatas; } @Override public void save() { logger.trace( "save" ); } @Override public void close() throws MetadataRepositoryException { logger.trace( "close" ); } @Override public void revert() { logger.warn( "CassandraMetadataRepository cannot revert" ); } @Override public boolean canObtainAccess( Class<?> aClass ) { return false; } @Override public <T> T obtainAccess( Class<T> aClass ) throws MetadataRepositoryException { throw new IllegalArgumentException( "Access using " + aClass + " is not supported on the cassandra metadata storage" ); } private static class ModelMapperHolder { private static ModelMapper MODEL_MAPPER = new ModelMapper(); } protected ModelMapper getModelMapper() { return ModelMapperHolder.MODEL_MAPPER; } /** * This implementation just calls getArtifactsByMetadata( null, text, repositoryId ). We can't search artifacts by * any property. */ @Override public List<ArtifactMetadata> searchArtifacts( String text, String repositoryId, boolean exact ) throws MetadataRepositoryException { return getArtifactsByMetadata( null, text, repositoryId ); } /** * The exact parameter is ignored as we can't do non exact searches in Cassandra */ @Override public List<ArtifactMetadata> searchArtifacts( String key, String text, String repositoryId, boolean exact ) throws MetadataRepositoryException { // TODO optimize List<ArtifactMetadata> artifacts = new LinkedList<ArtifactMetadata>(); artifacts.addAll( getArtifactsByMetadata( key, text, repositoryId ) ); artifacts.addAll( getArtifactsByProperty( key, text, repositoryId ) ); return artifacts; } }