You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@ant.apache.org by xa...@apache.org on 2007/12/07 20:59:57 UTC
svn commit: r602200 - in /ant/ivy/core/trunk: CHANGES.txt
src/java/org/apache/ivy/core/module/descriptor/DefaultDependencyDescriptor.java
src/java/org/apache/ivy/core/module/id/ModuleId.java
src/java/org/apache/ivy/core/module/id/ModuleRevisionId.java
Author: xavier
Date: Fri Dec 7 11:59:56 2007
New Revision: 602200
URL: http://svn.apache.org/viewvc?rev=602200&view=rev
Log:
IMPROVEMENT: Decrease memory footprint (IVY-662)
Modified:
ant/ivy/core/trunk/CHANGES.txt
ant/ivy/core/trunk/src/java/org/apache/ivy/core/module/descriptor/DefaultDependencyDescriptor.java
ant/ivy/core/trunk/src/java/org/apache/ivy/core/module/id/ModuleId.java
ant/ivy/core/trunk/src/java/org/apache/ivy/core/module/id/ModuleRevisionId.java
Modified: ant/ivy/core/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/CHANGES.txt?rev=602200&r1=602199&r2=602200&view=diff
==============================================================================
--- ant/ivy/core/trunk/CHANGES.txt (original)
+++ ant/ivy/core/trunk/CHANGES.txt Fri Dec 7 11:59:56 2007
@@ -57,6 +57,8 @@
version in SVN
=====================================
+- IMPROVEMENT: Decrease memory footprint (IVY-662)
+
- FIX: Strict conflictmanager seems to not support dynamic revisions (IVY-474)
- FIX: NPE in namespace transformation during the ivy:findrevision and ivy:resolve task execution (IVY-659) (thanks to Andrea Bernardo Ciddio)
Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/core/module/descriptor/DefaultDependencyDescriptor.java
URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/core/module/descriptor/DefaultDependencyDescriptor.java?rev=602200&r1=602199&r2=602200&view=diff
==============================================================================
--- ant/ivy/core/trunk/src/java/org/apache/ivy/core/module/descriptor/DefaultDependencyDescriptor.java (original)
+++ ant/ivy/core/trunk/src/java/org/apache/ivy/core/module/descriptor/DefaultDependencyDescriptor.java Fri Dec 7 11:59:56 2007
@@ -47,7 +47,7 @@
private static final Pattern SELF_FALLBACK_PATTERN = Pattern.compile("@(\\(.*\\))?");
private static final Pattern THIS_FALLBACK_PATTERN = Pattern.compile("#(\\(.*\\))?");
-
+
/**
* Transforms the given dependency descriptor of the given namespace and return a new dependency
* descriptor in the system namespace. <i>Note that exclude rules are not converted in system
@@ -89,9 +89,9 @@
if (dd instanceof DefaultDependencyDescriptor) {
DefaultDependencyDescriptor ddd = (DefaultDependencyDescriptor) dd;
newdd.confs = new LinkedHashMap(ddd.confs);
- newdd.excludeRules = new LinkedHashMap(ddd.excludeRules);
- newdd.includeRules = new LinkedHashMap(ddd.includeRules);
- newdd.dependencyArtifacts = new LinkedHashMap(ddd.dependencyArtifacts);
+ newdd.setExcludeRules(new LinkedHashMap(ddd.getExcludeRules()));
+ newdd.setIncludeRules(new LinkedHashMap(ddd.getIncludeRules()));
+ newdd.setDependencyArtifacts(new LinkedHashMap(ddd.getDependencyArtifacts()));
} else {
throw new IllegalArgumentException(
"dependency descriptor transformation does not support * module confs "
@@ -101,11 +101,11 @@
for (int i = 0; i < moduleConfs.length; i++) {
newdd.confs.put(moduleConfs[i], new ArrayList(Arrays.asList(dd
.getDependencyConfigurations(moduleConfs[i]))));
- newdd.excludeRules.put(moduleConfs[i], new ArrayList(Arrays.asList(dd
+ newdd.getExcludeRules().put(moduleConfs[i], new ArrayList(Arrays.asList(dd
.getExcludeRules(moduleConfs[i]))));
- newdd.includeRules.put(moduleConfs[i], new ArrayList(Arrays.asList(dd
+ newdd.getIncludeRules().put(moduleConfs[i], new ArrayList(Arrays.asList(dd
.getIncludeRules(moduleConfs[i]))));
- newdd.dependencyArtifacts.put(moduleConfs[i], new ArrayList(Arrays.asList(dd
+ newdd.getDependencyArtifacts().put(moduleConfs[i], new ArrayList(Arrays.asList(dd
.getDependencyArtifacts(moduleConfs[i]))));
}
}
@@ -120,15 +120,13 @@
private Map confs = new LinkedHashMap();
// Map (String masterConf -> Collection(DependencyArtifactDescriptor))
- private Map dependencyArtifacts = new LinkedHashMap();
+ private Map dependencyArtifacts; // initialized on demand only for memory consumption reason
// Map (String masterConf -> Collection(IncludeRule))
- private Map includeRules = new LinkedHashMap();
+ private Map includeRules; // initialized on demand only for memory consumption reason
// Map (String masterConf -> Collection(ExcludeRule))
- private Map excludeRules = new LinkedHashMap();
-
- private Set extendsConfs = new LinkedHashSet();
+ private Map excludeRules; // initialized on demand only for memory consumption reason
/**
* Used to indicate that this revision must be used in case of conflicts, independently of
@@ -163,6 +161,8 @@
isChanging = dd.isChanging();
isTransitive = dd.isTransitive();
String[] moduleConfs = dd.getModuleConfigurations();
+ Map excludeRules = getExcludeRules();
+ Map includeRules = getIncludeRules();
for (int i = 0; i < moduleConfs.length; i++) {
confs.put(moduleConfs[i], new ArrayList(Arrays.asList(dd
.getDependencyConfigurations(moduleConfs[i]))));
@@ -327,7 +327,7 @@
}
private Set getCollectionForConfiguration(String moduleConfiguration, Map collectionMap) {
- if (collectionMap.isEmpty()) {
+ if (collectionMap == null || collectionMap.isEmpty()) {
return Collections.EMPTY_SET;
}
Collection artifacts = (Collection) collectionMap.get(moduleConfiguration);
@@ -368,17 +368,26 @@
}
public DependencyArtifactDescriptor[] getAllDependencyArtifacts() {
+ if (dependencyArtifacts == null) {
+ return new DependencyArtifactDescriptor[0];
+ }
Set ret = mergeAll(dependencyArtifacts);
return (DependencyArtifactDescriptor[]) ret.toArray(new DependencyArtifactDescriptor[ret
.size()]);
}
public IncludeRule[] getAllIncludeRules() {
+ if (includeRules == null) {
+ return new IncludeRule[0];
+ }
Set ret = mergeAll(includeRules);
return (IncludeRule[]) ret.toArray(new IncludeRule[ret.size()]);
}
public ExcludeRule[] getAllExcludeRules() {
+ if (excludeRules == null) {
+ return new ExcludeRule[0];
+ }
Set ret = mergeAll(excludeRules);
return (ExcludeRule[]) ret.toArray(new ExcludeRule[ret.size()]);
}
@@ -412,15 +421,15 @@
}
public void addDependencyArtifact(String masterConf, DependencyArtifactDescriptor dad) {
- addObjectToConfiguration(masterConf, dad, dependencyArtifacts);
+ addObjectToConfiguration(masterConf, dad, getDependencyArtifacts());
}
public void addIncludeRule(String masterConf, IncludeRule rule) {
- addObjectToConfiguration(masterConf, rule, includeRules);
+ addObjectToConfiguration(masterConf, rule, getIncludeRules());
}
public void addExcludeRule(String masterConf, ExcludeRule rule) {
- addObjectToConfiguration(masterConf, rule, excludeRules);
+ addObjectToConfiguration(masterConf, rule, getExcludeRules());
}
private void addObjectToConfiguration(String callerConf, Object toAdd, Map confsMap) {
@@ -456,11 +465,7 @@
* @return
*/
public boolean canExclude() {
- return !excludeRules.isEmpty();
- }
-
- public void addExtends(String conf) {
- extendsConfs.add(conf);
+ return excludeRules != null && !excludeRules.isEmpty();
}
public String toString() {
@@ -513,6 +518,39 @@
public DependencyDescriptor asSystem() {
return asSystem;
+ }
+
+ private void setDependencyArtifacts(Map dependencyArtifacts) {
+ this.dependencyArtifacts = dependencyArtifacts;
+ }
+
+ private Map getDependencyArtifacts() {
+ if (dependencyArtifacts == null) {
+ dependencyArtifacts = new LinkedHashMap();
+ }
+ return dependencyArtifacts;
+ }
+
+ private void setIncludeRules(Map includeRules) {
+ this.includeRules = includeRules;
+ }
+
+ private Map getIncludeRules() {
+ if (includeRules == null) {
+ includeRules = new LinkedHashMap();
+ }
+ return includeRules;
+ }
+
+ private void setExcludeRules(Map excludeRules) {
+ this.excludeRules = excludeRules;
+ }
+
+ private Map getExcludeRules() {
+ if (excludeRules == null) {
+ excludeRules = new LinkedHashMap();
+ }
+ return excludeRules;
}
}
Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/core/module/id/ModuleId.java
URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/core/module/id/ModuleId.java?rev=602200&r1=602199&r2=602200&view=diff
==============================================================================
--- ant/ivy/core/trunk/src/java/org/apache/ivy/core/module/id/ModuleId.java (original)
+++ ant/ivy/core/trunk/src/java/org/apache/ivy/core/module/id/ModuleId.java Fri Dec 7 11:59:56 2007
@@ -17,11 +17,49 @@
*/
package org.apache.ivy.core.module.id;
+import java.util.Map;
+import java.util.WeakHashMap;
+
/**
*
*/
public class ModuleId implements Comparable {
static final String ENCODE_SEPARATOR = ":#@#:";
+
+ private static final Map/*<ModuleId, ModuleId>*/ CACHE = new WeakHashMap();
+
+ /**
+ * Returns a ModuleId for the given organization and module name.
+ *
+ * @param org
+ * the module's organization, can be <code>null</code>
+ * @param name
+ * the module's name, must not be <code>null</code>
+ * @return a ModuleId instance
+ */
+ public static ModuleId newInstance(String org, String name) {
+ return intern(new ModuleId(org, name));
+ }
+ /**
+ * Returns an intern instance of a ModuleId equals to the given ModuleId if any, or the given
+ * ModuleId.
+ * <p>
+ * This is useful to reduce the number of instances of ModuleId kept in memory, and thus reduce
+ * memory footprint.
+ * </p>
+ *
+ * @param moduleId
+ * the module id to return
+ * @return a unit instance of the given module id.
+ */
+ public static ModuleId intern(ModuleId moduleId) {
+ ModuleId r = (ModuleId) CACHE.get(moduleId);
+ if (r == null) {
+ r = moduleId;
+ CACHE.put(r, r);
+ }
+ return r;
+ }
private String organisation;
Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/core/module/id/ModuleRevisionId.java
URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/core/module/id/ModuleRevisionId.java?rev=602200&r1=602199&r2=602200&view=diff
==============================================================================
--- ant/ivy/core/trunk/src/java/org/apache/ivy/core/module/id/ModuleRevisionId.java (original)
+++ ant/ivy/core/trunk/src/java/org/apache/ivy/core/module/id/ModuleRevisionId.java Fri Dec 7 11:59:56 2007
@@ -20,6 +20,7 @@
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
+import java.util.WeakHashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -42,6 +43,9 @@
private static final String REV_STRICT_CHARS_PATTERN
= "[a-zA-Z0-9\\-/\\._+=,\\[\\]\\{\\}\\(\\):@]";
+
+ private static final Map/*<ModuleRevisionId, ModuleRevisionId>*/ CACHE = new WeakHashMap();
+
/**
* Pattern to use to matched mrid text representation.
* @see #parse(String)
@@ -91,28 +95,60 @@
}
public static ModuleRevisionId newInstance(String organisation, String name, String revision) {
- return new ModuleRevisionId(new ModuleId(organisation, name), revision);
+ return intern(
+ new ModuleRevisionId(ModuleId.newInstance(organisation, name), revision));
}
public static ModuleRevisionId newInstance(String organisation, String name, String revision,
Map extraAttributes) {
- return new ModuleRevisionId(new ModuleId(organisation, name), revision, extraAttributes);
+ return intern(
+ new ModuleRevisionId(ModuleId.newInstance(organisation, name),
+ revision, extraAttributes));
}
public static ModuleRevisionId newInstance(String organisation, String name, String branch,
String revision) {
- return new ModuleRevisionId(new ModuleId(organisation, name), branch, revision);
+ return intern(
+ new ModuleRevisionId(ModuleId.newInstance(organisation, name),
+ branch, revision));
}
public static ModuleRevisionId newInstance(String organisation, String name, String branch,
String revision, Map extraAttributes) {
- return new ModuleRevisionId(new ModuleId(organisation, name), branch, revision,
- extraAttributes);
+ return intern(
+ new ModuleRevisionId(ModuleId.newInstance(organisation, name),
+ branch, revision, extraAttributes));
}
public static ModuleRevisionId newInstance(ModuleRevisionId mrid, String rev) {
- return new ModuleRevisionId(mrid.getModuleId(), mrid.getBranch(), rev, mrid
- .getExtraAttributes());
+ return intern(
+ new ModuleRevisionId(mrid.getModuleId(),
+ mrid.getBranch(), rev, mrid.getExtraAttributes()));
+ }
+
+ /**
+ * Returns an intern instance of the given ModuleRevisionId if any, or put the given
+ * ModuleRevisionId in a cache of intern instances and returns it.
+ * <p>
+ * This method should be called on ModuleRevisionId created with one of the constructor to
+ * decrease memory footprint.
+ * </p>
+ * <p>
+ * When using static newInstances methods, this method is already called.
+ * </p>
+ *
+ * @param moduleRevisionId
+ * the module revision id to intern
+ * @return an interned ModuleRevisionId
+ */
+ public static ModuleRevisionId intern(ModuleRevisionId moduleRevisionId) {
+ ModuleRevisionId r = (ModuleRevisionId) CACHE.get(moduleRevisionId);
+ if (r == null) {
+ r = moduleRevisionId;
+ CACHE.put(r, r);
+
+ }
+ return r;
}
private final ModuleId moduleId;
@@ -123,6 +159,8 @@
private int hash;
+ // TODO: make these constructors private and use only static factory methods
+
public ModuleRevisionId(ModuleId moduleId, String revision) {
this(moduleId, null, revision, null);
}
@@ -131,11 +169,11 @@
this(moduleId, branch, revision, null);
}
- public ModuleRevisionId(ModuleId moduleId, String revision, Map extraAttributes) {
+ private ModuleRevisionId(ModuleId moduleId, String revision, Map extraAttributes) {
this(moduleId, null, revision, extraAttributes);
}
- public ModuleRevisionId(ModuleId moduleId, String branch, String revision,
+ private ModuleRevisionId(ModuleId moduleId, String branch, String revision,
Map extraAttributes) {
super(null, extraAttributes);
this.moduleId = moduleId;