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; | |||
| 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 @@ public class RuntimeConfigurable implements Serializable { | |||
| 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 @@ public class RuntimeConfigurable implements Serializable { | |||
| * 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 @@ public class RuntimeConfigurable implements Serializable { | |||
| * @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 @@ public class RuntimeConfigurable implements Serializable { | |||
| * @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 @@ public class RuntimeConfigurable implements Serializable { | |||
| * 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 @@ public class RuntimeConfigurable implements Serializable { | |||
| * list. | |||
| */ | |||
| 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 | |||
| */ | |||
| 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>. | |||
| */ | |||
| 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) { | |||
| 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 @@ public class RuntimeConfigurable implements Serializable { | |||
| * @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 @@ public class RuntimeConfigurable implements Serializable { | |||
| 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 @@ public class RuntimeConfigurable implements Serializable { | |||
| } | |||
| } | |||
| 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,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 @@ public class Target implements TaskContainer { | |||
| /** 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 @@ public class Target implements TaskContainer { | |||
| * @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 @@ public class Target implements TaskContainer { | |||
| * Must not be <code>null</code>. | |||
| */ | |||
| 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 | |||
| */ | |||
| 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 @@ public class Target implements TaskContainer { | |||
| * 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 @@ public class Target implements TaskContainer { | |||
| * @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 class Target implements TaskContainer { | |||
| */ | |||
| 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 @@ public class Target implements TaskContainer { | |||
| 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 @@ public class Target implements TaskContainer { | |||
| void replaceChild(Task el, Task o) { | |||
| int index; | |||
| while ((index = children.indexOf(el)) >= 0) { | |||
| children.setElementAt(o, index); | |||
| children.set(index, o); | |||
| } | |||
| } | |||
| @@ -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 @@ public class UnknownElement extends Task { | |||
| /** | |||
| * 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 @@ public class UnknownElement extends Task { | |||
| * @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 @@ public class UnknownElement extends Task { | |||
| 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 | |||
| @@ -327,6 +334,7 @@ public class UnknownElement extends Task { | |||
| } | |||
| } | |||
| } | |||
| } | |||
| } | |||
| /** | |||