Home | History | Annotate | Download | only in dom
      1 package tests.org.w3c.dom;
      2 
      3 import java.lang.reflect.Method;
      4 
      5 import javax.xml.parsers.DocumentBuilderFactory;
      6 
      7 public abstract class DocumentBuilderSettingStrategy {
      8     protected DocumentBuilderSettingStrategy() {
      9     }
     10 
     11     private static final String JAXP_SCHEMA_LANGUAGE = "http://java.sun.com/xml/jaxp/properties/schemaLanguage";
     12 
     13     private static final String W3C_XML_SCHEMA = "http://www.w3.org/2001/XMLSchema";
     14 
     15     public boolean hasConflict(DocumentBuilderSettingStrategy other) {
     16         return (other == this);
     17     }
     18 
     19     public abstract void applySetting(DocumentBuilderFactory factory,
     20             boolean value);
     21 
     22     public abstract boolean hasSetting(DOMDocumentBuilderFactory factory);
     23 
     24     public static final DocumentBuilderSettingStrategy coalescing = new DocumentBuilderSettingStrategy() {
     25         public void applySetting(DocumentBuilderFactory factory,
     26                 boolean value) {
     27             factory.setCoalescing(value);
     28         }
     29 
     30         public boolean hasSetting(DOMDocumentBuilderFactory factory) {
     31             return factory.isCoalescing();
     32         }
     33 
     34     };
     35 
     36     public static final DocumentBuilderSettingStrategy expandEntityReferences = new DocumentBuilderSettingStrategy() {
     37         public void applySetting(DocumentBuilderFactory factory, boolean value) {
     38             factory.setExpandEntityReferences(value);
     39         }
     40 
     41         public boolean hasSetting(DOMDocumentBuilderFactory factory) {
     42             return factory.isExpandEntityReferences();
     43         }
     44     };
     45 
     46     public static final DocumentBuilderSettingStrategy ignoringElementContentWhitespace = new DocumentBuilderSettingStrategy() {
     47         public void applySetting(DocumentBuilderFactory factory, boolean value) {
     48             factory.setIgnoringElementContentWhitespace(value);
     49         }
     50 
     51         public boolean hasSetting(DOMDocumentBuilderFactory factory) {
     52             return factory.isIgnoringElementContentWhitespace();
     53         }
     54     };
     55 
     56     public static final DocumentBuilderSettingStrategy ignoringComments = new DocumentBuilderSettingStrategy() {
     57         public void applySetting(DocumentBuilderFactory factory, boolean value) {
     58             if (value) {
     59                 System.out.println("ignoreComments=true not supported");
     60             }
     61         }
     62 
     63         public boolean hasSetting(DOMDocumentBuilderFactory factory) {
     64             return false;
     65         }
     66     };
     67 
     68     public static final DocumentBuilderSettingStrategy namespaceAware = new DocumentBuilderSettingStrategy() {
     69         public void applySetting(DocumentBuilderFactory factory, boolean value)
     70                 {
     71             factory.setNamespaceAware(value);
     72         }
     73 
     74         public boolean hasSetting(DOMDocumentBuilderFactory factory) {
     75             return factory.isNamespaceAware();
     76         }
     77     };
     78 
     79     public static final DocumentBuilderSettingStrategy validating = new DocumentBuilderSettingStrategy() {
     80         public void applySetting(DocumentBuilderFactory factory, boolean value)
     81                 {
     82             factory.setValidating(value);
     83         }
     84 
     85         public boolean hasSetting(DOMDocumentBuilderFactory factory) {
     86             return factory.isValidating();
     87         }
     88     };
     89 
     90     public static final DocumentBuilderSettingStrategy signed = new DocumentBuilderSettingStrategy() {
     91         public void applySetting(DocumentBuilderFactory factory, boolean value)
     92                  {
     93             if (!value) {
     94                 System.out.println("DocumentBuilderSetting.notSigned");
     95             }
     96         }
     97 
     98         public boolean hasSetting(DOMDocumentBuilderFactory factory) {
     99             return true;
    100         }
    101     };
    102 
    103     public static final DocumentBuilderSettingStrategy hasNullString = new DocumentBuilderSettingStrategy() {
    104         public void applySetting(DocumentBuilderFactory factory, boolean value)
    105                  {
    106             if (!value) {
    107                 System.out.println("DocumentBuilderSetting.notHasNullString");
    108             }
    109         }
    110 
    111         public boolean hasSetting(DOMDocumentBuilderFactory factory) {
    112             return true;
    113         }
    114     };
    115 
    116     public static final DocumentBuilderSettingStrategy schemaValidating = new DocumentBuilderSettingStrategy() {
    117         public void applySetting(DocumentBuilderFactory factory, boolean value)
    118                  {
    119             if (value) {
    120                 factory.setNamespaceAware(true);
    121                 factory.setValidating(true);
    122                 factory.setAttribute(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA);
    123             } else {
    124                 factory.setAttribute(JAXP_SCHEMA_LANGUAGE,
    125                         "http://www.w3.org/TR/REC-xml");
    126             }
    127         }
    128 
    129         public boolean hasSetting(DOMDocumentBuilderFactory factory) {
    130             try {
    131                 if (factory.isValidating()) {
    132                     Method getAttrMethod = factory.getClass().getMethod(
    133                             "getAttribute", new Class[] { String.class });
    134                     String val = (String) getAttrMethod.invoke(factory,
    135                             new Object[] { JAXP_SCHEMA_LANGUAGE });
    136                     return W3C_XML_SCHEMA.equals(val);
    137                 }
    138             } catch (Exception ex) {
    139             }
    140             return false;
    141         }
    142 
    143         //
    144         // schema validating conflicts with namespaceAware
    145         // and validating
    146         //
    147         public boolean hasConflict(DocumentBuilderSettingStrategy other) {
    148             if (other == this
    149                     || other == DocumentBuilderSettingStrategy.namespaceAware
    150                     || other == DocumentBuilderSettingStrategy.validating) {
    151                 return true;
    152             }
    153             return false;
    154         }
    155 
    156     };
    157 
    158 }
    159