You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@archiva.apache.org by ma...@apache.org on 2022/04/16 17:07:35 UTC

[archiva] branch archiva-2.x updated: MRM-2028: Fixing errors when file does not exist

This is an automated email from the ASF dual-hosted git repository.

martin_s pushed a commit to branch archiva-2.x
in repository https://gitbox.apache.org/repos/asf/archiva.git


The following commit(s) were added to refs/heads/archiva-2.x by this push:
     new 762b72183 MRM-2028: Fixing errors when file does not exist
762b72183 is described below

commit 762b721833bbb8228b0103a60c960684ee61c510
Author: Martin Schreier <ma...@apache.org>
AuthorDate: Sat Apr 16 19:07:29 2022 +0200

    MRM-2028: Fixing errors when file does not exist
---
 .../functors/ConsumerWantsFilePredicate.java       |  2 +-
 .../core/ArtifactMissingChecksumsConsumer.java     | 66 ++++++++++++----------
 .../scanner/RepositoryScannerInstance.java         | 29 ++++++----
 .../functors/ConsumerProcessFileClosure.java       | 34 ++++++-----
 .../scanner/RepositoryContentConsumersTest.java    |  8 ++-
 pom.xml                                            |  4 ++
 6 files changed, 83 insertions(+), 60 deletions(-)

diff --git a/archiva-modules/archiva-base/archiva-consumers/archiva-consumer-api/src/main/java/org/apache/archiva/consumers/functors/ConsumerWantsFilePredicate.java b/archiva-modules/archiva-base/archiva-consumers/archiva-consumer-api/src/main/java/org/apache/archiva/consumers/functors/ConsumerWantsFilePredicate.java
index 07dc5276e..7c1910f57 100644
--- a/archiva-modules/archiva-base/archiva-consumers/archiva-consumer-api/src/main/java/org/apache/archiva/consumers/functors/ConsumerWantsFilePredicate.java
+++ b/archiva-modules/archiva-base/archiva-consumers/archiva-consumer-api/src/main/java/org/apache/archiva/consumers/functors/ConsumerWantsFilePredicate.java
@@ -128,7 +128,7 @@ public class ConsumerWantsFilePredicate
             {
                 if ( SelectorUtils.matchPath( pattern, relativePath, isCaseSensitive ) )
                 {
-                    // Definately does NOT WANT FILE.
+                    // Definitely does NOT WANT FILE.
                     return false;
                 }
             }
diff --git a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/archiva/consumers/core/ArtifactMissingChecksumsConsumer.java b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/archiva/consumers/core/ArtifactMissingChecksumsConsumer.java
index 9984b0b06..8865eeab9 100644
--- a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/archiva/consumers/core/ArtifactMissingChecksumsConsumer.java
+++ b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/archiva/consumers/core/ArtifactMissingChecksumsConsumer.java
@@ -155,47 +155,51 @@ public class ArtifactMissingChecksumsConsumer
         File artifactFile = new File( this.repositoryDir, path );
         File checksumFile = new File( this.repositoryDir, path + "." + checksumAlgorithm.getExt( ) );
 
-        if ( checksumFile.exists( ) )
+        // Checking for existence
+        if (artifactFile.exists())
         {
-            checksum = new ChecksummedFile( artifactFile );
-            try
+            if ( checksumFile.exists( ) )
             {
-                if ( !checksum.isValidChecksum( checksumAlgorithm ) )
+                checksum = new ChecksummedFile( artifactFile );
+                try
                 {
-                    checksum.fixChecksums( new ChecksumAlgorithm[]{checksumAlgorithm} );
-                    log.info( "Fixed checksum file {}", checksumFile.getAbsolutePath( ) );
-                    triggerConsumerInfo( "Fixed checksum file " + checksumFile.getAbsolutePath( ) );
+                    if ( !checksum.isValidChecksum( checksumAlgorithm ) )
+                    {
+                        checksum.fixChecksums( new ChecksumAlgorithm[]{checksumAlgorithm} );
+                        log.info( "Fixed checksum file {}", checksumFile.getAbsolutePath( ) );
+                        triggerConsumerInfo( "Fixed checksum file " + checksumFile.getAbsolutePath( ) );
+                    }
+                }
+                catch ( IOException e )
+                {
+                    log.error( "Cannot calculate checksum for file {} :", checksumFile, e );
+                    triggerConsumerError( TYPE_CHECKSUM_CANNOT_CALC, "Cannot calculate checksum for file " + checksumFile +
+                        ": " + e.getMessage( ) );
                 }
             }
-            catch ( IOException e )
-            {
-                log.error( "Cannot calculate checksum for file {} :", checksumFile, e );
-                triggerConsumerError( TYPE_CHECKSUM_CANNOT_CALC, "Cannot calculate checksum for file " + checksumFile +
-                    ": " + e.getMessage( ) );
-            }
-        }
-        else if ( !checksumFile.exists( ) )
-        {
-            checksum = new ChecksummedFile( artifactFile );
-            try
+            else if ( !checksumFile.exists( ) )
             {
-                checksum.createChecksum( checksumAlgorithm );
-                log.info( "Created missing checksum file {}", checksumFile.getAbsolutePath( ) );
-                triggerConsumerInfo( "Created missing checksum file " + checksumFile.getAbsolutePath( ) );
+                checksum = new ChecksummedFile( artifactFile );
+                try
+                {
+                    checksum.createChecksum( checksumAlgorithm );
+                    log.info( "Created missing checksum file {}", checksumFile.getAbsolutePath( ) );
+                    triggerConsumerInfo( "Created missing checksum file " + checksumFile.getAbsolutePath( ) );
+                }
+                catch ( IOException e )
+                {
+                    log.error( "Cannot create {} checksum for file {} :", checksumAlgorithm, artifactFile, e );
+                    triggerConsumerError( TYPE_CHECKSUM_CANNOT_CREATE, "Cannot create checksum for file " + checksumFile +
+                        ": " + e.getMessage( ) );
+                }
             }
-            catch ( IOException e )
+            else
             {
-                log.error( "Cannot create checksum for file {} :", checksumFile, e );
-                triggerConsumerError( TYPE_CHECKSUM_CANNOT_CREATE, "Cannot create checksum for file " + checksumFile +
-                    ": " + e.getMessage( ) );
+                log.warn( "Checksum file {} is not a file. ", checksumFile.getAbsolutePath( ) );
+                triggerConsumerWarning( TYPE_CHECKSUM_NOT_FILE,
+                    "Checksum file " + checksumFile.getAbsolutePath( ) + " is not a file." );
             }
         }
-        else
-        {
-            log.warn( "Checksum file {} is not a file. ", checksumFile.getAbsolutePath( ) );
-            triggerConsumerWarning( TYPE_CHECKSUM_NOT_FILE,
-                "Checksum file " + checksumFile.getAbsolutePath( ) + " is not a file." );
-        }
     }
 
     /*
diff --git a/archiva-modules/archiva-base/archiva-repository-scanner/src/main/java/org/apache/archiva/repository/scanner/RepositoryScannerInstance.java b/archiva-modules/archiva-base/archiva-repository-scanner/src/main/java/org/apache/archiva/repository/scanner/RepositoryScannerInstance.java
index 65cb6603c..cc9ae676b 100644
--- a/archiva-modules/archiva-base/archiva-repository-scanner/src/main/java/org/apache/archiva/repository/scanner/RepositoryScannerInstance.java
+++ b/archiva-modules/archiva-base/archiva-repository-scanner/src/main/java/org/apache/archiva/repository/scanner/RepositoryScannerInstance.java
@@ -150,22 +150,27 @@ public class RepositoryScannerInstance
         // consume files regardless - the predicate will check the timestamp
         BaseFile basefile = new BaseFile( repository.getLocation(), file );
 
-        // Timestamp finished points to the last successful scan, not this current one.
-        if ( file.lastModified() >= changesSince )
+        // Safety check, if a parallel process removes the file
+        if (basefile.exists())
         {
-            stats.increaseNewFileCount();
-        }
 
-        consumerProcessFile.setBasefile( basefile );
-        consumerWantsFile.setBasefile( basefile );
+            // Timestamp finished points to the last successful scan, not this current one.
+            if ( file.lastModified( ) >= changesSince )
+            {
+                stats.increaseNewFileCount( );
+            }
 
-        Closure processIfWanted = IfClosure.getInstance( consumerWantsFile, consumerProcessFile );
-        CollectionUtils.forAllDo( this.knownConsumers, processIfWanted );
+            consumerProcessFile.setBasefile( basefile );
+            consumerWantsFile.setBasefile( basefile );
 
-        if ( consumerWantsFile.getWantedFileCount() <= 0 )
-        {
-            // Nothing known processed this file.  It is invalid!
-            CollectionUtils.forAllDo( this.invalidConsumers, consumerProcessFile );
+            Closure processIfWanted = IfClosure.getInstance( consumerWantsFile, consumerProcessFile );
+            CollectionUtils.forAllDo( this.knownConsumers, processIfWanted );
+
+            if ( consumerWantsFile.getWantedFileCount( ) <= 0 )
+            {
+                // Nothing known processed this file.  It is invalid!
+                CollectionUtils.forAllDo( this.invalidConsumers, consumerProcessFile );
+            }
         }
     }
 
diff --git a/archiva-modules/archiva-base/archiva-repository-scanner/src/main/java/org/apache/archiva/repository/scanner/functors/ConsumerProcessFileClosure.java b/archiva-modules/archiva-base/archiva-repository-scanner/src/main/java/org/apache/archiva/repository/scanner/functors/ConsumerProcessFileClosure.java
index ca44dd9ba..794889b66 100644
--- a/archiva-modules/archiva-base/archiva-repository-scanner/src/main/java/org/apache/archiva/repository/scanner/functors/ConsumerProcessFileClosure.java
+++ b/archiva-modules/archiva-base/archiva-repository-scanner/src/main/java/org/apache/archiva/repository/scanner/functors/ConsumerProcessFileClosure.java
@@ -54,22 +54,26 @@ public class ConsumerProcessFileClosure
             String id = consumer.getId();
             try
             {
-                log.debug( "Sending to consumer: {}", id );
-
-                long startTime = System.currentTimeMillis();
-                consumer.processFile( basefile.getRelativePath(), executeOnEntireRepo );
-                long endTime = System.currentTimeMillis();
-
-                if ( consumerTimings != null )
-                {
-                    Long value = consumerTimings.get( id );
-                    consumerTimings.put( id, ( value != null ? value : 0 ) + endTime - startTime );
-                }
-
-                if ( consumerCounts != null )
+                // Safety check to avoid errors, if a parallel process removes files
+                if (basefile.exists())
                 {
-                    Long value = consumerCounts.get( id );
-                    consumerCounts.put( id, ( value != null ? value : 0 ) + 1 );
+                    log.debug( "Sending to consumer: {}", id );
+
+                    long startTime = System.currentTimeMillis( );
+                    consumer.processFile( basefile.getRelativePath( ), executeOnEntireRepo );
+                    long endTime = System.currentTimeMillis( );
+
+                    if ( consumerTimings != null )
+                    {
+                        Long value = consumerTimings.get( id );
+                        consumerTimings.put( id, ( value != null ? value : 0 ) + endTime - startTime );
+                    }
+
+                    if ( consumerCounts != null )
+                    {
+                        Long value = consumerCounts.get( id );
+                        consumerCounts.put( id, ( value != null ? value : 0 ) + 1 );
+                    }
                 }
             }
             catch ( Exception e )
diff --git a/archiva-modules/archiva-base/archiva-repository-scanner/src/test/java/org/apache/archiva/repository/scanner/RepositoryContentConsumersTest.java b/archiva-modules/archiva-base/archiva-repository-scanner/src/test/java/org/apache/archiva/repository/scanner/RepositoryContentConsumersTest.java
index db981234a..9f94f915a 100644
--- a/archiva-modules/archiva-base/archiva-repository-scanner/src/test/java/org/apache/archiva/repository/scanner/RepositoryContentConsumersTest.java
+++ b/archiva-modules/archiva-base/archiva-repository-scanner/src/test/java/org/apache/archiva/repository/scanner/RepositoryContentConsumersTest.java
@@ -26,6 +26,7 @@ import org.apache.archiva.configuration.ArchivaConfiguration;
 import org.apache.archiva.consumers.InvalidRepositoryContentConsumer;
 import org.apache.archiva.consumers.KnownRepositoryContentConsumer;
 import org.apache.archiva.test.utils.ArchivaSpringJUnit4ClassRunner;
+import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang.SystemUtils;
 import org.easymock.IMocksControl;
 import org.junit.Test;
@@ -272,7 +273,10 @@ public class RepositoryContentConsumersTest
         consumers.setSelectedInvalidConsumers( Collections.singletonList( selectedInvalidConsumer ) );
 
         ManagedRepository repo = createRepository( "id", "name", new File( "target/test-repo" ) );
-        File testFile = new File( "target/test-repo/path/to/test-file.txt" );
+        File testDir = new File( "target/test-repo/path/to" );
+        FileUtils.forceMkdir( testDir );
+        File testFile = new File( testDir, "test-file.txt" );
+        FileUtils.touch( testFile );
 
         Date startTime = new Date( System.currentTimeMillis() );
         startTime.setTime( 12345678 );
@@ -295,6 +299,8 @@ public class RepositoryContentConsumersTest
         invalidControl.reset();
 
         File notIncludedTestFile = new File( "target/test-repo/path/to/test-file.xml" );
+        FileUtils.touch( notIncludedTestFile );
+
 
         selectedKnownConsumer.beginScan( repo, startTime, false );
         expect( selectedKnownConsumer.getExcludes() ).andReturn( Collections.<String>emptyList() );
diff --git a/pom.xml b/pom.xml
index b675a8e1b..f63335bf8 100644
--- a/pom.xml
+++ b/pom.xml
@@ -48,6 +48,10 @@
   </scm>
 
   <properties>
+
+    <maven.compiler.source>8</maven.compiler.source>
+    <maven.compiler.target>8</maven.compiler.target>
+
     <commons-codec.version>1.6</commons-codec.version>
     <commons-collections.version>3.2.1</commons-collections.version>
     <commons-fileupload.version>1.2.2</commons-fileupload.version>