You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by ep...@apache.org on 2005/12/07 07:06:37 UTC
svn commit: r354729 - in
/maven/repository-manager/trunk/maven-repository-reports-standard/src:
main/java/org/apache/maven/repository/reporting/
main/resources/META-INF/plexus/
test/java/org/apache/maven/repository/reporting/
Author: epunzalan
Date: Tue Dec 6 22:06:27 2005
New Revision: 354729
URL: http://svn.apache.org/viewcvs?rev=354729&view=rev
Log:
PR: MRM-17
Submitted by: Maria Odea Ching
Applied patch for metadata checksum validation
Modified:
maven/repository-manager/trunk/maven-repository-reports-standard/src/main/java/org/apache/maven/repository/reporting/ChecksumArtifactReporter.java
maven/repository-manager/trunk/maven-repository-reports-standard/src/main/resources/META-INF/plexus/components.xml
maven/repository-manager/trunk/maven-repository-reports-standard/src/test/java/org/apache/maven/repository/reporting/AbstractChecksumArtifactReporterTest.java
maven/repository-manager/trunk/maven-repository-reports-standard/src/test/java/org/apache/maven/repository/reporting/ChecksumArtifactReporterTest.java
Modified: maven/repository-manager/trunk/maven-repository-reports-standard/src/main/java/org/apache/maven/repository/reporting/ChecksumArtifactReporter.java
URL: http://svn.apache.org/viewcvs/maven/repository-manager/trunk/maven-repository-reports-standard/src/main/java/org/apache/maven/repository/reporting/ChecksumArtifactReporter.java?rev=354729&r1=354728&r2=354729&view=diff
==============================================================================
--- maven/repository-manager/trunk/maven-repository-reports-standard/src/main/java/org/apache/maven/repository/reporting/ChecksumArtifactReporter.java (original)
+++ maven/repository-manager/trunk/maven-repository-reports-standard/src/main/java/org/apache/maven/repository/reporting/ChecksumArtifactReporter.java Tue Dec 6 22:06:27 2005
@@ -34,6 +34,9 @@
/**
* This class reports invalid and mismatched checksums of artifacts and metadata files.
* It validates MD5 and SHA-1 chacksums.
+ *
+ * @TODO
+ * - Validate using remote repository.
*/
public class ChecksumArtifactReporter
implements ArtifactReportProcessor, MetadataReportProcessor
@@ -54,16 +57,22 @@
public void processArtifact( Model model, Artifact artifact, ArtifactReporter reporter,
ArtifactRepository repository )
{
+ System.out.println( " " );
+ System.out
+ .println( "===================================== +++++ PROCESS ARTIFACT +++++ ====================================" );
String artifactUrl = "";
String repositoryUrl = repository.getUrl();
+ System.out.println("REPOSITORY PROTOCOL ------>>>> " + repository.getProtocol());
artifactUrl = repositoryUrl + artifact.getGroupId() + "/" + artifact.getArtifactId() + "/"
+ artifact.getBaseVersion() + "/" + artifact.getArtifactId() + "-" + artifact.getBaseVersion() + "."
+ artifact.getType();
+ //System.out.println("ARTIFACT URL ------->>>> " + artifactUrl);
//check if checksum files exist
boolean md5Exists = getMD5File( artifactUrl );
boolean sha1Exists = getSHA1File( artifactUrl );
+
if ( md5Exists )
{
if ( validateChecksum( artifactUrl, "MD5" ) )
@@ -95,37 +104,63 @@
*/
public void processMetadata( RepositoryMetadata metadata, ArtifactRepository repository, ArtifactReporter reporter )
{
+ System.out.println( " " );
+ System.out
+ .println( "====================================== +++++ PROCESS METADATA +++++ ==============================" );
+
+ String metadataUrl = "";
+ String repositoryUrl = repository.getUrl();
+ String filename = metadata.getRemoteFilename();
+
+ //version metadata
+ if ( metadata.storedInArtifactVersionDirectory() == true && metadata.storedInGroupDirectory() == false )
+ {
+ metadataUrl = repositoryUrl + metadata.getGroupId() + "/" + metadata.getArtifactId() + "/"
+ + metadata.getBaseVersion() + "/";
+ //group metadata
+ }
+ else if ( metadata.storedInArtifactVersionDirectory() == false && metadata.storedInGroupDirectory() == true )
+ {
+ metadataUrl = repositoryUrl + metadata.getGroupId() + "/";
+ //artifact metadata
+ }
+ else
+ {
+ metadataUrl = repositoryUrl + metadata.getGroupId() + "/" + metadata.getArtifactId() + "/";
+ }
+
+ //add the file name of the metadata
+ metadataUrl = metadataUrl + filename;
+ //System.out.println( "METADATA URL -------> " + metadataUrl );
+
+ //check if checksum files exist
+ boolean md5Exists = getMD5File( metadataUrl );
+ boolean sha1Exists = getSHA1File( metadataUrl );
+
+ if ( md5Exists )
+ {
+ if ( validateChecksum( metadataUrl, "MD5" ) )
+ {
+ reporter.addSuccess( metadata );
+ }
+ else
+ {
+ reporter.addFailure( metadata, "MD5 checksum does not match." );
+ }
+ }
+
+ if ( sha1Exists )
+ {
+ if ( validateChecksum( metadataUrl, "SHA-1" ) )
+ {
+ reporter.addSuccess( metadata );
+ }
+ else
+ {
+ reporter.addFailure( metadata, "SHA-1 checksum does not match." );
+ }
+ }
- /*
- String metadataUrl = "";
- String filename = metadata.getLocalFilename(repository);
- String repositoryUrl = repository.getUrl();
-
- String groupId, artifactId, version;
- version = metadata.getBaseVersion();
- groupId = metadata.getGroupId();
- artifactId = metadata.getArtifactId();
-
- //version metadata
- if(metadata.storedInArtifactVersionDirectory() == true && metadata.storedInGroupDirectory() == false){
- metadataUrl = repositoryUrl + groupId + "/" + artifactId + "/" + version;
- //group metadata
- }else if(metadata.storedInArtifactVersionDirectory() == false && metadata.storedInGroupDirectory() == true){
- metadataUrl = repositoryUrl + groupId;
- //artifact metadata
- }else{
- metadataUrl = repositoryUrl + groupId + "/" + artifactId;
- }
-
- metadataUrl = metadataUrl + "/" + filename;
- boolean valid = validateChecksum(metadataUrl);
-
- if(!valid){
- reporter.addFailure(metadata, "Mismatched metadata checksum.");
- }else{
- reporter.addSuccess(metadata);
- }
- */
}
/**
@@ -138,6 +173,7 @@
try
{
md5InputStream = new FileInputStream( filename + ".md5" );
+ md5InputStream.close();
}
catch ( Exception e )
{
@@ -156,6 +192,7 @@
try
{
sha1InputStream = new FileInputStream( filename + ".sha1" );
+ sha1InputStream.close();
}
catch ( Exception e )
{
Modified: maven/repository-manager/trunk/maven-repository-reports-standard/src/main/resources/META-INF/plexus/components.xml
URL: http://svn.apache.org/viewcvs/maven/repository-manager/trunk/maven-repository-reports-standard/src/main/resources/META-INF/plexus/components.xml?rev=354729&r1=354728&r2=354729&view=diff
==============================================================================
--- maven/repository-manager/trunk/maven-repository-reports-standard/src/main/resources/META-INF/plexus/components.xml (original)
+++ maven/repository-manager/trunk/maven-repository-reports-standard/src/main/resources/META-INF/plexus/components.xml Tue Dec 6 22:06:27 2005
@@ -23,5 +23,11 @@
<implementation>org.apache.maven.repository.reporting.ChecksumArtifactReporter</implementation>
<instantiation-strategy>per-lookup</instantiation-strategy>
</component>
+ <component>
+ <role>org.apache.maven.repository.reporting.MetadataReportProcessor</role>
+ <role-hint>checksum-metadata</role-hint>
+ <implementation>org.apache.maven.repository.reporting.ChecksumArtifactReporter</implementation>
+ <instantiation-strategy>per-lookup</instantiation-strategy>
+ </component>
</components>
</component-set>
Modified: maven/repository-manager/trunk/maven-repository-reports-standard/src/test/java/org/apache/maven/repository/reporting/AbstractChecksumArtifactReporterTest.java
URL: http://svn.apache.org/viewcvs/maven/repository-manager/trunk/maven-repository-reports-standard/src/test/java/org/apache/maven/repository/reporting/AbstractChecksumArtifactReporterTest.java?rev=354729&r1=354728&r2=354729&view=diff
==============================================================================
--- maven/repository-manager/trunk/maven-repository-reports-standard/src/test/java/org/apache/maven/repository/reporting/AbstractChecksumArtifactReporterTest.java (original)
+++ maven/repository-manager/trunk/maven-repository-reports-standard/src/test/java/org/apache/maven/repository/reporting/AbstractChecksumArtifactReporterTest.java Tue Dec 6 22:06:27 2005
@@ -33,6 +33,13 @@
import java.util.jar.JarEntry;
import java.util.jar.JarOutputStream;
+/**
+ * @TODO
+ * - Create more valid and invalid artifacts & metadata files for further testing.
+ *
+ * This class creates the artifact and metadata files used for testing the ChecksumArtifactReporter.
+ * It is extended by ChecksumArtifactReporterTest class.
+ */
public class AbstractChecksumArtifactReporterTest
extends AbstractRepositoryReportsTestCase
{
@@ -40,6 +47,8 @@
protected static final String[] invalidArtifactChecksumJars = { "invalidArtifact-1.0" };
+ protected static final String metadataChecksumFilename = "maven-metadata";
+
public AbstractChecksumArtifactReporterTest()
{
}
@@ -93,6 +102,29 @@
}
/**
+ * Create checksum files for metadata.
+ * @param type The type of checksum to be created. (Valid or invalid)
+ * @return
+ */
+ protected boolean createMetadataFile( String type )
+ {
+ boolean written = true;
+
+ //loop through the valid artifact names..
+ if ( type.equals( "VALID" ) )
+ {
+ writeMetadataFile( "checksumTest/validArtifact/1.0/", metadataChecksumFilename, "xml", true );
+
+ }
+ else if ( type.equals( "INVALID" ) )
+ {
+ writeMetadataFile( "checksumTest/invalidArtifact/1.0/", metadataChecksumFilename, "xml", false );
+ }
+
+ return written;
+ }
+
+ /**
* Create artifact together with its checksums.
* @param relativePath The groupId
* @param filename The filename of the artifact to be created.
@@ -102,12 +134,13 @@
*/
private boolean writeChecksumFile( String relativePath, String filename, String type, boolean isValid )
{
+ System.out.println( " " );
+ System.out.println( "========================= ARTIFACT CHECKSUM ==================================" );
//Initialize variables for creating jar files
FileOutputStream f = null;
JarOutputStream out = null;
String repoUrl = super.repository.getUrl();
-
try
{
String dirs = filename.replace( '-', '/' );
@@ -179,6 +212,76 @@
}
/**
+ * Create metadata file together with its checksums.
+ * @param relativePath The groupId
+ * @param filename The filename of the artifact to be created.
+ * @param type The file type (JAR)
+ * @param isValid Indicates whether the checksum to be created is valid or not.
+ * @return
+ */
+ private boolean writeMetadataFile( String relativePath, String filename, String type, boolean isValid )
+ {
+ System.out.println( " " );
+ System.out.println( "========================= METADATA CHECKSUM ==================================" );
+ try
+ {
+ //create checksum for the metadata file..
+ String repoUrl = super.repository.getUrl();
+
+ //System.out.println( "REPO URL :::: " + repoUrl );
+ String[] split1 = repoUrl.split( "file:/" );
+ split1[1] = split1[1] + "/";
+
+ // get the pre-created metadata file
+ String[] split = split1[1].split( "/repository" );
+ String url = split[0] + "/" + filename + "." + type;
+ //System.out.println( "URL of maven-metadata file :: " + url );
+
+ boolean copied = copyFile( url, split1[1] + relativePath + filename + "." + type );
+ //System.out.println( "META FILE COPIED ---->>> " + copied );
+
+ //Create md5 and sha-1 checksum files..
+ byte[] md5chk = createChecksum( split1[1] + relativePath + filename + "." + type, "MD5" );
+ byte[] sha1chk = createChecksum( split1[1] + relativePath + filename + "." + type, "SHA-1" );
+ System.out.println( "----- CREATED MD5 checksum ::: " + byteArrayToHexStr( md5chk ) );
+ System.out.println( "----- CREATED SHA-1 checksum ::: " + byteArrayToHexStr( sha1chk ) );
+
+ File file = null;
+
+ if ( md5chk != null )
+ {
+ file = new File( split1[1] + relativePath + filename + "." + type + ".md5" );
+ OutputStream os = new FileOutputStream( file );
+ OutputStreamWriter osw = new OutputStreamWriter( os );
+ if ( !isValid )
+ osw.write( byteArrayToHexStr( md5chk ) + "1" );
+ else
+ osw.write( byteArrayToHexStr( md5chk ) );
+ osw.close();
+ }
+
+ if ( sha1chk != null )
+ {
+ file = new File( split1[1] + relativePath + filename + "." + type + ".sha1" );
+ OutputStream os = new FileOutputStream( file );
+ OutputStreamWriter osw = new OutputStreamWriter( os );
+ if ( !isValid )
+ osw.write( byteArrayToHexStr( sha1chk ) + "2" );
+ else
+ osw.write( byteArrayToHexStr( sha1chk ) );
+ osw.close();
+ }
+ }
+ catch ( Exception e )
+ {
+ e.printStackTrace();
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
* Create the sample file that will be included in the jar.
* @param filename
* @return
@@ -255,6 +358,80 @@
}
return output.toUpperCase();
+ }
+
+ /**
+ * Copy created metadata file to the repository.
+ * @param srcUrl
+ * @param destUrl
+ * @return
+ */
+ private boolean copyFile( String srcUrl, String destUrl )
+ {
+ try
+ {
+ //source file
+ File src = new File( srcUrl );
+ //destination file
+ File dest = new File( destUrl );
+
+ InputStream in = new FileInputStream( src );
+ OutputStream out = new FileOutputStream( dest );
+
+ byte[] buf = new byte[1024];
+ int len;
+ while ( ( len = in.read( buf ) ) > 0 )
+ {
+ out.write( buf, 0, len );
+ }
+ in.close();
+ out.close();
+ }
+ catch ( Exception e )
+ {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Delete the test directory created in the repository.
+ * @param dirname The directory to be deleted.
+ * @return
+ */
+ protected boolean deleteTestDirectory( File dir )
+ {
+ boolean b = false;
+
+ if ( dir.isDirectory() == true )
+ {
+ if ( dir.listFiles().length > 0 )
+ {
+ File[] files = dir.listFiles();
+ for ( int i = 0; i < files.length; i++ )
+ {
+ b = this.deleteTestDirectory( files[i] );
+
+ //check if this is the last file in the directory
+ //delete the parent file
+ if((i == (files.length - 1)) && b == true){
+ String[] split = dir.getAbsolutePath().split("/repository");
+ if(!files[i].getParent().equals(split[0] + "/repository")){
+ b = this.deleteTestDirectory(new File(files[i].getParent()));
+ }
+ }
+ }
+
+ }else{
+ b = dir.delete();
+ }
+ }
+ else
+ {
+ b = dir.delete();
+ }
+
+ return b;
}
}
Modified: maven/repository-manager/trunk/maven-repository-reports-standard/src/test/java/org/apache/maven/repository/reporting/ChecksumArtifactReporterTest.java
URL: http://svn.apache.org/viewcvs/maven/repository-manager/trunk/maven-repository-reports-standard/src/test/java/org/apache/maven/repository/reporting/ChecksumArtifactReporterTest.java?rev=354729&r1=354728&r2=354729&view=diff
==============================================================================
--- maven/repository-manager/trunk/maven-repository-reports-standard/src/test/java/org/apache/maven/repository/reporting/ChecksumArtifactReporterTest.java (original)
+++ maven/repository-manager/trunk/maven-repository-reports-standard/src/test/java/org/apache/maven/repository/reporting/ChecksumArtifactReporterTest.java Tue Dec 6 22:06:27 2005
@@ -17,6 +17,8 @@
* limitations under the License.
*/
+import java.io.File;
+import java.util.Iterator;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.DefaultArtifact;
import org.apache.maven.artifact.handler.ArtifactHandler;
@@ -24,10 +26,18 @@
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.repository.DefaultArtifactRepository;
import org.apache.maven.artifact.repository.layout.DefaultRepositoryLayout;
+import org.apache.maven.artifact.repository.metadata.RepositoryMetadata;
+import org.apache.maven.artifact.repository.metadata.SnapshotArtifactRepositoryMetadata;
import org.apache.maven.artifact.versioning.VersionRange;
-import java.util.Iterator;
-
+/**
+ * @TODO
+ * - Test with multiple success and multiple failures
+ * - Test using remote repository
+ *
+ * This class tests the ChecksumArtifactReporter.
+ * It extends the AbstractChecksumArtifactReporterTest class.
+ */
public class ChecksumArtifactReporterTest
extends AbstractChecksumArtifactReporterTest
{
@@ -35,6 +45,8 @@
private ArtifactReporter reporter = new MockArtifactReporter();
+ private MetadataReportProcessor metadataReportProcessor;
+
public ChecksumArtifactReporterTest()
{
@@ -45,20 +57,39 @@
{
super.setUp();
artifactReportProcessor = (ArtifactReportProcessor) lookup( ArtifactReportProcessor.ROLE, "default" );
+ metadataReportProcessor = (MetadataReportProcessor) lookup( MetadataReportProcessor.ROLE, "checksum-metadata" );
+
+ // boolean b = createChecksumFile( "VALID" );
+ // b = createChecksumFile( "INVALID" );
+ // b = createMetadataFile( "VALID" );
+ // b = createMetadataFile( "INVALID" );
}
public void tearDown()
throws Exception
{
super.tearDown();
+ //String[] split = super.repository.getUrl().split("file:/");
+ //boolean b = deleteTestDirectory(new File(split[1] + "checksumTest") );
}
+ /**
+ * Test creation of artifact with checksum files.
+ *
+ */
public void testCreateChecksumFile()
{
assertTrue( createChecksumFile( "VALID" ) );
assertTrue( createChecksumFile( "INVALID" ) );
}
+ public void testCreateMetadataFile()
+ {
+ assertTrue( createMetadataFile( "VALID" ) );
+ assertTrue( createMetadataFile( "INVALID" ) );
+ }
+
+
/**
* Test the ChecksumArtifactReporter when the checksum files are valid.
*/
@@ -73,6 +104,13 @@
ArtifactRepository repository = new DefaultArtifactRepository( "repository", System.getProperty( "basedir" )
+ "/src/test/repository/", new DefaultRepositoryLayout() );
+ /* VersionRange version = VersionRange.createFromVersion("0.3-3");
+ Artifact artifact = new DefaultArtifact("HTTPClient", "HTTPClient", version, "compile", "jar", "",
+ handler);
+ ArtifactRepository repository = new DefaultArtifactRepository("remote-repo", "http://www.ibiblio.org/maven2/",
+ new DefaultRepositoryLayout());
+ */
+
artifactReportProcessor.processArtifact( null, artifact, reporter, repository );
Iterator iter = reporter.getArtifactSuccessIterator();
@@ -82,7 +120,7 @@
ArtifactResult result = (ArtifactResult) iter.next();
ctr++;
}
- System.out.println( "Number of success --- " + ctr );
+ System.out.println( "ARTIFACT Number of success --- " + ctr );
}
catch ( Exception e )
@@ -115,7 +153,38 @@
ArtifactResult result = (ArtifactResult) iter.next();
ctr++;
}
- System.out.println( "Number of failures --- " + ctr );
+ System.out.println( "ARTIFACT Number of failures --- " + ctr );
+
+ }
+ catch ( Exception e )
+ {
+ e.printStackTrace();
+ }
+ }
+
+ public void testChecksumMetadataReporterSuccess()
+ {
+
+ try
+ {
+ ArtifactHandler handler = new DefaultArtifactHandler( "jar" );
+ ArtifactRepository repository = new DefaultArtifactRepository( "repository", System.getProperty( "basedir" )
+ + "/src/test/repository/", new DefaultRepositoryLayout() );
+ VersionRange version = VersionRange.createFromVersion( "1.0" );
+ Artifact artifact = new DefaultArtifact( "checksumTest", "validArtifact", version, "compile", "jar", "",
+ handler );
+
+ RepositoryMetadata metadata = new SnapshotArtifactRepositoryMetadata( artifact );
+ metadataReportProcessor.processMetadata( metadata, repository, reporter );
+
+ Iterator iter = reporter.getRepositoryMetadataSuccessIterator();
+ int ctr = 0;
+ while ( iter.hasNext() )
+ {
+ RepositoryMetadataResult result = (RepositoryMetadataResult) iter.next();
+ ctr++;
+ }
+ System.out.println( "REPORT METADATA Number of success --- " + ctr );
}
catch ( Exception e )
@@ -123,4 +192,42 @@
e.printStackTrace();
}
}
+
+ public void testChecksumMetadataReporterFailure()
+ {
+
+ try
+ {
+ ArtifactHandler handler = new DefaultArtifactHandler( "jar" );
+ ArtifactRepository repository = new DefaultArtifactRepository( "repository", System.getProperty( "basedir" )
+ + "/src/test/repository/", new DefaultRepositoryLayout() );
+ VersionRange version = VersionRange.createFromVersion( "1.0" );
+ Artifact artifact = new DefaultArtifact( "checksumTest", "invalidArtifact", version, "compile", "jar", "",
+ handler );
+
+ RepositoryMetadata metadata = new SnapshotArtifactRepositoryMetadata( artifact );
+ metadataReportProcessor.processMetadata( metadata, repository, reporter );
+
+ Iterator iter = reporter.getRepositoryMetadataFailureIterator();
+ int ctr = 0;
+ while ( iter.hasNext() )
+ {
+ RepositoryMetadataResult result = (RepositoryMetadataResult) iter.next();
+ ctr++;
+ }
+ System.out.println( "REPORT METADATA Number of failures --- " + ctr );
+
+ }
+ catch ( Exception e )
+ {
+ e.printStackTrace();
+ }
+ }
+
+
+ public void testDeleteTestDirectory(){
+ String[] split = super.repository.getUrl().split("file:/");
+ assertTrue(deleteTestDirectory(new File(split[1] + "checksumTest") ));
+ }
+
}