package org.exolab.castor.xml.parsing;
import org.exolab.castor.xml.UnmarshalHandler;
/**
* A helper class for {@link UnmarshalHandler}.
*
* Keeps track if elements, which appear in XML but for which there is no
* mapping, should be allowed.
*
* @author <a href="mailto:philipp DOT erlacher AT gmail DOT com">Philipp
* Erlacher</a>
*
* @since 1.3.2
*/
public class StrictElementHandler {
/**
* A boolean that indicates element processing should be strict and an error
* should be flagged if any extra elements exist.
**/
private boolean _strictElements = true;
/**
* A depth counter that increases as we skip elements ( in startElement )
* and decreases as we process and endElement. Only active if _strictElements is
* set.
*/
private int _ignoreElementDepth = 0;
/**
* Sets whether or not elements that do not match a specific field should
* simply be ignored or reported as an error. By default, extra elements
* are ignored.
*
* @param ignoreExtraElems
* a boolean that when true will allow non-matched attributes to
* simply be ignored.
**/
public void setIgnoreExtraElements(boolean ignoreExtraElems) {
_strictElements = (!ignoreExtraElems);
}
/**
* Checks if extra elements will be ignored.
*
* @return true if we ignore extra elements, false otherwise
*/
public boolean areElementsIgnorable() {
return !_strictElements;
}
/**
* Skip element that appear in XML but for which we have no mapping
*
* @return
*/
public boolean skipElement() {
return _ignoreElementDepth > 0;
}
/**
* Checks if a start element can be skipped
*
* @return true if start element can be skipped, false otherwise
*/
public boolean skipStartElement() {
if (areElementsIgnorable() && skipElement()) {
addIgnorableElement();
return true;
}
return false;
}
/**
* Checks if an end element can be skipped.
*
* @return true if end element can be skipped, false otherwise
*/
public boolean skipEndElement() {
if (skipElement()) {
remIgnorableElement();
return true;
}
return false;
}
/**
* Decreases the depth counter for elements which should be skipped.
*/
private void remIgnorableElement() {
--_ignoreElementDepth;
}
/**
* Increases the depth counter for elements for which we have no mapping.
*/
private void addIgnorableElement() {
++_ignoreElementDepth;
}
}