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> projectVersionMetadataModelTemplate;
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.projectVersionMetadataModelTemplate =
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.projectVersionMetadataModelTemplate.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.projectVersionMetadataModelTemplate.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.projectVersionMetadataModelTemplate.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().withRepository( repositoryId ).withNamespace(
857 namespaceId ).withProjectId( projectId ).withId( versionMetadata.getId() ).build();
859 // FIXME nested objects to store!!!
862 String cf = cassandraArchivaManager.getProjectVersionMetadataFamilyName();
863 Mutator<String> mutator = projectVersionMetadataModelTemplate.createMutator()
865 .addInsertion( key, cf, column( "projectId", projectId ) ) //
866 .addInsertion( key, cf, column( "repositoryName", repositoryId ) ) //
867 .addInsertion( key, cf, column( "namespaceId", namespaceId ) )//
868 .addInsertion( key, cf, column( "projectVersion", versionMetadata.getVersion() ) ); //
870 addInsertion( mutator, key, cf, "description", versionMetadata.getDescription() );
872 addInsertion( mutator, key, cf, "name", versionMetadata.getName() );
874 addInsertion( mutator, key, cf, "incomplete", Boolean.toString( versionMetadata.isIncomplete() ) );
876 addInsertion( mutator, key, cf, "url", versionMetadata.getUrl() );
878 CiManagement ci = versionMetadata.getCiManagement();
881 addInsertion( mutator, key, cf, "ciManagement.system", ci.getSystem() );
882 addInsertion( mutator, key, cf, "ciManagement.url", ci.getUrl() );
887 IssueManagement issueManagement = versionMetadata.getIssueManagement();
889 if ( issueManagement != null )
891 addInsertion( mutator, key, cf, "issueManagement.system", issueManagement.getSystem() );
892 addInsertion( mutator, key, cf, "issueManagement.url", issueManagement.getUrl() );
897 Organization organization = versionMetadata.getOrganization();
898 if ( organization != null )
900 addInsertion( mutator, key, cf, "organization.name", organization.getName() );
901 addInsertion( mutator, key, cf, "organization.url", organization.getUrl() );
906 Scm scm = versionMetadata.getScm();
909 addInsertion( mutator, key, cf, "scm.url", scm.getUrl() );
910 addInsertion( mutator, key, cf, "scm.connection", scm.getConnection() );
911 addInsertion( mutator, key, cf, "scm.developerConnection", scm.getDeveloperConnection() );
915 recordMailingList( key, versionMetadata.getMailingLists() );
917 recordLicenses( key, versionMetadata.getLicenses() );
919 recordDependencies( key, versionMetadata.getDependencies() );
921 MutationResult mutationResult = mutator.execute();
925 ColumnFamilyUpdater<String, String> updater = projectVersionMetadataModelTemplate.createUpdater( key );
926 updater.setString( "projectId", projectId );
927 updater.setString( "repositoryName", repositoryId );
928 updater.setString( "namespaceId", namespaceId );
929 updater.setString( "projectVersion", versionMetadata.getVersion() );
930 if ( StringUtils.isNotEmpty( versionMetadata.getDescription() ) )
932 updater.setString( "description", versionMetadata.getDescription() );
934 if ( StringUtils.isNotEmpty( versionMetadata.getName() ) )
936 updater.setString( "name", versionMetadata.getName() );
938 updater.setString( "incomplete", Boolean.toString( versionMetadata.isIncomplete() ) );
939 if ( StringUtils.isNotEmpty( versionMetadata.getUrl() ) )
941 updater.setString( "url", versionMetadata.getUrl() );
945 CiManagement ci = versionMetadata.getCiManagement();
948 updater.setString( "ciManagement.system", ci.getSystem() );
949 updater.setString( "ciManagement.url", ci.getUrl() );
953 IssueManagement issueManagement = versionMetadata.getIssueManagement();
954 if ( issueManagement != null )
956 updater.setString( "issueManagement.system", issueManagement.getSystem() );
957 updater.setString( "issueManagement.url", issueManagement.getUrl() );
961 Organization organization = versionMetadata.getOrganization();
962 if ( organization != null )
964 updater.setString( "organization.name", organization.getName() );
965 updater.setString( "organization.url", organization.getUrl() );
969 Scm scm = versionMetadata.getScm();
972 updater.setString( "scm.url", scm.getUrl() );
973 updater.setString( "scm.connection", scm.getConnection() );
974 updater.setString( "scm.developerConnection", scm.getDeveloperConnection() );
978 // update is a delete record
979 removeMailingList( key );
980 recordMailingList( key, versionMetadata.getMailingLists() );
982 removeLicenses( key );
983 recordLicenses( key, versionMetadata.getLicenses() );
985 removeDependencies( key );
986 recordDependencies( key, versionMetadata.getDependencies() );
988 projectVersionMetadataModelTemplate.update( updater );
992 ArtifactMetadataModel artifactMetadataModel = new ArtifactMetadataModel();
993 artifactMetadataModel.setRepositoryId( repositoryId );
994 artifactMetadataModel.setNamespace( namespaceId );
995 artifactMetadataModel.setProject( projectId );
996 artifactMetadataModel.setProjectVersion( versionMetadata.getVersion() );
997 artifactMetadataModel.setVersion( versionMetadata.getVersion() );
998 updateFacets( versionMetadata, artifactMetadataModel );
1004 public ProjectVersionMetadata getProjectVersion( final String repoId, final String namespace,
1005 final String projectId, final String projectVersion )
1006 throws MetadataResolutionException
1008 String key = new ProjectVersionMetadataModel.KeyBuilder().withRepository( repoId ).withNamespace(
1009 namespace ).withProjectId( projectId ).withId( projectVersion ).build();
1011 ColumnFamilyResult<String, String> columnFamilyResult =
1012 this.projectVersionMetadataModelTemplate.queryColumns( key );
1013 if ( !columnFamilyResult.hasResults() )
1018 ProjectVersionMetadata projectVersionMetadata = new ProjectVersionMetadata();
1019 projectVersionMetadata.setId( columnFamilyResult.getString( "projectVersion" ) );
1020 projectVersionMetadata.setDescription( columnFamilyResult.getString( "description" ) );
1021 projectVersionMetadata.setName( columnFamilyResult.getString( "name" ) );
1023 projectVersionMetadata.setIncomplete( Boolean.parseBoolean( columnFamilyResult.getString( "incomplete" ) ) );
1025 projectVersionMetadata.setUrl( columnFamilyResult.getString( "url" ) );
1027 String ciUrl = columnFamilyResult.getString( "ciManagement.url" );
1028 String ciSystem = columnFamilyResult.getString( "ciManagement.system" );
1030 if ( StringUtils.isNotEmpty( ciSystem ) || StringUtils.isNotEmpty( ciUrl ) )
1032 projectVersionMetadata.setCiManagement( new CiManagement( ciSystem, ciUrl ) );
1036 String issueUrl = columnFamilyResult.getString( "issueManagement.url" );
1037 String issueSystem = columnFamilyResult.getString( "issueManagement.system" );
1038 if ( StringUtils.isNotEmpty( issueSystem ) || StringUtils.isNotEmpty( issueUrl ) )
1040 projectVersionMetadata.setIssueManagement( new IssueManagement( issueSystem, issueUrl ) );
1044 String organizationUrl = columnFamilyResult.getString( "organization.url" );
1045 String organizationName = columnFamilyResult.getString( "organization.name" );
1046 if ( StringUtils.isNotEmpty( organizationUrl ) || StringUtils.isNotEmpty( organizationName ) )
1048 projectVersionMetadata.setOrganization( new Organization( organizationName, organizationUrl ) );
1052 String devConn = columnFamilyResult.getString( "scm.developerConnection" );
1053 String conn = columnFamilyResult.getString( "scm.connection" );
1054 String url = columnFamilyResult.getString( "scm.url" );
1055 if ( StringUtils.isNotEmpty( devConn ) || StringUtils.isNotEmpty( conn ) || StringUtils.isNotEmpty( url ) )
1057 projectVersionMetadata.setScm( new Scm( conn, devConn, url ) );
1060 projectVersionMetadata.setMailingLists( getMailingLists( key ) );
1061 projectVersionMetadata.setLicenses( getLicenses( key ) );
1062 projectVersionMetadata.setDependencies( getDependencies( key ) );
1065 StringSerializer ss = StringSerializer.get();
1067 Keyspace keyspace = cassandraArchivaManager.getKeyspace();
1068 QueryResult<OrderedRows<String, String, String>> result = HFactory //
1069 .createRangeSlicesQuery( keyspace, ss, ss, ss ) //
1070 .setColumnFamily( cassandraArchivaManager.getMetadataFacetFamilyName() ) //
1071 .setColumnNames( "facetId", "key", "value", "name" ) //
1072 .addEqualsExpression( "repositoryName", repoId ) //
1073 .addEqualsExpression( "namespaceId", namespace ) //
1074 .addEqualsExpression( "projectId", projectId ) //
1075 .addEqualsExpression( "projectVersion", projectVersion ) //
1078 Map<String, Map<String, String>> metadataFacetsPerFacetIds = new HashMap<String, Map<String, String>>();
1080 for ( Row<String, String, String> row : result.get() )
1082 ColumnSlice<String, String> columnSlice = row.getColumnSlice();
1083 String facetId = getStringValue( columnSlice, "facetId" );
1084 Map<String, String> metaValues = metadataFacetsPerFacetIds.get( facetId );
1085 if ( metaValues == null )
1087 metaValues = new HashMap<String, String>();
1088 metadataFacetsPerFacetIds.put( facetId, metaValues );
1090 metaValues.put( getStringValue( columnSlice, "key" ), getStringValue( columnSlice, "value" ) );
1093 if ( !metadataFacetsPerFacetIds.isEmpty() )
1095 for ( Map.Entry<String, Map<String, String>> entry : metadataFacetsPerFacetIds.entrySet() )
1097 MetadataFacetFactory metadataFacetFactory = metadataFacetFactories.get( entry.getKey() );
1098 if ( metadataFacetFactory != null )
1100 MetadataFacet metadataFacet = metadataFacetFactory.createMetadataFacet( repoId, entry.getKey() );
1101 metadataFacet.fromProperties( entry.getValue() );
1102 projectVersionMetadata.addFacet( metadataFacet );
1107 return projectVersionMetadata;
1110 protected void recordMailingList( String projectVersionMetadataKey, List<MailingList> mailingLists )
1112 if ( mailingLists == null || mailingLists.isEmpty() )
1116 Mutator<String> mailingMutator = this.mailingListTemplate.createMutator();
1117 for ( MailingList mailingList : mailingLists )
1119 // we don't care about the key as the real used one with the projectVersionMetadata
1120 String keyMailingList = UUID.randomUUID().toString();
1121 String cfMailingList = cassandraArchivaManager.getMailingListFamilyName();
1123 addInsertion( mailingMutator, keyMailingList, cfMailingList, "projectVersionMetadataModel.key",
1124 projectVersionMetadataKey );
1125 addInsertion( mailingMutator, keyMailingList, cfMailingList, "name", mailingList.getName() );
1126 addInsertion( mailingMutator, keyMailingList, cfMailingList, "mainArchiveUrl",
1127 mailingList.getMainArchiveUrl() );
1128 addInsertion( mailingMutator, keyMailingList, cfMailingList, "postAddress", mailingList.getPostAddress() );
1129 addInsertion( mailingMutator, keyMailingList, cfMailingList, "subscribeAddress",
1130 mailingList.getSubscribeAddress() );
1131 addInsertion( mailingMutator, keyMailingList, cfMailingList, "unsubscribeAddress",
1132 mailingList.getUnsubscribeAddress() );
1134 for ( String otherArchive : mailingList.getOtherArchives() )
1136 addInsertion( mailingMutator, keyMailingList, cfMailingList, "otherArchive." + idx, otherArchive );
1141 mailingMutator.execute();
1144 protected void removeMailingList( String projectVersionMetadataKey )
1146 StringSerializer ss = StringSerializer.get();
1147 QueryResult<OrderedRows<String, String, String>> result =
1148 HFactory.createRangeSlicesQuery( cassandraArchivaManager.getKeyspace(), ss, ss, ss ) //
1149 .setColumnFamily( cassandraArchivaManager.getMailingListFamilyName() ) //
1150 .setColumnNames( "name" ) //
1151 .setRowCount( Integer.MAX_VALUE ) //
1152 .addEqualsExpression( "projectVersionMetadataModel.key", projectVersionMetadataKey ) //
1154 for ( Row<String, String, String> row : result.get() )
1156 this.mailingListTemplate.deleteRow( row.getKey() );
1160 protected List<MailingList> getMailingLists( String projectVersionMetadataKey )
1162 List<MailingList> mailingLists = new ArrayList<MailingList>();
1164 StringSerializer ss = StringSerializer.get();
1165 QueryResult<OrderedRows<String, String, String>> result =
1166 HFactory.createRangeSlicesQuery( cassandraArchivaManager.getKeyspace(), ss, ss, ss ) //
1167 .setColumnFamily( cassandraArchivaManager.getMailingListFamilyName() ) //
1168 .setColumnNames( "name" ) //
1169 .setRowCount( Integer.MAX_VALUE ) //
1170 .addEqualsExpression( "projectVersionMetadataModel.key", projectVersionMetadataKey ) //
1172 for ( Row<String, String, String> row : result.get() )
1174 ColumnFamilyResult<String, String> columnFamilyResult =
1175 this.mailingListTemplate.queryColumns( row.getKey() );
1177 MailingList mailingList = new MailingList();
1178 mailingList.setName( columnFamilyResult.getString( "name" ) );
1179 mailingList.setMainArchiveUrl( columnFamilyResult.getString( "mainArchiveUrl" ) );
1180 mailingList.setPostAddress( columnFamilyResult.getString( "postAddress" ) );
1181 mailingList.setSubscribeAddress( columnFamilyResult.getString( "subscribeAddress" ) );
1182 mailingList.setUnsubscribeAddress( columnFamilyResult.getString( "unsubscribeAddress" ) );
1184 List<String> otherArchives = new ArrayList<String>();
1186 for ( String columnName : columnFamilyResult.getColumnNames() )
1188 if ( StringUtils.startsWith( columnName, "otherArchive." ) )
1190 otherArchives.add( columnFamilyResult.getString( columnName ) );
1194 mailingList.setOtherArchives( otherArchives );
1195 mailingLists.add( mailingList );
1198 return mailingLists;
1201 protected void recordLicenses( String projectVersionMetadataKey, List<License> licenses )
1204 if ( licenses == null || licenses.isEmpty() )
1208 Mutator<String> licenseMutator = this.licenseTemplate.createMutator();
1210 for ( License license : licenses )
1212 // we don't care about the key as the real used one with the projectVersionMetadata
1213 String keyLicense = UUID.randomUUID().toString();
1214 String cfLicense = cassandraArchivaManager.getLicenseFamilyName();
1216 addInsertion( licenseMutator, keyLicense, cfLicense, "projectVersionMetadataModel.key",
1217 projectVersionMetadataKey );
1219 addInsertion( licenseMutator, keyLicense, cfLicense, "name", license.getName() );
1221 addInsertion( licenseMutator, keyLicense, cfLicense, "url", license.getUrl() );
1224 licenseMutator.execute();
1227 protected void removeLicenses( String projectVersionMetadataKey )
1229 StringSerializer ss = StringSerializer.get();
1230 QueryResult<OrderedRows<String, String, String>> result =
1231 HFactory.createRangeSlicesQuery( cassandraArchivaManager.getKeyspace(), ss, ss, ss ) //
1232 .setColumnFamily( cassandraArchivaManager.getLicenseFamilyName() ) //
1233 .setColumnNames( "name" ) //
1234 .setRowCount( Integer.MAX_VALUE ) //
1235 .addEqualsExpression( "projectVersionMetadataModel.key", projectVersionMetadataKey ) //
1237 for ( Row<String, String, String> row : result.get() )
1239 this.licenseTemplate.deleteRow( row.getKey() );
1243 protected List<License> getLicenses( String projectVersionMetadataKey )
1245 List<License> licenses = new ArrayList<License>();
1247 StringSerializer ss = StringSerializer.get();
1248 QueryResult<OrderedRows<String, String, String>> result =
1249 HFactory.createRangeSlicesQuery( cassandraArchivaManager.getKeyspace(), ss, ss, ss ) //
1250 .setColumnFamily( cassandraArchivaManager.getLicenseFamilyName() ) //
1251 .setColumnNames( "projectVersionMetadataModel.key" ) //
1252 .setRowCount( Integer.MAX_VALUE ) //
1253 .addEqualsExpression( "projectVersionMetadataModel.key", projectVersionMetadataKey ) //
1256 for ( Row<String, String, String> row : result.get() )
1258 ColumnFamilyResult<String, String> columnFamilyResult = this.licenseTemplate.queryColumns( row.getKey() );
1261 new License( columnFamilyResult.getString( "name" ), columnFamilyResult.getString( "url" ) ) );
1268 protected void recordDependencies( String projectVersionMetadataKey, List<Dependency> dependencies )
1271 if ( dependencies == null || dependencies.isEmpty() )
1275 Mutator<String> dependencyMutator = this.dependencyTemplate.createMutator();
1277 for ( Dependency dependency : dependencies )
1279 // we don't care about the key as the real used one with the projectVersionMetadata
1280 String keyDependency = UUID.randomUUID().toString();
1281 String cfDependency = cassandraArchivaManager.getDependencyFamilyName();
1283 addInsertion( dependencyMutator, keyDependency, cfDependency, "projectVersionMetadataModel.key",
1284 projectVersionMetadataKey );
1286 addInsertion( dependencyMutator, keyDependency, cfDependency, "classifier", dependency.getClassifier() );
1288 addInsertion( dependencyMutator, keyDependency, cfDependency, "optional",
1289 Boolean.toString( dependency.isOptional() ) );
1291 addInsertion( dependencyMutator, keyDependency, cfDependency, "scope", dependency.getScope() );
1293 addInsertion( dependencyMutator, keyDependency, cfDependency, "systemPath", dependency.getSystemPath() );
1295 addInsertion( dependencyMutator, keyDependency, cfDependency, "type", dependency.getType() );
1297 addInsertion( dependencyMutator, keyDependency, cfDependency, "artifactId", dependency.getArtifactId() );
1299 addInsertion( dependencyMutator, keyDependency, cfDependency, "groupId", dependency.getGroupId() );
1301 addInsertion( dependencyMutator, keyDependency, cfDependency, "version", dependency.getVersion() );
1304 dependencyMutator.execute();
1307 protected void removeDependencies( String projectVersionMetadataKey )
1309 StringSerializer ss = StringSerializer.get();
1310 QueryResult<OrderedRows<String, String, String>> result =
1311 HFactory.createRangeSlicesQuery( cassandraArchivaManager.getKeyspace(), ss, ss, ss ) //
1312 .setColumnFamily( cassandraArchivaManager.getDependencyFamilyName() ) //
1313 .setColumnNames( "groupId" ) //
1314 .setRowCount( Integer.MAX_VALUE ) //
1315 .addEqualsExpression( "projectVersionMetadataModel.key", projectVersionMetadataKey ) //
1317 for ( Row<String, String, String> row : result.get() )
1319 this.dependencyTemplate.deleteRow( row.getKey() );
1323 protected List<Dependency> getDependencies( String projectVersionMetadataKey )
1325 List<Dependency> dependencies = new ArrayList<Dependency>();
1327 StringSerializer ss = StringSerializer.get();
1328 QueryResult<OrderedRows<String, String, String>> result =
1329 HFactory.createRangeSlicesQuery( cassandraArchivaManager.getKeyspace(), ss, ss, ss ) //
1330 .setColumnFamily( cassandraArchivaManager.getDependencyFamilyName() ) //
1331 .setColumnNames( "projectVersionMetadataModel.key" ) //
1332 .setRowCount( Integer.MAX_VALUE ) //
1333 .addEqualsExpression( "projectVersionMetadataModel.key", projectVersionMetadataKey ) //
1336 for ( Row<String, String, String> row : result.get() )
1338 ColumnFamilyResult<String, String> columnFamilyResult =
1339 this.dependencyTemplate.queryColumns( row.getKey() );
1341 Dependency dependency = new Dependency();
1342 dependency.setClassifier( columnFamilyResult.getString( "classifier" ) );
1344 dependency.setOptional( Boolean.parseBoolean( columnFamilyResult.getString( "optional" ) ) );
1346 dependency.setScope( columnFamilyResult.getString( "scope" ) );
1348 dependency.setSystemPath( columnFamilyResult.getString( "systemPath" ) );
1350 dependency.setType( columnFamilyResult.getString( "type" ) );
1352 dependency.setArtifactId( columnFamilyResult.getString( "artifactId" ) );
1354 dependency.setGroupId( columnFamilyResult.getString( "groupId" ) );
1356 dependency.setVersion( columnFamilyResult.getString( "version" ) );
1358 dependencies.add( dependency );
1361 return dependencies;
1365 public void updateArtifact( String repositoryId, String namespaceId, String projectId, String projectVersion,
1366 ArtifactMetadata artifactMeta )
1367 throws MetadataRepositoryException
1370 Namespace namespace = getNamespace( repositoryId, namespaceId );
1371 if ( namespace == null )
1373 namespace = updateOrAddNamespace( repositoryId, namespaceId );
1376 ProjectMetadata projectMetadata = new ProjectMetadata();
1377 projectMetadata.setId( projectId );
1378 projectMetadata.setNamespace( namespaceId );
1379 updateProject( repositoryId, projectMetadata );
1381 String key = new ArtifactMetadataModel.KeyBuilder().withNamespace( namespace ).withProject( projectId ).withId(
1382 artifactMeta.getId() ).withProjectVersion( projectVersion ).build();
1386 boolean exists = this.artifactMetadataTemplate.isColumnsExist( key );
1391 ColumnFamilyUpdater<String, String> updater = this.artifactMetadataTemplate.createUpdater( key );
1392 updater.setLong( "fileLastModified", artifactMeta.getFileLastModified().getTime() );
1393 updater.setLong( "whenGathered", artifactMeta.getWhenGathered().getTime() );
1394 updater.setLong( "size", artifactMeta.getSize() );
1395 updater.setString( "md5", artifactMeta.getMd5() );
1396 updater.setString( "sha1", artifactMeta.getSha1() );
1397 updater.setString( "version", artifactMeta.getVersion() );
1398 this.artifactMetadataTemplate.update( updater );
1402 String cf = this.cassandraArchivaManager.getArtifactMetadataFamilyName();
1404 this.artifactMetadataTemplate.createMutator() //
1405 .addInsertion( key, cf, column( "id", artifactMeta.getId() ) )//
1406 .addInsertion( key, cf, column( "repositoryName", repositoryId ) ) //
1407 .addInsertion( key, cf, column( "namespaceId", namespaceId ) ) //
1408 .addInsertion( key, cf, column( "project", artifactMeta.getProject() ) ) //
1409 .addInsertion( key, cf, column( "projectVersion", projectVersion ) ) //
1410 .addInsertion( key, cf, column( "version", artifactMeta.getVersion() ) ) //
1411 .addInsertion( key, cf, column( "fileLastModified", artifactMeta.getFileLastModified().getTime() ) ) //
1412 .addInsertion( key, cf, column( "size", artifactMeta.getSize() ) ) //
1413 .addInsertion( key, cf, column( "md5", artifactMeta.getMd5() ) ) //
1414 .addInsertion( key, cf, column( "sha1", artifactMeta.getSha1() ) ) //
1415 .addInsertion( key, cf, column( "whenGathered", artifactMeta.getWhenGathered().getTime() ) )//
1419 key = new ProjectVersionMetadataModel.KeyBuilder().withRepository( repositoryId ).withNamespace(
1420 namespace ).withProjectId( projectId ).withId( projectVersion ).build();
1422 exists = this.projectVersionMetadataModelTemplate.isColumnsExist( key );
1426 ProjectVersionMetadataModel projectVersionMetadataModel = new ProjectVersionMetadataModel();
1427 projectVersionMetadataModel.setProjectId( projectId );
1428 projectVersionMetadataModel.setId( projectVersion );
1429 projectVersionMetadataModel.setNamespace( namespace );
1431 String cf = this.cassandraArchivaManager.getProjectVersionMetadataFamilyName();
1433 projectVersionMetadataModelTemplate.createMutator() //
1434 .addInsertion( key, cf, column( "namespaceId", namespace.getName() ) ) //
1435 .addInsertion( key, cf, column( "repositoryName", repositoryId ) ) //
1436 .addInsertion( key, cf, column( "projectVersion", projectVersion ) ) //
1437 .addInsertion( key, cf, column( "projectId", projectId ) ) //
1442 ArtifactMetadataModel artifactMetadataModel = new ArtifactMetadataModel();
1444 artifactMetadataModel.setRepositoryId( repositoryId );
1445 artifactMetadataModel.setNamespace( namespaceId );
1446 artifactMetadataModel.setProject( projectId );
1447 artifactMetadataModel.setProjectVersion( projectVersion );
1448 artifactMetadataModel.setVersion( artifactMeta.getVersion() );
1449 artifactMetadataModel.setFileLastModified( artifactMeta.getFileLastModified() == null
1450 ? new Date().getTime()
1451 : artifactMeta.getFileLastModified().getTime() );
1454 updateFacets( artifactMeta, artifactMetadataModel );
1459 public Collection<String> getArtifactVersions( final String repoId, final String namespace, final String projectId,
1460 final String projectVersion )
1461 throws MetadataResolutionException
1463 Keyspace keyspace = cassandraArchivaManager.getKeyspace();
1464 StringSerializer ss = StringSerializer.get();
1465 QueryResult<OrderedRows<String, String, String>> result = HFactory //
1466 .createRangeSlicesQuery( keyspace, ss, ss, ss ) //
1467 .setColumnFamily( cassandraArchivaManager.getProjectVersionMetadataFamilyName() ) //
1468 .setColumnNames( "projectVersion" ) //
1469 .addEqualsExpression( "repositoryName", repoId ) //
1470 .addEqualsExpression( "namespaceId", namespace ) //
1471 .addEqualsExpression( "projectId", projectId ) //
1472 .addEqualsExpression( "projectVersion", projectVersion ) //
1475 final Set<String> versions = new HashSet<String>();
1477 for ( Row<String, String, String> row : result.get() )
1479 versions.add( getStringValue( row.getColumnSlice(), "projectVersion" ) );
1487 * iterate over available facets to remove/add from the artifactMetadata
1489 * @param facetedMetadata
1490 * @param artifactMetadataModel only use for the key
1492 private void updateFacets( final FacetedMetadata facetedMetadata,
1493 final ArtifactMetadataModel artifactMetadataModel )
1495 Keyspace keyspace = cassandraArchivaManager.getKeyspace();
1496 StringSerializer ss = StringSerializer.get();
1497 String cf = cassandraArchivaManager.getMetadataFacetFamilyName();
1499 for ( final String facetId : metadataFacetFactories.keySet() )
1501 MetadataFacet metadataFacet = facetedMetadata.getFacet( facetId );
1502 if ( metadataFacet == null )
1508 QueryResult<OrderedRows<String, String, String>> result =
1509 HFactory.createRangeSlicesQuery( keyspace, ss, ss, ss ) //
1510 .setColumnFamily( cf ) //
1511 .setColumnNames( "repositoryName" ) //
1512 .addEqualsExpression( "repositoryName", artifactMetadataModel.getRepositoryId() ) //
1513 .addEqualsExpression( "namespaceId", artifactMetadataModel.getNamespace() ) //
1514 .addEqualsExpression( "projectId", artifactMetadataModel.getProject() ) //
1515 .addEqualsExpression( "projectVersion",
1516 artifactMetadataModel.getProjectVersion() ).addEqualsExpression( "facetId",
1520 for ( Row<String, String, String> row : result.get().getList() )
1522 this.metadataFacetTemplate.deleteRow( row.getKey() );
1525 Map<String, String> properties = metadataFacet.toProperties();
1527 for ( Map.Entry<String, String> entry : properties.entrySet() )
1529 String key = new MetadataFacetModel.KeyBuilder().withKey( entry.getKey() ).withArtifactMetadataModel(
1530 artifactMetadataModel ).withFacetId( facetId ).withName( metadataFacet.getName() ).build();
1531 metadataFacetTemplate.createMutator() //
1532 .addInsertion( key, cf, column( "repositoryName", artifactMetadataModel.getRepositoryId() ) ) //
1533 .addInsertion( key, cf, column( "namespaceId", artifactMetadataModel.getNamespace() ) ) //
1534 .addInsertion( key, cf, column( "projectId", artifactMetadataModel.getProject() ) ) //
1535 .addInsertion( key, cf, column( "projectVersion", artifactMetadataModel.getProjectVersion() ) ) //
1536 .addInsertion( key, cf, column( "facetId", facetId ) ) //
1537 .addInsertion( key, cf, column( "key", entry.getKey() ) ) //
1538 .addInsertion( key, cf, column( "value", entry.getValue() ) ) //
1539 .addInsertion( key, cf, column( "name", metadataFacet.getName() ) ) //
1547 public List<String> getMetadataFacets( final String repositoryId, final String facetId )
1548 throws MetadataRepositoryException
1551 Keyspace keyspace = cassandraArchivaManager.getKeyspace();
1552 StringSerializer ss = StringSerializer.get();
1553 QueryResult<OrderedRows<String, String, String>> result = HFactory //
1554 .createRangeSlicesQuery( keyspace, ss, ss, ss ) //
1555 .setColumnFamily( cassandraArchivaManager.getMetadataFacetFamilyName() ) //
1556 .setColumnNames( "name" ) //
1557 .addEqualsExpression( "repositoryName", repositoryId ) //
1558 .addEqualsExpression( "facetId", facetId ) //
1561 final List<String> facets = new ArrayList<String>();
1563 for ( Row<String, String, String> row : result.get() )
1565 facets.add( getStringValue( row.getColumnSlice(), "name" ) );
1571 public boolean hasMetadataFacet( String repositoryId, String facetId )
1572 throws MetadataRepositoryException
1574 return !getMetadataFacets( repositoryId, facetId ).isEmpty();
1578 public MetadataFacet getMetadataFacet( final String repositoryId, final String facetId, final String name )
1579 throws MetadataRepositoryException
1582 MetadataFacetFactory metadataFacetFactory = metadataFacetFactories.get( facetId );
1583 if ( metadataFacetFactory == null )
1588 Keyspace keyspace = cassandraArchivaManager.getKeyspace();
1589 StringSerializer ss = StringSerializer.get();
1590 QueryResult<OrderedRows<String, String, String>> result = HFactory //
1591 .createRangeSlicesQuery( keyspace, ss, ss, ss ) //
1592 .setColumnFamily( cassandraArchivaManager.getMetadataFacetFamilyName() ) //
1593 .setColumnNames( "key", "value" ) //
1594 .addEqualsExpression( "repositoryName", repositoryId ) //
1595 .addEqualsExpression( "facetId", facetId ) //
1596 .addEqualsExpression( "name", name ) //
1599 MetadataFacet metadataFacet = metadataFacetFactory.createMetadataFacet( repositoryId, name );
1600 int size = result.get().getCount();
1605 Map<String, String> map = new HashMap<String, String>( size );
1606 for ( Row<String, String, String> row : result.get() )
1608 ColumnSlice<String, String> columnSlice = row.getColumnSlice();
1609 map.put( getStringValue( columnSlice, "key" ), getStringValue( columnSlice, "value" ) );
1611 metadataFacet.fromProperties( map );
1612 return metadataFacet;
1616 public void addMetadataFacet( String repositoryId, MetadataFacet metadataFacet )
1617 throws MetadataRepositoryException
1620 if ( metadataFacet == null )
1625 if ( metadataFacet.toProperties().isEmpty() )
1627 String key = new MetadataFacetModel.KeyBuilder().withRepositoryId( repositoryId ).withFacetId(
1628 metadataFacet.getFacetId() ).withName( metadataFacet.getName() ).build();
1630 boolean exists = this.metadataFacetTemplate.isColumnsExist( key );
1634 ColumnFamilyUpdater<String, String> updater = this.metadataFacetTemplate.createUpdater( key );
1635 updater.setString( "facetId", metadataFacet.getFacetId() );
1636 updater.setString( "name", metadataFacet.getName() );
1637 this.metadataFacetTemplate.update( updater );
1641 String cf = this.cassandraArchivaManager.getMetadataFacetFamilyName();
1642 this.metadataFacetTemplate.createMutator() //
1643 .addInsertion( key, cf, column( "repositoryName", repositoryId ) ) //
1644 .addInsertion( key, cf, column( "facetId", metadataFacet.getFacetId() ) ) //
1645 .addInsertion( key, cf, column( "name", metadataFacet.getName() ) ) //
1652 for ( Map.Entry<String, String> entry : metadataFacet.toProperties().entrySet() )
1655 String key = new MetadataFacetModel.KeyBuilder().withRepositoryId( repositoryId ).withFacetId(
1656 metadataFacet.getFacetId() ).withName( metadataFacet.getName() ).withKey( entry.getKey() ).build();
1658 boolean exists = this.metadataFacetTemplate.isColumnsExist( key );
1661 //metadataFacetModel = new MetadataFacetModel();
1662 // we need to store the repositoryId
1663 //ArtifactMetadataModel artifactMetadataModel = new ArtifactMetadataModel();
1664 //artifactMetadataModel.setRepositoryId( repositoryId );
1665 //metadataFacetModel.setArtifactMetadataModel( artifactMetadataModel );
1666 //metadataFacetModel.setId( key );
1667 //metadataFacetModel.setKey( entry.getKey() );
1668 //metadataFacetModel.setFacetId( metadataFacet.getFacetId() );
1669 //metadataFacetModel.setName( metadataFacet.getName() );
1671 String cf = this.cassandraArchivaManager.getMetadataFacetFamilyName();
1672 this.metadataFacetTemplate.createMutator() //
1673 .addInsertion( key, cf, column( "repositoryName", repositoryId ) ) //
1674 .addInsertion( key, cf, column( "facetId", metadataFacet.getFacetId() ) ) //
1675 .addInsertion( key, cf, column( "name", metadataFacet.getName() ) ) //
1676 .addInsertion( key, cf, column( "key", entry.getKey() ) ) //
1677 .addInsertion( key, cf, column( "value", entry.getValue() ) ) //
1683 ColumnFamilyUpdater<String, String> updater = this.metadataFacetTemplate.createUpdater( key );
1684 updater.setString( "value", entry.getValue() );
1685 this.metadataFacetTemplate.update( updater );
1692 public void removeMetadataFacets( final String repositoryId, final String facetId )
1693 throws MetadataRepositoryException
1695 Keyspace keyspace = cassandraArchivaManager.getKeyspace();
1696 StringSerializer ss = StringSerializer.get();
1697 QueryResult<OrderedRows<String, String, String>> result = HFactory //
1698 .createRangeSlicesQuery( keyspace, ss, ss, ss ) //
1699 .setColumnFamily( cassandraArchivaManager.getMetadataFacetFamilyName() ) //
1700 .setColumnNames( "key", "value" ) //
1701 .addEqualsExpression( "repositoryName", repositoryId ) //
1702 .addEqualsExpression( "facetId", facetId ) //
1705 for ( Row<String, String, String> row : result.get() )
1707 this.metadataFacetTemplate.deleteRow( row.getKey() );
1713 public void removeMetadataFacet( final String repositoryId, final String facetId, final String name )
1714 throws MetadataRepositoryException
1716 Keyspace keyspace = cassandraArchivaManager.getKeyspace();
1717 StringSerializer ss = StringSerializer.get();
1718 QueryResult<OrderedRows<String, String, String>> result = HFactory //
1719 .createRangeSlicesQuery( keyspace, ss, ss, ss ) //
1720 .setColumnFamily( cassandraArchivaManager.getMetadataFacetFamilyName() ) //
1721 .setColumnNames( "key", "value" ) //
1722 .addEqualsExpression( "repositoryName", repositoryId ) //
1723 .addEqualsExpression( "facetId", facetId ) //
1724 .addEqualsExpression( "name", name ) //
1727 for ( Row<String, String, String> row : result.get() )
1729 this.metadataFacetTemplate.deleteRow( row.getKey() );
1734 public List<ArtifactMetadata> getArtifactsByDateRange( final String repositoryId, final Date startTime,
1735 final Date endTime )
1736 throws MetadataRepositoryException
1739 Keyspace keyspace = cassandraArchivaManager.getKeyspace();
1740 StringSerializer ss = StringSerializer.get();
1741 LongSerializer ls = LongSerializer.get();
1742 RangeSlicesQuery<String, String, Long> query = HFactory //
1743 .createRangeSlicesQuery( keyspace, ss, ss, ls ) //
1744 .setColumnFamily( cassandraArchivaManager.getArtifactMetadataFamilyName() ) //
1745 .setColumnNames( "namespaceId", "size", "id", "fileLastModified", "md5", "project", "projectVersion",
1746 "repositoryName", "version", "whenGathered", "sha1" ); //
1748 if ( startTime != null )
1750 query = query.addGteExpression( "whenGathered", startTime.getTime() );
1752 if ( endTime != null )
1754 query = query.addLteExpression( "whenGathered", endTime.getTime() );
1756 QueryResult<OrderedRows<String, String, Long>> result = query.execute();
1758 List<ArtifactMetadata> artifactMetadatas = new ArrayList<ArtifactMetadata>( result.get().getCount() );
1760 for ( Row<String, String, Long> row : result.get() )
1762 ColumnSlice<String, Long> columnSlice = row.getColumnSlice();
1763 String repositoryName = getAsStringValue( columnSlice, "repositoryName" );
1764 if ( StringUtils.equals( repositoryName, repositoryId ) )
1767 artifactMetadatas.add( mapArtifactMetadataLongColumnSlice( columnSlice ) );
1771 return artifactMetadatas;
1775 protected ArtifactMetadata mapArtifactMetadataLongColumnSlice( ColumnSlice<String, Long> columnSlice )
1777 ArtifactMetadata artifactMetadata = new ArtifactMetadata();
1778 artifactMetadata.setNamespace( getAsStringValue( columnSlice, "namespaceId" ) );
1779 artifactMetadata.setSize( getLongValue( columnSlice, "size" ) );
1780 artifactMetadata.setId( getAsStringValue( columnSlice, "id" ) );
1781 artifactMetadata.setFileLastModified( getLongValue( columnSlice, "fileLastModified" ) );
1782 artifactMetadata.setMd5( getAsStringValue( columnSlice, "md5" ) );
1783 artifactMetadata.setProject( getAsStringValue( columnSlice, "project" ) );
1784 artifactMetadata.setProjectVersion( getAsStringValue( columnSlice, "projectVersion" ) );
1785 artifactMetadata.setRepositoryId( getAsStringValue( columnSlice, "repositoryName" ) );
1786 artifactMetadata.setSha1( getAsStringValue( columnSlice, "sha1" ) );
1787 artifactMetadata.setVersion( getAsStringValue( columnSlice, "version" ) );
1788 Long whenGathered = getLongValue( columnSlice, "whenGathered" );
1789 if ( whenGathered != null )
1791 artifactMetadata.setWhenGathered( new Date( whenGathered ) );
1793 return artifactMetadata;
1796 protected ArtifactMetadata mapArtifactMetadataStringColumnSlice( ColumnSlice<String, String> columnSlice )
1798 ArtifactMetadata artifactMetadata = new ArtifactMetadata();
1799 artifactMetadata.setNamespace( getStringValue( columnSlice, "namespaceId" ) );
1800 artifactMetadata.setSize( getAsLongValue( columnSlice, "size" ) );
1801 artifactMetadata.setId( getStringValue( columnSlice, "id" ) );
1802 artifactMetadata.setFileLastModified( getAsLongValue( columnSlice, "fileLastModified" ) );
1803 artifactMetadata.setMd5( getStringValue( columnSlice, "md5" ) );
1804 artifactMetadata.setProject( getStringValue( columnSlice, "project" ) );
1805 artifactMetadata.setProjectVersion( getStringValue( columnSlice, "projectVersion" ) );
1806 artifactMetadata.setRepositoryId( getStringValue( columnSlice, "repositoryName" ) );
1807 artifactMetadata.setSha1( getStringValue( columnSlice, "sha1" ) );
1808 artifactMetadata.setVersion( getStringValue( columnSlice, "version" ) );
1809 Long whenGathered = getAsLongValue( columnSlice, "whenGathered" );
1810 if ( whenGathered != null )
1812 artifactMetadata.setWhenGathered( new Date( whenGathered ) );
1814 return artifactMetadata;
1818 public Collection<ArtifactMetadata> getArtifactsByChecksum( final String repositoryId, final String checksum )
1819 throws MetadataRepositoryException
1821 Keyspace keyspace = cassandraArchivaManager.getKeyspace();
1822 StringSerializer ss = StringSerializer.get();
1824 // cql cannot run or in queries so running twice the query
1825 Map<String, ArtifactMetadata> artifactMetadataMap = new HashMap<String, ArtifactMetadata>();
1827 RangeSlicesQuery<String, String, String> query = HFactory //
1828 .createRangeSlicesQuery( keyspace, ss, ss, ss ) //
1829 .setColumnFamily( cassandraArchivaManager.getArtifactMetadataFamilyName() ) //
1830 .setColumnNames( "namespaceId", "size", "id", "fileLastModified", "md5", "project", "projectVersion",
1831 "repositoryName", "version", "whenGathered", "sha1" ); //
1833 query = query.addEqualsExpression( "sha1", checksum ).addEqualsExpression( "repositoryName", repositoryId );
1835 QueryResult<OrderedRows<String, String, String>> result = query.execute();
1837 for ( Row<String, String, String> row : result.get() )
1839 ColumnSlice<String, String> columnSlice = row.getColumnSlice();
1841 artifactMetadataMap.put( row.getKey(), mapArtifactMetadataStringColumnSlice( columnSlice ) );
1846 .createRangeSlicesQuery( keyspace, ss, ss, ss ) //
1847 .setColumnFamily( cassandraArchivaManager.getArtifactMetadataFamilyName() ) //
1848 .setColumnNames( "namespaceId", "size", "id", "fileLastModified", "md5", "project", "projectVersion",
1849 "repositoryName", "version", "whenGathered", "sha1" ); //
1851 query = query.addEqualsExpression( "md5", checksum ).addEqualsExpression( "repositoryName", repositoryId );
1853 result = query.execute();
1855 for ( Row<String, String, String> row : result.get() )
1857 ColumnSlice<String, String> columnSlice = row.getColumnSlice();
1859 artifactMetadataMap.put( row.getKey(), mapArtifactMetadataStringColumnSlice( columnSlice ) );
1863 return artifactMetadataMap.values();
1868 public void removeArtifact( final String repositoryId, final String namespace, final String project,
1869 final String version, final String id )
1870 throws MetadataRepositoryException
1872 logger.debug( "removeArtifact repositoryId: '{}', namespace: '{}', project: '{}', version: '{}', id: '{}'",
1873 repositoryId, namespace, project, version, id );
1875 new ArtifactMetadataModel.KeyBuilder().withRepositoryId( repositoryId ).withNamespace( namespace ).withId(
1876 id ).withProjectVersion( version ).withProject( project ).build();
1878 this.artifactMetadataTemplate.deleteRow( key );
1881 new ProjectVersionMetadataModel.KeyBuilder().withId( version ).withRepository( repositoryId ).withNamespace(
1882 namespace ).withProjectId( project ).build();
1884 this.projectVersionMetadataModelTemplate.deleteRow( key );
1888 public void removeArtifact( ArtifactMetadata artifactMetadata, String baseVersion )
1889 throws MetadataRepositoryException
1891 logger.debug( "removeArtifact repositoryId: '{}', namespace: '{}', project: '{}', version: '{}', id: '{}'",
1892 artifactMetadata.getRepositoryId(), artifactMetadata.getNamespace(),
1893 artifactMetadata.getProject(), baseVersion, artifactMetadata.getId() );
1895 new ArtifactMetadataModel.KeyBuilder().withRepositoryId( artifactMetadata.getRepositoryId() ).withNamespace(
1896 artifactMetadata.getNamespace() ).withId( artifactMetadata.getId() ).withProjectVersion(
1897 baseVersion ).withProject( artifactMetadata.getProject() ).build();
1899 this.artifactMetadataTemplate.deleteRow( key );
1904 public void removeArtifact( final String repositoryId, final String namespace, final String project,
1905 final String version, final MetadataFacet metadataFacet )
1906 throws MetadataRepositoryException
1909 Keyspace keyspace = cassandraArchivaManager.getKeyspace();
1911 StringSerializer ss = StringSerializer.get();
1913 RangeSlicesQuery<String, String, String> query = HFactory //
1914 .createRangeSlicesQuery( keyspace, ss, ss, ss ) //
1915 .setColumnFamily( cassandraArchivaManager.getArtifactMetadataFamilyName() ) //
1916 .setColumnNames( "namespaceId" ); //
1918 query = query.addEqualsExpression( "repositoryName", repositoryId ) //
1919 .addEqualsExpression( "namespaceId", namespace ) //
1920 .addEqualsExpression( "project", project ) //
1921 .addEqualsExpression( "version", version );
1923 QueryResult<OrderedRows<String, String, String>> result = query.execute();
1925 for ( Row<String, String, String> row : result.get() )
1927 this.artifactMetadataTemplate.deleteRow( row.getKey() );
1935 public List<ArtifactMetadata> getArtifacts( final String repositoryId )
1936 throws MetadataRepositoryException
1938 Keyspace keyspace = cassandraArchivaManager.getKeyspace();
1939 StringSerializer ss = StringSerializer.get();
1941 RangeSlicesQuery<String, String, String> query = HFactory //
1942 .createRangeSlicesQuery( keyspace, ss, ss, ss ) //
1943 .setColumnFamily( cassandraArchivaManager.getArtifactMetadataFamilyName() ) //
1944 .setColumnNames( "namespaceId", "size", "id", "fileLastModified", "md5", "project", "projectVersion",
1945 "repositoryName", "version", "whenGathered", "sha1" ); //
1947 query = query.addEqualsExpression( "repositoryName", repositoryId );
1949 QueryResult<OrderedRows<String, String, String>> result = query.execute();
1951 List<ArtifactMetadata> artifactMetadatas = new ArrayList<ArtifactMetadata>( result.get().getCount() );
1953 for ( Row<String, String, String> row : result.get() )
1955 ColumnSlice<String, String> columnSlice = row.getColumnSlice();
1957 artifactMetadatas.add( mapArtifactMetadataStringColumnSlice( columnSlice ) );
1961 return artifactMetadatas;
1966 public Collection<ProjectVersionReference> getProjectReferences( String repoId, String namespace, String projectId,
1967 String projectVersion )
1968 throws MetadataResolutionException
1970 // FIXME implement this
1971 return Collections.emptyList();
1975 public void removeProjectVersion( final String repoId, final String namespace, final String projectId,
1976 final String projectVersion )
1977 throws MetadataRepositoryException
1980 String key = new ProjectVersionMetadataModel.KeyBuilder().withRepository( repoId ).withNamespace(
1981 namespace ).withProjectId( projectId ).withId( projectVersion ).build();
1983 this.projectVersionMetadataModelTemplate.deleteRow( key );
1985 Keyspace keyspace = cassandraArchivaManager.getKeyspace();
1987 StringSerializer ss = StringSerializer.get();
1989 RangeSlicesQuery<String, String, String> query = HFactory //
1990 .createRangeSlicesQuery( keyspace, ss, ss, ss ) //
1991 .setColumnFamily( cassandraArchivaManager.getArtifactMetadataFamilyName() ) //
1992 .setColumnNames( "namespaceId" ); //
1994 query = query.addEqualsExpression( "repositoryName", repoId ) //
1995 .addEqualsExpression( "namespaceId", namespace ) //
1996 .addEqualsExpression( "project", projectId ) //
1997 .addEqualsExpression( "projectVersion", projectVersion );
1999 QueryResult<OrderedRows<String, String, String>> result = query.execute();
2001 for ( Row<String, String, String> row : result.get() )
2003 this.artifactMetadataTemplate.deleteRow( row.getKey() );
2009 public Collection<ArtifactMetadata> getArtifacts( final String repoId, final String namespace,
2010 final String projectId, final String projectVersion )
2011 throws MetadataResolutionException
2014 Keyspace keyspace = cassandraArchivaManager.getKeyspace();
2016 StringSerializer ss = StringSerializer.get();
2018 QueryResult<OrderedRows<String, String, String>> result =
2019 HFactory.createRangeSlicesQuery( keyspace, ss, ss, ss ) //
2020 .setColumnFamily( cassandraArchivaManager.getArtifactMetadataFamilyName() ) //
2021 .setColumnNames( "id", "repositoryName", "namespaceId", "project", "projectVersion", "version",
2022 "fileLastModified", "size", "md5", "sha1", "whenGathered" )//
2023 .setRowCount( Integer.MAX_VALUE ) //
2024 .addEqualsExpression( "repositoryName", repoId ) //
2025 .addEqualsExpression( "namespaceId", namespace ) //
2026 .addEqualsExpression( "project", projectId ) //
2027 .addEqualsExpression( "projectVersion", projectVersion ) //
2030 if ( result.get() == null || result.get().getCount() < 1 )
2032 return Collections.emptyList();
2035 List<ArtifactMetadata> artifactMetadatas = new ArrayList<ArtifactMetadata>( result.get().getCount() );
2037 for ( Row<String, String, String> row : result.get() )
2039 ColumnSlice<String, String> columnSlice = row.getColumnSlice();
2040 ArtifactMetadata artifactMetadata = new ArtifactMetadata();
2041 artifactMetadata.setNamespace( getStringValue( columnSlice, "namespaceId" ) );
2042 artifactMetadata.setSize( getAsLongValue( columnSlice, "size" ) );
2043 artifactMetadata.setId( getStringValue( columnSlice, "id" ) );
2044 artifactMetadata.setFileLastModified( getAsLongValue( columnSlice, "fileLastModified" ) );
2045 artifactMetadata.setMd5( getStringValue( columnSlice, "md5" ) );
2046 artifactMetadata.setProject( getStringValue( columnSlice, "project" ) );
2047 artifactMetadata.setProjectVersion( getStringValue( columnSlice, "projectVersion" ) );
2048 artifactMetadata.setRepositoryId( repoId );
2049 artifactMetadata.setSha1( getStringValue( columnSlice, "sha1" ) );
2050 artifactMetadata.setVersion( getStringValue( columnSlice, "version" ) );
2051 Long whenGathered = getAsLongValue( columnSlice, "whenGathered" );
2052 if ( whenGathered != null )
2054 artifactMetadata.setWhenGathered( new Date( whenGathered ) );
2056 artifactMetadatas.add( artifactMetadata );
2059 result = HFactory.createRangeSlicesQuery( keyspace, ss, ss, ss ) //
2060 .setColumnFamily( cassandraArchivaManager.getMetadataFacetFamilyName() ) //
2061 .setColumnNames( "facetId", "name", "value", "key", "projectVersion" ) //
2062 .setRowCount( Integer.MAX_VALUE ) //
2063 .addEqualsExpression( "repositoryName", repoId ) //
2064 .addEqualsExpression( "namespaceId", namespace ) //
2065 .addEqualsExpression( "projectId", projectId ) //
2066 .addEqualsExpression( "projectVersion", projectVersion ) //
2069 if ( result.get() == null || result.get().getCount() < 1 )
2071 return artifactMetadatas;
2074 final List<MetadataFacetModel> metadataFacetModels =
2075 new ArrayList<MetadataFacetModel>( result.get().getCount() );
2077 for ( Row<String, String, String> row : result.get() )
2079 ColumnSlice<String, String> columnSlice = row.getColumnSlice();
2080 MetadataFacetModel metadataFacetModel = new MetadataFacetModel();
2081 metadataFacetModel.setFacetId( getStringValue( columnSlice, "facetId" ) );
2082 metadataFacetModel.setName( getStringValue( columnSlice, "name" ) );
2083 metadataFacetModel.setValue( getStringValue( columnSlice, "value" ) );
2084 metadataFacetModel.setKey( getStringValue( columnSlice, "key" ) );
2085 metadataFacetModel.setProjectVersion( getStringValue( columnSlice, "projectVersion" ) );
2086 metadataFacetModels.add( metadataFacetModel );
2089 // rebuild MetadataFacet for artifacts
2091 for ( final ArtifactMetadata artifactMetadata : artifactMetadatas )
2093 Iterable<MetadataFacetModel> metadataFacetModelIterable =
2094 Iterables.filter( metadataFacetModels, new Predicate<MetadataFacetModel>()
2097 public boolean apply( MetadataFacetModel metadataFacetModel )
2099 if ( metadataFacetModel != null )
2101 return StringUtils.equals( artifactMetadata.getVersion(),
2102 metadataFacetModel.getProjectVersion() );
2107 Iterator<MetadataFacetModel> iterator = metadataFacetModelIterable.iterator();
2108 Map<String, List<MetadataFacetModel>> metadataFacetValuesPerFacetId =
2109 new HashMap<String, List<MetadataFacetModel>>();
2110 while ( iterator.hasNext() )
2112 MetadataFacetModel metadataFacetModel = iterator.next();
2113 List<MetadataFacetModel> values = metadataFacetValuesPerFacetId.get( metadataFacetModel.getName() );
2114 if ( values == null )
2116 values = new ArrayList<MetadataFacetModel>();
2117 metadataFacetValuesPerFacetId.put( metadataFacetModel.getFacetId(), values );
2119 values.add( metadataFacetModel );
2123 for ( Map.Entry<String, List<MetadataFacetModel>> entry : metadataFacetValuesPerFacetId.entrySet() )
2125 MetadataFacetFactory metadataFacetFactory = metadataFacetFactories.get( entry.getKey() );
2126 if ( metadataFacetFactory != null )
2128 List<MetadataFacetModel> facetModels = entry.getValue();
2129 if ( !facetModels.isEmpty() )
2131 MetadataFacet metadataFacet =
2132 metadataFacetFactory.createMetadataFacet( repoId, facetModels.get( 0 ).getName() );
2133 Map<String, String> props = new HashMap<String, String>( facetModels.size() );
2134 for ( MetadataFacetModel metadataFacetModel : facetModels )
2136 props.put( metadataFacetModel.getKey(), metadataFacetModel.getValue() );
2138 metadataFacet.fromProperties( props );
2139 artifactMetadata.addFacet( metadataFacet );
2147 return artifactMetadatas;
2153 logger.trace( "save" );
2158 throws MetadataRepositoryException
2160 logger.trace( "close" );
2164 public void revert()
2166 logger.warn( "CassandraMetadataRepository cannot revert" );
2170 public boolean canObtainAccess( Class<?> aClass )
2176 public <T> T obtainAccess( Class<T> aClass )
2177 throws MetadataRepositoryException
2179 throw new IllegalArgumentException(
2180 "Access using " + aClass + " is not supported on the cassandra metadata storage" );
2184 private static class ModelMapperHolder
2186 private static ModelMapper MODEL_MAPPER = new ModelMapper();
2189 protected ModelMapper getModelMapper()
2191 return ModelMapperHolder.MODEL_MAPPER;