/* * Copyright (c) 2001-2004 World Wide Web Consortium, (Massachusetts Institute of * Technology, Institut National de Recherche en Informatique et en * Automatique, Keio University). All Rights Reserved. This program is * distributed under the W3C's Software Intellectual Property License. This * program is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See W3C License * http://www.w3.org/Consortium/Legal/ for more details. */ package org.w3c.domts; import java.lang.reflect.Method; import javax.xml.parsers.DocumentBuilderFactory; /** * This class is a strategy that provides the mapping from an abstract setting * (such as DocumentBuilderSetting.validating) to a specific DOM implementation * * @author Curt Arnold @date 2 Feb 2002 */ 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) throws DOMTestIncompatibleException; public abstract boolean hasSetting(DOMTestDocumentBuilderFactory factory); public static final DocumentBuilderSettingStrategy coalescing = new DocumentBuilderSettingStrategy() { public void applySetting(DocumentBuilderFactory factory, boolean value) throws DOMTestIncompatibleException { factory.setCoalescing(value); } public boolean hasSetting(DOMTestDocumentBuilderFactory factory) { return factory.isCoalescing(); } }; public static final DocumentBuilderSettingStrategy expandEntityReferences = new DocumentBuilderSettingStrategy() { public void applySetting(DocumentBuilderFactory factory, boolean value) throws DOMTestIncompatibleException { factory.setExpandEntityReferences(value); } public boolean hasSetting(DOMTestDocumentBuilderFactory factory) { return factory.isExpandEntityReferences(); } }; public static final DocumentBuilderSettingStrategy ignoringElementContentWhitespace = new DocumentBuilderSettingStrategy() { public void applySetting(DocumentBuilderFactory factory, boolean value) throws DOMTestIncompatibleException { factory.setIgnoringElementContentWhitespace(value); } public boolean hasSetting(DOMTestDocumentBuilderFactory factory) { return factory.isIgnoringElementContentWhitespace(); } }; public static final DocumentBuilderSettingStrategy ignoringComments = new DocumentBuilderSettingStrategy() { public void applySetting(DocumentBuilderFactory factory, boolean value) throws DOMTestIncompatibleException { if (value) { throw new DOMTestIncompatibleException( new Exception("ignoreComments=true not supported"), DocumentBuilderSetting.ignoringComments); } } public boolean hasSetting(DOMTestDocumentBuilderFactory factory) { return false; } }; public static final DocumentBuilderSettingStrategy namespaceAware = new DocumentBuilderSettingStrategy() { public void applySetting(DocumentBuilderFactory factory, boolean value) throws DOMTestIncompatibleException { factory.setNamespaceAware(value); } public boolean hasSetting(DOMTestDocumentBuilderFactory factory) { return factory.isNamespaceAware(); } }; public static final DocumentBuilderSettingStrategy validating = new DocumentBuilderSettingStrategy() { public void applySetting(DocumentBuilderFactory factory, boolean value) throws DOMTestIncompatibleException { factory.setValidating(value); } public boolean hasSetting(DOMTestDocumentBuilderFactory factory) { return factory.isValidating(); } }; public static final DocumentBuilderSettingStrategy signed = new DocumentBuilderSettingStrategy() { public void applySetting(DocumentBuilderFactory factory, boolean value) throws DOMTestIncompatibleException { if (!value) { throw new DOMTestIncompatibleException( null, DocumentBuilderSetting.notSigned); } } public boolean hasSetting(DOMTestDocumentBuilderFactory factory) { return true; } }; public static final DocumentBuilderSettingStrategy hasNullString = new DocumentBuilderSettingStrategy() { public void applySetting(DocumentBuilderFactory factory, boolean value) throws DOMTestIncompatibleException { if (!value) { throw new DOMTestIncompatibleException( null, DocumentBuilderSetting.notHasNullString); } } public boolean hasSetting(DOMTestDocumentBuilderFactory factory) { return true; } }; public static final DocumentBuilderSettingStrategy schemaValidating = new DocumentBuilderSettingStrategy() { public void applySetting(DocumentBuilderFactory factory, boolean value) throws DOMTestIncompatibleException { 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(DOMTestDocumentBuilderFactory 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; } }; }