package com.fasterxml.aalto.impl; import java.util.*; import org.codehaus.stax2.XMLStreamProperties; /** * Base class for reader and writer-side configuration/context objects */ public abstract class CommonConfig { /* /********************************************************************** /* Implementation info /********************************************************************** */ protected final static String IMPL_NAME = "aalto"; /* !!! TBI: get from props file or so? Or build as part of Ant * build process? */ /** * This is "major.minor" version used for purposes of determining * the feature set. Patch level is not included, since those should * not affect API or feature set. Using applications should be * prepared to take additional levels, however, just not depend * on those being available. */ protected final static String IMPL_VERSION = "0.9"; /* /********************************************************************** /* Internal constants /********************************************************************** */ final static int PROP_IMPL_NAME = 1; final static int PROP_IMPL_VERSION = 2; final static int PROP_SUPPORTS_XML11 = 3; final static int PROP_SUPPORTS_XMLID = 4; /** * Map to use for converting from String property ids to enumeration * (ints). Used for faster dispatching. */ final static HashMap<String,Integer> sStdProperties = new HashMap<String,Integer>(16); static { // Basic information about the implementation: sStdProperties.put(XMLStreamProperties.XSP_IMPLEMENTATION_NAME, Integer.valueOf(PROP_IMPL_NAME)); sStdProperties.put(XMLStreamProperties.XSP_IMPLEMENTATION_VERSION, Integer.valueOf(PROP_IMPL_VERSION)); // XML version support: sStdProperties.put(XMLStreamProperties.XSP_SUPPORTS_XML11, Integer.valueOf(PROP_SUPPORTS_XML11)); // Xml:id support: sStdProperties.put(XMLStreamProperties.XSP_SUPPORT_XMLID, Integer.valueOf(PROP_SUPPORTS_XMLID)); /* 23-Apr-2008, tatus: Additional interoperability property, * one that Sun implementation uses. Can map tor Stax2 * property quite easily. */ sStdProperties.put("http://java.sun.com/xml/stream/properties/implementation-name", Integer.valueOf(PROP_IMPL_NAME)); } /** * Bitset for all on/off values for this configuration object. */ protected int _flags; /** * Bitset that indicates all explicit changes to on/off values; clear * bits indicate settings that are unmodified default values. */ protected int _flagMods; protected CommonConfig(int flags, int flagMods) { _flags = flags; _flagMods = flagMods; } /* /********************************************************************** /* Public API, generic StAX config methods /********************************************************************** */ /** * @param isMandatory If true, unrecognized property should * result in {@link IllegalArgumentException} */ public Object getProperty(String propName, boolean isMandatory) { Integer I = sStdProperties.get(propName); if (I != null) { switch (I.intValue()) { case PROP_IMPL_NAME: return IMPL_NAME; case PROP_IMPL_VERSION: return IMPL_VERSION; case PROP_SUPPORTS_XML11: // nope, not really return Boolean.FALSE; case PROP_SUPPORTS_XMLID: return Boolean.FALSE; } } if (isMandatory) { throw new IllegalArgumentException("Unrecognized property '"+propName+"'"); } return null; } public boolean isPropertySupported(String propName) { return sStdProperties.containsKey(propName); } /** * @return True, if the specified property was <b>succesfully</b> * set to specified value; false if its value was not changed */ public boolean setProperty(String propName, Object value) { Integer I = sStdProperties.get(propName); if (I != null) { // can't set any of std props return false; } throw new IllegalArgumentException("Unrecognized property '"+propName+"'"); } /* /********************************************************************** /* Public API beyond Stax2 /********************************************************************** */ /** * This method returns name of encoding that has been passed * explicitly to the reader or writer, from outside. An example * is that HTTP server may pass encoding as declared in HTTP * headers. This should either be null (if none passed), or the * same as actual encoding (which is determined from physical * stream contents [for readers], or from encoder * properties / configuration [for writers] * * @return Encoding that has been passed externally by the application */ public abstract String getExternalEncoding(); /** * @return Actual encoding in use, as determined by the processor. */ public abstract String getActualEncoding(); /** * @return True, if the processing will be done according to Xml 1.1 * rules; false if according to xml 1.0 */ public abstract boolean isXml11(); /* /********************************************************************** /* Helper methods for sub-classes /********************************************************************** */ protected final boolean hasFlag(int flagMask) { return (_flags & flagMask) != 0; } protected final boolean hasExplicitFlag(int flagMask) { return hasFlag(flagMask) && hasFlagBeenModified(flagMask); } protected final void setFlag(int flagMask, boolean state) { if (state) { _flags |= flagMask; } else { _flags &= ~flagMask; } _flagMods |= flagMask; } /** * Method for checking whether specific configuration flag * has been explicitly modified (set, clear; regardless of * whether state actually changed), or is it the default * value. * * @return False, if flag in question has its default value, * true if a call has been made that could have changed it. */ protected final boolean hasFlagBeenModified(int flagMask) { return (_flagMods & flagMask) != 0; } }