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;