@@ -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
}