bodewig 2003/07/04 01:44:50 Modified: src/main/org/apache/tools/ant RuntimeConfigurable.java Target.java UnknownElement.java Log: Reduce memory consumption by using lazy initialization. Speed things up a little by using unsynchronized collections. PR: 21296 Revision Changes Path 1.36 +69 -18 ant/src/main/org/apache/tools/ant/RuntimeConfigurable.java Index: RuntimeConfigurable.java =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/RuntimeConfigurable.java,v retrieving revision 1.35 retrieving revision 1.36 diff -u -r1.35 -r1.36 --- RuntimeConfigurable.java 26 Jun 2003 08:54:28 -0000 1.35 +++ RuntimeConfigurable.java 4 Jul 2003 08:44:50 -0000 1.36 @@ -54,11 +54,16 @@ package org.apache.tools.ant; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Collections; import java.util.Enumeration; -import java.util.Locale; -import java.util.Vector; +import java.util.HashMap; import java.util.Hashtable; -import java.io.Serializable; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.NoSuchElementException; import org.xml.sax.AttributeList; import org.xml.sax.helpers.AttributeListImpl; @@ -76,7 +81,7 @@ private String elementTag = null; /** List of child element wrappers. */ - private Vector children = new Vector(); + private List/*<RuntimeConfigurable>*/ children = null; /** The element to configure. It is only used during * maybeConfigure. @@ -94,14 +99,15 @@ * exact order. The following code is copied from AttributeImpl. * We could also just use SAX2 Attributes and convert to SAX1 ( DOM * attribute Nodes can also be stored in SAX2 Attributges ) + * XXX under JDK 1.4 you can just use a LinkedHashMap for this purpose -jglick */ - private Vector attributeNames = new Vector(); + private List/*<String>*/ attributeNames = null; /** Map of attribute names to values */ - private Hashtable attributeMap = new Hashtable(); + private Map/*<String,String>*/ attributeMap = null; /** Text appearing within the element. */ - private StringBuffer characters = new StringBuffer(); + private StringBuffer characters = null; /** Indicates if the wrapped object has been configured */ private boolean proxyConfigured = false; @@ -164,7 +170,11 @@ * @param value the attribute's value. */ public void setAttribute(String name, String value) { - attributeNames.addElement(name); + if (attributeNames == null) { + attributeNames = new ArrayList(); + attributeMap = new HashMap(); + } + attributeNames.add(name); attributeMap.put(name, value); } @@ -173,7 +183,12 @@ * @return Attribute name to attribute value map */ public Hashtable getAttributeMap() { - return attributeMap; + // Nobody calls this method, maybe it could just be deleted? + if (attributeMap != null) { + return new Hashtable(attributeMap); + } else { + return new Hashtable(1); + } } /** @@ -194,7 +209,10 @@ * Must not be <code>null</code>. */ public void addChild(RuntimeConfigurable child) { - children.addElement(child); + if (children == null) { + children = new ArrayList(); + } + children.add(child); } /** @@ -206,7 +224,7 @@ * list. */ RuntimeConfigurable getChild(int index) { - return (RuntimeConfigurable) children.elementAt(index); + return (RuntimeConfigurable) children.get(index); } /** @@ -215,7 +233,21 @@ * @since Ant 1.5.1 */ Enumeration getChildren() { - return children.elements(); + if (children != null) { + return Collections.enumeration(children); + } else { + return new EmptyEnumeration(); + } + } + + static final class EmptyEnumeration implements Enumeration { + public EmptyEnumeration() {} + public boolean hasMoreElements() { + return false; + } + public Object nextElement() throws NoSuchElementException { + throw new NoSuchElementException(); + } } /** @@ -225,7 +257,14 @@ * Should not be <code>null</code>. */ public void addText(String data) { - characters.append(data); + if (data.length() == 0) { + return; + } + if (characters != null) { + characters.append(data); + } else { + characters = new StringBuffer(data); + } } /** @@ -238,7 +277,13 @@ * */ public void addText(char[] buf, int start, int count) { - addText(new String(buf, start, count)); + if (count == 0) { + return; + } + if (characters == null) { + characters = new StringBuffer(count); + } + characters.append(buf, start, count); } /** Get the text content of this element. Various text chunks are @@ -248,7 +293,11 @@ * @return the text content of this element. */ public StringBuffer getText() { - return characters; + if (characters != null) { + return characters; + } else { + return new StringBuffer(0); + } } /** @@ -317,8 +366,9 @@ IntrospectionHelper ih = IntrospectionHelper.getHelper(p, target.getClass()); + if (attributeNames != null) { for (int i = 0; i < attributeNames.size(); i++) { - String name = (String) attributeNames.elementAt(i); + String name = (String) attributeNames.get(i); String value = (String) attributeMap.get(name); // reflect these into the target @@ -334,12 +384,13 @@ } } id = (String) attributeMap.get("id"); + } - if (characters.length() != 0) { + if (characters != null) { ProjectHelper.addText(p, wrappedObject, characters.substring(0)); } - Enumeration enum = children.elements(); + Enumeration enum = getChildren(); while (enum.hasMoreElements()) { RuntimeConfigurable child = (RuntimeConfigurable) enum.nextElement(); 1.37 +29 -21 ant/src/main/org/apache/tools/ant/Target.java Index: Target.java =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/Target.java,v retrieving revision 1.36 retrieving revision 1.37 diff -u -r1.36 -r1.37 --- Target.java 10 Feb 2003 14:13:30 -0000 1.36 +++ Target.java 4 Jul 2003 08:44:50 -0000 1.37 @@ -1,7 +1,7 @@ /* * The Apache Software License, Version 1.1 * - * Copyright (c) 2000-2002 The Apache Software Foundation. All rights + * Copyright (c) 2000-2003 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without @@ -54,9 +54,12 @@ package org.apache.tools.ant; +import java.util.ArrayList; +import java.util.Collections; import java.util.Enumeration; +import java.util.Iterator; +import java.util.List; import java.util.StringTokenizer; -import java.util.Vector; /** * Class to implement a target object with required parameters. @@ -72,9 +75,9 @@ /** The "unless" condition to test on execution. */ private String unlessCondition = ""; /** List of targets this target is dependent on. */ - private Vector dependencies = new Vector(2); + private List/*<String>*/ dependencies = null; /** Children of this target (tasks and data types). */ - private Vector children = new Vector(5); + private List/*<Task|RuntimeConfigurable>*/ children = new ArrayList(5); /** Project this target belongs to. */ private Project project; /** Description of this target, if any. */ @@ -166,7 +169,7 @@ * @param task The task to be added. Must not be <code>null</code>. */ public void addTask(Task task) { - children.addElement(task); + children.add(task); } /** @@ -176,7 +179,7 @@ * Must not be <code>null</code>. */ public void addDataType(RuntimeConfigurable r) { - children.addElement(r); + children.add(r); } /** @@ -185,18 +188,16 @@ * @return an array of the tasks currently within this target */ public Task[] getTasks() { - Vector tasks = new Vector(children.size()); - Enumeration enum = children.elements(); - while (enum.hasMoreElements()) { - Object o = enum.nextElement(); + List tasks = new ArrayList(children.size()); + Iterator it = children.iterator(); + while (it.hasNext()) { + Object o = it.next(); if (o instanceof Task) { - tasks.addElement(o); + tasks.add(o); } } - Task[] retval = new Task[tasks.size()]; - tasks.copyInto(retval); - return retval; + return (Task[])tasks.toArray(new Task[tasks.size()]); } /** @@ -206,7 +207,10 @@ * Must not be <code>null</code>. */ public void addDependency(String dependency) { - dependencies.addElement(dependency); + if (dependencies == null) { + dependencies = new ArrayList(2); + } + dependencies.add(dependency); } /** @@ -215,7 +219,11 @@ * @return an enumeration of the dependencies of this target */ public Enumeration getDependencies() { - return dependencies.elements(); + if (dependencies != null) { + return Collections.enumeration(dependencies); + } else { + return new RuntimeConfigurable.EmptyEnumeration(); + } } /** @@ -301,9 +309,9 @@ */ public void execute() throws BuildException { if (testIfCondition() && testUnlessCondition()) { - Enumeration enum = children.elements(); - while (enum.hasMoreElements()) { - Object o = enum.nextElement(); + Iterator it = children.iterator(); + while (it.hasNext()) { + Object o = it.next(); if (o instanceof Task) { Task task = (Task) o; task.perform(); @@ -352,7 +360,7 @@ void replaceChild(Task el, RuntimeConfigurable o) { int index; while ((index = children.indexOf(el)) >= 0) { - children.setElementAt(o, index); + children.set(index, o); } } @@ -367,7 +375,7 @@ void replaceChild(Task el, Task o) { int index; while ((index = children.indexOf(el)) >= 0) { - children.setElementAt(o, index); + children.set(index, o); } } 1.52 +13 -5 ant/src/main/org/apache/tools/ant/UnknownElement.java Index: UnknownElement.java =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/UnknownElement.java,v retrieving revision 1.51 retrieving revision 1.52 diff -u -r1.51 -r1.52 --- UnknownElement.java 26 Jun 2003 08:54:28 -0000 1.51 +++ UnknownElement.java 4 Jul 2003 08:44:50 -0000 1.52 @@ -54,8 +54,10 @@ package org.apache.tools.ant; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; import java.util.Locale; -import java.util.Vector; import java.io.IOException; /** @@ -87,7 +89,7 @@ /** * List of child elements (UnknownElements). */ - private Vector children = new Vector(); + private List/*<UnknownElement>*/ children = null; /** * Creates an UnknownElement for the given element name. @@ -281,7 +283,10 @@ * @param child The child element to add. Must not be <code>null</code>. */ public void addChild(UnknownElement child) { - children.addElement(child); + if (children == null) { + children = new ArrayList(); + } + children.add(child); } /** @@ -307,9 +312,11 @@ Class parentClass = parent.getClass(); IntrospectionHelper ih = IntrospectionHelper.getHelper(parentClass); - for (int i = 0; i < children.size(); i++) { + if (children != null) { + Iterator it = children.iterator(); + for (int i = 0; it.hasNext(); i++) { RuntimeConfigurable childWrapper = parentWrapper.getChild(i); - UnknownElement child = (UnknownElement) children.elementAt(i); + UnknownElement child = (UnknownElement) it.next(); // backwards compatibility - element names of nested // elements have been all lower-case in Ant, except for @@ -326,6 +333,7 @@ container.addTask(child); } } + } } }
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]