|
From: <pm_...@us...> - 2012-02-07 08:50:37
|
Revision: 4518
http://mxquery.svn.sourceforge.net/mxquery/?rev=4518&view=rev
Author: pm_fischer
Date: 2012-02-07 08:50:27 +0000 (Tue, 07 Feb 2012)
Log Message:
-----------
Some refactoring to generalize axis/node test
Represent projection paths as vectors of abstract node test instead of
strings
Introduce STAX projection adapter
Modified Paths:
--------------
trunk/MXQuery/src/ch/ethz/mxquery/contextConfig/Context.java
trunk/MXQuery/src/ch/ethz/mxquery/iterators/AttributeIterator.java
trunk/MXQuery/src/ch/ethz/mxquery/iterators/ChildIterator.java
trunk/MXQuery/src/ch/ethz/mxquery/iterators/DescendantOrSelfIterator.java
trunk/MXQuery/src/ch/ethz/mxquery/iterators/FullAxisIterator.java
trunk/MXQuery/src/ch/ethz/mxquery/iterators/SelfAxisIterator.java
trunk/MXQuery/src/ch/ethz/mxquery/iterators/scripting/WSFunction.java
trunk/MXQuery/src/ch/ethz/mxquery/query/optimizer/TermVisitor.java
trunk/MXQuery/src/ch/ethz/mxquery/xdmio/XDMInputFactory.java
trunk/MXQuery/src/ch/ethz/mxquery/xdmio/XMLSource.java
trunk/MXQuery/src/ch/ethz/mxquery/xdmio/xmlAdapters/XDMImportAdapter.java
Added Paths:
-----------
trunk/MXQuery/src/ch/ethz/mxquery/model/AbstractStep.java
trunk/MXQuery/src/ch/ethz/mxquery/model/StepInformation.java
trunk/MXQuery/src/ch/ethz/mxquery/xdmio/xmlAdapters/NonValidatingStaxAdapterProjection.java
Removed Paths:
-------------
trunk/MXQuery/src/ch/ethz/mxquery/iterators/AxisIterator.java
Modified: trunk/MXQuery/src/ch/ethz/mxquery/contextConfig/Context.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/contextConfig/Context.java 2012-02-07 08:47:38 UTC (rev 4517)
+++ trunk/MXQuery/src/ch/ethz/mxquery/contextConfig/Context.java 2012-02-07 08:50:27 UTC (rev 4518)
@@ -185,6 +185,8 @@
public static final int NONVALIDATED_INPUT_MODE_SAX = 2;
public static final int NONVALIDATED_INPUT_MODE_DOM = 3;
public static final int NONVALIDATED_INPUT_MODE_SAX_TIDY = 4;
+ public static final int NONVALIDATED_INPUT_MODE_STAX_PROJECTION = 5;
+
public static final int NO_VALIDATION = 0;
public static final int IGNORE_DTD = 1;
Modified: trunk/MXQuery/src/ch/ethz/mxquery/iterators/AttributeIterator.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/iterators/AttributeIterator.java 2012-02-07 08:47:38 UTC (rev 4517)
+++ trunk/MXQuery/src/ch/ethz/mxquery/iterators/AttributeIterator.java 2012-02-07 08:50:27 UTC (rev 4518)
@@ -30,6 +30,7 @@
import ch.ethz.mxquery.exceptions.QueryLocation;
import ch.ethz.mxquery.exceptions.StaticException;
import ch.ethz.mxquery.exceptions.TypeException;
+import ch.ethz.mxquery.model.StepInformation;
import ch.ethz.mxquery.model.CheckNodeType;
import ch.ethz.mxquery.model.CurrentBasedIterator;
import ch.ethz.mxquery.model.XDMIterator;
@@ -43,7 +44,7 @@
* @author Matthias Braun
*
*/
-public class AttributeIterator extends CurrentBasedIterator implements AxisIterator{
+public class AttributeIterator extends CurrentBasedIterator implements StepInformation{
private String local = null;
@@ -195,6 +196,10 @@
return new ObjectObjectPair(returned, paths.getSecond());
}
+ public TypeInfo getNodeTest() {
+ return stepData;
+ }
+
}
Deleted: trunk/MXQuery/src/ch/ethz/mxquery/iterators/AxisIterator.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/iterators/AxisIterator.java 2012-02-07 08:47:38 UTC (rev 4517)
+++ trunk/MXQuery/src/ch/ethz/mxquery/iterators/AxisIterator.java 2012-02-07 08:50:27 UTC (rev 4518)
@@ -1,21 +0,0 @@
-package ch.ethz.mxquery.iterators;
-
-public interface AxisIterator {
-
- public static final int AXIS_SELF = 1;
- public static final int AXIS_CHILD = 2;
- public static final int AXIS_DESCENDANT = 4;
- public static final int AXIS_SELF_DESCENDANT = 5;
- public static final int AXIS_PARENT = 18;
- public static final int AXIS_ANCESTOR = 20;
- public static final int AXIS_SELF_ANCESTOR = 21;
- public static final int AXIS_FOLLOWING = 6;
- public static final int AXIS_PRECEDING = 22;
- public static final int AXIS_FOLLOWING_SIBLING = 8;
- public static final int AXIS_PRECEDING_SIBLING = 24;
- public static final int BACKWARD_AXIS_MASK = 16;
- public static final int SELF_AXIS_MASK = 1;
- public static final int AXIS_ATTRIBUTE = 10;
- public abstract int getDirection();
-
-}
\ No newline at end of file
Modified: trunk/MXQuery/src/ch/ethz/mxquery/iterators/ChildIterator.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/iterators/ChildIterator.java 2012-02-07 08:47:38 UTC (rev 4517)
+++ trunk/MXQuery/src/ch/ethz/mxquery/iterators/ChildIterator.java 2012-02-07 08:50:27 UTC (rev 4518)
@@ -31,6 +31,8 @@
import ch.ethz.mxquery.exceptions.QueryLocation;
import ch.ethz.mxquery.exceptions.StaticException;
import ch.ethz.mxquery.exceptions.TypeException;
+import ch.ethz.mxquery.model.AbstractStep;
+import ch.ethz.mxquery.model.StepInformation;
import ch.ethz.mxquery.model.CheckNodeType;
import ch.ethz.mxquery.model.CurrentBasedIterator;
import ch.ethz.mxquery.model.VariableHolder;
@@ -45,7 +47,7 @@
* @author Matthias Braun
*
*/
-public class ChildIterator extends CurrentBasedIterator implements AxisIterator {
+public class ChildIterator extends CurrentBasedIterator implements StepInformation {
protected String lastStep;
@@ -78,11 +80,6 @@
}
- public String getStepName() {
- return stepData.getXQName().toString();
- }
-
-
public XDMIterator staticInit() throws MXQueryException{
if (subIters != null) {
this.current = subIters[0];
@@ -274,19 +271,15 @@
Set returned = new Set();
Enumeration pathEnum = returnedBelow.elements();
while (pathEnum.hasMoreElements()) {
- String res = (String) pathEnum.nextElement();
- if (res.endsWith("/"))
- res = res.substring(0, res.length()-1);
- if (step_uri != null)
- res = res+"/{"+step_uri+"}:";
- if (step_local != null) {
- if (step_uri == null)
- res = res+"/";
- res = res+step_local;
- }
+ Vector res = (Vector) pathEnum.nextElement();
+ res.addElement(new AbstractStep(AXIS_CHILD, stepData));
returned.add(res);
}
return new ObjectObjectPair(returned, paths.getSecond());
+ }
+
+ public TypeInfo getNodeTest() {
+ return stepData;
}
Modified: trunk/MXQuery/src/ch/ethz/mxquery/iterators/DescendantOrSelfIterator.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/iterators/DescendantOrSelfIterator.java 2012-02-07 08:47:38 UTC (rev 4517)
+++ trunk/MXQuery/src/ch/ethz/mxquery/iterators/DescendantOrSelfIterator.java 2012-02-07 08:50:27 UTC (rev 4518)
@@ -33,6 +33,8 @@
import ch.ethz.mxquery.exceptions.QueryLocation;
import ch.ethz.mxquery.exceptions.StaticException;
import ch.ethz.mxquery.exceptions.TypeException;
+import ch.ethz.mxquery.model.AbstractStep;
+import ch.ethz.mxquery.model.StepInformation;
import ch.ethz.mxquery.model.CheckNodeType;
import ch.ethz.mxquery.model.CurrentBasedIterator;
import ch.ethz.mxquery.model.VariableHolder;
@@ -49,7 +51,7 @@
* @author Matthias Braun
*
*/
-public class DescendantOrSelfIterator extends CurrentBasedIterator implements AxisIterator{
+public class DescendantOrSelfIterator extends CurrentBasedIterator implements StepInformation{
private boolean match = false;
@@ -460,20 +462,17 @@
Set returned = new Set();
Enumeration pathEnum = returnedBelow.elements();
while (pathEnum.hasMoreElements()) {
- String res = (String) pathEnum.nextElement();
- if (res.endsWith("/"))
- res = res.substring(0, res.length()-1);
- if (step_uri != null)
- res = res+"//{"+step_uri+"}:";
- if (step_local != null) {
- if (step_uri == null)
- res = res+"//";
- res = res+step_local;
- }
+ Vector res = (Vector) pathEnum.nextElement();
+ res.addElement(new AbstractStep(descAxis, stepData));
returned.add(res);
}
return new ObjectObjectPair(returned, paths.getSecond());
}
+
+
+ public TypeInfo getNodeTest() {
+ return stepData;
+ }
}
Modified: trunk/MXQuery/src/ch/ethz/mxquery/iterators/FullAxisIterator.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/iterators/FullAxisIterator.java 2012-02-07 08:47:38 UTC (rev 4517)
+++ trunk/MXQuery/src/ch/ethz/mxquery/iterators/FullAxisIterator.java 2012-02-07 08:50:27 UTC (rev 4518)
@@ -31,6 +31,7 @@
import ch.ethz.mxquery.exceptions.MXQueryException;
import ch.ethz.mxquery.exceptions.QueryLocation;
import ch.ethz.mxquery.exceptions.TypeException;
+import ch.ethz.mxquery.model.StepInformation;
import ch.ethz.mxquery.model.CheckNodeType;
import ch.ethz.mxquery.model.CurrentBasedIterator;
import ch.ethz.mxquery.model.DataflowAnalysis;
@@ -40,7 +41,7 @@
import ch.ethz.mxquery.model.updatePrimitives.ExtendedAxisStore;
import ch.ethz.mxquery.util.Set;
-public class FullAxisIterator extends CurrentBasedIterator implements AxisIterator {
+public class FullAxisIterator extends CurrentBasedIterator implements StepInformation {
private TypeInfo stepData = null;
private String step_local = null;
@@ -292,5 +293,9 @@
return super.staticInit();
}
+ public TypeInfo getNodeTest() {
+ return stepData;
+ }
+
}
Modified: trunk/MXQuery/src/ch/ethz/mxquery/iterators/SelfAxisIterator.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/iterators/SelfAxisIterator.java 2012-02-07 08:47:38 UTC (rev 4517)
+++ trunk/MXQuery/src/ch/ethz/mxquery/iterators/SelfAxisIterator.java 2012-02-07 08:50:27 UTC (rev 4518)
@@ -29,12 +29,13 @@
import ch.ethz.mxquery.exceptions.MXQueryException;
import ch.ethz.mxquery.exceptions.QueryLocation;
import ch.ethz.mxquery.exceptions.TypeException;
+import ch.ethz.mxquery.model.StepInformation;
import ch.ethz.mxquery.model.CheckNodeType;
import ch.ethz.mxquery.model.CurrentBasedIterator;
import ch.ethz.mxquery.model.Window;
import ch.ethz.mxquery.model.XDMIterator;
-public class SelfAxisIterator extends CurrentBasedIterator implements AxisIterator {
+public class SelfAxisIterator extends CurrentBasedIterator implements StepInformation {
private TypeInfo stepData = null;
private String step_local = null;
@@ -147,7 +148,7 @@
}
public int getDirection() {
- return AxisIterator.AXIS_SELF;
+ return StepInformation.AXIS_SELF;
}
protected void checkExpressionTypes() throws MXQueryException {
if (!isScripting || context.getScriptingQueryMode() == XQStaticContext.SCRIPTING_MODE_SIMPLE) {
@@ -170,5 +171,9 @@
return super.staticInit();
}
+ public TypeInfo getNodeTest() {
+ return stepData;
+ }
+
}
Modified: trunk/MXQuery/src/ch/ethz/mxquery/iterators/scripting/WSFunction.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/iterators/scripting/WSFunction.java 2012-02-07 08:47:38 UTC (rev 4517)
+++ trunk/MXQuery/src/ch/ethz/mxquery/iterators/scripting/WSFunction.java 2012-02-07 08:50:27 UTC (rev 4518)
@@ -29,10 +29,10 @@
import ch.ethz.mxquery.exceptions.ErrorCodes;
import ch.ethz.mxquery.exceptions.MXQueryException;
import ch.ethz.mxquery.exceptions.QueryLocation;
-import ch.ethz.mxquery.iterators.AxisIterator;
import ch.ethz.mxquery.iterators.ChildIterator;
import ch.ethz.mxquery.iterators.DescendantOrSelfIterator;
import ch.ethz.mxquery.iterators.NodeIterator;
+import ch.ethz.mxquery.model.StepInformation;
import ch.ethz.mxquery.model.CurrentBasedIterator;
import ch.ethz.mxquery.model.Iterator;
import ch.ethz.mxquery.model.Wildcard;
@@ -242,7 +242,7 @@
if (this.returnType == null || this.returnType.equals("")){//the return 'part' is an element
TypeInfo stepInfo = new TypeInfo(Type.START_TAG,Type.OCCURRENCE_IND_EXACTLY_ONE,this.returnName);
- current = new DescendantOrSelfIterator(context, stepInfo, AxisIterator.AXIS_SELF_DESCENDANT, new XDMIterator[] {xmlIt},loc);
+ current = new DescendantOrSelfIterator(context, stepInfo, StepInformation.AXIS_SELF_DESCENDANT, new XDMIterator[] {xmlIt},loc);
// current = new NodeIterator(context, xmlIt,loc);
}else if (this.returnType.equals("multiple-result")){//the return message has more than one 'part'
//TODO: possible merging?
Added: trunk/MXQuery/src/ch/ethz/mxquery/model/AbstractStep.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/model/AbstractStep.java (rev 0)
+++ trunk/MXQuery/src/ch/ethz/mxquery/model/AbstractStep.java 2012-02-07 08:50:27 UTC (rev 4518)
@@ -0,0 +1,58 @@
+package ch.ethz.mxquery.model;
+
+import ch.ethz.mxquery.datamodel.XQName;
+import ch.ethz.mxquery.datamodel.types.TypeInfo;
+
+public class AbstractStep implements StepInformation {
+
+ public static final AbstractStep ROOT_STEP = new AbstractStep(0,(TypeInfo)null);
+ public static final AbstractStep KEEP_SUBTREE = new AbstractStep(99,(TypeInfo)null);
+
+ public AbstractStep(int dir, TypeInfo ti) {
+ direction = dir;
+ nodeTestInfo = ti;
+ }
+
+ public AbstractStep(int dir, XQName qn) {
+ direction = dir;
+ nodeTestInfo = new TypeInfo();
+ nodeTestInfo.setXQName(qn);
+ }
+
+
+ private int direction = StepInformation.AXIS_SELF;
+ private TypeInfo nodeTestInfo = null;
+ public int getDirection() {
+ return direction;
+ }
+
+ public TypeInfo getNodeTest() {
+ return nodeTestInfo;
+ }
+
+ public String getDirectionString(boolean abbrv) {
+ switch (direction) {
+ case AXIS_CHILD:
+ if (abbrv)
+ return "";
+ else
+ return "child::";
+ case AXIS_PARENT:
+ if (abbrv)
+ return "..";
+ else
+ return "parent::";
+
+ case AXIS_ATTRIBUTE:
+ if (abbrv)
+ return "@";
+ else
+ return "attribute::";
+
+ default:
+ throw new RuntimeException();
+ }
+
+ }
+
+}
Copied: trunk/MXQuery/src/ch/ethz/mxquery/model/StepInformation.java (from rev 4517, trunk/MXQuery/src/ch/ethz/mxquery/iterators/AxisIterator.java)
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/model/StepInformation.java (rev 0)
+++ trunk/MXQuery/src/ch/ethz/mxquery/model/StepInformation.java 2012-02-07 08:50:27 UTC (rev 4518)
@@ -0,0 +1,25 @@
+package ch.ethz.mxquery.model;
+
+import ch.ethz.mxquery.datamodel.types.TypeInfo;
+
+public interface StepInformation {
+
+ public static final int AXIS_SELF = 1;
+ public static final int AXIS_CHILD = 2;
+ public static final int AXIS_DESCENDANT = 4;
+ public static final int AXIS_SELF_DESCENDANT = 5;
+ public static final int AXIS_PARENT = 18;
+ public static final int AXIS_ANCESTOR = 20;
+ public static final int AXIS_SELF_ANCESTOR = 21;
+ public static final int AXIS_FOLLOWING = 6;
+ public static final int AXIS_PRECEDING = 22;
+ public static final int AXIS_FOLLOWING_SIBLING = 8;
+ public static final int AXIS_PRECEDING_SIBLING = 24;
+ public static final int BACKWARD_AXIS_MASK = 16;
+ public static final int SELF_AXIS_MASK = 1;
+ public static final int AXIS_ATTRIBUTE = 10;
+ public abstract int getDirection();
+
+ public abstract TypeInfo getNodeTest();
+
+}
\ No newline at end of file
Modified: trunk/MXQuery/src/ch/ethz/mxquery/query/optimizer/TermVisitor.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/query/optimizer/TermVisitor.java 2012-02-07 08:47:38 UTC (rev 4517)
+++ trunk/MXQuery/src/ch/ethz/mxquery/query/optimizer/TermVisitor.java 2012-02-07 08:50:27 UTC (rev 4518)
@@ -16,10 +16,12 @@
import java.util.List;
+import ch.ethz.mxquery.datamodel.types.TypeInfo;
import ch.ethz.mxquery.functions.fn.DataValuesIterator;
import ch.ethz.mxquery.iterators.AttributeIterator;
import ch.ethz.mxquery.iterators.ChildIterator;
import ch.ethz.mxquery.iterators.VariableIterator;
+import ch.ethz.mxquery.model.StepInformation;
import ch.ethz.mxquery.model.XDMIterator;
import ch.ethz.mxquery.opt.expr.Literal;
import ch.ethz.mxquery.opt.expr.LogicalUnit;
@@ -100,20 +102,15 @@
*/
private String getColumnName(XDMIterator expr){
XDMIterator iter = removeDataValuesIterator(expr);
-
String stepName = null;
- ChildIterator childIter = getChildIterator(iter);
XDMIterator nextIter=null;
- if (childIter != null) {
- stepName = childIter.getStepName();
- nextIter = childIter.getAllSubIters()[0];
+
+ if (iter instanceof StepInformation) {
+ TypeInfo ti = ((StepInformation)iter).getNodeTest();
+ stepName = ti.getXQName().toString();
+ nextIter = iter.getAllSubIters()[0];
}
- AttributeIterator attrIter = getAttributeIterator(iter);
- if (attrIter != null) {
- stepName = attrIter.getAttrStep();
- nextIter = attrIter.getAllSubIters()[0];
- }
-
+
if (stepName != null) {
String nextStep = getColumnName(nextIter);
if (nextStep != null) {
Modified: trunk/MXQuery/src/ch/ethz/mxquery/xdmio/XDMInputFactory.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/xdmio/XDMInputFactory.java 2012-02-07 08:47:38 UTC (rev 4517)
+++ trunk/MXQuery/src/ch/ethz/mxquery/xdmio/XDMInputFactory.java 2012-02-07 08:50:27 UTC (rev 4518)
@@ -46,6 +46,7 @@
import ch.ethz.mxquery.xdmio.xmlAdapters.NonSchemaValidatingSaxImportAdapter;
import ch.ethz.mxquery.xdmio.xmlAdapters.NonValidatingDOMAdapter;
import ch.ethz.mxquery.xdmio.xmlAdapters.NonValidatingStaxAdapter;
+import ch.ethz.mxquery.xdmio.xmlAdapters.NonValidatingStaxAdapterProjection;
import ch.ethz.mxquery.xdmio.xmlAdapters.ValidatedSaxImportAdapter;
import ch.ethz.mxquery.xdmio.xmlAdapters.XPPImportAdapter;
@@ -71,7 +72,7 @@
return new NonSchemaValidatingSaxImportAdapter(ctx,location,new InputSource(xml), valMode, false);
case Context.NONVALIDATED_INPUT_MODE_SAX_TIDY:
return new NonSchemaValidatingSaxImportAdapter(ctx,location,new InputSource(xml), Context.NO_VALIDATION, true);
- case Context.NONVALIDATED_INPUT_MODE_STAX:
+ case Context.NONVALIDATED_INPUT_MODE_STAX: {
XMLInputFactory factory = XMLInputFactory.newInstance();
if (valMode == Context.NO_VALIDATION || valMode == Context.IGNORE_DTD)
factory.setProperty("javax.xml.stream.supportDTD", Boolean.FALSE);
@@ -83,6 +84,20 @@
} catch (XMLStreamException e) {
throw new MXQueryException(ErrorCodes.A0007_EC_IO,"I/O Error while parsing",location);
}
+ }
+ case Context.NONVALIDATED_INPUT_MODE_STAX_PROJECTION: {
+ XMLInputFactory factory = XMLInputFactory.newInstance();
+ if (valMode == Context.NO_VALIDATION || valMode == Context.IGNORE_DTD)
+ factory.setProperty("javax.xml.stream.supportDTD", Boolean.FALSE);
+ else
+ factory.setProperty("javax.xml.stream.supportDTD", Boolean.TRUE);
+ try {
+ XMLStreamReader reader = factory.createXMLStreamReader(xml);
+ return new NonValidatingStaxAdapterProjection(ctx,location,reader);
+ } catch (XMLStreamException e) {
+ throw new MXQueryException(ErrorCodes.A0007_EC_IO,"I/O Error while parsing",location);
+ }
+ }
case Context.NONVALIDATED_INPUT_MODE_DOM:
DocumentBuilder parser;
try {
@@ -158,18 +173,32 @@
return new NonSchemaValidatingSaxImportAdapter(ctx,location,new InputSource(uri), valMode, false);
case Context.NONVALIDATED_INPUT_MODE_SAX_TIDY:
return new NonSchemaValidatingSaxImportAdapter(ctx,location,new InputSource(uri), Context.NO_VALIDATION, true);
- case Context.NONVALIDATED_INPUT_MODE_STAX:
+ case Context.NONVALIDATED_INPUT_MODE_STAX: {
XMLInputFactory factory = XMLInputFactory.newInstance();
- if (valMode == Context.NO_VALIDATION)
- factory.setProperty("javax.xml.stream.supportDTD", "false");
+ if (valMode == Context.NO_VALIDATION || valMode == Context.IGNORE_DTD)
+ factory.setProperty("javax.xml.stream.supportDTD", Boolean.FALSE);
else
- factory.setProperty("javax.xml.stream.supportDTD", "true");
+ factory.setProperty("javax.xml.stream.supportDTD", Boolean.TRUE);
try {
XMLStreamReader reader = factory.createXMLStreamReader(new StreamSource(new File(uri)));
return new NonValidatingStaxAdapter(ctx,location,reader);
} catch (XMLStreamException e) {
throw new MXQueryException(ErrorCodes.A0007_EC_IO,"I/O Error while parsing",location);
}
+ }
+ case Context.NONVALIDATED_INPUT_MODE_STAX_PROJECTION: {
+ XMLInputFactory factory = XMLInputFactory.newInstance();
+ if (valMode == Context.NO_VALIDATION || valMode == Context.IGNORE_DTD)
+ factory.setProperty("javax.xml.stream.supportDTD", Boolean.FALSE);
+ else
+ factory.setProperty("javax.xml.stream.supportDTD", Boolean.TRUE);
+ try {
+ XMLStreamReader reader = factory.createXMLStreamReader(new StreamSource(new File(uri)));
+ return new NonValidatingStaxAdapterProjection(ctx,location,reader);
+ } catch (XMLStreamException e) {
+ throw new MXQueryException(ErrorCodes.A0007_EC_IO,"I/O Error while parsing",location);
+ }
+ }
case Context.NONVALIDATED_INPUT_MODE_DOM:
DocumentBuilder parser;
try {
Modified: trunk/MXQuery/src/ch/ethz/mxquery/xdmio/XMLSource.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/xdmio/XMLSource.java 2012-02-07 08:47:38 UTC (rev 4517)
+++ trunk/MXQuery/src/ch/ethz/mxquery/xdmio/XMLSource.java 2012-02-07 08:50:27 UTC (rev 4518)
@@ -15,6 +15,8 @@
package ch.ethz.mxquery.xdmio;
+import java.util.Vector;
+
import ch.ethz.mxquery.model.XDMIterator;
import ch.ethz.mxquery.datamodel.Source;
@@ -36,5 +38,10 @@
* @return the root element name if the source was validated against a DTD
*/
public abstract String getRootElemDTD();
+ /**
+ * Inform the source about the projection information
+ * @param paths
+ */
+ public void setProjectionPaths(Vector paths);
}
Added: trunk/MXQuery/src/ch/ethz/mxquery/xdmio/xmlAdapters/NonValidatingStaxAdapterProjection.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/xdmio/xmlAdapters/NonValidatingStaxAdapterProjection.java (rev 0)
+++ trunk/MXQuery/src/ch/ethz/mxquery/xdmio/xmlAdapters/NonValidatingStaxAdapterProjection.java 2012-02-07 08:50:27 UTC (rev 4518)
@@ -0,0 +1,259 @@
+/* Copyright 2006 - 2009 ETH Zurich
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.ethz.mxquery.xdmio.xmlAdapters;
+
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.Vector;
+
+import javax.xml.stream.XMLStreamConstants;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+
+import ch.ethz.mxquery.contextConfig.Context;
+import ch.ethz.mxquery.datamodel.QName;
+import ch.ethz.mxquery.datamodel.XQName;
+import ch.ethz.mxquery.datamodel.types.Type;
+import ch.ethz.mxquery.datamodel.xdm.CommentToken;
+import ch.ethz.mxquery.datamodel.xdm.ElementToken;
+import ch.ethz.mxquery.datamodel.xdm.NamedToken;
+import ch.ethz.mxquery.datamodel.xdm.ProcessingInstrToken;
+import ch.ethz.mxquery.datamodel.xdm.TextToken;
+import ch.ethz.mxquery.datamodel.xdm.Token;
+import ch.ethz.mxquery.datamodel.xdm.TokenInterface;
+import ch.ethz.mxquery.exceptions.MXQueryException;
+import ch.ethz.mxquery.exceptions.QueryLocation;
+import ch.ethz.mxquery.model.XDMIterator;
+import ch.ethz.mxquery.util.Utils;
+
+public class NonValidatingStaxAdapterProjection extends XDMImportAdapter {
+ private XMLStreamReader reader;
+
+ private LinkedList tokensList;
+
+ private ArrayList projectionPaths;
+
+ private int [] projPathPos;
+
+
+
+ private int PROJ_MODE_NORMAL = 0;
+ private int PROJ_MODE_SKIP = 1;
+ private int PROJ_MODE_KEEP_SUB = 2;
+ private int PROJ_MODE_KEEP = 3;
+ private int PROJ_MODE_MOVE = 4;
+
+ int curProjMode = PROJ_MODE_NORMAL;
+
+ public NonValidatingStaxAdapterProjection(Context ctx, QueryLocation loc, XMLStreamReader reader) {
+ super(ctx, loc);
+ this.reader = reader;
+ this.tokensList = new LinkedList();
+ }
+
+ private TokenInterface getNext() {
+ TokenInterface tok = Token.END_SEQUENCE_TOKEN;
+ if (endOfSeq)
+ return tok;
+ try {
+ int event = reader.getEventType();
+ switch (event) {
+ case XMLStreamConstants.ATTRIBUTE:
+ break;
+ case XMLStreamConstants.DTD:
+ break;
+ case XMLStreamConstants.CDATA:
+ case XMLStreamConstants.CHARACTERS:
+ case XMLStreamConstants.SPACE:
+ {
+ StringBuffer mergedText = new StringBuffer();
+ while (event == XMLStreamConstants.CDATA || event == XMLStreamConstants.SPACE || event == XMLStreamConstants.CHARACTERS) {
+ mergedText.append(reader.getText());
+ reader.next();
+ event = reader.getEventType();
+ }
+ return new TextToken(Type.TEXT_NODE_UNTYPED_ATOMIC, createNextTokenId(Type.TEXT_NODE_UNTYPED_ATOMIC, null), mergedText.toString(),curNsScope);
+ }
+ case XMLStreamConstants.COMMENT:
+ tok = new CommentToken(createNextTokenId(Type.COMMENT, null), reader.getText(),curNsScope);
+ break;
+ case XMLStreamConstants.END_DOCUMENT:
+ tok = new Token(Type.END_DOCUMENT,null,curNsScope);
+ break;
+ case XMLStreamConstants.END_ELEMENT:
+ 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);
+ tok = new ElementToken(Type.END_TAG, null, tName, curNsScope);
+ checkCloseNsScope();
+ level--;
+ break;
+ case XMLStreamConstants.ENTITY_DECLARATION: // not used
+ break;
+ case XMLStreamConstants.ENTITY_REFERENCE:
+ break;
+ case XMLStreamConstants.NAMESPACE:
+ break;
+ case XMLStreamConstants.NOTATION_DECLARATION:
+ tok = new TextToken(createNextTokenId(Type.NOTATION, null), reader.getText());
+ break;
+ case XMLStreamConstants.PROCESSING_INSTRUCTION:
+ tok = new ProcessingInstrToken(createNextTokenId(Type.PROCESSING_INSTRUCTION, null), reader.getPIData(), reader.getPITarget(),curNsScope);
+ break;
+ case XMLStreamConstants.START_DOCUMENT:
+ tok = new Token(Type.START_DOCUMENT,createNextTokenId(Type.START_DOCUMENT, null),curNsScope);
+ break;
+ case XMLStreamConstants.START_ELEMENT:
+ level++;
+
+ boolean foundId = false;
+ boolean foundIdREFS = false;
+
+ String xmlId = null;
+ String [] xmlIdREFS = null;
+
+ boolean createdNSScope = false;
+ name = reader.getLocalName();
+ ns_uri = reader.getNamespaceURI();
+ prefix = reader.getPrefix();
+
+ // projection:
+
+ // check if node name fits with currently active paths
+
+
+ if (prefix != null && prefix.length() == 0)
+ prefix = null;
+ tName = new QName(ns_uri, prefix, name);
+ tok = new ElementToken(Type.START_TAG, createNextTokenId(Type.START_TAG, tName.toString()), tName, curNsScope);
+
+ for (int i = 0; i < reader.getNamespaceCount(); i++) {
+ String namespacePrefix = reader.getNamespacePrefix(i);
+ String namespaceUri = reader.getNamespaceURI(i);
+ XQName q;
+ if (namespacePrefix == null)
+ q = new QName(null, "xmlns");
+ else
+ q = new QName("xmlns", namespacePrefix);
+ boolean newOpened = checkOpenNsScopeAddNs(createdNSScope, q, namespaceUri);
+ if (newOpened && !createdNSScope)
+ tok = new ElementToken(Type.START_TAG, tok.getNodeId(), tName, curNsScope);
+ }
+
+ for (int i = 0, n = reader.getAttributeCount(); i < n; ++i) {
+ javax.xml.namespace.QName qName = reader.getAttributeName(i);
+ name = qName.getLocalPart();
+ ns_uri = qName.getNamespaceURI();
+ prefix = qName.getPrefix();
+
+
+
+ if (prefix.length() == 0)
+ prefix = null;
+ XQName q = new QName(ns_uri, prefix, name);
+ String value = reader.getAttributeValue(i);
+
+ String attType = reader.getAttributeType(i);
+
+ if (!foundId && (attType.equals("ID") || isXMLId(tName,q))) {
+ foundId = true;
+ xmlId = value;
+ }
+ if (!foundIdREFS && (attType.equals("IDREF") || isIDREF(tName,q))) {
+ foundIdREFS = true;
+ xmlIdREFS = new String[]{value};
+ }
+
+ if (!foundIdREFS && (attType.equals("IDREFS") || isIDREFS(tName,q))) {
+ foundIdREFS = true;
+ xmlIdREFS = Utils.split(value," ", false);
+ }
+
+
+ boolean newOpened = checkOpenNsScopeAddNs(createdNSScope, q, value);
+ if (newOpened && !createdNSScope)
+ tok = new ElementToken(Type.START_TAG, tok.getNodeId(), tName, curNsScope);
+
+ if (q.getNamespacePrefix() == null || q.getNamespacePrefix().equals("")) {
+ if (q.getLocalPart().equals("xmlns"))
+ continue;
+ } else if (q.getNamespacePrefix().equals("xmlns"))
+ continue;
+ NamedToken attToken = createAttributeToken(Type.UNTYPED_ATOMIC, value, q, curNsScope);
+ tokensList.add(attToken);
+
+ if (foundId) {
+ NamedToken nmToken = (NamedToken) tok ;
+ nmToken.setID(xmlId);
+ }
+ if (foundIdREFS) {
+ NamedToken nmToken = (NamedToken) tok;
+ nmToken.setIDREFS(xmlIdREFS);
+ }
+
+
+ }
+ break;
+ default:
+ }
+ if (reader.hasNext())
+ reader.next();
+ else {
+ endOfSeq = true;
+ }
+ return tok;
+ } catch (XMLStreamException e) {
+ e.printStackTrace();
+ } catch (MXQueryException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ try {
+ reader.close();
+ } catch (XMLStreamException se) {
+ // TODO Auto-generated catch block
+ se.printStackTrace();
+ }
+ }
+ return Token.END_SEQUENCE_TOKEN;
+ }
+
+ public TokenInterface next() throws MXQueryException {
+ if (!tokensList.isEmpty()) {
+ TokenInterface tok = (TokenInterface) tokensList.removeFirst();
+ return tok;//(Token) tokensList.remove();
+ }
+ else {
+ TokenInterface tok = getNext();
+ return tok;
+ }
+ }
+
+ protected XDMIterator copy(Context context, XDMIterator[] subIters, Vector nestedPredCtxStack) throws MXQueryException {
+ XDMImportAdapter res = new NonValidatingStaxAdapter(context, loc, reader);
+ res.uri = uri;
+ return res;
+ }
+ public void setProjectionPaths(Vector paths) {
+ projectionPaths = new ArrayList();
+ projectionPaths.addAll(paths);
+ projPathPos = new int[projectionPaths.size()];
+ for (int i=0;i<projPathPos.length;i++)
+ projPathPos[i] = 0;
+ }
+}
Modified: trunk/MXQuery/src/ch/ethz/mxquery/xdmio/xmlAdapters/XDMImportAdapter.java
===================================================================
--- trunk/MXQuery/src/ch/ethz/mxquery/xdmio/xmlAdapters/XDMImportAdapter.java 2012-02-07 08:47:38 UTC (rev 4517)
+++ trunk/MXQuery/src/ch/ethz/mxquery/xdmio/xmlAdapters/XDMImportAdapter.java 2012-02-07 08:50:27 UTC (rev 4518)
@@ -15,6 +15,7 @@
package ch.ethz.mxquery.xdmio.xmlAdapters;
+import java.util.ArrayList;
import java.util.Vector;
import ch.ethz.mxquery.bindings.WindowFactory;
@@ -304,4 +305,7 @@
return false;
}
+
+ public void setProjectionPaths(Vector paths) {
+ }
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|