diff options
Diffstat (limited to 'qadevOOo/runner/util/XMLTools.java')
-rw-r--r-- | qadevOOo/runner/util/XMLTools.java | 942 |
1 files changed, 942 insertions, 0 deletions
diff --git a/qadevOOo/runner/util/XMLTools.java b/qadevOOo/runner/util/XMLTools.java new file mode 100644 index 000000000000..63750b1afd10 --- /dev/null +++ b/qadevOOo/runner/util/XMLTools.java @@ -0,0 +1,942 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: XMLTools.java,v $ + * $Revision: 1.4 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +package util; + +import java.io.PrintWriter ; +import java.util.Vector ; +import java.util.Hashtable ; +import java.util.Enumeration ; +import java.util.HashSet ; + +// access the implementations via names +import com.sun.star.uno.XInterface; +import com.sun.star.io.XOutputStream; +import com.sun.star.io.XInputStream; +import com.sun.star.io.XActiveDataSource; +import com.sun.star.ucb.XSimpleFileAccess; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.xml.sax.XDocumentHandler; +import com.sun.star.uno.Any; +import com.sun.star.uno.Type; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.beans.PropertyValue; +import com.sun.star.xml.sax.XLocator; +import com.sun.star.xml.sax.XAttributeList; +import com.sun.star.xml.sax.XParser ; +import com.sun.star.xml.sax.InputSource ; +import com.sun.star.lang.XComponent; +import com.sun.star.document.XExporter; +import com.sun.star.document.XImporter; +import com.sun.star.document.XFilter; + + +public class XMLTools { + + /** + * The implementation of <code>com.sun.star.xml.sax.XAttributeList</code> + * where attributes and their values can be added. + */ + public static class AttributeList implements XAttributeList { + private static class Attribute { + public String Name ; + public String Type ; + public String Value ; + } + private Hashtable attrByName = new Hashtable() ; + private Vector attributes = new Vector() ; + private PrintWriter log = null ; + + /** + * Creates a class instance. + */ + public AttributeList() {} + + /** + * Constructs a list which will report to <code>log</code> + * specified about each <code>XDocumentHandler</code> method + * call. + */ + public AttributeList(PrintWriter log) { + this.log = log ; + } + + public AttributeList(XAttributeList list) { + if (list == null) return ; + for (short i = 0; i < list.getLength(); i++) { + add(list.getNameByIndex(i), list.getTypeByIndex(i), + list.getValueByIndex(i)) ; + } + } + + /** + * Adds an attribute with type and value specified. + * @param name The attribute name. + * @param type Value type (usually 'CDATA' used). + * @param value Attribute value. + */ + public void add(String name, String type, String value) { + Attribute attr = new Attribute() ; + attr.Name = name ; + attr.Type = type ; + attr.Value = value ; + attributes.add(attr) ; + attrByName.put(attr.Name, attr) ; + } + + /** + * Adds an attribute with value specified. As a type of + * value 'CDATA' string specified. + * @param name The attribute name. + * @param value Attribute value. + */ + public void add(String name, String value) { + add(name, "CDATA", value) ; + } + + /** + * Clears all attributes added before. + */ + public void clear() { + attrByName.clear() ; + attributes.clear() ; + } + + /*************************************** + * XAttributeList methods + ****************************************/ + + public short getLength() { + if (log != null) + log.println("getLength() called -> " + attributes.size()) ; + return (short) attributes.size() ; + } + + public String getNameByIndex(short idx) { + String name = ((Attribute) attributes.get(idx)).Name ; + if (log != null) + log.println("getNameByIndex(" + idx + ") called -> '" + + name + "'") ; + return name ; + } + + public String getTypeByIndex(short idx) { + String type = ((Attribute) attributes.get(idx)).Type ; + if (log != null) + log.println("getTypeByIndex(" + idx + ") called -> '" + + type + "'") ; + return type; + } + + public String getTypeByName(String name) { + String type = ((Attribute) attrByName.get(name)).Type ; + if (log != null) + log.println("getTypeByName('" + name + "') called -> '" + + type + "'") ; + return type; + } + public String getValueByIndex(short idx) { + String value = ((Attribute) attributes.get(idx)).Value ; + if (log != null) + log.println("getValueByIndex(" + idx + ") called -> '" + + value + "'") ; + return value; + } + + public String getValueByName(String name) { + String value = ((Attribute) attrByName.get(name)).Value ; + if (log != null) + log.println("getValueByName('" + name + "') called -> '" + + value + "'") ; + return value; + } + } + + /** + * This class writes all XML data handled into a stream specified + * in the constructor. + */ + public static class XMLWriter implements XDocumentHandler { + private PrintWriter _log = null ; + private String align = "" ; + + /** + * Creates a SAX handler which writes all XML data + * handled into a <code>log</code> stream specified. + */ + public XMLWriter(PrintWriter log) { + _log = log ; + } + + /** + * Creates a SAX handler which does nothing. + */ + public XMLWriter() { + } + + public void processingInstruction(String appl, String data) { + if (_log == null) return ; + _log.println(align + "<?" + appl + " " + data + "?>") ; + } + public void startDocument() { + if (_log == null) return ; + _log.println("START DOCUMENT:") ; + } + public void endDocument() { + if (_log == null) return ; + _log.println("END DOCUMENT:") ; + } + public void setDocumentLocator(XLocator loc) { + if (_log == null) return ; + _log.println("DOCUMENT LOCATOR: ('" + loc.getPublicId() + + "','" + loc.getSystemId() + "')") ; + } + public void startElement(String name, XAttributeList attr) { + if (_log == null) return ; + _log.print(align + "<" + name + " ") ; + if (attr != null) { + short attrLen = attr.getLength() ; + for (short i = 0; i < attrLen; i++) { + if (i != 0) _log.print(align + " ") ; + _log.print(attr.getNameByIndex(i) + "[" + + attr.getTypeByIndex(i) + "]=\"" + + attr.getValueByIndex(i) + "\"") ; + if (i+1 != attrLen) { + _log.println() ; + } + } + } + _log.println(">") ; + + align += " " ; + } + + public void endElement(String name) { + if (_log == null) return ; + align = align.substring(3) ; + _log.println(align + "</" + name + ">") ; + } + + public void characters(String chars) { + if (_log == null) return ; + _log.println(align + chars) ; + } + public void ignorableWhitespace(String sp) { + if (_log == null) return ; + _log.println(sp) ; + } + } + + /** + * Checks if the XML structure is well formed (i.e. all tags opened must be + * closed and all tags opened inside a tag must be closed + * inside the same tag). It also checks parameters passed. + * If any collisions found appropriate error message is + * output into a stream specified. No XML data output, i.e. + * no output will be performed if no errors occur.<p> + * After document is completed there is a way to cehck + * if the XML data and structure was valid. + */ + public static class XMLWellFormChecker extends XMLWriter { + protected boolean docStarted = false ; + protected boolean docEnded = false ; + protected Vector tagStack = new Vector() ; + protected boolean wellFormed = true ; + protected boolean noOtherErrors = true ; + protected PrintWriter log = null ; + protected boolean printXMLData = false ; + + public XMLWellFormChecker(PrintWriter log) { + super() ; + this.log = log ; + } + + public XMLWellFormChecker(PrintWriter log_, boolean printXMLData) { + super(printXMLData ? log_ : null) ; + this.printXMLData = printXMLData ; + this.log = log_ ; + } + + /** + * Reset all values. This is important e.g. for test of XFilter + * interface, where 'filter()' method istbstarted twice. + */ + public void reset() { + docStarted = false ; + docEnded = false ; + tagStack = new Vector() ; + wellFormed = true ; + noOtherErrors = true ; + PrintWriter log = null ; + printXMLData = false ; + } + + public void startDocument() { + super.startDocument(); + + if (docStarted) { + printError("Document is started twice.") ; + wellFormed = false ; + } + + docStarted = true ; + } + public void endDocument() { + super.endDocument(); + if (!docStarted) { + wellFormed = false ; + printError("Document ended but not started.") ; + } + docEnded = true ; + } + public void startElement(String name, XAttributeList attr) { + super.startElement(name, attr); + if (attr == null) { + printError("attribute list passed as parameter to startElement()"+ + " method has null value for tag <" + name + ">") ; + noOtherErrors = false ; + } + tagStack.add(0, name) ; + } + public void endElement(String name) { + super.endElement(name); + if (wellFormed) { + if (tagStack.size() == 0) { + wellFormed = false ; + printError("No tags to close (bad closing tag </" + name + ">)") ; + } else { + String startTag = (String) tagStack.elementAt(0) ; + tagStack.remove(0) ; + if (!startTag.equals(name)) { + wellFormed = false ; + printError("Bad closing tag: </" + name + + ">; tag expected: </" + startTag + ">"); + } + } + } + } + + /** + * Checks if there were no errors during document handling. + * I.e. startDocument() and endDocument() must be called, + * XML must be well formed, paramters must be valid. + */ + public boolean isWellFormed() { + if (!docEnded) { + printError("Document was not ended.") ; + wellFormed = false ; + } + + return wellFormed && noOtherErrors ; + } + + /** + * Prints error message and all tags where error occured inside. + * Also prints "Tag trace" in case if the full XML data isn't + * printed. + */ + public void printError(String msg) { + log.println("!!! Error: " + msg) ; + if (printXMLData) return ; + log.println(" Tag trace :") ; + for (int i = 0; i < tagStack.size(); i++) { + String tag = (String) tagStack.elementAt(i) ; + log.println(" <" + tag + ">") ; + } + } + } + + /** + * Beside structure of XML this class also can check existence + * of tags, inner tags, and character data. After document + * completion there is a way to check if required tags and + * character data was found. If there any error occurs an + * appropriate message is output. + */ + public static class XMLTagsChecker extends XMLWellFormChecker { + protected Hashtable tags = new Hashtable() ; + protected Hashtable chars = new Hashtable() ; + protected boolean allOK = true ; + + public XMLTagsChecker(PrintWriter log) { + super(log) ; + } + + /** + * Adds a tag name which must be contained in the XML data. + */ + public void addTag(String tag) { + tags.put(tag, "") ; + } + /** + * Adds a tag name which must be contained in the XML data and + * must be inside the tag with name <code>outerTag</code>. + */ + public void addTagEnclosed(String tag, String outerTag) { + tags.put(tag, outerTag) ; + } + /** + * Adds a character data which must be contained in the XML data. + */ + public void addCharacters(String ch) { + chars.put(ch, "") ; + } + /** + * Adds a character data which must be contained in the XML data and + * must be inside the tag with name <code>outerTag</code>. + */ + public void addCharactersEnclosed(String ch, String outerTag) { + chars.put(ch, outerTag) ; + } + + public void startElement(String name, XAttributeList attrs) { + super.startElement(name, attrs) ; + if (tags.containsKey(name)) { + String outerTag = (String) tags.get(name); + if (!outerTag.equals("")) { + boolean isInTag = false ; + for (int i = 0; i < tagStack.size(); i++) { + if (outerTag.equals((String) tagStack.elementAt(i))) { + isInTag = true ; + break ; + } + } + if (!isInTag) { + printError("Required tag <" + name + "> found, but is not enclosed in tag <" + + outerTag + ">") ; + allOK = false ; + } + } + tags.remove(name) ; + } + } + + public void characters(String ch) { + super.characters(ch) ; + + if (chars.containsKey(ch)) { + String outerTag = (String) chars.get(ch); + if (!outerTag.equals("")) { + boolean isInTag = false ; + for (int i = 0; i < tagStack.size(); i++) { + if (outerTag.equals((String) tagStack.elementAt(i))) { + isInTag = true ; + break ; + } + } + if (!isInTag) { + printError("Required characters '" + ch + "' found, but are not enclosed in tag <" + + outerTag + ">") ; + allOK = false ; + } + } + chars.remove(ch) ; + } + } + + /** + * Checks if the XML data was valid and well formed and if + * all necessary tags and character data was found. + */ + public boolean checkTags() { + allOK &= isWellFormed() ; + + Enumeration badTags = tags.keys() ; + Enumeration badChars = chars.keys() ; + + if (badTags.hasMoreElements()) { + allOK = false ; + log.println("Required tags were not found in export :") ; + while(badTags.hasMoreElements()) { + log.println(" <" + ((String) badTags.nextElement()) + ">") ; + } + } + if (badChars.hasMoreElements()) { + allOK = false ; + log.println("Required characters were not found in export :") ; + while(badChars.hasMoreElements()) { + log.println(" <" + ((String) badChars.nextElement()) + ">") ; + } + } + reset(); + return allOK ; + } + } + + /** + * Represents an XML tag which must be found in XML data written. + * This tag can contain only its name or tag name and attribute + * name, or attribute value additionally. + */ + public static class Tag { + private String name = null; + private String[][] attrList = new String[0][3] ; + + /** + * Creates tag which has only a name. Attributes don't make sense. + * @param tagName The name of the tag. + */ + public Tag(String tagName) { + name = tagName ; + } + + /** + * Creates a tag with the name specified, which must have an + * attribute with name specified. The value of this attribute + * doesn't make sense. + * @param tagName The name of the tag. + * @param attrName The name of attribute which must be contained + * in the tag. + */ + public Tag(String tagName, String attrName) { + name = tagName ; + attrList = new String[1][3] ; + attrList[0][0] = attrName ; + } + + /** + * Creates a tag with the name specified, which must have an + * attribute with the value specified. The type of value + * assumed to be 'CDATA'. + * @param tagName The name of the tag. + * @param attrName The name of attribute which must be contained + * in the tag. + * @param attrValue Attribute value. + */ + public Tag(String tagName, String attrName, String attrValue) { + name = tagName ; + attrList = new String[1][3] ; + attrList[0][0] = attrName ; + attrList[0][1] = "CDATA" ; + attrList[0][2] = attrValue ; + } + + /** + * Creates a tag with the name specified, which must have + * attributes specified. The value of thesee attributes + * doesn't make sense. + * @param tagName The name of the tag. + * @param attrNames Array with names of attributes which must + * be contained in the tag. + */ + public Tag(String tagName, String[] attrNames) { + name = tagName ; + attrList = new String[attrNames.length][3] ; + for (int i = 0; i < attrNames.length; i++) { + attrList[i][0] = attrNames[i] ; + } + } + + /** + * Creates a tag with the name specified, which must have an + * attributes with their values specified. The type of all values + * assumed to be 'CDATA'. + * @param tagName The name of the tag. + * @param attrValues An array with attribute names and their values. + * <code>attrValues[N][0]</code> element contains the name of Nth + * attribute, and <code>attrValues[N][1]</code> element contains + * value of Nth attribute, if value is <code>null</code> then the + * attribute value can be any. + */ + public Tag(String tagName, String[][] attrValues) { + name = tagName ; + attrList = new String[attrValues.length][3] ; + for (int i = 0; i < attrValues.length; i++) { + attrList[i][0] = attrValues[i][0] ; + attrList[i][1] = "CDATA" ; + attrList[i][2] = attrValues[i][1] ; + } + } + + /** + * Gets tag String description. + */ + public String toString() { + String ret = "<" + name ; + for (int i = 0; i < attrList.length; i++) { + ret += " " + attrList[i][0] + "="; + if (attrList[i][2] == null) { + ret += "(not specified)"; + } else { + ret += "\"" + attrList[i][2] + "\""; + } + } + ret += ">"; + + return ret ; + } + + protected boolean checkAttr(int attrListIdx, XAttributeList list) { + short j = 0 ; + int listLen = list.getLength(); + while(j < listLen) { + if (attrList[attrListIdx][0].equals(list.getNameByIndex(j))) { + if (attrList[attrListIdx][2] == null) return true ; + return attrList[attrListIdx][2].equals(list.getValueByIndex(j)) ; + } + j++ ; + } + return false ; + } + + /** + * Checks if this tag matches tag passed in parameters. + * I.e. if tag specifies only it's name it mathes if names + * are equal (attributes don't make sense). If there are + * some attributes names specified in this tag method checks + * if all names present in attribute list <code>list</code> + * (attributes' values don't make sense). If attributes specified + * with values method checks if these attributes exist and + * have appropriate values. + */ + public boolean isMatchTo(String tagName, XAttributeList list) { + if (!name.equals(tagName)) return false; + boolean result = true ; + for (int i = 0; i < attrList.length; i++) { + result &= checkAttr(i, list) ; + } + return result ; + } + } + + /** + * Class realises extended XML data checking. It has possibilities + * to check if a tag exists, if it has some attributes with + * values, and if this tag is contained in another tag (which + * also can specify any attributes). It can check if some + * character data exists inside any tag specified. + */ + public static class XMLChecker extends XMLWellFormChecker { + protected HashSet tagSet = new HashSet() ; + protected Vector tags = new Vector() ; + protected Vector chars = new Vector() ; + protected Vector tagStack = new Vector() ; + protected Vector attrStack = new Vector() ; + + public XMLChecker(PrintWriter log, boolean writeXML) { + super(log, writeXML) ; + } + + public void addTag(Tag tag) { + tags.add(new Tag[] {tag, null}) ; + tagSet.add(tag.name) ; + } + + public void addTagEnclosed(Tag tag, Tag outerTag) { + tags.add(new Tag[] {tag, outerTag}) ; + tagSet.add(tag.name) ; + } + + public void addCharacters(String ch) { + chars.add(new Object[] {ch.trim(), null}) ; + } + + public void addCharactersEnclosed(String ch, Tag outerTag) { + chars.add(new Object[] {ch.trim(), outerTag}) ; + } + + public void startElement(String name, XAttributeList attr) { + try { + super.startElement(name, attr); + + if (tagSet.contains(name)) { + for (int i = 0; i < tags.size(); i++) { + Tag[] tag = (Tag[]) tags.elementAt(i); + if (tag[0].isMatchTo(name, attr)) { + if (tag[1] == null) { + tags.remove(i--); + } else { + boolean isInStack = false ; + for (int j = 0; j < tagStack.size(); j++) { + if (tag[1].isMatchTo((String) tagStack.elementAt(j), + (XAttributeList) attrStack.elementAt(j))) { + + isInStack = true ; + break ; + } + } + if (isInStack) { + tags.remove(i--) ; + } + } + } + } + } + + tagStack.add(0, name) ; + attrStack.add(0, new AttributeList(attr)); + } catch (Exception e) { + e.printStackTrace(log); + } + } + + public void characters(String ch) { + super.characters(ch) ; + for (int i = 0; i < chars.size(); i++) { + Object[] chr = (Object[]) chars.elementAt(i); + if (((String) chr[0]).equals(ch)) { + if (chr[1] == null) { + chars.remove(i--); + } else { + boolean isInStack = false ; + for (int j = 0; j < tagStack.size(); j++) { + if (((Tag) chr[1]).isMatchTo((String) tagStack.elementAt(j), + (XAttributeList) attrStack.elementAt(j))) { + + isInStack = true ; + break ; + } + } + if (isInStack) { + chars.remove(i--) ; + } + } + } + } + } + + public void endElement(String name) { + try { + super.endElement(name); + + if (tagStack.size() > 0) { + tagStack.remove(0) ; + attrStack.remove(0) ; + } + } catch(Exception e) { + e.printStackTrace(log) ; + } + } + + public boolean check() { + if (tags.size()> 0) { + log.println("!!! Error: Some tags were not found :") ; + for (int i = 0; i < tags.size(); i++) { + Tag[] tag = (Tag[]) tags.elementAt(i) ; + log.println(" Tag " + tag[0] + " was not found"); + if (tag[1] != null) + log.println(" inside tag " + tag[1]) ; + } + } + if (chars.size() > 0) { + log.println("!!! Error: Some character data blocks were not found :") ; + for (int i = 0; i < chars.size(); i++) { + Object[] ch = (Object[]) chars.elementAt(i) ; + log.println(" Character data \"" + ch[0] + "\" was not found ") ; + if (ch[1] != null) + log.println(" inside tag " + ch[1]) ; + } + } + + if (!isWellFormed()) + log.println("!!! Some errors were found in XML structure") ; + + boolean result = tags.size() == 0 && chars.size() == 0 && isWellFormed(); + reset(); + return result; + } + } + + /** + * Creates <code>XDocumentHandler</code> implementation in form + * of <code>com.sun.star.xml.sax.Writer</code> service, which + * writes XML data into a <code>com.sun.star.io.Pipe</code> + * created. + * @return Single element array which contains the handler + * contained in <code>Any</code> structure. + */ + public static Object[] getDocumentHandler(XMultiServiceFactory xMSF) { + Object[] ret = new Object[1]; + try { + XInterface Writer = (XInterface) xMSF.createInstance( + "com.sun.star.xml.sax.Writer"); + XInterface oPipe = (XInterface) xMSF.createInstance + ( "com.sun.star.io.Pipe" ); + XOutputStream xPipeOutput = (XOutputStream) UnoRuntime. + queryInterface(XOutputStream.class, oPipe) ; + + XActiveDataSource xADS = (XActiveDataSource) + UnoRuntime.queryInterface(XActiveDataSource.class,Writer); + xADS.setOutputStream(xPipeOutput); + XDocumentHandler handler = (XDocumentHandler) + UnoRuntime.queryInterface(XDocumentHandler.class,Writer); + + Any arg = new Any(new Type(XDocumentHandler.class),handler); + + ret[0] = arg; + } catch (com.sun.star.uno.Exception e) { + e.printStackTrace(); + } + return ret; + } + + public static PropertyValue[] createMediaDescriptor(String[] propNames, Object[] values) { + PropertyValue[] props = new PropertyValue[propNames.length] ; + + for (int i = 0; i < props.length; i++) { + props[i] = new PropertyValue() ; + props[i].Name = propNames[i] ; + if (values != null && i < values.length) { + props[i].Value = values[i] ; + } + } + + return props ; + } + + /** + * Gets the hanlder, which writes all the XML data passed to the + * file specified. + * @param xMSF Soffice <code>ServiceManager</code> factory. + * @param fileURL The file URL (in form file:///<path>) to which + * XML data is written. + * @return SAX handler to which XML data has to be written. + */ + public static XDocumentHandler getFileXMLWriter(XMultiServiceFactory xMSF, String fileURL) + throws com.sun.star.uno.Exception + { + XInterface oFacc = (XInterface)xMSF.createInstance( + "com.sun.star.comp.ucb.SimpleFileAccess"); + XSimpleFileAccess xFacc = (XSimpleFileAccess)UnoRuntime.queryInterface + (XSimpleFileAccess.class, oFacc) ; + + XInterface oWriter = (XInterface)xMSF.createInstance( + "com.sun.star.xml.sax.Writer"); + XActiveDataSource xWriterDS = (XActiveDataSource) + UnoRuntime.queryInterface(XActiveDataSource.class, oWriter); + XDocumentHandler xDocHandWriter = (XDocumentHandler) UnoRuntime.queryInterface + (XDocumentHandler.class, oWriter) ; + + if (xFacc.exists(fileURL)) + xFacc.kill(fileURL); + XOutputStream fOut = xFacc.openFileWrite(fileURL) ; + xWriterDS.setOutputStream(fOut); + + return xDocHandWriter ; + } + + /** + * Parses XML file and passes its data to the SAX handler specified. + * @param xMSF Soffice <code>ServiceManager</code> factory. + * @param fileURL XML file name (in form file:///<path>) to be parsed. + * @param handler SAX handler to which XML data from file will + * be transferred. + */ + public static void parseXMLFile(XMultiServiceFactory xMSF, + String fileURL, XDocumentHandler handler) throws com.sun.star.uno.Exception + { + XInterface oFacc = (XInterface)xMSF.createInstance( + "com.sun.star.comp.ucb.SimpleFileAccess"); + XSimpleFileAccess xFacc = (XSimpleFileAccess)UnoRuntime.queryInterface + (XSimpleFileAccess.class, oFacc) ; + XInputStream oIn = xFacc.openFileRead(fileURL) ; + + XInterface oParser = (XInterface)xMSF.createInstance( + "com.sun.star.xml.sax.Parser"); + XParser xParser = (XParser) UnoRuntime.queryInterface(XParser.class, oParser); + + xParser.setDocumentHandler(handler) ; + InputSource inSrc = new InputSource() ; + inSrc.aInputStream = oIn ; + xParser.parseStream(inSrc) ; + + oIn.closeInput(); + } + + /** + * Exports document (the whole or a part) into the file specified + * in XML format. + * @param xMSF Soffice <code>ServiceManager</code> factory. + * @param xDoc Document to be exported. + * @param docType Type of document (for example 'Calc', 'Writer', 'Draw') + * The type must start with <b>capital</b> letter. + * @param exportType The type of export specifies if the whole + * document will be exported or one of its parts (Meta info, Styles, etc.). + * The following types supported (it also depends of document type) : + * "" (empty string) - for the whole document ; + * "Content" - only content exported ; + * "Meta" - meta document info exported ; + * "Settings" - view settings of document exported ; + * "Styles" - document styles exported ; + * @param fileURL XML file name (in form file:///<path>) to be exported to. + */ + public static void exportDocument(XMultiServiceFactory xMSF, XComponent xDoc, + String docType, String exportType, String fileURL) + throws com.sun.star.uno.Exception { + + XDocumentHandler xDocHandWriter = XMLTools.getFileXMLWriter(xMSF, fileURL) ; + + Any arg = new Any(new Type(XDocumentHandler.class), xDocHandWriter); + XInterface oExp = (XInterface)xMSF.createInstanceWithArguments( + "com.sun.star.comp." + docType + ".XML" + exportType + "Exporter", + new Object[] {arg}); + + XExporter xExp = (XExporter) UnoRuntime.queryInterface + (XExporter.class, oExp) ; + xExp.setSourceDocument(xDoc) ; + + XFilter filter = (XFilter) UnoRuntime.queryInterface(XFilter.class, oExp) ; + filter.filter(XMLTools.createMediaDescriptor( + new String[] {"FilterName"}, + new Object[] {"Custom filter"})) ; + } + + /** + * Imports document (the whole or a part) from the file specified + * in XML format. + * @param xMSF Soffice <code>ServiceManager</code> factory. + * @param xDoc Target document to be imported. + * @param docType Type of document (for example 'Calc', 'Writer', 'Draw') + * The type must start with <b>capital</b> letter. + * @param exportType The type of export specifies if the whole + * document will be exported or one of its parts (Meta info, Styles, etc.). + * The following types supported (it hardly depends of XML data in file) : + * "" (empty string) - for the whole document ; + * "Content" - only content exported ; + * "Meta" - meta document info exported ; + * "Settings" - view settings of document exported ; + * "Styles" - document styles exported ; + * @param fileURL XML file name (in form file:///<path>) to be imported from. + */ + public static void importDocument(XMultiServiceFactory xMSF, XComponent xDoc, + String docType, String importType, String fileURL) + throws com.sun.star.uno.Exception { + + XInterface oImp = (XInterface)xMSF.createInstance( + "com.sun.star.comp." + docType + ".XML" + importType + "Importer"); + XImporter xImp = (XImporter) UnoRuntime.queryInterface + (XImporter.class, oImp) ; + XDocumentHandler xDocHandImp = (XDocumentHandler) UnoRuntime.queryInterface + (XDocumentHandler.class, oImp) ; + + xImp.setTargetDocument(xDoc) ; + parseXMLFile(xMSF, fileURL, xDocHandImp) ; + } +}
\ No newline at end of file |