- consolidate operations that checked if something was an artifact into FileTypes - add exclusions for the metadata and supporting files to consumers - add tests Merged from: r640793 git-svn-id: https://svn.apache.org/repos/asf/maven/archiva/trunk@640819 13f79535-47bb-0310-9956-ffa450edef68tags/archiva-r676265
@@ -34,8 +34,11 @@ import org.apache.maven.archiva.configuration.functors.FiletypeSelectionPredicat | |||
import org.apache.maven.archiva.configuration.io.registry.ConfigurationRegistryReader; | |||
import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; | |||
import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; | |||
import org.codehaus.plexus.registry.Registry; | |||
import org.codehaus.plexus.registry.RegistryException; | |||
import org.codehaus.plexus.registry.RegistryListener; | |||
import org.codehaus.plexus.registry.commons.CommonsConfigurationRegistry; | |||
import org.codehaus.plexus.util.SelectorUtils; | |||
import org.slf4j.Logger; | |||
import org.slf4j.LoggerFactory; | |||
@@ -48,7 +51,7 @@ import org.slf4j.LoggerFactory; | |||
* @plexus.component role="org.apache.maven.archiva.configuration.FileTypes" | |||
*/ | |||
public class FileTypes | |||
implements Initializable | |||
implements Initializable, RegistryListener | |||
{ | |||
private Logger log = LoggerFactory.getLogger(FileTypes.class); | |||
@@ -70,11 +73,18 @@ public class FileTypes | |||
*/ | |||
private Map<String, List<String>> defaultTypeMap = new HashMap<String, List<String>>(); | |||
private List<String> artifactPatterns; | |||
public void setArchivaConfiguration( ArchivaConfiguration archivaConfiguration ) | |||
{ | |||
this.archivaConfiguration = archivaConfiguration; | |||
} | |||
/** | |||
* <p> | |||
* Get the list of patterns for a specified filetype. | |||
* </p> | |||
* | |||
* | |||
* <p> | |||
* You will always get a list. In this order. | |||
* <ul> | |||
@@ -83,7 +93,7 @@ public class FileTypes | |||
* <li>A single item list of <code>"**<span>/</span>*"</code></li> | |||
* </ul> | |||
* </p> | |||
* | |||
* | |||
* @param id the id to lookup. | |||
* @return the list of patterns. | |||
*/ | |||
@@ -109,11 +119,33 @@ public class FileTypes | |||
return defaultPatterns; | |||
} | |||
public synchronized boolean matchesArtifactPattern( String relativePath ) | |||
{ | |||
// Correct the slash pattern. | |||
relativePath = relativePath.replace( '\\', '/' ); | |||
if ( artifactPatterns == null ) | |||
{ | |||
artifactPatterns = getFileTypePatterns( ARTIFACTS ); | |||
} | |||
for ( String pattern : artifactPatterns ) | |||
{ | |||
if ( SelectorUtils.matchPath( pattern, relativePath, false ) ) | |||
{ | |||
// Found match | |||
return true; | |||
} | |||
} | |||
// No match. | |||
return false; | |||
} | |||
public void initialize() | |||
throws InitializationException | |||
{ | |||
/* Initialize Default Type Map */ | |||
defaultTypeMap.clear(); | |||
// TODO: why is this done by hand? | |||
String errMsg = "Unable to load default archiva configuration for FileTypes: "; | |||
@@ -132,19 +164,7 @@ public class FileTypes | |||
ConfigurationRegistryReader configReader = new ConfigurationRegistryReader(); | |||
Configuration defaultConfig = configReader.read( commonsRegistry ); | |||
// Store the default file type declaration. | |||
List<FileType> filetypes = defaultConfig.getRepositoryScanning().getFileTypes(); | |||
for ( FileType filetype : filetypes ) | |||
{ | |||
List<String> patterns = defaultTypeMap.get( filetype.getId() ); | |||
if ( patterns == null ) | |||
{ | |||
patterns = new ArrayList<String>(); | |||
} | |||
patterns.addAll( filetype.getPatterns() ); | |||
defaultTypeMap.put( filetype.getId(), patterns ); | |||
} | |||
initialiseTypeMap( defaultConfig ); | |||
} | |||
catch ( RegistryException e ) | |||
{ | |||
@@ -166,5 +186,41 @@ public class FileTypes | |||
{ | |||
throw new InitializationException( errMsg + e.getMessage(), e ); | |||
} | |||
this.archivaConfiguration.addChangeListener( this ); | |||
} | |||
private void initialiseTypeMap( Configuration configuration ) | |||
{ | |||
defaultTypeMap.clear(); | |||
// Store the default file type declaration. | |||
List<FileType> filetypes = configuration.getRepositoryScanning().getFileTypes(); | |||
for ( FileType filetype : filetypes ) | |||
{ | |||
List<String> patterns = defaultTypeMap.get( filetype.getId() ); | |||
if ( patterns == null ) | |||
{ | |||
patterns = new ArrayList<String>(); | |||
} | |||
patterns.addAll( filetype.getPatterns() ); | |||
defaultTypeMap.put( filetype.getId(), patterns ); | |||
} | |||
} | |||
public void afterConfigurationChange( Registry registry, String propertyName, Object propertyValue ) | |||
{ | |||
if ( propertyName.contains( "fileType" ) ) | |||
{ | |||
artifactPatterns = null; | |||
initialiseTypeMap( archivaConfiguration.getConfiguration() ); | |||
} | |||
} | |||
public void beforeConfigurationChange( Registry registry, String propertyName, Object propertyValue ) | |||
{ | |||
/* nothing to do */ | |||
} | |||
} |
@@ -0,0 +1,55 @@ | |||
package org.apache.maven.archiva.configuration; | |||
/* | |||
* 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 org.codehaus.plexus.spring.PlexusInSpringTestCase; | |||
public class FileTypesTest | |||
extends PlexusInSpringTestCase | |||
{ | |||
private FileTypes filetypes; | |||
protected void setUp() | |||
throws Exception | |||
{ | |||
super.setUp(); | |||
filetypes = (FileTypes) lookup( FileTypes.class ); | |||
} | |||
public void testIsArtifact() | |||
{ | |||
assertTrue( filetypes.matchesArtifactPattern( "test.maven-arch/poms/test-arch-2.0.3-SNAPSHOT.pom" ) ); | |||
assertTrue( filetypes.matchesArtifactPattern( | |||
"test/maven-arch/test-arch/2.0.3-SNAPSHOT/test-arch-2.0.3-SNAPSHOT.jar" ) ); | |||
assertTrue( filetypes.matchesArtifactPattern( "org/apache/derby/derby/10.2.2.0/derby-10.2.2.0-bin.tar.gz" ) ); | |||
assertFalse( | |||
filetypes.matchesArtifactPattern( "org/apache/derby/derby/10.2.2.0/derby-10.2.2.0-bin.tar.gz.sha1" ) ); | |||
assertFalse( | |||
filetypes.matchesArtifactPattern( "org/apache/derby/derby/10.2.2.0/derby-10.2.2.0-bin.tar.gz.md5" ) ); | |||
assertFalse( | |||
filetypes.matchesArtifactPattern( "org/apache/derby/derby/10.2.2.0/derby-10.2.2.0-bin.tar.gz.asc" ) ); | |||
assertFalse( | |||
filetypes.matchesArtifactPattern( "org/apache/derby/derby/10.2.2.0/derby-10.2.2.0-bin.tar.gz.pgp" ) ); | |||
assertFalse( filetypes.matchesArtifactPattern( "org/apache/derby/derby/10.2.2.0/maven-metadata.xml" ) ); | |||
assertFalse( filetypes.matchesArtifactPattern( "org/apache/derby/derby/maven-metadata.xml" ) ); | |||
} | |||
} |
@@ -19,8 +19,10 @@ package org.apache.maven.archiva.consumers; | |||
* under the License. | |||
*/ | |||
import java.util.Arrays; | |||
import java.util.HashSet; | |||
import java.util.Iterator; | |||
import java.util.List; | |||
import java.util.Set; | |||
/** | |||
@@ -34,6 +36,15 @@ public abstract class AbstractMonitoredConsumer | |||
{ | |||
private Set<ConsumerMonitor> monitors = new HashSet<ConsumerMonitor>(); | |||
/** | |||
* Default exclusions from artifact consumers that are using the file types. Note that this is simplistic in the | |||
* case of the support files (based on extension) as it is elsewhere - it may be better to match these to actual | |||
* artifacts and exclude later during scanning. | |||
*/ | |||
private static final List<String> DEFAULT_EXCLUSIONS = Arrays.asList( "**/maven-metadata.xml", | |||
"**/maven-metadata-*.xml", "**/*.sha1", | |||
"**/*.asc", "**/*.md5", "**/*.pgp" ); | |||
public void addConsumerMonitor( ConsumerMonitor monitor ) | |||
{ | |||
monitors.add( monitor ); | |||
@@ -96,4 +107,9 @@ public abstract class AbstractMonitoredConsumer | |||
{ | |||
return false; | |||
} | |||
protected List<String> getDefaultArtifactExclusions() | |||
{ | |||
return DEFAULT_EXCLUSIONS; | |||
} | |||
} |
@@ -126,7 +126,7 @@ public class ArtifactMissingChecksumsConsumer | |||
public List<String> getExcludes() | |||
{ | |||
return null; | |||
return getDefaultArtifactExclusions(); | |||
} | |||
public List<String> getIncludes() |
@@ -149,7 +149,7 @@ public class MetadataUpdaterConsumer | |||
public List<String> getExcludes() | |||
{ | |||
return null; | |||
return getDefaultArtifactExclusions(); | |||
} | |||
public List<String> getIncludes() |
@@ -125,7 +125,7 @@ public class RepositoryPurgeConsumer | |||
public List<String> getExcludes() | |||
{ | |||
return null; | |||
return getDefaultArtifactExclusions(); | |||
} | |||
public List<String> getIncludes() |
@@ -0,0 +1,76 @@ | |||
package org.apache.maven.archiva.consumers.core; | |||
/* | |||
* 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 org.apache.maven.archiva.common.utils.BaseFile; | |||
import org.apache.maven.archiva.configuration.ArchivaConfiguration; | |||
import org.apache.maven.archiva.configuration.FileType; | |||
import org.apache.maven.archiva.configuration.FileTypes; | |||
import org.apache.maven.archiva.consumers.KnownRepositoryContentConsumer; | |||
import org.apache.maven.archiva.repository.scanner.functors.ConsumerWantsFilePredicate; | |||
import org.codehaus.plexus.spring.PlexusInSpringTestCase; | |||
import java.io.File; | |||
public abstract class AbstractArtifactConsumerTest | |||
extends PlexusInSpringTestCase | |||
{ | |||
private File repoLocation; | |||
protected KnownRepositoryContentConsumer consumer; | |||
protected void setUp() | |||
throws Exception | |||
{ | |||
super.setUp(); | |||
ArchivaConfiguration archivaConfiguration = (ArchivaConfiguration) lookup( ArchivaConfiguration.ROLE ); | |||
FileType fileType = | |||
(FileType) archivaConfiguration.getConfiguration().getRepositoryScanning().getFileTypes().get( 0 ); | |||
assertEquals( FileTypes.ARTIFACTS, fileType.getId() ); | |||
fileType.addPattern( "**/*.xml" ); | |||
repoLocation = getTestFile( "target/test-" + getName() + "/test-repo" ); | |||
} | |||
public void testConsumption() | |||
{ | |||
File localFile = | |||
new File( repoLocation, "org/apache/maven/plugins/maven-plugin-plugin/2.4.1/maven-metadata.xml" ); | |||
ConsumerWantsFilePredicate predicate = new ConsumerWantsFilePredicate(); | |||
BaseFile baseFile = new BaseFile( repoLocation, localFile ); | |||
predicate.setBasefile( baseFile ); | |||
assertFalse( predicate.evaluate( consumer ) ); | |||
} | |||
public void testConsumptionOfOtherMetadata() | |||
{ | |||
File localFile = | |||
new File( repoLocation, "org/apache/maven/plugins/maven-plugin-plugin/2.4.1/maven-metadata-central.xml" ); | |||
ConsumerWantsFilePredicate predicate = new ConsumerWantsFilePredicate(); | |||
BaseFile baseFile = new BaseFile( repoLocation, localFile ); | |||
predicate.setBasefile( baseFile ); | |||
assertFalse( predicate.evaluate( consumer ) ); | |||
} | |||
} |
@@ -0,0 +1,35 @@ | |||
package org.apache.maven.archiva.consumers.core; | |||
/* | |||
* 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 org.apache.maven.archiva.consumers.KnownRepositoryContentConsumer; | |||
public class ArtifactMissingChecksumsConsumerTest | |||
extends AbstractArtifactConsumerTest | |||
{ | |||
protected void setUp() | |||
throws Exception | |||
{ | |||
super.setUp(); | |||
consumer = (ArtifactMissingChecksumsConsumer) lookup( KnownRepositoryContentConsumer.class.getName(), | |||
"create-missing-checksums" ); | |||
} | |||
} |
@@ -0,0 +1,35 @@ | |||
package org.apache.maven.archiva.consumers.core; | |||
/* | |||
* 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 org.apache.maven.archiva.consumers.KnownRepositoryContentConsumer; | |||
public class MetadataUpdateConsumerTest | |||
extends AbstractArtifactConsumerTest | |||
{ | |||
protected void setUp() | |||
throws Exception | |||
{ | |||
super.setUp(); | |||
consumer = (KnownRepositoryContentConsumer) lookup( KnownRepositoryContentConsumer.class.getName(), | |||
"metadata-updater" ); | |||
} | |||
} |
@@ -19,6 +19,10 @@ package org.apache.maven.archiva.consumers.core.repository; | |||
* under the License. | |||
*/ | |||
import org.apache.commons.lang.time.DateUtils; | |||
import org.apache.maven.archiva.consumers.core.repository.stubs.LuceneRepositoryContentIndexStub; | |||
import org.apache.maven.archiva.indexer.RepositoryContentIndex; | |||
import java.io.File; | |||
import java.io.IOException; | |||
import java.util.ArrayList; | |||
@@ -27,10 +31,6 @@ import java.util.HashMap; | |||
import java.util.List; | |||
import java.util.Map; | |||
import org.apache.commons.lang.time.DateUtils; | |||
import org.apache.maven.archiva.consumers.core.repository.stubs.LuceneRepositoryContentIndexStub; | |||
import org.apache.maven.archiva.indexer.RepositoryContentIndex; | |||
/** | |||
* @author <a href="mailto:oching@apache.org">Maria Odea Ching</a> | |||
*/ | |||
@@ -270,5 +270,5 @@ public class DaysOldRepositoryPurgeTest | |||
versions.add( "2.2-SNAPSHOT" ); | |||
populateDb( "org.apache.maven.plugins", "maven-install-plugin", versions ); | |||
} | |||
} | |||
} |
@@ -20,12 +20,16 @@ package org.apache.maven.archiva.consumers.core.repository; | |||
*/ | |||
import org.apache.commons.io.FileUtils; | |||
import org.apache.maven.archiva.common.utils.BaseFile; | |||
import org.apache.maven.archiva.configuration.ArchivaConfiguration; | |||
import org.apache.maven.archiva.configuration.Configuration; | |||
import org.apache.maven.archiva.configuration.FileType; | |||
import org.apache.maven.archiva.configuration.FileTypes; | |||
import org.apache.maven.archiva.configuration.ManagedRepositoryConfiguration; | |||
import org.apache.maven.archiva.consumers.KnownRepositoryContentConsumer; | |||
import org.apache.maven.archiva.consumers.core.repository.stubs.LuceneRepositoryContentIndexFactoryStub; | |||
import org.apache.maven.archiva.database.ArchivaDatabaseException; | |||
import org.apache.maven.archiva.repository.scanner.functors.ConsumerWantsFilePredicate; | |||
import org.custommonkey.xmlunit.XMLAssert; | |||
import java.io.File; | |||
@@ -38,6 +42,46 @@ import java.util.List; | |||
public class RepositoryPurgeConsumerTest | |||
extends AbstractRepositoryPurgeTest | |||
{ | |||
public void testConsumption() | |||
throws Exception | |||
{ | |||
assertNotConsumed( "org/apache/maven/plugins/maven-plugin-plugin/2.4.1/maven-metadata.xml" ); | |||
} | |||
public void testConsumptionOfOtherMetadata() | |||
throws Exception | |||
{ | |||
assertNotConsumed( "org/apache/maven/plugins/maven-plugin-plugin/2.4.1/maven-metadata-central.xml" ); | |||
} | |||
private void assertNotConsumed( String path ) | |||
throws Exception | |||
{ | |||
ArchivaConfiguration archivaConfiguration = (ArchivaConfiguration) lookup( ArchivaConfiguration.ROLE ); | |||
FileType fileType = | |||
(FileType) archivaConfiguration.getConfiguration().getRepositoryScanning().getFileTypes().get( 0 ); | |||
assertEquals( FileTypes.ARTIFACTS, fileType.getId() ); | |||
fileType.addPattern( "**/*.xml" ); | |||
// trigger reload | |||
FileTypes fileTypes = (FileTypes) lookup( FileTypes.class ); | |||
fileTypes.afterConfigurationChange( null, "repositoryScanning.fileTypes", null ); | |||
KnownRepositoryContentConsumer repoPurgeConsumer = | |||
(KnownRepositoryContentConsumer) lookup( KnownRepositoryContentConsumer.class, "repository-purge" ); | |||
File repoLocation = getTestFile( "target/test-" + getName() + "/test-repo" ); | |||
File localFile = | |||
new File( repoLocation, path ); | |||
ConsumerWantsFilePredicate predicate = new ConsumerWantsFilePredicate(); | |||
BaseFile baseFile = new BaseFile( repoLocation, localFile ); | |||
predicate.setBasefile( baseFile ); | |||
assertFalse( predicate.evaluate( repoPurgeConsumer ) ); | |||
} | |||
private void setLastModified( String path ) | |||
{ | |||
File dir = new File( path ); | |||
@@ -168,7 +212,7 @@ public class RepositoryPurgeConsumerTest | |||
/** | |||
* Test the snapshot clean consumer on a repository set to NOT clean/delete snapshots based on released versions. | |||
* | |||
* | |||
* @throws Exception | |||
*/ | |||
public void testReleasedSnapshotsWereNotCleaned() |
@@ -44,6 +44,7 @@ | |||
</requirement> | |||
<requirement> | |||
<role>org.apache.maven.archiva.configuration.FileTypes</role> | |||
<role-hint>retention-count</role-hint> | |||
</requirement> | |||
<requirement> | |||
<role>org.apache.maven.archiva.indexer.RepositoryContentIndexFactory</role> | |||
@@ -101,6 +102,7 @@ | |||
</component> | |||
<component> | |||
<role>org.apache.maven.archiva.configuration.FileTypes</role> | |||
<role-hint>retention-count</role-hint> | |||
<implementation>org.apache.maven.archiva.configuration.FileTypes</implementation> | |||
<requirements> | |||
<requirement> | |||
@@ -134,6 +136,7 @@ | |||
</requirement> | |||
<requirement> | |||
<role>org.apache.maven.archiva.configuration.FileTypes</role> | |||
<role-hint>days-old</role-hint> | |||
</requirement> | |||
<requirement> | |||
<role>org.apache.maven.archiva.indexer.RepositoryContentIndexFactory</role> | |||
@@ -191,6 +194,7 @@ | |||
</component> | |||
<component> | |||
<role>org.apache.maven.archiva.configuration.FileTypes</role> | |||
<role-hint>days-old</role-hint> | |||
<implementation>org.apache.maven.archiva.configuration.FileTypes</implementation> | |||
<requirements> | |||
<requirement> |
@@ -53,5 +53,10 @@ | |||
<groupId>org.codehaus.plexus</groupId> | |||
<artifactId>plexus-digest</artifactId> | |||
</dependency> | |||
<dependency> | |||
<groupId>hsqldb</groupId> | |||
<artifactId>hsqldb</artifactId> | |||
<scope>test</scope> | |||
</dependency> | |||
</dependencies> | |||
</project> |
@@ -128,7 +128,7 @@ public class ArtifactUpdateDatabaseConsumer | |||
public List<String> getExcludes() | |||
{ | |||
return null; | |||
return getDefaultArtifactExclusions(); | |||
} | |||
public List<String> getIncludes() |
@@ -0,0 +1,79 @@ | |||
package org.apache.maven.archiva.consumers.database; | |||
/* | |||
* 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 org.apache.maven.archiva.common.utils.BaseFile; | |||
import org.apache.maven.archiva.configuration.ArchivaConfiguration; | |||
import org.apache.maven.archiva.configuration.FileType; | |||
import org.apache.maven.archiva.configuration.FileTypes; | |||
import org.apache.maven.archiva.consumers.KnownRepositoryContentConsumer; | |||
import org.apache.maven.archiva.repository.scanner.functors.ConsumerWantsFilePredicate; | |||
import org.codehaus.plexus.spring.PlexusInSpringTestCase; | |||
import java.io.File; | |||
public class ArtifactUpdateDatabaseConsumerTest | |||
extends PlexusInSpringTestCase | |||
{ | |||
private File repoLocation; | |||
protected KnownRepositoryContentConsumer consumer; | |||
protected void setUp() | |||
throws Exception | |||
{ | |||
super.setUp(); | |||
ArchivaConfiguration archivaConfiguration = (ArchivaConfiguration) lookup( ArchivaConfiguration.ROLE ); | |||
FileType fileType = | |||
(FileType) archivaConfiguration.getConfiguration().getRepositoryScanning().getFileTypes().get( 0 ); | |||
assertEquals( FileTypes.ARTIFACTS, fileType.getId() ); | |||
fileType.addPattern( "**/*.xml" ); | |||
repoLocation = getTestFile( "target/test-" + getName() + "/test-repo" ); | |||
consumer = | |||
(KnownRepositoryContentConsumer) lookup( KnownRepositoryContentConsumer.class, "update-db-artifact" ); | |||
} | |||
public void testConsumption() | |||
{ | |||
File localFile = | |||
new File( repoLocation, "org/apache/maven/plugins/maven-plugin-plugin/2.4.1/maven-metadata.xml" ); | |||
ConsumerWantsFilePredicate predicate = new ConsumerWantsFilePredicate(); | |||
BaseFile baseFile = new BaseFile( repoLocation, localFile ); | |||
predicate.setBasefile( baseFile ); | |||
assertFalse( predicate.evaluate( consumer ) ); | |||
} | |||
public void testConsumptionOfOtherMetadata() | |||
{ | |||
File localFile = | |||
new File( repoLocation, "org/apache/maven/plugins/maven-plugin-plugin/2.4.1/maven-metadata-central.xml" ); | |||
ConsumerWantsFilePredicate predicate = new ConsumerWantsFilePredicate(); | |||
BaseFile baseFile = new BaseFile( repoLocation, localFile ); | |||
predicate.setBasefile( baseFile ); | |||
assertFalse( predicate.evaluate( consumer ) ); | |||
} | |||
} |
@@ -0,0 +1,56 @@ | |||
<?xml version="1.0" encoding="ISO-8859-1"?> | |||
<!-- | |||
~ 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. | |||
--> | |||
<component-set> | |||
<components> | |||
<!-- JdoAccess --> | |||
<component> | |||
<role>org.apache.maven.archiva.database.jdo.JdoAccess</role> | |||
<role-hint>archiva</role-hint> | |||
<implementation>org.apache.maven.archiva.database.jdo.JdoAccess</implementation> | |||
<requirements> | |||
<requirement> | |||
<role>org.codehaus.plexus.jdo.JdoFactory</role> | |||
<role-hint>archiva</role-hint> | |||
</requirement> | |||
</requirements> | |||
</component> | |||
<!-- JDO Factory --> | |||
<component> | |||
<role>org.codehaus.plexus.jdo.JdoFactory</role> | |||
<role-hint>archiva</role-hint> | |||
<implementation>org.codehaus.plexus.jdo.DefaultConfigurableJdoFactory</implementation> | |||
<configuration> | |||
<persistenceManagerFactoryClass>org.jpox.PersistenceManagerFactoryImpl</persistenceManagerFactoryClass> | |||
<driverName>org.hsqldb.jdbcDriver</driverName> | |||
<userName>sa</userName> | |||
<password></password> | |||
<url>jdbc:hsqldb:mem:testdb</url> | |||
<otherProperties> | |||
<property> | |||
<name>javax.jdo.PersistenceManagerFactoryClass</name> | |||
<value>org.jpox.PersistenceManagerFactoryImpl</value> | |||
</property> | |||
</otherProperties> | |||
</configuration> | |||
</component> | |||
</components> | |||
</component-set> |
@@ -30,16 +30,10 @@ import org.apache.maven.archiva.model.VersionedReference; | |||
import org.apache.maven.archiva.repository.ContentNotFoundException; | |||
import org.apache.maven.archiva.repository.ManagedRepositoryContent; | |||
import org.apache.maven.archiva.repository.layout.LayoutException; | |||
import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; | |||
import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; | |||
import org.codehaus.plexus.util.SelectorUtils; | |||
import java.io.File; | |||
import java.io.IOException; | |||
import java.util.ArrayList; | |||
import java.util.HashSet; | |||
import java.util.Iterator; | |||
import java.util.List; | |||
import java.util.Set; | |||
/** | |||
@@ -55,7 +49,7 @@ import java.util.Set; | |||
*/ | |||
public class ManagedDefaultRepositoryContent | |||
extends AbstractDefaultRepositoryContent | |||
implements ManagedRepositoryContent, Initializable | |||
implements ManagedRepositoryContent | |||
{ | |||
/** | |||
* @plexus.requirement | |||
@@ -64,8 +58,6 @@ public class ManagedDefaultRepositoryContent | |||
private ManagedRepositoryConfiguration repository; | |||
private List<String> artifactPatterns; | |||
public void deleteVersion( VersionedReference reference ) | |||
throws ContentNotFoundException | |||
{ | |||
@@ -123,7 +115,7 @@ public class ManagedDefaultRepositoryContent | |||
String relativePath = PathUtil.getRelative( repository.getLocation(), repoFiles[i] ); | |||
if ( matchesArtifactPattern( relativePath ) ) | |||
if ( filetypes.matchesArtifactPattern( relativePath ) ) | |||
{ | |||
ArtifactReference artifact = toArtifactReference( relativePath ); | |||
@@ -250,7 +242,7 @@ public class ManagedDefaultRepositoryContent | |||
String relativePath = PathUtil.getRelative( repository.getLocation(), repoFiles[i] ); | |||
if ( matchesArtifactPattern( relativePath ) ) | |||
if ( filetypes.matchesArtifactPattern( relativePath ) ) | |||
{ | |||
ArtifactReference artifact = toArtifactReference( relativePath ); | |||
@@ -300,13 +292,6 @@ public class ManagedDefaultRepositoryContent | |||
} | |||
} | |||
public void initialize() | |||
throws InitializationException | |||
{ | |||
this.artifactPatterns = new ArrayList<String>(); | |||
initVariables(); | |||
} | |||
public void setRepository( ManagedRepositoryConfiguration repository ) | |||
{ | |||
this.repository = repository; | |||
@@ -386,7 +371,7 @@ public class ManagedDefaultRepositoryContent | |||
String relativePath = PathUtil.getRelative( repository.getLocation(), repoFiles[i] ); | |||
if ( matchesArtifactPattern( relativePath ) ) | |||
if ( filetypes.matchesArtifactPattern( relativePath ) ) | |||
{ | |||
ArtifactReference artifact = toArtifactReference( relativePath ); | |||
@@ -410,35 +395,4 @@ public class ManagedDefaultRepositoryContent | |||
return false; | |||
} | |||
} | |||
private void initVariables() | |||
{ | |||
synchronized ( this.artifactPatterns ) | |||
{ | |||
this.artifactPatterns.clear(); | |||
this.artifactPatterns.addAll( filetypes.getFileTypePatterns( FileTypes.ARTIFACTS ) ); | |||
} | |||
} | |||
private boolean matchesArtifactPattern( String relativePath ) | |||
{ | |||
// Correct the slash pattern. | |||
relativePath = relativePath.replace( '\\', '/' ); | |||
Iterator<String> it = this.artifactPatterns.iterator(); | |||
while ( it.hasNext() ) | |||
{ | |||
String pattern = it.next(); | |||
if ( SelectorUtils.matchPath( pattern, relativePath, false ) ) | |||
{ | |||
// Found match | |||
return true; | |||
} | |||
} | |||
// No match. | |||
return false; | |||
} | |||
} |
@@ -31,15 +31,9 @@ import org.apache.maven.archiva.model.VersionedReference; | |||
import org.apache.maven.archiva.repository.ContentNotFoundException; | |||
import org.apache.maven.archiva.repository.ManagedRepositoryContent; | |||
import org.apache.maven.archiva.repository.layout.LayoutException; | |||
import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; | |||
import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; | |||
import org.codehaus.plexus.util.SelectorUtils; | |||
import java.io.File; | |||
import java.util.ArrayList; | |||
import java.util.HashSet; | |||
import java.util.Iterator; | |||
import java.util.List; | |||
import java.util.Set; | |||
/** | |||
@@ -55,7 +49,7 @@ import java.util.Set; | |||
*/ | |||
public class ManagedLegacyRepositoryContent | |||
extends AbstractLegacyRepositoryContent | |||
implements ManagedRepositoryContent, Initializable | |||
implements ManagedRepositoryContent | |||
{ | |||
/** | |||
* @plexus.requirement | |||
@@ -64,8 +58,6 @@ public class ManagedLegacyRepositoryContent | |||
private ManagedRepositoryConfiguration repository; | |||
private List<String> artifactPatterns; | |||
public void deleteVersion( VersionedReference reference ) | |||
throws ContentNotFoundException | |||
{ | |||
@@ -115,7 +107,7 @@ public class ManagedLegacyRepositoryContent | |||
String relativePath = PathUtil.getRelative( repository.getLocation(), repoFile ); | |||
if ( matchesArtifactPattern( relativePath ) ) | |||
if ( filetypes.matchesArtifactPattern( relativePath ) ) | |||
{ | |||
try | |||
{ | |||
@@ -321,13 +313,6 @@ public class ManagedLegacyRepositoryContent | |||
} | |||
} | |||
public void initialize() | |||
throws InitializationException | |||
{ | |||
this.artifactPatterns = new ArrayList<String>(); | |||
initVariables(); | |||
} | |||
public void setRepository( ManagedRepositoryConfiguration repository ) | |||
{ | |||
this.repository = repository; | |||
@@ -386,7 +371,7 @@ public class ManagedLegacyRepositoryContent | |||
String relativePath = PathUtil.getRelative( repository.getLocation(), repoFile ); | |||
if ( matchesArtifactPattern( relativePath ) ) | |||
if ( filetypes.matchesArtifactPattern( relativePath ) ) | |||
{ | |||
try | |||
{ | |||
@@ -417,7 +402,7 @@ public class ManagedLegacyRepositoryContent | |||
String relativePath = PathUtil.getRelative( repository.getLocation(), repoFiles[i] ); | |||
if ( matchesArtifactPattern( relativePath ) ) | |||
if ( filetypes.matchesArtifactPattern( relativePath ) ) | |||
{ | |||
try | |||
{ | |||
@@ -449,7 +434,7 @@ public class ManagedLegacyRepositoryContent | |||
String relativePath = PathUtil.getRelative( repository.getLocation(), repoFiles[i] ); | |||
if ( matchesArtifactPattern( relativePath ) ) | |||
if ( filetypes.matchesArtifactPattern( relativePath ) ) | |||
{ | |||
try | |||
{ | |||
@@ -467,35 +452,4 @@ public class ManagedLegacyRepositoryContent | |||
} | |||
} | |||
} | |||
private void initVariables() | |||
{ | |||
synchronized ( this.artifactPatterns ) | |||
{ | |||
this.artifactPatterns.clear(); | |||
this.artifactPatterns.addAll( filetypes.getFileTypePatterns( FileTypes.ARTIFACTS ) ); | |||
} | |||
} | |||
private boolean matchesArtifactPattern( String relativePath ) | |||
{ | |||
// Correct the slash pattern. | |||
relativePath = relativePath.replace( '\\', '/' ); | |||
Iterator<String> it = this.artifactPatterns.iterator(); | |||
while ( it.hasNext() ) | |||
{ | |||
String pattern = it.next(); | |||
if ( SelectorUtils.matchPath( pattern, relativePath, false ) ) | |||
{ | |||
// Found match | |||
return true; | |||
} | |||
} | |||
// No match. | |||
return false; | |||
} | |||
} |
@@ -26,15 +26,6 @@ import org.apache.maven.archiva.model.ArtifactReference; | |||
import org.apache.maven.archiva.repository.ManagedRepositoryContent; | |||
import org.apache.maven.archiva.repository.layout.LayoutException; | |||
import org.apache.maven.archiva.repository.metadata.MetadataTools; | |||
import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; | |||
import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; | |||
import org.codehaus.plexus.registry.Registry; | |||
import org.codehaus.plexus.registry.RegistryListener; | |||
import org.codehaus.plexus.util.SelectorUtils; | |||
import java.util.ArrayList; | |||
import java.util.Iterator; | |||
import java.util.List; | |||
/** | |||
* RepositoryRequest is used to determine the type of request that is incoming, and convert it to an appropriate | |||
@@ -47,7 +38,6 @@ import java.util.List; | |||
* role="org.apache.maven.archiva.repository.content.RepositoryRequest" | |||
*/ | |||
public class RepositoryRequest | |||
implements RegistryListener, Initializable | |||
{ | |||
/** | |||
* @plexus.requirement | |||
@@ -69,35 +59,6 @@ public class RepositoryRequest | |||
*/ | |||
private PathParser legacyPathParser; | |||
private List<String> artifactPatterns; | |||
/** | |||
* Test path to see if it is an artifact being requested (or not). | |||
* | |||
* @param requestedPath the path to test. | |||
* @return true if it is an artifact being requested. | |||
*/ | |||
public boolean isArtifact( String requestedPath ) | |||
{ | |||
// Correct the slash pattern. | |||
String relativePath = requestedPath.replace( '\\', '/' ); | |||
Iterator<String> it = this.artifactPatterns.iterator(); | |||
while ( it.hasNext() ) | |||
{ | |||
String pattern = it.next(); | |||
if ( SelectorUtils.matchPath( pattern, relativePath, false ) ) | |||
{ | |||
// Found match | |||
return true; | |||
} | |||
} | |||
// No match. | |||
return false; | |||
} | |||
/** | |||
* Takes an incoming requested path (in "/" format) and gleans the layout | |||
* and ArtifactReference appropriate for that content. | |||
@@ -282,35 +243,4 @@ public class RepositoryRequest | |||
String adjustedPath = repository.toPath( ref ); | |||
return adjustedPath + supportfile; | |||
} | |||
public void initialize() | |||
throws InitializationException | |||
{ | |||
this.artifactPatterns = new ArrayList<String>(); | |||
initVariables(); | |||
this.archivaConfiguration.addChangeListener( this ); | |||
} | |||
private void initVariables() | |||
{ | |||
synchronized ( this.artifactPatterns ) | |||
{ | |||
this.artifactPatterns.clear(); | |||
this.artifactPatterns.addAll( filetypes.getFileTypePatterns( FileTypes.ARTIFACTS ) ); | |||
} | |||
} | |||
public void afterConfigurationChange( Registry registry, String propertyName, Object propertyValue ) | |||
{ | |||
if ( propertyName.contains( "fileType" ) ) | |||
{ | |||
initVariables(); | |||
} | |||
} | |||
public void beforeConfigurationChange( Registry registry, String propertyName, Object propertyValue ) | |||
{ | |||
/* nothing to do */ | |||
} | |||
} |
@@ -45,7 +45,6 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; | |||
import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; | |||
import org.codehaus.plexus.registry.Registry; | |||
import org.codehaus.plexus.registry.RegistryListener; | |||
import org.codehaus.plexus.util.SelectorUtils; | |||
import org.slf4j.Logger; | |||
import org.slf4j.LoggerFactory; | |||
@@ -799,7 +798,7 @@ public class MetadataTools | |||
String relativePath = PathUtil.getRelative( managedRepository.getRepoRoot(), repoFiles[i] ); | |||
if ( matchesArtifactPattern( relativePath ) ) | |||
if ( filetypes.matchesArtifactPattern( relativePath ) ) | |||
{ | |||
ArtifactReference artifact = managedRepository.toArtifactReference( relativePath ); | |||
@@ -810,25 +809,4 @@ public class MetadataTools | |||
// No artifact was found. | |||
return null; | |||
} | |||
private boolean matchesArtifactPattern( String relativePath ) | |||
{ | |||
// Correct the slash pattern. | |||
relativePath = relativePath.replace( '\\', '/' ); | |||
Iterator<String> it = this.artifactPatterns.iterator(); | |||
while ( it.hasNext() ) | |||
{ | |||
String pattern = it.next(); | |||
if ( SelectorUtils.matchPath( pattern, relativePath, false ) ) | |||
{ | |||
// Found match | |||
return true; | |||
} | |||
} | |||
// No match. | |||
return false; | |||
} | |||
} |
@@ -209,20 +209,6 @@ public class RepositoryRequestTest | |||
"org.apache.archiva.test", "redonkulous", "3.1-beta-1-20050831.101112-42", null, "jar" ); | |||
} | |||
public void testIsArtifact() | |||
{ | |||
assertTrue( repoRequest.isArtifact( "test.maven-arch/poms/test-arch-2.0.3-SNAPSHOT.pom" ) ); | |||
assertTrue( repoRequest.isArtifact( "test/maven-arch/test-arch/2.0.3-SNAPSHOT/test-arch-2.0.3-SNAPSHOT.jar" ) ); | |||
assertTrue( repoRequest.isArtifact( "org/apache/derby/derby/10.2.2.0/derby-10.2.2.0-bin.tar.gz" ) ); | |||
assertFalse( repoRequest.isArtifact( "org/apache/derby/derby/10.2.2.0/derby-10.2.2.0-bin.tar.gz.sha1" ) ); | |||
assertFalse( repoRequest.isArtifact( "org/apache/derby/derby/10.2.2.0/derby-10.2.2.0-bin.tar.gz.md5" ) ); | |||
assertFalse( repoRequest.isArtifact( "org/apache/derby/derby/10.2.2.0/derby-10.2.2.0-bin.tar.gz.asc" ) ); | |||
assertFalse( repoRequest.isArtifact( "org/apache/derby/derby/10.2.2.0/derby-10.2.2.0-bin.tar.gz.pgp" ) ); | |||
assertFalse( repoRequest.isArtifact( "org/apache/derby/derby/10.2.2.0/maven-metadata.xml" ) ); | |||
assertFalse( repoRequest.isArtifact( "org/apache/derby/derby/maven-metadata.xml" ) ); | |||
} | |||
public void testIsSupportFile() | |||
{ | |||
assertTrue( repoRequest.isSupportFile( "org/apache/derby/derby/10.2.2.0/derby-10.2.2.0-bin.tar.gz.sha1" ) ); |
@@ -52,6 +52,7 @@ public class ArtifactCountConsumer | |||
public ArtifactCountConsumer() | |||
{ | |||
// TODO: shouldn't this use filetypes? | |||
includes = new ArrayList(); | |||
includes.add( "**/*.pom" ); | |||
includes.add( "**/*.jar" ); |
@@ -90,6 +90,7 @@ public class DuplicateArtifactsConsumer | |||
*/ | |||
private RepositoryContentFactory repositoryFactory; | |||
// TODO: why is this not used? If it should be, what about excludes? | |||
private List<String> includes = new ArrayList<String>(); | |||
public String getId() |
@@ -101,6 +101,7 @@ public class LocationArtifactsConsumer | |||
private Map repositoryMap = new HashMap(); | |||
// TODO: why is this not used? If it should be, what about excludes? | |||
private List<String> includes = new ArrayList<String>(); | |||
public String getId() |