Speed things up a little by using unsynchronized collections. PR: 21296 git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@274758 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -54,11 +54,16 @@ | |||||
| package org.apache.tools.ant; | package org.apache.tools.ant; | ||||
| import java.io.Serializable; | |||||
| import java.util.ArrayList; | |||||
| import java.util.Collections; | |||||
| import java.util.Enumeration; | import java.util.Enumeration; | ||||
| import java.util.Locale; | |||||
| import java.util.Vector; | |||||
| import java.util.HashMap; | |||||
| import java.util.Hashtable; | 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.AttributeList; | ||||
| import org.xml.sax.helpers.AttributeListImpl; | import org.xml.sax.helpers.AttributeListImpl; | ||||
| @@ -76,7 +81,7 @@ public class RuntimeConfigurable implements Serializable { | |||||
| private String elementTag = null; | private String elementTag = null; | ||||
| /** List of child element wrappers. */ | /** List of child element wrappers. */ | ||||
| private Vector children = new Vector(); | |||||
| private List/*<RuntimeConfigurable>*/ children = null; | |||||
| /** The element to configure. It is only used during | /** The element to configure. It is only used during | ||||
| * maybeConfigure. | * maybeConfigure. | ||||
| @@ -94,14 +99,15 @@ public class RuntimeConfigurable implements Serializable { | |||||
| * exact order. The following code is copied from AttributeImpl. | * exact order. The following code is copied from AttributeImpl. | ||||
| * We could also just use SAX2 Attributes and convert to SAX1 ( DOM | * We could also just use SAX2 Attributes and convert to SAX1 ( DOM | ||||
| * attribute Nodes can also be stored in SAX2 Attributges ) | * 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 */ | /** Map of attribute names to values */ | ||||
| private Hashtable attributeMap = new Hashtable(); | |||||
| private Map/*<String,String>*/ attributeMap = null; | |||||
| /** Text appearing within the element. */ | /** Text appearing within the element. */ | ||||
| private StringBuffer characters = new StringBuffer(); | |||||
| private StringBuffer characters = null; | |||||
| /** Indicates if the wrapped object has been configured */ | /** Indicates if the wrapped object has been configured */ | ||||
| private boolean proxyConfigured = false; | private boolean proxyConfigured = false; | ||||
| @@ -164,7 +170,11 @@ public class RuntimeConfigurable implements Serializable { | |||||
| * @param value the attribute's value. | * @param value the attribute's value. | ||||
| */ | */ | ||||
| public void setAttribute(String name, String 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); | attributeMap.put(name, value); | ||||
| } | } | ||||
| @@ -173,7 +183,12 @@ public class RuntimeConfigurable implements Serializable { | |||||
| * @return Attribute name to attribute value map | * @return Attribute name to attribute value map | ||||
| */ | */ | ||||
| public Hashtable getAttributeMap() { | 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 @@ public class RuntimeConfigurable implements Serializable { | |||||
| * Must not be <code>null</code>. | * Must not be <code>null</code>. | ||||
| */ | */ | ||||
| public void addChild(RuntimeConfigurable child) { | public void addChild(RuntimeConfigurable child) { | ||||
| children.addElement(child); | |||||
| if (children == null) { | |||||
| children = new ArrayList(); | |||||
| } | |||||
| children.add(child); | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -206,7 +224,7 @@ public class RuntimeConfigurable implements Serializable { | |||||
| * list. | * list. | ||||
| */ | */ | ||||
| RuntimeConfigurable getChild(int index) { | RuntimeConfigurable getChild(int index) { | ||||
| return (RuntimeConfigurable) children.elementAt(index); | |||||
| return (RuntimeConfigurable) children.get(index); | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -215,7 +233,21 @@ public class RuntimeConfigurable implements Serializable { | |||||
| * @since Ant 1.5.1 | * @since Ant 1.5.1 | ||||
| */ | */ | ||||
| Enumeration getChildren() { | 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 @@ public class RuntimeConfigurable implements Serializable { | |||||
| * Should not be <code>null</code>. | * Should not be <code>null</code>. | ||||
| */ | */ | ||||
| public void addText(String data) { | 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 class RuntimeConfigurable implements Serializable { | |||||
| * | * | ||||
| */ | */ | ||||
| public void addText(char[] buf, int start, int count) { | 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 | /** Get the text content of this element. Various text chunks are | ||||
| @@ -248,7 +293,11 @@ public class RuntimeConfigurable implements Serializable { | |||||
| * @return the text content of this element. | * @return the text content of this element. | ||||
| */ | */ | ||||
| public StringBuffer getText() { | public StringBuffer getText() { | ||||
| return characters; | |||||
| if (characters != null) { | |||||
| return characters; | |||||
| } else { | |||||
| return new StringBuffer(0); | |||||
| } | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -317,8 +366,9 @@ public class RuntimeConfigurable implements Serializable { | |||||
| IntrospectionHelper ih = | IntrospectionHelper ih = | ||||
| IntrospectionHelper.getHelper(p, target.getClass()); | IntrospectionHelper.getHelper(p, target.getClass()); | ||||
| if (attributeNames != null) { | |||||
| for (int i = 0; i < attributeNames.size(); i++) { | 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); | String value = (String) attributeMap.get(name); | ||||
| // reflect these into the target | // reflect these into the target | ||||
| @@ -334,12 +384,13 @@ public class RuntimeConfigurable implements Serializable { | |||||
| } | } | ||||
| } | } | ||||
| id = (String) attributeMap.get("id"); | id = (String) attributeMap.get("id"); | ||||
| } | |||||
| if (characters.length() != 0) { | |||||
| if (characters != null) { | |||||
| ProjectHelper.addText(p, wrappedObject, characters.substring(0)); | ProjectHelper.addText(p, wrappedObject, characters.substring(0)); | ||||
| } | } | ||||
| Enumeration enum = children.elements(); | |||||
| Enumeration enum = getChildren(); | |||||
| while (enum.hasMoreElements()) { | while (enum.hasMoreElements()) { | ||||
| RuntimeConfigurable child | RuntimeConfigurable child | ||||
| = (RuntimeConfigurable) enum.nextElement(); | = (RuntimeConfigurable) enum.nextElement(); | ||||
| @@ -1,7 +1,7 @@ | |||||
| /* | /* | ||||
| * The Apache Software License, Version 1.1 | * 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. | * reserved. | ||||
| * | * | ||||
| * Redistribution and use in source and binary forms, with or without | * Redistribution and use in source and binary forms, with or without | ||||
| @@ -54,9 +54,12 @@ | |||||
| package org.apache.tools.ant; | package org.apache.tools.ant; | ||||
| import java.util.ArrayList; | |||||
| import java.util.Collections; | |||||
| import java.util.Enumeration; | import java.util.Enumeration; | ||||
| import java.util.Iterator; | |||||
| import java.util.List; | |||||
| import java.util.StringTokenizer; | import java.util.StringTokenizer; | ||||
| import java.util.Vector; | |||||
| /** | /** | ||||
| * Class to implement a target object with required parameters. | * Class to implement a target object with required parameters. | ||||
| @@ -72,9 +75,9 @@ public class Target implements TaskContainer { | |||||
| /** The "unless" condition to test on execution. */ | /** The "unless" condition to test on execution. */ | ||||
| private String unlessCondition = ""; | private String unlessCondition = ""; | ||||
| /** List of targets this target is dependent on. */ | /** 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). */ | /** 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. */ | /** Project this target belongs to. */ | ||||
| private Project project; | private Project project; | ||||
| /** Description of this target, if any. */ | /** Description of this target, if any. */ | ||||
| @@ -166,7 +169,7 @@ public class Target implements TaskContainer { | |||||
| * @param task The task to be added. Must not be <code>null</code>. | * @param task The task to be added. Must not be <code>null</code>. | ||||
| */ | */ | ||||
| public void addTask(Task task) { | public void addTask(Task task) { | ||||
| children.addElement(task); | |||||
| children.add(task); | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -176,7 +179,7 @@ public class Target implements TaskContainer { | |||||
| * Must not be <code>null</code>. | * Must not be <code>null</code>. | ||||
| */ | */ | ||||
| public void addDataType(RuntimeConfigurable r) { | public void addDataType(RuntimeConfigurable r) { | ||||
| children.addElement(r); | |||||
| children.add(r); | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -185,18 +188,16 @@ public class Target implements TaskContainer { | |||||
| * @return an array of the tasks currently within this target | * @return an array of the tasks currently within this target | ||||
| */ | */ | ||||
| public Task[] getTasks() { | 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) { | 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 @@ public class Target implements TaskContainer { | |||||
| * Must not be <code>null</code>. | * Must not be <code>null</code>. | ||||
| */ | */ | ||||
| public void addDependency(String dependency) { | public void addDependency(String dependency) { | ||||
| dependencies.addElement(dependency); | |||||
| if (dependencies == null) { | |||||
| dependencies = new ArrayList(2); | |||||
| } | |||||
| dependencies.add(dependency); | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -215,7 +219,11 @@ public class Target implements TaskContainer { | |||||
| * @return an enumeration of the dependencies of this target | * @return an enumeration of the dependencies of this target | ||||
| */ | */ | ||||
| public Enumeration getDependencies() { | public Enumeration getDependencies() { | ||||
| return dependencies.elements(); | |||||
| if (dependencies != null) { | |||||
| return Collections.enumeration(dependencies); | |||||
| } else { | |||||
| return new RuntimeConfigurable.EmptyEnumeration(); | |||||
| } | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -301,9 +309,9 @@ public class Target implements TaskContainer { | |||||
| */ | */ | ||||
| public void execute() throws BuildException { | public void execute() throws BuildException { | ||||
| if (testIfCondition() && testUnlessCondition()) { | 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) { | if (o instanceof Task) { | ||||
| Task task = (Task) o; | Task task = (Task) o; | ||||
| task.perform(); | task.perform(); | ||||
| @@ -352,7 +360,7 @@ public class Target implements TaskContainer { | |||||
| void replaceChild(Task el, RuntimeConfigurable o) { | void replaceChild(Task el, RuntimeConfigurable o) { | ||||
| int index; | int index; | ||||
| while ((index = children.indexOf(el)) >= 0) { | while ((index = children.indexOf(el)) >= 0) { | ||||
| children.setElementAt(o, index); | |||||
| children.set(index, o); | |||||
| } | } | ||||
| } | } | ||||
| @@ -367,7 +375,7 @@ public class Target implements TaskContainer { | |||||
| void replaceChild(Task el, Task o) { | void replaceChild(Task el, Task o) { | ||||
| int index; | int index; | ||||
| while ((index = children.indexOf(el)) >= 0) { | while ((index = children.indexOf(el)) >= 0) { | ||||
| children.setElementAt(o, index); | |||||
| children.set(index, o); | |||||
| } | } | ||||
| } | } | ||||
| @@ -54,8 +54,10 @@ | |||||
| package org.apache.tools.ant; | package org.apache.tools.ant; | ||||
| import java.util.ArrayList; | |||||
| import java.util.Iterator; | |||||
| import java.util.List; | |||||
| import java.util.Locale; | import java.util.Locale; | ||||
| import java.util.Vector; | |||||
| import java.io.IOException; | import java.io.IOException; | ||||
| /** | /** | ||||
| @@ -87,7 +89,7 @@ public class UnknownElement extends Task { | |||||
| /** | /** | ||||
| * List of child elements (UnknownElements). | * List of child elements (UnknownElements). | ||||
| */ | */ | ||||
| private Vector children = new Vector(); | |||||
| private List/*<UnknownElement>*/ children = null; | |||||
| /** | /** | ||||
| * Creates an UnknownElement for the given element name. | * Creates an UnknownElement for the given element name. | ||||
| @@ -281,7 +283,10 @@ public class UnknownElement extends Task { | |||||
| * @param child The child element to add. Must not be <code>null</code>. | * @param child The child element to add. Must not be <code>null</code>. | ||||
| */ | */ | ||||
| public void addChild(UnknownElement child) { | public void addChild(UnknownElement child) { | ||||
| children.addElement(child); | |||||
| if (children == null) { | |||||
| children = new ArrayList(); | |||||
| } | |||||
| children.add(child); | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -307,9 +312,11 @@ public class UnknownElement extends Task { | |||||
| Class parentClass = parent.getClass(); | Class parentClass = parent.getClass(); | ||||
| IntrospectionHelper ih = IntrospectionHelper.getHelper(parentClass); | 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); | RuntimeConfigurable childWrapper = parentWrapper.getChild(i); | ||||
| UnknownElement child = (UnknownElement) children.elementAt(i); | |||||
| UnknownElement child = (UnknownElement) it.next(); | |||||
| // backwards compatibility - element names of nested | // backwards compatibility - element names of nested | ||||
| // elements have been all lower-case in Ant, except for | // elements have been all lower-case in Ant, except for | ||||
| @@ -327,6 +334,7 @@ public class UnknownElement extends Task { | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| } | |||||
| } | } | ||||
| /** | /** | ||||