All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.xmlpull.infoset.ext.XmlQNameAttribute Maven / Gradle / Ivy

Go to download

XML Pull parser library developed by Extreme Computing Lab, Indian University

There is a newer version: 1.2.8
Show newest version
/* -*- mode: Java; c-basic-offset: 4; indent-tabs-mode: nil; -*-  //------100-columns-wide------>|*/
/*
 * Copyright (c) 2004-2005 Extreme! Lab, Indiana University. All rights reserved.
 *
 * This software is open source. See the bottom of this file for the licence.
 *
 * $Id: XmlQNameAttribute.java,v 1.3 2006/05/02 01:38:04 aslom Exp $
 */
package org.xmlpull.infoset.ext;

import javax.xml.namespace.QName;
import org.xmlpull.infoset.XmlAttribute;
import org.xmlpull.infoset.XmlBuilderException;
import org.xmlpull.infoset.XmlElement;
import org.xmlpull.infoset.XmlNamespace;
import org.xmlpull.infoset.impl.XmlAttributeImpl;

//DONE: move to XPP5 package so it can be shared between XSUL5 and GPEL and not duplicated ...

/**
 * Implementation of an attribute that keeps QName as value
 * (to resolve namespace prefix it must be bound to owner element).
 * */
public class XmlQNameAttribute extends XmlAttributeImpl {
    private QName qnameAttrValue_;
    private boolean isValueCached;
    private String cachedValue;

    //NOTE: this is *not* used by XmlElementImpl
    public Object clone() throws CloneNotSupportedException {
        XmlQNameAttribute cloned = (XmlQNameAttribute) super.clone();
        cloned.qnameAttrValue_ = qnameAttrValue_;
        return cloned;
    }

    public XmlQNameAttribute(XmlElement owner, XmlNamespace namespace,
                             String name, QName qnameAttrValue) {
        // gotta to love Java ctors ...
        super(owner, namespace, name, "");
        //            owner.lookupNamespaceByPrefix(
        //                qnameAttrValue.getPrefix()).getPrefix()
        //                + ':'
        //                + qnameAttrValue.getLocalPart());
        //qnameAttrValue.getPrefix() + ':' + qnameAttrValue.getLocalPart()
        this.qnameAttrValue_ = qnameAttrValue;
    }

    //COPY constructor
    public XmlQNameAttribute(XmlElement owner, XmlAttribute attr) {
        super(owner,
              attr.getType(), attr.getNamespace(), attr.getName(), attr.getValue(),
              attr.isSpecified());
        if (owner == null) throw new IllegalArgumentException();
        if (attr.getOwner() != null && owner != attr.getOwner()) throw new IllegalArgumentException("owner");
        // convert value into qname
        String value = attr.getValue();
        int colonPos = value.lastIndexOf(':');
        String localPart = value.substring(colonPos + 1); //OK even if colonPos == -1
        String prefix;
        if (colonPos != -1) {
            prefix = value.substring(0, colonPos);
        } else {
            prefix = "";
        }
        XmlNamespace ns = owner.lookupNamespaceByPrefix(prefix);
        if (ns == null) {
            throw new XmlBuilderException("could not find namespace with prefix " + prefix
                                          + " for attribute " + attr + " in " + owner);
        }
        qnameAttrValue_ = new QName(ns.getName(), localPart, prefix);
    }

    //    public String getValue() {
    //        return qnameAttrValue_.getLocalPart() + ':' + qnameAttrValue_.getLocalPart();
    //    }

    public QName getValueAsQName() {
        return qnameAttrValue_;
    }

    public String getValue() {
        if (!isValueCached) {
            String prefix = qnameAttrValue_.getPrefix();
            String uri = qnameAttrValue_.getNamespaceURI();
            XmlElement owner = getOwner();
            XmlNamespace ns = null;
            // check that prefix in Qname corresponds ot the same namespace in XmlElement context
            if (prefix != null && prefix.length() > 0) { //by defaul QName sets prefix to "" -- bad!
                ns = owner.lookupNamespaceByPrefix(prefix);
                if (ns == null) {
                    throw new XmlBuilderException(
                        "can not get namespace for prefix '" + prefix + "' for Qname attribute "
                        + " '" + getName() + "' with value " + qnameAttrValue_
                        + " in element {" + owner.getNamespaceName() + "}" + owner.getName());
                }
                if (ns.getName().equals(uri)) {
                    ns = null;
                }
            }
            if (ns == null) {
                // second try -- ignore whatever prefix was in QName passed by user ..
                ns = getOwner().lookupNamespaceByName(uri);
                if (ns != null) {
                    prefix = ns.getPrefix();
                } else {
                    prefix = null;
                }
                if (prefix == null) {
                    // need to delcare namespace
                    int i = 1;
                    while (true) {
                        prefix = "n" + (i++);
                        ns = getOwner().lookupNamespaceByPrefix(prefix);
                        if (ns == null) {
                            ns = getOwner().declareNamespace(prefix, uri);
                            break;
                        }
                    }
                    prefix = ns.getPrefix();
                }
            }
            assert prefix != null; //lot of ado about (amost) nothing
            if (prefix.length() > 0) {
                cachedValue = prefix + ':' + qnameAttrValue_.getLocalPart();
            } else {
                cachedValue =  qnameAttrValue_.getLocalPart();
            }

        }
        return cachedValue;
    }


}

/*
* Indiana University Extreme! Lab Software License, Version 1.2
*
* Copyright (c) 2004-2005 The Trustees of Indiana University.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* 1) All redistributions of source code must retain the above
*    copyright notice, the list of authors in the original source
*    code, this list of conditions and the disclaimer listed in this
*    license;
*
* 2) All redistributions in binary form must reproduce the above
*    copyright notice, this list of conditions and the disclaimer
*    listed in this license in the documentation and/or other
*    materials provided with the distribution;
*
* 3) Any documentation included with all redistributions must include
*    the following acknowledgement:
*
*      "This product includes software developed by the Indiana
*      University Extreme! Lab.  For further information please visit
*      http://www.extreme.indiana.edu/"
*
*    Alternatively, this acknowledgment may appear in the software
*    itself, and wherever such third-party acknowledgments normally
*    appear.
*
* 4) The name "Indiana University" or "Indiana University
*    Extreme! Lab" shall not be used to endorse or promote
*    products derived from this software without prior written
*    permission from Indiana University.  For written permission,
*    please contact http://www.extreme.indiana.edu/.
*
* 5) Products derived from this software may not use "Indiana
*    University" name nor may "Indiana University" appear in their name,
*    without prior written permission of the Indiana University.
*
* Indiana University provides no reassurances that the source code
* provided does not infringe the patent or any other intellectual
* property rights of any other entity.  Indiana University disclaims any
* liability to any recipient for claims brought by any other entity
* based on infringement of intellectual property rights or otherwise.
*
* LICENSEE UNDERSTANDS THAT SOFTWARE IS PROVIDED "AS IS" FOR WHICH
* NO WARRANTIES AS TO CAPABILITIES OR ACCURACY ARE MADE. INDIANA
* UNIVERSITY GIVES NO WARRANTIES AND MAKES NO REPRESENTATION THAT
* SOFTWARE IS FREE OF INFRINGEMENT OF THIRD PARTY PATENT, COPYRIGHT, OR
* OTHER PROPRIETARY RIGHTS.  INDIANA UNIVERSITY MAKES NO WARRANTIES THAT
* SOFTWARE IS FREE FROM "BUGS", "VIRUSES", "TROJAN HORSES", "TRAP
* DOORS", "WORMS", OR OTHER HARMFUL CODE.  LICENSEE ASSUMES THE ENTIRE
* RISK AS TO THE PERFORMANCE OF SOFTWARE AND/OR ASSOCIATED MATERIALS,
* AND TO THE PERFORMANCE AND VALIDITY OF INFORMATION GENERATED USING
* SOFTWARE.
*/




© 2015 - 2024 Weber Informatics LLC | Privacy Policy