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") ));
+    }    
+
 }