Return-Path: Delivered-To: apmail-archiva-commits-archive@www.apache.org Received: (qmail 27978 invoked from network); 28 Nov 2009 14:28:58 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.3) by minotaur.apache.org with SMTP; 28 Nov 2009 14:28:58 -0000 Received: (qmail 59253 invoked by uid 500); 28 Nov 2009 14:28:58 -0000 Delivered-To: apmail-archiva-commits-archive@archiva.apache.org Received: (qmail 59185 invoked by uid 500); 28 Nov 2009 14:28:57 -0000 Mailing-List: contact commits-help@archiva.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@archiva.apache.org Delivered-To: mailing list commits@archiva.apache.org Received: (qmail 59176 invoked by uid 99); 28 Nov 2009 14:28:57 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 28 Nov 2009 14:28:57 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 28 Nov 2009 14:28:53 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id A3DA92388962; Sat, 28 Nov 2009 14:28:31 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r885095 - in /archiva/branches/MRM-1025/archiva-modules: metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/ metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/filter/ me... Date: Sat, 28 Nov 2009 14:28:31 -0000 To: commits@archiva.apache.org From: brett@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20091128142831.A3DA92388962@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org 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 getRootNamespaces( String repoId ) { - Collection rootNamespaces = metadataRepository.getRootNamespaces( repoId ); - - // TODO: may want caching on this - Collection storageRootNamespaces = storageResolver.getRootNamespaces( repoId ); - if ( storageRootNamespaces != null && !storageRootNamespaces.equals( rootNamespaces ) ) + Collection namespaces = metadataRepository.getRootNamespaces( repoId ); + Collection storageNamespaces = + storageResolver.getRootNamespaces( repoId, new ExcludesFilter( namespaces ) ); + if ( storageNamespaces != null && !storageNamespaces.isEmpty() ) { - // TODO: update the metadata repository - rootNamespaces = storageRootNamespaces; + for ( String n : storageNamespaces ) + { + metadataRepository.updateNamespace( repoId, n ); + } + namespaces = new ArrayList( namespaces ); + namespaces.addAll( storageNamespaces ); } - - return rootNamespaces; + return namespaces; } public Collection getNamespaces( String repoId, String namespace ) { Collection namespaces = metadataRepository.getNamespaces( repoId, namespace ); - // TODO: may want caching on this - Collection storageNamespaces = storageResolver.getNamespaces( repoId, namespace ); - if ( storageNamespaces != null && !storageNamespaces.equals( namespaces ) ) + Collection storageNamespaces = + storageResolver.getNamespaces( repoId, namespace, new ExcludesFilter( 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( namespaces ); + namespaces.addAll( storageNamespaces ); } - return namespaces; } public Collection getProjects( String repoId, String namespace ) { Collection projects = metadataRepository.getProjects( repoId, namespace ); - // TODO: may want caching on this - Collection storageProjects = storageResolver.getProjects( repoId, namespace ); - if ( storageProjects != null && !storageProjects.equals( projects ) ) + Collection storageProjects = + storageResolver.getProjects( repoId, namespace, new ExcludesFilter( 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( projects ); + projects.addAll( storageProjects ); } - return projects; } public Collection getProjectVersions( String repoId, String namespace, String projectId ) + throws MetadataResolverException { Collection projectVersions = metadataRepository.getProjectVersions( repoId, namespace, projectId ); - // TODO: may want caching on this - Collection storageProjectVersions = storageResolver.getProjectVersions( repoId, namespace, projectId ); - if ( storageProjectVersions != null && !storageProjectVersions.equals( projectVersions ) ) + Collection storageProjectVersions = storageResolver.getProjectVersions( repoId, namespace, projectId, + new ExcludesFilter( + 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( 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 getProjects( String repoId, String namespace ); - Collection getProjectVersions( String repoId, String namespace, String projectId ); + Collection 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 + implements Filter +{ + 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 + implements Filter +{ + private Collection excludes; + + public ExcludesFilter( Collection 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 +{ + 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 getRootNamespaces( String repoId, Filter filter ); + + Collection getNamespaces( String repoId, String namespace, Filter filter ); + + Collection getProjects( String repoId, String namespace, Filter filter ); + + Collection getProjectVersions( String repoId, String namespace, String projectId, Filter 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 ALL = new AllFilter(); 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 getArtifactVersions( String repoId, String namespace, String projectId, String projectVersion ) { + // TODO: useful, but not implemented yet, not called from DefaultMetadataResolver throw new UnsupportedOperationException(); } public Collection getProjectReferences( String repoId, String namespace, String projectId, String projectVersion ) { + // Can't be determined on a Maven 2 repository throw new UnsupportedOperationException(); } public Collection getRootNamespaces( String repoId ) { + return getRootNamespaces( repoId, ALL ); + } + + public Collection getRootNamespaces( String repoId, Filter 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.emptyList(); } @@ -322,16 +317,21 @@ public Collection getNamespaces( String repoId, String namespace ) { + return getNamespaces( repoId, namespace, ALL ); + } + + public Collection getNamespaces( String repoId, String namespace, Filter 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 namespaces = new ArrayList(); - 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 getProjects( String repoId, String namespace ) { + return getProjects( repoId, namespace, ALL ); + } + + public Collection getProjects( String repoId, String namespace, Filter 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 projects = new ArrayList(); - 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 getProjectVersions( String repoId, String namespace, String projectId ) { + return getProjectVersions( repoId, namespace, projectId, ALL ); + } + + public Collection getProjectVersions( String repoId, String namespace, String projectId, + Filter filter ) + { File dir = pathTranslator.toFile( getRepositoryBasedir( repoId ), namespace, projectId ); // all directories in a project directory can be considered a version - Collection projectVersions = new ArrayList(); - String[] files = dir.list( DIRECTORY_FILTER ); + String[] files = dir.list( new DirectoryFilter( filter ) ); return files != null ? Arrays.asList( files ) : Collections.emptyList(); } - private boolean isProject( File dir ) + private boolean isProject( File dir, Filter 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 filter; + + public DirectoryFilter( Filter 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 ids ) { if ( !ids.isEmpty() )