You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by mi...@apache.org on 2021/04/27 07:56:29 UTC

[maven-resolver] branch master updated: [MRESOLVER-172] Make TrackingFileManager shared singleton component

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

michaelo pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/maven-resolver.git


The following commit(s) were added to refs/heads/master by this push:
     new 693403e  [MRESOLVER-172] Make TrackingFileManager shared singleton component
693403e is described below

commit 693403ec9a55eeff87776cd4f39218c8e0b8af81
Author: Tamas Cservenak <ta...@cservenak.net>
AuthorDate: Tue Apr 27 09:20:14 2021 +0200

    [MRESOLVER-172] Make TrackingFileManager shared singleton component
    
    Step one is to make TrackingFileManager a shared component,
    also, using iface+defaultClass patter to add indirection possibilities
    here as well.
    
    This closes #98
---
 .../eclipse/aether/impl/DefaultServiceLocator.java |   3 +
 .../eclipse/aether/impl/guice/AetherModule.java    |   3 +
 ...anager.java => DefaultTrackingFileManager.java} |  19 ++--
 .../internal/impl/DefaultUpdateCheckManager.java   |  15 ++-
 .../impl/EnhancedLocalRepositoryManager.java       |  10 +-
 .../EnhancedLocalRepositoryManagerFactory.java     |  25 ++++-
 .../aether/internal/impl/TrackingFileManager.java  | 120 +--------------------
 .../internal/impl/DefaultArtifactResolverTest.java |   5 +-
 ...st.java => DefaultTrackingFileManagerTest.java} |  10 +-
 .../impl/DefaultUpdateCheckManagerTest.java        |   4 +-
 .../impl/EnhancedLocalRepositoryManagerTest.java   |   5 +-
 11 files changed, 78 insertions(+), 141 deletions(-)

diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/impl/DefaultServiceLocator.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/impl/DefaultServiceLocator.java
index a80b3a0..d838d76 100644
--- a/maven-resolver-impl/src/main/java/org/eclipse/aether/impl/DefaultServiceLocator.java
+++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/impl/DefaultServiceLocator.java
@@ -33,6 +33,8 @@ import static java.util.Objects.requireNonNull;
 import org.eclipse.aether.RepositorySystem;
 import org.eclipse.aether.internal.impl.DefaultArtifactResolver;
 import org.eclipse.aether.internal.impl.DefaultChecksumPolicyProvider;
+import org.eclipse.aether.internal.impl.DefaultTrackingFileManager;
+import org.eclipse.aether.internal.impl.TrackingFileManager;
 import org.eclipse.aether.internal.impl.collect.DefaultDependencyCollector;
 import org.eclipse.aether.internal.impl.DefaultDeployer;
 import org.eclipse.aether.internal.impl.DefaultFileProcessor;
@@ -217,6 +219,7 @@ public final class DefaultServiceLocator
         addService( LocalRepositoryManagerFactory.class, SimpleLocalRepositoryManagerFactory.class );
         addService( LocalRepositoryManagerFactory.class, EnhancedLocalRepositoryManagerFactory.class );
         addService( LoggerFactory.class, Slf4jLoggerFactory.class );
+        addService( TrackingFileManager.class, DefaultTrackingFileManager.class );
     }
 
     private <T> Entry<T> getEntry( Class<T> type, boolean create )
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/impl/guice/AetherModule.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/impl/guice/AetherModule.java
index 0558f28..0c9f6a5 100644
--- a/maven-resolver-impl/src/main/java/org/eclipse/aether/impl/guice/AetherModule.java
+++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/impl/guice/AetherModule.java
@@ -40,6 +40,8 @@ import org.eclipse.aether.impl.OfflineController;
 import org.eclipse.aether.impl.RemoteRepositoryManager;
 import org.eclipse.aether.impl.RepositoryConnectorProvider;
 import org.eclipse.aether.impl.RepositoryEventDispatcher;
+import org.eclipse.aether.internal.impl.DefaultTrackingFileManager;
+import org.eclipse.aether.internal.impl.TrackingFileManager;
 import org.eclipse.aether.internal.impl.synccontext.DefaultSyncContextFactory;
 import org.eclipse.aether.internal.impl.synccontext.GlobalSyncContextFactory;
 import org.eclipse.aether.internal.impl.synccontext.NamedSyncContextFactory;
@@ -158,6 +160,7 @@ public class AetherModule
         .to( SimpleLocalRepositoryManagerFactory.class ).in( Singleton.class );
         bind( LocalRepositoryManagerFactory.class ).annotatedWith( Names.named( "enhanced" ) ) //
         .to( EnhancedLocalRepositoryManagerFactory.class ).in( Singleton.class );
+        bind( TrackingFileManager.class ).to( DefaultTrackingFileManager.class ).in( Singleton.class );
 
         bind( SyncContextFactoryDelegate.class ).annotatedWith( Names.named( NoLockSyncContextFactory.NAME ) )
                 .to( NoLockSyncContextFactory.class ).in( Singleton.class );
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/TrackingFileManager.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultTrackingFileManager.java
similarity index 94%
copy from maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/TrackingFileManager.java
copy to maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultTrackingFileManager.java
index e31f096..e6e2e65 100644
--- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/TrackingFileManager.java
+++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultTrackingFileManager.java
@@ -19,9 +19,6 @@ package org.eclipse.aether.internal.impl;
  * under the License.
  */
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.Closeable;
@@ -32,14 +29,23 @@ import java.io.RandomAccessFile;
 import java.util.Map;
 import java.util.Properties;
 
+import javax.inject.Named;
+import javax.inject.Singleton;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 /**
  * Manages access to a properties file.
  */
-class TrackingFileManager
+@Singleton
+@Named
+public final class DefaultTrackingFileManager
+    implements TrackingFileManager
 {
+    private static final Logger LOGGER = LoggerFactory.getLogger( DefaultTrackingFileManager.class );
 
-    private static final Logger LOGGER = LoggerFactory.getLogger( TrackingFileManager.class );
-
+    @Override
     public Properties read( File file )
     {
         FileInputStream stream = null;
@@ -69,6 +75,7 @@ class TrackingFileManager
         return null;
     }
 
+    @Override
     public Properties update( File file, Map<String, String> updates )
     {
         Properties props = new Properties();
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultUpdateCheckManager.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultUpdateCheckManager.java
index 8d1bb20..e4aba83 100644
--- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultUpdateCheckManager.java
+++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultUpdateCheckManager.java
@@ -64,7 +64,7 @@ public class DefaultUpdateCheckManager
 
     private static final Logger LOGGER = LoggerFactory.getLogger( DefaultUpdatePolicyAnalyzer.class );
 
-    private final TrackingFileManager trackingFileManager;
+    private TrackingFileManager trackingFileManager;
 
     private UpdatePolicyAnalyzer updatePolicyAnalyzer;
 
@@ -86,21 +86,28 @@ public class DefaultUpdateCheckManager
 
     public DefaultUpdateCheckManager()
     {
-        trackingFileManager = new TrackingFileManager();
+        // default ctor for ServiceLocator
     }
 
     @Inject
-    DefaultUpdateCheckManager( UpdatePolicyAnalyzer updatePolicyAnalyzer )
+    DefaultUpdateCheckManager( TrackingFileManager trackingFileManager, UpdatePolicyAnalyzer updatePolicyAnalyzer )
     {
-        this();
+        setTrackingFileManager( trackingFileManager );
         setUpdatePolicyAnalyzer( updatePolicyAnalyzer );
     }
 
     public void initService( ServiceLocator locator )
     {
+        setTrackingFileManager( locator.getService( TrackingFileManager.class ) );
         setUpdatePolicyAnalyzer( locator.getService( UpdatePolicyAnalyzer.class ) );
     }
 
+    public DefaultUpdateCheckManager setTrackingFileManager( TrackingFileManager trackingFileManager )
+    {
+        this.trackingFileManager = requireNonNull( trackingFileManager );
+        return this;
+    }
+
     public DefaultUpdateCheckManager setUpdatePolicyAnalyzer( UpdatePolicyAnalyzer updatePolicyAnalyzer )
     {
         this.updatePolicyAnalyzer = requireNonNull( updatePolicyAnalyzer, "update policy analyzer cannot be null" );
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/EnhancedLocalRepositoryManager.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/EnhancedLocalRepositoryManager.java
index 9ba0890..677406e 100644
--- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/EnhancedLocalRepositoryManager.java
+++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/EnhancedLocalRepositoryManager.java
@@ -26,6 +26,8 @@ import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
 import static java.util.Objects.requireNonNull;
+
+import java.util.Objects;
 import java.util.Properties;
 
 import org.eclipse.aether.RepositorySystemSession;
@@ -65,7 +67,9 @@ class EnhancedLocalRepositoryManager
 
     private final TrackingFileManager trackingFileManager;
 
-    EnhancedLocalRepositoryManager( File basedir, RepositorySystemSession session )
+    EnhancedLocalRepositoryManager( File basedir,
+                                    RepositorySystemSession session,
+                                    TrackingFileManager trackingFileManager )
     {
         super( basedir, "enhanced" );
         String filename = ConfigUtils.getString( session, "", "aether.enhancedLocalRepository.trackingFilename" );
@@ -74,8 +78,8 @@ class EnhancedLocalRepositoryManager
         {
             filename = "_remote.repositories";
         }
-        trackingFilename = filename;
-        trackingFileManager = new TrackingFileManager();
+        this.trackingFilename = filename;
+        this.trackingFileManager = Objects.requireNonNull( trackingFileManager );
     }
 
     @Override
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/EnhancedLocalRepositoryManagerFactory.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/EnhancedLocalRepositoryManagerFactory.java
index 6223315..fb33ed5 100644
--- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/EnhancedLocalRepositoryManagerFactory.java
+++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/EnhancedLocalRepositoryManagerFactory.java
@@ -19,6 +19,9 @@ package org.eclipse.aether.internal.impl;
  * under the License.
  */
 
+import java.util.Objects;
+
+import javax.inject.Inject;
 import javax.inject.Named;
 import javax.inject.Singleton;
 
@@ -27,6 +30,8 @@ import org.eclipse.aether.repository.LocalRepository;
 import org.eclipse.aether.repository.LocalRepositoryManager;
 import org.eclipse.aether.repository.NoLocalRepositoryManagerException;
 import org.eclipse.aether.spi.localrepo.LocalRepositoryManagerFactory;
+import org.eclipse.aether.spi.locator.Service;
+import org.eclipse.aether.spi.locator.ServiceLocator;
 
 /**
  * Creates enhanced local repository managers for repository types {@code "default"} or {@code "" (automatic)}. Enhanced
@@ -38,13 +43,27 @@ import org.eclipse.aether.spi.localrepo.LocalRepositoryManagerFactory;
 @Singleton
 @Named( "enhanced" )
 public class EnhancedLocalRepositoryManagerFactory
-    implements LocalRepositoryManagerFactory
+    implements LocalRepositoryManagerFactory, Service
 {
     private float priority = 10.0f;
 
+    private TrackingFileManager trackingFileManager;
+
     public EnhancedLocalRepositoryManagerFactory()
     {
-        // enable no-arg constructor
+        // no arg ctor for ServiceLocator
+    }
+
+    @Inject
+    public EnhancedLocalRepositoryManagerFactory( final TrackingFileManager trackingFileManager )
+    {
+        this.trackingFileManager = Objects.requireNonNull( trackingFileManager );
+    }
+
+    @Override
+    public void initService( final ServiceLocator locator )
+    {
+        this.trackingFileManager = Objects.requireNonNull( locator.getService( TrackingFileManager.class ) );
     }
 
     public LocalRepositoryManager newInstance( RepositorySystemSession session, LocalRepository repository )
@@ -52,7 +71,7 @@ public class EnhancedLocalRepositoryManagerFactory
     {
         if ( "".equals( repository.getContentType() ) || "default".equals( repository.getContentType() ) )
         {
-            return new EnhancedLocalRepositoryManager( repository.getBasedir(), session );
+            return new EnhancedLocalRepositoryManager( repository.getBasedir(), session, trackingFileManager );
         }
         else
         {
diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/TrackingFileManager.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/TrackingFileManager.java
index e31f096..1bc5b3e 100644
--- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/TrackingFileManager.java
+++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/TrackingFileManager.java
@@ -19,130 +19,16 @@ package org.eclipse.aether.internal.impl;
  * under the License.
  */
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.Closeable;
 import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.RandomAccessFile;
 import java.util.Map;
 import java.util.Properties;
 
 /**
  * Manages access to a properties file.
  */
-class TrackingFileManager
+public interface TrackingFileManager
 {
+    Properties read( File file );
 
-    private static final Logger LOGGER = LoggerFactory.getLogger( TrackingFileManager.class );
-
-    public Properties read( File file )
-    {
-        FileInputStream stream = null;
-        try
-        {
-            if ( !file.exists() )
-            {
-                return null;
-            }
-
-            stream = new FileInputStream( file );
-
-            Properties props = new Properties();
-            props.load( stream );
-
-            return props;
-        }
-        catch ( IOException e )
-        {
-            LOGGER.warn( "Failed to read tracking file {}", file, e );
-        }
-        finally
-        {
-            close( stream, file );
-        }
-
-        return null;
-    }
-
-    public Properties update( File file, Map<String, String> updates )
-    {
-        Properties props = new Properties();
-
-        File directory = file.getParentFile();
-        if ( !directory.mkdirs() && !directory.exists() )
-        {
-            LOGGER.warn( "Failed to create parent directories for tracking file {}", file );
-            return props;
-        }
-
-        RandomAccessFile raf = null;
-        try
-        {
-            raf = new RandomAccessFile( file, "rw" );
-
-            if ( file.canRead() )
-            {
-                byte[] buffer = new byte[(int) raf.length()];
-
-                raf.readFully( buffer );
-
-                ByteArrayInputStream stream = new ByteArrayInputStream( buffer );
-
-                props.load( stream );
-            }
-
-            for ( Map.Entry<String, String> update : updates.entrySet() )
-            {
-                if ( update.getValue() == null )
-                {
-                    props.remove( update.getKey() );
-                }
-                else
-                {
-                    props.setProperty( update.getKey(), update.getValue() );
-                }
-            }
-
-            ByteArrayOutputStream stream = new ByteArrayOutputStream( 1024 * 2 );
-
-            LOGGER.debug( "Writing tracking file {}", file );
-            props.store( stream, "NOTE: This is a Maven Resolver internal implementation file"
-                + ", its format can be changed without prior notice." );
-
-            raf.seek( 0 );
-            raf.write( stream.toByteArray() );
-            raf.setLength( raf.getFilePointer() );
-        }
-        catch ( IOException e )
-        {
-            LOGGER.warn( "Failed to write tracking file {}", file, e );
-        }
-        finally
-        {
-            close( raf, file );
-        }
-
-        return props;
-    }
-
-    private void close( Closeable closeable, File file )
-    {
-        if ( closeable != null )
-        {
-            try
-            {
-                closeable.close();
-            }
-            catch ( IOException e )
-            {
-                LOGGER.warn( "Error closing tracking file {}", file, e );
-            }
-        }
-    }
-
+    Properties update( File file, Map<String, String> updates );
 }
diff --git a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/DefaultArtifactResolverTest.java b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/DefaultArtifactResolverTest.java
index 3710a69..3c27f98 100644
--- a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/DefaultArtifactResolverTest.java
+++ b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/DefaultArtifactResolverTest.java
@@ -272,7 +272,10 @@ public class DefaultArtifactResolverTest
         };
 
         repositoryConnectorProvider.setConnector( connector );
-        resolver.setUpdateCheckManager( new DefaultUpdateCheckManager().setUpdatePolicyAnalyzer( new DefaultUpdatePolicyAnalyzer() ) );
+        resolver.setUpdateCheckManager( new DefaultUpdateCheckManager()
+            .setUpdatePolicyAnalyzer( new DefaultUpdatePolicyAnalyzer() )
+            .setTrackingFileManager( new DefaultTrackingFileManager() )
+        );
 
         session.setResolutionErrorPolicy( new SimpleResolutionErrorPolicy( true, false ) );
         session.setUpdatePolicy( RepositoryPolicy.UPDATE_POLICY_NEVER );
diff --git a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/TrackingFileManagerTest.java b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/DefaultTrackingFileManagerTest.java
similarity index 91%
rename from maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/TrackingFileManagerTest.java
rename to maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/DefaultTrackingFileManagerTest.java
index 1593fa4..e3745aa 100644
--- a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/TrackingFileManagerTest.java
+++ b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/DefaultTrackingFileManagerTest.java
@@ -36,14 +36,14 @@ import org.junit.Test;
 
 /**
  */
-public class TrackingFileManagerTest
+public class DefaultTrackingFileManagerTest
 {
 
     @Test
     public void testRead()
         throws Exception
     {
-        TrackingFileManager tfm = new TrackingFileManager();
+        TrackingFileManager tfm = new DefaultTrackingFileManager();
 
         File propFile = TestFileUtils.createTempFile( "#COMMENT\nkey1=value1\nkey2 : value2" );
         Properties props = tfm.read( propFile );
@@ -63,7 +63,7 @@ public class TrackingFileManagerTest
     public void testReadNoFileLeak()
         throws Exception
     {
-        TrackingFileManager tfm = new TrackingFileManager();
+        TrackingFileManager tfm = new DefaultTrackingFileManager();
 
         for ( int i = 0; i < 1000; i++ )
         {
@@ -77,7 +77,7 @@ public class TrackingFileManagerTest
     public void testUpdate()
         throws Exception
     {
-        TrackingFileManager tfm = new TrackingFileManager();
+        TrackingFileManager tfm = new DefaultTrackingFileManager();
 
         // NOTE: The excessive repetitions are to check the update properly truncates the file
         File propFile = TestFileUtils.createTempFile( "key1=value1\nkey2 : value2\n".getBytes( StandardCharsets.UTF_8 ), 1000 );
@@ -100,7 +100,7 @@ public class TrackingFileManagerTest
     public void testUpdateNoFileLeak()
         throws Exception
     {
-        TrackingFileManager tfm = new TrackingFileManager();
+        TrackingFileManager tfm = new DefaultTrackingFileManager();
 
         Map<String, String> updates = new HashMap<>();
         updates.put( "k", "v" );
diff --git a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/DefaultUpdateCheckManagerTest.java b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/DefaultUpdateCheckManagerTest.java
index 3b38e8b..111aca7 100644
--- a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/DefaultUpdateCheckManagerTest.java
+++ b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/DefaultUpdateCheckManagerTest.java
@@ -80,7 +80,9 @@ public class DefaultUpdateCheckManagerTest
         session = TestUtils.newSession();
         repository =
             new RemoteRepository.Builder( "id", "default", TestFileUtils.createTempDir().toURI().toURL().toString() ).build();
-        manager = new DefaultUpdateCheckManager().setUpdatePolicyAnalyzer( new DefaultUpdatePolicyAnalyzer() );
+        manager = new DefaultUpdateCheckManager()
+            .setUpdatePolicyAnalyzer( new DefaultUpdatePolicyAnalyzer() )
+            .setTrackingFileManager( new DefaultTrackingFileManager() );
         metadata =
             new DefaultMetadata( "gid", "aid", "ver", "maven-metadata.xml", Metadata.Nature.RELEASE_OR_SNAPSHOT,
                                  metadataFile );
diff --git a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/EnhancedLocalRepositoryManagerTest.java b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/EnhancedLocalRepositoryManagerTest.java
index 32a4222..1dae789 100644
--- a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/EnhancedLocalRepositoryManagerTest.java
+++ b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/EnhancedLocalRepositoryManagerTest.java
@@ -64,6 +64,8 @@ public class EnhancedLocalRepositoryManagerTest
 
     private String testContext = "project/compile";
 
+    private TrackingFileManager trackingFileManager;
+
     private RepositorySystemSession session;
 
     private Metadata metadata;
@@ -96,7 +98,8 @@ public class EnhancedLocalRepositoryManagerTest
 
         basedir = TestFileUtils.createTempDir( "enhanced-repo" );
         session = TestUtils.newSession();
-        manager = new EnhancedLocalRepositoryManager( basedir, session );
+        trackingFileManager = new DefaultTrackingFileManager();
+        manager = new EnhancedLocalRepositoryManager( basedir, session, trackingFileManager );
 
         artifactFile = new File( basedir, manager.getPathForLocalArtifact( artifact ) );
     }