001: /*
002: * $Id: XMLFactory.java,v 1.3 2002/03/22 19:08:58 awason Exp $
003: *
004: * ===========================================================================
005: *
006: * The JGenerator Software License, Version 1.0
007: *
008: * Copyright (c) 2000 Dmitry Skavish (skavish@usa.net). All rights reserved.
009: *
010: * Redistribution and use in source and binary forms, with or without
011: * modification, are permitted provided that the following conditions are met:
012: *
013: * 1. Redistributions of source code must retain the above copyright
014: * notice, this list of conditions and the following disclaimer.
015: *
016: * 2. Redistributions in binary form must reproduce the above copyright
017: * notice, this list of conditions and the following disclaimer in
018: * the documentation and/or other materials provided with the
019: * distribution.
020: *
021: * 3. The end-user documentation included with the redistribution, if
022: * any, must include the following acknowlegement:
023: * "This product includes software developed by Dmitry Skavish
024: * (skavish@usa.net, http://www.flashgap.com/)."
025: * Alternately, this acknowlegement may appear in the software itself,
026: * if and wherever such third-party acknowlegements normally appear.
027: *
028: * 4. The name "The JGenerator" must not be used to endorse or promote
029: * products derived from this software without prior written permission.
030: * For written permission, please contact skavish@usa.net.
031: *
032: * 5. Products derived from this software may not be called "The JGenerator"
033: * nor may "The JGenerator" appear in their names without prior written
034: * permission of Dmitry Skavish.
035: *
036: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
037: * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
038: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
039: * DISCLAIMED. IN NO EVENT SHALL DMITRY SKAVISH OR THE OTHER
040: * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
041: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
042: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
043: * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
044: * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
045: * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
046: * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
047: * SUCH DAMAGE.
048: *
049: */
050:
051: package org.openlaszlo.iv.flash.xml;
052:
053: import org.openlaszlo.iv.flash.context.*;
054:
055: import org.openlaszlo.iv.flash.util.*;
056:
057: import javax.xml.parsers.*;
058: import java.lang.reflect.*;
059: import org.w3c.dom.Node;
060:
061: /**
062: * XML Factory
063: *
064: * @author Dmitry Skavish
065: */
066: public abstract class XMLFactory {
067:
068: private static XMLFactory instance;
069:
070: /**
071: * Returns implementation specific DocumentBuilder
072: *
073: * @return implementation specific DocumentBuilder
074: * @exception ParserConfigurationException
075: */
076: public abstract DocumentBuilder getDocumentBuilder()
077: throws ParserConfigurationException;
078:
079: /**
080: * Creates new implementation specific XMLContext
081: *
082: * @param parent parent context
083: * @param node node representing the created context
084: * @return implementation specific XMLContext
085: */
086: public abstract XMLContext newXMLContext(Context parent, Node node);
087:
088: /**
089: * Returns implementation specific XPathProcessor
090: *
091: * @return implementation specific XPathProcessor
092: */
093: public abstract XPathProcessor getXPathProcessor();
094:
095: /**
096: * Returns implementation specific instance of XMLFactory
097: *
098: * @return implementation specific instance of XMLFactory
099: */
100: public static XMLFactory getFactory() {
101: return instance;
102: }
103:
104: static {
105: DocumentBuilderFactory docFactory = null;
106:
107: String factoryName = PropertyManager.getProperty(
108: "javax.xml.parsers.DocumentBuilderFactory", null);
109: if (factoryName != null) {
110: try {
111: Class clazz = Class.forName(factoryName);
112: docFactory = (DocumentBuilderFactory) clazz
113: .newInstance();
114: } catch (Exception e) {
115: }
116: }
117:
118: if (docFactory == null) {
119: try {
120: docFactory = DocumentBuilderFactory.newInstance();
121: } catch (RuntimeException e) {
122: }
123: if (docFactory == null) {
124: try {
125: Class clazz = Class
126: .forName("org.openlaszlo.iv.flash.xml.apache.DocumentBuilderFactoryImpl");
127: docFactory = (DocumentBuilderFactory) clazz
128: .newInstance();
129: } catch (Exception e) {
130: Log.logRB(e);
131: }
132: }
133: }
134:
135: if (docFactory != null) {
136:
137: String name = docFactory.getClass().getName();
138: if (name.startsWith("org.apache.xerces")) {
139: // change default apache factory with ours, because default one very strict to errors
140: try {
141: Class clazz = Class
142: .forName("org.openlaszlo.iv.flash.xml.apache.DocumentBuilderFactoryImpl");
143: DocumentBuilderFactory docFactory2 = (DocumentBuilderFactory) clazz
144: .newInstance();
145: docFactory = docFactory2;
146: name = docFactory.getClass().getName();
147: } catch (Exception e) {
148: }
149: }
150:
151: docFactory.setExpandEntityReferences(false);
152: docFactory.setIgnoringComments(true);
153: docFactory.setNamespaceAware(true);
154: docFactory.setValidating(false);
155:
156: // Use XML factory if specified
157: String xmlFactoryName = PropertyManager.getProperty(
158: "org.openlaszlo.iv.flash.XMLFactory", null);
159: if (xmlFactoryName != null) {
160: try {
161: instance = constructFactory(xmlFactoryName,
162: docFactory);
163: } catch (Exception e) {
164: Log.logRB(e);
165: }
166: }
167: // Otherwise find a factory to match the DocumentBuilderFactory
168: else if (name
169: .startsWith("org.openlaszlo.iv.flash.xml.apache.")) {
170: try {
171: instance = constructFactory(
172: "org.openlaszlo.iv.flash.xml.apache.XMLFactoryImpl",
173: docFactory);
174: } catch (Exception e) {
175: Log.logRB(e);
176: }
177: } else if (name.startsWith("com.caucho.")) {
178: // instance = new org.openlaszlo.iv.flash.xml.caucho.XMLFactoryImpl(docFactory);
179: try {
180: instance = constructFactory(
181: "org.openlaszlo.iv.flash.xml.caucho.XMLFactoryImpl",
182: docFactory);
183: } catch (Exception e) {
184: Log.logRB(e);
185: }
186: } else {
187: instance = new org.openlaszlo.iv.flash.xml.generic.XMLFactoryImpl(
188: docFactory);
189: }
190: }
191: }
192:
193: private static XMLFactory constructFactory(String factoryName,
194: DocumentBuilderFactory docFactory) throws Exception {
195: Class factory = Class.forName(factoryName);
196: Constructor constr = factory
197: .getConstructor(new Class[] { DocumentBuilderFactory.class });
198: return (XMLFactory) constr
199: .newInstance(new Object[] { docFactory });
200: }
201: }
|