Update of /cvsroot/xdoclet/xdoclet/core/src/xdoclet/util
In directory
sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv22118/core/src/xdoclet/util
Modified Files:
XmlValidator.java XDocletUtilMessages.java
Log Message:
Added support for XML Schema validation (XDT-1284)
Index: XmlValidator.java
===================================================================
RCS file: /cvsroot/xdoclet/xdoclet/core/src/xdoclet/util/XmlValidator.java,v
retrieving revision 1.17
retrieving revision 1.18
diff -C2 -r1.17 -r1.18
*** XmlValidator.java 14 Aug 2004 12:08:13 -0000 1.17
--- XmlValidator.java 1 Mar 2005 20:57:49 -0000 1.18
***************
*** 10,16 ****
--- 10,19 ----
import java.io.StringReader;
import java.net.URL;
+ import java.util.ArrayList;
+ import java.util.Collection;
import java.util.HashMap;
import javax.xml.parsers.ParserConfigurationException;
+ import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.apache.commons.logging.Log;
***************
*** 46,49 ****
--- 49,55 ----
*/
public final static String DEFAULT_XML_READER_CLASSNAME =
"org.apache.crimson.parser.XMLReaderImpl";
+ private final static String JAXP_SCHEMA_SOURCE =
"http://java.sun.com/xml/jaxp/properties/schemaSource";
+ private final static String JAXP_SCHEMA_LANGUAGE =
"http://java.sun.com/xml/jaxp/properties/schemaLanguage";
+ private final static String W3C_XML_SCHEMA =
"http://www.w3.org/2001/XMLSchema";
private static XmlValidator instance = new XmlValidator(null);
***************
*** 59,62 ****
--- 65,69 ----
private final HashMap _dtds = new HashMap();
+ private final Collection _schemas = new ArrayList();
/**
***************
*** 109,112 ****
--- 116,135 ----
/**
+ * Registers a local XSD document by its public id. This is necessary to
avoid loading XML Schemas over the net.
+ *
+ * @param schemaURL
+ */
+ public void registerSchema(URL schemaURL)
+ {
+ Log log = LogUtil.getLog(XmlValidator.class, "registerSchema");
+
+ if (log.isDebugEnabled()) {
+ log.debug("Schema '" + schemaURL + "' registered.");
+ }
+
+ _schemas.add(schemaURL.toString());
+ }
+
+ /**
* Called by parser when a DTD declaration is encountered in the parsed
XML document
*
***************
*** 140,144 ****
else {
log.debug("dtdURL == null");
! log.error(Translator.getString(XDocletMessages.class,
XDocletMessages.COULDNT_LOAD_LOCAL_DTD, new String[]{publicId}));
return null;
}
--- 163,176 ----
else {
log.debug("dtdURL == null");
!
! String msg = Translator.getString(XDocletMessages.class,
XDocletMessages.COULDNT_LOAD_LOCAL_DTD, new String[]{publicId});
!
! // no error if we are doing schema validation
! if (isSchemaValidation()) {
! log.debug(msg);
! }
! else {
! log.error(msg);
! }
return null;
}
***************
*** 190,193 ****
--- 222,235 ----
}
+ /**
+ * Returns whether this validator should validate against a XML Schema
+ *
+ * @return <code>true</code> it the validator should validate against a
XSD
+ */
+ private boolean isSchemaValidation()
+ {
+ return !_schemas.isEmpty();
+ }
+
/*
* parse the file
***************
*** 220,230 ****
xmlReader.parse(is);
}
catch (SAXException e) {
! e.printStackTrace();
! throw new XDocletException("Couldn't validate document " +
xml_file);
}
catch (IOException e) {
! e.printStackTrace();
! throw new XDocletException(e, "Couldn't validate document " +
xml_file);
}
--- 262,282 ----
xmlReader.parse(is);
}
+ catch (SAXParseException e) {
+ String message = Translator.getString(XDocletUtilMessages.class,
XDocletUtilMessages.GENERATED_XML_INVALID,
+ new String[]{e.getSystemId(),
Integer.toString(e.getLineNumber()), e.getMessage()});
+
+ throw new XDocletException(e, message);
+ }
catch (SAXException e) {
! String message = Translator.getString(XDocletUtilMessages.class,
XDocletUtilMessages.PARSING_FAILED,
! new String[]{xml_file.getAbsolutePath(), e.getMessage()});
!
! throw new XDocletException(e, message);
}
catch (IOException e) {
! String message = Translator.getString(XDocletUtilMessages.class,
XDocletUtilMessages.PARSING_FAILED,
! new String[]{xml_file.getAbsolutePath(), e.getMessage()});
!
! throw new XDocletException(e, message);
}
***************
*** 247,250 ****
--- 299,307 ----
Log log = LogUtil.getLog(XmlValidator.class, "initValidator");
+ // The crimson parser does not support schema validation
+ if (isSchemaValidation()) {
+ log.warn(Translator.getString(XDocletUtilMessages.class,
XDocletUtilMessages.PARSER_DOES_NOT_SUPPORT_XSD_VALIDATION));
+ }
+
try {
// load the parser class
***************
*** 329,345 ****
private void initValidator() throws XDocletException
{
try {
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setValidating(true);
! xmlReader = factory.newSAXParser().getXMLReader();
xmlReader.setEntityResolver(this);
xmlReader.setErrorHandler(this);
- }
- catch (SAXParseException e) {
- String message = Translator.getString(XDocletUtilMessages.class,
XDocletUtilMessages.INIT_FAILED,
- new String[]{e.getSystemId(),
Integer.toString(e.getLineNumber()), e.getMessage()});
- throw new XDocletException(e, message);
}
catch (SAXException e) {
--- 386,432 ----
private void initValidator() throws XDocletException
{
+ Log log = LogUtil.getLog(XmlValidator.class, "initValidator");
+
try {
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setValidating(true);
! factory.setNamespaceAware(isSchemaValidation());
!
! // try to get a SAX Parser
! SAXParser parser;
!
! try {
! parser = factory.newSAXParser();
! }
! catch (ParserConfigurationException e) {
! // try to get a non-namespace-aware parser if a
namespace-aware parser was
! // required and none could be found
! if (!factory.isNamespaceAware()) {
! throw e;
! }
! factory.setNamespaceAware(false);
! parser = factory.newSAXParser();
! log.warn(Translator.getString(XDocletUtilMessages.class,
XDocletUtilMessages.NO_NAMESPACE_AWARE_SAX_PARSER));
! }
!
! // try to setup XML Schema Validation if schema validation is
required and
! // a namespace-aware SAX parser is available
! if (isSchemaValidation() && parser.isNamespaceAware()) {
! try {
! parser.setProperty(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA);
! parser.setProperty(JAXP_SCHEMA_SOURCE,
_schemas.toArray(new String[_schemas.size()]));
! }
! catch (SAXNotRecognizedException e) {
! log.warn(Translator.getString(XDocletUtilMessages.class,
XDocletUtilMessages.PARSER_DOES_NOT_SUPPORT_XSD_VALIDATION));
! }
! catch (SAXNotSupportedException e) {
! log.warn(Translator.getString(XDocletUtilMessages.class,
XDocletUtilMessages.PARSER_DOES_NOT_SUPPORT_XSD_VALIDATION));
! }
! }
! xmlReader = parser.getXMLReader();
xmlReader.setEntityResolver(this);
xmlReader.setErrorHandler(this);
}
catch (SAXException e) {
Index: XDocletUtilMessages.java
===================================================================
RCS file:
/cvsroot/xdoclet/xdoclet/core/src/xdoclet/util/XDocletUtilMessages.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -r1.3 -r1.4
*** XDocletUtilMessages.java 28 Jul 2002 23:31:45 -0000 1.3
--- XDocletUtilMessages.java 1 Mar 2005 20:57:50 -0000 1.4
***************
*** 18,29 ****
/**
! * @msg.bundle msg="Generated file [{0}:line {1}] Message=[{2}] is not
valid according to its DTD. This might be
! * due to some missing tags in your source."
*/
public final static String GENERATED_XML_INVALID =
"GENERATED_XML_INVALID";
/**
* @msg.bundle msg="Exception reading merge file. {0}"
*/
public final static String EXCEPTION_READING_MERGE_FILE =
"EXCEPTION_READING_MERGE_FILE";
! }
\ No newline at end of file
--- 18,46 ----
/**
! * @msg.bundle msg="Generated file [{0}:line {1}] Message=[{2}] is not
valid according to its DTD or XML Schema.
! * This might be due to some missing tags in your source."
*/
public final static String GENERATED_XML_INVALID =
"GENERATED_XML_INVALID";
/**
+ * @msg.bundle msg="The validateion for the generated file [{0}]
failed. Message=[{2}] ."
+ */
+ public final static String PARSING_FAILED = "PARSING_FAILED";
+
+ /**
* @msg.bundle msg="Exception reading merge file. {0}"
*/
public final static String EXCEPTION_READING_MERGE_FILE =
"EXCEPTION_READING_MERGE_FILE";
!
! /**
! * @msg.bundle msg="WARNING: Can't validate against the XML Schema
because the SAX Parser does not support XML
! * Schema validation."
! */
! public final static String PARSER_DOES_NOT_SUPPORT_XSD_VALIDATION =
"PARSER_DOES_NOT_SUPPORT_XSD_VALIDATION";
!
! /**
! * @msg.bundle msg="WARNING: Can't validate against the XML Schema
because no namespace-aware SAX Parser could be
! * found."
! */
! public final static String NO_NAMESPACE_AWARE_SAX_PARSER =
"NO_NAMESPACE_AWARE_SAX_PARSER";
! }
-------------------------------------------------------
SF email is sponsored by - The IT Product Guide
Read honest & candid reviews on hundreds of IT Products from real users.
Discover which products truly live up to the hype. Start reading now.
http://ads.osdn.com/?ad_id=6595&alloc_id=14396&op=click
_______________________________________________
xdoclet-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/xdoclet-devel