|
From: <pm_...@us...> - 2012-02-07 08:55:16
|
Revision: 4521
http://mxquery.svn.sourceforge.net/mxquery/?rev=4521&view=rev
Author: pm_fischer
Date: 2012-02-07 08:55:10 +0000 (Tue, 07 Feb 2012)
Log Message:
-----------
Namespace support for projection
Modified Paths:
--------------
trunk/MXQuery/src/ch/ethz/mxquery/xdmio/xmlAdapters/NonValidatingStaxAdapterProjection.java
Modified: trunk/MXQuery/src/ch/ethz/mxquery/xdmio/xmlAdapters/NonValidatingStaxAdapterProjection.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/xdmio/xmlAdapters/NonValidatingStaxAdapterProjection.java 2012-02-07 08:53:50 UTC (rev 4520)
+++ trunk/MXQuery/src/ch/ethz/mxquery/xdmio/xmlAdapters/NonValidatingStaxAdapterProjection.java 2012-02-07 08:55:10 UTC (rev 4521)
@@ -83,8 +83,6 @@
private int [] projPathPos;
private Stack bufferedPathName;
- private Stack bufferedPathURI;
- private Stack bufferedPathPrefix;
private Stack bufferedAttributes;
private int pathProducedLevel = 0;
@@ -144,7 +142,7 @@
break;
case XMLStreamConstants.END_ELEMENT: {
boolean emitTag = false;
- String name_debug = reader.getLocalName();
+ javax.xml.namespace.QName name_debug = reader.getName();
switch (curProjMode) {
case PROJ_MODE_KEEP_SUB:
//KEEP_SUB->MOVE: reached skipKeepLevel
@@ -169,12 +167,12 @@
}
else
if (skipKeepLevel == level) {
- String name = reader.getLocalName();
+ javax.xml.namespace.QName name = reader.getName();
Vector path = (Vector)projectionPaths.get(0);
XQName curPathCheck = ((AbstractStep) (path).elementAt(projPathPos[0])).getNodeTest().getXQName();
- if (curPathCheck.getLocalPart().equals(name) || level != projPathPos[0]) {
+ if (equalsQNames(curPathCheck,name) || level != projPathPos[0]) {
curProjMode = PROJ_MODE_KEEP;
} else {
curProjMode = PROJ_MODE_MOVE;
@@ -188,10 +186,10 @@
}
break;
case PROJ_MODE_MOVE: {
- String name = reader.getLocalName();
+ javax.xml.namespace.QName name = reader.getName();
XQName curPathCheck = ((AbstractStep) ((Vector)projectionPaths.get(0)).elementAt(projPathPos[0]-1)).getNodeTest().getXQName();
- if (!curPathCheck.getLocalPart().equals(name))
- throw new MXQueryException(ErrorCodes.A0007_EC_IO, "Inconsistency in projecting, expected "+curPathCheck.getLocalPart()+" saw "+name, loc);
+ if (!equalsQNames(curPathCheck,name))
+ throw new MXQueryException(ErrorCodes.A0007_EC_IO, "Inconsistency in projecting, expected "+curPathCheck+" saw "+name, loc);
if (pathProducedLevel >= level) {
emitTag = true;
@@ -205,7 +203,7 @@
//decide if keep or move directly, when we came from SKIP
//SKIP->KEEP: reached skipKeepLevel, level above matched
// SKIP->MOVE: reached skipKeepLevel, level above did not match
- String name = reader.getLocalName();
+ javax.xml.namespace.QName name = reader.getName();
Vector path = (Vector)projectionPaths.get(0);
@@ -222,8 +220,8 @@
projPathPos[0]--;
}
XQName curPathCheck = ((AbstractStep) (path).elementAt(projPathPos[0])).getNodeTest().getXQName();
- if (!curPathCheck.getLocalPart().equals(name))
- throw new MXQueryException(ErrorCodes.A0007_EC_IO, "Inconsistency in projecting, expected "+curPathCheck.getLocalPart()+" saw "+name, loc);
+ if (!equalsQNames(curPathCheck,name))
+ throw new MXQueryException(ErrorCodes.A0007_EC_IO, "Inconsistency in projecting, expected "+curPathCheck+" saw "+name, loc);
//projPathPos[0]--;
curProjMode = PROJ_MODE_MOVE;
@@ -240,12 +238,8 @@
//
if (emitTag) {
- String name = reader.getLocalName();
- String ns_uri = reader.getNamespaceURI();
- String prefix = reader.getPrefix();
- if (prefix != null && prefix.length() == 0)
- prefix = null;
- XQName tName = new QName(ns_uri, prefix, name);
+ javax.xml.namespace.QName name = reader.getName();
+ XQName tName = transformQName(name);
tok = new ElementToken(Type.END_TAG, null, tName, curNsScope);
checkCloseNsScope();
level--;
@@ -297,11 +291,11 @@
String [] xmlIdREFS = null;
boolean createdNSScope = false;
- String name = reader.getLocalName();
- String ns_uri = reader.getNamespaceURI();
- String prefix = reader.getPrefix();
- if (prefix != null && prefix.length() == 0)
- prefix = null;
+ javax.xml.namespace.QName name = reader.getName();
+// String ns_uri = reader.getNamespaceURI();
+// String prefix = reader.getPrefix();
+// if (prefix != null && prefix.length() == 0)
+// prefix = null;
// projection:
@@ -321,22 +315,16 @@
emitTag = true;
} else {
XQName curPathCheck = as.getNodeTest().getXQName();
- if (curPathCheck.getLocalPart().equals(name)) { //TODO: Handle namespaces
+ if (equalsQNames(curPathCheck,name)) {
// check name: if true, then either keep or move
Vector path = ((Vector)projectionPaths.get(0));
if (path.size() <= projPathPos[0]+1) {
- tok = extractPendingElements(
- name,
- ns_uri,
- prefix);
+ tok = extractPendingElements(name);
curProjMode = PROJ_MODE_KEEP;
skipKeepLevel = level+1;
}
else if (path.elementAt(path.size()-1)==AbstractStep.KEEP_SUBTREE && path.size() <= projPathPos[0]+2) {
- tok = extractPendingElements(
- name,
- ns_uri,
- prefix);
+ tok = extractPendingElements(name);
curProjMode = PROJ_MODE_KEEP_SUB;
skipKeepLevel = level;
}
@@ -368,9 +356,9 @@
continue;
}
if (emitTag) {
- if (prefix != null && prefix.length() == 0)
- prefix = null;
- XQName tName = new QName(ns_uri, prefix, name);
+// if (prefix != null && prefix.length() == 0)
+// prefix = null;
+ XQName tName = transformQName(name);
tok = new ElementToken(Type.START_TAG, createNextTokenId(Type.START_TAG, tName.toString()), tName, curNsScope);
}
if (curProjMode == PROJ_MODE_KEEP)
@@ -469,15 +457,14 @@
return Token.END_SEQUENCE_TOKEN;
}
- private TokenInterface extractPendingElements(String name, String ns_uri,
- String prefix) {
+ private TokenInterface extractPendingElements(javax.xml.namespace.QName qn) {
// we have reached the end of the path, and no subtree is needed: KEEP
// emit all the pending element nodes
for (int i=pathProducedLevel; i<bufferedPathName.size();i++) {
- XQName tName = new QName(null, null, (String)bufferedPathName.elementAt(i));
+ XQName tName = transformQName((javax.xml.namespace.QName)bufferedPathName.elementAt(i));
tokensList.add(new ElementToken(Type.START_TAG, createNextTokenId(Type.START_TAG, tName.toString()), tName, curNsScope));
}
- XQName tName = new QName(ns_uri, prefix, name);
+ XQName tName = transformQName(qn);
tokensList.add(new ElementToken(Type.START_TAG, createNextTokenId(Type.START_TAG, tName.toString()), tName, curNsScope));
pathProducedLevel = level;
return (TokenInterface)tokensList.removeFirst();
@@ -506,4 +493,26 @@
for (int i=0;i<projPathPos.length;i++)
projPathPos[i] = 0;
}
+
+ QName transformQName(javax.xml.namespace.QName qn) {
+ //TODO: We might create a pool/cache of QNames
+ String prefix = qn.getPrefix();
+ if (prefix != null && prefix.length() == 0)
+ prefix = null;
+ return new QName(qn.getNamespaceURI(),prefix,qn.getLocalPart());
+ }
+
+ boolean equalsQNames(XQName mxqQName, javax.xml.namespace.QName jQName) {
+ if (!mxqQName.getLocalPart().equals(jQName.getLocalPart()))
+ return false;
+ if (mxqQName.getNamespaceURI()==null) {
+ if (!jQName.getNamespaceURI().equals(javax.xml.XMLConstants.NULL_NS_URI))
+ return false;
+ else return true;
+ }
+ if (!mxqQName.getNamespaceURI().equals(jQName.getNamespaceURI()))
+ return false;
+ return true;
+ }
+
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|