/* * The Relaxer artifact * Copyright (c) 2000-2004, ASAMI Tomoharu, All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ package org.relaxer.vocabulary.forrest_0_5.howto_v12; import java.util.*; import java.lang.reflect.*; import java.io.*; import java.net.URL; import java.net.MalformedURLException; import javax.xml.parsers.*; import org.xml.sax.*; import org.w3c.dom.*; /** * UJAXP * * @since Feb. 20, 2000 * @version Jul. 10, 2003 * @author ASAMI, Tomoharu (asami@relaxer.org) */ public final class UJAXP { public final static int FLAG_NONE = 0x00; public final static int FLAG_VALIDATION = 0x01; public final static int FLAG_NAMESPACE_AWARE = 0x02; public final static int FLAG_WHITESPACE = 0x04; public final static int FLAG_EXPAND_ENTITY_REF = 0x08; public final static int FLAG_IGNORE_COMMENTS = 0x10; public final static int FLAG_COALESCING = 0x20; private static ErrorHandler errorHandler; private static EntityResolver entityResolver; private static Map entityMap; // public static Document getDocument(File file, int flags) throws IOException, SAXException, ParserConfigurationException { return (getDocument(file.toURL(), flags)); } public static Document getDocument(String uri, int flags) throws IOException, SAXException, ParserConfigurationException { return (getDocument(uri, flags, getErrorHandler())); } public static Document getDocument(URL url, int flags) throws IOException, SAXException, ParserConfigurationException { return (getDocument(url, flags, getErrorHandler())); } public static Document getDocument(InputStream in, int flags) throws IOException, SAXException, ParserConfigurationException { return (getDocument(in, flags, getErrorHandler())); } public static Document getDocument(InputSource is, int flags) throws IOException, SAXException, ParserConfigurationException { return (getDocument(is, flags, getErrorHandler())); } public static Document getDocument(Reader reader, int flags) throws IOException, SAXException, ParserConfigurationException { return (getDocument(reader, flags, getErrorHandler())); } // public static Document getDocument( File file, int flags, ErrorHandler handler ) throws IOException, SAXException, ParserConfigurationException { return (getDocument(file.toURL(), flags, handler)); } public static Document getDocument( String uri, int flags, ErrorHandler handler ) throws IOException, SAXException, ParserConfigurationException { if (uri == null || uri.length() == 0) { throw (new IllegalArgumentException()); } if (uri.charAt(0) == '<') { return (getDocument(new StringReader(uri), flags, handler)); } if (handler == null) { handler = getErrorHandler(); } DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); _setup(factory, flags); DocumentBuilder builder = factory.newDocumentBuilder(); builder.setErrorHandler(handler); builder.setEntityResolver(getEntityResolver()); Document doc = builder.parse(adjustURI(uri)); return (doc); } public static Document getDocument( URL url, int flags, ErrorHandler handler ) throws IOException, SAXException, ParserConfigurationException { if (handler == null) { handler = getErrorHandler(); } DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); _setup(factory, flags); DocumentBuilder builder = factory.newDocumentBuilder(); builder.setErrorHandler(handler); builder.setEntityResolver(getEntityResolver()); Document doc = builder.parse(url.toString()); return (doc); } public static Document getDocument( InputStream in, int flags, ErrorHandler handler ) throws IOException, SAXException, ParserConfigurationException { if (handler == null) { handler = getErrorHandler(); } DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); _setup(factory, flags); DocumentBuilder builder = factory.newDocumentBuilder(); builder.setErrorHandler(handler); builder.setEntityResolver(getEntityResolver()); Document doc = builder.parse(in); return (doc); } public static Document getDocument( InputSource is, int flags, ErrorHandler handler ) throws IOException, SAXException, ParserConfigurationException { if (handler == null) { handler = getErrorHandler(); } DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); _setup(factory, flags); DocumentBuilder builder = factory.newDocumentBuilder(); builder.setErrorHandler(handler); builder.setEntityResolver(getEntityResolver()); Document doc = builder.parse(is); return (doc); } public static Document getDocument( Reader reader, int flags, ErrorHandler handler ) throws IOException, SAXException, ParserConfigurationException { if (handler == null) { handler = getErrorHandler(); } DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); _setup(factory, flags); DocumentBuilder builder = factory.newDocumentBuilder(); builder.setErrorHandler(handler); builder.setEntityResolver(getEntityResolver()); Document doc = builder.parse(new InputSource(reader)); return (doc); } private static void _setup(DocumentBuilderFactory factory, int flags) { factory.setValidating((flags & FLAG_VALIDATION) != 0); factory.setNamespaceAware((flags & FLAG_NAMESPACE_AWARE) != 0); } // public static Document getDocument(File file) throws IOException, SAXException, ParserConfigurationException { return (getDocument(file.toURL())); } public static Document getDocument(String uri) throws IOException, SAXException, ParserConfigurationException { return (getDocument(uri, getErrorHandler())); } public static Document getDocument(URL url) throws IOException, SAXException, ParserConfigurationException { return (getDocument(url, getErrorHandler())); } public static Document getDocument(InputStream in) throws IOException, SAXException, ParserConfigurationException { return (getDocument(in, getErrorHandler())); } public static Document getDocument(InputSource is) throws IOException, SAXException, ParserConfigurationException { return (getDocument(is, getErrorHandler())); } public static Document getDocument(Reader reader) throws IOException, SAXException, ParserConfigurationException { return (getDocument(reader, getErrorHandler())); } public static Document getDocument(File file, ErrorHandler handler) throws IOException, SAXException, ParserConfigurationException { return (getDocument(file.toURL(), handler)); } public static Document getDocument(String uri, ErrorHandler handler) throws IOException, SAXException, ParserConfigurationException { if (handler == null) { handler = getErrorHandler(); } DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); builder.setErrorHandler(handler); builder.setEntityResolver(getEntityResolver()); Document doc = builder.parse(adjustURI(uri)); return (doc); } public static Document getDocument(URL url, ErrorHandler handler) throws IOException, SAXException, ParserConfigurationException { if (handler == null) { handler = getErrorHandler(); } DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); builder.setErrorHandler(handler); builder.setEntityResolver(getEntityResolver()); Document doc = builder.parse(url.toString()); return (doc); } public static Document getDocument(InputStream in, ErrorHandler handler) throws IOException, SAXException, ParserConfigurationException { if (handler == null) { handler = getErrorHandler(); } DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); builder.setErrorHandler(handler); builder.setEntityResolver(getEntityResolver()); Document doc = builder.parse(in); return (doc); } public static Document getDocument(InputSource is, ErrorHandler handler) throws IOException, SAXException, ParserConfigurationException { if (handler == null) { handler = getErrorHandler(); } DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); builder.setErrorHandler(handler); builder.setEntityResolver(getEntityResolver()); Document doc = builder.parse(is); return (doc); } public static Document getDocument(Reader reader, ErrorHandler handler) throws IOException, SAXException, ParserConfigurationException { if (handler == null) { handler = getErrorHandler(); } DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); builder.setErrorHandler(handler); builder.setEntityResolver(getEntityResolver()); Document doc = builder.parse(new InputSource(reader)); return (doc); } // For factory public static Document getDocument( File file, int flags, ErrorHandler handler, EntityResolver resolver ) throws IOException, SAXException, ParserConfigurationException { return (getDocument(file.toURL(), flags, handler, resolver)); } public static Document getDocument( String uri, String baseUri, int flags, ErrorHandler handler, EntityResolver resolver ) throws IOException, SAXException, ParserConfigurationException { if (uri == null || uri.length() == 0) { throw (new IllegalArgumentException()); } if (uri.charAt(0) == '<') { return ( getDocument(new StringReader(uri), flags, handler, resolver) ); } uri = makeUri(uri, baseUri); if (handler == null) { handler = getErrorHandler(); } if (resolver == null) { resolver = getEntityResolver(); } DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); _setup(factory, flags); DocumentBuilder builder = factory.newDocumentBuilder(); builder.setErrorHandler(handler); builder.setEntityResolver(resolver); Document doc = builder.parse(adjustURI(uri)); return (doc); } // IETF 2396 public static String makeUri(String uri, String baseUri) { //System.out.println("uri = " + uri); //System.out.println("xml:base = " + baseUri); try { new URL(uri); return (uri); } catch (MalformedURLException e) { } try { if (baseUri == null) { return (new File(uri).toURL().toExternalForm()); } URL url = new URL(baseUri); String protocol = url.getProtocol(); String host = url.getHost(); int port = url.getPort(); String path = url.getPath(); if (uri.startsWith("/")) { String newPath = _normalizePath(uri); URL newUrl = new URL(protocol, host, port, newPath); //System.out.println("result = " + newUrl.toExternalForm()); return (newUrl.toExternalForm()); } else { if (path == null) { path = "/"; } int index = path.lastIndexOf("/"); if (index == -1) { throw (new IllegalArgumentException(baseUri)); } String newPath = _normalizePath(path.substring(0, index + 1) + uri); URL newUrl = new URL(protocol, host, port, newPath); //System.out.println("result = " + newUrl.toExternalForm()); return (newUrl.toExternalForm()); } } catch (MalformedURLException e) { throw (new IllegalArgumentException(baseUri)); } } private static String _normalizePath(String path) { return (path); // XXX } /* private static String _makeUri(String uri, String baseUri) { if (baseUri == null) { return (uri); } if (isURL(uri)) { return (uri); } else if (new File(uri).isAbsolute()) { return (uri); } else { if (baseUri.endsWith("/")) { return (baseUri + uri); } else { return (baseUri + "/" + uri); } } } */ public static Document getDocument( URL url, int flags, ErrorHandler handler, EntityResolver resolver ) throws IOException, SAXException, ParserConfigurationException { if (handler == null) { handler = getErrorHandler(); } if (resolver == null) { resolver = getEntityResolver(); } DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); _setup(factory, flags); DocumentBuilder builder = factory.newDocumentBuilder(); builder.setErrorHandler(handler); builder.setEntityResolver(getEntityResolver()); Document doc = builder.parse(url.toString()); return (doc); } public static Document getDocument( InputStream in, int flags, ErrorHandler handler, EntityResolver resolver ) throws IOException, SAXException, ParserConfigurationException { if (handler == null) { handler = getErrorHandler(); } if (resolver == null) { resolver = getEntityResolver(); } DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); _setup(factory, flags); DocumentBuilder builder = factory.newDocumentBuilder(); builder.setErrorHandler(handler); builder.setEntityResolver(getEntityResolver()); Document doc = builder.parse(in); return (doc); } public static Document getDocument( InputSource is, int flags, ErrorHandler handler, EntityResolver resolver ) throws IOException, SAXException, ParserConfigurationException { if (handler == null) { handler = getErrorHandler(); } if (resolver == null) { resolver = getEntityResolver(); } DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); _setup(factory, flags); DocumentBuilder builder = factory.newDocumentBuilder(); builder.setErrorHandler(handler); builder.setEntityResolver(getEntityResolver()); Document doc = builder.parse(is); return (doc); } public static Document getDocument( Reader reader, int flags, ErrorHandler handler, EntityResolver resolver ) throws IOException, SAXException, ParserConfigurationException { if (handler == null) { handler = getErrorHandler(); } if (resolver == null) { resolver = getEntityResolver(); } DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); _setup(factory, flags); DocumentBuilder builder = factory.newDocumentBuilder(); builder.setErrorHandler(handler); builder.setEntityResolver(getEntityResolver()); Document doc = builder.parse(new InputSource(reader)); return (doc); } // obsolate? public static Document getValidDocument(File file) throws IOException, SAXException, ParserConfigurationException { return (getValidDocument(file.toURL())); } public static Document getValidDocument(String uri) throws IOException, SAXException, ParserConfigurationException { return (getValidDocument(uri, getErrorHandler())); } public static Document getValidDocument(URL url) throws IOException, SAXException, ParserConfigurationException { return (getValidDocument(url, getErrorHandler())); } public static Document getValidDocument(InputStream in) throws IOException, SAXException, ParserConfigurationException { return (getValidDocument(in, getErrorHandler())); } public static Document getValidDocument(InputSource is) throws IOException, SAXException, ParserConfigurationException { return (getValidDocument(is, getErrorHandler())); } public static Document getValidDocument(Reader reader) throws IOException, SAXException, ParserConfigurationException { return (getValidDocument(reader, getErrorHandler())); } public static Document getValidDocument(File file, ErrorHandler handler) throws IOException, SAXException, ParserConfigurationException { return (getValidDocument(file.toURL(), handler)); } public static Document getValidDocument( String uri, ErrorHandler handler ) throws IOException, SAXException, ParserConfigurationException { if (uri == null || uri.length() == 0) { throw (new IllegalArgumentException()); } if (uri.charAt(0) == '<') { return (getValidDocument(new StringReader(uri), handler)); } if (handler == null) { handler = getErrorHandler(); } DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setValidating(true); DocumentBuilder builder = factory.newDocumentBuilder(); builder.setErrorHandler(handler); builder.setEntityResolver(getEntityResolver()); Document doc = builder.parse(adjustURI(uri)); return (doc); } public static Document getValidDocument( URL url, ErrorHandler handler ) throws IOException, SAXException, ParserConfigurationException { if (handler == null) { handler = getErrorHandler(); } DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setValidating(true); DocumentBuilder builder = factory.newDocumentBuilder(); builder.setErrorHandler(handler); builder.setEntityResolver(getEntityResolver()); Document doc = builder.parse(url.toString()); return (doc); } public static Document getValidDocument( InputStream in, ErrorHandler handler ) throws IOException, SAXException, ParserConfigurationException { if (handler == null) { handler = getErrorHandler(); } DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setValidating(true); DocumentBuilder builder = factory.newDocumentBuilder(); builder.setErrorHandler(handler); builder.setEntityResolver(getEntityResolver()); Document doc = builder.parse(in); return (doc); } public static Document getValidDocument( InputSource is, ErrorHandler handler ) throws IOException, SAXException, ParserConfigurationException { if (handler == null) { handler = getErrorHandler(); } DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setValidating(true); DocumentBuilder builder = factory.newDocumentBuilder(); builder.setErrorHandler(handler); builder.setEntityResolver(getEntityResolver()); Document doc = builder.parse(is); return (doc); } public static Document getValidDocument( Reader reader, ErrorHandler handler ) throws IOException, SAXException, ParserConfigurationException { if (handler == null) { handler = getErrorHandler(); } DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setValidating(true); DocumentBuilder builder = factory.newDocumentBuilder(); builder.setErrorHandler(handler); builder.setEntityResolver(getEntityResolver()); Document doc = builder.parse(new InputSource(reader)); return (doc); } public static Document makeDocument() throws ParserConfigurationException { return (makeDocument(getErrorHandler())); } public static Document makeDocument(ErrorHandler handler) throws ParserConfigurationException { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); builder.setErrorHandler(handler); builder.setEntityResolver(getEntityResolver()); Document doc = builder.newDocument(); return (doc); } public static ErrorHandler getErrorHandler() { if (errorHandler == null) { errorHandler = new DefaultErrorHandler(); } return (errorHandler); } public static EntityResolver getEntityResolver() { if (entityResolver == null) { entityResolver = new DefaultEntityResolver(); } return (entityResolver); } static class DefaultErrorHandler implements ErrorHandler { public void error(SAXParseException e) { System.err.print("error : "); System.err.println(e.getMessage()); } public void fatalError(SAXParseException e) { System.err.print("fatal error : "); System.err.println(e.getMessage()); } public void warning(SAXParseException e) { System.err.print("warning : "); System.err.println(e.getMessage()); } } static class DefaultEntityResolver implements EntityResolver { public InputSource resolveEntity( String publicId, String systemId ) { if (!systemId.endsWith(".dtd")) { URL url = getEntityResource(systemId); if (url != null) { return (new InputSource(url.toExternalForm())); } else { return (null); } } if (canAccess(systemId)) { return (new InputSource(systemId)); } else { URL url = getEntityResource(systemId); if (url != null) { return (new InputSource(url.toExternalForm())); } else { StringReader reader = new StringReader(""); return (new InputSource(reader)); } } } } static String adjustURI(String uri) { try { URL url = makeURL(uri); return (url.toExternalForm()); } catch (MalformedURLException e) { return (uri); } } static URL makeURL(String uri) throws MalformedURLException { try { return (new URL(uri)); } catch (MalformedURLException e) { return (new File(uri).toURL()); } } static boolean isURL(String uri) { try { new URL(uri); return (true); } catch (MalformedURLException e) { return (false); } } static boolean canAccess(String uri) { try { URL url = makeURL(uri); if ("file".equals(url.getProtocol())) { String fileName = url.getFile(); return (new File(fileName).exists()); } return (false); // skip http uri } catch (IOException e) { return (false); } } public static void setErrorHandler(ErrorHandler handler) { errorHandler = handler; } public static void setEntityResolver(EntityResolver resolver) { entityResolver = resolver; } public static void setEntityResource(String systemId, URL resource) { if (entityMap == null) { entityMap = new HashMap(); } entityMap.put(systemId, resource); } public static URL getEntityResource(String systemId) { if (entityMap == null) { return (null); } else { String filename = _getFilename(systemId); return ((URL)entityMap.get(filename)); } } private static String _getFilename(String pathname) { int index = pathname.lastIndexOf("/"); if (index == -1) { return (pathname); } else { return (pathname.substring(index + 1)); } } // complex public static boolean isMatchDataComplex( Element element, String typeExpr ) { String data = URelaxer.getElementPropertyAsValue(element, "string"); return (isMatchDataComplex(data, typeExpr)); } public static boolean isMatchDataComplexAttr( Element element, String attrName, String typeExpr ) { String data = URelaxer.getAttributePropertyAsValue( element, attrName, "string" ); if (data == null) { return (false); } return (isMatchDataComplex(data, typeExpr)); } public static boolean isMatchDataComplexElement( Element element, String elementName, String typeExpr ) { String data = URelaxer.getElementPropertyAsValue( element, elementName, "string" ); if (data == null) { return (false); } return (isMatchDataComplex(data, typeExpr)); } public static boolean isMatchDataComplex(String data, String typeExpr) { try { Document doc = getDocument(new java.io.StringReader(typeExpr)); return (_isMatchData(data, doc.getDocumentElement())); } catch (Exception e) { throw (new InternalError(data + " : " + typeExpr)); } } private static boolean _isMatchData(String data, Element expr) { String tagName = expr.getTagName(); if ("value".equals(tagName)) { return (_isMatchDataValue(data, expr)); } else if ("data".equals(tagName)) { return (_isMatchDataData(data, expr)); } else if ("choice".equals(tagName)) { return (_isMatchDataChoice(data, expr)); } else if ("list".equals(tagName)) { return (_isMatchDataList(data, expr)); /* } else if ("optional".equals(tagName)) { return (_isMatchDataOptional(data, expr)); } else if ("oneOrMore".equals(tagName)) { return (_isMatchDataOneOrMore(data, expr)); } else if ("zeroOrMore".equals(tagName)) { return (_isMatchDataZeroOrMore(data, expr)); */ } else { throw (new InternalError(data + " : " + tagName)); } } private static boolean _isMatchDataValue(String data, Element value) { String typeName = value.getAttribute("type"); String text = URelaxer.getElementPropertyAsString(value); if ("string".equals(typeName)) { return (data.equals(text)); } else { return (data.equals(text.trim())); } } private static boolean _isMatchDataData(String data, Element dataInfo) { String typeName = dataInfo.getAttribute("type"); // XXX return (true); } private static boolean _isMatchDataChoice(String data, Element choice) { Element[] children = URelaxer.getElements(choice); for (int i = 0;i < children.length;i++) { Element child = children[i]; if (_isMatchData(data, child)) { return (true); } } return (false); } private static boolean _isMatchDataList(String data, Element listInfo) { Element[] children = URelaxer.getElements(listInfo); String[] texts = URelaxer.getStringList(data); List list = new ArrayList(); list.addAll(Arrays.asList(texts)); for (int i = 0;i < children.length;i++) { Element child = children[i]; String tagName = child.getTagName(); if ("value".equals(tagName)) { if (list.size() == 0) { return (false); } String text = (String)list.get(0); if (!_isMatchDataValue(text, child)) { return (false); } list.remove(0); } else if ("data".equals(tagName)) { if (list.size() == 0) { return (false); } String text = (String)list.get(0); if (!_isMatchDataData(text, child)) { return (false); } list.remove(0); } else if ("choice".equals(tagName)) { if (list.size() == 0) { return (false); } String text = (String)list.get(0); if (!_isMatchDataChoice(text, child)) { return (false); } list.remove(0); } else if ("list".equals(tagName)) { return (_isMatchDataList(data, child)); // XXX : data?list? } else if ("optional".equals(tagName)) { if (!_isMatchDataOptional(list, child)) { return (false); } } else if ("oneOrMore".equals(tagName)) { if (!_isMatchDataOneOrMore(list, child)) { return (false); } } else if ("zeroOrMore".equals(tagName)) { if (!_isMatchDataZeroOrMore(list, child)) { return (false); } } else { throw (new InternalError(data + " : " + tagName)); } } return (true); } private static boolean _isMatchDataOptional( List list, Element optional ) { Element[] children = URelaxer.getElements(optional); Element expr = children[0]; String text = (String)list.get(0); if (_isMatchDataData(text, expr)) { list.remove(0); } return (true); } private static boolean _isMatchDataOneOrMore( List list, Element oneOrMore ) { if (list.size() == 0) { return (false); } return (_isMatchDataZeroOrMore(list, oneOrMore)); } private static boolean _isMatchDataZeroOrMore( List list, Element zeroOrMore ) { Element[] children = URelaxer.getElements(zeroOrMore); Element expr = children[0]; int size = list.size(); for (int i = 0;i < size;i++) { String text = (String)list.get(0); if (!_isMatchDataData(text, expr)) { return (true); } list.remove(0); } return (true); } // test driver public static void main(String[] args) throws Exception { String className = args[0]; File file = new File(args[1]); Class clazz = Class.forName(className); Method setupMethod = clazz.getMethod( "setup", new Class[] { File.class } ); Method makeMethod = clazz.getMethod( "makeDocument", new Class[0] ); Object object = clazz.newInstance(); setupMethod.invoke(object, new Object[] { file }); System.out.println("text:" + object); Document doc = (Document)makeMethod.invoke(object, new Object[0]); System.out.println("dom:" + URelaxer.doc2String4Data(doc)); } }