From 76e034ab47da88fcecb01fdcc20c655058b965d4 Mon Sep 17 00:00:00 2001 From: "Edwin L. Punzalan" Date: Sat, 25 Feb 2006 00:17:39 +0000 Subject: [PATCH] PR: MRM-59 Made the proxy able to respond to m1 path requests git-svn-id: https://svn.apache.org/repos/asf/maven/repository-manager/trunk@380871 13f79535-47bb-0310-9956-ffa450edef68 --- .../repository/proxy/DefaultProxyManager.java | 2 +- .../repository/proxy/ProxyManagerFactory.java | 3 +- .../configuration/ProxyConfiguration.java | 32 +++- .../proxy/LegacyProxyManagerTest.java | 150 ++++++++++++++++++ .../checksumed-md5/repository/file.txt | 1 + .../checksumed-md5/repository/file.txt.md5 | 1 + .../checksumed-sha1/repository/file.txt | 1 + .../checksumed-sha1/repository/file.txt.sha1 | 1 + .../jars/commons-logging-1.0.jar | Bin 0 -> 21950 bytes .../jars/commons-logging-1.0.jar.md5 | 1 + .../poms/commons-logging-1.0.pom | 6 + .../not-standard/repository/file.txt | 1 + 12 files changed, 192 insertions(+), 7 deletions(-) create mode 100644 maven-repository-proxy/src/test/java/org/apache/maven/repository/proxy/LegacyProxyManagerTest.java create mode 100644 maven-repository-proxy/src/test/m1-remote-repo/checksumed-md5/repository/file.txt create mode 100644 maven-repository-proxy/src/test/m1-remote-repo/checksumed-md5/repository/file.txt.md5 create mode 100644 maven-repository-proxy/src/test/m1-remote-repo/checksumed-sha1/repository/file.txt create mode 100644 maven-repository-proxy/src/test/m1-remote-repo/checksumed-sha1/repository/file.txt.sha1 create mode 100644 maven-repository-proxy/src/test/m1-remote-repo/commons-logging/jars/commons-logging-1.0.jar create mode 100644 maven-repository-proxy/src/test/m1-remote-repo/commons-logging/jars/commons-logging-1.0.jar.md5 create mode 100644 maven-repository-proxy/src/test/m1-remote-repo/commons-logging/poms/commons-logging-1.0.pom create mode 100644 maven-repository-proxy/src/test/m1-remote-repo/not-standard/repository/file.txt diff --git a/maven-repository-proxy/src/main/java/org/apache/maven/repository/proxy/DefaultProxyManager.java b/maven-repository-proxy/src/main/java/org/apache/maven/repository/proxy/DefaultProxyManager.java index cf4d9dc03..dd9c1a7d4 100644 --- a/maven-repository-proxy/src/main/java/org/apache/maven/repository/proxy/DefaultProxyManager.java +++ b/maven-repository-proxy/src/main/java/org/apache/maven/repository/proxy/DefaultProxyManager.java @@ -49,7 +49,7 @@ import java.util.Map; /** * @author Edwin Punzalan - * @plexus.component role="org.apache.maven.repository.proxy.ProxyManager" role-hint="default" + * @plexus.component role="org.apache.maven.repository.proxy.ProxyManager" */ public class DefaultProxyManager extends AbstractLogEnabled diff --git a/maven-repository-proxy/src/main/java/org/apache/maven/repository/proxy/ProxyManagerFactory.java b/maven-repository-proxy/src/main/java/org/apache/maven/repository/proxy/ProxyManagerFactory.java index 84f0173a7..2a52fcda6 100644 --- a/maven-repository-proxy/src/main/java/org/apache/maven/repository/proxy/ProxyManagerFactory.java +++ b/maven-repository-proxy/src/main/java/org/apache/maven/repository/proxy/ProxyManagerFactory.java @@ -49,7 +49,8 @@ public class ProxyManagerFactory public ProxyManager getProxyManager( String proxy_type, ProxyConfiguration config ) throws ComponentLookupException { - ProxyManager proxy = (ProxyManager) container.lookup( ProxyManager.ROLE, proxy_type ); + ProxyManager proxy = (ProxyManager) container.lookup( ProxyManager.ROLE ); + config.setLayout( proxy_type ); proxy.setConfiguration( config ); return proxy; } diff --git a/maven-repository-proxy/src/main/java/org/apache/maven/repository/proxy/configuration/ProxyConfiguration.java b/maven-repository-proxy/src/main/java/org/apache/maven/repository/proxy/configuration/ProxyConfiguration.java index 3d3936241..76490fe64 100644 --- a/maven-repository-proxy/src/main/java/org/apache/maven/repository/proxy/configuration/ProxyConfiguration.java +++ b/maven-repository-proxy/src/main/java/org/apache/maven/repository/proxy/configuration/ProxyConfiguration.java @@ -21,6 +21,7 @@ import org.apache.maven.artifact.repository.ArtifactRepositoryFactory; import org.apache.maven.artifact.repository.ArtifactRepositoryPolicy; import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout; import org.apache.maven.artifact.repository.layout.DefaultRepositoryLayout; +import org.apache.maven.artifact.repository.layout.LegacyRepositoryLayout; import org.apache.maven.repository.proxy.repository.ProxyRepository; import java.io.File; @@ -52,6 +53,8 @@ public class ProxyConfiguration private List repositories = new ArrayList(); + private ArtifactRepositoryLayout layout; + /** * Method to set/unset the web-view of the repository cache * @@ -83,11 +86,9 @@ public class ProxyConfiguration standardPolicy = new ArtifactRepositoryPolicy( true, ArtifactRepositoryPolicy.UPDATE_POLICY_ALWAYS, ArtifactRepositoryPolicy.CHECKSUM_POLICY_IGNORE ); - ArtifactRepositoryLayout layout = new DefaultRepositoryLayout(); - repoCache = artifactRepositoryFactory.createArtifactRepository( "localCache", "file://" + new File( path ).getAbsolutePath(), - layout, standardPolicy, standardPolicy ); + getLayout(), standardPolicy, standardPolicy ); } /** @@ -159,7 +160,6 @@ public class ProxyConfiguration this.setBrowsable( rcc.isBrowsable() ); List repoList = new ArrayList(); - ArtifactRepositoryLayout layout = new DefaultRepositoryLayout(); for ( Iterator repos = rcc.getRepos().iterator(); repos.hasNext(); ) { RepoConfiguration repoConfig = (RepoConfiguration) repos.next(); @@ -167,7 +167,7 @@ public class ProxyConfiguration //skip local store repo if ( !repoConfig.getKey().equals( "global" ) ) { - ProxyRepository repo = new ProxyRepository( repoConfig.getKey(), repoConfig.getUrl(), layout ); + ProxyRepository repo = new ProxyRepository( repoConfig.getKey(), repoConfig.getUrl(), getLayout() ); repo.setCacheFailures( repoConfig.getCacheFailures() ); repo.setCachePeriod( repoConfig.getCachePeriod() ); repo.setHardfail( repoConfig.getHardFail() ); @@ -186,4 +186,26 @@ public class ProxyConfiguration this.setRepositories( repoList ); } + + public ArtifactRepositoryLayout getLayout() + { + if ( layout == null ) + { + setLayout( "default" ); + } + + return layout; + } + + public void setLayout( String layout ) + { + if ( "legacy".equalsIgnoreCase( layout ) ) + { + this.layout = new LegacyRepositoryLayout(); + } + else + { + this.layout = new DefaultRepositoryLayout(); + } + } } diff --git a/maven-repository-proxy/src/test/java/org/apache/maven/repository/proxy/LegacyProxyManagerTest.java b/maven-repository-proxy/src/test/java/org/apache/maven/repository/proxy/LegacyProxyManagerTest.java new file mode 100644 index 000000000..ae9caf770 --- /dev/null +++ b/maven-repository-proxy/src/test/java/org/apache/maven/repository/proxy/LegacyProxyManagerTest.java @@ -0,0 +1,150 @@ +package org.apache.maven.repository.proxy; + +/* + * Copyright 2005-2006 The Apache Software Foundation. + * + * Licensed 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.artifact.repository.layout.ArtifactRepositoryLayout; +import org.apache.maven.artifact.repository.layout.LegacyRepositoryLayout; +import org.apache.maven.repository.proxy.configuration.ProxyConfiguration; +import org.apache.maven.repository.proxy.repository.ProxyRepository; +import org.apache.maven.wagon.ResourceDoesNotExistException; +import org.codehaus.plexus.PlexusTestCase; +import org.codehaus.plexus.component.repository.exception.ComponentLookupException; + +import java.io.File; + +/** + * @author Edwin Punzalan + */ +public class LegacyProxyManagerTest + extends PlexusTestCase +{ + private ProxyManager proxy; + + protected void setUp() + throws Exception + { + super.setUp(); + + ProxyManagerFactory factory = (ProxyManagerFactory) container.lookup( ProxyManagerFactory.ROLE ); + proxy = factory.getProxyManager( "default", getTestConfiguration() ); + } + + public void testExceptions() + { + proxy.setConfiguration( null ); + + try + { + proxy.get( "/invalid" ); + fail( "Expected empty configuration error." ); + } + catch ( ProxyException e ) + { + assertEquals( "Expected Exception not thrown.", "No proxy configuration defined.", e.getMessage() ); + } + catch ( ResourceDoesNotExistException e ) + { + fail( "Expected Exception not thrown." ); + } + } + + public void testArtifactDownload() + throws Exception + { + //test download + File file = proxy.get( "/commons-logging/jars/commons-logging-1.0.jar" ); + assertTrue( "File must be downloaded.", file.exists() ); + assertTrue( "Downloaded file should be present in the cache.", + file.getAbsolutePath().startsWith( proxy.getConfiguration().getRepositoryCachePath() ) ); + + //test cache + file = proxy.get( "/commons-logging/jars/commons-logging-1.0.jar" ); + + try + { + file = proxy.get( "/commons-logging/jars/commons-logging-2.0.jar" ); + fail( "Expected ResourceDoesNotExistException exception not thrown" ); + } + catch ( ResourceDoesNotExistException e ) + { + assertTrue( true ); + } + } + + public void testArtifactChecksum() + throws Exception + { + //force the downlod from the remote repository, use getRemoteFile() + File file = proxy.getRemoteFile( "/commons-logging/jars/commons-logging-1.0.jar.md5" ); + assertTrue( "File must be downloaded.", file.exists() ); + assertTrue( "Downloaded file should be present in the cache.", + file.getAbsolutePath().startsWith( proxy.getConfiguration().getRepositoryCachePath() ) ); + } + + public void testNonArtifactWithNoChecksum() + throws Exception + { + File file = proxy.get( "/not-standard/repository/file.txt" ); + assertTrue( "File must be downloaded.", file.exists() ); + assertTrue( "Downloaded file should be present in the cache.", + file.getAbsolutePath().startsWith( proxy.getConfiguration().getRepositoryCachePath() ) ); + } + + public void testNonArtifactWithMD5Checksum() + throws Exception + { + File file = proxy.get( "/checksumed-md5/repository/file.txt" ); + assertTrue( "File must be downloaded.", file.exists() ); + assertTrue( "Downloaded file should be present in the cache.", + file.getAbsolutePath().startsWith( proxy.getConfiguration().getRepositoryCachePath() ) ); + } + + public void testNonArtifactWithSHA1Checksum() + throws Exception + { + File file = proxy.get( "/checksumed-sha1/repository/file.txt" ); + assertTrue( "File must be downloaded.", file.exists() ); + assertTrue( "Downloaded file should be present in the cache.", + file.getAbsolutePath().startsWith( proxy.getConfiguration().getRepositoryCachePath() ) ); + } + + protected void tearDown() + throws Exception + { + container.release( proxy ); + + super.tearDown(); + } + + private ProxyConfiguration getTestConfiguration() + throws ComponentLookupException + { + ProxyConfiguration config = (ProxyConfiguration) container.lookup( ProxyConfiguration.ROLE ); + + config.setRepositoryCachePath( "target/proxy-cache" ); + + ArtifactRepositoryLayout layout = new LegacyRepositoryLayout(); + + File repo1File = getTestFile( "src/test/m1-remote-repo" ); + + ProxyRepository repo1 = new ProxyRepository( "m1-test-repo", "file://" + repo1File.getAbsolutePath(), layout ); + + config.addRepository( repo1 ); + + return config; + } +} diff --git a/maven-repository-proxy/src/test/m1-remote-repo/checksumed-md5/repository/file.txt b/maven-repository-proxy/src/test/m1-remote-repo/checksumed-md5/repository/file.txt new file mode 100644 index 000000000..08657d777 --- /dev/null +++ b/maven-repository-proxy/src/test/m1-remote-repo/checksumed-md5/repository/file.txt @@ -0,0 +1 @@ +test file only \ No newline at end of file diff --git a/maven-repository-proxy/src/test/m1-remote-repo/checksumed-md5/repository/file.txt.md5 b/maven-repository-proxy/src/test/m1-remote-repo/checksumed-md5/repository/file.txt.md5 new file mode 100644 index 000000000..3839dd62f --- /dev/null +++ b/maven-repository-proxy/src/test/m1-remote-repo/checksumed-md5/repository/file.txt.md5 @@ -0,0 +1 @@ +a473f827aa9d5df4e84c802e054c50f7 \ No newline at end of file diff --git a/maven-repository-proxy/src/test/m1-remote-repo/checksumed-sha1/repository/file.txt b/maven-repository-proxy/src/test/m1-remote-repo/checksumed-sha1/repository/file.txt new file mode 100644 index 000000000..08657d777 --- /dev/null +++ b/maven-repository-proxy/src/test/m1-remote-repo/checksumed-sha1/repository/file.txt @@ -0,0 +1 @@ +test file only \ No newline at end of file diff --git a/maven-repository-proxy/src/test/m1-remote-repo/checksumed-sha1/repository/file.txt.sha1 b/maven-repository-proxy/src/test/m1-remote-repo/checksumed-sha1/repository/file.txt.sha1 new file mode 100644 index 000000000..d12e1a485 --- /dev/null +++ b/maven-repository-proxy/src/test/m1-remote-repo/checksumed-sha1/repository/file.txt.sha1 @@ -0,0 +1 @@ +afb037c2bd96fe1ef1cfd220e82682d088d60d3e \ No newline at end of file diff --git a/maven-repository-proxy/src/test/m1-remote-repo/commons-logging/jars/commons-logging-1.0.jar b/maven-repository-proxy/src/test/m1-remote-repo/commons-logging/jars/commons-logging-1.0.jar new file mode 100644 index 0000000000000000000000000000000000000000..33232cd09012c72277a4c0f56f74cb53c9b747c6 GIT binary patch literal 21950 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 V7?ab-!=uG~a)|NpD7CQP{spbyy{`ZO literal 0 HcmV?d00001 diff --git a/maven-repository-proxy/src/test/m1-remote-repo/commons-logging/jars/commons-logging-1.0.jar.md5 b/maven-repository-proxy/src/test/m1-remote-repo/commons-logging/jars/commons-logging-1.0.jar.md5 new file mode 100644 index 000000000..7c997d231 --- /dev/null +++ b/maven-repository-proxy/src/test/m1-remote-repo/commons-logging/jars/commons-logging-1.0.jar.md5 @@ -0,0 +1 @@ +240b26992977c9ad119efb91cb21f8f8 \ No newline at end of file diff --git a/maven-repository-proxy/src/test/m1-remote-repo/commons-logging/poms/commons-logging-1.0.pom b/maven-repository-proxy/src/test/m1-remote-repo/commons-logging/poms/commons-logging-1.0.pom new file mode 100644 index 000000000..402a9df37 --- /dev/null +++ b/maven-repository-proxy/src/test/m1-remote-repo/commons-logging/poms/commons-logging-1.0.pom @@ -0,0 +1,6 @@ + + 4.0.0 + commons-logging + commons-logging + 1.0 + diff --git a/maven-repository-proxy/src/test/m1-remote-repo/not-standard/repository/file.txt b/maven-repository-proxy/src/test/m1-remote-repo/not-standard/repository/file.txt new file mode 100644 index 000000000..08657d777 --- /dev/null +++ b/maven-repository-proxy/src/test/m1-remote-repo/not-standard/repository/file.txt @@ -0,0 +1 @@ +test file only \ No newline at end of file