You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by if...@apache.org on 2014/08/08 20:28:54 UTC
git commit: MNG-5677 hooks to allow fine-grained cache management
Repository: maven
Updated Branches:
refs/heads/master 8980f67b9 -> 693f8f660
MNG-5677 hooks to allow fine-grained cache management
Also fixed broken cache #flush() and missing #dispose() in
couple of places.
Signed-off-by: Igor Fedorenko <ig...@ifedorenko.com>
Project: http://git-wip-us.apache.org/repos/asf/maven/repo
Commit: http://git-wip-us.apache.org/repos/asf/maven/commit/693f8f66
Tree: http://git-wip-us.apache.org/repos/asf/maven/tree/693f8f66
Diff: http://git-wip-us.apache.org/repos/asf/maven/diff/693f8f66
Branch: refs/heads/master
Commit: 693f8f6604f24792b4dadbacf2fbc0eb79285915
Parents: 8980f67
Author: Igor Fedorenko <ig...@ifedorenko.com>
Authored: Fri Aug 8 22:28:02 2014 +0400
Committer: Igor Fedorenko <ig...@ifedorenko.com>
Committed: Fri Aug 8 22:28:06 2014 +0400
----------------------------------------------------------------------
.../plugin/DefaultExtensionRealmCache.java | 52 ++++++++++++++-----
.../plugin/DefaultPluginArtifactsCache.java | 8 +--
.../maven/plugin/DefaultPluginRealmCache.java | 2 +-
.../maven/plugin/ExtensionRealmCache.java | 16 ++++--
.../maven/plugin/PluginArtifactsCache.java | 2 +-
.../apache/maven/plugin/PluginRealmCache.java | 2 +-
.../internal/DefaultMavenPluginManager.java | 2 +-
.../maven/project/DefaultProjectBuilder.java | 1 +
.../project/DefaultProjectBuildingHelper.java | 20 +++++---
.../maven/project/DefaultProjectRealmCache.java | 53 +++++++++++++++-----
.../apache/maven/project/ProjectRealmCache.java | 17 +++++--
11 files changed, 127 insertions(+), 48 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/maven/blob/693f8f66/maven-core/src/main/java/org/apache/maven/plugin/DefaultExtensionRealmCache.java
----------------------------------------------------------------------
diff --git a/maven-core/src/main/java/org/apache/maven/plugin/DefaultExtensionRealmCache.java b/maven-core/src/main/java/org/apache/maven/plugin/DefaultExtensionRealmCache.java
index bc10223..bda84d0 100644
--- a/maven-core/src/main/java/org/apache/maven/plugin/DefaultExtensionRealmCache.java
+++ b/maven-core/src/main/java/org/apache/maven/plugin/DefaultExtensionRealmCache.java
@@ -21,14 +21,16 @@ package org.apache.maven.plugin;
import java.io.File;
import java.util.ArrayList;
-import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
import org.apache.maven.project.ExtensionDescriptor;
import org.apache.maven.project.MavenProject;
import org.codehaus.plexus.classworlds.realm.ClassRealm;
+import org.codehaus.plexus.classworlds.realm.NoSuchRealmException;
import org.codehaus.plexus.component.annotations.Component;
+import org.codehaus.plexus.personality.plexus.lifecycle.phase.Disposable;
import org.eclipse.aether.artifact.Artifact;
/**
@@ -36,10 +38,11 @@ import org.eclipse.aether.artifact.Artifact;
*/
@Component( role = ExtensionRealmCache.class )
public class DefaultExtensionRealmCache
- implements ExtensionRealmCache
+ implements ExtensionRealmCache, Disposable
{
- private static class CacheKey
+ protected static class CacheKey
+ implements Key
{
private final List<File> files;
@@ -97,28 +100,36 @@ public class DefaultExtensionRealmCache
&& sizes.equals( other.sizes );
}
+ @Override
+ public String toString()
+ {
+ return files.toString();
+ }
}
- private final Map<CacheKey, CacheRecord> cache = new HashMap<CacheKey, CacheRecord>();
+ protected final Map<Key, CacheRecord> cache = new ConcurrentHashMap<Key, CacheRecord>();
+
+ @Override
+ public Key createKey( List<? extends Artifact> extensionArtifacts )
+ {
+ return new CacheKey( extensionArtifacts );
+ }
- public CacheRecord get( List<? extends Artifact> extensionArtifacts )
+ public CacheRecord get( Key key )
{
- return cache.get( new CacheKey( extensionArtifacts ) );
+ return cache.get( key );
}
- public CacheRecord put( List<? extends Artifact> extensionArtifacts, ClassRealm extensionRealm,
- ExtensionDescriptor extensionDescriptor )
+ public CacheRecord put( Key key, ClassRealm extensionRealm, ExtensionDescriptor extensionDescriptor )
{
if ( extensionRealm == null )
{
throw new NullPointerException();
}
- CacheKey key = new CacheKey( extensionArtifacts );
-
if ( cache.containsKey( key ) )
{
- throw new IllegalStateException( "Duplicate extension realm for extension " + extensionArtifacts );
+ throw new IllegalStateException( "Duplicate extension realm for extension " + key );
}
CacheRecord record = new CacheRecord( extensionRealm, extensionDescriptor );
@@ -130,12 +141,29 @@ public class DefaultExtensionRealmCache
public void flush()
{
+ for ( CacheRecord record : cache.values() )
+ {
+ ClassRealm realm = record.realm;
+ try
+ {
+ realm.getWorld().disposeRealm( realm.getId() );
+ }
+ catch ( NoSuchRealmException e )
+ {
+ // ignore
+ }
+ }
cache.clear();
}
- public void register( MavenProject project, CacheRecord record )
+ public void register( MavenProject project, Key key, CacheRecord record )
{
// default cache does not track extension usage
}
+ public void dispose()
+ {
+ flush();
+ }
+
}
http://git-wip-us.apache.org/repos/asf/maven/blob/693f8f66/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginArtifactsCache.java
----------------------------------------------------------------------
diff --git a/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginArtifactsCache.java b/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginArtifactsCache.java
index 145482d..6ee3463 100644
--- a/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginArtifactsCache.java
+++ b/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginArtifactsCache.java
@@ -21,9 +21,9 @@ package org.apache.maven.plugin;
import java.util.ArrayList;
import java.util.Collections;
-import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
import org.apache.maven.model.Plugin;
import org.apache.maven.project.MavenProject;
@@ -44,7 +44,7 @@ public class DefaultPluginArtifactsCache
implements PluginArtifactsCache
{
- private static class CacheKey
+ protected static class CacheKey
implements Key
{
@@ -133,7 +133,7 @@ public class DefaultPluginArtifactsCache
}
- protected final Map<Key, CacheRecord> cache = new HashMap<Key, CacheRecord>();
+ protected final Map<Key, CacheRecord> cache = new ConcurrentHashMap<Key, CacheRecord>();
public Key createKey( Plugin plugin, DependencyFilter extensionFilter, List<RemoteRepository> repositories,
RepositorySystemSession session )
@@ -210,7 +210,7 @@ public class DefaultPluginArtifactsCache
return CacheUtils.pluginEquals( a, b );
}
- public void register( MavenProject project, CacheRecord record )
+ public void register( MavenProject project, Key cacheKey, CacheRecord record )
{
// default cache does not track record usage
}
http://git-wip-us.apache.org/repos/asf/maven/blob/693f8f66/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginRealmCache.java
----------------------------------------------------------------------
diff --git a/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginRealmCache.java b/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginRealmCache.java
index e459cbc..d867036 100644
--- a/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginRealmCache.java
+++ b/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginRealmCache.java
@@ -206,7 +206,7 @@ public class DefaultPluginRealmCache
return CacheUtils.pluginEquals( a, b );
}
- public void register( MavenProject project, CacheRecord record )
+ public void register( MavenProject project, Key key, CacheRecord record )
{
// default cache does not track plugin usage
}
http://git-wip-us.apache.org/repos/asf/maven/blob/693f8f66/maven-core/src/main/java/org/apache/maven/plugin/ExtensionRealmCache.java
----------------------------------------------------------------------
diff --git a/maven-core/src/main/java/org/apache/maven/plugin/ExtensionRealmCache.java b/maven-core/src/main/java/org/apache/maven/plugin/ExtensionRealmCache.java
index 560e454..61d3058 100644
--- a/maven-core/src/main/java/org/apache/maven/plugin/ExtensionRealmCache.java
+++ b/maven-core/src/main/java/org/apache/maven/plugin/ExtensionRealmCache.java
@@ -36,6 +36,13 @@ import org.eclipse.aether.artifact.Artifact;
*/
public interface ExtensionRealmCache
{
+ /**
+ * A cache key.
+ */
+ interface Key
+ {
+ // marker interface for cache keys
+ }
static class CacheRecord
{
@@ -52,10 +59,11 @@ public interface ExtensionRealmCache
}
- CacheRecord get( List<? extends Artifact> extensionArtifacts );
+ Key createKey( List<? extends Artifact> extensionArtifacts );
+
+ CacheRecord get( Key key );
- CacheRecord put( List<? extends Artifact> extensionArtifacts, ClassRealm extensionRealm,
- ExtensionDescriptor extensionDescriptor );
+ CacheRecord put( Key key, ClassRealm extensionRealm, ExtensionDescriptor extensionDescriptor );
void flush();
@@ -67,6 +75,6 @@ public interface ExtensionRealmCache
* @param project The project that employs the plugin realm, must not be {@code null}.
* @param record The cache record being used for the project, must not be {@code null}.
*/
- void register( MavenProject project, CacheRecord record );
+ void register( MavenProject project, Key key, CacheRecord record );
}
http://git-wip-us.apache.org/repos/asf/maven/blob/693f8f66/maven-core/src/main/java/org/apache/maven/plugin/PluginArtifactsCache.java
----------------------------------------------------------------------
diff --git a/maven-core/src/main/java/org/apache/maven/plugin/PluginArtifactsCache.java b/maven-core/src/main/java/org/apache/maven/plugin/PluginArtifactsCache.java
index fe0ef15..e4d256f 100644
--- a/maven-core/src/main/java/org/apache/maven/plugin/PluginArtifactsCache.java
+++ b/maven-core/src/main/java/org/apache/maven/plugin/PluginArtifactsCache.java
@@ -86,6 +86,6 @@ public interface PluginArtifactsCache
* @param project The project that employs the plugin realm, must not be {@code null}.
* @param record The cache record being used for the project, must not be {@code null}.
*/
- void register( MavenProject project, CacheRecord record );
+ void register( MavenProject project, Key cacheKey, CacheRecord record );
}
http://git-wip-us.apache.org/repos/asf/maven/blob/693f8f66/maven-core/src/main/java/org/apache/maven/plugin/PluginRealmCache.java
----------------------------------------------------------------------
diff --git a/maven-core/src/main/java/org/apache/maven/plugin/PluginRealmCache.java b/maven-core/src/main/java/org/apache/maven/plugin/PluginRealmCache.java
index 11e981b..4eea338 100644
--- a/maven-core/src/main/java/org/apache/maven/plugin/PluginRealmCache.java
+++ b/maven-core/src/main/java/org/apache/maven/plugin/PluginRealmCache.java
@@ -80,6 +80,6 @@ public interface PluginRealmCache
* @param project The project that employs the plugin realm, must not be {@code null}.
* @param record The cache record being used for the project, must not be {@code null}.
*/
- void register( MavenProject project, CacheRecord record );
+ void register( MavenProject project, Key key, CacheRecord record );
}
http://git-wip-us.apache.org/repos/asf/maven/blob/693f8f66/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultMavenPluginManager.java
----------------------------------------------------------------------
diff --git a/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultMavenPluginManager.java b/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultMavenPluginManager.java
index 8c8f507..90dd9ec 100644
--- a/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultMavenPluginManager.java
+++ b/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultMavenPluginManager.java
@@ -330,7 +330,7 @@ public class DefaultMavenPluginManager
pluginRealmCache.put( cacheKey, pluginDescriptor.getClassRealm(), pluginDescriptor.getArtifacts() );
}
- pluginRealmCache.register( project, cacheRecord );
+ pluginRealmCache.register( project, cacheKey, cacheRecord );
}
private void createPluginRealm( PluginDescriptor pluginDescriptor, MavenSession session, ClassLoader parent,
http://git-wip-us.apache.org/repos/asf/maven/blob/693f8f66/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java
----------------------------------------------------------------------
diff --git a/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java b/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java
index 32786ae..8e1d51e 100644
--- a/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java
+++ b/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java
@@ -143,6 +143,7 @@ public class DefaultProjectBuilder
ModelBuildingRequest request = getModelBuildingRequest( config );
project = new MavenProject();
+ project.setFile( pomFile );
DefaultModelBuildingListener listener =
new DefaultModelBuildingListener( project, projectBuildingHelper, projectBuildingRequest );
http://git-wip-us.apache.org/repos/asf/maven/blob/693f8f66/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuildingHelper.java
----------------------------------------------------------------------
diff --git a/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuildingHelper.java b/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuildingHelper.java
index 58a87fc..fccdcfe 100644
--- a/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuildingHelper.java
+++ b/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuildingHelper.java
@@ -244,18 +244,20 @@ public class DefaultProjectBuildingHelper
{
pluginArtifactsCache.put( cacheKey, e );
- pluginArtifactsCache.register( project, recordArtifacts );
+ pluginArtifactsCache.register( project, cacheKey, recordArtifacts );
throw e;
}
}
- pluginArtifactsCache.register( project, recordArtifacts );
+ pluginArtifactsCache.register( project, cacheKey, recordArtifacts );
ClassRealm extensionRealm;
ExtensionDescriptor extensionDescriptor = null;
+
+ final ExtensionRealmCache.Key extensionKey = extensionRealmCache.createKey( artifacts );
- ExtensionRealmCache.CacheRecord recordRealm = extensionRealmCache.get( artifacts );
+ ExtensionRealmCache.CacheRecord recordRealm = extensionRealmCache.get( extensionKey );
if ( recordRealm != null )
{
@@ -295,10 +297,10 @@ public class DefaultProjectBuildingHelper
}
}
- recordRealm = extensionRealmCache.put( artifacts, extensionRealm, extensionDescriptor );
+ recordRealm = extensionRealmCache.put( extensionKey, extensionRealm, extensionDescriptor );
}
- extensionRealmCache.register( project, recordRealm );
+ extensionRealmCache.register( project, extensionKey, recordRealm );
extensionRealms.add( extensionRealm );
if ( extensionDescriptor != null )
@@ -324,7 +326,9 @@ public class DefaultProjectBuildingHelper
logger.debug( "Extension realms for project " + model.getId() + ": " + extensionRealms );
}
- ProjectRealmCache.CacheRecord record = projectRealmCache.get( extensionRealms );
+ ProjectRealmCache.Key projectRealmKey = projectRealmCache.createKey( extensionRealms );
+
+ ProjectRealmCache.CacheRecord record = projectRealmCache.get( projectRealmKey );
if ( record == null )
{
@@ -365,10 +369,10 @@ public class DefaultProjectBuildingHelper
extensionArtifactFilter = new ExclusionsDependencyFilter( exclusions );
}
- record = projectRealmCache.put( extensionRealms, projectRealm, extensionArtifactFilter );
+ record = projectRealmCache.put( projectRealmKey, projectRealm, extensionArtifactFilter );
}
- projectRealmCache.register( project, record );
+ projectRealmCache.register( project, projectRealmKey, record );
return record;
}
http://git-wip-us.apache.org/repos/asf/maven/blob/693f8f66/maven-core/src/main/java/org/apache/maven/project/DefaultProjectRealmCache.java
----------------------------------------------------------------------
diff --git a/maven-core/src/main/java/org/apache/maven/project/DefaultProjectRealmCache.java b/maven-core/src/main/java/org/apache/maven/project/DefaultProjectRealmCache.java
index 1c5dfa3..6ad8150 100644
--- a/maven-core/src/main/java/org/apache/maven/project/DefaultProjectRealmCache.java
+++ b/maven-core/src/main/java/org/apache/maven/project/DefaultProjectRealmCache.java
@@ -20,12 +20,14 @@ package org.apache.maven.project;
*/
import java.util.Collections;
-import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
import org.codehaus.plexus.classworlds.realm.ClassRealm;
+import org.codehaus.plexus.classworlds.realm.NoSuchRealmException;
import org.codehaus.plexus.component.annotations.Component;
+import org.codehaus.plexus.personality.plexus.lifecycle.phase.Disposable;
import org.eclipse.aether.graph.DependencyFilter;
/**
@@ -33,10 +35,11 @@ import org.eclipse.aether.graph.DependencyFilter;
*/
@Component( role = ProjectRealmCache.class )
public class DefaultProjectRealmCache
- implements ProjectRealmCache
+ implements ProjectRealmCache, Disposable
{
- private static class CacheKey
+ protected static class CacheKey
+ implements Key
{
private final List<? extends ClassRealm> extensionRealms;
@@ -74,28 +77,36 @@ public class DefaultProjectRealmCache
return extensionRealms.equals( other.extensionRealms );
}
+ @Override
+ public String toString()
+ {
+ return extensionRealms.toString();
+ }
}
- private final Map<CacheKey, CacheRecord> cache = new HashMap<CacheKey, CacheRecord>();
+ protected final Map<Key, CacheRecord> cache = new ConcurrentHashMap<Key, CacheRecord>();
+
+ @Override
+ public Key createKey( List<? extends ClassRealm> extensionRealms )
+ {
+ return new CacheKey( extensionRealms );
+ }
- public CacheRecord get( List<? extends ClassRealm> extensionRealms )
+ public CacheRecord get( Key key )
{
- return cache.get( new CacheKey( extensionRealms ) );
+ return cache.get( key );
}
- public CacheRecord put( List<? extends ClassRealm> extensionRealms, ClassRealm projectRealm,
- DependencyFilter extensionArtifactFilter )
+ public CacheRecord put( Key key, ClassRealm projectRealm, DependencyFilter extensionArtifactFilter )
{
if ( projectRealm == null )
{
throw new NullPointerException();
}
- CacheKey key = new CacheKey( extensionRealms );
-
if ( cache.containsKey( key ) )
{
- throw new IllegalStateException( "Duplicate project realm for extensions " + extensionRealms );
+ throw new IllegalStateException( "Duplicate project realm for extensions " + key );
}
CacheRecord record = new CacheRecord( projectRealm, extensionArtifactFilter );
@@ -107,12 +118,30 @@ public class DefaultProjectRealmCache
public void flush()
{
+ for ( CacheRecord record : cache.values() )
+ {
+ ClassRealm realm = record.realm;
+ try
+ {
+ realm.getWorld().disposeRealm( realm.getId() );
+ }
+ catch ( NoSuchRealmException e )
+ {
+ // ignore
+ }
+ }
cache.clear();
}
- public void register( MavenProject project, CacheRecord record )
+ public void register( MavenProject project, Key key, CacheRecord record )
{
// default cache does not track record usage
}
+ @Override
+ public void dispose()
+ {
+ flush();
+ }
+
}
http://git-wip-us.apache.org/repos/asf/maven/blob/693f8f66/maven-core/src/main/java/org/apache/maven/project/ProjectRealmCache.java
----------------------------------------------------------------------
diff --git a/maven-core/src/main/java/org/apache/maven/project/ProjectRealmCache.java b/maven-core/src/main/java/org/apache/maven/project/ProjectRealmCache.java
index 415eab9..779d96b 100644
--- a/maven-core/src/main/java/org/apache/maven/project/ProjectRealmCache.java
+++ b/maven-core/src/main/java/org/apache/maven/project/ProjectRealmCache.java
@@ -35,6 +35,14 @@ import org.eclipse.aether.graph.DependencyFilter;
public interface ProjectRealmCache
{
+ /**
+ * A cache key.
+ */
+ interface Key
+ {
+ // marker interface for cache keys
+ }
+
static class CacheRecord
{
@@ -50,10 +58,11 @@ public interface ProjectRealmCache
}
- CacheRecord get( List<? extends ClassRealm> extensionRealms );
+ Key createKey( List<? extends ClassRealm> extensionRealms );
+
+ CacheRecord get( Key key );
- CacheRecord put( List<? extends ClassRealm> extensionRealms, ClassRealm projectRealm,
- DependencyFilter extensionArtifactFilter );
+ CacheRecord put( Key key, ClassRealm projectRealm, DependencyFilter extensionArtifactFilter );
void flush();
@@ -65,6 +74,6 @@ public interface ProjectRealmCache
* @param project The project that employs the plugin realm, must not be {@code null}.
* @param record The cache record being used for the project, must not be {@code null}.
*/
- void register( MavenProject project, CacheRecord record );
+ void register( MavenProject project, Key key, CacheRecord record );
}