Clean up the caching to use weak hashmaps, to conserve some memory in large builds.

git-svn-id: https://svn.apache.org/repos/asf/maven/components/trunk@593287 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
John Dennis Casey 2007-11-08 20:15:20 +00:00
parent 4c2d75b726
commit f1973980a5
10 changed files with 70 additions and 114 deletions

View File

@ -30,6 +30,7 @@
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.WeakHashMap;
/**
* This cache is meant to provide a reference of the project instances that are in the current build
@ -37,30 +38,30 @@
* to store inter-project references as such in MavenProject instances. An ArtifactResolver instance
* will be used that can utilize this cache, but will also wrap the "default" ArtifactResolver
* instance, so that can be used as a target for replacement implementations.
*
*
* To retrieve from the build context: buildContext.retrieve( new ProjectBuildCache( false ) );
*
*
* @author jdcasey
*/
public class ProjectBuildCache
implements ManagedBuildData
{
private static final String BUILD_CONTEXT_KEY = ProjectBuildCache.class.getName();
private static final String PROJECT_CACHE = "project-cache";
private static final String POM_FILE_CACHE = "pom-file-cache";
private Map projectCache;
private Map pomFileCache;
public ProjectBuildCache()
{
this( true );
}
/**
* @param liveInstance If false, this instance's state is meant to be retrieved from the build
* context. If true, this instance can serve as the authoritative instance where the cache is
@ -70,26 +71,26 @@ public ProjectBuildCache( boolean liveInstance )
{
if ( liveInstance )
{
projectCache = new HashMap();
pomFileCache = new HashMap();
projectCache = new WeakHashMap();
pomFileCache = new WeakHashMap();
}
}
public void cacheProject( MavenProject project )
{
projectCache.put( generateCacheKey( project ), project );
}
public MavenProject getCachedProject( String groupId, String artifactId, String version )
{
return (MavenProject) projectCache.get( generateCacheKey( groupId, artifactId, version ) );
}
public MavenProject getCachedProject( Artifact artifact )
{
return (MavenProject) projectCache.get( generateCacheKey( artifact ) );
}
public MavenProject getCachedProject( MavenProject exampleInstance )
{
return (MavenProject) projectCache.get( generateCacheKey( exampleInstance ) );
@ -99,7 +100,7 @@ public void cacheModelFileForModel( File modelFile, Model model )
{
pomFileCache.put( generateCacheKey( model ), modelFile );
}
public File getCachedModelFile( Artifact artifact )
{
return (File) pomFileCache.get( generateCacheKey( artifact ) );
@ -118,10 +119,10 @@ public File getCachedModelFile( String groupId, String artifactId, String versio
public Map getData()
{
Map data = new HashMap( 2 );
data.put( PROJECT_CACHE, projectCache );
data.put( POM_FILE_CACHE, pomFileCache );
return data;
}
@ -132,8 +133,8 @@ public String getStorageKey()
public void setData( Map data )
{
this.projectCache = (Map) data.get( PROJECT_CACHE );
this.pomFileCache = (Map) data.get( POM_FILE_CACHE );
projectCache = (Map) data.get( PROJECT_CACHE );
pomFileCache = (Map) data.get( POM_FILE_CACHE );
}
public void store( BuildContextManager buildContextManager )
@ -146,11 +147,11 @@ public void store( BuildContextManager buildContextManager )
public static ProjectBuildCache read( BuildContextManager buildContextManager )
{
BuildContext buildContext = buildContextManager.readBuildContext( true );
ProjectBuildCache cache = new ProjectBuildCache();
buildContext.retrieve( cache );
return cache;
}
@ -160,7 +161,7 @@ private static String generateCacheKey( Model model )
String groupId = model.getGroupId();
if ( groupId == null && modelParent != null )
if ( ( groupId == null ) && ( modelParent != null ) )
{
groupId = modelParent.getGroupId();
}
@ -169,29 +170,29 @@ private static String generateCacheKey( Model model )
String version = model.getVersion();
if ( version == null && modelParent != null )
if ( ( version == null ) && ( modelParent != null ) )
{
version = modelParent.getVersion();
}
return generateCacheKey( groupId, artifactId, version );
}
private static String generateCacheKey( Parent parent )
{
return generateCacheKey( parent.getGroupId(), parent.getArtifactId(), parent.getVersion() );
}
private static String generateCacheKey( Artifact artifact )
{
return generateCacheKey( artifact.getGroupId(), artifact.getArtifactId(), artifact.getVersion() );
}
private static String generateCacheKey( MavenProject project )
{
return generateCacheKey( project.getGroupId(), project.getArtifactId(), project.getVersion() );
}
private static String generateCacheKey( String groupId, String artifactId, String version )
{
return groupId + ":" + artifactId + ":" + version;

View File

@ -55,15 +55,15 @@ public void testProjectInheritance()
{
File localRepo = getLocalRepositoryPath();
File pom0 = new File( localRepo, "p0/pom.xml" );
File pom0Basedir = pom0.getParentFile();
File pom1 = new File( pom0Basedir, "p1/pom.xml" );
// load everything...
MavenProject project0 = getProject( pom0 );
MavenProject project1 = getProject( pom1 );
assertEquals( pom0Basedir, project1.getParent().getBasedir() );
assertEquals( pom0Basedir, project1.getParent().getBasedir().getCanonicalFile() );
}
}

View File

@ -30,7 +30,7 @@
/**
* Verifies the version of a dependency listed in a parent's
* dependencyManagement section is chosen over another version of the same
* dependency, listed transitively.
* dependency, listed transitively.
*
* @author <a href="mailto:pschneider@gmail.com">Patrick Schneider</a>
* @version $Id$
@ -65,12 +65,12 @@ public void testDependencyManagementOverridesTransitiveDependencyVersion()
MavenProject project0 = getProjectWithDependencies( pom0 );
MavenProject project1 = getProjectWithDependencies( pom1 );
assertEquals( pom0Basedir, project1.getParent().getBasedir() );
assertEquals( pom0Basedir, project1.getParent().getBasedir().getCanonicalFile() );
Set set = project1.getArtifacts();
assertNotNull("No artifacts", set);
assertTrue("No Artifacts", set.size() > 0);
assertTrue("Set size should be 3, is " + set.size(), set.size() == 3);
Iterator iter = set.iterator();
while (iter.hasNext()) {
Artifact artifact = (Artifact)iter.next();

View File

@ -61,7 +61,7 @@ public void testDependencyManagement()
MavenProject project0 = getProjectWithDependencies( pom0 );
MavenProject project1 = getProjectWithDependencies( pom1 );
assertEquals( pom0Basedir, project1.getParent().getBasedir() );
assertEquals( pom0Basedir, project1.getParent().getBasedir().getCanonicalFile() );
Set set = project1.getArtifacts();
assertNotNull("No artifacts", set);
assertTrue("No Artifacts", set.size() > 0);

View File

@ -61,7 +61,7 @@ public void testDependencyManagement()
MavenProject project0 = getProjectWithDependencies( pom0 );
MavenProject project1 = getProjectWithDependencies( pom1 );
assertEquals( pom0Basedir, project1.getParent().getBasedir() );
assertEquals( pom0Basedir, project1.getParent().getBasedir().getCanonicalFile() );
Set set = project1.getArtifacts();
assertNotNull("No artifacts", set);
assertTrue("No Artifacts", set.size() > 0);

View File

@ -19,22 +19,13 @@
* under the License.
*/
import java.io.File;
import java.util.List;
import java.util.Set;
import java.util.Iterator;
import org.apache.maven.model.Build;
import org.apache.maven.model.MailingList;
import org.apache.maven.model.Plugin;
import org.apache.maven.model.PluginExecution;
import org.apache.maven.model.Dependency;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.project.MavenProject;
import org.apache.maven.project.inheritance.AbstractProjectInheritanceTestCase;
import org.apache.maven.artifact.Artifact;
import org.codehaus.plexus.util.xml.Xpp3Dom;
import org.codehaus.plexus.logging.LoggerManager;
import org.codehaus.plexus.logging.Logger;
import java.io.File;
import java.util.Iterator;
import java.util.Set;
/**
* A test which demonstrates maven's dependency management
@ -70,14 +61,14 @@ public void testDependencyManagement()
MavenProject project0 = getProjectWithDependencies( pom0 );
MavenProject project1 = getProjectWithDependencies( pom1 );
assertEquals( pom0Basedir, project1.getParent().getBasedir() );
assertEquals( pom0Basedir, project1.getParent().getBasedir().getCanonicalFile() );
System.out.println("Project " + project1.getId() + " " + project1);
Set set = project1.getArtifacts();
assertNotNull("No artifacts", set);
assertTrue("No Artifacts", set.size() > 0);
Iterator iter = set.iterator();
assertTrue("Set size should be 3, is " + set.size(), set.size() == 3);
while (iter.hasNext())
{
Artifact artifact = (Artifact)iter.next();

View File

@ -61,14 +61,14 @@ public void testDependencyManagement()
MavenProject project0 = getProjectWithDependencies( pom0 );
MavenProject project1 = getProjectWithDependencies( pom1 );
assertEquals( pom0Basedir, project1.getParent().getBasedir() );
assertEquals( pom0Basedir, project1.getParent().getBasedir().getCanonicalFile() );
System.out.println("Project " + project1.getId() + " " + project1);
Set set = project1.getArtifacts();
assertNotNull("No artifacts", set);
assertTrue("No Artifacts", set.size() > 0);
Iterator iter = set.iterator();
assertTrue("Set size should be 4, is " + set.size(), set.size() == 4);
while (iter.hasNext())
{
Artifact artifact = (Artifact)iter.next();

View File

@ -18,23 +18,11 @@
* specific language governing permissions and limitations
* under the License.
*/
import java.io.File;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Iterator;
import org.apache.maven.model.Build;
import org.apache.maven.model.MailingList;
import org.apache.maven.model.Plugin;
import org.apache.maven.model.PluginExecution;
import org.apache.maven.model.Dependency;
import org.apache.maven.project.MavenProject;
import org.apache.maven.project.inheritance.AbstractProjectInheritanceTestCase;
import org.apache.maven.artifact.Artifact;
import org.codehaus.plexus.util.xml.Xpp3Dom;
import org.codehaus.plexus.logging.LoggerManager;
import org.codehaus.plexus.logging.Logger;
import java.io.File;
import java.util.Map;
/**
* Verifies exclusions listed in dependencyManagement are valid for
@ -59,7 +47,7 @@ public class ProjectInheritanceTest
/**
* How the test project is set up:
*
*
* 1. dependencyManagement lists dependencies on a & b,
* with an exclusion on c in b.
* 2. the child project lists a dependency on project a only
@ -82,13 +70,13 @@ public void testDependencyManagementExclusionsExcludeTransitively()
MavenProject project0 = getProjectWithDependencies( pom0 );
MavenProject project1 = getProjectWithDependencies( pom1 );
assertEquals( pom0Basedir, project1.getParent().getBasedir() );
assertEquals( pom0Basedir, project1.getParent().getBasedir().getCanonicalFile() );
Map map = project1.getArtifactMap();
assertNotNull("No artifacts", map);
assertTrue("No Artifacts", map.size() > 0);
assertTrue("Set size should be 2, is " + map.size(), map.size() == 2);
assertTrue("maven-test:t09-a is not in the project", map.containsKey( "maven-test:t09-a" ));
assertTrue("maven-test:t09-b is not in the project", map.containsKey( "maven-test:t09-b" ));
@ -101,7 +89,7 @@ public void testDependencyManagementExclusionsExcludeTransitively()
* project b. We will pick up project c in this case because no
* restrictions were placed on d. This demonstrates that a, b, c, & d will
* all be collected.
*
*
* @throws Exception
*/
public void testDependencyManagementExclusionDoesNotOverrideGloballyForTransitives()
@ -117,7 +105,7 @@ public void testDependencyManagementExclusionDoesNotOverrideGloballyForTransitiv
MavenProject project0 = getProjectWithDependencies( pom0 );
MavenProject project2 = getProjectWithDependencies( pom2 );
assertEquals( pom0Basedir, project2.getParent().getBasedir() );
assertEquals( pom0Basedir, project2.getParent().getBasedir().getCanonicalFile() );
Map map = project2.getArtifactMap();
assertNotNull( "No artifacts", map );
assertTrue( "No Artifacts", map.size() > 0 );

View File

@ -19,29 +19,18 @@
* under the License.
*/
import java.io.File;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Iterator;
import org.apache.maven.model.Build;
import org.apache.maven.model.MailingList;
import org.apache.maven.model.Plugin;
import org.apache.maven.model.PluginExecution;
import org.apache.maven.model.Dependency;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.project.MavenProject;
import org.apache.maven.project.inheritance.AbstractProjectInheritanceTestCase;
import org.apache.maven.artifact.Artifact;
import org.codehaus.plexus.util.xml.Xpp3Dom;
import org.codehaus.plexus.logging.LoggerManager;
import org.codehaus.plexus.logging.Logger;
import java.io.File;
import java.util.Map;
/**
* Verifies scope inheritence of direct and transitive dependencies.
*
*
* Should show three behaviors:
*
*
* 1. dependencyManagement should override the scope of transitive dependencies.
* 2. Direct dependencies should override the scope of dependencyManagement.
* 3. Direct dependencies should inherit scope from dependencyManagement when
@ -77,27 +66,27 @@ public void testDependencyManagementOverridesTransitiveDependencyVersion()
MavenProject project0 = getProjectWithDependencies( pom0 );
MavenProject project1 = getProjectWithDependencies( pom1 );
assertEquals( pom0Basedir, project1.getParent().getBasedir() );
assertEquals( pom0Basedir, project1.getParent().getBasedir().getCanonicalFile() );
System.out.println("Project " + project1.getId() + " " + project1);
Map map = project1.getArtifactMap();
assertNotNull("No artifacts", map);
assertTrue("No Artifacts", map.size() > 0);
assertTrue("Set size should be 3, is " + map.size(), map.size() == 3);
Artifact a = (Artifact) map.get("maven-test:t10-a");
Artifact b = (Artifact) map.get("maven-test:t10-b");
Artifact c = (Artifact) map.get("maven-test:t10-c");
assertNotNull( a );
assertNotNull( b );
assertNotNull( c );
// inherited from depMgmt
assertTrue("Incorrect scope for " + a.getDependencyConflictId(), a.getScope().equals("test"));
// transitive dep, overridden b depMgmt
assertTrue("Incorrect scope for " + b.getDependencyConflictId(), b.getScope().equals("runtime"));
// direct dep, overrides depMgmt
assertTrue("Incorrect scope for " + c.getDependencyConflictId(), c.getScope().equals("runtime"));

View File

@ -19,23 +19,10 @@
* under the License.
*/
import java.io.File;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Iterator;
import org.apache.maven.model.Build;
import org.apache.maven.model.MailingList;
import org.apache.maven.model.Plugin;
import org.apache.maven.model.PluginExecution;
import org.apache.maven.model.Dependency;
import org.apache.maven.project.MavenProject;
import org.apache.maven.project.inheritance.AbstractProjectInheritanceTestCase;
import org.apache.maven.artifact.Artifact;
import org.codehaus.plexus.util.xml.Xpp3Dom;
import org.codehaus.plexus.logging.LoggerManager;
import org.codehaus.plexus.logging.Logger;
import java.io.File;
/**
* Verifies scope of root project is preserved regardless of parent depenedency management.
@ -71,7 +58,7 @@ public void testDependencyManagementDoesNotOverrideScopeOfCurrentArtifact()
MavenProject project0 = getProjectWithDependencies( pom0 );
MavenProject project1 = getProjectWithDependencies( pom1 );
assertEquals( pom0Basedir, project1.getParent().getBasedir() );
assertEquals( pom0Basedir, project1.getParent().getBasedir().getCanonicalFile() );
assertNull( "dependencyManagement has overwritten the scope of the currently building child project",
project1.getArtifact().getScope() );
}