/*
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software
* Foundation.
*
* You should have received a copy of the GNU Lesser General Public License along with this
* program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
* or from the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* 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 the GNU Lesser General Public License for more details.
*
* Copyright (c) 2001 - 2013 Object Refinery Ltd, Pentaho Corporation and Contributors.. All rights reserved.
*/
package org.pentaho.reporting.libraries.xmlns.parser;
import org.xml.sax.Attributes;
/**
* A SAX-Attributes implementation that fixes missing namespace-URIs. Attributes that define no namespace URIs on their
* own will receive the defined default namespace.
*
* @author Thomas Morgner
*/
public class FixNamespaceUriAttributes implements Attributes {
private Attributes attributes;
private String defaultNSUri;
/**
* Creates a new FixNamespaceUriAttributes wrapper.
*
* @param defaultNSUri the default namespace that is used if no explicit namespace is defined for an attribute.
* @param attributes the original attributes.
*/
public FixNamespaceUriAttributes( final String defaultNSUri,
final Attributes attributes ) {
this.attributes = attributes;
this.defaultNSUri = defaultNSUri;
}
/**
* Return the number of attributes in the list. <p/> <p>Once you know the number of attributes, you can iterate
* through the list.</p>
*
* @return The number of attributes in the list.
* @see #getURI(int)
* @see #getLocalName(int)
* @see #getQName(int)
* @see #getType(int)
* @see #getValue(int)
*/
public int getLength() {
return attributes.getLength();
}
/**
* Look up an attribute's Namespace URI by index.
*
* @param index The attribute index (zero-based).
* @return The Namespace URI, or the empty string if none is available, or null if the index is out of range.
* @see #getLength
*/
public String getURI( final int index ) {
final String uri = attributes.getURI( index );
if ( uri == null || "".equals( uri ) ) {
return defaultNSUri;
}
return uri;
}
/**
* Look up an attribute's local name by index.
*
* @param index The attribute index (zero-based).
* @return The local name, or the empty string if Namespace processing is not being performed, or null if the index is
* out of range.
* @see #getLength
*/
public String getLocalName( final int index ) {
final String name = attributes.getLocalName( index );
if ( name == null || "".equals( name ) ) {
return attributes.getQName( index );
}
return name;
}
/**
* Look up an attribute's XML qualified (prefixed) name by index.
*
* @param index The attribute index (zero-based).
* @return The XML qualified name, or the empty string if none is available, or null if the index is out of range.
* @see #getLength
*/
public String getQName( final int index ) {
return attributes.getQName( index );
}
/**
* Look up an attribute's type by index. <p/> <p>The attribute type is one of the strings "CDATA", "ID", "IDREF",
* "IDREFS", "NMTOKEN", "NMTOKENS", "ENTITY", "ENTITIES", or "NOTATION" (always in upper case).</p> <p/> <p>If the
* parser has not read a declaration for the attribute, or if the parser does not report attribute types, then it must
* return the value "CDATA" as stated in the XML 1.0 Recommendation (clause 3.3.3, "Attribute-Value
* Normalization").</p> <p/> <p>For an enumerated attribute that is not a notation, the parser will report the type as
* "NMTOKEN".</p>
*
* @param index The attribute index (zero-based).
* @return The attribute's type as a string, or null if the index is out of range.
* @see #getLength
*/
public String getType( final int index ) {
return attributes.getType( index );
}
/**
* Look up an attribute's value by index. <p/> <p>If the attribute value is a list of tokens (IDREFS, ENTITIES, or
* NMTOKENS), the tokens will be concatenated into a single string with each token separated by a single space.</p>
*
* @param index The attribute index (zero-based).
* @return The attribute's value as a string, or null if the index is out of range.
* @see #getLength
*/
public String getValue( final int index ) {
return attributes.getValue( index );
}
/**
* Look up the index of an attribute by Namespace name.
*
* @param uri The Namespace URI, or the empty string if the name has no Namespace URI.
* @param localName The attribute's local name.
* @return The index of the attribute, or -1 if it does not appear in the list.
*/
public int getIndex( final String uri, final String localName ) {
final int idx = attributes.getIndex( uri, localName );
if ( idx >= 0 ) {
return idx;
}
if ( defaultNSUri.equals( uri ) ) {
final int index = attributes.getIndex( "", localName );
if ( index != -1 ) {
return index;
}
try {
final int value2 = attributes.getIndex( null, localName );
if ( value2 != -1 ) {
return value2;
}
} catch ( Exception e ) {
// ignore. Heck, Xerces breaks the SAX-Specs so we have to take weird steps to mess around their mess.
}
return attributes.getIndex( localName );
}
return -1;
}
/**
* Look up the index of an attribute by XML qualified (prefixed) name.
*
* @param qName The qualified (prefixed) name.
* @return The index of the attribute, or -1 if it does not appear in the list.
*/
public int getIndex( final String qName ) {
return attributes.getIndex( qName );
}
/**
* Look up an attribute's type by Namespace name. <p/> <p>See {@link #getType(int) getType(int)} for a description of
* the possible types.</p>
*
* @param uri The Namespace URI, or the empty String if the name has no Namespace URI.
* @param localName The local name of the attribute.
* @return The attribute type as a string, or null if the attribute is not in the list or if Namespace processing is
* not being performed.
*/
public String getType( final String uri, final String localName ) {
final String type = attributes.getType( uri, localName );
if ( type != null ) {
return type;
}
if ( defaultNSUri.equals( uri ) ) {
final String type1 = attributes.getType( "", localName );
if ( type1 != null ) {
return type1;
}
try {
final String value2 = attributes.getType( null, localName );
if ( value2 != null ) {
return value2;
}
} catch ( Exception e ) {
// ignore. Heck, Xerces breaks the SAX-Specs so we have to take weird steps to mess around their mess.
}
return attributes.getType( localName );
}
return null;
}
/**
* Look up an attribute's type by XML qualified (prefixed) name. <p/> <p>See {@link #getType(int) getType(int)} for a
* description of the possible types.</p>
*
* @param qName The XML qualified name.
* @return The attribute type as a string, or null if the attribute is not in the list or if qualified names are not
* available.
*/
public String getType( final String qName ) {
return attributes.getType( qName );
}
/**
* Look up an attribute's value by Namespace name. <p/> <p>See {@link #getValue(int) getValue(int)} for a description
* of the possible values.</p>
*
* @param uri The Namespace URI, or the empty String if the name has no Namespace URI.
* @param localName The local name of the attribute.
* @return The attribute value as a string, or null if the attribute is not in the list.
*/
public String getValue( final String uri, final String localName ) {
final String value = attributes.getValue( uri, localName );
if ( value != null ) {
return value;
}
if ( defaultNSUri.equals( uri ) ) {
final String value1 = attributes.getValue( "", localName );
if ( value1 != null ) {
return value1;
}
try {
final String value2 = attributes.getValue( null, localName );
if ( value2 != null ) {
return value2;
}
} catch ( Exception e ) {
// ignore. Heck, Xerces breaks the SAX-Specs so we have to take weird steps to mess around their mess.
}
return attributes.getValue( localName );
}
return null;
}
/**
* Look up an attribute's value by XML qualified (prefixed) name. <p/> <p>See {@link #getValue(int) getValue(int)} for
* a description of the possible values.</p>
*
* @param qName The XML qualified name.
* @return The attribute value as a string, or null if the attribute is not in the list or if qualified names are not
* available.
*/
public String getValue( final String qName ) {
return attributes.getValue( qName );
}
}