xpath/trunk/XMLv2__XPathProcessor.st
changeset 0 5057afe1ec87
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/xpath/trunk/XMLv2__XPathProcessor.st	Tue Apr 08 19:47:42 2008 +0000
@@ -0,0 +1,164 @@
+"{ Package: 'stx:goodies/xmlsuite/xpath' }"
+
+"{ NameSpace: XMLv2 }"
+
+Object subclass:#XPathProcessor
+	instanceVariableNames:'expressionParser documentAdaptor'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'XML Suite-XPath'
+!
+
+
+!XPathProcessor class methodsFor:'instance creation'!
+
+new
+    ^ self basicNew initialize.
+! !
+
+!XPathProcessor methodsFor:'initialization'!
+
+documentAdaptor:anXPathDocumentAdaptor
+
+    <resource: #obsolete>
+    self obsoleteMethodWarning.
+    
+    documentAdaptor := anXPathDocumentAdaptor.
+
+    "Created: / 13-10-2006 / 17:23:33 / janfrog"
+    "Modified: / 25-10-2006 / 17:14:36 / janfrog"
+!
+
+initialize
+    super initialize.
+    expressionParser := XPathExpressionParser new.
+!
+
+setDocumentAdaptor:anXPathDocumentAdaptor 
+
+    documentAdaptor := anXPathDocumentAdaptor.
+
+    "Created: / 25-10-2006 / 17:14:07 / janfrog"
+!
+
+setDocumentProvider:aDocumentProvider
+
+    "Nothing to do here"
+
+    "Created: / 25-10-2006 / 17:15:40 / janfrog"
+! !
+
+!XPathProcessor methodsFor:'private'!
+
+evaluateTree:anExpressionTreeRootNode inContext:aContext 
+    |location_path nodeSet context|
+
+    XPathExprTreeNode loadRules.
+    location_path := anExpressionTreeRootNode 
+                evaluateWithDerivedValue:(XPathExpression new).
+    context := aContext.
+    location_path absolute ifTrue:[
+        context := documentAdaptor xpathRootContext
+    ].
+    nodeSet := aContext newNodeSetWith:(context node).
+    location_path steps do:[:step | 
+        |newNodeSet|
+
+        newNodeSet := aContext newNodeSet.
+        nodeSet do:[:node | 
+            "get elements by axis"
+            newNodeSet addAll:(step axis 
+                        createNodeSetFromContext:(documentAdaptor xpathContextOf:node)).
+             "filter the set using node test"
+            newNodeSet := step nodeTest filterNodeSet:newNodeSet.
+             "filter the set using predicates"
+        ].
+        nodeSet := newNodeSet.
+    ].
+    nodeSet documentAdaptor:documentAdaptor.
+    ^ nodeSet.
+
+    "Created: / 25-10-2006 / 17:27:44 / janfrog"
+    "Modified: / 15-11-2007 / 22:10:42 / janfrog"
+!
+
+sortByDocumentOrder:aNodeSet 
+    ^aNodeSet 
+        ifNil:[#()]
+        ifNotNil:[
+            aNodeSet 
+                asSortedCollection:documentAdaptor xpathNodePositionComparator]
+
+                "[:right :left | 
+                |result leftPos rightPos pos|
+
+                leftPos := documentAdaptor xpathPositionVectorOf:left.
+                rightPos := documentAdaptor xpathPositionVectorOf:right.
+                pos := 1.
+
+                [
+                    ((pos <= leftPos elementPosition size) 
+                        and:[ pos <= rightPos elementPosition size ]) and:[ result isNil ]
+                ] whileTrue:[
+                    ((leftPos elementPosition at:pos) > (rightPos elementPosition at:pos)) ifTrue:[
+                        result := true.
+                    ].
+                    ((leftPos elementPosition at:pos) < (rightPos elementPosition at:pos)) ifTrue:[
+                        result := false.
+                    ].
+                    pos := pos + 1.
+                ].
+                (leftPos elementPosition size = (rightPos elementPosition size)) ifTrue:[
+                    pos := 1.
+                    [
+                        ((pos <= leftPos attributePosition size) 
+                            and:[ pos <= rightPos attributePosition size ]) and:[ result isNil ]
+                    ] whileTrue:[
+                        ((leftPos attributePosition at:pos) > (rightPos attributePosition at:pos)) ifTrue:[
+                            result := true.
+                        ].
+                        ((leftPos attributePosition at:pos) < (rightPos attributePosition at:pos)) ifTrue:[
+                            result := false.
+                        ].
+                        pos := pos + 1.
+                    ].
+                ].
+                result isNil ifTrue:[
+                    result := true
+                ].
+                result.
+            ]
+    ]."
+
+    "Modified: / 13-10-2006 / 20:06:46 / janfrog"
+! !
+
+!XPathProcessor methodsFor:'processing'!
+
+evaluate: aString
+
+    ^self evaluate: aString inContext: documentAdaptor xpathRootContext
+
+    "Created: / 25-10-2006 / 17:25:55 / janfrog"
+!
+
+evaluate:aString inContext:aContext 
+    ^ self evaluateTree:(expressionParser parse:aString) inContext:aContext.
+
+    "Created: / 25-10-2006 / 17:28:13 / janfrog"
+!
+
+processExpression:aString
+
+    <resource: #obsolete>
+    self obsoleteMethodWarning: 'User #evaluate: instead'.
+    ^self evaluate:aString inContext: documentAdaptor xpathRootContext.
+
+    "Modified: / 25-10-2006 / 17:29:25 / janfrog"
+! !
+
+!XPathProcessor class methodsFor:'documentation'!
+
+version
+    ^ '$Header: /opt/data/cvs/stx/goodies/xmlsuite/xpath/XMLv2__XPathProcessor.st,v 1.4 2007-11-16 09:20:57 vranyj1 Exp $'
+! !