package folioxml.directexport; import folioxml.core.InvalidMarkupException; import folioxml.css.StylesheetBuilder; import folioxml.slx.SlxRecord; import folioxml.slx.SlxRecordReader; import folioxml.xml.SlxToXmlTransformer; import folioxml.xml.XmlRecord; import java.io.*; public class DirectXmlExporter { protected SlxRecordReader reader; protected OutputStreamWriter out; protected String encoding; public DirectXmlExporter(SlxRecordReader reader, OutputStreamWriter out) { this.reader = reader; this.out = out; } public DirectXmlExporter(SlxRecordReader reader, String outputFile) throws UnsupportedEncodingException, FileNotFoundException { this.reader = reader; //Make the dir if it is missing if (!new java.io.File(outputFile).getParentFile().exists()) new java.io.File(outputFile).getParentFile().mkdirs(); encoding = "utf-8"; this.out = new OutputStreamWriter(new FileOutputStream(outputFile), "UTF8"); } public void close() throws IOException { if (!bottomWritten) writeBottom(); if (out != null) out.close(); } public void processAll() throws IOException, InvalidMarkupException { while (true) { SlxRecord r = reader.read(); if (r == null) break;//loop exit processRecord(r); } } protected String css = null; protected String levels = null; protected SlxRecord root = null; public boolean indentXml = true; public int maxRecords = -1; public int recordsProcessed = 0; public void processRecord(SlxRecord r) throws InvalidMarkupException, IOException { boolean isRoot = "root".equals(r.getLevelType()); if (isRoot) { css = new StylesheetBuilder(r).getCss("", false); levels = r.get("levels") != null ? r.get("levels") : r.get("levelDefOrder"); root = r; } if (!topWritten) writeTop(); if (maxRecords > -1 && recordsProcessed >= maxRecords) return; recordsProcessed++; writeRecord(r); } public void writeRecord(SlxRecord r) throws InvalidMarkupException, IOException { XmlRecord rx = new SlxToXmlTransformer().convert(r); out.write(rx.toXmlString(indentXml)); } protected boolean topWritten = false; protected boolean bottomWritten = false; public void writeTop() throws IOException, InvalidMarkupException { topWritten = true; out.append("<?xml version=\"1.0\" encoding=\"" + encoding + "\"?>\n"); out.append("<infobase>\n"); } public void writeBottom() throws IOException { bottomWritten = true; out.write("\n</infobase>"); } }