Skip to content

Commit 693403e

Browse files
cstamasmichael-o
authored andcommitted
[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
1 parent 7939a69 commit 693403e

File tree

11 files changed

+220
-135
lines changed

11 files changed

+220
-135
lines changed

maven-resolver-impl/src/main/java/org/eclipse/aether/impl/DefaultServiceLocator.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@
3333
import org.eclipse.aether.RepositorySystem;
3434
import org.eclipse.aether.internal.impl.DefaultArtifactResolver;
3535
import org.eclipse.aether.internal.impl.DefaultChecksumPolicyProvider;
36+
import org.eclipse.aether.internal.impl.DefaultTrackingFileManager;
37+
import org.eclipse.aether.internal.impl.TrackingFileManager;
3638
import org.eclipse.aether.internal.impl.collect.DefaultDependencyCollector;
3739
import org.eclipse.aether.internal.impl.DefaultDeployer;
3840
import org.eclipse.aether.internal.impl.DefaultFileProcessor;
@@ -217,6 +219,7 @@ public DefaultServiceLocator()
217219
addService( LocalRepositoryManagerFactory.class, SimpleLocalRepositoryManagerFactory.class );
218220
addService( LocalRepositoryManagerFactory.class, EnhancedLocalRepositoryManagerFactory.class );
219221
addService( LoggerFactory.class, Slf4jLoggerFactory.class );
222+
addService( TrackingFileManager.class, DefaultTrackingFileManager.class );
220223
}
221224

222225
private <T> Entry<T> getEntry( Class<T> type, boolean create )

maven-resolver-impl/src/main/java/org/eclipse/aether/impl/guice/AetherModule.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@
4040
import org.eclipse.aether.impl.RemoteRepositoryManager;
4141
import org.eclipse.aether.impl.RepositoryConnectorProvider;
4242
import org.eclipse.aether.impl.RepositoryEventDispatcher;
43+
import org.eclipse.aether.internal.impl.DefaultTrackingFileManager;
44+
import org.eclipse.aether.internal.impl.TrackingFileManager;
4345
import org.eclipse.aether.internal.impl.synccontext.DefaultSyncContextFactory;
4446
import org.eclipse.aether.internal.impl.synccontext.GlobalSyncContextFactory;
4547
import org.eclipse.aether.internal.impl.synccontext.NamedSyncContextFactory;
@@ -158,6 +160,7 @@ protected void configure()
158160
.to( SimpleLocalRepositoryManagerFactory.class ).in( Singleton.class );
159161
bind( LocalRepositoryManagerFactory.class ).annotatedWith( Names.named( "enhanced" ) ) //
160162
.to( EnhancedLocalRepositoryManagerFactory.class ).in( Singleton.class );
163+
bind( TrackingFileManager.class ).to( DefaultTrackingFileManager.class ).in( Singleton.class );
161164

162165
bind( SyncContextFactoryDelegate.class ).annotatedWith( Names.named( NoLockSyncContextFactory.NAME ) )
163166
.to( NoLockSyncContextFactory.class ).in( Singleton.class );
Lines changed: 155 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,155 @@
1+
package org.eclipse.aether.internal.impl;
2+
3+
/*
4+
* Licensed to the Apache Software Foundation (ASF) under one
5+
* or more contributor license agreements. See the NOTICE file
6+
* distributed with this work for additional information
7+
* regarding copyright ownership. The ASF licenses this file
8+
* to you under the Apache License, Version 2.0 (the
9+
* "License"); you may not use this file except in compliance
10+
* with the License. You may obtain a copy of the License at
11+
*
12+
* http://www.apache.org/licenses/LICENSE-2.0
13+
*
14+
* Unless required by applicable law or agreed to in writing,
15+
* software distributed under the License is distributed on an
16+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17+
* KIND, either express or implied. See the License for the
18+
* specific language governing permissions and limitations
19+
* under the License.
20+
*/
21+
22+
import java.io.ByteArrayInputStream;
23+
import java.io.ByteArrayOutputStream;
24+
import java.io.Closeable;
25+
import java.io.File;
26+
import java.io.FileInputStream;
27+
import java.io.IOException;
28+
import java.io.RandomAccessFile;
29+
import java.util.Map;
30+
import java.util.Properties;
31+
32+
import javax.inject.Named;
33+
import javax.inject.Singleton;
34+
35+
import org.slf4j.Logger;
36+
import org.slf4j.LoggerFactory;
37+
38+
/**
39+
* Manages access to a properties file.
40+
*/
41+
@Singleton
42+
@Named
43+
public final class DefaultTrackingFileManager
44+
implements TrackingFileManager
45+
{
46+
private static final Logger LOGGER = LoggerFactory.getLogger( DefaultTrackingFileManager.class );
47+
48+
@Override
49+
public Properties read( File file )
50+
{
51+
FileInputStream stream = null;
52+
try
53+
{
54+
if ( !file.exists() )
55+
{
56+
return null;
57+
}
58+
59+
stream = new FileInputStream( file );
60+
61+
Properties props = new Properties();
62+
props.load( stream );
63+
64+
return props;
65+
}
66+
catch ( IOException e )
67+
{
68+
LOGGER.warn( "Failed to read tracking file {}", file, e );
69+
}
70+
finally
71+
{
72+
close( stream, file );
73+
}
74+
75+
return null;
76+
}
77+
78+
@Override
79+
public Properties update( File file, Map<String, String> updates )
80+
{
81+
Properties props = new Properties();
82+
83+
File directory = file.getParentFile();
84+
if ( !directory.mkdirs() && !directory.exists() )
85+
{
86+
LOGGER.warn( "Failed to create parent directories for tracking file {}", file );
87+
return props;
88+
}
89+
90+
RandomAccessFile raf = null;
91+
try
92+
{
93+
raf = new RandomAccessFile( file, "rw" );
94+
95+
if ( file.canRead() )
96+
{
97+
byte[] buffer = new byte[(int) raf.length()];
98+
99+
raf.readFully( buffer );
100+
101+
ByteArrayInputStream stream = new ByteArrayInputStream( buffer );
102+
103+
props.load( stream );
104+
}
105+
106+
for ( Map.Entry<String, String> update : updates.entrySet() )
107+
{
108+
if ( update.getValue() == null )
109+
{
110+
props.remove( update.getKey() );
111+
}
112+
else
113+
{
114+
props.setProperty( update.getKey(), update.getValue() );
115+
}
116+
}
117+
118+
ByteArrayOutputStream stream = new ByteArrayOutputStream( 1024 * 2 );
119+
120+
LOGGER.debug( "Writing tracking file {}", file );
121+
props.store( stream, "NOTE: This is a Maven Resolver internal implementation file"
122+
+ ", its format can be changed without prior notice." );
123+
124+
raf.seek( 0 );
125+
raf.write( stream.toByteArray() );
126+
raf.setLength( raf.getFilePointer() );
127+
}
128+
catch ( IOException e )
129+
{
130+
LOGGER.warn( "Failed to write tracking file {}", file, e );
131+
}
132+
finally
133+
{
134+
close( raf, file );
135+
}
136+
137+
return props;
138+
}
139+
140+
private void close( Closeable closeable, File file )
141+
{
142+
if ( closeable != null )
143+
{
144+
try
145+
{
146+
closeable.close();
147+
}
148+
catch ( IOException e )
149+
{
150+
LOGGER.warn( "Error closing tracking file {}", file, e );
151+
}
152+
}
153+
}
154+
155+
}

maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultUpdateCheckManager.java

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ public class DefaultUpdateCheckManager
6464

6565
private static final Logger LOGGER = LoggerFactory.getLogger( DefaultUpdatePolicyAnalyzer.class );
6666

67-
private final TrackingFileManager trackingFileManager;
67+
private TrackingFileManager trackingFileManager;
6868

6969
private UpdatePolicyAnalyzer updatePolicyAnalyzer;
7070

@@ -86,21 +86,28 @@ public class DefaultUpdateCheckManager
8686

8787
public DefaultUpdateCheckManager()
8888
{
89-
trackingFileManager = new TrackingFileManager();
89+
// default ctor for ServiceLocator
9090
}
9191

9292
@Inject
93-
DefaultUpdateCheckManager( UpdatePolicyAnalyzer updatePolicyAnalyzer )
93+
DefaultUpdateCheckManager( TrackingFileManager trackingFileManager, UpdatePolicyAnalyzer updatePolicyAnalyzer )
9494
{
95-
this();
95+
setTrackingFileManager( trackingFileManager );
9696
setUpdatePolicyAnalyzer( updatePolicyAnalyzer );
9797
}
9898

9999
public void initService( ServiceLocator locator )
100100
{
101+
setTrackingFileManager( locator.getService( TrackingFileManager.class ) );
101102
setUpdatePolicyAnalyzer( locator.getService( UpdatePolicyAnalyzer.class ) );
102103
}
103104

105+
public DefaultUpdateCheckManager setTrackingFileManager( TrackingFileManager trackingFileManager )
106+
{
107+
this.trackingFileManager = requireNonNull( trackingFileManager );
108+
return this;
109+
}
110+
104111
public DefaultUpdateCheckManager setUpdatePolicyAnalyzer( UpdatePolicyAnalyzer updatePolicyAnalyzer )
105112
{
106113
this.updatePolicyAnalyzer = requireNonNull( updatePolicyAnalyzer, "update policy analyzer cannot be null" );

maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/EnhancedLocalRepositoryManager.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@
2626
import java.util.HashSet;
2727
import java.util.Map;
2828
import static java.util.Objects.requireNonNull;
29+
30+
import java.util.Objects;
2931
import java.util.Properties;
3032

3133
import org.eclipse.aether.RepositorySystemSession;
@@ -65,7 +67,9 @@ class EnhancedLocalRepositoryManager
6567

6668
private final TrackingFileManager trackingFileManager;
6769

68-
EnhancedLocalRepositoryManager( File basedir, RepositorySystemSession session )
70+
EnhancedLocalRepositoryManager( File basedir,
71+
RepositorySystemSession session,
72+
TrackingFileManager trackingFileManager )
6973
{
7074
super( basedir, "enhanced" );
7175
String filename = ConfigUtils.getString( session, "", "aether.enhancedLocalRepository.trackingFilename" );
@@ -74,8 +78,8 @@ class EnhancedLocalRepositoryManager
7478
{
7579
filename = "_remote.repositories";
7680
}
77-
trackingFilename = filename;
78-
trackingFileManager = new TrackingFileManager();
81+
this.trackingFilename = filename;
82+
this.trackingFileManager = Objects.requireNonNull( trackingFileManager );
7983
}
8084

8185
@Override

maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/EnhancedLocalRepositoryManagerFactory.java

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@
1919
* under the License.
2020
*/
2121

22+
import java.util.Objects;
23+
24+
import javax.inject.Inject;
2225
import javax.inject.Named;
2326
import javax.inject.Singleton;
2427

@@ -27,6 +30,8 @@
2730
import org.eclipse.aether.repository.LocalRepositoryManager;
2831
import org.eclipse.aether.repository.NoLocalRepositoryManagerException;
2932
import org.eclipse.aether.spi.localrepo.LocalRepositoryManagerFactory;
33+
import org.eclipse.aether.spi.locator.Service;
34+
import org.eclipse.aether.spi.locator.ServiceLocator;
3035

3136
/**
3237
* Creates enhanced local repository managers for repository types {@code "default"} or {@code "" (automatic)}. Enhanced
@@ -38,21 +43,35 @@
3843
@Singleton
3944
@Named( "enhanced" )
4045
public class EnhancedLocalRepositoryManagerFactory
41-
implements LocalRepositoryManagerFactory
46+
implements LocalRepositoryManagerFactory, Service
4247
{
4348
private float priority = 10.0f;
4449

50+
private TrackingFileManager trackingFileManager;
51+
4552
public EnhancedLocalRepositoryManagerFactory()
4653
{
47-
// enable no-arg constructor
54+
// no arg ctor for ServiceLocator
55+
}
56+
57+
@Inject
58+
public EnhancedLocalRepositoryManagerFactory( final TrackingFileManager trackingFileManager )
59+
{
60+
this.trackingFileManager = Objects.requireNonNull( trackingFileManager );
61+
}
62+
63+
@Override
64+
public void initService( final ServiceLocator locator )
65+
{
66+
this.trackingFileManager = Objects.requireNonNull( locator.getService( TrackingFileManager.class ) );
4867
}
4968

5069
public LocalRepositoryManager newInstance( RepositorySystemSession session, LocalRepository repository )
5170
throws NoLocalRepositoryManagerException
5271
{
5372
if ( "".equals( repository.getContentType() ) || "default".equals( repository.getContentType() ) )
5473
{
55-
return new EnhancedLocalRepositoryManager( repository.getBasedir(), session );
74+
return new EnhancedLocalRepositoryManager( repository.getBasedir(), session, trackingFileManager );
5675
}
5776
else
5877
{

0 commit comments

Comments
 (0)