From d021543bceeb13af42fd1c72d78a6544fc33b41c Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Tue, 22 Nov 2011 13:16:01 +0000 Subject: [PATCH] ALF-7260: schema validation: ensure outputting UTF-8 and Windows line endings. git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@32183 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../repo/domain/schema/SchemaBootstrap.java | 12 +- .../org/alfresco/util/schemacomp/DbToXML.java | 55 ++++++++- .../util/schemacomp/SchemaComparator.java | 3 + .../alfresco/util/schemacomp/SchemaToXML.java | 2 +- .../util/schemacomp/xml_to_schema_test.xml | 108 +++++++++--------- 5 files changed, 119 insertions(+), 61 deletions(-) diff --git a/source/java/org/alfresco/repo/domain/schema/SchemaBootstrap.java b/source/java/org/alfresco/repo/domain/schema/SchemaBootstrap.java index 42d95a4e7f..f398ea5709 100644 --- a/source/java/org/alfresco/repo/domain/schema/SchemaBootstrap.java +++ b/source/java/org/alfresco/repo/domain/schema/SchemaBootstrap.java @@ -29,6 +29,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.PrintWriter; +import java.io.UnsupportedEncodingException; import java.io.Writer; import java.sql.Array; import java.sql.Blob; @@ -72,12 +73,10 @@ import org.alfresco.repo.domain.hibernate.dialect.AlfrescoSybaseAnywhereDialect; import org.alfresco.service.cmr.repository.ContentWriter; import org.alfresco.util.LogUtil; import org.alfresco.util.TempFileProvider; -import org.alfresco.util.schemacomp.Difference; import org.alfresco.util.schemacomp.ExportDb; import org.alfresco.util.schemacomp.Result; import org.alfresco.util.schemacomp.Results; import org.alfresco.util.schemacomp.SchemaComparator; -import org.alfresco.util.schemacomp.ValidationResult; import org.alfresco.util.schemacomp.XMLToSchema; import org.alfresco.util.schemacomp.model.Schema; import org.alfresco.util.schemadump.Main; @@ -1676,17 +1675,22 @@ public class SchemaBootstrap extends AbstractLifecycleBean PrintWriter pw = null; try { - pw = new PrintWriter(outputFile); + pw = new PrintWriter(outputFile, SchemaComparator.CHAR_SET); } catch (FileNotFoundException error) { throw new RuntimeException("Unable to open file for writing: " + outputFile); } + catch (UnsupportedEncodingException error) + { + throw new RuntimeException("Unsupported char set: " + SchemaComparator.CHAR_SET, error); + } // Populate the file with details of the comparison's results. for (Result result : results) { - pw.println(result.describe()); + pw.print(result.describe()); + pw.print(SchemaComparator.LINE_SEPARATOR); } pw.close(); diff --git a/source/java/org/alfresco/util/schemacomp/DbToXML.java b/source/java/org/alfresco/util/schemacomp/DbToXML.java index f801cbcda0..ab6b76be9c 100644 --- a/source/java/org/alfresco/util/schemacomp/DbToXML.java +++ b/source/java/org/alfresco/util/schemacomp/DbToXML.java @@ -19,6 +19,11 @@ package org.alfresco.util.schemacomp; import java.io.File; +import java.io.FileNotFoundException; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.io.UnsupportedEncodingException; +import java.util.Properties; import javax.xml.transform.stream.StreamResult; @@ -77,12 +82,58 @@ public class DbToXML if (exporter != null) { Schema schema = exporter.getSchema(); - SchemaToXML schemaToXML = new SchemaToXML(schema, new StreamResult(outputFile)); + // Write to a string buffer and then write the results to a file + // since we need to write windows line endings - and even passing in a suitable + // PrintWriter to StreamResult does not seem to result in the correct line endings. + StringWriter stringWriter = new StringWriter(); + SchemaToXML schemaToXML = new SchemaToXML(schema, new StreamResult(stringWriter)); schemaToXML.execute(); + writeToFile(stringWriter.getBuffer().toString()); } } - + private void writeToFile(String content) + { + PrintWriter pw = printWriter(outputFile, SchemaComparator.CHAR_SET, SchemaComparator.LINE_SEPARATOR); + + String[] lines = content.split(System.getProperty("line.separator")); + for (String line : lines) + { + pw.println(line); + } + + pw.close(); + } + + private static PrintWriter printWriter(File file, String charSet, String lineSeparator) + { + Properties props = System.getProperties(); + synchronized (props) + { + String oldLineSep = null; + try + { + oldLineSep = (String) props.setProperty("line.separator", lineSeparator); + return new PrintWriter(file, charSet); + } + catch (FileNotFoundException error) + { + throw new RuntimeException("Unable to write to file " + file, error); + } + catch (UnsupportedEncodingException error) + { + throw new RuntimeException("Unsupported encoding" + charSet, error); + } + finally + { + if (oldLineSep != null) + { + props.put("line.separator", oldLineSep); + } + } + } + } + public static void main(String[] args) { if (args.length != 2) diff --git a/source/java/org/alfresco/util/schemacomp/SchemaComparator.java b/source/java/org/alfresco/util/schemacomp/SchemaComparator.java index 137895d6ef..bb992eafa3 100644 --- a/source/java/org/alfresco/util/schemacomp/SchemaComparator.java +++ b/source/java/org/alfresco/util/schemacomp/SchemaComparator.java @@ -20,6 +20,7 @@ package org.alfresco.util.schemacomp; import org.alfresco.util.schemacomp.Result.Strength; import org.alfresco.util.schemacomp.model.Schema; +import org.apache.xml.serialize.LineSeparator; import org.hibernate.dialect.Dialect; /** @@ -30,6 +31,8 @@ import org.hibernate.dialect.Dialect; */ public class SchemaComparator { + public static final String CHAR_SET = "UTF-8"; + public static final String LINE_SEPARATOR = LineSeparator.Windows; private final Schema referenceSchema; private final Schema targetSchema; private final DiffContext ctx; diff --git a/source/java/org/alfresco/util/schemacomp/SchemaToXML.java b/source/java/org/alfresco/util/schemacomp/SchemaToXML.java index 315c122c1e..f2ce0e0251 100644 --- a/source/java/org/alfresco/util/schemacomp/SchemaToXML.java +++ b/source/java/org/alfresco/util/schemacomp/SchemaToXML.java @@ -62,9 +62,9 @@ public class SchemaToXML // It was worth a try } t.setOutputProperty(OutputKeys.INDENT, "yes"); + t.setOutputProperty(OutputKeys.ENCODING, SchemaComparator.CHAR_SET); xmlOut.setResult(streamResult); - this.schema = schema; } diff --git a/source/java/org/alfresco/util/schemacomp/xml_to_schema_test.xml b/source/java/org/alfresco/util/schemacomp/xml_to_schema_test.xml index 88f113224f..1c044e9b7b 100644 --- a/source/java/org/alfresco/util/schemacomp/xml_to_schema_test.xml +++ b/source/java/org/alfresco/util/schemacomp/xml_to_schema_test.xml @@ -1,54 +1,54 @@ - - - - - - - - NUMBER(10) - false - - - VARCHAR2(200) - false - - - VARCHAR2(150) - true - - - - - id - - - - - nodeRef - node - nodeRef - - - - - - id - nodeRef - - - - - idx_.+ - - - - - -
- - - -
-
+ + + + + + + + NUMBER(10) + false + + + VARCHAR2(200) + false + + + VARCHAR2(150) + true + + + + + id + + + + + nodeRef + node + nodeRef + + + + + + id + nodeRef + + + + + idx_.+ + + + + + +
+ + + +
+