//
// Copyright (c)1998-2011 Pearson Education, Inc. or its affiliate(s).
// All rights reserved.
//
package openadk.library.tools.xpath;
import openadk.library.*;
import openadk.library.impl.ElementSorter;
import openadk.library.impl.surrogates.RenderSurrogate;
import org.apache.commons.jxpath.ri.Compiler;
import org.apache.commons.jxpath.ri.QName;
import org.apache.commons.jxpath.ri.compiler.NodeNameTest;
import org.apache.commons.jxpath.ri.compiler.NodeTest;
import org.apache.commons.jxpath.ri.compiler.NodeTypeTest;
import org.apache.commons.jxpath.ri.model.NodeIterator;
import org.apache.commons.jxpath.ri.model.NodePointer;
/**
* A base class for ADK NodePointer instances
*
* @author Andrew Elmhorst
* @version ADK 2.0
*/
public abstract class ADKElementPointer extends NodePointer {
protected ElementDef fElementDef;
protected Element fElement;
private SIFVersion fVersion;
protected ADKElementPointer(NodePointer parentPointer, Element element,
SIFVersion version) {
super(parentPointer);
fVersion = version;
fElement = element;
fElementDef = element.getElementDef();
}
/* (non-Javadoc)
* @see org.apache.commons.jxpath.ri.model.NodePointer#getBaseValue()
*/
@Override
public Object getBaseValue() {
return fElement;
}
/**
* The SIFVersion in effect for this object
*
* @return The SIFVersion being used for this element
*/
public SIFVersion getVersion() {
return fVersion;
}
@Override
public int compareChildNodePointers(NodePointer arg0, NodePointer arg1) {
ADKElementPointer enp1 = (ADKElementPointer) arg0;
ADKElementPointer enp2 = (ADKElementPointer) arg1;
return ElementSorter.getInstance(fVersion).compare(enp1.fElement,
enp2.fElement);
}
@Override
public Object getImmediateNode() {
return fElement;
}
@Override
public QName getName() {
return new QName(null, fElementDef.tag(fVersion));
}
protected boolean testElement(Element node, NodeTest test) {
return testElement(node, test, fVersion);
}
static boolean testElement(Element node, NodeTest test, SIFVersion version) {
if (test == null) {
return true;
}
ElementDef def = node.getElementDef();
ElementVersionInfo evi = def.getVersionInfo( version );
if (test instanceof NodeNameTest) {
if (evi.isAttribute()) {
return false;
}
NodeNameTest nodeNameTest = (NodeNameTest) test;
QName testName = nodeNameTest.getNodeName();
// TODO: For now we don't support namespaces in the ADK
// String namespaceURI = nodeNameTest.getNamespaceURI();
boolean wildcard = nodeNameTest.isWildcard();
String testPrefix = testName.getPrefix();
if (wildcard && testPrefix == null) {
return true;
}
// If there is a render surrogate assigned to this ElementDef
// for this version of SIF, do a match against the legacy
// path that the surrogate represents
if( version.getMajor() < 2 ){
RenderSurrogate surrogate = evi.getSurrogate();
if( surrogate != null ){
return surrogate.getPath().startsWith( testName.getName() );
}
}
if ( wildcard || testName.getName().equals( evi.getTag())) {
// TODO: For now we don't support namespaces in the ADK
// String nodeNS = DOMNodePointer.getNamespaceURI(node);
// return equalStrings(namespaceURI, nodeNS);
return true;
}
} else if (test instanceof NodeTypeTest) {
switch (((NodeTypeTest) test).getNodeType()) {
case Compiler.NODE_TYPE_NODE:
// The test to determine whether this is an attribute
// or not has already succeeded
return !def.isField();
case Compiler.NODE_TYPE_TEXT:
return def.isField();
case Compiler.NODE_TYPE_COMMENT:
return false;
case Compiler.NODE_TYPE_PI:
return false;
}
return false;
}
return false;
}
protected SIFSimpleType getSIFSimpleTypeValue(ElementDef def, Object rawValue) {
if( rawValue instanceof SIFSimpleType ){
return (SIFSimpleType)rawValue;
}
SIFSimpleType sst = def.getTypeConverter().getSIFSimpleType( rawValue );
return sst;
}
/**
* @return True if the SIFVersion is set to less than SIF20
*/
public boolean isLegacyVersion(){
return fVersion.getMajor() < 2;
}
}