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 { | |||
} | |||
} | |||
} | |||
} | |||
} | |||
/** | |||