package tests.org.w3c.dom; import java.lang.reflect.Method; import javax.xml.parsers.DocumentBuilderFactory; public abstract class DocumentBuilderSettingStrategy { protected DocumentBuilderSettingStrategy() { } private static final String JAXP_SCHEMA_LANGUAGE = "http://java.sun.com/xml/jaxp/properties/schemaLanguage"; private static final String W3C_XML_SCHEMA = "http://www.w3.org/2001/XMLSchema"; public boolean hasConflict(DocumentBuilderSettingStrategy other) { return (other == this); } public abstract void applySetting(DocumentBuilderFactory factory, boolean value); public abstract boolean hasSetting(DOMDocumentBuilderFactory factory); public static final DocumentBuilderSettingStrategy coalescing = new DocumentBuilderSettingStrategy() { public void applySetting(DocumentBuilderFactory factory, boolean value) { factory.setCoalescing(value); } public boolean hasSetting(DOMDocumentBuilderFactory factory) { return factory.isCoalescing(); } }; public static final DocumentBuilderSettingStrategy expandEntityReferences = new DocumentBuilderSettingStrategy() { public void applySetting(DocumentBuilderFactory factory, boolean value) { factory.setExpandEntityReferences(value); } public boolean hasSetting(DOMDocumentBuilderFactory factory) { return factory.isExpandEntityReferences(); } }; public static final DocumentBuilderSettingStrategy ignoringElementContentWhitespace = new DocumentBuilderSettingStrategy() { public void applySetting(DocumentBuilderFactory factory, boolean value) { factory.setIgnoringElementContentWhitespace(value); } public boolean hasSetting(DOMDocumentBuilderFactory factory) { return factory.isIgnoringElementContentWhitespace(); } }; public static final DocumentBuilderSettingStrategy ignoringComments = new DocumentBuilderSettingStrategy() { public void applySetting(DocumentBuilderFactory factory, boolean value) { if (value) { System.out.println("ignoreComments=true not supported"); } } public boolean hasSetting(DOMDocumentBuilderFactory factory) { return false; } }; public static final DocumentBuilderSettingStrategy namespaceAware = new DocumentBuilderSettingStrategy() { public void applySetting(DocumentBuilderFactory factory, boolean value) { factory.setNamespaceAware(value); } public boolean hasSetting(DOMDocumentBuilderFactory factory) { return factory.isNamespaceAware(); } }; public static final DocumentBuilderSettingStrategy validating = new DocumentBuilderSettingStrategy() { public void applySetting(DocumentBuilderFactory factory, boolean value) { factory.setValidating(value); } public boolean hasSetting(DOMDocumentBuilderFactory factory) { return factory.isValidating(); } }; public static final DocumentBuilderSettingStrategy signed = new DocumentBuilderSettingStrategy() { public void applySetting(DocumentBuilderFactory factory, boolean value) { if (!value) { System.out.println("DocumentBuilderSetting.notSigned"); } } public boolean hasSetting(DOMDocumentBuilderFactory factory) { return true; } }; public static final DocumentBuilderSettingStrategy hasNullString = new DocumentBuilderSettingStrategy() { public void applySetting(DocumentBuilderFactory factory, boolean value) { if (!value) { System.out.println("DocumentBuilderSetting.notHasNullString"); } } public boolean hasSetting(DOMDocumentBuilderFactory factory) { return true; } }; public static final DocumentBuilderSettingStrategy schemaValidating = new DocumentBuilderSettingStrategy() { public void applySetting(DocumentBuilderFactory factory, boolean value) { if (value) { factory.setNamespaceAware(true); factory.setValidating(true); factory.setAttribute(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA); } else { factory.setAttribute(JAXP_SCHEMA_LANGUAGE, "http://www.w3.org/TR/REC-xml"); } } public boolean hasSetting(DOMDocumentBuilderFactory factory) { try { if (factory.isValidating()) { Method getAttrMethod = factory.getClass().getMethod( "getAttribute", new Class[] { String.class }); String val = (String) getAttrMethod.invoke(factory, new Object[] { JAXP_SCHEMA_LANGUAGE }); return W3C_XML_SCHEMA.equals(val); } } catch (Exception ex) { } return false; } // // schema validating conflicts with namespaceAware // and validating // public boolean hasConflict(DocumentBuilderSettingStrategy other) { if (other == this || other == DocumentBuilderSettingStrategy.namespaceAware || other == DocumentBuilderSettingStrategy.validating) { return true; } return false; } }; }