import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.util.ValueStack;
import org.apache.archiva.metadata.model.ArtifactMetadata;
-import org.apache.archiva.metadata.repository.MetadataRepository;
+import org.apache.archiva.metadata.repository.MetadataResolver;
import org.apache.commons.lang.StringEscapeUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.maven.archiva.model.ArtifactReference;
private RepositoryContentFactory repositoryFactory;
- private MetadataRepository metadataRepository;
+ private MetadataResolver metadataResolver;
private HttpServletRequest req;
this.req = (HttpServletRequest) pageContext.getRequest();
try
{
- metadataRepository = (MetadataRepository) PlexusTagUtil.lookup( pageContext, MetadataRepository.class );
+ metadataResolver = (MetadataResolver) PlexusTagUtil.lookup( pageContext, MetadataResolver.class );
repositoryFactory =
(RepositoryContentFactory) PlexusTagUtil.lookup( pageContext, RepositoryContentFactory.class );
userRepositories = (UserRepositories) PlexusTagUtil.lookup( pageContext, UserRepositories.class );
List<ArtifactMetadata> artifacts = new ArrayList<ArtifactMetadata>();
for ( String repoId : getObservableRepos() )
{
- artifacts.addAll( metadataRepository.getArtifacts( repoId, groupId, artifactId, version ) );
+ artifacts.addAll( metadataResolver.getArtifacts( repoId, groupId, artifactId, version ) );
}
if ( !artifacts.isEmpty() )
import java.util.Map;
import java.util.Set;
+import org.apache.archiva.metadata.model.ArtifactMetadata;
import org.apache.archiva.metadata.model.ProjectMetadata;
import org.apache.archiva.metadata.model.ProjectVersionMetadata;
import org.apache.archiva.metadata.model.ProjectVersionReference;
return list != null ? list : Collections.<String>emptyList();
}
+ public Collection<ArtifactMetadata> getArtifacts( String repoId, String namespace, String projectId,
+ String projectVersion )
+ {
+ return null; //To change body of implemented methods use File | Settings | File Templates.
+ }
+
public void setProjectVersion( String repoId, String namespace, String projectId,
ProjectVersionMetadata versionMetadata )
{
import java.util.ArrayList;
import java.util.Collection;
+import org.apache.archiva.metadata.model.ArtifactMetadata;
import org.apache.archiva.metadata.model.Dependency;
import org.apache.archiva.metadata.model.ProjectMetadata;
import org.apache.archiva.metadata.model.ProjectVersionMetadata;
}
return projectVersions;
}
+
+ public Collection<ArtifactMetadata> getArtifacts( String repoId, String namespace, String projectId,
+ String projectVersion )
+ {
+ Collection<ArtifactMetadata> artifacts =
+ metadataRepository.getArtifacts( repoId, namespace, projectId, projectVersion );
+ Collection<ArtifactMetadata> storageArtifacts =
+ storageResolver.getArtifacts( repoId, namespace, projectId, projectVersion,
+ new ExcludesFilter<String>( createArtifactIdList( artifacts ) ) );
+ if ( storageArtifacts != null && !storageArtifacts.isEmpty() )
+ {
+ for ( ArtifactMetadata artifact : storageArtifacts )
+ {
+ metadataRepository.updateArtifact( repoId, namespace, projectId, projectVersion, artifact );
+ }
+ artifacts = new ArrayList<ArtifactMetadata>( artifacts );
+ artifacts.addAll( storageArtifacts );
+ }
+ return artifacts;
+ }
+
+ private Collection<String> createArtifactIdList( Collection<ArtifactMetadata> artifacts )
+ {
+ Collection<String> artifactIds = new ArrayList<String>();
+ for ( ArtifactMetadata artifact : artifacts )
+ {
+ artifactIds.add( artifact.getId() );
+ }
+ return artifactIds;
+ }
}
List<ArtifactMetadata> getArtifactsByDateRange( String repoId, Date startTime, Date endTime );
Collection<String> getRepositories();
-
- public Collection<ArtifactMetadata> getArtifacts( String repoId, String namespace, String projectId,
- String projectVersion );
}
import java.util.Collection;
+import org.apache.archiva.metadata.model.ArtifactMetadata;
import org.apache.archiva.metadata.model.ProjectMetadata;
import org.apache.archiva.metadata.model.ProjectVersionMetadata;
import org.apache.archiva.metadata.model.ProjectVersionReference;
Collection<String> getProjectVersions( String repoId, String namespace, String projectId )
throws MetadataResolverException;
+
+ Collection<ArtifactMetadata> getArtifacts( String repoId, String namespace, String projectId,
+ String projectVersion );
}
File toFile( File basedir, String namespace, String projectId );
File toFile( File basedir, String namespace );
+
+ File toFile( File basedir, String namespace, String projectId, String projectVersion );
}
package org.apache.archiva.metadata.repository.storage;
-import java.util.Collection;
-
-import org.apache.archiva.metadata.repository.MetadataResolver;
-import org.apache.archiva.metadata.repository.filter.Filter;
-
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* under the License.
*/
+import java.util.Collection;
+
+import org.apache.archiva.metadata.model.ArtifactMetadata;
+import org.apache.archiva.metadata.repository.MetadataResolver;
+import org.apache.archiva.metadata.repository.filter.Filter;
+
public interface StorageMetadataResolver
extends MetadataResolver
{
Collection<String> getProjects( String repoId, String namespace, Filter<String> filter );
- Collection<String> getProjectVersions( String repoId, String namespace, String projectId, Filter<String> filter );
+ Collection<String> getProjectVersions( String repoId, String namespace, String projectId, Filter<String> filter );
+
+ Collection<ArtifactMetadata> getArtifacts( String repoId, String namespace, String projectId, String projectVersion,
+ Filter<String> filter );
}
import java.io.File;
import java.io.FilenameFilter;
+import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
+import java.util.Date;
import java.util.List;
+import org.apache.archiva.checksum.ChecksumAlgorithm;
+import org.apache.archiva.checksum.ChecksummedFile;
+import org.apache.archiva.metadata.model.ArtifactMetadata;
import org.apache.archiva.metadata.model.ProjectMetadata;
import org.apache.archiva.metadata.model.ProjectVersionMetadata;
import org.apache.archiva.metadata.model.ProjectVersionReference;
return getProjectVersions( repoId, namespace, projectId, ALL );
}
+ public Collection<ArtifactMetadata> getArtifacts( String repoId, String namespace, String projectId,
+ String projectVersion )
+ {
+ return getArtifacts( repoId, namespace, projectId, projectVersion, ALL );
+ }
+
public Collection<String> getProjectVersions( String repoId, String namespace, String projectId,
Filter<String> filter )
{
return files != null ? Arrays.asList( files ) : Collections.<String>emptyList();
}
+ public Collection<ArtifactMetadata> getArtifacts( String repoId, String namespace, String projectId,
+ String projectVersion, Filter<String> filter )
+ {
+ File dir = pathTranslator.toFile( getRepositoryBasedir( repoId ), namespace, projectId, projectVersion );
+
+ // all files that are not metadata and not a checksum / signature are considered artifacts
+ File[] files = dir.listFiles( new ArtifactDirectoryFilter( filter ) );
+
+ List<ArtifactMetadata> artifacts = new ArrayList<ArtifactMetadata>();
+ if ( files != null )
+ {
+ for ( File file : files )
+ {
+ ArtifactMetadata metadata = new ArtifactMetadata();
+ metadata.setId( file.getName() );
+ metadata.setProject( projectId );
+ metadata.setNamespace( namespace );
+ metadata.setRepositoryId( repoId );
+ metadata.setWhenGathered( new Date() );
+ metadata.setFileLastModified( file.lastModified() );
+ ChecksummedFile checksummedFile = new ChecksummedFile( file );
+ try
+ {
+ metadata.setMd5( checksummedFile.calculateChecksum( ChecksumAlgorithm.MD5 ) );
+ }
+ catch ( IOException e )
+ {
+ log.error( "Unable to checksum file " + file + ": " + e.getMessage() );
+ }
+ try
+ {
+ metadata.setSha1( checksummedFile.calculateChecksum( ChecksumAlgorithm.SHA1 ) );
+ }
+ catch ( IOException e )
+ {
+ log.error( "Unable to checksum file " + file + ": " + e.getMessage() );
+ }
+ metadata.setSize( file.length() );
+ metadata.setVersion( projectVersion );
+ artifacts.add( metadata );
+ }
+ }
+ return artifacts;
+ }
+
private boolean isProject( File dir, Filter<String> filter )
{
// scan directories for a valid project version subdirectory, meaning this must be a project directory
return true;
}
}
+
+ private class ArtifactDirectoryFilter
+ implements FilenameFilter
+ {
+ private final Filter<String> filter;
+
+ public ArtifactDirectoryFilter( Filter<String> filter )
+ {
+ this.filter = filter;
+ }
+
+ public boolean accept( File dir, String name )
+ {
+ // TODO compare to logic in maven-repository-layer
+ if ( !filter.accept( name ) )
+ {
+ return false;
+ }
+ else if ( name.startsWith( "." ) )
+ {
+ return false;
+ }
+ else if ( name.endsWith( ".md5" ) || name.endsWith( ".sha1" ) || name.endsWith( ".asc" ) )
+ {
+ return false;
+ }
+ else if ( name.equals( METADATA_FILENAME ) )
+ {
+ return false;
+ }
+ else if ( new File( dir, name ).isDirectory() )
+ {
+ return false;
+ }
+ return true;
+ }
+ }
}
return new File( basedir, toPath( namespace, projectId, projectVersion, filename ) );
}
+ public File toFile( File basedir, String namespace, String projectId, String projectVersion )
+ {
+ return new File( basedir, toPath( namespace, projectId, projectVersion ) );
+ }
+
public String toPath( String namespace, String projectId, String projectVersion, String filename )
{
StringBuilder path = new StringBuilder();
- appendNamespaceAndProject( path, namespace, projectId );
- path.append( projectVersion ).append( PATH_SEPARATOR );
+ appendNamespaceToProjectVersion( path, namespace, projectId, projectVersion );
+ path.append( PATH_SEPARATOR );
path.append( filename );
return path.toString();
}
+ private void appendNamespaceToProjectVersion( StringBuilder path, String namespace, String projectId,
+ String projectVersion )
+ {
+ appendNamespaceAndProject( path, namespace, projectId );
+ path.append( projectVersion );
+ }
+
+ public String toPath( String namespace, String projectId, String projectVersion )
+ {
+ StringBuilder path = new StringBuilder();
+
+ appendNamespaceToProjectVersion( path, namespace, projectId, projectVersion );
+
+ return path.toString();
+ }
+
public String toPath( String namespace )
{
StringBuilder path = new StringBuilder();
import java.util.Collection;
+import org.apache.archiva.metadata.model.ArtifactMetadata;
import org.apache.archiva.metadata.model.ProjectMetadata;
import org.apache.archiva.metadata.model.ProjectVersionMetadata;
import org.apache.archiva.metadata.model.ProjectVersionReference;
{
return null; //To change body of implemented methods use File | Settings | File Templates.
}
+
+ public Collection<ArtifactMetadata> getArtifacts( String repoId, String namespace, String projectId,
+ String projectVersion )
+ {
+ return null; //To change body of implemented methods use File | Settings | File Templates.
+ }
}
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
+import java.util.Comparator;
import java.util.List;
+import org.apache.archiva.metadata.model.ArtifactMetadata;
import org.apache.archiva.metadata.model.Dependency;
import org.apache.archiva.metadata.model.License;
import org.apache.archiva.metadata.model.MailingList;
import org.apache.archiva.metadata.model.ProjectVersionMetadata;
import org.apache.archiva.metadata.repository.MetadataResolverException;
+import org.apache.archiva.metadata.repository.filter.ExcludesFilter;
import org.apache.archiva.metadata.repository.storage.StorageMetadataResolver;
import org.apache.maven.archiva.configuration.ArchivaConfiguration;
import org.apache.maven.archiva.configuration.Configuration;
private static final String ASF_SCM_VIEWVC_BASE = "http://svn.apache.org/viewvc/";
+ private static final String EMPTY_MD5 = "d41d8cd98f00b204e9800998ecf8427e";
+
+ private static final String EMPTY_SHA1 = "da39a3ee5e6b4b0d3255bfef95601890afd80709";
+
public void setUp()
throws Exception
{
resolver.getProjectVersions( TEST_REPO_ID, "org.apache.maven.shared", "maven-downloader" ) );
}
+ public void testGetArtifacts()
+ {
+ List<ArtifactMetadata> artifacts = new ArrayList<ArtifactMetadata>(
+ resolver.getArtifacts( TEST_REPO_ID, "org.codehaus.plexus", "plexus-spring", "1.2" ) );
+ assertEquals( 3, artifacts.size() );
+ Collections.sort( artifacts, new Comparator<ArtifactMetadata>()
+ {
+ public int compare( ArtifactMetadata o1, ArtifactMetadata o2 )
+ {
+ return o1.getId().compareTo( o2.getId() );
+ }
+ } );
+
+ assertArtifact( artifacts.get( 0 ), "plexus-spring-1.2-sources.jar", 0, EMPTY_SHA1, EMPTY_MD5 );
+ assertArtifact( artifacts.get( 1 ), "plexus-spring-1.2.jar", 0, EMPTY_SHA1, EMPTY_MD5 );
+ assertArtifact( artifacts.get( 2 ), "plexus-spring-1.2.pom", 7407, "96b14cf880e384b2d15e8193c57b65c5420ca4c5",
+ "f83aa25f016212a551a4b2249985effc" );
+ }
+
+ public void testGetArtifactsFiltered()
+ {
+ ExcludesFilter<String> filter =
+ new ExcludesFilter<String>( Collections.singletonList( "plexus-spring-1.2.pom" ) );
+ List<ArtifactMetadata> artifacts = new ArrayList<ArtifactMetadata>(
+ resolver.getArtifacts( TEST_REPO_ID, "org.codehaus.plexus", "plexus-spring", "1.2", filter ) );
+ assertEquals( 2, artifacts.size() );
+ Collections.sort( artifacts, new Comparator<ArtifactMetadata>()
+ {
+ public int compare( ArtifactMetadata o1, ArtifactMetadata o2 )
+ {
+ return o1.getId().compareTo( o2.getId() );
+ }
+ } );
+
+ assertArtifact( artifacts.get( 0 ), "plexus-spring-1.2-sources.jar", 0, EMPTY_SHA1, EMPTY_MD5 );
+ assertArtifact( artifacts.get( 1 ), "plexus-spring-1.2.jar", 0, EMPTY_SHA1, EMPTY_MD5 );
+ }
+
+ private void assertArtifact( ArtifactMetadata artifact, String id, int size, String sha1, String md5 )
+ {
+ assertEquals( id, artifact.getId() );
+ assertEquals( md5, artifact.getMd5() );
+ assertEquals( sha1, artifact.getSha1() );
+ assertEquals( size, artifact.getSize() );
+ assertEquals( "org.codehaus.plexus", artifact.getNamespace() );
+ assertEquals( "plexus-spring", artifact.getProject() );
+ assertEquals( "1.2", artifact.getVersion() );
+ assertEquals( TEST_REPO_ID, artifact.getRepositoryId() );
+ }
+
private void assertMailingList( MailingList mailingList, String name, String archive, String post, String subscribe,
String unsubscribe, List<String> otherArchives, boolean allowPost )
{
--- /dev/null
+<metadata>
+ <groupId>org.codehaus.plexus</groupId>
+ <artifactId>plexus-spring</artifactId>
+ <version>1.2</version>
+</metadata>
--- /dev/null
+MD5(maven-metadata.xml)= 158c9a964de51dc98f46aa98f1840d8d
--- /dev/null
+SHA1(maven-metadata.xml)= 39cde2cacfaa779b0c75ee3cccd4be6ab2cf9f5e
--- /dev/null
+-----BEGIN PGP MESSAGE-----
+Version: GnuPG v1.4.10 (Darwin)
+
+owEBUwKs/ZANAwAKAeE2CIoYJL3BAcsjYh1wbGV4dXMtc3ByaW5nLTEuMi1zb3Vy
+Y2VzLmphcksgbhSJAhwEAAEKAAYFAksgbhQACgkQ4TYIihgkvcGrUxAAvXC1yZZ4
+5NthtORnTBqm1twtg8UFN00vIqjhjC3t+A4mvdblx84va7BRHv0IedHcqhjVXK0O
+sLvlVAAx+lCaoqVOq7jOVbqHJRxDh69LpS9uCRBaNX1v7/7GNzPNAK1zhGZyKckG
+uYIYEmBJAfRB5zvezfax/gUZeIbpomeRLZo26+3M4hozRvmhniZpmvWILAmkJ0fh
+hjejepc0tBSakyEE21PjLbY4GwR/hAQ3h/NXL9a5Y+NM6/Hi/q+v48q5u/3PdoKH
+KR11cCpf1BXI/BreikN3UhSojHsi36Ptv86ybFE4HFqp93y816VrRXUgYbd0Awq2
+DGLGkRg1dP/9M9mUgL+M3R0PHquKUqrNWSgnEoSSXFM6xVMumzA49dez23+x4tr1
+cTpXee/qMuQOHCe1jRSN8JWot7OFAJZ4BooyIl2sj5XO8tGKgRCQkbEcNGPWEqfh
+Cee3F2NIiB2jvyniiEFHw2XGGaqynAmp4IDzUyoNhoZ8cYXzimZRfU0qjel8P7lo
+YgxF11BxMIQgIclRn+MS8bBbumKg/MfGPI8+91x/hmC6t4SL9hj+Gk/FQGakF4+O
+EXQVQpE9823h8rzMfYKv2UR3rcJWUMfX5vDkqkjcFTMkfOd13jZVbVqZAF3OcbWY
+iX6hep/GjOPzYHbFk/RJPeZhMPqo/B6SbaI=
+=WL6S
+-----END PGP MESSAGE-----
--- /dev/null
+MD5(plexus-spring-1.2-sources.jar)= d41d8cd98f00b204e9800998ecf8427e
--- /dev/null
+SHA1(plexus-spring-1.2-sources.jar)= da39a3ee5e6b4b0d3255bfef95601890afd80709
--- /dev/null
+-----BEGIN PGP MESSAGE-----
+Version: GnuPG v1.4.10 (Darwin)
+
+owEBSwK0/ZANAwAKAeE2CIoYJL3BAcsbYhVwbGV4dXMtc3ByaW5nLTEuMi5qYXJL
+IG4LiQIcBAABCgAGBQJLIG4LAAoJEOE2CIoYJL3Bv1MQAJ6R0qCtvr8nDimYxBJ0
+7sDpYG0C9RjC1NbFskDbq514F+wRkjkqBHQ5HAhrANN7W++xmS+MIAb2FOYMIuw9
+QQ/odKwQZRBvQNNr3vJdeLO8b+Cu9m2SsToq7+SH5+PJLSoLG/7kgv/JL757mxL0
+4kHeJbbwvNC8wK8NUBZjZHL3pNRUpa7pCXCh+GMVtfZItaVX6BRQEYTyskrtnGuR
+8EDs1E3Hqdt8QycmOLVd1VYxXLAizefaVun4rWTtfWDPVnGxio+MWwTf/9JhkSCn
+UdE0+n/9jC0ICDq1t3wNqI5XMgG7/CLDY+ALXqfG8eFaM4jVF+NXu3oW/VjLhPrA
+rL5p+kahz4OTo5pqKx8NTU4vSo1L9B2EKeP5rv2/2qILmqpj8YvIvXqMmAskyrGw
+O4EJeBar/7aN6m9s1ZP7oYQANVAm/6r7GfzSXTy3QSj/OA1fkjRtQuaGQoZfHnQg
+DLcLEMhVDcqBu4ck+VaVdRa5sDxGCmsikz68qdQMY4bAuvf2HiulQNOCcPCvO83/
+TLSqlfPPlFGgouTkStCkJbXwTBjEQUBrNUPCKcs/kUwIUZbg6ziWRk8uO2sWEMYT
+JfXylgeRNcUvpWwTJwSma/05p61Enassai6y97vYDXvhpZY41XdZdg1+pOUm0+QO
+Yw55n4vJQxAeUcON2YlqKIlA
+=Ooq6
+-----END PGP MESSAGE-----
--- /dev/null
+MD5(plexus-spring-1.2.jar)= d41d8cd98f00b204e9800998ecf8427e
--- /dev/null
+SHA1(plexus-spring-1.2.jar)= da39a3ee5e6b4b0d3255bfef95601890afd80709
--- /dev/null
+-----BEGIN PGP MESSAGE-----
+Version: GnuPG v1.4.10 (Darwin)
+
+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
+4a+9Pj7e+9Zr/wM=
+=HMat
+-----END PGP MESSAGE-----
--- /dev/null
+MD5(plexus-spring-1.2.pom)= f83aa25f016212a551a4b2249985effc
--- /dev/null
+SHA1(plexus-spring-1.2.pom)= 96b14cf880e384b2d15e8193c57b65c5420ca4c5