aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoakim Erdfelt <joakime@apache.org>2007-10-31 22:47:50 +0000
committerJoakim Erdfelt <joakime@apache.org>2007-10-31 22:47:50 +0000
commit255949579d3ab36bf59eda5948cf28321db59e18 (patch)
tree8d09d925fc746b82eec48a0f9f094623eee16783
parentb62b18f3786a50f525c8bc6b8521e75274639203 (diff)
downloadarchiva-255949579d3ab36bf59eda5948cf28321db59e18.tar.gz
archiva-255949579d3ab36bf59eda5948cf28321db59e18.zip
[MRM-577] Release policy of disabled fails all metadata requests.
Fixing release / snapshot policies from applying tests on maven-metadata.xml files. Creating unit tests for release / snapshot policies. Switching from boolean return on .applyPolicy() to throwing exception, to gain better logging of why the transfer failed. Logging policy failures better. git-svn-id: https://svn.apache.org/repos/asf/maven/archiva/trunk@590858 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r--archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/AbstractUpdatePolicy.java59
-rw-r--r--archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/CachedFailuresPolicy.java20
-rw-r--r--archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/ChecksumPolicy.java66
-rw-r--r--archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/DownloadPolicy.java5
-rw-r--r--archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/PolicyConfigurationException.java44
-rw-r--r--archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/PolicyViolationException.java (renamed from archiva-base/archiva-policies/src/test/java/org/apache/maven/archiva/policies/AllTests.java)22
-rw-r--r--archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/PostDownloadPolicy.java9
-rw-r--r--archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/PreDownloadPolicy.java5
-rw-r--r--archiva-base/archiva-policies/src/test/java/org/apache/maven/archiva/policies/CachedFailuresPolicyTest.java14
-rw-r--r--archiva-base/archiva-policies/src/test/java/org/apache/maven/archiva/policies/ChecksumPolicyTest.java34
-rw-r--r--archiva-base/archiva-policies/src/test/java/org/apache/maven/archiva/policies/ReleasePolicyTest.java347
-rw-r--r--archiva-base/archiva-policies/src/test/java/org/apache/maven/archiva/policies/SnapshotsPolicyTest.java347
-rw-r--r--archiva-base/archiva-proxy/src/main/java/org/apache/maven/archiva/proxy/DefaultRepositoryProxyConnectors.java39
13 files changed, 912 insertions, 99 deletions
diff --git a/archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/AbstractUpdatePolicy.java b/archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/AbstractUpdatePolicy.java
index 6cb2aef60..536bda9de 100644
--- a/archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/AbstractUpdatePolicy.java
+++ b/archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/AbstractUpdatePolicy.java
@@ -76,7 +76,7 @@ public abstract class AbstractUpdatePolicy
*/
public static final String ONCE = "once";
- private List options = new ArrayList();
+ private List<String> options = new ArrayList<String>();
public AbstractUpdatePolicy()
{
@@ -91,13 +91,20 @@ public abstract class AbstractUpdatePolicy
protected abstract String getUpdateMode();
- public List getOptions()
+ public List<String> getOptions()
{
return options;
}
- public boolean applyPolicy( String policySetting, Properties request, File localFile )
+ public void applyPolicy( String policySetting, Properties request, File localFile )
+ throws PolicyViolationException, PolicyConfigurationException
{
+ if ( !StringUtils.equals( request.getProperty( "filetype" ), "artifact" ) )
+ {
+ // Only process artifact file types.
+ return;
+ }
+
String version = request.getProperty( "version", "" );
boolean isSnapshotVersion = false;
@@ -108,50 +115,48 @@ public abstract class AbstractUpdatePolicy
if ( !options.contains( policySetting ) )
{
- // No valid code? false it is then.
- getLogger().error( "Unknown artifact-update policyCode [" + policySetting + "]" );
- return false;
+ // Not a valid code.
+ throw new PolicyConfigurationException( "Unknown " + getUpdateMode() + " policy setting [" + policySetting
+ + "], valid settings are [" + StringUtils.join( options.iterator(), "," ) + "]" );
}
if ( IGNORED.equals( policySetting ) )
{
// Ignored means ok to update.
getLogger().debug( "OK to update, " + getUpdateMode() + " policy set to IGNORED." );
- return true;
+ return;
}
// Test for mismatches.
if ( !isSnapshotVersion && isSnapshotPolicy() )
{
getLogger().debug( "OK to update, snapshot policy does not apply for non-snapshot versions." );
- return true;
+ return;
}
if ( isSnapshotVersion && !isSnapshotPolicy() )
{
getLogger().debug( "OK to update, release policy does not apply for snapshot versions." );
- return true;
+ return;
}
if ( DISABLED.equals( policySetting ) )
{
// Disabled means no.
- getLogger().debug( "NO to update, " + getUpdateMode() + " policy set to DISABLED." );
- return false;
+ throw new PolicyViolationException( "NO to update, " + getUpdateMode() + " policy set to DISABLED." );
}
if ( !localFile.exists() )
{
// No file means it's ok.
getLogger().debug( "OK to update " + getUpdateMode() + ", local file does not exist." );
- return true;
+ return;
}
if ( ONCE.equals( policySetting ) )
{
// File exists, but policy is once.
- getLogger().debug( "NO to update" + getUpdateMode() + ", local file exist (and policy is ONCE)." );
- return false;
+ throw new PolicyViolationException( "NO to update " + getUpdateMode() + ", policy is ONCE, and local file exist." );
}
if ( DAILY.equals( policySetting ) )
@@ -161,7 +166,16 @@ public abstract class AbstractUpdatePolicy
Calendar fileCal = Calendar.getInstance();
fileCal.setTimeInMillis( localFile.lastModified() );
- return cal.after( fileCal );
+ if( cal.after( fileCal ) )
+ {
+ // Its ok.
+ return;
+ }
+ else
+ {
+ throw new PolicyViolationException( "NO to update " + getUpdateMode()
+ + ", policy is DAILY, local file exist, and has been updated within the last day." );
+ }
}
if ( HOURLY.equals( policySetting ) )
@@ -171,10 +185,19 @@ public abstract class AbstractUpdatePolicy
Calendar fileCal = Calendar.getInstance();
fileCal.setTimeInMillis( localFile.lastModified() );
- return cal.after( fileCal );
+ if( cal.after( fileCal ) )
+ {
+ // Its ok.
+ return;
+ }
+ else
+ {
+ throw new PolicyViolationException( "NO to update " + getUpdateMode()
+ + ", policy is HOURLY, local file exist, and has been updated within the last hour." );
+ }
}
- getLogger().error( "Unhandled policyCode [" + policySetting + "]" );
- return false;
+ throw new PolicyConfigurationException( "Unable to process " + getUpdateMode()
+ + " policy of [" + policySetting + "], please file a bug report." );
}
}
diff --git a/archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/CachedFailuresPolicy.java b/archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/CachedFailuresPolicy.java
index d418daeb9..46a0f3252 100644
--- a/archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/CachedFailuresPolicy.java
+++ b/archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/CachedFailuresPolicy.java
@@ -52,7 +52,7 @@ public class CachedFailuresPolicy
*/
private UrlFailureCache urlFailureCache;
- private List options = new ArrayList();
+ private List<String> options = new ArrayList<String>();
public CachedFailuresPolicy()
{
@@ -60,20 +60,21 @@ public class CachedFailuresPolicy
options.add( CACHED );
}
- public boolean applyPolicy( String policySetting, Properties request, File localFile )
+ public void applyPolicy( String policySetting, Properties request, File localFile )
+ throws PolicyViolationException, PolicyConfigurationException
{
if ( !options.contains( policySetting ) )
{
- // No valid code? false it is then.
- getLogger().error( "Unknown check-failures policyCode [" + policySetting + "]" );
- return false;
+ // Not a valid code.
+ throw new PolicyConfigurationException( "Unknown cache-failues policy setting [" + policySetting
+ + "], valid settings are [" + StringUtils.join( options.iterator(), "," ) + "]" );
}
if ( IGNORED.equals( policySetting ) )
{
// Ignore.
getLogger().debug( "OK to fetch, check-failures policy set to IGNORED." );
- return true;
+ return;
}
String url = request.getProperty( "url" );
@@ -82,14 +83,11 @@ public class CachedFailuresPolicy
{
if ( urlFailureCache.hasFailedBefore( url ) )
{
- getLogger().debug( "NO to fetch, check-failures detected previous failure on url: " + url );
- return false;
+ throw new PolicyViolationException( "NO to fetch, check-failures detected previous failure on url: " + url );
}
}
getLogger().debug( "OK to fetch, check-failures detected no issues." );
-
- return true;
}
public String getDefaultOption()
@@ -102,7 +100,7 @@ public class CachedFailuresPolicy
return "cache-failures";
}
- public List getOptions()
+ public List<String> getOptions()
{
return options;
}
diff --git a/archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/ChecksumPolicy.java b/archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/ChecksumPolicy.java
index 63c888036..2f80d5aa5 100644
--- a/archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/ChecksumPolicy.java
+++ b/archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/ChecksumPolicy.java
@@ -19,6 +19,7 @@ package org.apache.maven.archiva.policies;
* under the License.
*/
+import org.apache.commons.lang.StringUtils;
import org.apache.maven.archiva.common.utils.Checksums;
import org.codehaus.plexus.logging.AbstractLogEnabled;
@@ -28,7 +29,8 @@ import java.util.List;
import java.util.Properties;
/**
- * ChecksumPolicy
+ * ChecksumPolicy - a policy applied after the download to see if the file has been downloaded
+ * successfully and completely (or not).
*
* @author <a href="mailto:joakime@apache.org">Joakim Erdfelt</a>
* @version $Id$
@@ -68,60 +70,70 @@ public class ChecksumPolicy
options.add( IGNORED );
}
- public boolean applyPolicy( String policySetting, Properties request, File localFile )
+ public void applyPolicy( String policySetting, Properties request, File localFile )
+ throws PolicyViolationException, PolicyConfigurationException
{
if ( !options.contains( policySetting ) )
{
- // No valid code? false it is then.
- getLogger().error( "Unknown checksum policyCode [" + policySetting + "]" );
- return false;
+ // Not a valid code.
+ throw new PolicyConfigurationException( "Unknown checksum policy setting [" + policySetting
+ + "], valid settings are [" + StringUtils.join( options.iterator(), "," ) + "]" );
}
if ( IGNORED.equals( policySetting ) )
{
// Ignore.
- return true;
+ return;
}
if ( !localFile.exists() )
{
// Local File does not exist.
- getLogger().debug( "Local file " + localFile.getAbsolutePath() + " does not exist." );
- return false;
+ throw new PolicyViolationException( "Checksum policy failure, local file " + localFile.getAbsolutePath()
+ + " does not exist to check." );
}
if ( FAIL.equals( policySetting ) )
{
- boolean checksPass = checksums.check( localFile );
- if( ! checksPass )
+ if( checksums.check( localFile ) )
{
- File sha1File = new File( localFile.getAbsolutePath() + ".sha1" );
- File md5File = new File( localFile.getAbsolutePath() + ".md5" );
-
- // On failure. delete files.
- if ( sha1File.exists() )
- {
- sha1File.delete();
- }
+ return;
+ }
+
+ File sha1File = new File( localFile.getAbsolutePath() + ".sha1" );
+ File md5File = new File( localFile.getAbsolutePath() + ".md5" );
- if ( md5File.exists() )
- {
- md5File.delete();
- }
+ // On failure. delete files.
+ if ( sha1File.exists() )
+ {
+ sha1File.delete();
+ }
- localFile.delete();
+ if ( md5File.exists() )
+ {
+ md5File.delete();
}
- return checksPass;
+ localFile.delete();
+ throw new PolicyViolationException( "Checksums do not match, policy set to FAIL, "
+ + "deleting checksum files and local file " + localFile.getAbsolutePath() + "." );
}
if ( FIX.equals( policySetting ) )
{
- return checksums.update( localFile );
+ if( checksums.update( localFile ) )
+ {
+ return;
+ }
+ else
+ {
+ throw new PolicyViolationException( "Checksum policy set to FIX, "
+ + "yet unable to update checksums for local file " + localFile.getAbsolutePath() + "." );
+ }
}
- getLogger().error( "Unhandled policyCode [" + policySetting + "]" );
- return false;
+ throw new PolicyConfigurationException( "Unable to process checksum policy of [" + policySetting
+ + "], please file a bug report." );
}
public String getDefaultOption()
diff --git a/archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/DownloadPolicy.java b/archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/DownloadPolicy.java
index d49d07565..e9ff75319 100644
--- a/archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/DownloadPolicy.java
+++ b/archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/DownloadPolicy.java
@@ -67,7 +67,8 @@ public interface DownloadPolicy
* @param request the list of request properties that the policy might use.
* @param localFile
*
- * @return true if the policy passes.
+ * @throws PolicyViolationException if the policy has been violated.
*/
- public boolean applyPolicy( String policySetting, Properties request, File localFile );
+ public void applyPolicy( String policySetting, Properties request, File localFile )
+ throws PolicyViolationException, PolicyConfigurationException;
}
diff --git a/archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/PolicyConfigurationException.java b/archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/PolicyConfigurationException.java
new file mode 100644
index 000000000..0d705e1db
--- /dev/null
+++ b/archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/PolicyConfigurationException.java
@@ -0,0 +1,44 @@
+package org.apache.maven.archiva.policies;
+
+/*
+ * 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.ArchivaException;
+
+/**
+ * PolicyConfigurationException is thrown when a policy cannot be executed due to a
+ * configuration issue.
+ *
+ * @author <a href="mailto:joakime@apache.org">Joakim Erdfelt</a>
+ * @version $Id$
+ */
+public class PolicyConfigurationException
+ extends ArchivaException
+{
+
+ public PolicyConfigurationException( String message, Throwable cause )
+ {
+ super( message, cause );
+ }
+
+ public PolicyConfigurationException( String message )
+ {
+ super( message );
+ }
+}
diff --git a/archiva-base/archiva-policies/src/test/java/org/apache/maven/archiva/policies/AllTests.java b/archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/PolicyViolationException.java
index 8b3cc7646..0de36ec76 100644
--- a/archiva-base/archiva-policies/src/test/java/org/apache/maven/archiva/policies/AllTests.java
+++ b/archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/PolicyViolationException.java
@@ -19,26 +19,24 @@ package org.apache.maven.archiva.policies;
* under the License.
*/
-import junit.framework.Test;
-import junit.framework.TestSuite;
+import org.apache.maven.archiva.common.ArchivaException;
/**
- * Helper class for IDE testing.
+ * PolicyViolationException
*
* @author <a href="mailto:joakime@apache.org">Joakim Erdfelt</a>
* @version $Id$
*/
-public class AllTests
+public class PolicyViolationException
+ extends ArchivaException
{
-
- public static Test suite()
+ public PolicyViolationException( String message, Throwable cause )
{
- TestSuite suite = new TestSuite( "Test for org.apache.maven.archiva.policies" );
- //$JUnit-BEGIN$
- suite.addTestSuite( ChecksumPolicyTest.class );
- suite.addTestSuite( CachedFailuresPolicyTest.class );
- //$JUnit-END$
- return suite;
+ super( message, cause );
}
+ public PolicyViolationException( String message )
+ {
+ super( message );
+ }
}
diff --git a/archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/PostDownloadPolicy.java b/archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/PostDownloadPolicy.java
index 634be98e1..d1f6d216e 100644
--- a/archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/PostDownloadPolicy.java
+++ b/archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/PostDownloadPolicy.java
@@ -19,7 +19,6 @@ package org.apache.maven.archiva.policies;
* under the License.
*/
-
import java.io.File;
import java.util.Properties;
@@ -30,7 +29,8 @@ import java.util.Properties;
* @author <a href="mailto:joakime@apache.org">Joakim Erdfelt</a>
* @version $Id$
*/
-public interface PostDownloadPolicy extends DownloadPolicy
+public interface PostDownloadPolicy
+ extends DownloadPolicy
{
/**
* Apply the download policy.
@@ -42,7 +42,8 @@ public interface PostDownloadPolicy extends DownloadPolicy
* @param request the list of request properties that the policy might use.
* @param localFile the local file that this policy affects
*
- * @return true if the policy passes. false if not.
+ * @throws PolicyViolationException if the policy has been violated.
*/
- public boolean applyPolicy( String policySetting, Properties request, File localFile );
+ public void applyPolicy( String policySetting, Properties request, File localFile )
+ throws PolicyViolationException, PolicyConfigurationException;
}
diff --git a/archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/PreDownloadPolicy.java b/archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/PreDownloadPolicy.java
index 29c0ae444..f88eb938f 100644
--- a/archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/PreDownloadPolicy.java
+++ b/archiva-base/archiva-policies/src/main/java/org/apache/maven/archiva/policies/PreDownloadPolicy.java
@@ -41,7 +41,8 @@ public interface PreDownloadPolicy extends DownloadPolicy
* @param request the list of request properties that the policy might use.
* @param localFile the local file that this policy affects
*
- * @return true if the policy passes. false if not.
+ * @throws PolicyViolationException if the policy has been violated.
*/
- public boolean applyPolicy( String policySetting, Properties request, File localFile );
+ public void applyPolicy( String policySetting, Properties request, File localFile )
+ throws PolicyViolationException, PolicyConfigurationException;
}
diff --git a/archiva-base/archiva-policies/src/test/java/org/apache/maven/archiva/policies/CachedFailuresPolicyTest.java b/archiva-base/archiva-policies/src/test/java/org/apache/maven/archiva/policies/CachedFailuresPolicyTest.java
index 725b7b843..5d70a9db7 100644
--- a/archiva-base/archiva-policies/src/test/java/org/apache/maven/archiva/policies/CachedFailuresPolicyTest.java
+++ b/archiva-base/archiva-policies/src/test/java/org/apache/maven/archiva/policies/CachedFailuresPolicyTest.java
@@ -67,7 +67,7 @@ public class CachedFailuresPolicyTest
request.setProperty( "url", "http://a.bad.hostname.maven.org/path/to/resource.txt" );
- assertTrue( policy.applyPolicy( CachedFailuresPolicy.IGNORED, request, localFile ) );
+ policy.applyPolicy( CachedFailuresPolicy.IGNORED, request, localFile );
}
public void testCachedNotInCache()
@@ -79,7 +79,7 @@ public class CachedFailuresPolicyTest
request.setProperty( "url", "http://a.bad.hostname.maven.org/path/to/resource.txt" );
- assertTrue( policy.applyPolicy( CachedFailuresPolicy.CACHED, request, localFile ) );
+ policy.applyPolicy( CachedFailuresPolicy.CACHED, request, localFile );
}
public void testCachedInCache()
@@ -97,6 +97,14 @@ public class CachedFailuresPolicyTest
request.setProperty( "url", url );
- assertFalse( policy.applyPolicy( CachedFailuresPolicy.CACHED, request, localFile ) );
+ try
+ {
+ policy.applyPolicy( CachedFailuresPolicy.CACHED, request, localFile );
+ fail( "Expected a PolicyViolationException." );
+ }
+ catch ( PolicyViolationException e )
+ {
+ // expected path.
+ }
}
}
diff --git a/archiva-base/archiva-policies/src/test/java/org/apache/maven/archiva/policies/ChecksumPolicyTest.java b/archiva-base/archiva-policies/src/test/java/org/apache/maven/archiva/policies/ChecksumPolicyTest.java
index 1668b5b72..5c33317d5 100644
--- a/archiva-base/archiva-policies/src/test/java/org/apache/maven/archiva/policies/ChecksumPolicyTest.java
+++ b/archiva-base/archiva-policies/src/test/java/org/apache/maven/archiva/policies/ChecksumPolicyTest.java
@@ -155,7 +155,7 @@ public class ChecksumPolicyTest
File localFile = createTestableFiles( null, null );
Properties request = createRequest();
- assertTrue( policy.applyPolicy( ChecksumPolicy.IGNORED, request, localFile ) );
+ policy.applyPolicy( ChecksumPolicy.IGNORED, request, localFile );
}
private void assertFailSetting( boolean expectedResult, String md5State, String sha1State )
@@ -165,11 +165,18 @@ public class ChecksumPolicyTest
File localFile = createTestableFiles( md5State, sha1State );
Properties request = createRequest();
- boolean actualResult = policy.applyPolicy( ChecksumPolicy.FAIL, request, localFile );
- String msg = createMessage( ChecksumPolicy.FAIL, md5State, sha1State );
-
- if ( actualResult == false )
+ boolean actualResult;
+
+ try
{
+ policy.applyPolicy( ChecksumPolicy.FAIL, request, localFile );
+ actualResult = true;
+ }
+ catch ( PolicyViolationException e )
+ {
+ actualResult = false;
+ String msg = createMessage( ChecksumPolicy.FAIL, md5State, sha1State );
+
assertFalse( msg + " local file should not exist:", localFile.exists() );
File md5File = new File( localFile.getAbsolutePath() + ".sha1" );
File sha1File = new File( localFile.getAbsolutePath() + ".md5" );
@@ -187,7 +194,18 @@ public class ChecksumPolicyTest
File localFile = createTestableFiles( md5State, sha1State );
Properties request = createRequest();
- boolean actualResult = policy.applyPolicy( ChecksumPolicy.FIX, request, localFile );
+ boolean actualResult;
+
+ try
+ {
+ policy.applyPolicy( ChecksumPolicy.FIX, request, localFile );
+ actualResult = true;
+ }
+ catch ( PolicyViolationException e )
+ {
+ actualResult = false;
+ }
+
assertEquals( createMessage( ChecksumPolicy.FIX, md5State, sha1State ), expectedResult, actualResult );
// End result should be legitimate SHA1 and MD5 files.
@@ -278,8 +296,8 @@ public class ChecksumPolicyTest
private File createTestableFiles( String md5State, String sha1State )
throws Exception
{
- File sourceDir = new File( "src/test/resources/checksums/" );
- File destDir = new File( "target/checksum-tests/" + getName() + "/" );
+ File sourceDir = getTestFile( "src/test/resources/checksums/" );
+ File destDir = getTestFile( "target/checksum-tests/" + getName() + "/" );
FileUtils.copyFileToDirectory( new File( sourceDir, "artifact.jar" ), destDir );
diff --git a/archiva-base/archiva-policies/src/test/java/org/apache/maven/archiva/policies/ReleasePolicyTest.java b/archiva-base/archiva-policies/src/test/java/org/apache/maven/archiva/policies/ReleasePolicyTest.java
new file mode 100644
index 000000000..548693f4e
--- /dev/null
+++ b/archiva-base/archiva-policies/src/test/java/org/apache/maven/archiva/policies/ReleasePolicyTest.java
@@ -0,0 +1,347 @@
+package org.apache.maven.archiva.policies;
+
+/*
+ * 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.PlexusTestCase;
+import org.codehaus.plexus.util.FileUtils;
+
+import java.io.File;
+import java.util.Properties;
+
+/**
+ * ReleasePolicyTest
+ *
+ * @author <a href="mailto:joakime@apache.org">Joakim Erdfelt</a>
+ * @version $Id$
+ */
+public class ReleasePolicyTest
+ extends PlexusTestCase
+{
+ private static final String PATH_VERSION_METADATA = "org/apache/archiva/archiva-testable/1.0-SNAPSHOT/maven-metadata.xml";
+
+ private static final String PATH_PROJECT_METADATA = "org/apache/archiva/archiva-testable/maven-metadata.xml";
+
+ private static final String PATH_SNAPSHOT_ARTIFACT = "org/apache/archiva/archiva-testable/1.0-SNAPSHOT/archiva-testable-1.0-SNAPSHOT.jar";
+
+ private static final String PATH_RELEASE_ARTIFACT = "org/apache/archiva/archiva-testable/2.0/archiva-testable-2.0.jar";
+
+ private static final boolean WITH_LOCAL = true;
+
+ private static final boolean NO_LOCAL = false;
+
+ protected static final long ONE_SECOND = ( 1000 /* milliseconds */);
+
+ protected static final long ONE_MINUTE = ( ONE_SECOND * 60 );
+
+ protected static final long ONE_HOUR = ( ONE_MINUTE * 60 );
+
+ protected static final long ONE_DAY = ( ONE_HOUR * 24 );
+
+ protected static final long OVER_ONE_HOUR = ( ONE_HOUR + ONE_MINUTE );
+
+ protected static final long OVER_ONE_DAY = ( ONE_DAY + ONE_HOUR );
+
+ protected static final long OLDER = ( -1 );
+
+ protected static final long NEWER = 0;
+
+ private long generatedLocalFileUpdateDelta = 0;
+
+ public void testReleasePolicyDailyProjectMetadata()
+ throws Exception
+ {
+ // Pass the policy when working with metadata, no matter what.
+ assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_PROJECT_METADATA, NO_LOCAL );
+ assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_PROJECT_METADATA, WITH_LOCAL );
+
+ generatedLocalFileUpdateDelta = OVER_ONE_DAY;
+ assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_PROJECT_METADATA, NO_LOCAL );
+ assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_PROJECT_METADATA, WITH_LOCAL );
+
+ generatedLocalFileUpdateDelta = ( ONE_HOUR * 22 );
+ assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_PROJECT_METADATA, NO_LOCAL );
+ assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_PROJECT_METADATA, WITH_LOCAL );
+ }
+
+ public void testReleasePolicyDailyReleaseArtifact()
+ throws Exception
+ {
+ assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_RELEASE_ARTIFACT, NO_LOCAL );
+ assertReleasesPolicyViolation( ReleasesPolicy.DAILY, PATH_RELEASE_ARTIFACT, WITH_LOCAL );
+
+ generatedLocalFileUpdateDelta = OVER_ONE_DAY;
+ assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_RELEASE_ARTIFACT, NO_LOCAL );
+ assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_RELEASE_ARTIFACT, WITH_LOCAL );
+
+ generatedLocalFileUpdateDelta = ( ONE_HOUR * 22 );
+ assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_RELEASE_ARTIFACT, NO_LOCAL );
+ assertReleasesPolicyViolation( ReleasesPolicy.DAILY, PATH_RELEASE_ARTIFACT, WITH_LOCAL );
+ }
+
+ public void testReleasePolicyDailySnapshotArtifact()
+ throws Exception
+ {
+ assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_SNAPSHOT_ARTIFACT, NO_LOCAL );
+ assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_SNAPSHOT_ARTIFACT, WITH_LOCAL );
+
+ generatedLocalFileUpdateDelta = OVER_ONE_DAY;
+ assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_SNAPSHOT_ARTIFACT, NO_LOCAL );
+ assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_SNAPSHOT_ARTIFACT, WITH_LOCAL );
+
+ generatedLocalFileUpdateDelta = ( ONE_HOUR * 22 );
+ assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_SNAPSHOT_ARTIFACT, NO_LOCAL );
+ assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_SNAPSHOT_ARTIFACT, WITH_LOCAL );
+ }
+
+ public void testReleasePolicyDailyVersionedMetadata()
+ throws Exception
+ {
+ // Pass the policy when working with metadata, no matter what.
+ assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_VERSION_METADATA, NO_LOCAL );
+ assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_VERSION_METADATA, WITH_LOCAL );
+
+ generatedLocalFileUpdateDelta = OVER_ONE_DAY;
+ assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_VERSION_METADATA, NO_LOCAL );
+ assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_VERSION_METADATA, WITH_LOCAL );
+
+ generatedLocalFileUpdateDelta = ( ONE_HOUR * 22 );
+ assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_VERSION_METADATA, NO_LOCAL );
+ assertReleasesPolicy( ReleasesPolicy.DAILY, PATH_VERSION_METADATA, WITH_LOCAL );
+ }
+
+ public void testReleasePolicyDisabledProjectMetadata()
+ throws Exception
+ {
+ // Pass the policy when working with metadata, no matter what.
+ assertReleasesPolicy( ReleasesPolicy.DISABLED, PATH_PROJECT_METADATA, NO_LOCAL );
+ assertReleasesPolicy( ReleasesPolicy.DISABLED, PATH_PROJECT_METADATA, WITH_LOCAL );
+ }
+
+ public void testReleasePolicyDisabledReleaseArtifact()
+ throws Exception
+ {
+ assertReleasesPolicyViolation( ReleasesPolicy.DISABLED, PATH_RELEASE_ARTIFACT, NO_LOCAL );
+ assertReleasesPolicyViolation( ReleasesPolicy.DISABLED, PATH_RELEASE_ARTIFACT, WITH_LOCAL );
+ }
+
+ public void testReleasePolicyDisabledSnapshotArtifact()
+ throws Exception
+ {
+ assertReleasesPolicy( ReleasesPolicy.DISABLED, PATH_SNAPSHOT_ARTIFACT, NO_LOCAL );
+ assertReleasesPolicy( ReleasesPolicy.DISABLED, PATH_SNAPSHOT_ARTIFACT, WITH_LOCAL );
+ }
+
+ public void testReleasePolicyDisabledVersionedMetadata()
+ throws Exception
+ {
+ // Pass the policy when working with metadata, no matter what.
+ assertReleasesPolicy( ReleasesPolicy.DISABLED, PATH_VERSION_METADATA, NO_LOCAL );
+ assertReleasesPolicy( ReleasesPolicy.DISABLED, PATH_VERSION_METADATA, WITH_LOCAL );
+ }
+
+ public void testReleasePolicyHourlyProjectMetadata()
+ throws Exception
+ {
+ // Pass the policy when working with metadata, no matter what.
+ assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_PROJECT_METADATA, NO_LOCAL );
+ assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_PROJECT_METADATA, WITH_LOCAL );
+
+ generatedLocalFileUpdateDelta = OVER_ONE_HOUR;
+ assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_PROJECT_METADATA, NO_LOCAL );
+ assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_PROJECT_METADATA, WITH_LOCAL );
+
+ generatedLocalFileUpdateDelta = ( ONE_MINUTE * 45 );
+ assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_PROJECT_METADATA, NO_LOCAL );
+ assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_PROJECT_METADATA, WITH_LOCAL );
+ }
+
+ public void testReleasePolicyHourlyReleaseArtifact()
+ throws Exception
+ {
+ assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_RELEASE_ARTIFACT, NO_LOCAL );
+ assertReleasesPolicyViolation( ReleasesPolicy.HOURLY, PATH_RELEASE_ARTIFACT, WITH_LOCAL );
+
+ generatedLocalFileUpdateDelta = OVER_ONE_HOUR;
+ assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_RELEASE_ARTIFACT, NO_LOCAL );
+ assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_RELEASE_ARTIFACT, WITH_LOCAL );
+
+ generatedLocalFileUpdateDelta = ( ONE_MINUTE * 45 );
+ assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_RELEASE_ARTIFACT, NO_LOCAL );
+ assertReleasesPolicyViolation( ReleasesPolicy.HOURLY, PATH_RELEASE_ARTIFACT, WITH_LOCAL );
+ }
+
+ public void testReleasePolicyHourlySnapshotArtifact()
+ throws Exception
+ {
+ assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_SNAPSHOT_ARTIFACT, NO_LOCAL );
+ assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_SNAPSHOT_ARTIFACT, WITH_LOCAL );
+
+ generatedLocalFileUpdateDelta = OVER_ONE_HOUR;
+ assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_SNAPSHOT_ARTIFACT, NO_LOCAL );
+ assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_SNAPSHOT_ARTIFACT, WITH_LOCAL );
+
+ generatedLocalFileUpdateDelta = ( ONE_MINUTE * 45 );
+ assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_SNAPSHOT_ARTIFACT, NO_LOCAL );
+ assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_SNAPSHOT_ARTIFACT, WITH_LOCAL );
+ }
+
+ public void testReleasePolicyHourlyVersionedMetadata()
+ throws Exception
+ {
+ // Pass the policy when working with metadata, no matter what.
+ assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_VERSION_METADATA, NO_LOCAL );
+ assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_VERSION_METADATA, WITH_LOCAL );
+
+ generatedLocalFileUpdateDelta = OVER_ONE_HOUR;
+ assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_VERSION_METADATA, NO_LOCAL );
+ assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_VERSION_METADATA, WITH_LOCAL );
+
+ generatedLocalFileUpdateDelta = ( ONE_MINUTE * 45 );
+ assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_VERSION_METADATA, NO_LOCAL );
+ assertReleasesPolicy( ReleasesPolicy.HOURLY, PATH_VERSION_METADATA, WITH_LOCAL );
+ }
+
+ public void testReleasePolicyIgnoredProjectMetadata()
+ throws Exception
+ {
+ // Pass the policy when working with metadata, no matter what.
+ assertReleasesPolicy( ReleasesPolicy.IGNORED, PATH_PROJECT_METADATA, NO_LOCAL );
+ assertReleasesPolicy( ReleasesPolicy.IGNORED, PATH_PROJECT_METADATA, WITH_LOCAL );
+ }
+
+ public void testReleasePolicyIgnoredReleaseArtifact()
+ throws Exception
+ {
+ assertReleasesPolicy( ReleasesPolicy.IGNORED, PATH_RELEASE_ARTIFACT, NO_LOCAL );
+ assertReleasesPolicy( ReleasesPolicy.IGNORED, PATH_RELEASE_ARTIFACT, WITH_LOCAL );
+ }
+
+ public void testReleasePolicyIgnoredSnapshotArtifact()
+ throws Exception
+ {
+ assertReleasesPolicy( ReleasesPolicy.IGNORED, PATH_SNAPSHOT_ARTIFACT, NO_LOCAL );
+ assertReleasesPolicy( ReleasesPolicy.IGNORED, PATH_SNAPSHOT_ARTIFACT, WITH_LOCAL );
+ }
+
+ public void testReleasePolicyIgnoredVersionedMetadata()
+ throws Exception
+ {
+ // Pass the policy when working with metadata, no matter what.
+ assertReleasesPolicy( ReleasesPolicy.IGNORED, PATH_VERSION_METADATA, NO_LOCAL );
+ assertReleasesPolicy( ReleasesPolicy.IGNORED, PATH_VERSION_METADATA, WITH_LOCAL );
+ }
+
+ public void testReleasePolicyOnceProjectMetadata()
+ throws Exception
+ {
+ // Pass the policy when working with metadata, no matter what.
+ assertReleasesPolicy( ReleasesPolicy.ONCE, PATH_PROJECT_METADATA, NO_LOCAL );
+ assertReleasesPolicy( ReleasesPolicy.ONCE, PATH_PROJECT_METADATA, WITH_LOCAL );
+ }
+
+ public void testReleasePolicyOnceReleaseArtifact()
+ throws Exception
+ {
+ assertReleasesPolicy( ReleasesPolicy.ONCE, PATH_RELEASE_ARTIFACT, NO_LOCAL );
+ assertReleasesPolicyViolation( ReleasesPolicy.ONCE, PATH_RELEASE_ARTIFACT, WITH_LOCAL );
+ }
+
+ public void testReleasePolicyOnceSnapshotArtifact()
+ throws Exception
+ {
+ assertReleasesPolicy( ReleasesPolicy.ONCE, PATH_SNAPSHOT_ARTIFACT, NO_LOCAL );
+ assertReleasesPolicy( ReleasesPolicy.ONCE, PATH_SNAPSHOT_ARTIFACT, WITH_LOCAL );
+ }
+
+ public void testReleasePolicyOnceVersionedMetadata()
+ throws Exception
+ {
+ // Pass the policy when working with metadata, no matter what.
+ assertReleasesPolicy( ReleasesPolicy.ONCE, PATH_VERSION_METADATA, NO_LOCAL );
+ assertReleasesPolicy( ReleasesPolicy.ONCE, PATH_VERSION_METADATA, WITH_LOCAL );
+ }
+
+ private void assertReleasesPolicy( String setting, String path, boolean createLocalFile )
+ throws Exception
+ {
+ PreDownloadPolicy policy = lookupPolicy();
+ Properties request = new Properties();
+ request.setProperty( "filetype", path.endsWith( "/maven-metadata.xml" ) ? "metadata" : "artifact" );
+
+ if ( path.contains( "1.0-SNAPSHOT" ) )
+ {
+ request.setProperty( "version", "1.0-SNAPSHOT" );
+ }
+
+ if ( path.contains( "2.0" ) )
+ {
+ request.setProperty( "version", "2.0" );
+ }
+
+ File targetDir = getTestFile( "target/test-policy/" );
+ File localFile = new File( targetDir, path );
+
+ if ( localFile.exists() )
+ {
+ localFile.delete();
+ }
+
+ if ( createLocalFile )
+ {
+ localFile.getParentFile().mkdirs();
+ FileUtils.fileWrite( localFile.getAbsolutePath(), "random-junk" );
+ localFile.setLastModified( localFile.lastModified() - generatedLocalFileUpdateDelta );
+ }
+
+ policy.applyPolicy( setting, request, localFile );
+ }
+
+ private void assertReleasesPolicyViolation( String setting, String path, boolean createLocalFile )
+ throws Exception
+ {
+ try
+ {
+ assertReleasesPolicy( setting, path, createLocalFile );
+ fail( "Expected a PolicyViolationException." );
+ }
+ catch ( PolicyViolationException e )
+ {
+ // expected path.
+ }
+ }
+
+ private PreDownloadPolicy lookupPolicy()
+ throws Exception
+ {
+ PreDownloadPolicy policy = (PreDownloadPolicy) lookup( PreDownloadPolicy.class.getName(), "releases" );
+ assertNotNull( policy );
+ return policy;
+ }
+
+ @Override
+ protected void setUp()
+ throws Exception
+ {
+ super.setUp();
+
+ // reset delta to 0.
+ generatedLocalFileUpdateDelta = 0;
+ }
+}
diff --git a/archiva-base/archiva-policies/src/test/java/org/apache/maven/archiva/policies/SnapshotsPolicyTest.java b/archiva-base/archiva-policies/src/test/java/org/apache/maven/archiva/policies/SnapshotsPolicyTest.java
new file mode 100644
index 000000000..96f6bd899
--- /dev/null
+++ b/archiva-base/archiva-policies/src/test/java/org/apache/maven/archiva/policies/SnapshotsPolicyTest.java
@@ -0,0 +1,347 @@
+package org.apache.maven.archiva.policies;
+
+/*
+ * 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.PlexusTestCase;
+import org.codehaus.plexus.util.FileUtils;
+
+import java.io.File;
+import java.util.Properties;
+
+/**
+ * SnapshotsPolicyTest
+ *
+ * @author <a href="mailto:joakime@apache.org">Joakim Erdfelt</a>
+ * @version $Id$
+ */
+public class SnapshotsPolicyTest
+ extends PlexusTestCase
+{
+ private static final String PATH_VERSION_METADATA = "org/apache/archiva/archiva-testable/1.0-SNAPSHOT/maven-metadata.xml";
+
+ private static final String PATH_PROJECT_METADATA = "org/apache/archiva/archiva-testable/maven-metadata.xml";
+
+ private static final String PATH_SNAPSHOT_ARTIFACT = "org/apache/archiva/archiva-testable/1.0-SNAPSHOT/archiva-testable-1.0-SNAPSHOT.jar";
+
+ private static final String PATH_RELEASE_ARTIFACT = "org/apache/archiva/archiva-testable/2.0/archiva-testable-2.0.jar";
+
+ private static final boolean WITH_LOCAL = true;
+
+ private static final boolean NO_LOCAL = false;
+
+ protected static final long ONE_SECOND = ( 1000 /* milliseconds */);
+
+ protected static final long ONE_MINUTE = ( ONE_SECOND * 60 );
+
+ protected static final long ONE_HOUR = ( ONE_MINUTE * 60 );
+
+ protected static final long ONE_DAY = ( ONE_HOUR * 24 );
+
+ protected static final long OVER_ONE_HOUR = ( ONE_HOUR + ONE_MINUTE );
+
+ protected static final long OVER_ONE_DAY = ( ONE_DAY + ONE_HOUR );
+
+ protected static final long OLDER = ( -1 );
+
+ protected static final long NEWER = 0;
+
+ private long generatedLocalFileUpdateDelta = 0;
+
+ public void testSnapshotPolicyDailyProjectMetadata()
+ throws Exception
+ {
+ // Pass the policy when working with metadata, no matter what.
+ assertSnapshotPolicy( SnapshotsPolicy.DAILY, PATH_PROJECT_METADATA, NO_LOCAL );
+ assertSnapshotPolicy( SnapshotsPolicy.DAILY, PATH_PROJECT_METADATA, WITH_LOCAL );
+
+ generatedLocalFileUpdateDelta = OVER_ONE_DAY;
+ assertSnapshotPolicy( SnapshotsPolicy.DAILY, PATH_PROJECT_METADATA, NO_LOCAL );
+ assertSnapshotPolicy( SnapshotsPolicy.DAILY, PATH_PROJECT_METADATA, WITH_LOCAL );
+
+ generatedLocalFileUpdateDelta = ( ONE_HOUR * 22 );
+ assertSnapshotPolicy( SnapshotsPolicy.DAILY, PATH_PROJECT_METADATA, NO_LOCAL );
+ assertSnapshotPolicy( SnapshotsPolicy.DAILY, PATH_PROJECT_METADATA, WITH_LOCAL );
+ }
+
+ public void testSnapshotPolicyDailyReleaseArtifact()
+ throws Exception
+ {
+ assertSnapshotPolicy( SnapshotsPolicy.DAILY, PATH_RELEASE_ARTIFACT, NO_LOCAL );
+ assertSnapshotPolicy( SnapshotsPolicy.DAILY, PATH_RELEASE_ARTIFACT, WITH_LOCAL );
+
+ generatedLocalFileUpdateDelta = OVER_ONE_DAY;
+ assertSnapshotPolicy( SnapshotsPolicy.DAILY, PATH_RELEASE_ARTIFACT, NO_LOCAL );
+ assertSnapshotPolicy( SnapshotsPolicy.DAILY, PATH_RELEASE_ARTIFACT, WITH_LOCAL );
+
+ generatedLocalFileUpdateDelta = ( ONE_HOUR * 22 );
+ assertSnapshotPolicy( SnapshotsPolicy.DAILY, PATH_RELEASE_ARTIFACT, NO_LOCAL );
+ assertSnapshotPolicy( SnapshotsPolicy.DAILY, PATH_RELEASE_ARTIFACT, WITH_LOCAL );
+ }
+
+ public void testSnapshotPolicyDailySnapshotArtifact()
+ throws Exception
+ {
+ assertSnapshotPolicy( SnapshotsPolicy.DAILY, PATH_SNAPSHOT_ARTIFACT, NO_LOCAL );
+ assertSnapshotPolicyViolation( SnapshotsPolicy.DAILY, PATH_SNAPSHOT_ARTIFACT, WITH_LOCAL );
+
+ generatedLocalFileUpdateDelta = OVER_ONE_DAY;
+ assertSnapshotPolicy( SnapshotsPolicy.DAILY, PATH_SNAPSHOT_ARTIFACT, NO_LOCAL );
+ assertSnapshotPolicy( SnapshotsPolicy.DAILY, PATH_SNAPSHOT_ARTIFACT, WITH_LOCAL );
+
+ generatedLocalFileUpdateDelta = ( ONE_HOUR * 22 );
+ assertSnapshotPolicy( SnapshotsPolicy.DAILY, PATH_SNAPSHOT_ARTIFACT, NO_LOCAL );
+ assertSnapshotPolicyViolation( SnapshotsPolicy.DAILY, PATH_SNAPSHOT_ARTIFACT, WITH_LOCAL );
+ }
+
+ public void testSnapshotPolicyDailyVersionedMetadata()
+ throws Exception
+ {
+ // Pass the policy when working with metadata, no matter what.
+ assertSnapshotPolicy( SnapshotsPolicy.DAILY, PATH_VERSION_METADATA, NO_LOCAL );
+ assertSnapshotPolicy( SnapshotsPolicy.DAILY, PATH_VERSION_METADATA, WITH_LOCAL );
+
+ generatedLocalFileUpdateDelta = OVER_ONE_DAY;
+ assertSnapshotPolicy( SnapshotsPolicy.DAILY, PATH_VERSION_METADATA, NO_LOCAL );
+ assertSnapshotPolicy( SnapshotsPolicy.DAILY, PATH_VERSION_METADATA, WITH_LOCAL );
+
+ generatedLocalFileUpdateDelta = ( ONE_HOUR * 22 );
+ assertSnapshotPolicy( SnapshotsPolicy.DAILY, PATH_VERSION_METADATA, NO_LOCAL );
+ assertSnapshotPolicy( SnapshotsPolicy.DAILY, PATH_VERSION_METADATA, WITH_LOCAL );
+ }
+
+ public void testSnapshotPolicyDisabledProjectMetadata()
+ throws Exception
+ {
+ // Pass the policy when working with metadata, no matter what.
+ assertSnapshotPolicy( SnapshotsPolicy.DISABLED, PATH_PROJECT_METADATA, NO_LOCAL );
+ assertSnapshotPolicy( SnapshotsPolicy.DISABLED, PATH_PROJECT_METADATA, WITH_LOCAL );
+ }
+
+ public void testSnapshotPolicyDisabledReleaseArtifact()
+ throws Exception
+ {
+ assertSnapshotPolicy( SnapshotsPolicy.DISABLED, PATH_RELEASE_ARTIFACT, NO_LOCAL );
+ assertSnapshotPolicy( SnapshotsPolicy.DISABLED, PATH_RELEASE_ARTIFACT, WITH_LOCAL );
+ }
+
+ public void testSnapshotPolicyDisabledSnapshotArtifact()
+ throws Exception
+ {
+ assertSnapshotPolicyViolation( SnapshotsPolicy.DISABLED, PATH_SNAPSHOT_ARTIFACT, NO_LOCAL );
+ assertSnapshotPolicyViolation( SnapshotsPolicy.DISABLED, PATH_SNAPSHOT_ARTIFACT, WITH_LOCAL );
+ }
+
+ public void testSnapshotPolicyDisabledVersionedMetadata()
+ throws Exception
+ {
+ // Pass the policy when working with metadata, no matter what.
+ assertSnapshotPolicy( SnapshotsPolicy.DISABLED, PATH_VERSION_METADATA, NO_LOCAL );
+ assertSnapshotPolicy( SnapshotsPolicy.DISABLED, PATH_VERSION_METADATA, WITH_LOCAL );
+ }
+
+ public void testSnapshotPolicyHourlyProjectMetadata()
+ throws Exception
+ {
+ // Pass the policy when working with metadata, no matter what.
+ assertSnapshotPolicy( SnapshotsPolicy.HOURLY, PATH_PROJECT_METADATA, NO_LOCAL );
+ assertSnapshotPolicy( SnapshotsPolicy.HOURLY, PATH_PROJECT_METADATA, WITH_LOCAL );
+
+ generatedLocalFileUpdateDelta = OVER_ONE_HOUR;
+ assertSnapshotPolicy( SnapshotsPolicy.HOURLY, PATH_PROJECT_METADATA, NO_LOCAL );
+ assertSnapshotPolicy( SnapshotsPolicy.HOURLY, PATH_PROJECT_METADATA, WITH_LOCAL );
+
+ generatedLocalFileUpdateDelta = ( ONE_MINUTE * 45 );
+ assertSnapshotPolicy( SnapshotsPolicy.HOURLY, PATH_PROJECT_METADATA, NO_LOCAL );
+ assertSnapshotPolicy( SnapshotsPolicy.HOURLY, PATH_PROJECT_METADATA, WITH_LOCAL );
+ }
+
+ public void testSnapshotPolicyHourlyReleaseArtifact()
+ throws Exception
+ {
+ assertSnapshotPolicy( SnapshotsPolicy.HOURLY, PATH_RELEASE_ARTIFACT, NO_LOCAL );
+ assertSnapshotPolicy( SnapshotsPolicy.HOURLY, PATH_RELEASE_ARTIFACT, WITH_LOCAL );
+
+ generatedLocalFileUpdateDelta = OVER_ONE_HOUR;
+ assertSnapshotPolicy( SnapshotsPolicy.HOURLY, PATH_RELEASE_ARTIFACT, NO_LOCAL );
+ assertSnapshotPolicy( SnapshotsPolicy.HOURLY, PATH_RELEASE_ARTIFACT, WITH_LOCAL );
+
+ generatedLocalFileUpdateDelta = ( ONE_MINUTE * 45 );
+ assertSnapshotPolicy( SnapshotsPolicy.HOURLY, PATH_RELEASE_ARTIFACT, NO_LOCAL );
+ assertSnapshotPolicy( SnapshotsPolicy.HOURLY, PATH_RELEASE_ARTIFACT, WITH_LOCAL );
+ }
+
+ public void testSnapshotPolicyHourlySnapshotArtifact()
+ throws Exception
+ {
+ assertSnapshotPolicy( SnapshotsPolicy.HOURLY, PATH_SNAPSHOT_ARTIFACT, NO_LOCAL );
+ assertSnapshotPolicyViolation( SnapshotsPolicy.HOURLY, PATH_SNAPSHOT_ARTIFACT, WITH_LOCAL );
+
+ generatedLocalFileUpdateDelta = OVER_ONE_HOUR;
+ assertSnapshotPolicy( SnapshotsPolicy.HOURLY, PATH_SNAPSHOT_ARTIFACT, NO_LOCAL );
+ assertSnapshotPolicy( SnapshotsPolicy.HOURLY, PATH_SNAPSHOT_ARTIFACT, WITH_LOCAL );
+
+ generatedLocalFileUpdateDelta = ( ONE_MINUTE * 45 );
+ assertSnapshotPolicy( SnapshotsPolicy.HOURLY, PATH_SNAPSHOT_ARTIFACT, NO_LOCAL );
+ assertSnapshotPolicyViolation( SnapshotsPolicy.HOURLY, PATH_SNAPSHOT_ARTIFACT, WITH_LOCAL );
+ }
+
+ public void testSnapshotPolicyHourlyVersionedMetadata()
+ throws Exception
+ {
+ // Pass the policy when working with metadata, no matter what.
+ assertSnapshotPolicy( SnapshotsPolicy.HOURLY, PATH_VERSION_METADATA, NO_LOCAL );
+ assertSnapshotPolicy( SnapshotsPolicy.HOURLY, PATH_VERSION_METADATA, WITH_LOCAL );
+
+ generatedLocalFileUpdateDelta = OVER_ONE_HOUR;
+ assertSnapshotPolicy( SnapshotsPolicy.HOURLY, PATH_VERSION_METADATA, NO_LOCAL );
+ assertSnapshotPolicy( SnapshotsPolicy.HOURLY, PATH_VERSION_METADATA, WITH_LOCAL );
+
+ generatedLocalFileUpdateDelta = ( ONE_MINUTE * 45 );
+ assertSnapshotPolicy( SnapshotsPolicy.HOURLY, PATH_VERSION_METADATA, NO_LOCAL );
+ assertSnapshotPolicy( SnapshotsPolicy.HOURLY, PATH_VERSION_METADATA, WITH_LOCAL );
+ }
+
+ public void testSnapshotPolicyIgnoredProjectMetadata()
+ throws Exception
+ {
+ // Pass the policy when working with metadata, no matter what.
+ assertSnapshotPolicy( SnapshotsPolicy.IGNORED, PATH_PROJECT_METADATA, NO_LOCAL );
+ assertSnapshotPolicy( SnapshotsPolicy.IGNORED, PATH_PROJECT_METADATA, WITH_LOCAL );
+ }
+
+ public void testSnapshotPolicyIgnoredReleaseArtifact()
+ throws Exception
+ {
+ assertSnapshotPolicy( SnapshotsPolicy.IGNORED, PATH_RELEASE_ARTIFACT, NO_LOCAL );
+ assertSnapshotPolicy( SnapshotsPolicy.IGNORED, PATH_RELEASE_ARTIFACT, WITH_LOCAL );
+ }
+
+ public void testSnapshotPolicyIgnoredSnapshotArtifact()
+ throws Exception
+ {
+ assertSnapshotPolicy( SnapshotsPolicy.IGNORED, PATH_SNAPSHOT_ARTIFACT, NO_LOCAL );
+ assertSnapshotPolicy( SnapshotsPolicy.IGNORED, PATH_SNAPSHOT_ARTIFACT, WITH_LOCAL );
+ }
+
+ public void testSnapshotPolicyIgnoredVersionedMetadata()
+ throws Exception
+ {
+ // Pass the policy when working with metadata, no matter what.
+ assertSnapshotPolicy( SnapshotsPolicy.IGNORED, PATH_VERSION_METADATA, NO_LOCAL );
+ assertSnapshotPolicy( SnapshotsPolicy.IGNORED, PATH_VERSION_METADATA, WITH_LOCAL );
+ }
+
+ public void testSnapshotPolicyOnceProjectMetadata()
+ throws Exception
+ {
+ // Pass the policy when working with metadata, no matter what.
+ assertSnapshotPolicy( SnapshotsPolicy.ONCE, PATH_PROJECT_METADATA, NO_LOCAL );
+ assertSnapshotPolicy( SnapshotsPolicy.ONCE, PATH_PROJECT_METADATA, WITH_LOCAL );
+ }
+
+ public void testSnapshotPolicyOnceReleaseArtifact()
+ throws Exception
+ {
+ assertSnapshotPolicy( SnapshotsPolicy.ONCE, PATH_RELEASE_ARTIFACT, NO_LOCAL );
+ assertSnapshotPolicy( SnapshotsPolicy.ONCE, PATH_RELEASE_ARTIFACT, WITH_LOCAL );
+ }
+
+ public void testSnapshotPolicyOnceSnapshotArtifact()
+ throws Exception
+ {
+ assertSnapshotPolicy( SnapshotsPolicy.ONCE, PATH_SNAPSHOT_ARTIFACT, NO_LOCAL );
+ assertSnapshotPolicyViolation( SnapshotsPolicy.ONCE, PATH_SNAPSHOT_ARTIFACT, WITH_LOCAL );
+ }
+
+ public void testSnapshotPolicyOnceVersionedMetadata()
+ throws Exception
+ {
+ // Pass the policy when working with metadata, no matter what.
+ assertSnapshotPolicy( SnapshotsPolicy.ONCE, PATH_VERSION_METADATA, NO_LOCAL );
+ assertSnapshotPolicy( SnapshotsPolicy.ONCE, PATH_VERSION_METADATA, WITH_LOCAL );
+ }
+
+ private void assertSnapshotPolicy( String setting, String path, boolean createLocalFile )
+ throws Exception
+ {
+ PreDownloadPolicy policy = lookupPolicy();
+ Properties request = new Properties();
+ request.setProperty( "filetype", path.endsWith( "/maven-metadata.xml" ) ? "metadata" : "artifact" );
+
+ if ( path.contains( "1.0-SNAPSHOT" ) )
+ {
+ request.setProperty( "version", "1.0-SNAPSHOT" );
+ }
+
+ if ( path.contains( "2.0" ) )
+ {
+ request.setProperty( "version", "2.0" );
+ }
+
+ File targetDir = getTestFile( "target/test-policy/" );
+ File localFile = new File( targetDir, path );
+
+ if ( localFile.exists() )
+ {
+ localFile.delete();
+ }
+
+ if ( createLocalFile )
+ {
+ localFile.getParentFile().mkdirs();
+ FileUtils.fileWrite( localFile.getAbsolutePath(), "random-junk" );
+ localFile.setLastModified( localFile.lastModified() - generatedLocalFileUpdateDelta );
+ }
+
+ policy.applyPolicy( setting, request, localFile );
+ }
+
+ private void assertSnapshotPolicyViolation( String setting, String path, boolean createLocalFile )
+ throws Exception
+ {
+ try
+ {
+ assertSnapshotPolicy( setting, path, createLocalFile );
+ fail( "Expected a PolicyViolationException." );
+ }
+ catch ( PolicyViolationException e )
+ {
+ // expected path.
+ }
+ }
+
+ private PreDownloadPolicy lookupPolicy()
+ throws Exception
+ {
+ PreDownloadPolicy policy = (PreDownloadPolicy) lookup( PreDownloadPolicy.class.getName(), "snapshots" );
+ assertNotNull( policy );
+ return policy;
+ }
+
+ @Override
+ protected void setUp()
+ throws Exception
+ {
+ super.setUp();
+
+ // reset delta to 0.
+ generatedLocalFileUpdateDelta = 0;
+ }
+}
diff --git a/archiva-base/archiva-proxy/src/main/java/org/apache/maven/archiva/proxy/DefaultRepositoryProxyConnectors.java b/archiva-base/archiva-proxy/src/main/java/org/apache/maven/archiva/proxy/DefaultRepositoryProxyConnectors.java
index b2851c7b3..c2946b33c 100644
--- a/archiva-base/archiva-proxy/src/main/java/org/apache/maven/archiva/proxy/DefaultRepositoryProxyConnectors.java
+++ b/archiva-base/archiva-proxy/src/main/java/org/apache/maven/archiva/proxy/DefaultRepositoryProxyConnectors.java
@@ -32,6 +32,8 @@ import org.apache.maven.archiva.model.ProjectReference;
import org.apache.maven.archiva.model.RepositoryURL;
import org.apache.maven.archiva.model.VersionedReference;
import org.apache.maven.archiva.policies.DownloadPolicy;
+import org.apache.maven.archiva.policies.PolicyConfigurationException;
+import org.apache.maven.archiva.policies.PolicyViolationException;
import org.apache.maven.archiva.policies.PostDownloadPolicy;
import org.apache.maven.archiva.policies.PreDownloadPolicy;
import org.apache.maven.archiva.policies.urlcache.UrlFailureCache;
@@ -140,6 +142,7 @@ public class DefaultRepositoryProxyConnectors
File localFile = toLocalFile( repository, artifact );
Properties requestProperties = new Properties();
+ requestProperties.setProperty( "filetype", "artifact" );
requestProperties.setProperty( "version", artifact.getVersion() );
List<ProxyConnector> connectors = getProxyConnectors( repository );
@@ -186,6 +189,7 @@ public class DefaultRepositoryProxyConnectors
File localFile = toLocalFile( repository, metadata );
Properties requestProperties = new Properties();
+ requestProperties.setProperty( "filetype", "metadata" );
boolean metadataNeedsUpdating = false;
long originalTimestamp = getLastModified( localFile );
@@ -298,6 +302,7 @@ public class DefaultRepositoryProxyConnectors
File localFile = toLocalFile( repository, metadata );
Properties requestProperties = new Properties();
+ requestProperties.setProperty( "filetype", "metadata" );
boolean metadataNeedsUpdating = false;
long originalTimestamp = getLastModified( localFile );
@@ -480,15 +485,20 @@ public class DefaultRepositoryProxyConnectors
}
// Handle pre-download policy
- if ( !applyPolicies( this.preDownloadPolicies, connector.getPolicies(), requestProperties, localFile ) )
+ try
{
- getLogger().debug( "Failed pre-download policies - " + localFile.getAbsolutePath() );
-
+ validatePolicies( this.preDownloadPolicies, connector.getPolicies(), requestProperties, localFile );
+ }
+ catch ( PolicyViolationException e )
+ {
+ String emsg = "Transfer not attempted on " + url + " : " + e.getMessage();
if ( fileExists( localFile ) )
{
+ getLogger().info( emsg + ": using already present local file." );
return localFile;
}
+ getLogger().info( emsg );
return null;
}
@@ -543,10 +553,13 @@ public class DefaultRepositoryProxyConnectors
}
// Handle post-download policies.
- if ( !applyPolicies( this.postDownloadPolicies, connector.getPolicies(), requestProperties, localFile ) )
+ try
{
- getLogger().debug( "Failed post-download policies - " + localFile.getAbsolutePath() );
-
+ validatePolicies( this.postDownloadPolicies, connector.getPolicies(), requestProperties, localFile );
+ }
+ catch ( PolicyViolationException e )
+ {
+ getLogger().info( "Transfer invalidated from " + url + " : " + e.getMessage() );
if ( fileExists( localFile ) )
{
return localFile;
@@ -697,10 +710,10 @@ public class DefaultRepositoryProxyConnectors
* @param settings the map of settings for the policies to execute. (Map of String policy keys, to String policy setting)
* @param request the request properties (utilized by the {@link DownloadPolicy#applyPolicy(String,Properties,File)})
* @param localFile the local file (utilized by the {@link DownloadPolicy#applyPolicy(String,Properties,File)})
- * @return true if all of the policies passed, false if a policy failed.
*/
- private boolean applyPolicies( Map<String, ? extends DownloadPolicy> policies, Map<String, String> settings,
+ private void validatePolicies( Map<String, ? extends DownloadPolicy> policies, Map<String, String> settings,
Properties request, File localFile )
+ throws PolicyViolationException
{
for ( Entry<String, ? extends DownloadPolicy> entry : policies.entrySet() )
{
@@ -710,13 +723,15 @@ public class DefaultRepositoryProxyConnectors
String setting = StringUtils.defaultString( (String) settings.get( key ), defaultSetting );
getLogger().debug( "Applying [" + key + "] policy with [" + setting + "]" );
- if ( !policy.applyPolicy( setting, request, localFile ) )
+ try
{
- getLogger().debug( "Didn't pass the [" + key + "] policy." );
- return false;
+ policy.applyPolicy( setting, request, localFile );
+ }
+ catch ( PolicyConfigurationException e )
+ {
+ getLogger().error( e.getMessage(), e );
}
}
- return true;
}
/**