KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > openlaszlo > iv > flash > xml > XMLFactory


1 /*
2  * $Id: XMLFactory.java,v 1.3 2002/03/22 19:08:58 awason Exp $
3  *
4  * ===========================================================================
5  *
6  * The JGenerator Software License, Version 1.0
7  *
8  * Copyright (c) 2000 Dmitry Skavish (skavish@usa.net). All rights reserved.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions are met:
12  *
13  * 1. Redistributions of source code must retain the above copyright
14  * notice, this list of conditions and the following disclaimer.
15  *
16  * 2. Redistributions in binary form must reproduce the above copyright
17  * notice, this list of conditions and the following disclaimer in
18  * the documentation and/or other materials provided with the
19  * distribution.
20  *
21  * 3. The end-user documentation included with the redistribution, if
22  * any, must include the following acknowlegement:
23  * "This product includes software developed by Dmitry Skavish
24  * (skavish@usa.net, http://www.flashgap.com/)."
25  * Alternately, this acknowlegement may appear in the software itself,
26  * if and wherever such third-party acknowlegements normally appear.
27  *
28  * 4. The name "The JGenerator" must not be used to endorse or promote
29  * products derived from this software without prior written permission.
30  * For written permission, please contact skavish@usa.net.
31  *
32  * 5. Products derived from this software may not be called "The JGenerator"
33  * nor may "The JGenerator" appear in their names without prior written
34  * permission of Dmitry Skavish.
35  *
36  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
37  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
38  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
39  * DISCLAIMED. IN NO EVENT SHALL DMITRY SKAVISH OR THE OTHER
40  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
41  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
42  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
43  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
44  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
45  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
46  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
47  * SUCH DAMAGE.
48  *
49  */

50
51 package org.openlaszlo.iv.flash.xml;
52
53 import org.openlaszlo.iv.flash.context.*;
54
55 import org.openlaszlo.iv.flash.util.*;
56
57 import javax.xml.parsers.*;
58 import java.lang.reflect.*;
59 import org.w3c.dom.Node JavaDoc;
60
61 /**
62  * XML Factory
63  *
64  * @author Dmitry Skavish
65  */

66 public abstract class XMLFactory {
67
68     private static XMLFactory instance;
69
70     /**
71      * Returns implementation specific DocumentBuilder
72      *
73      * @return implementation specific DocumentBuilder
74      * @exception ParserConfigurationException
75      */

76     public abstract DocumentBuilder getDocumentBuilder() throws ParserConfigurationException;
77
78     /**
79      * Creates new implementation specific XMLContext
80      *
81      * @param parent parent context
82      * @param node node representing the created context
83      * @return implementation specific XMLContext
84      */

85     public abstract XMLContext newXMLContext( Context parent, Node JavaDoc node );
86
87     /**
88      * Returns implementation specific XPathProcessor
89      *
90      * @return implementation specific XPathProcessor
91      */

92     public abstract XPathProcessor getXPathProcessor();
93
94     /**
95      * Returns implementation specific instance of XMLFactory
96      *
97      * @return implementation specific instance of XMLFactory
98      */

99     public static XMLFactory getFactory() {
100         return instance;
101     }
102
103     static {
104         DocumentBuilderFactory docFactory = null;
105
106         String JavaDoc factoryName = PropertyManager.getProperty("javax.xml.parsers.DocumentBuilderFactory", null);
107         if( factoryName != null ) {
108             try {
109                 Class JavaDoc clazz = Class.forName(factoryName);
110                 docFactory = (DocumentBuilderFactory) clazz.newInstance();
111             } catch( Exception JavaDoc e ) {
112             }
113         }
114
115         if( docFactory == null ) {
116             try {
117                 docFactory = DocumentBuilderFactory.newInstance();
118             } catch( RuntimeException JavaDoc e ) {
119             }
120             if (docFactory == null) {
121                 try {
122                     Class JavaDoc clazz = Class.forName("org.openlaszlo.iv.flash.xml.apache.DocumentBuilderFactoryImpl");
123                     docFactory = (DocumentBuilderFactory) clazz.newInstance();
124                 } catch( Exception JavaDoc e ) {
125                     Log.logRB(e);
126                 }
127             }
128         }
129
130         if (docFactory != null) {
131
132             String JavaDoc name = docFactory.getClass().getName();
133             if( name.startsWith("org.apache.xerces") ) {
134                 // change default apache factory with ours, because default one very strict to errors
135
try {
136                     Class JavaDoc clazz = Class.forName("org.openlaszlo.iv.flash.xml.apache.DocumentBuilderFactoryImpl");
137                     DocumentBuilderFactory docFactory2 = (DocumentBuilderFactory) clazz.newInstance();
138                     docFactory = docFactory2;
139                     name = docFactory.getClass().getName();
140                 } catch( Exception JavaDoc e ) {
141                 }
142             }
143
144             docFactory.setExpandEntityReferences(false);
145             docFactory.setIgnoringComments(true);
146             docFactory.setNamespaceAware(true);
147             docFactory.setValidating(false);
148
149             // Use XML factory if specified
150
String JavaDoc xmlFactoryName = PropertyManager.getProperty("org.openlaszlo.iv.flash.XMLFactory", null);
151             if (xmlFactoryName != null) {
152                 try {
153                     instance = constructFactory(xmlFactoryName, docFactory);
154                 } catch( Exception JavaDoc e ) {
155                     Log.logRB(e);
156                 }
157             }
158             // Otherwise find a factory to match the DocumentBuilderFactory
159
else if( name.startsWith("org.openlaszlo.iv.flash.xml.apache.") ) {
160                 try {
161                     instance = constructFactory("org.openlaszlo.iv.flash.xml.apache.XMLFactoryImpl", docFactory);
162                 } catch( Exception JavaDoc e ) {
163                     Log.logRB(e);
164                 }
165             } else if( name.startsWith("com.caucho.") ) {
166                 // instance = new org.openlaszlo.iv.flash.xml.caucho.XMLFactoryImpl(docFactory);
167
try {
168                     instance = constructFactory("org.openlaszlo.iv.flash.xml.caucho.XMLFactoryImpl", docFactory);
169                 } catch( Exception JavaDoc e ) {
170                     Log.logRB(e);
171                 }
172             } else {
173                 instance = new org.openlaszlo.iv.flash.xml.generic.XMLFactoryImpl(docFactory);
174             }
175         }
176     }
177
178     private static XMLFactory constructFactory(String JavaDoc factoryName, DocumentBuilderFactory docFactory) throws Exception JavaDoc {
179         Class JavaDoc factory = Class.forName(factoryName);
180         Constructor constr = factory.getConstructor(new Class JavaDoc[] {DocumentBuilderFactory.class});
181         return (XMLFactory) constr.newInstance(new Object JavaDoc[] {docFactory});
182     }
183 }
184
185
186
Popular Tags