diff --git a/src/etc/testcases/taskdefs/optional/schemavalidate.xml b/src/etc/testcases/taskdefs/optional/schemavalidate.xml
index 1b0f07ba0..13cbb921c 100644
--- a/src/etc/testcases/taskdefs/optional/schemavalidate.xml
+++ b/src/etc/testcases/taskdefs/optional/schemavalidate.xml
@@ -24,6 +24,50 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/SchemaValidate.java b/src/main/org/apache/tools/ant/taskdefs/optional/SchemaValidate.java
index 087677998..70b5a24be 100644
--- a/src/main/org/apache/tools/ant/taskdefs/optional/SchemaValidate.java
+++ b/src/main/org/apache/tools/ant/taskdefs/optional/SchemaValidate.java
@@ -32,6 +32,7 @@ import javax.xml.parsers.ParserConfigurationException;
import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;
+import java.util.HashMap;
import java.io.File;
import java.net.MalformedURLException;
@@ -50,7 +51,7 @@ import java.net.MalformedURLException;
public class SchemaValidate extends XMLValidateTask {
- private List schemaLocations= new ArrayList();
+ private HashMap schemaLocations= new HashMap();
/** full checking of a schema */
private boolean fullChecking=true;
@@ -66,6 +67,8 @@ public class SchemaValidate extends XMLValidateTask {
public static final String ERROR_TOO_MANY_DEFAULT_SCHEMAS =
"Only one of defaultSchemaFile and defaultSchemaURL allowed";
public static final String ERROR_PARSER_CREATION_FAILURE = "Could not create parser";
+ public static final String MESSAGE_ADDING_SCHEMA = "Adding schema ";
+ public static final String ERROR_DUPLICATE_SCHEMA = "Duplicate declaration of schema ";
/**
* Called by the project to let the task initialize properly. The default
@@ -121,8 +124,21 @@ public class SchemaValidate extends XMLValidateTask {
return true;
}
- public void addSchema(SchemaLocation location) {
- schemaLocations.add(location);
+ /**
+ * add the schema
+ * @param location
+ * @throws BuildException if there is no namespace, or if there already
+ * is a declaration of this schema with a different value
+ */
+ public void addConfiguredSchema(SchemaLocation location) {
+ log("adding schema "+location,Project.MSG_DEBUG);
+ location.validateNamespace();
+ SchemaLocation old=(SchemaLocation) schemaLocations.get(
+ location.getNamespace());
+ if(old!=null && !old.equals(location)) {
+ throw new BuildException(ERROR_DUPLICATE_SCHEMA+location);
+ }
+ schemaLocations.put(location.getNamespace(), location);
}
/**
@@ -221,7 +237,7 @@ public class SchemaValidate extends XMLValidateTask {
* property.
*/
protected void addSchemaLocations() {
- Iterator it = schemaLocations.iterator();
+ Iterator it = schemaLocations.values().iterator();
StringBuffer buffer = new StringBuffer();
int count = 0;
while (it.hasNext()) {
@@ -231,6 +247,7 @@ public class SchemaValidate extends XMLValidateTask {
SchemaLocation schemaLocation = (SchemaLocation) it.next();
String tuple = schemaLocation.getURIandLocation();
buffer.append(tuple);
+ log("Adding schema "+tuple,Project.MSG_VERBOSE);
count++;
}
if (count > 0) {
@@ -276,8 +293,8 @@ public class SchemaValidate extends XMLValidateTask {
private File file;
private String url;
- public static final String ERROR_NO_URI = "No URI";
- private static final String ERROR_TWO_LOCATIONS =
+ public static final String ERROR_NO_URI = "No namespace URI";
+ public static final String ERROR_TWO_LOCATIONS =
"Both URL and File were given for schema ";
public static final String ERROR_NO_FILE = "File not found: ";
public static final String ERROR_NO_URL_REPRESENTATION = "Cannot make a URL of ";
@@ -291,6 +308,10 @@ public class SchemaValidate extends XMLValidateTask {
return namespace;
}
+ /**
+ * set the namespace of this schema. Any URI
+ * @param namespace
+ */
public void setNamespace(String namespace) {
this.namespace = namespace;
}
@@ -299,6 +320,11 @@ public class SchemaValidate extends XMLValidateTask {
return file;
}
+ /**
+ * identify a file that contains this namespace's schema.
+ * The file must exist.
+ * @param file
+ */
public void setFile(File file) {
this.file = file;
}
@@ -307,10 +333,19 @@ public class SchemaValidate extends XMLValidateTask {
return url;
}
+ /**
+ * identify a URL that hosts the schema.
+ * @param url
+ */
public void setUrl(String url) {
this.url = url;
}
+ /**
+ * get the URL of the schema
+ * @return a URL to the schema
+ * @throws BuildException if not
+ */
public String getSchemaLocationURL() {
boolean hasFile = file != null;
boolean hasURL = isSet(url);
@@ -344,9 +379,7 @@ public class SchemaValidate extends XMLValidateTask {
* @throws BuildException
*/
public String getURIandLocation() throws BuildException {
- if (!isSet(getNamespace())) {
- throw new BuildException(ERROR_NO_URI);
- }
+ validateNamespace();
StringBuffer buffer = new StringBuffer();
buffer.append(namespace);
buffer.append(' ');
@@ -354,8 +387,84 @@ public class SchemaValidate extends XMLValidateTask {
return new String(buffer);
}
+ /**
+ * assert that a namespace is valid
+ * @throws BuildException if not
+ */
+ public void validateNamespace() {
+ if (!isSet(getNamespace())) {
+ throw new BuildException(ERROR_NO_URI);
+ }
+ }
+
+ /**
+ * check that a property is set
+ * @param property string to check
+ * @return true if it is not null or empty
+ */
private boolean isSet(String property) {
return property != null && property.length() != 0;
}
+
+ /**
+ * equality test checks namespace, location and filename. All must match,
+ * @param o object to compare against
+ * @return true iff the objects are considered equal in value
+ */
+
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (!(o instanceof SchemaLocation)) {
+ return false;
+ }
+
+ final SchemaLocation schemaLocation = (SchemaLocation) o;
+
+ if (file != null ?
+ !file.equals(schemaLocation.file) :
+ schemaLocation.file != null) {
+ return false;
+ }
+ if (namespace != null ?
+ !namespace.equals(schemaLocation.namespace) :
+ schemaLocation.namespace != null) {
+ return false;
+ }
+ if (url != null ?
+ !url.equals(schemaLocation.url) :
+ schemaLocation.url != null) {
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * hashcode function
+ * @return
+ */
+ public int hashCode() {
+ int result;
+ result = (namespace != null ? namespace.hashCode() : 0);
+ result = 29 * result + (file != null ? file.hashCode() : 0);
+ result = 29 * result + (url != null ? url.hashCode() : 0);
+ return result;
+ }
+
+ /**
+ * Returns a string representation of the object for error messages
+ * and the like
+ * @return a string representation of the object.
+ */
+ public String toString() {
+ StringBuffer buffer=new StringBuffer();
+ buffer.append(namespace!=null?namespace:"(anonymous)");
+ buffer.append(' ');
+ buffer.append(url!=null?(url+" "):"");
+ buffer.append(file!=null?file.getAbsolutePath():"");
+ return buffer.toString();
+ }
} //SchemaLocation
}
diff --git a/src/testcases/org/apache/tools/ant/taskdefs/optional/SchemaValidateTest.java b/src/testcases/org/apache/tools/ant/taskdefs/optional/SchemaValidateTest.java
index 1c09f9642..7b4f64a13 100644
--- a/src/testcases/org/apache/tools/ant/taskdefs/optional/SchemaValidateTest.java
+++ b/src/testcases/org/apache/tools/ant/taskdefs/optional/SchemaValidateTest.java
@@ -60,4 +60,36 @@ public class SchemaValidateTest extends BuildFileTest {
executeTarget("testNSMapping");
}
+ public void testNoEmptySchemaNamespace() throws Exception {
+ expectBuildExceptionContaining("testNoEmptySchemaNamespace",
+ "empty namespace URI",SchemaValidate.SchemaLocation.ERROR_NO_URI);
+ }
+
+ public void testNoEmptySchemaLocation() throws Exception {
+ expectBuildExceptionContaining("testNoEmptySchemaLocation",
+ "empty schema location",
+ SchemaValidate.SchemaLocation.ERROR_NO_LOCATION);
+ }
+
+ public void testNoFile() throws Exception {
+ expectBuildExceptionContaining("testNoFile",
+ "no file at file attribute",
+ SchemaValidate.SchemaLocation.ERROR_NO_FILE);
+ }
+
+ public void testNoDoubleSchemaLocation() throws Exception {
+ expectBuildExceptionContaining("testNoDoubleSchemaLocation",
+ "two locations for schemas",
+ SchemaValidate.SchemaLocation.ERROR_TWO_LOCATIONS);
+ }
+ public void testNoDuplicateSchema() throws Exception {
+ expectBuildExceptionContaining("testNoDuplicateSchema",
+ "duplicate schemas with different values",
+ SchemaValidate.ERROR_DUPLICATE_SCHEMA);
+ }
+
+ public void testEqualsSchemasOK() throws Exception {
+ executeTarget("testEqualsSchemasOK");
+ }
+
}