Clover coverage report - dom4j - 1.6.1
Coverage timestamp: ma mei 16 2005 14:23:01 GMT+01:00
file stats: LOC: 223   Methods: 8
NCLOC: 107   Classes: 1
 
 Source file Conditionals Statements Methods TOTAL
DatatypeDocumentFactory.java 45% 45,8% 87,5% 50%
coverage coverage
 1    /*
 2    * Copyright 2001-2005 (C) MetaStuff, Ltd. All Rights Reserved.
 3    *
 4    * This software is open source.
 5    * See the bottom of this file for the licence.
 6    */
 7   
 8    package org.dom4j.datatype;
 9   
 10    import org.dom4j.Attribute;
 11    import org.dom4j.Document;
 12    import org.dom4j.DocumentFactory;
 13    import org.dom4j.Element;
 14    import org.dom4j.Namespace;
 15    import org.dom4j.QName;
 16    import org.dom4j.io.SAXReader;
 17   
 18    import org.xml.sax.EntityResolver;
 19    import org.xml.sax.InputSource;
 20   
 21    /**
 22    * <p>
 23    * <code>DatatypeDocumentFactory</code> is a factory of XML objects which
 24    * support the <a href="http://www.w3.org/TR/xmlschema-2/">XML Schema Data Types
 25    * </a> specification.
 26    * </p>
 27    *
 28    * @author <a href="mailto:jstrachan@apache.org">James Strachan </a>
 29    * @version $Revision: 1.9 $
 30    */
 31    public class DatatypeDocumentFactory extends DocumentFactory {
 32    // XXXX: I don't think interning of QNames is necessary
 33    private static final boolean DO_INTERN_QNAME = false;
 34   
 35    /** The Singleton instance */
 36    protected static transient DatatypeDocumentFactory singleton
 37    = new DatatypeDocumentFactory();
 38   
 39    private static final Namespace XSI_NAMESPACE = Namespace.get("xsi",
 40    "http://www.w3.org/2001/XMLSchema-instance");
 41   
 42    private static final QName XSI_SCHEMA_LOCATION = QName.get(
 43    "schemaLocation", XSI_NAMESPACE);
 44   
 45    private static final QName XSI_NO_SCHEMA_LOCATION = QName.get(
 46    "noNamespaceSchemaLocation", XSI_NAMESPACE);
 47   
 48    /** The builder of XML Schemas */
 49    private SchemaParser schemaBuilder;
 50   
 51    /** reader of XML Schemas */
 52    private SAXReader xmlSchemaReader = new SAXReader();
 53   
 54    /** If schemas are automatically loaded when parsing instance documents */
 55    private boolean autoLoadSchema = true;
 56   
 57  27 public DatatypeDocumentFactory() {
 58  27 schemaBuilder = new SchemaParser(this);
 59    }
 60   
 61    /**
 62    * <p>
 63    * Access to the singleton instance of this factory.
 64    * </p>
 65    *
 66    * @return the default singleon instance
 67    */
 68  33 public static DocumentFactory getInstance() {
 69  33 return singleton;
 70    }
 71   
 72    /**
 73    * Loads the given XML Schema document into this factory so schema-aware
 74    * Document, Elements and Attributes will be created by this factory.
 75    *
 76    * @param schemaDocument
 77    * is an XML Schema Document instance.
 78    */
 79  22 public void loadSchema(Document schemaDocument) {
 80  22 schemaBuilder.build(schemaDocument);
 81    }
 82   
 83  3 public void loadSchema(Document schemaDocument, Namespace targetNamespace) {
 84  3 schemaBuilder.build(schemaDocument, targetNamespace);
 85    }
 86   
 87    /**
 88    * Registers the given <code>DatatypeElementFactory</code> for the given
 89    * &lt;element&gt; schema element
 90    *
 91    * @param elementQName
 92    * DOCUMENT ME!
 93    *
 94    * @return DOCUMENT ME!
 95    */
 96  408 public DatatypeElementFactory getElementFactory(QName elementQName) {
 97  408 DatatypeElementFactory result = null;
 98   
 99  408 if (DO_INTERN_QNAME) {
 100  0 elementQName = intern(elementQName);
 101    }
 102   
 103  408 DocumentFactory factory = elementQName.getDocumentFactory();
 104  408 if (factory instanceof DatatypeElementFactory) {
 105  5 result = (DatatypeElementFactory) factory;
 106    }
 107   
 108  408 return result;
 109    }
 110   
 111    // DocumentFactory methods
 112    // -------------------------------------------------------------------------
 113  450 public Attribute createAttribute(Element owner, QName qname, String value) {
 114  450 if (autoLoadSchema && qname.equals(XSI_NO_SCHEMA_LOCATION)) {
 115  2 Document document = (owner != null) ? owner.getDocument() : null;
 116  2 loadSchema(document, value);
 117  448 } else if (autoLoadSchema && qname.equals(XSI_SCHEMA_LOCATION)) {
 118  0 Document document = (owner != null) ? owner.getDocument() : null;
 119  0 String uri = value.substring(0, value.indexOf(' '));
 120  0 Namespace namespace = owner.getNamespaceForURI(uri);
 121  0 loadSchema(document, value.substring(value.indexOf(' ') + 1),
 122    namespace);
 123    }
 124   
 125  450 return super.createAttribute(owner, qname, value);
 126    }
 127   
 128    // Implementation methods
 129    // -------------------------------------------------------------------------
 130  2 protected void loadSchema(Document document, String schemaInstanceURI) {
 131  2 try {
 132  2 EntityResolver resolver = document.getEntityResolver();
 133   
 134  2 if (resolver == null) {
 135  0 String msg = "No EntityResolver available for resolving URI: ";
 136  0 throw new InvalidSchemaException(msg + schemaInstanceURI);
 137    }
 138   
 139  2 InputSource inputSource = resolver.resolveEntity(null,
 140    schemaInstanceURI);
 141   
 142  2 if (resolver == null) {
 143  0 throw new InvalidSchemaException("Could not resolve the URI: "
 144    + schemaInstanceURI);
 145    }
 146   
 147  2 Document schemaDocument = xmlSchemaReader.read(inputSource);
 148  2 loadSchema(schemaDocument);
 149    } catch (Exception e) {
 150  0 System.out.println("Failed to load schema: " + schemaInstanceURI);
 151  0 System.out.println("Caught: " + e);
 152  0 e.printStackTrace();
 153  0 throw new InvalidSchemaException("Failed to load schema: "
 154    + schemaInstanceURI);
 155    }
 156    }
 157   
 158  0 protected void loadSchema(Document document, String schemaInstanceURI,
 159    Namespace namespace) {
 160  0 try {
 161  0 EntityResolver resolver = document.getEntityResolver();
 162   
 163  0 if (resolver == null) {
 164  0 String msg = "No EntityResolver available for resolving URI: ";
 165  0 throw new InvalidSchemaException(msg + schemaInstanceURI);
 166    }
 167   
 168  0 InputSource inputSource = resolver.resolveEntity(null,
 169    schemaInstanceURI);
 170   
 171  0 if (resolver == null) {
 172  0 throw new InvalidSchemaException("Could not resolve the URI: "
 173    + schemaInstanceURI);
 174    }
 175   
 176  0 Document schemaDocument = xmlSchemaReader.read(inputSource);
 177  0 loadSchema(schemaDocument, namespace);
 178    } catch (Exception e) {
 179  0 System.out.println("Failed to load schema: " + schemaInstanceURI);
 180  0 System.out.println("Caught: " + e);
 181  0 e.printStackTrace();
 182  0 throw new InvalidSchemaException("Failed to load schema: "
 183    + schemaInstanceURI);
 184    }
 185    }
 186    }
 187   
 188    /*
 189    * Redistribution and use of this software and associated documentation
 190    * ("Software"), with or without modification, are permitted provided that the
 191    * following conditions are met:
 192    *
 193    * 1. Redistributions of source code must retain copyright statements and
 194    * notices. Redistributions must also contain a copy of this document.
 195    *
 196    * 2. Redistributions in binary form must reproduce the above copyright notice,
 197    * this list of conditions and the following disclaimer in the documentation
 198    * and/or other materials provided with the distribution.
 199    *
 200    * 3. The name "DOM4J" must not be used to endorse or promote products derived
 201    * from this Software without prior written permission of MetaStuff, Ltd. For
 202    * written permission, please contact dom4j-info@metastuff.com.
 203    *
 204    * 4. Products derived from this Software may not be called "DOM4J" nor may
 205    * "DOM4J" appear in their names without prior written permission of MetaStuff,
 206    * Ltd. DOM4J is a registered trademark of MetaStuff, Ltd.
 207    *
 208    * 5. Due credit should be given to the DOM4J Project - http://www.dom4j.org
 209    *
 210    * THIS SOFTWARE IS PROVIDED BY METASTUFF, LTD. AND CONTRIBUTORS ``AS IS'' AND
 211    * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 212    * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 213    * ARE DISCLAIMED. IN NO EVENT SHALL METASTUFF, LTD. OR ITS CONTRIBUTORS BE
 214    * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 215    * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 216    * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 217    * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 218    * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 219    * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 220    * POSSIBILITY OF SUCH DAMAGE.
 221    *
 222    * Copyright 2001-2005 (C) MetaStuff, Ltd. All Rights Reserved.
 223    */