1 package org.apache.archiva.metadata.repository.cassandra;
4 * Licensed to the Apache Software Foundation (ASF) under one
5 * or more contributor license agreements. See the NOTICE file
6 * distributed with this work for additional information
7 * regarding copyright ownership. The ASF licenses this file
8 * to you under the Apache License, Version 2.0 (the
9 * "License"); you may not use this file except in compliance
10 * with the License. You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing,
15 * software distributed under the License is distributed on an
16 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17 * KIND, either express or implied. See the License for the
18 * specific language governing permissions and limitations
22 import com.google.common.base.Predicate;
23 import com.google.common.collect.Iterables;
24 import me.prettyprint.cassandra.serializers.LongSerializer;
25 import me.prettyprint.cassandra.serializers.StringSerializer;
26 import me.prettyprint.cassandra.service.template.ColumnFamilyResult;
27 import me.prettyprint.cassandra.service.template.ColumnFamilyTemplate;
28 import me.prettyprint.cassandra.service.template.ColumnFamilyUpdater;
29 import me.prettyprint.cassandra.service.template.ThriftColumnFamilyTemplate;
30 import me.prettyprint.hector.api.Keyspace;
31 import me.prettyprint.hector.api.beans.ColumnSlice;
32 import me.prettyprint.hector.api.beans.OrderedRows;
33 import me.prettyprint.hector.api.beans.Row;
34 import me.prettyprint.hector.api.exceptions.HInvalidRequestException;
35 import me.prettyprint.hector.api.factory.HFactory;
36 import me.prettyprint.hector.api.mutation.MutationResult;
37 import me.prettyprint.hector.api.mutation.Mutator;
38 import me.prettyprint.hector.api.query.QueryResult;
39 import me.prettyprint.hector.api.query.RangeSlicesQuery;
40 import org.apache.archiva.configuration.ArchivaConfiguration;
41 import org.apache.archiva.metadata.model.ArtifactMetadata;
42 import org.apache.archiva.metadata.model.CiManagement;
43 import org.apache.archiva.metadata.model.Dependency;
44 import org.apache.archiva.metadata.model.FacetedMetadata;
45 import org.apache.archiva.metadata.model.IssueManagement;
46 import org.apache.archiva.metadata.model.License;
47 import org.apache.archiva.metadata.model.MailingList;
48 import org.apache.archiva.metadata.model.MetadataFacet;
49 import org.apache.archiva.metadata.model.MetadataFacetFactory;
50 import org.apache.archiva.metadata.model.Organization;
51 import org.apache.archiva.metadata.model.ProjectMetadata;
52 import org.apache.archiva.metadata.model.ProjectVersionMetadata;
53 import org.apache.archiva.metadata.model.ProjectVersionReference;
54 import org.apache.archiva.metadata.model.Scm;
55 import org.apache.archiva.metadata.repository.MetadataRepository;
56 import org.apache.archiva.metadata.repository.MetadataRepositoryException;
57 import org.apache.archiva.metadata.repository.MetadataResolutionException;
58 import org.apache.archiva.metadata.repository.cassandra.model.ArtifactMetadataModel;
59 import org.apache.archiva.metadata.repository.cassandra.model.MetadataFacetModel;
60 import org.apache.archiva.metadata.repository.cassandra.model.Namespace;
61 import org.apache.archiva.metadata.repository.cassandra.model.Project;
62 import org.apache.archiva.metadata.repository.cassandra.model.ProjectVersionMetadataModel;
63 import org.apache.archiva.metadata.repository.cassandra.model.Repository;
64 import org.apache.commons.lang.StringUtils;
65 import org.modelmapper.ModelMapper;
66 import org.slf4j.Logger;
67 import org.slf4j.LoggerFactory;
69 import javax.persistence.PersistenceException;
70 import java.util.ArrayList;
71 import java.util.Collection;
72 import java.util.Collections;
73 import java.util.Date;
74 import java.util.HashMap;
75 import java.util.HashSet;
76 import java.util.Iterator;
77 import java.util.List;
80 import java.util.UUID;
82 import static org.apache.archiva.metadata.repository.cassandra.CassandraUtils.*;
85 * @author Olivier Lamy
88 public class CassandraMetadataRepository
89 implements MetadataRepository
92 private Logger logger = LoggerFactory.getLogger( getClass() );
94 private ArchivaConfiguration configuration;
96 private final Map<String, MetadataFacetFactory> metadataFacetFactories;
98 private final CassandraArchivaManager cassandraArchivaManager;
100 private final ColumnFamilyTemplate<String, String> projectVersionMetadataTemplate;
102 private final ColumnFamilyTemplate<String, String> projectTemplate;
104 private final ColumnFamilyTemplate<String, String> artifactMetadataTemplate;
106 private final ColumnFamilyTemplate<String, String> metadataFacetTemplate;
108 private final ColumnFamilyTemplate<String, String> mailingListTemplate;
110 private final ColumnFamilyTemplate<String, String> licenseTemplate;
112 private final ColumnFamilyTemplate<String, String> dependencyTemplate;
114 public CassandraMetadataRepository( Map<String, MetadataFacetFactory> metadataFacetFactories,
115 ArchivaConfiguration configuration,
116 CassandraArchivaManager cassandraArchivaManager )
118 this.metadataFacetFactories = metadataFacetFactories;
119 this.configuration = configuration;
120 this.cassandraArchivaManager = cassandraArchivaManager;
122 this.projectVersionMetadataTemplate =
123 new ThriftColumnFamilyTemplate<String, String>( cassandraArchivaManager.getKeyspace(), //
124 cassandraArchivaManager.getProjectVersionMetadataFamilyName(),
125 StringSerializer.get(), //
126 StringSerializer.get() );
128 this.projectTemplate = new ThriftColumnFamilyTemplate<String, String>( cassandraArchivaManager.getKeyspace(), //
129 cassandraArchivaManager.getProjectFamilyName(),
131 StringSerializer.get(), //
132 StringSerializer.get() );
134 this.artifactMetadataTemplate =
135 new ThriftColumnFamilyTemplate<String, String>( cassandraArchivaManager.getKeyspace(), //
136 cassandraArchivaManager.getArtifactMetadataFamilyName(),
138 StringSerializer.get(), //
139 StringSerializer.get() );
141 this.metadataFacetTemplate =
142 new ThriftColumnFamilyTemplate<String, String>( cassandraArchivaManager.getKeyspace(), //
143 cassandraArchivaManager.getMetadataFacetFamilyName(),
145 StringSerializer.get(), //
146 StringSerializer.get() );
148 this.mailingListTemplate =
149 new ThriftColumnFamilyTemplate<String, String>( cassandraArchivaManager.getKeyspace(), //
150 cassandraArchivaManager.getMailingListFamilyName(),
152 StringSerializer.get(), //
153 StringSerializer.get() );
155 this.licenseTemplate = new ThriftColumnFamilyTemplate<String, String>( cassandraArchivaManager.getKeyspace(), //
156 cassandraArchivaManager.getLicenseFamilyName(),
158 StringSerializer.get(), //
159 StringSerializer.get() );
161 this.dependencyTemplate =
162 new ThriftColumnFamilyTemplate<String, String>( cassandraArchivaManager.getKeyspace(), //
163 cassandraArchivaManager.getDependencyFamilyName(),
165 StringSerializer.get(), //
166 StringSerializer.get() );
171 * if the repository doesn't exist it will be created
173 * @param repositoryId
176 public Repository getOrCreateRepository( String repositoryId )
177 throws MetadataRepositoryException
179 String cf = cassandraArchivaManager.getRepositoryFamilyName();
180 Keyspace keyspace = cassandraArchivaManager.getKeyspace();
181 QueryResult<OrderedRows<String, String, String>> result = HFactory //
182 .createRangeSlicesQuery( keyspace, StringSerializer.get(), StringSerializer.get(),
183 StringSerializer.get() ) //
184 .setColumnFamily( cf ) //
185 .setColumnNames( "repositoryName" ) //
186 .addEqualsExpression( "repositoryName", repositoryId ) //
189 if ( result.get().getCount() < 1 )
191 // we need to create the repository
192 Repository repository = new Repository( repositoryId );
196 MutationResult mutationResult = HFactory.createMutator( keyspace, StringSerializer.get() ) //
197 .addInsertion( repositoryId, cf,
198 CassandraUtils.column( "repositoryName", repository.getName() ) ) //
202 catch ( HInvalidRequestException e )
204 logger.error( e.getMessage(), e );
205 throw new MetadataRepositoryException( e.getMessage(), e );
210 return new Repository(
211 result.get().getList().get( 0 ).getColumnSlice().getColumnByName( "repositoryName" ).getValue() );
215 protected Repository getRepository( String repositoryId )
216 throws MetadataRepositoryException
218 Keyspace keyspace = cassandraArchivaManager.getKeyspace();
219 QueryResult<OrderedRows<String, String, String>> result = HFactory //
220 .createRangeSlicesQuery( keyspace, StringSerializer.get(), StringSerializer.get(),
221 StringSerializer.get() ) //
222 .setColumnFamily( cassandraArchivaManager.getRepositoryFamilyName() ) //
223 .setColumnNames( "repositoryName" ) //
224 .addEqualsExpression( "repositoryName", repositoryId ) //
226 return ( result.get().getCount() > 0 ) ? new Repository( repositoryId ) : null;
230 public void updateNamespace( String repositoryId, String namespaceId )
231 throws MetadataRepositoryException
233 updateOrAddNamespace( repositoryId, namespaceId );
236 public Namespace updateOrAddNamespace( String repositoryId, String namespaceId )
237 throws MetadataRepositoryException
241 Repository repository = getOrCreateRepository( repositoryId );
243 Keyspace keyspace = cassandraArchivaManager.getKeyspace();
246 new Namespace.KeyBuilder().withNamespace( namespaceId ).withRepositoryId( repositoryId ).build();
248 Namespace namespace = getNamespace( repositoryId, namespaceId );
249 if ( namespace == null )
251 String cf = cassandraArchivaManager.getNamespaceFamilyName();
252 namespace = new Namespace( namespaceId, repository );
253 HFactory.createMutator( keyspace, StringSerializer.get() )
255 .addInsertion( key, cf, CassandraUtils.column( "name", namespace.getName() ) ) //
256 .addInsertion( key, cf, CassandraUtils.column( "repositoryName", repository.getName() ) ) //
262 catch ( HInvalidRequestException e )
264 logger.error( e.getMessage(), e );
265 throw new MetadataRepositoryException( e.getMessage(), e );
269 protected Namespace getNamespace( String repositoryId, String namespaceId )
271 Keyspace keyspace = cassandraArchivaManager.getKeyspace();
272 QueryResult<OrderedRows<String, String, String>> result = HFactory //
273 .createRangeSlicesQuery( keyspace, //
274 StringSerializer.get(), //
275 StringSerializer.get(), //
276 StringSerializer.get() ) //
277 .setColumnFamily( cassandraArchivaManager.getNamespaceFamilyName() ) //
278 .setColumnNames( "repositoryName", "name" ) //
279 .addEqualsExpression( "repositoryName", repositoryId ) //
280 .addEqualsExpression( "name", namespaceId ) //
282 if ( result.get().getCount() > 0 )
284 ColumnSlice<String, String> columnSlice = result.get().getList().get( 0 ).getColumnSlice();
285 return new Namespace( getStringValue( columnSlice, "name" ), //
286 new Repository( getStringValue( columnSlice, "repositoryName" ) ) );
294 public void removeNamespace( String repositoryId, String namespaceId )
295 throws MetadataRepositoryException
297 Keyspace keyspace = cassandraArchivaManager.getKeyspace();
301 new Namespace.KeyBuilder().withNamespace( namespaceId ).withRepositoryId( repositoryId ).build();
303 HFactory.createMutator( cassandraArchivaManager.getKeyspace(), new StringSerializer() ) //
304 .addDeletion( key, cassandraArchivaManager.getNamespaceFamilyName() ) //
307 QueryResult<OrderedRows<String, String, String>> result = HFactory //
308 .createRangeSlicesQuery( keyspace, //
309 StringSerializer.get(), //
310 StringSerializer.get(), //
311 StringSerializer.get() ) //
312 .setColumnFamily( cassandraArchivaManager.getProjectFamilyName() ) //
313 .setColumnNames( "repositoryName" ) //
314 .addEqualsExpression( "repositoryName", repositoryId ) //
315 .addEqualsExpression( "namespaceId", namespaceId ) //
318 for ( Row<String, String, String> row : result.get() )
320 this.projectTemplate.deleteRow( row.getKey() );
324 .createRangeSlicesQuery( keyspace, //
325 StringSerializer.get(), //
326 StringSerializer.get(), //
327 StringSerializer.get() ) //
328 .setColumnFamily( cassandraArchivaManager.getProjectVersionMetadataFamilyName() ) //
329 .setColumnNames( "repositoryName" ) //
330 .addEqualsExpression( "repositoryName", repositoryId ) //
331 .addEqualsExpression( "namespaceId", namespaceId ) //
334 for ( Row<String, String, String> row : result.get() )
336 this.projectVersionMetadataTemplate.deleteRow( row.getKey() );
337 removeMailingList( row.getKey() );
341 .createRangeSlicesQuery( keyspace, //
342 StringSerializer.get(), //
343 StringSerializer.get(), //
344 StringSerializer.get() ) //
345 .setColumnFamily( cassandraArchivaManager.getArtifactMetadataFamilyName() ) //
346 .setColumnNames( "repositoryName" ) //
347 .addEqualsExpression( "repositoryName", repositoryId ) //
348 .addEqualsExpression( "namespaceId", namespaceId ) //
351 for ( Row<String, String, String> row : result.get() )
353 this.artifactMetadataTemplate.deleteRow( row.getKey() );
357 .createRangeSlicesQuery( keyspace, //
358 StringSerializer.get(), //
359 StringSerializer.get(), //
360 StringSerializer.get() ) //
361 .setColumnFamily( cassandraArchivaManager.getMetadataFacetFamilyName() ) //
362 .setColumnNames( "repositoryName" ) //
363 .addEqualsExpression( "repositoryName", repositoryId ) //
364 .addEqualsExpression( "namespaceId", namespaceId ) //
367 for ( Row<String, String, String> row : result.get() )
369 this.metadataFacetTemplate.deleteRow( row.getKey() );
373 catch ( HInvalidRequestException e )
375 logger.error( e.getMessage(), e );
376 throw new MetadataRepositoryException( e.getMessage(), e );
382 public void removeRepository( final String repositoryId )
383 throws MetadataRepositoryException
386 StringSerializer ss = StringSerializer.get();
388 // TODO use cql queries to delete all
389 List<String> namespacesKey = new ArrayList<String>();
391 Keyspace keyspace = cassandraArchivaManager.getKeyspace();
392 QueryResult<OrderedRows<String, String, String>> result = HFactory //
393 .createRangeSlicesQuery( keyspace, ss, ss, ss ) //
394 .setColumnFamily( cassandraArchivaManager.getNamespaceFamilyName() ) //
395 .setColumnNames( "repositoryName" ) //
396 .addEqualsExpression( "repositoryName", repositoryId ) //
399 for ( Row<String, String, String> row : result.get().getList() )
401 namespacesKey.add( row.getKey() );
404 HFactory.createMutator( cassandraArchivaManager.getKeyspace(), ss ) //
405 .addDeletion( namespacesKey, cassandraArchivaManager.getNamespaceFamilyName() ) //
408 //delete repositoryId
409 HFactory.createMutator( cassandraArchivaManager.getKeyspace(), ss ) //
410 .addDeletion( repositoryId, cassandraArchivaManager.getRepositoryFamilyName() ) //
414 .createRangeSlicesQuery( keyspace, //
415 StringSerializer.get(), //
416 StringSerializer.get(), //
417 StringSerializer.get() ) //
418 .setColumnFamily( cassandraArchivaManager.getProjectFamilyName() ) //
419 .setColumnNames( "repositoryName" ) //
420 .addEqualsExpression( "repositoryName", repositoryId ) //
423 for ( Row<String, String, String> row : result.get() )
425 this.projectTemplate.deleteRow( row.getKey() );
429 .createRangeSlicesQuery( keyspace, //
430 StringSerializer.get(), //
431 StringSerializer.get(), //
432 StringSerializer.get() ) //
433 .setColumnFamily( cassandraArchivaManager.getProjectVersionMetadataFamilyName() ) //
434 .setColumnNames( "repositoryName" ) //
435 .addEqualsExpression( "repositoryName", repositoryId ) //
438 for ( Row<String, String, String> row : result.get() )
440 this.projectVersionMetadataTemplate.deleteRow( row.getKey() );
441 removeMailingList( row.getKey() );
445 .createRangeSlicesQuery( keyspace, //
446 StringSerializer.get(), //
447 StringSerializer.get(), //
448 StringSerializer.get() ) //
449 .setColumnFamily( cassandraArchivaManager.getArtifactMetadataFamilyName() ) //
450 .setColumnNames( "repositoryName" ) //
451 .addEqualsExpression( "repositoryName", repositoryId ) //
454 for ( Row<String, String, String> row : result.get() )
456 this.artifactMetadataTemplate.deleteRow( row.getKey() );
460 .createRangeSlicesQuery( keyspace, //
461 StringSerializer.get(), //
462 StringSerializer.get(), //
463 StringSerializer.get() ) //
464 .setColumnFamily( cassandraArchivaManager.getMetadataFacetFamilyName() ) //
465 .setColumnNames( "repositoryName" ) //
466 .addEqualsExpression( "repositoryName", repositoryId ) //
469 for ( Row<String, String, String> row : result.get() )
471 this.metadataFacetTemplate.deleteRow( row.getKey() );
478 public Collection<String> getRepositories()
479 throws MetadataRepositoryException
483 logger.debug( "getRepositories" );
485 final QueryResult<OrderedRows<String, String, String>> cResult = //
486 HFactory.createRangeSlicesQuery( cassandraArchivaManager.getKeyspace(), //
487 StringSerializer.get(), //
488 StringSerializer.get(), //
489 StringSerializer.get() ) //
490 .setColumnFamily( cassandraArchivaManager.getRepositoryFamilyName() ) //
491 .setColumnNames( "repositoryName" ) //
492 .setRange( null, null, false, Integer.MAX_VALUE ) //
495 List<String> repoIds = new ArrayList<String>( cResult.get().getCount() );
497 for ( Row<String, String, String> row : cResult.get() )
499 repoIds.add( getStringValue( row.getColumnSlice(), "repositoryName" ) );
504 catch ( PersistenceException e )
506 throw new MetadataRepositoryException( e.getMessage(), e );
513 public Collection<String> getRootNamespaces( final String repoId )
514 throws MetadataResolutionException
516 StringSerializer ss = StringSerializer.get();
517 Keyspace keyspace = cassandraArchivaManager.getKeyspace();
518 QueryResult<OrderedRows<String, String, String>> result = HFactory //
519 .createRangeSlicesQuery( keyspace, ss, ss, ss ) //
520 .setColumnFamily( cassandraArchivaManager.getNamespaceFamilyName() ) //
521 .setColumnNames( "name" ) //
522 .addEqualsExpression( "repositoryName", repoId ) //
525 Set<String> namespaces = new HashSet<String>( result.get().getCount() );
527 for ( Row<String, String, String> row : result.get() )
529 namespaces.add( StringUtils.substringBefore( getStringValue( row.getColumnSlice(), "name" ), "." ) );
537 public Collection<String> getNamespaces( final String repoId, final String namespaceId )
538 throws MetadataResolutionException
540 StringSerializer ss = StringSerializer.get();
541 Keyspace keyspace = cassandraArchivaManager.getKeyspace();
542 QueryResult<OrderedRows<String, String, String>> result = HFactory //
543 .createRangeSlicesQuery( keyspace, ss, ss, ss ) //
544 .setColumnFamily( cassandraArchivaManager.getNamespaceFamilyName() ) //
545 .setColumnNames( "name" ) //
546 .addEqualsExpression( "repositoryName", repoId ) //
549 List<String> namespaces = new ArrayList<String>( result.get().getCount() );
551 for ( Row<String, String, String> row : result.get() )
553 String currentNamespace = getStringValue( row.getColumnSlice(), "name" );
554 if ( StringUtils.startsWith( currentNamespace, namespaceId ) //
555 && ( StringUtils.length( currentNamespace ) > StringUtils.length( namespaceId ) ) )
557 // store after namespaceId '.' but before next '.'
558 // call org namespace org.apache.maven.shared -> stored apache
560 String calledNamespace = StringUtils.endsWith( namespaceId, "." ) ? namespaceId : namespaceId + ".";
561 String storedNamespace = StringUtils.substringAfter( currentNamespace, calledNamespace );
563 storedNamespace = StringUtils.substringBefore( storedNamespace, "." );
565 namespaces.add( storedNamespace );
574 public List<String> getNamespaces( final String repoId )
575 throws MetadataResolutionException
577 StringSerializer ss = StringSerializer.get();
578 Keyspace keyspace = cassandraArchivaManager.getKeyspace();
579 QueryResult<OrderedRows<String, String, String>> result = HFactory //
580 .createRangeSlicesQuery( keyspace, ss, ss, ss ) //
581 .setColumnFamily( cassandraArchivaManager.getNamespaceFamilyName() ) //
582 .setColumnNames( "name" ) //
583 .addEqualsExpression( "repositoryName", repoId ) //
586 List<String> namespaces = new ArrayList<String>( result.get().getCount() );
588 for ( Row<String, String, String> row : result.get() )
590 namespaces.add( getStringValue( row.getColumnSlice(), "name" ) );
598 public void updateProject( String repositoryId, ProjectMetadata projectMetadata )
599 throws MetadataRepositoryException
601 Keyspace keyspace = cassandraArchivaManager.getKeyspace();
602 StringSerializer ss = StringSerializer.get();
604 QueryResult<OrderedRows<String, String, String>> result = HFactory //
605 .createRangeSlicesQuery( keyspace, ss, ss, ss ) //
606 .setColumnFamily( cassandraArchivaManager.getProjectFamilyName() ) //
607 .setColumnNames( "projectId" ) //
608 .addEqualsExpression( "repositoryName", repositoryId ) //
609 .addEqualsExpression( "namespaceId", projectMetadata.getNamespace() ) //
610 .addEqualsExpression( "projectId", projectMetadata.getId() ) //
613 // project exists ? if yes return nothing to update here
614 if ( result.get().getCount() > 0 )
620 Namespace namespace = updateOrAddNamespace( repositoryId, projectMetadata.getNamespace() );
623 new Project.KeyBuilder().withProjectId( projectMetadata.getId() ).withNamespace( namespace ).build();
625 String cf = cassandraArchivaManager.getProjectFamilyName();
626 projectTemplate.createMutator()
628 .addInsertion( key, cf, CassandraUtils.column( "projectId", projectMetadata.getId() ) ) //
629 .addInsertion( key, cf, CassandraUtils.column( "repositoryName", repositoryId ) ) //
630 .addInsertion( key, cf, CassandraUtils.column( "namespaceId", projectMetadata.getNamespace() ) )//
636 public Collection<String> getProjects( final String repoId, final String namespace )
637 throws MetadataResolutionException
640 Keyspace keyspace = cassandraArchivaManager.getKeyspace();
641 StringSerializer ss = StringSerializer.get();
642 QueryResult<OrderedRows<String, String, String>> result = HFactory //
643 .createRangeSlicesQuery( keyspace, ss, ss, ss ) //
644 .setColumnFamily( cassandraArchivaManager.getProjectFamilyName() ) //
645 .setColumnNames( "projectId" ) //
646 .addEqualsExpression( "repositoryName", repoId ) //
647 .addEqualsExpression( "namespaceId", namespace ) //
650 final Set<String> projects = new HashSet<String>( result.get().getCount() );
652 for ( Row<String, String, String> row : result.get() )
654 projects.add( getStringValue( row.getColumnSlice(), "projectId" ) );
661 public void removeProject( final String repositoryId, final String namespaceId, final String projectId )
662 throws MetadataRepositoryException
664 Keyspace keyspace = cassandraArchivaManager.getKeyspace();
665 StringSerializer ss = StringSerializer.get();
666 String key = new Project.KeyBuilder() //
667 .withProjectId( projectId ) //
668 .withNamespace( new Namespace( namespaceId, new Repository( repositoryId ) ) ) //
671 this.projectTemplate.deleteRow( key );
673 QueryResult<OrderedRows<String, String, String>> result = HFactory //
674 .createRangeSlicesQuery( keyspace, ss, ss, ss ) //
675 .setColumnFamily( cassandraArchivaManager.getProjectVersionMetadataFamilyName() ) //
676 .setColumnNames( "id" ) //
677 .addEqualsExpression( "repositoryName", repositoryId ) //
678 .addEqualsExpression( "namespaceId", namespaceId ) //
679 .addEqualsExpression( "projectId", projectId ) //
682 for ( Row<String, String, String> row : result.get() )
684 this.projectVersionMetadataTemplate.deleteRow( row.getKey() );
685 removeMailingList( row.getKey() );
689 .createRangeSlicesQuery( keyspace, ss, ss, ss ) //
690 .setColumnFamily( cassandraArchivaManager.getArtifactMetadataFamilyName() ) //
691 .setColumnNames( "projectId" ) //
692 .addEqualsExpression( "repositoryName", repositoryId ) //
693 .addEqualsExpression( "namespaceId", namespaceId ) //
694 .addEqualsExpression( "projectId", projectId ) //
697 for ( Row<String, String, String> row : result.get() )
699 this.artifactMetadataTemplate.deleteRow( row.getKey() );
704 public Collection<String> getProjectVersions( final String repoId, final String namespace, final String projectId )
705 throws MetadataResolutionException
708 Keyspace keyspace = cassandraArchivaManager.getKeyspace();
709 StringSerializer ss = StringSerializer.get();
710 QueryResult<OrderedRows<String, String, String>> result = HFactory //
711 .createRangeSlicesQuery( keyspace, ss, ss, ss ) //
712 .setColumnFamily( cassandraArchivaManager.getProjectVersionMetadataFamilyName() ) //
713 .setColumnNames( "projectVersion" ) //
714 .addEqualsExpression( "repositoryName", repoId ) //
715 .addEqualsExpression( "namespaceId", namespace ) //
716 .addEqualsExpression( "projectId", projectId ) //
719 int count = result.get().getCount();
723 return Collections.emptyList();
726 Set<String> versions = new HashSet<String>( count );
728 for ( Row<String, String, String> orderedRows : result.get() )
730 versions.add( getStringValue( orderedRows.getColumnSlice(), "projectVersion" ) );
738 public ProjectMetadata getProject( final String repoId, final String namespace, final String id )
739 throws MetadataResolutionException
742 Keyspace keyspace = cassandraArchivaManager.getKeyspace();
743 StringSerializer ss = StringSerializer.get();
744 QueryResult<OrderedRows<String, String, String>> result = HFactory //
745 .createRangeSlicesQuery( keyspace, ss, ss, ss ) //
746 .setColumnFamily( cassandraArchivaManager.getProjectFamilyName() ) //
747 .setColumnNames( "projectId" ) //
748 .addEqualsExpression( "repositoryName", repoId ) //
749 .addEqualsExpression( "namespaceId", namespace ) //
750 .addEqualsExpression( "projectId", id ) //
753 int count = result.get().getCount();
760 ProjectMetadata projectMetadata = new ProjectMetadata();
761 projectMetadata.setId( id );
762 projectMetadata.setNamespace( namespace );
764 logger.debug( "getProject repoId: {}, namespace: {}, projectId: {} -> {}", repoId, namespace, id,
767 return projectMetadata;
770 protected ProjectVersionMetadataModel mapProjectVersionMetadataModel( ColumnSlice<String, String> columnSlice )
772 ProjectVersionMetadataModel projectVersionMetadataModel = new ProjectVersionMetadataModel();
773 projectVersionMetadataModel.setId( getStringValue( columnSlice, "id" ) );
774 projectVersionMetadataModel.setDescription( getStringValue( columnSlice, "description" ) );
775 projectVersionMetadataModel.setName( getStringValue( columnSlice, "name" ) );
776 projectVersionMetadataModel.setNamespace( new Namespace( getStringValue( columnSlice, "namespaceId" ), //
778 getStringValue( columnSlice, "repositoryName" ) )
781 projectVersionMetadataModel.setIncomplete(
782 Boolean.parseBoolean( getStringValue( columnSlice, "incomplete" ) ) );
783 projectVersionMetadataModel.setProjectId( getStringValue( columnSlice, "projectId" ) );
784 projectVersionMetadataModel.setUrl( getStringValue( columnSlice, "url" ) );
785 return projectVersionMetadataModel;
790 public void updateProjectVersion( String repositoryId, String namespaceId, String projectId,
791 ProjectVersionMetadata versionMetadata )
792 throws MetadataRepositoryException
796 Namespace namespace = getNamespace( repositoryId, namespaceId );
798 if ( namespace == null )
800 updateOrAddNamespace( repositoryId, namespaceId );
803 if ( getProject( repositoryId, namespaceId, projectId ) == null )
805 ProjectMetadata projectMetadata = new ProjectMetadata();
806 projectMetadata.setNamespace( namespaceId );
807 projectMetadata.setId( projectId );
808 updateProject( repositoryId, projectMetadata );
812 catch ( MetadataResolutionException e )
814 throw new MetadataRepositoryException( e.getMessage(), e );
817 StringSerializer ss = StringSerializer.get();
819 Keyspace keyspace = cassandraArchivaManager.getKeyspace();
820 QueryResult<OrderedRows<String, String, String>> result = HFactory //
821 .createRangeSlicesQuery( keyspace, ss, ss, ss ) //
822 .setColumnFamily( cassandraArchivaManager.getProjectVersionMetadataFamilyName() ) //
823 .setColumnNames( "projectVersion" ) //
824 .addEqualsExpression( "repositoryName", repositoryId ) //
825 .addEqualsExpression( "namespaceId", namespaceId ) //
826 .addEqualsExpression( "projectId", projectId ) //
827 .addEqualsExpression( "projectVersion", versionMetadata.getId() ) //
830 ProjectVersionMetadataModel projectVersionMetadataModel = null;
831 boolean creation = true;
832 if ( result.get().getCount() > 0 )
834 projectVersionMetadataModel =
835 mapProjectVersionMetadataModel( result.get().getList().get( 0 ).getColumnSlice() );
840 projectVersionMetadataModel = getModelMapper().map( versionMetadata, ProjectVersionMetadataModel.class );
843 projectVersionMetadataModel.setProjectId( projectId );
844 projectVersionMetadataModel.setNamespace( new Namespace( namespaceId, new Repository( repositoryId ) ) );
846 projectVersionMetadataModel.setCiManagement( versionMetadata.getCiManagement() );
847 projectVersionMetadataModel.setIssueManagement( versionMetadata.getIssueManagement() );
848 projectVersionMetadataModel.setOrganization( versionMetadata.getOrganization() );
849 projectVersionMetadataModel.setScm( versionMetadata.getScm() );
851 projectVersionMetadataModel.setMailingLists( versionMetadata.getMailingLists() );
852 projectVersionMetadataModel.setDependencies( versionMetadata.getDependencies() );
853 projectVersionMetadataModel.setLicenses( versionMetadata.getLicenses() );
855 // we don't test of repository and namespace really exist !
856 String key = new ProjectVersionMetadataModel.KeyBuilder() //
857 .withRepository( repositoryId ) //
858 .withNamespace( namespaceId ) //
859 .withProjectId( projectId ) //
860 .withProjectVersion( versionMetadata.getVersion() ) //
861 .withId( versionMetadata.getId() ) //
864 // FIXME nested objects to store!!!
867 String cf = cassandraArchivaManager.getProjectVersionMetadataFamilyName();
868 Mutator<String> mutator = projectVersionMetadataTemplate.createMutator()
870 .addInsertion( key, cf, column( "projectId", projectId ) ) //
871 .addInsertion( key, cf, column( "repositoryName", repositoryId ) ) //
872 .addInsertion( key, cf, column( "namespaceId", namespaceId ) )//
873 .addInsertion( key, cf, column( "projectVersion", versionMetadata.getVersion() ) ); //
875 addInsertion( mutator, key, cf, "description", versionMetadata.getDescription() );
877 addInsertion( mutator, key, cf, "name", versionMetadata.getName() );
879 addInsertion( mutator, key, cf, "incomplete", Boolean.toString( versionMetadata.isIncomplete() ) );
881 addInsertion( mutator, key, cf, "url", versionMetadata.getUrl() );
883 CiManagement ci = versionMetadata.getCiManagement();
886 addInsertion( mutator, key, cf, "ciManagement.system", ci.getSystem() );
887 addInsertion( mutator, key, cf, "ciManagement.url", ci.getUrl() );
892 IssueManagement issueManagement = versionMetadata.getIssueManagement();
894 if ( issueManagement != null )
896 addInsertion( mutator, key, cf, "issueManagement.system", issueManagement.getSystem() );
897 addInsertion( mutator, key, cf, "issueManagement.url", issueManagement.getUrl() );
902 Organization organization = versionMetadata.getOrganization();
903 if ( organization != null )
905 addInsertion( mutator, key, cf, "organization.name", organization.getName() );
906 addInsertion( mutator, key, cf, "organization.url", organization.getUrl() );
911 Scm scm = versionMetadata.getScm();
914 addInsertion( mutator, key, cf, "scm.url", scm.getUrl() );
915 addInsertion( mutator, key, cf, "scm.connection", scm.getConnection() );
916 addInsertion( mutator, key, cf, "scm.developerConnection", scm.getDeveloperConnection() );
920 recordMailingList( key, versionMetadata.getMailingLists() );
922 recordLicenses( key, versionMetadata.getLicenses() );
924 recordDependencies( key, versionMetadata.getDependencies() );
926 MutationResult mutationResult = mutator.execute();
930 ColumnFamilyUpdater<String, String> updater = projectVersionMetadataTemplate.createUpdater( key );
931 updater.setString( "projectId", projectId );
932 updater.setString( "repositoryName", repositoryId );
933 updater.setString( "namespaceId", namespaceId );
934 updater.setString( "projectVersion", versionMetadata.getVersion() );
935 if ( StringUtils.isNotEmpty( versionMetadata.getDescription() ) )
937 updater.setString( "description", versionMetadata.getDescription() );
939 if ( StringUtils.isNotEmpty( versionMetadata.getName() ) )
941 updater.setString( "name", versionMetadata.getName() );
943 updater.setString( "incomplete", Boolean.toString( versionMetadata.isIncomplete() ) );
944 if ( StringUtils.isNotEmpty( versionMetadata.getUrl() ) )
946 updater.setString( "url", versionMetadata.getUrl() );
950 CiManagement ci = versionMetadata.getCiManagement();
953 updater.setString( "ciManagement.system", ci.getSystem() );
954 updater.setString( "ciManagement.url", ci.getUrl() );
958 IssueManagement issueManagement = versionMetadata.getIssueManagement();
959 if ( issueManagement != null )
961 updater.setString( "issueManagement.system", issueManagement.getSystem() );
962 updater.setString( "issueManagement.url", issueManagement.getUrl() );
966 Organization organization = versionMetadata.getOrganization();
967 if ( organization != null )
969 updater.setString( "organization.name", organization.getName() );
970 updater.setString( "organization.url", organization.getUrl() );
974 Scm scm = versionMetadata.getScm();
977 updater.setString( "scm.url", scm.getUrl() );
978 updater.setString( "scm.connection", scm.getConnection() );
979 updater.setString( "scm.developerConnection", scm.getDeveloperConnection() );
983 // update is a delete record
984 removeMailingList( key );
985 recordMailingList( key, versionMetadata.getMailingLists() );
987 removeLicenses( key );
988 recordLicenses( key, versionMetadata.getLicenses() );
990 removeDependencies( key );
991 recordDependencies( key, versionMetadata.getDependencies() );
993 projectVersionMetadataTemplate.update( updater );
997 ArtifactMetadataModel artifactMetadataModel = new ArtifactMetadataModel();
998 artifactMetadataModel.setRepositoryId( repositoryId );
999 artifactMetadataModel.setNamespace( namespaceId );
1000 artifactMetadataModel.setProject( projectId );
1001 artifactMetadataModel.setProjectVersion( versionMetadata.getVersion() );
1002 artifactMetadataModel.setVersion( versionMetadata.getVersion() );
1003 updateFacets( versionMetadata, artifactMetadataModel );
1009 public ProjectVersionMetadata getProjectVersion( final String repoId, final String namespace,
1010 final String projectId, final String projectVersion )
1011 throws MetadataResolutionException
1014 Keyspace keyspace = cassandraArchivaManager.getKeyspace();
1015 StringSerializer ss = StringSerializer.get();
1016 QueryResult<OrderedRows<String, String, String>> result = HFactory //
1017 .createRangeSlicesQuery( keyspace, ss, ss, ss ) //
1018 .setColumnFamily( cassandraArchivaManager.getProjectVersionMetadataFamilyName() ) //
1019 .setColumnNames( "projectVersion" ) //
1020 .addEqualsExpression( "repositoryName", repoId ) //
1021 .addEqualsExpression( "namespaceId", namespace ) //
1022 .addEqualsExpression( "projectId", projectId ) //
1023 .addEqualsExpression( "projectVersion", projectVersion ) //
1026 if ( result.get().getCount() < 1 )
1031 String key = result.get().iterator().next().getKey();
1033 ColumnFamilyResult<String, String> columnFamilyResult =
1034 this.projectVersionMetadataTemplate.queryColumns( key );
1036 if ( !columnFamilyResult.hasResults() )
1041 ProjectVersionMetadata projectVersionMetadata = new ProjectVersionMetadata();
1042 projectVersionMetadata.setId( columnFamilyResult.getString( "projectVersion" ) );
1043 projectVersionMetadata.setDescription( columnFamilyResult.getString( "description" ) );
1044 projectVersionMetadata.setName( columnFamilyResult.getString( "name" ) );
1046 projectVersionMetadata.setIncomplete( Boolean.parseBoolean( columnFamilyResult.getString( "incomplete" ) ) );
1048 projectVersionMetadata.setUrl( columnFamilyResult.getString( "url" ) );
1050 String ciUrl = columnFamilyResult.getString( "ciManagement.url" );
1051 String ciSystem = columnFamilyResult.getString( "ciManagement.system" );
1053 if ( StringUtils.isNotEmpty( ciSystem ) || StringUtils.isNotEmpty( ciUrl ) )
1055 projectVersionMetadata.setCiManagement( new CiManagement( ciSystem, ciUrl ) );
1059 String issueUrl = columnFamilyResult.getString( "issueManagement.url" );
1060 String issueSystem = columnFamilyResult.getString( "issueManagement.system" );
1061 if ( StringUtils.isNotEmpty( issueSystem ) || StringUtils.isNotEmpty( issueUrl ) )
1063 projectVersionMetadata.setIssueManagement( new IssueManagement( issueSystem, issueUrl ) );
1067 String organizationUrl = columnFamilyResult.getString( "organization.url" );
1068 String organizationName = columnFamilyResult.getString( "organization.name" );
1069 if ( StringUtils.isNotEmpty( organizationUrl ) || StringUtils.isNotEmpty( organizationName ) )
1071 projectVersionMetadata.setOrganization( new Organization( organizationName, organizationUrl ) );
1075 String devConn = columnFamilyResult.getString( "scm.developerConnection" );
1076 String conn = columnFamilyResult.getString( "scm.connection" );
1077 String url = columnFamilyResult.getString( "scm.url" );
1078 if ( StringUtils.isNotEmpty( devConn ) || StringUtils.isNotEmpty( conn ) || StringUtils.isNotEmpty( url ) )
1080 projectVersionMetadata.setScm( new Scm( conn, devConn, url ) );
1083 projectVersionMetadata.setMailingLists( getMailingLists( key ) );
1084 projectVersionMetadata.setLicenses( getLicenses( key ) );
1085 projectVersionMetadata.setDependencies( getDependencies( key ) );
1088 result = HFactory //
1089 .createRangeSlicesQuery( keyspace, ss, ss, ss ) //
1090 .setColumnFamily( cassandraArchivaManager.getMetadataFacetFamilyName() ) //
1091 .setColumnNames( "facetId", "key", "value", "name" ) //
1092 .addEqualsExpression( "repositoryName", repoId ) //
1093 .addEqualsExpression( "namespaceId", namespace ) //
1094 .addEqualsExpression( "projectId", projectId ) //
1095 .addEqualsExpression( "projectVersion", projectVersion ) //
1098 Map<String, Map<String, String>> metadataFacetsPerFacetIds = new HashMap<String, Map<String, String>>();
1100 for ( Row<String, String, String> row : result.get() )
1102 ColumnSlice<String, String> columnSlice = row.getColumnSlice();
1103 String facetId = getStringValue( columnSlice, "facetId" );
1104 Map<String, String> metaValues = metadataFacetsPerFacetIds.get( facetId );
1105 if ( metaValues == null )
1107 metaValues = new HashMap<String, String>();
1108 metadataFacetsPerFacetIds.put( facetId, metaValues );
1110 metaValues.put( getStringValue( columnSlice, "key" ), getStringValue( columnSlice, "value" ) );
1113 if ( !metadataFacetsPerFacetIds.isEmpty() )
1115 for ( Map.Entry<String, Map<String, String>> entry : metadataFacetsPerFacetIds.entrySet() )
1117 MetadataFacetFactory metadataFacetFactory = metadataFacetFactories.get( entry.getKey() );
1118 if ( metadataFacetFactory != null )
1120 MetadataFacet metadataFacet = metadataFacetFactory.createMetadataFacet( repoId, entry.getKey() );
1121 metadataFacet.fromProperties( entry.getValue() );
1122 projectVersionMetadata.addFacet( metadataFacet );
1127 return projectVersionMetadata;
1130 protected void recordMailingList( String projectVersionMetadataKey, List<MailingList> mailingLists )
1132 if ( mailingLists == null || mailingLists.isEmpty() )
1136 Mutator<String> mailingMutator = this.mailingListTemplate.createMutator();
1137 for ( MailingList mailingList : mailingLists )
1139 // we don't care about the key as the real used one with the projectVersionMetadata
1140 String keyMailingList = UUID.randomUUID().toString();
1141 String cfMailingList = cassandraArchivaManager.getMailingListFamilyName();
1143 addInsertion( mailingMutator, keyMailingList, cfMailingList, "projectVersionMetadataModel.key",
1144 projectVersionMetadataKey );
1145 addInsertion( mailingMutator, keyMailingList, cfMailingList, "name", mailingList.getName() );
1146 addInsertion( mailingMutator, keyMailingList, cfMailingList, "mainArchiveUrl",
1147 mailingList.getMainArchiveUrl() );
1148 addInsertion( mailingMutator, keyMailingList, cfMailingList, "postAddress", mailingList.getPostAddress() );
1149 addInsertion( mailingMutator, keyMailingList, cfMailingList, "subscribeAddress",
1150 mailingList.getSubscribeAddress() );
1151 addInsertion( mailingMutator, keyMailingList, cfMailingList, "unsubscribeAddress",
1152 mailingList.getUnsubscribeAddress() );
1154 for ( String otherArchive : mailingList.getOtherArchives() )
1156 addInsertion( mailingMutator, keyMailingList, cfMailingList, "otherArchive." + idx, otherArchive );
1161 mailingMutator.execute();
1164 protected void removeMailingList( String projectVersionMetadataKey )
1166 StringSerializer ss = StringSerializer.get();
1167 QueryResult<OrderedRows<String, String, String>> result =
1168 HFactory.createRangeSlicesQuery( cassandraArchivaManager.getKeyspace(), ss, ss, ss ) //
1169 .setColumnFamily( cassandraArchivaManager.getMailingListFamilyName() ) //
1170 .setColumnNames( "name" ) //
1171 .setRowCount( Integer.MAX_VALUE ) //
1172 .addEqualsExpression( "projectVersionMetadataModel.key", projectVersionMetadataKey ) //
1174 for ( Row<String, String, String> row : result.get() )
1176 this.mailingListTemplate.deleteRow( row.getKey() );
1180 protected List<MailingList> getMailingLists( String projectVersionMetadataKey )
1182 List<MailingList> mailingLists = new ArrayList<MailingList>();
1184 StringSerializer ss = StringSerializer.get();
1185 QueryResult<OrderedRows<String, String, String>> result =
1186 HFactory.createRangeSlicesQuery( cassandraArchivaManager.getKeyspace(), ss, ss, ss ) //
1187 .setColumnFamily( cassandraArchivaManager.getMailingListFamilyName() ) //
1188 .setColumnNames( "name" ) //
1189 .setRowCount( Integer.MAX_VALUE ) //
1190 .addEqualsExpression( "projectVersionMetadataModel.key", projectVersionMetadataKey ) //
1192 for ( Row<String, String, String> row : result.get() )
1194 ColumnFamilyResult<String, String> columnFamilyResult =
1195 this.mailingListTemplate.queryColumns( row.getKey() );
1197 MailingList mailingList = new MailingList();
1198 mailingList.setName( columnFamilyResult.getString( "name" ) );
1199 mailingList.setMainArchiveUrl( columnFamilyResult.getString( "mainArchiveUrl" ) );
1200 mailingList.setPostAddress( columnFamilyResult.getString( "postAddress" ) );
1201 mailingList.setSubscribeAddress( columnFamilyResult.getString( "subscribeAddress" ) );
1202 mailingList.setUnsubscribeAddress( columnFamilyResult.getString( "unsubscribeAddress" ) );
1204 List<String> otherArchives = new ArrayList<String>();
1206 for ( String columnName : columnFamilyResult.getColumnNames() )
1208 if ( StringUtils.startsWith( columnName, "otherArchive." ) )
1210 otherArchives.add( columnFamilyResult.getString( columnName ) );
1214 mailingList.setOtherArchives( otherArchives );
1215 mailingLists.add( mailingList );
1218 return mailingLists;
1221 protected void recordLicenses( String projectVersionMetadataKey, List<License> licenses )
1224 if ( licenses == null || licenses.isEmpty() )
1228 Mutator<String> licenseMutator = this.licenseTemplate.createMutator();
1230 for ( License license : licenses )
1232 // we don't care about the key as the real used one with the projectVersionMetadata
1233 String keyLicense = UUID.randomUUID().toString();
1234 String cfLicense = cassandraArchivaManager.getLicenseFamilyName();
1236 addInsertion( licenseMutator, keyLicense, cfLicense, "projectVersionMetadataModel.key",
1237 projectVersionMetadataKey );
1239 addInsertion( licenseMutator, keyLicense, cfLicense, "name", license.getName() );
1241 addInsertion( licenseMutator, keyLicense, cfLicense, "url", license.getUrl() );
1244 licenseMutator.execute();
1247 protected void removeLicenses( String projectVersionMetadataKey )
1249 StringSerializer ss = StringSerializer.get();
1250 QueryResult<OrderedRows<String, String, String>> result =
1251 HFactory.createRangeSlicesQuery( cassandraArchivaManager.getKeyspace(), ss, ss, ss ) //
1252 .setColumnFamily( cassandraArchivaManager.getLicenseFamilyName() ) //
1253 .setColumnNames( "name" ) //
1254 .setRowCount( Integer.MAX_VALUE ) //
1255 .addEqualsExpression( "projectVersionMetadataModel.key", projectVersionMetadataKey ) //
1257 for ( Row<String, String, String> row : result.get() )
1259 this.licenseTemplate.deleteRow( row.getKey() );
1263 protected List<License> getLicenses( String projectVersionMetadataKey )
1265 List<License> licenses = new ArrayList<License>();
1267 StringSerializer ss = StringSerializer.get();
1268 QueryResult<OrderedRows<String, String, String>> result =
1269 HFactory.createRangeSlicesQuery( cassandraArchivaManager.getKeyspace(), ss, ss, ss ) //
1270 .setColumnFamily( cassandraArchivaManager.getLicenseFamilyName() ) //
1271 .setColumnNames( "projectVersionMetadataModel.key" ) //
1272 .setRowCount( Integer.MAX_VALUE ) //
1273 .addEqualsExpression( "projectVersionMetadataModel.key", projectVersionMetadataKey ) //
1276 for ( Row<String, String, String> row : result.get() )
1278 ColumnFamilyResult<String, String> columnFamilyResult = this.licenseTemplate.queryColumns( row.getKey() );
1281 new License( columnFamilyResult.getString( "name" ), columnFamilyResult.getString( "url" ) ) );
1288 protected void recordDependencies( String projectVersionMetadataKey, List<Dependency> dependencies )
1291 if ( dependencies == null || dependencies.isEmpty() )
1295 Mutator<String> dependencyMutator = this.dependencyTemplate.createMutator();
1297 for ( Dependency dependency : dependencies )
1299 // we don't care about the key as the real used one with the projectVersionMetadata
1300 String keyDependency = UUID.randomUUID().toString();
1301 String cfDependency = cassandraArchivaManager.getDependencyFamilyName();
1303 addInsertion( dependencyMutator, keyDependency, cfDependency, "projectVersionMetadataModel.key",
1304 projectVersionMetadataKey );
1306 addInsertion( dependencyMutator, keyDependency, cfDependency, "classifier", dependency.getClassifier() );
1308 addInsertion( dependencyMutator, keyDependency, cfDependency, "optional",
1309 Boolean.toString( dependency.isOptional() ) );
1311 addInsertion( dependencyMutator, keyDependency, cfDependency, "scope", dependency.getScope() );
1313 addInsertion( dependencyMutator, keyDependency, cfDependency, "systemPath", dependency.getSystemPath() );
1315 addInsertion( dependencyMutator, keyDependency, cfDependency, "type", dependency.getType() );
1317 addInsertion( dependencyMutator, keyDependency, cfDependency, "artifactId", dependency.getArtifactId() );
1319 addInsertion( dependencyMutator, keyDependency, cfDependency, "groupId", dependency.getGroupId() );
1321 addInsertion( dependencyMutator, keyDependency, cfDependency, "version", dependency.getVersion() );
1324 dependencyMutator.execute();
1327 protected void removeDependencies( String projectVersionMetadataKey )
1329 StringSerializer ss = StringSerializer.get();
1330 QueryResult<OrderedRows<String, String, String>> result =
1331 HFactory.createRangeSlicesQuery( cassandraArchivaManager.getKeyspace(), ss, ss, ss ) //
1332 .setColumnFamily( cassandraArchivaManager.getDependencyFamilyName() ) //
1333 .setColumnNames( "groupId" ) //
1334 .setRowCount( Integer.MAX_VALUE ) //
1335 .addEqualsExpression( "projectVersionMetadataModel.key", projectVersionMetadataKey ) //
1337 for ( Row<String, String, String> row : result.get() )
1339 this.dependencyTemplate.deleteRow( row.getKey() );
1343 protected List<Dependency> getDependencies( String projectVersionMetadataKey )
1345 List<Dependency> dependencies = new ArrayList<Dependency>();
1347 StringSerializer ss = StringSerializer.get();
1348 QueryResult<OrderedRows<String, String, String>> result =
1349 HFactory.createRangeSlicesQuery( cassandraArchivaManager.getKeyspace(), ss, ss, ss ) //
1350 .setColumnFamily( cassandraArchivaManager.getDependencyFamilyName() ) //
1351 .setColumnNames( "projectVersionMetadataModel.key" ) //
1352 .setRowCount( Integer.MAX_VALUE ) //
1353 .addEqualsExpression( "projectVersionMetadataModel.key", projectVersionMetadataKey ) //
1356 for ( Row<String, String, String> row : result.get() )
1358 ColumnFamilyResult<String, String> columnFamilyResult =
1359 this.dependencyTemplate.queryColumns( row.getKey() );
1361 Dependency dependency = new Dependency();
1362 dependency.setClassifier( columnFamilyResult.getString( "classifier" ) );
1364 dependency.setOptional( Boolean.parseBoolean( columnFamilyResult.getString( "optional" ) ) );
1366 dependency.setScope( columnFamilyResult.getString( "scope" ) );
1368 dependency.setSystemPath( columnFamilyResult.getString( "systemPath" ) );
1370 dependency.setType( columnFamilyResult.getString( "type" ) );
1372 dependency.setArtifactId( columnFamilyResult.getString( "artifactId" ) );
1374 dependency.setGroupId( columnFamilyResult.getString( "groupId" ) );
1376 dependency.setVersion( columnFamilyResult.getString( "version" ) );
1378 dependencies.add( dependency );
1381 return dependencies;
1385 public void updateArtifact( String repositoryId, String namespaceId, String projectId, String projectVersion,
1386 ArtifactMetadata artifactMeta )
1387 throws MetadataRepositoryException
1390 Namespace namespace = getNamespace( repositoryId, namespaceId );
1391 if ( namespace == null )
1393 namespace = updateOrAddNamespace( repositoryId, namespaceId );
1396 ProjectMetadata projectMetadata = new ProjectMetadata();
1397 projectMetadata.setId( projectId );
1398 projectMetadata.setNamespace( namespaceId );
1399 updateProject( repositoryId, projectMetadata );
1401 String key = new ArtifactMetadataModel.KeyBuilder().withNamespace( namespace ).withProject( projectId ).withId(
1402 artifactMeta.getId() ).withProjectVersion( projectVersion ).build();
1406 boolean exists = this.artifactMetadataTemplate.isColumnsExist( key );
1411 ColumnFamilyUpdater<String, String> updater = this.artifactMetadataTemplate.createUpdater( key );
1412 updater.setLong( "fileLastModified", artifactMeta.getFileLastModified().getTime() );
1413 updater.setLong( "whenGathered", artifactMeta.getWhenGathered().getTime() );
1414 updater.setLong( "size", artifactMeta.getSize() );
1415 updater.setString( "md5", artifactMeta.getMd5() );
1416 updater.setString( "sha1", artifactMeta.getSha1() );
1417 updater.setString( "version", artifactMeta.getVersion() );
1418 this.artifactMetadataTemplate.update( updater );
1422 String cf = this.cassandraArchivaManager.getArtifactMetadataFamilyName();
1424 this.artifactMetadataTemplate.createMutator() //
1425 .addInsertion( key, cf, column( "id", artifactMeta.getId() ) )//
1426 .addInsertion( key, cf, column( "repositoryName", repositoryId ) ) //
1427 .addInsertion( key, cf, column( "namespaceId", namespaceId ) ) //
1428 .addInsertion( key, cf, column( "project", artifactMeta.getProject() ) ) //
1429 .addInsertion( key, cf, column( "projectVersion", projectVersion ) ) //
1430 .addInsertion( key, cf, column( "version", artifactMeta.getVersion() ) ) //
1431 .addInsertion( key, cf, column( "fileLastModified", artifactMeta.getFileLastModified().getTime() ) ) //
1432 .addInsertion( key, cf, column( "size", artifactMeta.getSize() ) ) //
1433 .addInsertion( key, cf, column( "md5", artifactMeta.getMd5() ) ) //
1434 .addInsertion( key, cf, column( "sha1", artifactMeta.getSha1() ) ) //
1435 .addInsertion( key, cf, column( "whenGathered", artifactMeta.getWhenGathered().getTime() ) )//
1439 key = new ProjectVersionMetadataModel.KeyBuilder() //
1440 .withRepository( repositoryId ) //
1441 .withNamespace( namespace ) //
1442 .withProjectId( projectId ) //
1443 .withProjectVersion( projectVersion ) //
1444 .withId( artifactMeta.getId() ) //
1447 Keyspace keyspace = cassandraArchivaManager.getKeyspace();
1448 StringSerializer ss = StringSerializer.get();
1450 QueryResult<OrderedRows<String, String, String>> result = HFactory //
1451 .createRangeSlicesQuery( keyspace, ss, ss, ss ) //
1452 .setColumnFamily( cassandraArchivaManager.getProjectVersionMetadataFamilyName() ) //
1453 .setColumnNames( "version" ) //
1454 .addEqualsExpression( "repositoryName", repositoryId ) //
1455 .addEqualsExpression( "namespaceId", namespaceId ) //
1456 .addEqualsExpression( "projectId", projectId ) //
1457 .addEqualsExpression( "projectVersion", projectVersion ) //
1458 .addEqualsExpression( "version", artifactMeta.getVersion() ) //
1461 exists = result.get().getCount() > 0;
1465 String cf = this.cassandraArchivaManager.getProjectVersionMetadataFamilyName();
1467 projectVersionMetadataTemplate.createMutator() //
1468 .addInsertion( key, cf, column( "namespaceId", namespace.getName() ) ) //
1469 .addInsertion( key, cf, column( "repositoryName", repositoryId ) ) //
1470 .addInsertion( key, cf, column( "projectVersion", projectVersion ) ) //
1471 .addInsertion( key, cf, column( "projectId", projectId ) ) //
1472 .addInsertion( key, cf, column( "version", artifactMeta.getVersion() ) ) //
1477 ArtifactMetadataModel artifactMetadataModel = new ArtifactMetadataModel();
1479 artifactMetadataModel.setRepositoryId( repositoryId );
1480 artifactMetadataModel.setNamespace( namespaceId );
1481 artifactMetadataModel.setProject( projectId );
1482 artifactMetadataModel.setProjectVersion( projectVersion );
1483 artifactMetadataModel.setVersion( artifactMeta.getVersion() );
1484 artifactMetadataModel.setFileLastModified( artifactMeta.getFileLastModified() == null
1485 ? new Date().getTime()
1486 : artifactMeta.getFileLastModified().getTime() );
1489 updateFacets( artifactMeta, artifactMetadataModel );
1494 public Collection<String> getArtifactVersions( final String repoId, final String namespace, final String projectId,
1495 final String projectVersion )
1496 throws MetadataResolutionException
1498 Keyspace keyspace = cassandraArchivaManager.getKeyspace();
1499 StringSerializer ss = StringSerializer.get();
1500 QueryResult<OrderedRows<String, String, String>> result = HFactory //
1501 .createRangeSlicesQuery( keyspace, ss, ss, ss ) //
1502 .setColumnFamily( cassandraArchivaManager.getProjectVersionMetadataFamilyName() ) //
1503 .setColumnNames( "version" ) //
1504 .addEqualsExpression( "repositoryName", repoId ) //
1505 .addEqualsExpression( "namespaceId", namespace ) //
1506 .addEqualsExpression( "projectId", projectId ) //
1507 .addEqualsExpression( "projectVersion", projectVersion ) //
1510 final Set<String> versions = new HashSet<String>();
1512 for ( Row<String, String, String> row : result.get() )
1514 versions.add( getStringValue( row.getColumnSlice(), "version" ) );
1522 * iterate over available facets to remove/add from the artifactMetadata
1524 * @param facetedMetadata
1525 * @param artifactMetadataModel only use for the key
1527 private void updateFacets( final FacetedMetadata facetedMetadata,
1528 final ArtifactMetadataModel artifactMetadataModel )
1530 Keyspace keyspace = cassandraArchivaManager.getKeyspace();
1531 StringSerializer ss = StringSerializer.get();
1532 String cf = cassandraArchivaManager.getMetadataFacetFamilyName();
1534 for ( final String facetId : metadataFacetFactories.keySet() )
1536 MetadataFacet metadataFacet = facetedMetadata.getFacet( facetId );
1537 if ( metadataFacet == null )
1543 QueryResult<OrderedRows<String, String, String>> result =
1544 HFactory.createRangeSlicesQuery( keyspace, ss, ss, ss ) //
1545 .setColumnFamily( cf ) //
1546 .setColumnNames( "repositoryName" ) //
1547 .addEqualsExpression( "repositoryName", artifactMetadataModel.getRepositoryId() ) //
1548 .addEqualsExpression( "namespaceId", artifactMetadataModel.getNamespace() ) //
1549 .addEqualsExpression( "projectId", artifactMetadataModel.getProject() ) //
1550 .addEqualsExpression( "projectVersion",
1551 artifactMetadataModel.getProjectVersion() ).addEqualsExpression( "facetId",
1555 for ( Row<String, String, String> row : result.get().getList() )
1557 this.metadataFacetTemplate.deleteRow( row.getKey() );
1560 Map<String, String> properties = metadataFacet.toProperties();
1562 for ( Map.Entry<String, String> entry : properties.entrySet() )
1564 String key = new MetadataFacetModel.KeyBuilder().withKey( entry.getKey() ).withArtifactMetadataModel(
1565 artifactMetadataModel ).withFacetId( facetId ).withName( metadataFacet.getName() ).build();
1566 metadataFacetTemplate.createMutator() //
1567 .addInsertion( key, cf, column( "repositoryName", artifactMetadataModel.getRepositoryId() ) ) //
1568 .addInsertion( key, cf, column( "namespaceId", artifactMetadataModel.getNamespace() ) ) //
1569 .addInsertion( key, cf, column( "projectId", artifactMetadataModel.getProject() ) ) //
1570 .addInsertion( key, cf, column( "projectVersion", artifactMetadataModel.getProjectVersion() ) ) //
1571 .addInsertion( key, cf, column( "facetId", facetId ) ) //
1572 .addInsertion( key, cf, column( "key", entry.getKey() ) ) //
1573 .addInsertion( key, cf, column( "value", entry.getValue() ) ) //
1574 .addInsertion( key, cf, column( "name", metadataFacet.getName() ) ) //
1582 public List<String> getMetadataFacets( final String repositoryId, final String facetId )
1583 throws MetadataRepositoryException
1586 Keyspace keyspace = cassandraArchivaManager.getKeyspace();
1587 StringSerializer ss = StringSerializer.get();
1588 QueryResult<OrderedRows<String, String, String>> result = HFactory //
1589 .createRangeSlicesQuery( keyspace, ss, ss, ss ) //
1590 .setColumnFamily( cassandraArchivaManager.getMetadataFacetFamilyName() ) //
1591 .setColumnNames( "name" ) //
1592 .addEqualsExpression( "repositoryName", repositoryId ) //
1593 .addEqualsExpression( "facetId", facetId ) //
1596 final List<String> facets = new ArrayList<String>();
1598 for ( Row<String, String, String> row : result.get() )
1600 facets.add( getStringValue( row.getColumnSlice(), "name" ) );
1606 public boolean hasMetadataFacet( String repositoryId, String facetId )
1607 throws MetadataRepositoryException
1609 return !getMetadataFacets( repositoryId, facetId ).isEmpty();
1613 public MetadataFacet getMetadataFacet( final String repositoryId, final String facetId, final String name )
1614 throws MetadataRepositoryException
1617 MetadataFacetFactory metadataFacetFactory = metadataFacetFactories.get( facetId );
1618 if ( metadataFacetFactory == null )
1623 Keyspace keyspace = cassandraArchivaManager.getKeyspace();
1624 StringSerializer ss = StringSerializer.get();
1625 QueryResult<OrderedRows<String, String, String>> result = HFactory //
1626 .createRangeSlicesQuery( keyspace, ss, ss, ss ) //
1627 .setColumnFamily( cassandraArchivaManager.getMetadataFacetFamilyName() ) //
1628 .setColumnNames( "key", "value" ) //
1629 .addEqualsExpression( "repositoryName", repositoryId ) //
1630 .addEqualsExpression( "facetId", facetId ) //
1631 .addEqualsExpression( "name", name ) //
1634 MetadataFacet metadataFacet = metadataFacetFactory.createMetadataFacet( repositoryId, name );
1635 int size = result.get().getCount();
1640 Map<String, String> map = new HashMap<String, String>( size );
1641 for ( Row<String, String, String> row : result.get() )
1643 ColumnSlice<String, String> columnSlice = row.getColumnSlice();
1644 map.put( getStringValue( columnSlice, "key" ), getStringValue( columnSlice, "value" ) );
1646 metadataFacet.fromProperties( map );
1647 return metadataFacet;
1651 public void addMetadataFacet( String repositoryId, MetadataFacet metadataFacet )
1652 throws MetadataRepositoryException
1655 if ( metadataFacet == null )
1660 if ( metadataFacet.toProperties().isEmpty() )
1662 String key = new MetadataFacetModel.KeyBuilder().withRepositoryId( repositoryId ).withFacetId(
1663 metadataFacet.getFacetId() ).withName( metadataFacet.getName() ).build();
1665 boolean exists = this.metadataFacetTemplate.isColumnsExist( key );
1669 ColumnFamilyUpdater<String, String> updater = this.metadataFacetTemplate.createUpdater( key );
1670 updater.setString( "facetId", metadataFacet.getFacetId() );
1671 updater.setString( "name", metadataFacet.getName() );
1672 this.metadataFacetTemplate.update( updater );
1676 String cf = this.cassandraArchivaManager.getMetadataFacetFamilyName();
1677 this.metadataFacetTemplate.createMutator() //
1678 .addInsertion( key, cf, column( "repositoryName", repositoryId ) ) //
1679 .addInsertion( key, cf, column( "facetId", metadataFacet.getFacetId() ) ) //
1680 .addInsertion( key, cf, column( "name", metadataFacet.getName() ) ) //
1687 for ( Map.Entry<String, String> entry : metadataFacet.toProperties().entrySet() )
1690 String key = new MetadataFacetModel.KeyBuilder().withRepositoryId( repositoryId ).withFacetId(
1691 metadataFacet.getFacetId() ).withName( metadataFacet.getName() ).withKey( entry.getKey() ).build();
1693 boolean exists = this.metadataFacetTemplate.isColumnsExist( key );
1696 //metadataFacetModel = new MetadataFacetModel();
1697 // we need to store the repositoryId
1698 //ArtifactMetadataModel artifactMetadataModel = new ArtifactMetadataModel();
1699 //artifactMetadataModel.setRepositoryId( repositoryId );
1700 //metadataFacetModel.setArtifactMetadataModel( artifactMetadataModel );
1701 //metadataFacetModel.setId( key );
1702 //metadataFacetModel.setKey( entry.getKey() );
1703 //metadataFacetModel.setFacetId( metadataFacet.getFacetId() );
1704 //metadataFacetModel.setName( metadataFacet.getName() );
1706 String cf = this.cassandraArchivaManager.getMetadataFacetFamilyName();
1707 this.metadataFacetTemplate.createMutator() //
1708 .addInsertion( key, cf, column( "repositoryName", repositoryId ) ) //
1709 .addInsertion( key, cf, column( "facetId", metadataFacet.getFacetId() ) ) //
1710 .addInsertion( key, cf, column( "name", metadataFacet.getName() ) ) //
1711 .addInsertion( key, cf, column( "key", entry.getKey() ) ) //
1712 .addInsertion( key, cf, column( "value", entry.getValue() ) ) //
1718 ColumnFamilyUpdater<String, String> updater = this.metadataFacetTemplate.createUpdater( key );
1719 updater.setString( "value", entry.getValue() );
1720 this.metadataFacetTemplate.update( updater );
1727 public void removeMetadataFacets( final String repositoryId, final String facetId )
1728 throws MetadataRepositoryException
1730 Keyspace keyspace = cassandraArchivaManager.getKeyspace();
1731 StringSerializer ss = StringSerializer.get();
1732 QueryResult<OrderedRows<String, String, String>> result = HFactory //
1733 .createRangeSlicesQuery( keyspace, ss, ss, ss ) //
1734 .setColumnFamily( cassandraArchivaManager.getMetadataFacetFamilyName() ) //
1735 .setColumnNames( "key", "value" ) //
1736 .addEqualsExpression( "repositoryName", repositoryId ) //
1737 .addEqualsExpression( "facetId", facetId ) //
1740 for ( Row<String, String, String> row : result.get() )
1742 this.metadataFacetTemplate.deleteRow( row.getKey() );
1748 public void removeMetadataFacet( final String repositoryId, final String facetId, final String name )
1749 throws MetadataRepositoryException
1751 Keyspace keyspace = cassandraArchivaManager.getKeyspace();
1752 StringSerializer ss = StringSerializer.get();
1753 QueryResult<OrderedRows<String, String, String>> result = HFactory //
1754 .createRangeSlicesQuery( keyspace, ss, ss, ss ) //
1755 .setColumnFamily( cassandraArchivaManager.getMetadataFacetFamilyName() ) //
1756 .setColumnNames( "key", "value" ) //
1757 .addEqualsExpression( "repositoryName", repositoryId ) //
1758 .addEqualsExpression( "facetId", facetId ) //
1759 .addEqualsExpression( "name", name ) //
1762 for ( Row<String, String, String> row : result.get() )
1764 this.metadataFacetTemplate.deleteRow( row.getKey() );
1769 public List<ArtifactMetadata> getArtifactsByDateRange( final String repositoryId, final Date startTime,
1770 final Date endTime )
1771 throws MetadataRepositoryException
1774 Keyspace keyspace = cassandraArchivaManager.getKeyspace();
1775 StringSerializer ss = StringSerializer.get();
1776 LongSerializer ls = LongSerializer.get();
1777 RangeSlicesQuery<String, String, Long> query = HFactory //
1778 .createRangeSlicesQuery( keyspace, ss, ss, ls ) //
1779 .setColumnFamily( cassandraArchivaManager.getArtifactMetadataFamilyName() ) //
1780 .setColumnNames( "namespaceId", "size", "id", "fileLastModified", "md5", "project", "projectVersion",
1781 "repositoryName", "version", "whenGathered", "sha1" ); //
1783 if ( startTime != null )
1785 query = query.addGteExpression( "whenGathered", startTime.getTime() );
1787 if ( endTime != null )
1789 query = query.addLteExpression( "whenGathered", endTime.getTime() );
1791 QueryResult<OrderedRows<String, String, Long>> result = query.execute();
1793 List<ArtifactMetadata> artifactMetadatas = new ArrayList<ArtifactMetadata>( result.get().getCount() );
1795 for ( Row<String, String, Long> row : result.get() )
1797 ColumnSlice<String, Long> columnSlice = row.getColumnSlice();
1798 String repositoryName = getAsStringValue( columnSlice, "repositoryName" );
1799 if ( StringUtils.equals( repositoryName, repositoryId ) )
1802 artifactMetadatas.add( mapArtifactMetadataLongColumnSlice( columnSlice ) );
1806 return artifactMetadatas;
1810 protected ArtifactMetadata mapArtifactMetadataLongColumnSlice( ColumnSlice<String, Long> columnSlice )
1812 ArtifactMetadata artifactMetadata = new ArtifactMetadata();
1813 artifactMetadata.setNamespace( getAsStringValue( columnSlice, "namespaceId" ) );
1814 artifactMetadata.setSize( getLongValue( columnSlice, "size" ) );
1815 artifactMetadata.setId( getAsStringValue( columnSlice, "id" ) );
1816 artifactMetadata.setFileLastModified( getLongValue( columnSlice, "fileLastModified" ) );
1817 artifactMetadata.setMd5( getAsStringValue( columnSlice, "md5" ) );
1818 artifactMetadata.setProject( getAsStringValue( columnSlice, "project" ) );
1819 artifactMetadata.setProjectVersion( getAsStringValue( columnSlice, "projectVersion" ) );
1820 artifactMetadata.setRepositoryId( getAsStringValue( columnSlice, "repositoryName" ) );
1821 artifactMetadata.setSha1( getAsStringValue( columnSlice, "sha1" ) );
1822 artifactMetadata.setVersion( getAsStringValue( columnSlice, "version" ) );
1823 Long whenGathered = getLongValue( columnSlice, "whenGathered" );
1824 if ( whenGathered != null )
1826 artifactMetadata.setWhenGathered( new Date( whenGathered ) );
1828 return artifactMetadata;
1831 protected ArtifactMetadata mapArtifactMetadataStringColumnSlice( ColumnSlice<String, String> columnSlice )
1833 ArtifactMetadata artifactMetadata = new ArtifactMetadata();
1834 artifactMetadata.setNamespace( getStringValue( columnSlice, "namespaceId" ) );
1835 artifactMetadata.setSize( getAsLongValue( columnSlice, "size" ) );
1836 artifactMetadata.setId( getStringValue( columnSlice, "id" ) );
1837 artifactMetadata.setFileLastModified( getAsLongValue( columnSlice, "fileLastModified" ) );
1838 artifactMetadata.setMd5( getStringValue( columnSlice, "md5" ) );
1839 artifactMetadata.setProject( getStringValue( columnSlice, "project" ) );
1840 artifactMetadata.setProjectVersion( getStringValue( columnSlice, "projectVersion" ) );
1841 artifactMetadata.setRepositoryId( getStringValue( columnSlice, "repositoryName" ) );
1842 artifactMetadata.setSha1( getStringValue( columnSlice, "sha1" ) );
1843 artifactMetadata.setVersion( getStringValue( columnSlice, "version" ) );
1844 Long whenGathered = getAsLongValue( columnSlice, "whenGathered" );
1845 if ( whenGathered != null )
1847 artifactMetadata.setWhenGathered( new Date( whenGathered ) );
1849 return artifactMetadata;
1853 public Collection<ArtifactMetadata> getArtifactsByChecksum( final String repositoryId, final String checksum )
1854 throws MetadataRepositoryException
1856 Keyspace keyspace = cassandraArchivaManager.getKeyspace();
1857 StringSerializer ss = StringSerializer.get();
1859 // cql cannot run or in queries so running twice the query
1860 Map<String, ArtifactMetadata> artifactMetadataMap = new HashMap<String, ArtifactMetadata>();
1862 RangeSlicesQuery<String, String, String> query = HFactory //
1863 .createRangeSlicesQuery( keyspace, ss, ss, ss ) //
1864 .setColumnFamily( cassandraArchivaManager.getArtifactMetadataFamilyName() ) //
1865 .setColumnNames( "namespaceId", "size", "id", "fileLastModified", "md5", "project", "projectVersion",
1866 "repositoryName", "version", "whenGathered", "sha1" ); //
1868 query = query.addEqualsExpression( "sha1", checksum ).addEqualsExpression( "repositoryName", repositoryId );
1870 QueryResult<OrderedRows<String, String, String>> result = query.execute();
1872 for ( Row<String, String, String> row : result.get() )
1874 ColumnSlice<String, String> columnSlice = row.getColumnSlice();
1876 artifactMetadataMap.put( row.getKey(), mapArtifactMetadataStringColumnSlice( columnSlice ) );
1881 .createRangeSlicesQuery( keyspace, ss, ss, ss ) //
1882 .setColumnFamily( cassandraArchivaManager.getArtifactMetadataFamilyName() ) //
1883 .setColumnNames( "namespaceId", "size", "id", "fileLastModified", "md5", "project", "projectVersion",
1884 "repositoryName", "version", "whenGathered", "sha1" ); //
1886 query = query.addEqualsExpression( "md5", checksum ).addEqualsExpression( "repositoryName", repositoryId );
1888 result = query.execute();
1890 for ( Row<String, String, String> row : result.get() )
1892 ColumnSlice<String, String> columnSlice = row.getColumnSlice();
1894 artifactMetadataMap.put( row.getKey(), mapArtifactMetadataStringColumnSlice( columnSlice ) );
1898 return artifactMetadataMap.values();
1903 public void removeArtifact( final String repositoryId, final String namespace, final String project,
1904 final String version, final String id )
1905 throws MetadataRepositoryException
1907 logger.debug( "removeArtifact repositoryId: '{}', namespace: '{}', project: '{}', version: '{}', id: '{}'",
1908 repositoryId, namespace, project, version, id );
1910 new ArtifactMetadataModel.KeyBuilder().withRepositoryId( repositoryId ).withNamespace( namespace ).withId(
1911 id ).withProjectVersion( version ).withProject( project ).build();
1913 this.artifactMetadataTemplate.deleteRow( key );
1915 key = new ProjectVersionMetadataModel.KeyBuilder() //
1916 .withRepository( repositoryId ) //
1917 .withNamespace( namespace ) //
1918 .withProjectId( project ) //
1919 .withProjectVersion( version ) //
1923 this.projectVersionMetadataTemplate.deleteRow( key );
1927 public void removeArtifact( ArtifactMetadata artifactMetadata, String baseVersion )
1928 throws MetadataRepositoryException
1930 logger.debug( "removeArtifact repositoryId: '{}', namespace: '{}', project: '{}', version: '{}', id: '{}'",
1931 artifactMetadata.getRepositoryId(), artifactMetadata.getNamespace(),
1932 artifactMetadata.getProject(), baseVersion, artifactMetadata.getId() );
1934 new ArtifactMetadataModel.KeyBuilder().withRepositoryId( artifactMetadata.getRepositoryId() ).withNamespace(
1935 artifactMetadata.getNamespace() ).withId( artifactMetadata.getId() ).withProjectVersion(
1936 baseVersion ).withProject( artifactMetadata.getProject() ).build();
1938 this.artifactMetadataTemplate.deleteRow( key );
1943 public void removeArtifact( final String repositoryId, final String namespace, final String project,
1944 final String version, final MetadataFacet metadataFacet )
1945 throws MetadataRepositoryException
1948 Keyspace keyspace = cassandraArchivaManager.getKeyspace();
1950 StringSerializer ss = StringSerializer.get();
1952 RangeSlicesQuery<String, String, String> query = HFactory //
1953 .createRangeSlicesQuery( keyspace, ss, ss, ss ) //
1954 .setColumnFamily( cassandraArchivaManager.getArtifactMetadataFamilyName() ) //
1955 .setColumnNames( "namespaceId" ); //
1957 query = query.addEqualsExpression( "repositoryName", repositoryId ) //
1958 .addEqualsExpression( "namespaceId", namespace ) //
1959 .addEqualsExpression( "project", project ) //
1960 .addEqualsExpression( "version", version );
1962 QueryResult<OrderedRows<String, String, String>> result = query.execute();
1964 for ( Row<String, String, String> row : result.get() )
1966 this.artifactMetadataTemplate.deleteRow( row.getKey() );
1974 public List<ArtifactMetadata> getArtifacts( final String repositoryId )
1975 throws MetadataRepositoryException
1977 Keyspace keyspace = cassandraArchivaManager.getKeyspace();
1978 StringSerializer ss = StringSerializer.get();
1980 RangeSlicesQuery<String, String, String> query = HFactory //
1981 .createRangeSlicesQuery( keyspace, ss, ss, ss ) //
1982 .setColumnFamily( cassandraArchivaManager.getArtifactMetadataFamilyName() ) //
1983 .setColumnNames( "namespaceId", "size", "id", "fileLastModified", "md5", "project", "projectVersion",
1984 "repositoryName", "version", "whenGathered", "sha1" ); //
1986 query = query.addEqualsExpression( "repositoryName", repositoryId );
1988 QueryResult<OrderedRows<String, String, String>> result = query.execute();
1990 List<ArtifactMetadata> artifactMetadatas = new ArrayList<ArtifactMetadata>( result.get().getCount() );
1992 for ( Row<String, String, String> row : result.get() )
1994 ColumnSlice<String, String> columnSlice = row.getColumnSlice();
1996 artifactMetadatas.add( mapArtifactMetadataStringColumnSlice( columnSlice ) );
2000 return artifactMetadatas;
2005 public Collection<ProjectVersionReference> getProjectReferences( String repoId, String namespace, String projectId,
2006 String projectVersion )
2007 throws MetadataResolutionException
2009 // FIXME implement this
2010 return Collections.emptyList();
2014 public void removeProjectVersion( final String repoId, final String namespace, final String projectId,
2015 final String projectVersion )
2016 throws MetadataRepositoryException
2019 Keyspace keyspace = cassandraArchivaManager.getKeyspace();
2021 StringSerializer ss = StringSerializer.get();
2023 QueryResult<OrderedRows<String, String, String>> result = HFactory //
2024 .createRangeSlicesQuery( keyspace, ss, ss, ss ) //
2025 .setColumnFamily( cassandraArchivaManager.getProjectVersionMetadataFamilyName() ) //
2026 .setColumnNames( "version" ) //
2027 .addEqualsExpression( "repositoryName", repoId ) //
2028 .addEqualsExpression( "namespaceId", namespace ) //
2029 .addEqualsExpression( "projectId", projectId ) //
2030 .addEqualsExpression( "projectVersion", projectVersion ) //
2033 for ( Row<String, String, String> row : result.get().getList() )
2035 this.projectVersionMetadataTemplate.deleteRow( row.getKey() );
2038 RangeSlicesQuery<String, String, String> query = HFactory //
2039 .createRangeSlicesQuery( keyspace, ss, ss, ss ) //
2040 .setColumnFamily( cassandraArchivaManager.getArtifactMetadataFamilyName() ) //
2041 .setColumnNames( "namespaceId" ); //
2043 query = query.addEqualsExpression( "repositoryName", repoId ) //
2044 .addEqualsExpression( "namespaceId", namespace ) //
2045 .addEqualsExpression( "project", projectId ) //
2046 .addEqualsExpression( "projectVersion", projectVersion );
2048 result = query.execute();
2050 for ( Row<String, String, String> row : result.get() )
2052 this.artifactMetadataTemplate.deleteRow( row.getKey() );
2058 public Collection<ArtifactMetadata> getArtifacts( final String repoId, final String namespace,
2059 final String projectId, final String projectVersion )
2060 throws MetadataResolutionException
2063 Keyspace keyspace = cassandraArchivaManager.getKeyspace();
2065 StringSerializer ss = StringSerializer.get();
2067 QueryResult<OrderedRows<String, String, String>> result =
2068 HFactory.createRangeSlicesQuery( keyspace, ss, ss, ss ) //
2069 .setColumnFamily( cassandraArchivaManager.getArtifactMetadataFamilyName() ) //
2070 .setColumnNames( "id", "repositoryName", "namespaceId", "project", "projectVersion", "version",
2071 "fileLastModified", "size", "md5", "sha1", "whenGathered" )//
2072 .setRowCount( Integer.MAX_VALUE ) //
2073 .addEqualsExpression( "repositoryName", repoId ) //
2074 .addEqualsExpression( "namespaceId", namespace ) //
2075 .addEqualsExpression( "project", projectId ) //
2076 .addEqualsExpression( "projectVersion", projectVersion ) //
2079 if ( result.get() == null || result.get().getCount() < 1 )
2081 return Collections.emptyList();
2084 List<ArtifactMetadata> artifactMetadatas = new ArrayList<ArtifactMetadata>( result.get().getCount() );
2086 for ( Row<String, String, String> row : result.get() )
2088 ColumnSlice<String, String> columnSlice = row.getColumnSlice();
2089 ArtifactMetadata artifactMetadata = new ArtifactMetadata();
2090 artifactMetadata.setNamespace( getStringValue( columnSlice, "namespaceId" ) );
2091 artifactMetadata.setSize( getAsLongValue( columnSlice, "size" ) );
2092 artifactMetadata.setId( getStringValue( columnSlice, "id" ) );
2093 artifactMetadata.setFileLastModified( getAsLongValue( columnSlice, "fileLastModified" ) );
2094 artifactMetadata.setMd5( getStringValue( columnSlice, "md5" ) );
2095 artifactMetadata.setProject( getStringValue( columnSlice, "project" ) );
2096 artifactMetadata.setProjectVersion( getStringValue( columnSlice, "projectVersion" ) );
2097 artifactMetadata.setRepositoryId( repoId );
2098 artifactMetadata.setSha1( getStringValue( columnSlice, "sha1" ) );
2099 artifactMetadata.setVersion( getStringValue( columnSlice, "version" ) );
2100 Long whenGathered = getAsLongValue( columnSlice, "whenGathered" );
2101 if ( whenGathered != null )
2103 artifactMetadata.setWhenGathered( new Date( whenGathered ) );
2105 artifactMetadatas.add( artifactMetadata );
2108 result = HFactory.createRangeSlicesQuery( keyspace, ss, ss, ss ) //
2109 .setColumnFamily( cassandraArchivaManager.getMetadataFacetFamilyName() ) //
2110 .setColumnNames( "facetId", "name", "value", "key", "projectVersion" ) //
2111 .setRowCount( Integer.MAX_VALUE ) //
2112 .addEqualsExpression( "repositoryName", repoId ) //
2113 .addEqualsExpression( "namespaceId", namespace ) //
2114 .addEqualsExpression( "projectId", projectId ) //
2115 .addEqualsExpression( "projectVersion", projectVersion ) //
2118 if ( result.get() == null || result.get().getCount() < 1 )
2120 return artifactMetadatas;
2123 final List<MetadataFacetModel> metadataFacetModels =
2124 new ArrayList<MetadataFacetModel>( result.get().getCount() );
2126 for ( Row<String, String, String> row : result.get() )
2128 ColumnSlice<String, String> columnSlice = row.getColumnSlice();
2129 MetadataFacetModel metadataFacetModel = new MetadataFacetModel();
2130 metadataFacetModel.setFacetId( getStringValue( columnSlice, "facetId" ) );
2131 metadataFacetModel.setName( getStringValue( columnSlice, "name" ) );
2132 metadataFacetModel.setValue( getStringValue( columnSlice, "value" ) );
2133 metadataFacetModel.setKey( getStringValue( columnSlice, "key" ) );
2134 metadataFacetModel.setProjectVersion( getStringValue( columnSlice, "projectVersion" ) );
2135 metadataFacetModels.add( metadataFacetModel );
2138 // rebuild MetadataFacet for artifacts
2140 for ( final ArtifactMetadata artifactMetadata : artifactMetadatas )
2142 Iterable<MetadataFacetModel> metadataFacetModelIterable =
2143 Iterables.filter( metadataFacetModels, new Predicate<MetadataFacetModel>()
2146 public boolean apply( MetadataFacetModel metadataFacetModel )
2148 if ( metadataFacetModel != null )
2150 return StringUtils.equals( artifactMetadata.getVersion(),
2151 metadataFacetModel.getProjectVersion() );
2156 Iterator<MetadataFacetModel> iterator = metadataFacetModelIterable.iterator();
2157 Map<String, List<MetadataFacetModel>> metadataFacetValuesPerFacetId =
2158 new HashMap<String, List<MetadataFacetModel>>();
2159 while ( iterator.hasNext() )
2161 MetadataFacetModel metadataFacetModel = iterator.next();
2162 List<MetadataFacetModel> values = metadataFacetValuesPerFacetId.get( metadataFacetModel.getName() );
2163 if ( values == null )
2165 values = new ArrayList<MetadataFacetModel>();
2166 metadataFacetValuesPerFacetId.put( metadataFacetModel.getFacetId(), values );
2168 values.add( metadataFacetModel );
2172 for ( Map.Entry<String, List<MetadataFacetModel>> entry : metadataFacetValuesPerFacetId.entrySet() )
2174 MetadataFacetFactory metadataFacetFactory = metadataFacetFactories.get( entry.getKey() );
2175 if ( metadataFacetFactory != null )
2177 List<MetadataFacetModel> facetModels = entry.getValue();
2178 if ( !facetModels.isEmpty() )
2180 MetadataFacet metadataFacet =
2181 metadataFacetFactory.createMetadataFacet( repoId, facetModels.get( 0 ).getName() );
2182 Map<String, String> props = new HashMap<String, String>( facetModels.size() );
2183 for ( MetadataFacetModel metadataFacetModel : facetModels )
2185 props.put( metadataFacetModel.getKey(), metadataFacetModel.getValue() );
2187 metadataFacet.fromProperties( props );
2188 artifactMetadata.addFacet( metadataFacet );
2196 return artifactMetadatas;
2202 logger.trace( "save" );
2207 throws MetadataRepositoryException
2209 logger.trace( "close" );
2213 public void revert()
2215 logger.warn( "CassandraMetadataRepository cannot revert" );
2219 public boolean canObtainAccess( Class<?> aClass )
2225 public <T> T obtainAccess( Class<T> aClass )
2226 throws MetadataRepositoryException
2228 throw new IllegalArgumentException(
2229 "Access using " + aClass + " is not supported on the cassandra metadata storage" );
2233 private static class ModelMapperHolder
2235 private static ModelMapper MODEL_MAPPER = new ModelMapper();
2238 protected ModelMapper getModelMapper()
2240 return ModelMapperHolder.MODEL_MAPPER;