Grabbed checksum check/update logic out of ChecksumPolicy into standalone Checksums component. Using new component in ChecksumPolicy and MetadatTools. git-svn-id: https://svn.apache.org/repos/asf/maven/archiva/trunk@583875 13f79535-47bb-0310-9956-ffa450edef68tags/archiva-1.0-beta-3
@@ -38,6 +38,10 @@ | |||
<groupId>commons-lang</groupId> | |||
<artifactId>commons-lang</artifactId> | |||
</dependency> | |||
<dependency> | |||
<groupId>org.codehaus.plexus</groupId> | |||
<artifactId>plexus-digest</artifactId> | |||
</dependency> | |||
<dependency> | |||
<groupId>org.codehaus.plexus</groupId> | |||
<artifactId>plexus-component-api</artifactId> |
@@ -0,0 +1,238 @@ | |||
package org.apache.maven.archiva.common.utils; | |||
/* | |||
* 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.digest.ChecksumFile; | |||
import org.codehaus.plexus.digest.Digester; | |||
import org.codehaus.plexus.digest.DigesterException; | |||
import org.codehaus.plexus.logging.AbstractLogEnabled; | |||
import java.io.File; | |||
import java.io.FileNotFoundException; | |||
import java.io.IOException; | |||
/** | |||
* Checksums utility component to validate or update checksums on Files. | |||
* | |||
* @author <a href="mailto:joakime@apache.org">Joakim Erdfelt</a> | |||
* @version $Id$ | |||
* | |||
* @plexus.component role="org.apache.maven.archiva.common.utils.Checksums" | |||
*/ | |||
public class Checksums | |||
extends AbstractLogEnabled | |||
{ | |||
/** | |||
* @plexus.requirement role-hint="sha1" | |||
*/ | |||
private Digester digestSha1; | |||
/** | |||
* @plexus.requirement role-hint="md5" | |||
*/ | |||
private Digester digestMd5; | |||
/** | |||
* @plexus.requirement | |||
*/ | |||
private ChecksumFile checksumFile; | |||
public boolean check( File file ) | |||
{ | |||
boolean checksPass = true; | |||
File sha1File = getSha1File( file ); | |||
File md5File = getMd5File( file ); | |||
// Both files missing is a failure. | |||
if ( !sha1File.exists() && !md5File.exists() ) | |||
{ | |||
getLogger().error( "File " + file.getPath() + " has no checksum files (sha1 or md5)." ); | |||
checksPass = false; | |||
} | |||
if ( sha1File.exists() ) | |||
{ | |||
// Bad sha1 checksum is a failure. | |||
if ( !validateChecksum( sha1File, "sha1" ) ) | |||
{ | |||
getLogger().warn( "SHA1 is incorrect for " + file.getPath() ); | |||
checksPass = false; | |||
} | |||
} | |||
if ( md5File.exists() ) | |||
{ | |||
// Bad md5 checksum is a failure. | |||
if ( !validateChecksum( md5File, "md5" ) ) | |||
{ | |||
getLogger().warn( "MD5 is incorrect for " + file.getPath() ); | |||
checksPass = false; | |||
} | |||
} | |||
// TODO: eek! | |||
if ( !checksPass ) | |||
{ | |||
// On failure. delete files. | |||
if ( sha1File.exists() ) | |||
{ | |||
sha1File.delete(); | |||
} | |||
if ( md5File.exists() ) | |||
{ | |||
md5File.delete(); | |||
} | |||
file.delete(); | |||
} | |||
return checksPass; | |||
} | |||
public boolean update( File file ) | |||
{ | |||
boolean checksPass = true; | |||
File sha1File = getSha1File( file ); | |||
File md5File = getMd5File( file ); | |||
if ( !fixChecksum( file, sha1File, digestSha1 ) ) | |||
{ | |||
checksPass = false; | |||
} | |||
if ( !fixChecksum( file, md5File, digestMd5 ) ) | |||
{ | |||
checksPass = false; | |||
} | |||
return checksPass; | |||
} | |||
private boolean createChecksum( File localFile, Digester digester ) | |||
{ | |||
try | |||
{ | |||
checksumFile.createChecksum( localFile, digester ); | |||
return true; | |||
} | |||
catch ( DigesterException e ) | |||
{ | |||
getLogger().warn( "Unable to create " + digester.getFilenameExtension() + " file: " + e.getMessage(), e ); | |||
return false; | |||
} | |||
catch ( IOException e ) | |||
{ | |||
getLogger().warn( "Unable to create " + digester.getFilenameExtension() + " file: " + e.getMessage(), e ); | |||
return false; | |||
} | |||
} | |||
private boolean fixChecksum( File localFile, File hashFile, Digester digester ) | |||
{ | |||
String ext = digester.getFilenameExtension(); | |||
if ( !hashFile.getPath().endsWith( ext ) ) | |||
{ | |||
throw new IllegalArgumentException( "Cannot fix " + hashFile.getPath() + " using " + ext + " digester." ); | |||
} | |||
// If hashfile doesn't exist, create it. | |||
if ( !hashFile.exists() ) | |||
{ | |||
return createChecksum( localFile, digester ); | |||
} | |||
// Validate checksum, if bad, recreate it. | |||
try | |||
{ | |||
if ( checksumFile.isValidChecksum( hashFile ) ) | |||
{ | |||
getLogger().debug( "Valid checksum: " + hashFile.getPath() ); | |||
return true; | |||
} | |||
else | |||
{ | |||
getLogger().debug( "Not valid checksum: " + hashFile.getPath() ); | |||
return createChecksum( localFile, digester ); | |||
} | |||
} | |||
catch ( FileNotFoundException e ) | |||
{ | |||
getLogger().warn( "Unable to find " + ext + " file: " + hashFile.getAbsolutePath(), e ); | |||
return false; | |||
} | |||
catch ( DigesterException e ) | |||
{ | |||
getLogger().warn( "Unable to process " + ext + " file: " + hashFile.getAbsolutePath(), e ); | |||
return false; | |||
} | |||
catch ( IOException e ) | |||
{ | |||
getLogger().warn( "Unable to process " + ext + " file: " + hashFile.getAbsolutePath(), e ); | |||
return false; | |||
} | |||
} | |||
private File getMd5File( File file ) | |||
{ | |||
return new File( file.getAbsolutePath() + ".md5" ); | |||
} | |||
private File getSha1File( File file ) | |||
{ | |||
return new File( file.getAbsolutePath() + ".sha1" ); | |||
} | |||
private boolean validateChecksum( File hashFile, String type ) | |||
{ | |||
try | |||
{ | |||
boolean validity = checksumFile.isValidChecksum( hashFile ); | |||
if ( validity ) | |||
{ | |||
getLogger().debug( "Valid checksum: " + hashFile.getPath() ); | |||
} | |||
else | |||
{ | |||
getLogger().debug( "Not valid checksum: " + hashFile.getPath() ); | |||
} | |||
return validity; | |||
} | |||
catch ( FileNotFoundException e ) | |||
{ | |||
getLogger().warn( "Unable to find " + type + " file: " + hashFile.getAbsolutePath(), e ); | |||
return false; | |||
} | |||
catch ( DigesterException e ) | |||
{ | |||
getLogger().warn( "Unable to process " + type + " file: " + hashFile.getAbsolutePath(), e ); | |||
return false; | |||
} | |||
catch ( IOException e ) | |||
{ | |||
getLogger().warn( "Unable to process " + type + " file: " + hashFile.getAbsolutePath(), e ); | |||
return false; | |||
} | |||
} | |||
} |
@@ -1,43 +0,0 @@ | |||
package org.apache.maven.archiva.common; | |||
/* | |||
* 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 junit.framework.Test; | |||
import junit.framework.TestSuite; | |||
/** | |||
* AllTests | |||
* | |||
* @author <a href="mailto:joakime@apache.org">Joakim Erdfelt</a> | |||
* @version $Id$ | |||
*/ | |||
public class AllTests | |||
{ | |||
public static Test suite() | |||
{ | |||
TestSuite suite = new TestSuite( "Test for org.apache.maven.archiva.common" ); | |||
//$JUnit-BEGIN$ | |||
suite.addTest( org.apache.maven.archiva.common.utils.AllTests.suite() ); | |||
//$JUnit-END$ | |||
return suite; | |||
} | |||
} |
@@ -1,44 +0,0 @@ | |||
package org.apache.maven.archiva.common.utils; | |||
/* | |||
* 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 junit.framework.Test; | |||
import junit.framework.TestSuite; | |||
/** | |||
* AllTests | |||
* | |||
* @author <a href="mailto:joakime@apache.org">Joakim Erdfelt</a> | |||
* @version $Id$ | |||
*/ | |||
public class AllTests | |||
{ | |||
public static Test suite() | |||
{ | |||
TestSuite suite = new TestSuite( "Test for org.apache.maven.archiva.common.utils" ); | |||
//$JUnit-BEGIN$ | |||
suite.addTestSuite( PathUtilTest.class ); | |||
suite.addTestSuite( BaseFileTest.class ); | |||
//$JUnit-END$ | |||
return suite; | |||
} | |||
} |
@@ -0,0 +1,291 @@ | |||
package org.apache.maven.archiva.common.utils; | |||
/* | |||
* 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.BufferedReader; | |||
import java.io.File; | |||
import java.io.FileReader; | |||
/** | |||
* ChecksumsTest | |||
* | |||
* @author <a href="mailto:joakime@apache.org">Joakim Erdfelt</a> | |||
* @version $Id$ | |||
*/ | |||
public class ChecksumsTest | |||
extends PlexusTestCase | |||
{ | |||
private static final String GOOD = "good"; | |||
private static final String BAD = "bad"; | |||
public void testCheckOnFileOnly() | |||
throws Exception | |||
{ | |||
assertCheck( false, null, null ); | |||
} | |||
public void testCheckOnFileWithBadMd5AndBadSha1() | |||
throws Exception | |||
{ | |||
assertCheck( false, BAD, BAD ); | |||
} | |||
public void testCheckOnFileWithBadMd5AndGoodSha1() | |||
throws Exception | |||
{ | |||
assertCheck( false, BAD, GOOD ); | |||
} | |||
public void testCheckOnFileWithBadMd5Only() | |||
throws Exception | |||
{ | |||
assertCheck( false, BAD, null ); | |||
} | |||
public void testCheckOnFileWithBadSha1Only() | |||
throws Exception | |||
{ | |||
assertCheck( false, null, BAD ); | |||
} | |||
public void testCheckOnFileWithGoodMd5AndBadSha1() | |||
throws Exception | |||
{ | |||
assertCheck( false, GOOD, BAD ); | |||
} | |||
public void testCheckOnFileWithGoodMd5AndGoodSha1() | |||
throws Exception | |||
{ | |||
assertCheck( true, GOOD, GOOD ); | |||
} | |||
public void testCheckOnFileWithGoodMd5Only() | |||
throws Exception | |||
{ | |||
assertCheck( true, GOOD, null ); | |||
} | |||
public void testCheckOnFileWithGoodSha1Only() | |||
throws Exception | |||
{ | |||
assertCheck( true, null, GOOD ); | |||
} | |||
public void testUpdateOnFileOnly() | |||
throws Exception | |||
{ | |||
assertUpdate( true, null, null ); | |||
} | |||
public void testUpdateOnFileWithBadMd5AndBadSha1() | |||
throws Exception | |||
{ | |||
assertUpdate( true, BAD, BAD ); | |||
} | |||
public void testUpdateOnFileWithBadMd5AndGoodSha1() | |||
throws Exception | |||
{ | |||
assertUpdate( true, BAD, GOOD ); | |||
} | |||
public void testUpdateOnFileWithBadMd5Only() | |||
throws Exception | |||
{ | |||
assertUpdate( true, BAD, null ); | |||
} | |||
public void testUpdateOnFileWithBadSha1Only() | |||
throws Exception | |||
{ | |||
assertUpdate( true, null, BAD ); | |||
} | |||
public void testUpdateOnFileWithGoodMd5AndBadSha1() | |||
throws Exception | |||
{ | |||
assertUpdate( true, GOOD, BAD ); | |||
} | |||
public void testUpdateOnFileWithGoodMd5AndGoodSha1() | |||
throws Exception | |||
{ | |||
assertUpdate( true, GOOD, GOOD ); | |||
} | |||
public void testUpdateOnFileWithGoodMd5Only() | |||
throws Exception | |||
{ | |||
assertUpdate( true, GOOD, null ); | |||
} | |||
public void testUpdateOnFileWithGoodSha1Only() | |||
throws Exception | |||
{ | |||
assertUpdate( true, null, GOOD ); | |||
} | |||
private void assertCheck( boolean expectedResult, String md5State, String sha1State ) | |||
throws Exception | |||
{ | |||
Checksums checksums = lookupChecksums(); | |||
File localFile = createTestableFiles( md5State, sha1State ); | |||
boolean actualResult = checksums.check( localFile ); | |||
String msg = createMessage( "check", md5State, sha1State ); | |||
if ( actualResult == false ) | |||
{ | |||
assertFalse( msg + " local file should not exist:", localFile.exists() ); | |||
File md5File = new File( localFile.getAbsolutePath() + ".sha1" ); | |||
File sha1File = new File( localFile.getAbsolutePath() + ".md5" ); | |||
assertFalse( msg + " local md5 file should not exist:", md5File.exists() ); | |||
assertFalse( msg + " local sha1 file should not exist:", sha1File.exists() ); | |||
} | |||
assertEquals( msg, expectedResult, actualResult ); | |||
} | |||
private void assertUpdate( boolean expectedResult, String md5State, String sha1State ) | |||
throws Exception | |||
{ | |||
Checksums checksums = lookupChecksums(); | |||
File localFile = createTestableFiles( md5State, sha1State ); | |||
boolean actualResult = checksums.update( localFile ); | |||
String msg = createMessage( "update", md5State, sha1State ); | |||
assertEquals( msg, expectedResult, actualResult ); | |||
// End result should be legitimate SHA1 and MD5 files. | |||
File md5File = new File( localFile.getAbsolutePath() + ".md5" ); | |||
File sha1File = new File( localFile.getAbsolutePath() + ".sha1" ); | |||
assertTrue( "ChecksumPolicy.apply(FIX) md5 should exist.", md5File.exists() && md5File.isFile() ); | |||
assertTrue( "ChecksumPolicy.apply(FIX) sha1 should exist.", sha1File.exists() && sha1File.isFile() ); | |||
String actualMd5Contents = readChecksumFile( md5File ); | |||
String actualSha1Contents = readChecksumFile( sha1File ); | |||
String expectedMd5Contents = "360ccd01d8a0a2d94b86f9802c2fc548 artifact.jar"; | |||
String expectedSha1Contents = "7dd8929150664f182db60ad15f20359d875f059f artifact.jar"; | |||
assertEquals( msg + ": md5 contents:", expectedMd5Contents, actualMd5Contents ); | |||
assertEquals( msg + ": sha1 contents:", expectedSha1Contents, actualSha1Contents ); | |||
} | |||
/** | |||
* Read the first line from the checksum file, and return it (trimmed). | |||
*/ | |||
private String readChecksumFile( File checksumFile ) | |||
throws Exception | |||
{ | |||
FileReader freader = null; | |||
BufferedReader buf = null; | |||
try | |||
{ | |||
freader = new FileReader( checksumFile ); | |||
buf = new BufferedReader( freader ); | |||
return buf.readLine(); | |||
} | |||
finally | |||
{ | |||
if ( buf != null ) | |||
{ | |||
buf.close(); | |||
} | |||
if ( freader != null ) | |||
{ | |||
freader.close(); | |||
} | |||
} | |||
} | |||
private String createMessage( String method, String md5State, String sha1State ) | |||
{ | |||
StringBuffer msg = new StringBuffer(); | |||
msg.append( "Expected result of Checksums." ).append( method ); | |||
msg.append( "() when working with " ); | |||
if ( md5State == null ) | |||
{ | |||
msg.append( "NO" ); | |||
} | |||
else | |||
{ | |||
msg.append( "a " ).append( md5State.toUpperCase() ); | |||
} | |||
msg.append( " MD5 and " ); | |||
if ( sha1State == null ) | |||
{ | |||
msg.append( "NO" ); | |||
} | |||
else | |||
{ | |||
msg.append( "a " ).append( sha1State.toUpperCase() ); | |||
} | |||
msg.append( " SHA1:" ); | |||
return msg.toString(); | |||
} | |||
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() + "/" ); | |||
FileUtils.copyFileToDirectory( new File( sourceDir, "artifact.jar" ), destDir ); | |||
if ( md5State != null ) | |||
{ | |||
File md5File = new File( sourceDir, "artifact.jar.md5-" + md5State ); | |||
assertTrue( "Testable file exists: " + md5File.getName() + ":", md5File.exists() && md5File.isFile() ); | |||
File destFile = new File( destDir, "artifact.jar.md5" ); | |||
FileUtils.copyFile( md5File, destFile ); | |||
} | |||
if ( sha1State != null ) | |||
{ | |||
File sha1File = new File( sourceDir, "artifact.jar.sha1-" + sha1State ); | |||
assertTrue( "Testable file exists: " + sha1File.getName() + ":", sha1File.exists() && sha1File.isFile() ); | |||
File destFile = new File( destDir, "artifact.jar.sha1" ); | |||
FileUtils.copyFile( sha1File, destFile ); | |||
} | |||
File localFile = new File( destDir, "artifact.jar" ); | |||
return localFile; | |||
} | |||
private Checksums lookupChecksums() | |||
throws Exception | |||
{ | |||
Checksums policy = (Checksums) lookup( Checksums.class ); | |||
assertNotNull( policy ); | |||
return policy; | |||
} | |||
} |
@@ -0,0 +1 @@ | |||
444ccc111aaa222999888eee222fff00 artifact.jar |
@@ -0,0 +1 @@ | |||
360ccd01d8a0a2d94b86f9802c2fc548 artifact.jar |
@@ -0,0 +1 @@ | |||
ddd888999000444888bbbaaa555333999777eee0 artifact.jar |
@@ -0,0 +1 @@ | |||
7dd8929150664f182db60ad15f20359d875f059f artifact.jar |
@@ -36,10 +36,6 @@ | |||
<groupId>commons-lang</groupId> | |||
<artifactId>commons-lang</artifactId> | |||
</dependency> | |||
<dependency> | |||
<groupId>org.codehaus.plexus</groupId> | |||
<artifactId>plexus-digest</artifactId> | |||
</dependency> | |||
<dependency> | |||
<groupId>org.codehaus.plexus.cache</groupId> | |||
<artifactId>plexus-cache-ehcache</artifactId> |
@@ -19,14 +19,10 @@ package org.apache.maven.archiva.policies; | |||
* under the License. | |||
*/ | |||
import org.codehaus.plexus.digest.ChecksumFile; | |||
import org.codehaus.plexus.digest.Digester; | |||
import org.codehaus.plexus.digest.DigesterException; | |||
import org.apache.maven.archiva.common.utils.Checksums; | |||
import org.codehaus.plexus.logging.AbstractLogEnabled; | |||
import java.io.File; | |||
import java.io.FileNotFoundException; | |||
import java.io.IOException; | |||
import java.util.ArrayList; | |||
import java.util.List; | |||
import java.util.Properties; | |||
@@ -58,22 +54,12 @@ public class ChecksumPolicy | |||
*/ | |||
public static final String FIX = "fix"; | |||
/** | |||
* @plexus.requirement role-hint="sha1" | |||
*/ | |||
private Digester digestSha1; | |||
/** | |||
* @plexus.requirement role-hint="md5" | |||
*/ | |||
private Digester digestMd5; | |||
/** | |||
* @plexus.requirement | |||
*/ | |||
private ChecksumFile checksumFile; | |||
private Checksums checksums; | |||
private List options = new ArrayList(); | |||
private List<String> options = new ArrayList<String>(); | |||
public ChecksumPolicy() | |||
{ | |||
@@ -104,42 +90,14 @@ public class ChecksumPolicy | |||
return false; | |||
} | |||
File sha1File = new File( localFile.getAbsolutePath() + ".sha1" ); | |||
File md5File = new File( localFile.getAbsolutePath() + ".md5" ); | |||
if ( FAIL.equals( policySetting ) ) | |||
{ | |||
boolean checksPass = true; | |||
// Both files missing is a failure. | |||
if ( !sha1File.exists() && !md5File.exists() ) | |||
boolean checksPass = checksums.check( localFile ); | |||
if( ! checksPass ) | |||
{ | |||
getLogger().error( "File " + localFile.getPath() + " has no checksum files (sha1 or md5)." ); | |||
checksPass = false; | |||
} | |||
File sha1File = new File( localFile.getAbsolutePath() + ".sha1" ); | |||
File md5File = new File( localFile.getAbsolutePath() + ".md5" ); | |||
if ( sha1File.exists() ) | |||
{ | |||
// Bad sha1 checksum is a failure. | |||
if ( !validateChecksum( sha1File, "sha1" ) ) | |||
{ | |||
getLogger().warn( "SHA1 is incorrect for " + localFile.getPath() ); | |||
checksPass = false; | |||
} | |||
} | |||
if ( md5File.exists() ) | |||
{ | |||
// Bad md5 checksum is a failure. | |||
if ( !validateChecksum( md5File, "md5" ) ) | |||
{ | |||
getLogger().warn( "MD5 is incorrect for " + localFile.getPath() ); | |||
checksPass = false; | |||
} | |||
} | |||
if ( !checksPass ) | |||
{ | |||
// On failure. delete files. | |||
if ( sha1File.exists() ) | |||
{ | |||
@@ -159,122 +117,13 @@ public class ChecksumPolicy | |||
if ( FIX.equals( policySetting ) ) | |||
{ | |||
boolean checksPass = true; | |||
if ( !fixChecksum( localFile, sha1File, digestSha1 ) ) | |||
{ | |||
checksPass = false; | |||
} | |||
if ( !fixChecksum( localFile, md5File, digestMd5 ) ) | |||
{ | |||
checksPass = false; | |||
} | |||
return checksPass; | |||
return checksums.update( localFile ); | |||
} | |||
getLogger().error( "Unhandled policyCode [" + policySetting + "]" ); | |||
return false; | |||
} | |||
private boolean createChecksum( File localFile, Digester digester ) | |||
{ | |||
try | |||
{ | |||
checksumFile.createChecksum( localFile, digester ); | |||
return true; | |||
} | |||
catch ( DigesterException e ) | |||
{ | |||
getLogger().warn( "Unable to create " + digester.getFilenameExtension() + " file: " + e.getMessage(), e ); | |||
return false; | |||
} | |||
catch ( IOException e ) | |||
{ | |||
getLogger().warn( "Unable to create " + digester.getFilenameExtension() + " file: " + e.getMessage(), e ); | |||
return false; | |||
} | |||
} | |||
private boolean fixChecksum( File localFile, File hashFile, Digester digester ) | |||
{ | |||
String ext = digester.getFilenameExtension(); | |||
if ( !hashFile.getPath().endsWith( ext ) ) | |||
{ | |||
throw new IllegalArgumentException( "Cannot fix " + hashFile.getPath() + " using " + ext + " digester." ); | |||
} | |||
// If hashfile doesn't exist, create it. | |||
if ( !hashFile.exists() ) | |||
{ | |||
return createChecksum( localFile, digester ); | |||
} | |||
// Validate checksum, if bad, recreate it. | |||
try | |||
{ | |||
if ( checksumFile.isValidChecksum( hashFile ) ) | |||
{ | |||
getLogger().debug( "Valid checksum: " + hashFile.getPath() ); | |||
return true; | |||
} | |||
else | |||
{ | |||
getLogger().debug( "Not valid checksum: " + hashFile.getPath() ); | |||
return createChecksum( localFile, digester ); | |||
} | |||
} | |||
catch ( FileNotFoundException e ) | |||
{ | |||
getLogger().warn( "Unable to find " + ext + " file: " + hashFile.getAbsolutePath(), e ); | |||
return false; | |||
} | |||
catch ( DigesterException e ) | |||
{ | |||
getLogger().warn( "Unable to process " + ext + " file: " + hashFile.getAbsolutePath(), e ); | |||
return false; | |||
} | |||
catch ( IOException e ) | |||
{ | |||
getLogger().warn( "Unable to process " + ext + " file: " + hashFile.getAbsolutePath(), e ); | |||
return false; | |||
} | |||
} | |||
private boolean validateChecksum( File hashFile, String type ) | |||
{ | |||
try | |||
{ | |||
boolean validity = checksumFile.isValidChecksum( hashFile ); | |||
if ( validity ) | |||
{ | |||
getLogger().debug( "Valid checksum: " + hashFile.getPath() ); | |||
} | |||
else | |||
{ | |||
getLogger().debug( "Not valid checksum: " + hashFile.getPath() ); | |||
} | |||
return validity; | |||
} | |||
catch ( FileNotFoundException e ) | |||
{ | |||
getLogger().warn( "Unable to find " + type + " file: " + hashFile.getAbsolutePath(), e ); | |||
return false; | |||
} | |||
catch ( DigesterException e ) | |||
{ | |||
getLogger().warn( "Unable to process " + type + " file: " + hashFile.getAbsolutePath(), e ); | |||
return false; | |||
} | |||
catch ( IOException e ) | |||
{ | |||
getLogger().warn( "Unable to process " + type + " file: " + hashFile.getAbsolutePath(), e ); | |||
return false; | |||
} | |||
} | |||
public String getDefaultOption() | |||
{ | |||
return FIX; | |||
@@ -285,9 +134,8 @@ public class ChecksumPolicy | |||
return "checksum"; | |||
} | |||
public List getOptions() | |||
public List<String> getOptions() | |||
{ | |||
return options; | |||
} | |||
} |
@@ -20,6 +20,7 @@ import org.apache.commons.collections.CollectionUtils; | |||
import org.apache.commons.lang.StringUtils; | |||
import org.apache.commons.lang.math.NumberUtils; | |||
import org.apache.commons.lang.time.DateUtils; | |||
import org.apache.maven.archiva.common.utils.Checksums; | |||
import org.apache.maven.archiva.common.utils.PathUtil; | |||
import org.apache.maven.archiva.common.utils.VersionComparator; | |||
import org.apache.maven.archiva.common.utils.VersionUtil; | |||
@@ -88,6 +89,11 @@ public class MetadataTools | |||
* @plexus.requirement | |||
*/ | |||
private FileTypes filetypes; | |||
/** | |||
* @plexus.requirement | |||
*/ | |||
private Checksums checksums; | |||
private List<String> artifactPatterns; | |||
@@ -485,6 +491,7 @@ public class MetadataTools | |||
// Save the metadata model to disk. | |||
RepositoryMetadataWriter.write( metadata, metadataFile ); | |||
checksums.update( metadataFile ); | |||
} | |||
private Date toLastUpdatedDate( long lastUpdated ) | |||
@@ -656,6 +663,7 @@ public class MetadataTools | |||
// Save the metadata model to disk. | |||
RepositoryMetadataWriter.write( metadata, metadataFile ); | |||
checksums.update( metadataFile ); | |||
} | |||
private void initConfigVariables() |
@@ -34,6 +34,10 @@ | |||
<role>org.apache.maven.archiva.configuration.FileTypes</role> | |||
<field-name>filetypes</field-name> | |||
</requirement> | |||
<requirement> | |||
<role>org.apache.maven.archiva.common.utils.Checksums</role> | |||
<field-name>checksums</field-name> | |||
</requirement> | |||
<requirement> | |||
<role>org.apache.maven.archiva.configuration.ArchivaConfiguration</role> | |||
<role-hint>mock</role-hint> |