Author: brett
Date: Sat Nov 28 08:32:21 2009
New Revision: 885072

URL: http://svn.apache.org/viewvc?rev=885072&view=rev
Log:
[MRM-1283] intercept requests for browsing and use the repository storage to 
determine values if not in metadata

Added:
    
archiva/branches/MRM-1025/archiva-modules/plugins/maven2-repository/src/test/repositories/test/.index/
    
archiva/branches/MRM-1025/archiva-modules/plugins/maven2-repository/src/test/repositories/test/.index/some-index.zip
Modified:
    
archiva/branches/MRM-1025/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/DefaultMetadataResolver.java
    
archiva/branches/MRM-1025/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/storage/RepositoryPathTranslator.java
    
archiva/branches/MRM-1025/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolver.java
    
archiva/branches/MRM-1025/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryPathTranslator.java
    
archiva/branches/MRM-1025/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolverTest.java

Modified: 
archiva/branches/MRM-1025/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/DefaultMetadataResolver.java
URL: 
http://svn.apache.org/viewvc/archiva/branches/MRM-1025/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/DefaultMetadataResolver.java?rev=885072&r1=885071&r2=885072&view=diff
==============================================================================
--- 
archiva/branches/MRM-1025/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/DefaultMetadataResolver.java
 (original)
+++ 
archiva/branches/MRM-1025/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/DefaultMetadataResolver.java
 Sat Nov 28 08:32:21 2009
@@ -104,29 +104,57 @@
 
     public Collection<String> getRootNamespaces( String repoId )
     {
-        // TODO: is this assumption correct? could a storage mech. actually 
know all references in a non-Maven scenario?
-        // not passed to the storage mechanism as resolving references would 
require iterating all groups
-        return metadataRepository.getRootNamespaces( repoId );
+        Collection<String> rootNamespaces = 
metadataRepository.getRootNamespaces( repoId );
+
+        // TODO: may want caching on this
+        Collection<String> storageRootNamespaces = 
storageResolver.getRootNamespaces( repoId );
+        if ( storageRootNamespaces != null && !storageRootNamespaces.equals( 
rootNamespaces ) )
+        {
+            // TODO: update the metadata repository
+            rootNamespaces = storageRootNamespaces;
+        }
+
+        return rootNamespaces;
     }
 
     public Collection<String> getNamespaces( String repoId, String namespace )
     {
-        // TODO: is this assumption correct? could a storage mech. actually 
know all references in a non-Maven scenario?
-        // not passed to the storage mechanism as resolving references would 
require iterating all groups
-        return metadataRepository.getNamespaces( repoId, namespace );
+        Collection<String> namespaces = metadataRepository.getNamespaces( 
repoId, namespace );
+        // TODO: may want caching on this
+        Collection<String> storageNamespaces = storageResolver.getNamespaces( 
repoId, namespace );
+        if ( storageNamespaces != null && !storageNamespaces.equals( 
namespaces ) )
+        {
+            // TODO: update the metadata repository
+            namespaces = storageNamespaces;
+        }
+
+        return namespaces;
     }
 
     public Collection<String> getProjects( String repoId, String namespace )
     {
-        // TODO: is this assumption correct? could a storage mech. actually 
know all references in a non-Maven scenario?
-        // not passed to the storage mechanism as resolving references would 
require iterating all projects
-        return metadataRepository.getProjects( repoId, namespace );
+        Collection<String> projects = metadataRepository.getProjects( repoId, 
namespace );
+        // TODO: may want caching on this
+        Collection<String> storageProjects = storageResolver.getProjects( 
repoId, namespace );
+        if ( storageProjects != null && !storageProjects.equals( projects ) )
+        {
+            // TODO: update the metadata repository
+            projects = storageProjects;
+        }
+
+        return projects;
     }
 
     public Collection<String> getProjectVersions( String repoId, String 
namespace, String projectId )
     {
-        // TODO: is this assumption correct? could a storage mech. actually 
know all references in a non-Maven scenario?
-        // not passed to the storage mechanism as resolving references would 
require iterating all versions
-        return metadataRepository.getProjectVersions( repoId, namespace, 
projectId );
+        Collection<String> projectVersions = 
metadataRepository.getProjectVersions( repoId, namespace, projectId );
+        // TODO: may want caching on this
+        Collection<String> storageProjectVersions = 
storageResolver.getProjectVersions( repoId, namespace, projectId );
+        if ( storageProjectVersions != null && !storageProjectVersions.equals( 
projectVersions ) )
+        {
+            // TODO: update the metadata repository
+            projectVersions = storageProjectVersions;
+        }
+        return projectVersions;
     }
 }

Modified: 
archiva/branches/MRM-1025/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/storage/RepositoryPathTranslator.java
URL: 
http://svn.apache.org/viewvc/archiva/branches/MRM-1025/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/storage/RepositoryPathTranslator.java?rev=885072&r1=885071&r2=885072&view=diff
==============================================================================
--- 
archiva/branches/MRM-1025/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/storage/RepositoryPathTranslator.java
 (original)
+++ 
archiva/branches/MRM-1025/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/storage/RepositoryPathTranslator.java
 Sat Nov 28 08:32:21 2009
@@ -26,4 +26,8 @@
     File toFile( File basedir, String namespace, String projectId, String 
projectVersion, String filename );
 
     String toPath( String namespace, String projectId, String projectVersion, 
String filename );
+
+    File toFile( File basedir, String namespace, String projectId );
+
+    File toFile( File basedir, String namespace );
 }

Modified: 
archiva/branches/MRM-1025/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolver.java
URL: 
http://svn.apache.org/viewvc/archiva/branches/MRM-1025/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolver.java?rev=885072&r1=885071&r2=885072&view=diff
==============================================================================
--- 
archiva/branches/MRM-1025/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolver.java
 (original)
+++ 
archiva/branches/MRM-1025/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolver.java
 Sat Nov 28 08:32:21 2009
@@ -20,8 +20,11 @@
  */
 
 import java.io.File;
+import java.io.FilenameFilter;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.List;
 
 import org.apache.archiva.metadata.model.ProjectMetadata;
@@ -72,6 +75,24 @@
 
     private final static Logger log = LoggerFactory.getLogger( 
Maven2RepositoryMetadataResolver.class );
 
+    private static final String METADATA_FILENAME = "maven-metadata.xml";
+
+    private static final FilenameFilter DIRECTORY_FILTER = new FilenameFilter()
+    {
+        public boolean accept( File dir, String name )
+        {
+            if ( name.startsWith( "." ) )
+            {
+                return false;
+            }
+            else if ( !new File( dir, name ).isDirectory() )
+            {
+                return false;
+            }
+            return true;
+        }
+    };
+
     public ProjectMetadata getProject( String repoId, String namespace, String 
projectId )
     {
         throw new UnsupportedOperationException();
@@ -90,7 +111,7 @@
         if ( VersionUtil.isSnapshot( projectVersion ) )
         {
             File metadataFile =
-                pathTranslator.toFile( basedir, namespace, projectId, 
projectVersion, "maven-metadata.xml" );
+                pathTranslator.toFile( basedir, namespace, projectId, 
projectVersion, METADATA_FILENAME );
             try
             {
                 MavenRepositoryMetadata metadata = 
MavenRepositoryMetadataReader.read( metadataFile );
@@ -285,21 +306,157 @@
 
     public Collection<String> getRootNamespaces( String repoId )
     {
-        throw new UnsupportedOperationException();
+        File dir = getRepositoryBasedir( repoId );
+
+        String[] files = dir.list( DIRECTORY_FILTER );
+        return files != null ? Arrays.asList( files ) : 
Collections.<String>emptyList();
     }
 
-    public List<String> getNamespaces( String repoId, String namespace )
+    private File getRepositoryBasedir( String repoId )
     {
-        throw new UnsupportedOperationException();
+        ManagedRepositoryConfiguration repositoryConfiguration =
+            archivaConfiguration.getConfiguration().findManagedRepositoryById( 
repoId );
+
+        return new File( repositoryConfiguration.getLocation() );
+    }
+
+    public Collection<String> getNamespaces( String repoId, String namespace )
+    {
+        File dir = pathTranslator.toFile( getRepositoryBasedir( repoId ), 
namespace );
+
+        // scan all the directories which are potential namespaces. Any 
directories known to be projects are excluded
+        Collection<String> namespaces = new ArrayList<String>();
+        File[] files = dir.listFiles( DIRECTORY_FILTER );
+        if ( files != null )
+        {
+            for ( File file : files )
+            {
+                if ( !isProject( file ) )
+                {
+                    namespaces.add( file.getName() );
+                }
+            }
+        }
+        return namespaces;
     }
 
     public Collection<String> getProjects( String repoId, String namespace )
     {
-        throw new UnsupportedOperationException();
+        File dir = pathTranslator.toFile( getRepositoryBasedir( repoId ), 
namespace );
+
+        // scan all directories in the namespace, and only include those that 
are known to be projects
+        Collection<String> projects = new ArrayList<String>();
+        File[] files = dir.listFiles( DIRECTORY_FILTER );
+        if ( files != null )
+        {
+            for ( File file : files )
+            {
+                if ( isProject( file ) )
+                {
+                    projects.add( file.getName() );
+                }
+            }
+        }
+        return projects;
     }
 
     public Collection<String> getProjectVersions( String repoId, String 
namespace, String projectId )
     {
-        throw new UnsupportedOperationException();
+        File dir = pathTranslator.toFile( getRepositoryBasedir( repoId ), 
namespace, projectId );
+
+        // all directories in a project directory can be considered a version
+        Collection<String> projectVersions = new ArrayList<String>();
+        String[] files = dir.list( DIRECTORY_FILTER );
+        return files != null ? Arrays.asList( files ) : 
Collections.<String>emptyList();
+    }
+
+    private boolean isProject( File dir )
+    {
+        // if a metadata file is present, check if this is the "artifactId" 
directory, marking it as a project
+        MavenRepositoryMetadata metadata = readMetadata( dir );
+        if ( metadata != null && dir.getName().equals( 
metadata.getArtifactId() ) )
+        {
+            return true;
+        }
+
+        // if metadata is missing, scan directories for a valid project 
version subdirectory, meaning this must be a
+        // project directory
+        File[] files = dir.listFiles( DIRECTORY_FILTER );
+        if ( files != null )
+        {
+            for ( File file : files )
+            {
+                if ( isProjectVersion( file ) )
+                {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    private boolean isProjectVersion( File dir )
+    {
+        final String artifactId = dir.getParentFile().getName();
+        final String projectVersion = dir.getName();
+
+        // if a metadata file is present, check if this is the "version" 
directory, marking it as a project version
+        MavenRepositoryMetadata metadata = readMetadata( dir );
+        if ( metadata != null && projectVersion.equals( metadata.getVersion() 
) )
+        {
+            return true;
+        }
+
+        // if metadata is missing, check if there is a POM artifact file to 
ensure it is a version directory
+        File[] files;
+        if ( VersionUtil.isSnapshot( projectVersion ) )
+        {
+            files = dir.listFiles( new FilenameFilter()
+            {
+                public boolean accept( File dir, String name )
+                {
+                    if ( name.startsWith( artifactId + "-" ) && name.endsWith( 
".pom" ) )
+                    {
+                        String v = name.substring( artifactId.length() + 1, 
name.length() - 4 );
+                        v = VersionUtil.getBaseVersion( v );
+                        if ( v.equals( projectVersion ) )
+                        {
+                            return true;
+                        }
+                    }
+                    return false;
+                }
+            } );
+        }
+        else
+        {
+            final String pomFile = artifactId + "-" + projectVersion + ".pom";
+            files = dir.listFiles( new FilenameFilter()
+            {
+                public boolean accept( File dir, String name )
+                {
+                    return pomFile.equals( name );
+                }
+            } );
+        }
+        return files != null && files.length > 0;
+    }
+
+    private MavenRepositoryMetadata readMetadata( File directory )
+    {
+        MavenRepositoryMetadata metadata = null;
+        File metadataFile = new File( directory, METADATA_FILENAME );
+        if ( metadataFile.exists() )
+        {
+            try
+            {
+                metadata = MavenRepositoryMetadataReader.read( metadataFile );
+            }
+            catch ( XMLException e )
+            {
+                // ignore missing or invalid metadata
+            }
+        }
+        return metadata;
     }
 }

Modified: 
archiva/branches/MRM-1025/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryPathTranslator.java
URL: 
http://svn.apache.org/viewvc/archiva/branches/MRM-1025/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryPathTranslator.java?rev=885072&r1=885071&r2=885072&view=diff
==============================================================================
--- 
archiva/branches/MRM-1025/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryPathTranslator.java
 (original)
+++ 
archiva/branches/MRM-1025/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryPathTranslator.java
 Sat Nov 28 08:32:21 2009
@@ -42,14 +42,52 @@
     {
         StringBuilder path = new StringBuilder();
 
-        path.append( formatAsDirectory( namespace ) ).append( PATH_SEPARATOR );
-        path.append( projectId ).append( PATH_SEPARATOR );
+        appendNamespaceAndProject( path, namespace, projectId );
         path.append( projectVersion ).append( PATH_SEPARATOR );
         path.append( filename );
 
         return path.toString();
     }
 
+    public String toPath( String namespace )
+    {
+        StringBuilder path = new StringBuilder();
+
+        appendNamespace( path, namespace );
+
+        return path.toString();
+    }
+
+    public String toPath( String namespace, String projectId )
+    {
+        StringBuilder path = new StringBuilder();
+
+        appendNamespaceAndProject( path, namespace, projectId );
+
+        return path.toString();
+    }
+
+    private void appendNamespaceAndProject( StringBuilder path, String 
namespace, String projectId )
+    {
+        appendNamespace( path, namespace );
+        path.append( projectId ).append( PATH_SEPARATOR );
+    }
+
+    private void appendNamespace( StringBuilder path, String namespace )
+    {
+        path.append( formatAsDirectory( namespace ) ).append( PATH_SEPARATOR );
+    }
+
+    public File toFile( File basedir, String namespace, String projectId )
+    {
+        return new File( basedir, toPath( namespace, projectId ) );
+    }
+
+    public File toFile( File basedir, String namespace )
+    {
+        return new File( basedir, toPath( namespace ) );
+    }
+
     private String formatAsDirectory( String directory )
     {
         return directory.replace( GROUP_SEPARATOR, PATH_SEPARATOR );

Modified: 
archiva/branches/MRM-1025/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolverTest.java
URL: 
http://svn.apache.org/viewvc/archiva/branches/MRM-1025/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolverTest.java?rev=885072&r1=885071&r2=885072&view=diff
==============================================================================
--- 
archiva/branches/MRM-1025/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolverTest.java
 (original)
+++ 
archiva/branches/MRM-1025/archiva-modules/plugins/maven2-repository/src/test/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolverTest.java
 Sat Nov 28 08:32:21 2009
@@ -220,6 +220,75 @@
 
     }
 
+    public void testGetRootNamespaces()
+    {
+        assertEquals( Arrays.asList( "com", "org" ), 
resolver.getRootNamespaces( TEST_REPO_ID ) );
+    }
+
+    public void testGetNamespaces()
+    {
+        assertEquals( Arrays.asList( "example" ), resolver.getNamespaces( 
TEST_REPO_ID, "com" ) );
+        assertEquals( Arrays.asList( "test" ), resolver.getNamespaces( 
TEST_REPO_ID, "com.example" ) );
+        assertEquals( Collections.<String>emptyList(), resolver.getNamespaces( 
TEST_REPO_ID, "com.example.test" ) );
+
+        assertEquals( Arrays.asList( "apache" ), resolver.getNamespaces( 
TEST_REPO_ID, "org" ) );
+        assertEquals( Arrays.asList( "archiva", "maven" ), 
resolver.getNamespaces( TEST_REPO_ID, "org.apache" ) );
+        assertEquals( Collections.<String>emptyList(), resolver.getNamespaces( 
TEST_REPO_ID, "org.apache.archiva" ) );
+        assertEquals( Arrays.asList( "plugins", "shared" ),
+                      resolver.getNamespaces( TEST_REPO_ID, "org.apache.maven" 
) );
+        assertEquals( Collections.<String>emptyList(),
+                      resolver.getNamespaces( TEST_REPO_ID, 
"org.apache.maven.plugins" ) );
+        assertEquals( Collections.<String>emptyList(),
+                      resolver.getNamespaces( TEST_REPO_ID, 
"org.apache.maven.shared" ) );
+    }
+
+    public void testGetProjects()
+    {
+        assertEquals( Collections.<String>emptyList(), resolver.getProjects( 
TEST_REPO_ID, "com" ) );
+        assertEquals( Collections.<String>emptyList(), resolver.getProjects( 
TEST_REPO_ID, "com.example" ) );
+        assertEquals( Arrays.asList( "incomplete-metadata", "invalid-pom", 
"malformed-metadata", "missing-metadata" ),
+                      resolver.getProjects( TEST_REPO_ID, "com.example.test" ) 
);
+
+        assertEquals( Collections.<String>emptyList(), resolver.getProjects( 
TEST_REPO_ID, "org" ) );
+        assertEquals( Arrays.asList( "apache" ), resolver.getProjects( 
TEST_REPO_ID, "org.apache" ) );
+        assertEquals( Arrays.asList( "archiva", "archiva-base", 
"archiva-common", "archiva-modules", "archiva-parent" ),
+                      resolver.getProjects( TEST_REPO_ID, "org.apache.archiva" 
) );
+        assertEquals( Collections.<String>emptyList(), resolver.getProjects( 
TEST_REPO_ID, "org.apache.maven" ) );
+        assertEquals( Collections.<String>emptyList(),
+                      resolver.getProjects( TEST_REPO_ID, 
"org.apache.maven.plugins" ) );
+        assertEquals( Arrays.asList( "maven-downloader" ),
+                      resolver.getProjects( TEST_REPO_ID, 
"org.apache.maven.shared" ) );
+    }
+
+    public void testGetProjectVersions()
+    {
+        assertEquals( Arrays.asList( "1.0-SNAPSHOT" ),
+                      resolver.getProjectVersions( TEST_REPO_ID, 
"com.example.test", "incomplete-metadata" ) );
+        assertEquals( Arrays.asList( "1.0-SNAPSHOT" ),
+                      resolver.getProjectVersions( TEST_REPO_ID, 
"com.example.test", "malformed-metadata" ) );
+        assertEquals( Arrays.asList( "1.0-SNAPSHOT" ),
+                      resolver.getProjectVersions( TEST_REPO_ID, 
"com.example.test", "missing-metadata" ) );
+        assertEquals( Arrays.asList( "1.0" ),
+                      resolver.getProjectVersions( TEST_REPO_ID, 
"com.example.test", "invalid-pom" ) );
+
+        assertEquals( Arrays.asList( "4", "5-SNAPSHOT" ),
+                      resolver.getProjectVersions( TEST_REPO_ID, "org.apache", 
"apache" ) );
+
+        assertEquals( Arrays.asList( "1.2.1" ),
+                      resolver.getProjectVersions( TEST_REPO_ID, 
"org.apache.archiva", "archiva" ) );
+        assertEquals( Arrays.asList( "1.2.1" ),
+                      resolver.getProjectVersions( TEST_REPO_ID, 
"org.apache.archiva", "archiva-base" ) );
+        assertEquals( Arrays.asList( "1.2.1" ),
+                      resolver.getProjectVersions( TEST_REPO_ID, 
"org.apache.archiva", "archiva-common" ) );
+        assertEquals( Arrays.asList( "1.2.1" ),
+                      resolver.getProjectVersions( TEST_REPO_ID, 
"org.apache.archiva", "archiva-modules" ) );
+        assertEquals( Arrays.asList( "3" ),
+                      resolver.getProjectVersions( TEST_REPO_ID, 
"org.apache.archiva", "archiva-parent" ) );
+
+        assertEquals( Collections.<String>emptyList(),
+                      resolver.getProjectVersions( TEST_REPO_ID, 
"org.apache.maven.shared", "maven-downloader" ) );
+    }
+
     private void assertMailingList( MailingList mailingList, String name, 
String archive, String post, String subscribe,
                                     String unsubscribe, List<String> 
otherArchives, boolean allowPost )
     {

Added: 
archiva/branches/MRM-1025/archiva-modules/plugins/maven2-repository/src/test/repositories/test/.index/some-index.zip
URL: 
http://svn.apache.org/viewvc/archiva/branches/MRM-1025/archiva-modules/plugins/maven2-repository/src/test/repositories/test/.index/some-index.zip?rev=885072&view=auto
==============================================================================
    (empty)


Reply via email to