Author: brett
Date: Sat Nov 28 14:28:30 2009
New Revision: 885095

URL: http://svn.apache.org/viewvc?rev=885095&view=rev
Log:
[MRM-1283] improve performance of on-demand resolution from storage. Still 
could be improved.

Added:
    
archiva/branches/MRM-1025/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/filter/
    
archiva/branches/MRM-1025/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/filter/AllFilter.java
   (with props)
    
archiva/branches/MRM-1025/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/filter/ExcludesFilter.java
   (with props)
    
archiva/branches/MRM-1025/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/filter/Filter.java
   (with props)
    
archiva/branches/MRM-1025/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/storage/StorageMetadataResolver.java
   (with props)
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/MetadataRepository.java
    
archiva/branches/MRM-1025/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/MetadataResolver.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/test/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolverTest.java
    
archiva/branches/MRM-1025/archiva-modules/plugins/metadata-repository-file/src/main/java/org/apache/archiva/metadata/repository/file/FileMetadataRepository.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=885095&r1=885094&r2=885095&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 14:28:30 2009
@@ -19,12 +19,15 @@
  * under the License.
  */
 
+import java.util.ArrayList;
 import java.util.Collection;
 
 import org.apache.archiva.metadata.model.Dependency;
 import org.apache.archiva.metadata.model.ProjectMetadata;
 import org.apache.archiva.metadata.model.ProjectVersionMetadata;
 import org.apache.archiva.metadata.model.ProjectVersionReference;
+import org.apache.archiva.metadata.repository.filter.ExcludesFilter;
+import org.apache.archiva.metadata.repository.storage.StorageMetadataResolver;
 
 /**
  * @plexus.component 
role="org.apache.archiva.metadata.repository.MetadataResolver"
@@ -44,7 +47,7 @@
      *
      * @plexus.requirement role-hint="maven2"
      */
-    private MetadataResolver storageResolver;
+    private StorageMetadataResolver storageResolver;
 
     public ProjectMetadata getProject( String repoId, String namespace, String 
projectId )
     {
@@ -104,56 +107,79 @@
 
     public Collection<String> getRootNamespaces( String 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 ) )
+        Collection<String> namespaces = metadataRepository.getRootNamespaces( 
repoId );
+        Collection<String> storageNamespaces =
+            storageResolver.getRootNamespaces( repoId, new 
ExcludesFilter<String>( namespaces ) );
+        if ( storageNamespaces != null && !storageNamespaces.isEmpty() )
         {
-            // TODO: update the metadata repository
-            rootNamespaces = storageRootNamespaces;
+            for ( String n : storageNamespaces )
+            {
+                metadataRepository.updateNamespace( repoId, n );
+            }
+            namespaces = new ArrayList<String>( namespaces );
+            namespaces.addAll( storageNamespaces );
         }
-
-        return rootNamespaces;
+        return namespaces;
     }
 
     public Collection<String> getNamespaces( String repoId, String 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 ) )
+        Collection<String> storageNamespaces =
+            storageResolver.getNamespaces( repoId, namespace, new 
ExcludesFilter<String>( namespaces ) );
+        if ( storageNamespaces != null && !storageNamespaces.isEmpty() )
         {
-            // TODO: update the metadata repository
-            namespaces = storageNamespaces;
+            for ( String n : storageNamespaces )
+            {
+                metadataRepository.updateNamespace( repoId, namespace + "." + 
n );
+            }
+            namespaces = new ArrayList<String>( namespaces );
+            namespaces.addAll( storageNamespaces );
         }
-
         return namespaces;
     }
 
     public Collection<String> getProjects( String repoId, String 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 ) )
+        Collection<String> storageProjects =
+            storageResolver.getProjects( repoId, namespace, new 
ExcludesFilter<String>( projects ) );
+        if ( storageProjects != null && !storageProjects.isEmpty() )
         {
-            // TODO: update the metadata repository
-            projects = storageProjects;
+            for ( String projectId : storageProjects )
+            {
+                ProjectMetadata projectMetadata = storageResolver.getProject( 
repoId, namespace, projectId );
+                if ( projectMetadata != null )
+                {
+                    metadataRepository.updateProject( repoId, projectMetadata 
);
+                }
+            }
+            projects = new ArrayList<String>( projects );
+            projects.addAll( storageProjects );
         }
-
         return projects;
     }
 
     public Collection<String> getProjectVersions( String repoId, String 
namespace, String projectId )
+        throws MetadataResolverException
     {
         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 ) )
+        Collection<String> storageProjectVersions = 
storageResolver.getProjectVersions( repoId, namespace, projectId,
+                                                                               
         new ExcludesFilter<String>(
+                                                                               
             projectVersions ) );
+        if ( storageProjectVersions != null && 
!storageProjectVersions.isEmpty() )
         {
-            // TODO: update the metadata repository
-            projectVersions = storageProjectVersions;
+            for ( String projectVersion : storageProjectVersions )
+            {
+                ProjectVersionMetadata versionMetadata =
+                    storageResolver.getProjectVersion( repoId, namespace, 
projectId, projectVersion );
+                if ( versionMetadata != null )
+                {
+                    metadataRepository.updateProjectVersion( repoId, 
namespace, projectId, versionMetadata );
+                }
+            }
+            projectVersions = new ArrayList<String>( projectVersions );
+            projectVersions.addAll( storageProjectVersions );
         }
         return projectVersions;
     }

Modified: 
archiva/branches/MRM-1025/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/MetadataRepository.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/MetadataRepository.java?rev=885095&r1=885094&r2=885095&view=diff
==============================================================================
--- 
archiva/branches/MRM-1025/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/MetadataRepository.java
 (original)
+++ 
archiva/branches/MRM-1025/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/MetadataRepository.java
 Sat Nov 28 14:28:30 2009
@@ -30,6 +30,7 @@
     /**
      * Update metadata for a particular project in the metadata repository, or 
create it if it does not already exist.
      *
+     * @param repoId the repository the project is in
      * @param project the project metadata to create or update
      */
     void updateProject( String repoId, ProjectMetadata project );
@@ -42,4 +43,6 @@
 
     void updateProjectReference( String repoId, String namespace, String 
projectId, String projectVersion,
                                  ProjectVersionReference reference );
+
+    void updateNamespace( String repoId, String namespace );
 }

Modified: 
archiva/branches/MRM-1025/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/MetadataResolver.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/MetadataResolver.java?rev=885095&r1=885094&r2=885095&view=diff
==============================================================================
--- 
archiva/branches/MRM-1025/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/MetadataResolver.java
 (original)
+++ 
archiva/branches/MRM-1025/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/MetadataResolver.java
 Sat Nov 28 14:28:30 2009
@@ -54,5 +54,6 @@
 
     Collection<String> getProjects( String repoId, String namespace );
 
-    Collection<String> getProjectVersions( String repoId, String namespace, 
String projectId );
+    Collection<String> getProjectVersions( String repoId, String namespace, 
String projectId )
+        throws MetadataResolverException;
 }

Added: 
archiva/branches/MRM-1025/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/filter/AllFilter.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/filter/AllFilter.java?rev=885095&view=auto
==============================================================================
--- 
archiva/branches/MRM-1025/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/filter/AllFilter.java
 (added)
+++ 
archiva/branches/MRM-1025/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/filter/AllFilter.java
 Sat Nov 28 14:28:30 2009
@@ -0,0 +1,29 @@
+package org.apache.archiva.metadata.repository.filter;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+public class AllFilter<T>
+    implements Filter<T>
+{
+    public boolean accept( T value )
+    {
+        return true;
+    }
+}
\ No newline at end of file

Propchange: 
archiva/branches/MRM-1025/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/filter/AllFilter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
archiva/branches/MRM-1025/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/filter/ExcludesFilter.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/filter/ExcludesFilter.java?rev=885095&view=auto
==============================================================================
--- 
archiva/branches/MRM-1025/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/filter/ExcludesFilter.java
 (added)
+++ 
archiva/branches/MRM-1025/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/filter/ExcludesFilter.java
 Sat Nov 28 14:28:30 2009
@@ -0,0 +1,38 @@
+package org.apache.archiva.metadata.repository.filter;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import java.util.Collection;
+
+public class ExcludesFilter<T>
+    implements Filter<T>
+{
+    private Collection<T> excludes;
+
+    public ExcludesFilter( Collection<T> excludes )
+    {
+        this.excludes = excludes;
+    }
+
+    public boolean accept( T value )
+    {
+        return !excludes.contains( value );
+    }
+}

Propchange: 
archiva/branches/MRM-1025/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/filter/ExcludesFilter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
archiva/branches/MRM-1025/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/filter/Filter.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/filter/Filter.java?rev=885095&view=auto
==============================================================================
--- 
archiva/branches/MRM-1025/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/filter/Filter.java
 (added)
+++ 
archiva/branches/MRM-1025/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/filter/Filter.java
 Sat Nov 28 14:28:30 2009
@@ -0,0 +1,25 @@
+package org.apache.archiva.metadata.repository.filter;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+public interface Filter<T>
+{
+    boolean accept( T value );
+}

Propchange: 
archiva/branches/MRM-1025/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/filter/Filter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
archiva/branches/MRM-1025/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/storage/StorageMetadataResolver.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/StorageMetadataResolver.java?rev=885095&view=auto
==============================================================================
--- 
archiva/branches/MRM-1025/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/storage/StorageMetadataResolver.java
 (added)
+++ 
archiva/branches/MRM-1025/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/storage/StorageMetadataResolver.java
 Sat Nov 28 14:28:30 2009
@@ -0,0 +1,37 @@
+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
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+public interface StorageMetadataResolver
+    extends MetadataResolver
+{
+    Collection<String> getRootNamespaces( String repoId, Filter<String> filter 
);
+
+    Collection<String> getNamespaces( String repoId, String namespace, 
Filter<String> filter );
+
+    Collection<String> getProjects( String repoId, String namespace, 
Filter<String> filter );
+
+    Collection<String> getProjectVersions( String repoId, String namespace, 
String projectId, Filter<String> filter );    
+}

Propchange: 
archiva/branches/MRM-1025/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/storage/StorageMetadataResolver.java
------------------------------------------------------------------------------
    svn:eol-style = native

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=885095&r1=885094&r2=885095&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 14:28:30 2009
@@ -30,9 +30,11 @@
 import org.apache.archiva.metadata.model.ProjectMetadata;
 import org.apache.archiva.metadata.model.ProjectVersionMetadata;
 import org.apache.archiva.metadata.model.ProjectVersionReference;
-import org.apache.archiva.metadata.repository.MetadataResolver;
 import org.apache.archiva.metadata.repository.MetadataResolverException;
+import org.apache.archiva.metadata.repository.filter.AllFilter;
+import org.apache.archiva.metadata.repository.filter.Filter;
 import org.apache.archiva.metadata.repository.storage.RepositoryPathTranslator;
+import org.apache.archiva.metadata.repository.storage.StorageMetadataResolver;
 import org.apache.maven.archiva.common.utils.VersionUtil;
 import org.apache.maven.archiva.configuration.ArchivaConfiguration;
 import org.apache.maven.archiva.configuration.ManagedRepositoryConfiguration;
@@ -53,10 +55,10 @@
 import org.slf4j.LoggerFactory;
 
 /**
- * @plexus.component 
role="org.apache.archiva.metadata.repository.MetadataResolver" 
role-hint="maven2"
+ * @plexus.component 
role="org.apache.archiva.metadata.repository.storage.StorageMetadataResolver" 
role-hint="maven2"
  */
 public class Maven2RepositoryMetadataResolver
-    implements MetadataResolver
+    implements StorageMetadataResolver
 {
     /**
      * @plexus.requirement
@@ -77,25 +79,12 @@
 
     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;
-        }
-    };
+    private static final Filter<String> ALL = new AllFilter<String>();
 
     public ProjectMetadata getProject( String repoId, String namespace, String 
projectId )
     {
-        throw new UnsupportedOperationException();
+        // TODO: could natively implement the "shared model" concept from the 
browse action to avoid needing it there?
+        return null;
     }
 
     public ProjectVersionMetadata getProjectVersion( String repoId, String 
namespace, String projectId,
@@ -291,24 +280,30 @@
         return ci;
     }
 
-    // TODO: evidence that storage and resolver != repository API - split the 
interface up
     public Collection<String> getArtifactVersions( String repoId, String 
namespace, String projectId,
                                                    String projectVersion )
     {
+        // TODO: useful, but not implemented yet, not called from 
DefaultMetadataResolver
         throw new UnsupportedOperationException();
     }
 
     public Collection<ProjectVersionReference> getProjectReferences( String 
repoId, String namespace, String projectId,
                                                                      String 
projectVersion )
     {
+        // Can't be determined on a Maven 2 repository
         throw new UnsupportedOperationException();
     }
 
     public Collection<String> getRootNamespaces( String repoId )
     {
+        return getRootNamespaces( repoId, ALL );
+    }
+
+    public Collection<String> getRootNamespaces( String repoId, Filter<String> 
filter )
+    {
         File dir = getRepositoryBasedir( repoId );
 
-        String[] files = dir.list( DIRECTORY_FILTER );
+        String[] files = dir.list( new DirectoryFilter( filter ) );
         return files != null ? Arrays.asList( files ) : 
Collections.<String>emptyList();
     }
 
@@ -322,16 +317,21 @@
 
     public Collection<String> getNamespaces( String repoId, String namespace )
     {
+        return getNamespaces( repoId, namespace, ALL );
+    }
+
+    public Collection<String> getNamespaces( String repoId, String namespace, 
Filter<String> filter )
+    {
         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 );
+        File[] files = dir.listFiles( new DirectoryFilter( filter ) );
         if ( files != null )
         {
             for ( File file : files )
             {
-                if ( !isProject( file ) )
+                if ( !isProject( file, filter ) )
                 {
                     namespaces.add( file.getName() );
                 }
@@ -342,16 +342,21 @@
 
     public Collection<String> getProjects( String repoId, String namespace )
     {
+        return getProjects( repoId, namespace, ALL );
+    }
+
+    public Collection<String> getProjects( String repoId, String namespace, 
Filter<String> filter )
+    {
         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 );
+        File[] files = dir.listFiles( new DirectoryFilter( filter ) );
         if ( files != null )
         {
             for ( File file : files )
             {
-                if ( isProject( file ) )
+                if ( isProject( file, filter ) )
                 {
                     projects.add( file.getName() );
                 }
@@ -362,26 +367,23 @@
 
     public Collection<String> getProjectVersions( String repoId, String 
namespace, String projectId )
     {
+        return getProjectVersions( repoId, namespace, projectId, ALL );
+    }
+
+    public Collection<String> getProjectVersions( String repoId, String 
namespace, String projectId,
+                                                  Filter<String> filter )
+    {
         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 );
+        String[] files = dir.list( new DirectoryFilter( filter ) );
         return files != null ? Arrays.asList( files ) : 
Collections.<String>emptyList();
     }
 
-    private boolean isProject( File dir )
+    private boolean isProject( File dir, Filter<String> filter )
     {
-        // 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 );
+        // scan directories for a valid project version subdirectory, meaning 
this must be a project directory
+        File[] files = dir.listFiles( new DirectoryFilter( filter ) );
         if ( files != null )
         {
             for ( File file : files )
@@ -392,6 +394,14 @@
                 }
             }
         }
+
+        // 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;
+        }
+
         return false;
     }
 
@@ -400,14 +410,7 @@
         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
+        // check if there is a POM artifact file to ensure it is a version 
directory
         File[] files;
         if ( VersionUtil.isSnapshot( projectVersion ) )
         {
@@ -439,7 +442,19 @@
                 }
             } );
         }
-        return files != null && files.length > 0;
+        if ( files != null && files.length > 0 )
+        {
+            return true;
+        }
+
+        // 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;
+        }
+
+        return false;
     }
 
     private MavenRepositoryMetadata readMetadata( File directory )
@@ -459,4 +474,32 @@
         }
         return metadata;
     }
+
+    private static class DirectoryFilter
+        implements FilenameFilter
+    {
+        private final Filter<String> filter;
+
+        public DirectoryFilter( Filter<String> filter )
+        {
+            this.filter = filter;
+        }
+
+        public boolean accept( File dir, String name )
+        {
+            if ( !filter.accept( name ) )
+            {
+                return false;
+            }
+            else if ( name.startsWith( "." ) )
+            {
+                return false;
+            }
+            else if ( !new File( dir, name ).isDirectory() )
+            {
+                return false;
+            }
+            return true;
+        }
+    }
 }

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=885095&r1=885094&r2=885095&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 14:28:30 2009
@@ -28,8 +28,8 @@
 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.MetadataResolver;
 import org.apache.archiva.metadata.repository.MetadataResolverException;
+import org.apache.archiva.metadata.repository.storage.StorageMetadataResolver;
 import org.apache.maven.archiva.configuration.ArchivaConfiguration;
 import org.apache.maven.archiva.configuration.Configuration;
 import org.apache.maven.archiva.configuration.ManagedRepositoryConfiguration;
@@ -61,7 +61,7 @@
         c.addManagedRepository( testRepo );
         configuration.save( c );
 
-        resolver = (Maven2RepositoryMetadataResolver) lookup( 
MetadataResolver.class, "maven2" );
+        resolver = (Maven2RepositoryMetadataResolver) lookup( 
StorageMetadataResolver.class, "maven2" );
     }
 
     public void testGetProjectVersionMetadata()

Modified: 
archiva/branches/MRM-1025/archiva-modules/plugins/metadata-repository-file/src/main/java/org/apache/archiva/metadata/repository/file/FileMetadataRepository.java
URL: 
http://svn.apache.org/viewvc/archiva/branches/MRM-1025/archiva-modules/plugins/metadata-repository-file/src/main/java/org/apache/archiva/metadata/repository/file/FileMetadataRepository.java?rev=885095&r1=885094&r2=885095&view=diff
==============================================================================
--- 
archiva/branches/MRM-1025/archiva-modules/plugins/metadata-repository-file/src/main/java/org/apache/archiva/metadata/repository/file/FileMetadataRepository.java
 (original)
+++ 
archiva/branches/MRM-1025/archiva-modules/plugins/metadata-repository-file/src/main/java/org/apache/archiva/metadata/repository/file/FileMetadataRepository.java
 Sat Nov 28 14:28:30 2009
@@ -86,13 +86,13 @@
     private void updateProject( String repoId, String namespace, String id )
     {
         // TODO: this is a more braindead implementation than we would 
normally expect, for prototyping purposes
+        updateNamespace( repoId, namespace );
+
         try
         {
             File namespaceDirectory = new File( this.directory, repoId + "/" + 
namespace );
             Properties properties = new Properties();
             properties.setProperty( "namespace", namespace );
-            writeProperties( properties, namespaceDirectory, 
NAMESPACE_METADATA_KEY );
-
             properties.setProperty( "id", id );
             writeProperties( properties, new File( namespaceDirectory, id ), 
PROJECT_METADATA_KEY );
 
@@ -217,6 +217,23 @@
         }
     }
 
+    public void updateNamespace( String repoId, String namespace )
+    {
+        try
+        {
+            File namespaceDirectory = new File( this.directory, repoId + "/" + 
namespace );
+            Properties properties = new Properties();
+            properties.setProperty( "namespace", namespace );
+            writeProperties( properties, namespaceDirectory, 
NAMESPACE_METADATA_KEY );
+
+        }
+        catch ( IOException e )
+        {
+            // TODO!
+            e.printStackTrace();
+        }
+    }
+
     private String join( Collection<String> ids )
     {
         if ( !ids.isEmpty() )


Reply via email to