INTEGRATION: CWS scriptingf5 (1.1.2); FILE ADDED
2004/02/25 18:41:52 npower 1.1.2.1: #i25272# Added a container implementation ( new com/sun/star/script/framework/container defined ) to better seperate Browse functionality from io and script registry. moved this class from com/sun/star/script/framework/browse
This commit is contained in:
@@ -0,0 +1,202 @@
|
||||
/*************************************************************************
|
||||
*
|
||||
* $RCSfile: XMLParserFactory.java,v $
|
||||
*
|
||||
* $Revision: 1.2 $
|
||||
*
|
||||
* last change: $Author: svesik $ $Date: 2004-04-19 23:07:12 $
|
||||
*
|
||||
* The Contents of this file are made available subject to the terms of
|
||||
* either of the following licenses
|
||||
*
|
||||
* - GNU Lesser General Public License Version 2.1
|
||||
* - Sun Industry Standards Source License Version 1.1
|
||||
*
|
||||
* Sun Microsystems Inc., October, 2000
|
||||
*
|
||||
* GNU Lesser General Public License Version 2.1
|
||||
* =============================================
|
||||
* Copyright 2000 by Sun Microsystems, Inc.
|
||||
* 901 San Antonio Road, Palo Alto, CA 94303, USA
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License version 2.1, as published by the Free Software Foundation.
|
||||
*
|
||||
* This library 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 for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
||||
* MA 02111-1307 USA
|
||||
*
|
||||
*
|
||||
* Sun Industry Standards Source License Version 1.1
|
||||
* =================================================
|
||||
* The contents of this file are subject to the Sun Industry Standards
|
||||
* Source License Version 1.1 (the "License"); You may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of the
|
||||
* License at http://www.openoffice.org/license.html.
|
||||
*
|
||||
* Software provided under this License is provided on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
|
||||
* WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
|
||||
* MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
|
||||
* See the License for the specific provisions governing your rights and
|
||||
* obligations concerning the Software.
|
||||
*
|
||||
* The Initial Developer of the Original Code is: Sun Microsystems, Inc.
|
||||
*
|
||||
* Copyright: 2000 by Sun Microsystems, Inc.
|
||||
*
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* Contributor(s): _______________________________________
|
||||
*
|
||||
*
|
||||
************************************************************************/
|
||||
|
||||
package com.sun.star.script.framework.container;
|
||||
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.io.IOException;
|
||||
import java.lang.reflect.Method;
|
||||
|
||||
import javax.xml.parsers.*;
|
||||
import org.w3c.dom.Document;
|
||||
import org.xml.sax.InputSource;
|
||||
import org.xml.sax.SAXException;
|
||||
import org.xml.sax.SAXParseException;
|
||||
|
||||
public class XMLParserFactory {
|
||||
|
||||
private static XMLParser parser = null;
|
||||
private static String officedtdurl = null;
|
||||
|
||||
private XMLParserFactory() {}
|
||||
|
||||
public static XMLParser getParser() {
|
||||
if (parser == null) {
|
||||
synchronized (XMLParserFactory.class) {
|
||||
if (parser == null)
|
||||
parser = new DefaultParser();
|
||||
}
|
||||
}
|
||||
return parser;
|
||||
}
|
||||
|
||||
public static void setParser(XMLParser p) {
|
||||
parser = p;
|
||||
}
|
||||
|
||||
public static void setOfficeDTDURL(String url) {
|
||||
officedtdurl = url;
|
||||
}
|
||||
|
||||
private static class DefaultParser implements XMLParser {
|
||||
|
||||
private DocumentBuilderFactory factory;
|
||||
|
||||
public DefaultParser() {
|
||||
factory = DocumentBuilderFactory.newInstance();
|
||||
}
|
||||
|
||||
public Document parse(InputStream inputStream) throws IOException {
|
||||
Document result = null;
|
||||
InputSource is = null;
|
||||
|
||||
try {
|
||||
DocumentBuilder builder = factory.newDocumentBuilder();
|
||||
|
||||
is = new InputSource(inputStream);
|
||||
|
||||
if (officedtdurl != null) {
|
||||
is.setSystemId(officedtdurl);
|
||||
}
|
||||
|
||||
result = builder.parse(is);
|
||||
}
|
||||
catch (SAXParseException spe) {
|
||||
throw new IOException(spe.getMessage());
|
||||
}
|
||||
catch (SAXException se) {
|
||||
throw new IOException(se.getMessage());
|
||||
}
|
||||
catch (ParserConfigurationException pce) {
|
||||
throw new IOException(pce.getMessage());
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public void write(Document doc, OutputStream out) throws IOException {
|
||||
Class clazz = doc.getClass();
|
||||
String name = clazz.getName();
|
||||
|
||||
// depending on the class of the Document object use introspection
|
||||
// to invoke the appropriate methods for writing the XML
|
||||
// this code is based on the code used by the NetBeans
|
||||
// class XMLUtilImpl in the openide module
|
||||
try {
|
||||
if (name.equals("com.sun.xml.tree.XmlDocument") ||
|
||||
name.equals("org.apache.crimson.tree.XmlDocument")) {
|
||||
|
||||
// these DOM implementations are self writing
|
||||
Method write;
|
||||
write = clazz.getDeclaredMethod("write",
|
||||
new Class[] {OutputStream.class});
|
||||
write.invoke(doc, new Object[] {out});
|
||||
}
|
||||
else {
|
||||
// try xerces serialize package using introspection
|
||||
ClassLoader cl = this.getClass().getClassLoader();
|
||||
|
||||
Class serializerClass = Class.forName(
|
||||
"org.apache.xml.serialize.XMLSerializer", true, cl);
|
||||
Class formatterClass = Class.forName(
|
||||
"org.apache.xml.serialize.OutputFormat", true, cl);
|
||||
|
||||
Object serializerObject = serializerClass.newInstance();
|
||||
Object formatterObject = formatterClass.newInstance();
|
||||
|
||||
// improve output readability using the OutputFormat class
|
||||
Method method = null;
|
||||
method = formatterClass.getMethod("setMethod",
|
||||
new Class[] {String.class});
|
||||
method.invoke(formatterObject, new Object[] {"xml"});
|
||||
method = formatterClass.getMethod("setIndenting",
|
||||
new Class[] {Boolean.TYPE});
|
||||
method.invoke(formatterObject, new Object[] {Boolean.TRUE});
|
||||
|
||||
// now set up an instance of XMLSerializer with our
|
||||
// OutputStream and serialize our Document
|
||||
method = serializerClass.getMethod("setOutputByteStream",
|
||||
new Class[] {OutputStream.class});
|
||||
method.invoke(serializerObject, new Object[] {out});
|
||||
method = serializerClass.getMethod("setOutputFormat",
|
||||
new Class[] {formatterClass});
|
||||
method.invoke(serializerObject,
|
||||
new Object[] {formatterObject});
|
||||
|
||||
method = serializerClass.getMethod("asDOMSerializer",
|
||||
new Class[0]);
|
||||
Object impl = method.invoke(serializerObject,
|
||||
new Object[0]);
|
||||
|
||||
method = impl.getClass().getMethod("serialize",
|
||||
new Class[] {Document.class});
|
||||
method.invoke(impl, new Object[] {doc});
|
||||
}
|
||||
} catch (NoSuchMethodException ex) {
|
||||
throw new IOException(ex.getMessage());
|
||||
} catch (ClassNotFoundException ex) {
|
||||
throw new IOException(ex.getMessage());
|
||||
} catch (Exception ex) {
|
||||
throw new IOException(ex.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user