diff --git a/maven-compat/src/main/java/org/apache/maven/repository/legacy/DefaultUpdateCheckManager.java b/maven-compat/src/main/java/org/apache/maven/repository/legacy/DefaultUpdateCheckManager.java index fe32f9c138c9..9e7c81b38568 100644 --- a/maven-compat/src/main/java/org/apache/maven/repository/legacy/DefaultUpdateCheckManager.java +++ b/maven-compat/src/main/java/org/apache/maven/repository/legacy/DefaultUpdateCheckManager.java @@ -18,14 +18,13 @@ */ package org.apache.maven.repository.legacy; +import javax.inject.Inject; +import javax.inject.Named; +import javax.inject.Singleton; + import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.RandomAccessFile; -import java.nio.channels.Channels; -import java.nio.channels.FileChannel; -import java.nio.channels.FileLock; import java.util.Date; +import java.util.HashMap; import java.util.Properties; import org.apache.maven.artifact.Artifact; @@ -37,19 +36,29 @@ import org.codehaus.plexus.component.annotations.Component; import org.codehaus.plexus.logging.AbstractLogEnabled; import org.codehaus.plexus.logging.Logger; +import org.eclipse.aether.internal.impl.TrackingFileManager; /** * DefaultUpdateCheckManager */ -@Component(role = UpdateCheckManager.class) +@Named +@Singleton public class DefaultUpdateCheckManager extends AbstractLogEnabled implements UpdateCheckManager { + private final TrackingFileManager trackingFileManager; private static final String ERROR_KEY_SUFFIX = ".error"; - public DefaultUpdateCheckManager() {} + @Inject + public DefaultUpdateCheckManager(TrackingFileManager trackingFileManager) { + this.trackingFileManager = trackingFileManager; + } - public DefaultUpdateCheckManager(Logger logger) { + /** + * For testing purposes. + */ + public DefaultUpdateCheckManager(Logger logger, TrackingFileManager trackingFileManager) { enableLogging(logger); + this.trackingFileManager = trackingFileManager; } public static final String LAST_UPDATE_TAG = ".lastUpdated"; @@ -148,7 +157,7 @@ public void touch(Artifact artifact, ArtifactRepository repository, String error File touchfile = getTouchfile(artifact); if (file.exists()) { - touchfile.delete(); + trackingFileManager.delete(touchfile); } else { writeLastUpdated(touchfile, getRepositoryKey(repository), error); } @@ -192,70 +201,10 @@ String getRepositoryKey(ArtifactRepository repository) { } private void writeLastUpdated(File touchfile, String key, String error) { - synchronized (touchfile.getAbsolutePath().intern()) { - if (!touchfile.getParentFile().exists() - && !touchfile.getParentFile().mkdirs()) { - getLogger() - .debug("Failed to create directory: " + touchfile.getParent() - + " for tracking artifact metadata resolution."); - return; - } - - FileChannel channel = null; - FileLock lock = null; - try { - Properties props = new Properties(); - - channel = new RandomAccessFile(touchfile, "rw").getChannel(); - lock = channel.lock(); - - if (touchfile.canRead()) { - getLogger().debug("Reading resolution-state from: " + touchfile); - props.load(Channels.newInputStream(channel)); - } - - props.setProperty(key, Long.toString(System.currentTimeMillis())); - - if (error != null) { - props.setProperty(key + ERROR_KEY_SUFFIX, error); - } else { - props.remove(key + ERROR_KEY_SUFFIX); - } - - getLogger().debug("Writing resolution-state to: " + touchfile); - channel.truncate(0); - props.store(Channels.newOutputStream(channel), "Last modified on: " + new Date()); - - lock.release(); - lock = null; - - channel.close(); - channel = null; - } catch (IOException e) { - getLogger() - .debug( - "Failed to record lastUpdated information for resolution.\nFile: " - + touchfile.toString() + "; key: " + key, - e); - } finally { - if (lock != null) { - try { - lock.release(); - } catch (IOException e) { - getLogger() - .debug("Error releasing exclusive lock for resolution tracking file: " + touchfile, e); - } - } - - if (channel != null) { - try { - channel.close(); - } catch (IOException e) { - getLogger().debug("Error closing FileChannel for resolution tracking file: " + touchfile, e); - } - } - } - } + HashMap update = new HashMap<>(); + update.put(key, Long.toString(System.currentTimeMillis())); + update.put(key + ERROR_KEY_SUFFIX, error); // error==null => remove mapping + trackingFileManager.update(touchfile, update); } Date readLastUpdated(File touchfile, String key) { @@ -284,53 +233,7 @@ private String getError(File touchFile, String key) { } private Properties read(File touchfile) { - if (!touchfile.canRead()) { - getLogger().debug("Skipped unreadable resolution tracking file " + touchfile); - return null; - } - - synchronized (touchfile.getAbsolutePath().intern()) { - FileInputStream in = null; - FileLock lock = null; - - try { - Properties props = new Properties(); - - in = new FileInputStream(touchfile); - lock = in.getChannel().lock(0, Long.MAX_VALUE, true); - - getLogger().debug("Reading resolution-state from: " + touchfile); - props.load(in); - - lock.release(); - lock = null; - - in.close(); - in = null; - - return props; - } catch (IOException e) { - getLogger().debug("Failed to read resolution tracking file " + touchfile, e); - - return null; - } finally { - if (lock != null) { - try { - lock.release(); - } catch (IOException e) { - getLogger().debug("Error releasing shared lock for resolution tracking file: " + touchfile, e); - } - } - - if (in != null) { - try { - in.close(); - } catch (IOException e) { - getLogger().debug("Error closing FileChannel for resolution tracking file: " + touchfile, e); - } - } - } - } + return trackingFileManager.read(touchfile); } File getTouchfile(Artifact artifact) { diff --git a/maven-compat/src/test/java/org/apache/maven/artifact/transform/TransformationManagerTest.java b/maven-compat/src/test/java/org/apache/maven/artifact/transform/TransformationManagerTest.java index f6ee97bf3272..37eef6a75ba4 100644 --- a/maven-compat/src/test/java/org/apache/maven/artifact/transform/TransformationManagerTest.java +++ b/maven-compat/src/test/java/org/apache/maven/artifact/transform/TransformationManagerTest.java @@ -24,10 +24,19 @@ import org.apache.maven.repository.legacy.resolver.transform.LatestArtifactTransformation; import org.apache.maven.repository.legacy.resolver.transform.ReleaseArtifactTransformation; import org.apache.maven.repository.legacy.resolver.transform.SnapshotTransformation; +import org.codehaus.plexus.ContainerConfiguration; +import org.codehaus.plexus.PlexusConstants; import org.codehaus.plexus.PlexusTestCase; /** @author Jason van Zyl */ public class TransformationManagerTest extends PlexusTestCase { + + @Override + protected void customizeContainerConfiguration(ContainerConfiguration configuration) { + configuration.setAutoWiring(true); + configuration.setClassPathScanning(PlexusConstants.SCANNING_INDEX); + } + public void testTransformationManager() throws Exception { ArtifactTransformationManager tm = lookup(ArtifactTransformationManager.class); diff --git a/maven-compat/src/test/java/org/apache/maven/repository/legacy/DefaultUpdateCheckManagerTest.java b/maven-compat/src/test/java/org/apache/maven/repository/legacy/DefaultUpdateCheckManagerTest.java index 8d5d156e26c8..e11f437b9bdc 100644 --- a/maven-compat/src/test/java/org/apache/maven/repository/legacy/DefaultUpdateCheckManagerTest.java +++ b/maven-compat/src/test/java/org/apache/maven/repository/legacy/DefaultUpdateCheckManagerTest.java @@ -28,6 +28,7 @@ import org.apache.maven.artifact.repository.metadata.RepositoryMetadata; import org.codehaus.plexus.logging.Logger; import org.codehaus.plexus.logging.console.ConsoleLogger; +import org.eclipse.aether.internal.impl.DefaultTrackingFileManager; public class DefaultUpdateCheckManagerTest extends AbstractArtifactComponentTestCase { @@ -42,7 +43,7 @@ protected String component() { protected void setUp() throws Exception { super.setUp(); - updateCheckManager = new DefaultUpdateCheckManager(new ConsoleLogger(Logger.LEVEL_DEBUG, "test")); + updateCheckManager = new DefaultUpdateCheckManager(new ConsoleLogger(Logger.LEVEL_DEBUG, "test"), new DefaultTrackingFileManager()); } public void testArtifact() throws Exception { diff --git a/maven-compat/src/test/java/org/apache/maven/repository/legacy/DefaultWagonManagerTest.java b/maven-compat/src/test/java/org/apache/maven/repository/legacy/DefaultWagonManagerTest.java index 54271769b4b8..f5467ab14650 100644 --- a/maven-compat/src/test/java/org/apache/maven/repository/legacy/DefaultWagonManagerTest.java +++ b/maven-compat/src/test/java/org/apache/maven/repository/legacy/DefaultWagonManagerTest.java @@ -42,6 +42,8 @@ import org.apache.maven.wagon.events.TransferListener; import org.apache.maven.wagon.observers.AbstractTransferListener; import org.apache.maven.wagon.observers.Debug; +import org.codehaus.plexus.ContainerConfiguration; +import org.codehaus.plexus.PlexusConstants; import org.codehaus.plexus.PlexusTestCase; import org.codehaus.plexus.util.FileUtils; @@ -57,6 +59,12 @@ public class DefaultWagonManagerTest extends PlexusTestCase { private ArtifactRepositoryFactory artifactRepositoryFactory; + @Override + protected void customizeContainerConfiguration(ContainerConfiguration configuration) { + configuration.setAutoWiring(true); + configuration.setClassPathScanning(PlexusConstants.SCANNING_INDEX); + } + protected void setUp() throws Exception { super.setUp(); wagonManager = (DefaultWagonManager) lookup(WagonManager.class); diff --git a/pom.xml b/pom.xml index 3349985e6721..3f884eee2f0a 100644 --- a/pom.xml +++ b/pom.xml @@ -144,7 +144,7 @@ under the License. 2.0 2.0 1.4.0 - 1.9.24 + 1.9.25-SNAPSHOT 1.7.36 2.11.0 2.0.9