/**
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/
package net.sourceforge.pmd.lang.xml;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import org.xml.sax.EntityResolver;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import net.sourceforge.pmd.Rule;
import net.sourceforge.pmd.lang.ParserOptions;
import net.sourceforge.pmd.lang.rule.properties.BooleanProperty;
import net.sourceforge.pmd.util.StringUtil;
public class XmlParserOptions extends ParserOptions {
// Note: The UI order values are chosen to be larger than those built into
// XPathRule.
public static final BooleanProperty COALESCING_DESCRIPTOR = new BooleanProperty("coalescing",
"Specifies that the XML parser convert CDATA nodes to Text nodes and append it to the adjacent (if any) text node.",
Boolean.FALSE, 3.0f);
public static final BooleanProperty EXPAND_ENTITY_REFERENCES_DESCRIPTOR = new BooleanProperty(
"expandEntityReferences", "Specifies that the XML parser expand entity reference nodes.", Boolean.TRUE,
4.0f);
public static final BooleanProperty IGNORING_COMMENTS_DESCRIPTOR = new BooleanProperty("ignoringComments",
"Specifies that the XML parser ignore comments.", Boolean.FALSE, 5.0f);
public static final BooleanProperty IGNORING_ELEMENT_CONTENT_WHITESPACE_DESCRIPTOR = new BooleanProperty(
"ignoringElementContentWhitespace",
"Specifies that the XML parser eliminate whitespace in element content. Setting this to 'true' will force validating.",
Boolean.FALSE, 6.0f);
public static final BooleanProperty NAMESPACE_AWARE_DESCRIPTOR = new BooleanProperty("namespaceAware",
"Specifies that the XML parser will provide support for XML namespaces.", Boolean.TRUE, 7.0f);
public static final BooleanProperty VALIDATING_DESCRIPTOR = new BooleanProperty("validating",
"Specifies that the XML parser will validate documents as they are parsed. This only works for DTDs.",
Boolean.FALSE, 8.0f);
public static final BooleanProperty XINCLUDE_AWARE_DESCRIPTOR = new BooleanProperty("xincludeAware",
"Specifies that the XML parser will process XInclude markup.", Boolean.FALSE, 9.0f);
public static final BooleanProperty LOOKUP_DESCRIPTOR_DTD = new BooleanProperty("xincludeAware",
"Specifies whether XML parser will attempt to lookup the DTD.", Boolean.FALSE, 10.0f);
public static final EntityResolver SILENT_ENTITY_RESOLVER = new EntityResolver() {
public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException {
return new InputSource(new ByteArrayInputStream("".getBytes()));
}
};
private boolean coalescing;
private boolean expandEntityReferences;
private boolean ignoringComments;
private boolean ignoringElementContentWhitespace;
private boolean namespaceAware;
private boolean validating;
private boolean xincludeAware;
private boolean lookupDescriptorDoc;
public XmlParserOptions() {
this.coalescing = COALESCING_DESCRIPTOR.defaultValue().booleanValue();
this.expandEntityReferences = EXPAND_ENTITY_REFERENCES_DESCRIPTOR.defaultValue().booleanValue();
this.ignoringComments = IGNORING_COMMENTS_DESCRIPTOR.defaultValue().booleanValue();
this.ignoringElementContentWhitespace = IGNORING_ELEMENT_CONTENT_WHITESPACE_DESCRIPTOR.defaultValue()
.booleanValue();
this.namespaceAware = NAMESPACE_AWARE_DESCRIPTOR.defaultValue().booleanValue();
this.validating = VALIDATING_DESCRIPTOR.defaultValue().booleanValue();
this.xincludeAware = XINCLUDE_AWARE_DESCRIPTOR.defaultValue().booleanValue();
this.lookupDescriptorDoc = LOOKUP_DESCRIPTOR_DTD.defaultValue().booleanValue();
}
public XmlParserOptions(Rule rule) {
this.coalescing = rule.getProperty(COALESCING_DESCRIPTOR);
this.expandEntityReferences = rule.getProperty(EXPAND_ENTITY_REFERENCES_DESCRIPTOR);
this.ignoringComments = rule.getProperty(IGNORING_COMMENTS_DESCRIPTOR);
this.ignoringElementContentWhitespace = rule.getProperty(IGNORING_ELEMENT_CONTENT_WHITESPACE_DESCRIPTOR);
this.namespaceAware = rule.getProperty(NAMESPACE_AWARE_DESCRIPTOR);
this.validating = rule.getProperty(VALIDATING_DESCRIPTOR);
this.xincludeAware = rule.getProperty(XINCLUDE_AWARE_DESCRIPTOR);
this.lookupDescriptorDoc = rule.getProperty(LOOKUP_DESCRIPTOR_DTD);
}
/**
*
* @return the configured entity resolver. If {@link #lookupDescriptorDoc}
* is false it would normally force the XML parser to use its own
* resolver
*/
public EntityResolver getEntityResolver() {
if (!lookupDescriptorDoc) {
return SILENT_ENTITY_RESOLVER;
} else {
return null;
}
}
public boolean isLookupDescriptorDoc() {
return lookupDescriptorDoc;
}
public void setLookupDescriptorDoc(boolean lookupDescriptorDoc) {
this.lookupDescriptorDoc = lookupDescriptorDoc;
}
public boolean isCoalescing() {
return this.coalescing;
}
public void setCoalescing(boolean coalescing) {
this.coalescing = coalescing;
}
public boolean isExpandEntityReferences() {
return this.expandEntityReferences;
}
public void setExpandEntityReferences(boolean expandEntityReferences) {
this.expandEntityReferences = expandEntityReferences;
}
public boolean isIgnoringComments() {
return this.ignoringComments;
}
public void setIgnoringComments(boolean ignoringComments) {
this.ignoringComments = ignoringComments;
}
public boolean isIgnoringElementContentWhitespace() {
return this.ignoringElementContentWhitespace;
}
public void setIgnoringElementContentWhitespace(boolean ignoringElementContentWhitespace) {
this.ignoringElementContentWhitespace = ignoringElementContentWhitespace;
}
public boolean isNamespaceAware() {
return this.namespaceAware;
}
public void setNamespaceAware(boolean namespaceAware) {
this.namespaceAware = namespaceAware;
}
public boolean isValidating() {
return this.validating;
}
public void setValidating(boolean validating) {
this.validating = validating;
}
public boolean isXincludeAware() {
return this.xincludeAware;
}
public void setXincludeAware(boolean xincludeAware) {
this.xincludeAware = xincludeAware;
}
@Override
public int hashCode() {
final int prime = 31;
int result = super.hashCode();
result = prime * result + (coalescing ? 1231 : 1237);
result = prime * result + (expandEntityReferences ? 1231 : 1237);
result = prime * result + (ignoringComments ? 1231 : 1237);
result = prime * result + (ignoringElementContentWhitespace ? 1231 : 1237);
result = prime * result + (namespaceAware ? 1231 : 1237);
result = prime * result + (validating ? 1231 : 1237);
result = prime * result + (xincludeAware ? 1231 : 1237);
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null || getClass() != obj.getClass()) {
return false;
}
final XmlParserOptions that = (XmlParserOptions) obj;
return StringUtil.isSame(this.suppressMarker, that.suppressMarker, false, false, false)
&& this.coalescing == that.coalescing && this.expandEntityReferences == that.expandEntityReferences
&& this.ignoringComments == that.ignoringComments
&& this.ignoringElementContentWhitespace == that.ignoringElementContentWhitespace
&& this.namespaceAware == that.namespaceAware && this.validating == that.validating
&& this.xincludeAware == that.xincludeAware;
}
}