blob: e21a6a57f98a87e5edd81a437e1e9f241995a0b8 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2010 Andrea Bittau, University College London, and others
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Andrea Bittau - initial API and implementation from the PsychoPath XPath 2.0
* David Carver - bug 298535 - Attribute instance of improvements
* Mukul Gandhi - bug 280798 - PsychoPath support for JDK 1.4
*******************************************************************************/
package org.eclipse.wst.xml.xpath2.processor.internal.ast;
import org.apache.xerces.xs.AttributePSVI;
import org.apache.xerces.xs.ItemPSVI;
import org.apache.xerces.xs.XSTypeDefinition;
import org.eclipse.wst.xml.xpath2.processor.ResultSequence;
import org.eclipse.wst.xml.xpath2.processor.internal.types.AnyType;
import org.eclipse.wst.xml.xpath2.processor.internal.types.AttrType;
import org.eclipse.wst.xml.xpath2.processor.internal.types.NodeType;
import org.eclipse.wst.xml.xpath2.processor.internal.types.QName;
import org.w3c.dom.Attr;
import org.w3c.dom.Node;
/**
* Class used to match an attribute node by its name and/or type.
*/
public class AttributeTest extends AttrElemTest {
private AnyType anyType = null;
/**
* Constructor for AttributeTest. This one takes in 3 inputs, Name, wildcard
* test(true/false) and type.
*
* @param name
* QName.
* @param wild
* Wildcard test, True/False.
* @param type
* QName type.
*/
public AttributeTest(QName name, boolean wild, QName type) {
super(name, wild, type);
}
/**
* Constructor for AttributeTest. This one takes in 2 inputs, Name and
* wildcard test(true/false).
*
* @param name
* QName.
* @param wild
* Wildcard test, True/False.
*/
public AttributeTest(QName name, boolean wild) {
super(name, wild);
}
/**
* Default Constructor for AttributeTest.
*/
public AttributeTest() {
super();
}
/**
* Support for Visitor interface.
*
* @return Result of Visitor operation.
*/
public Object accept(XPathVisitor v) {
return v.visit(this);
}
public AnyType createTestType(ResultSequence rs) {
if (name() == null && !wild()) {
return new AttrType();
}
AnyType at = rs.first();
if (!(at instanceof NodeType)) {
return new AttrType();
}
return createAttrType(at);
}
private AnyType createAttrType(AnyType at) {
anyType = new AttrType();
NodeType nodeType = (NodeType) at;
Node node = nodeType.node_value();
if (node == null) {
return anyType;
}
String nodeName = node.getLocalName();
if (wild()) {
if (type() != null) {
anyType = createAttrForXSDType(node);
}
} else if (nodeName.equals(name().local())) {
if (type() != null) {
anyType = createAttrForXSDType(node);
} else {
anyType = new AttrType((Attr) node);
}
}
return anyType;
}
private AnyType createAttrForXSDType(Node node) {
Attr attr = (Attr) node;
if (!(attr instanceof ItemPSVI)) {
anyType = new AttrType(attr);
} else {
AttributePSVI elempsvi = (AttributePSVI) attr;
XSTypeDefinition typedef = elempsvi.getTypeDefinition();
if (typedef != null) {
if (typedef.derivedFrom(type().namespace(), type().local(),
getDerviationTypes())) {
anyType = new AttrType(attr);
}
}
}
return anyType;
}
public boolean isWild() {
return wild();
}
public Class getXDMClassType() {
return AttrType.class;
}
}