| /* |
| * 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; |
| } |
| |
| }; |
| |
| } |