Author: tomdz Date: Mon Jun 23 22:43:57 2008 New Revision: 671031 URL: http://svn.apache.org/viewvc?rev=671031&view=rev Log: Fix for DDLUTILS-211: DatabaseIO.read(Reader) broken Additional XML parsing fixes were XmlStreamReader.nextTag() was used instead of next()
Modified: db/ddlutils/trunk/src/main/java/org/apache/ddlutils/io/DatabaseIO.java Modified: db/ddlutils/trunk/src/main/java/org/apache/ddlutils/io/DatabaseIO.java URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/main/java/org/apache/ddlutils/io/DatabaseIO.java?rev=671031&r1=671030&r2=671031&view=diff ============================================================================== --- db/ddlutils/trunk/src/main/java/org/apache/ddlutils/io/DatabaseIO.java (original) +++ db/ddlutils/trunk/src/main/java/org/apache/ddlutils/io/DatabaseIO.java Mon Jun 23 22:43:57 2008 @@ -37,6 +37,8 @@ import javax.xml.transform.stream.StreamSource; import org.apache.commons.lang.StringUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.apache.ddlutils.model.CascadeActionEnum; import org.apache.ddlutils.model.Column; import org.apache.ddlutils.model.Database; @@ -115,6 +117,9 @@ /** Qualified name of the version attribute. */ public static final QName QNAME_ATTRIBUTE_VERSION = new QName(DDLUTILS_NAMESPACE, "version"); + /** The log. */ + private final Log _log = LogFactory.getLog(DatabaseIO.class); + /** Whether to validate the XML. */ private boolean _validateXml = true; /** Whether to use the internal dtd that comes with DdlUtils. */ @@ -144,6 +149,7 @@ * Returns whether the internal dtd that comes with DdlUtils is used. * * @return <code>true</code> if parsing uses the internal dtd + * @deprecated Switched to XML schema, and the internal XML schema should always be used */ public boolean isUseInternalDtd() { @@ -153,7 +159,8 @@ /** * Specifies whether the internal dtd is to be used. * - * @param useInternalDtd Whether to use the internal dtd + * @param useInternalDtd Whether to use the internal dtd + * @deprecated Switched to XML schema, and the internal XML schema should always be used */ public void setUseInternalDtd(boolean useInternalDtd) { @@ -168,18 +175,7 @@ */ public Database read(String filename) throws DdlUtilsXMLException { - try - { - if (_validateXml) - { - new ModelValidator().validate(new StreamSource(new FileReader(filename))); - } - return read(new FileReader(filename)); - } - catch (IOException ex) - { - throw new DdlUtilsXMLException(ex); - } + return read(new File(filename)); } /** @@ -190,22 +186,68 @@ */ public Database read(File file) throws DdlUtilsXMLException { - try + FileReader reader = null; + + if (_validateXml) { - if (_validateXml) + try + { + reader = new FileReader(file); + new ModelValidator().validate(new StreamSource(reader)); + } + catch (IOException ex) { - new ModelValidator().validate(new StreamSource(new FileReader(file))); + throw new DdlUtilsXMLException(ex); + } + finally + { + if (reader != null) + { + try + { + reader.close(); + } + catch (IOException ex) + { + _log.warn("Could not close reader for file " + file.getAbsolutePath()); + } + reader = null; + } } - return read(new FileReader(file)); + } + + try + { + reader = new FileReader(file); + return read(getXMLInputFactory().createXMLStreamReader(reader)); + } + catch (XMLStreamException ex) + { + throw new DdlUtilsXMLException(ex); } catch (IOException ex) { throw new DdlUtilsXMLException(ex); } + finally + { + if (reader != null) + { + try + { + reader.close(); + } + catch (IOException ex) + { + _log.warn("Could not close reader for file " + file.getAbsolutePath()); + } + } + } } /** - * Reads the database model given by the reader. + * Reads the database model given by the reader. Note that this method does not close the + * given reader. * * @param reader The reader that returns the model XML * @return The database model @@ -222,10 +264,6 @@ while ((len = reader.read(buf)) >= 0) { - if (tmpXml.length() > 0) - { - tmpXml.append("\n"); - } tmpXml.append(buf, 0, len); } new ModelValidator().validate(new StreamSource(new StringReader(tmpXml.toString()))); @@ -355,7 +393,7 @@ while (eventType != XMLStreamReader.END_ELEMENT) { - eventType = xmlReader.nextTag(); + eventType = xmlReader.next(); if (eventType == XMLStreamReader.START_ELEMENT) { if (isSameAs(xmlReader.getName(), QNAME_ELEMENT_TABLE)) { @@ -409,7 +447,7 @@ while (eventType != XMLStreamReader.END_ELEMENT) { - eventType = xmlReader.nextTag(); + eventType = xmlReader.next(); if (eventType == XMLStreamReader.START_ELEMENT) { QName elemQName = xmlReader.getName(); @@ -541,7 +579,7 @@ while (eventType != XMLStreamReader.END_ELEMENT) { - eventType = xmlReader.nextTag(); + eventType = xmlReader.next(); if (eventType == XMLStreamReader.START_ELEMENT) { QName elemQName = xmlReader.getName(); @@ -645,7 +683,7 @@ while (eventType != XMLStreamReader.END_ELEMENT) { - eventType = xmlReader.nextTag(); + eventType = xmlReader.next(); if (eventType == XMLStreamReader.START_ELEMENT) { QName elemQName = xmlReader.getName(); @@ -674,7 +712,7 @@ while (eventType != XMLStreamReader.END_ELEMENT) { - eventType = xmlReader.nextTag(); + eventType = xmlReader.next(); if (eventType == XMLStreamReader.START_ELEMENT) { QName elemQName = xmlReader.getName(); @@ -814,7 +852,7 @@ while ((eventType != XMLStreamReader.END_ELEMENT) && (eventType != XMLStreamReader.END_DOCUMENT)) { - eventType = reader.nextTag(); + eventType = reader.next(); } } @@ -830,7 +868,7 @@ while (depth > 0) { - int eventType = reader.nextTag(); + int eventType = reader.next(); if (eventType == XMLStreamReader.START_ELEMENT) {