xquery/trunk/XQuery__XDMAdaptor.st
changeset 241 e28ef0f20186
child 273 21355039610d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/xquery/trunk/XQuery__XDMAdaptor.st	Wed Apr 07 12:37:26 2010 +0000
@@ -0,0 +1,573 @@
+"{ Package: 'stx:goodies/xmlsuite/xquery' }"
+
+"{ NameSpace: XQuery }"
+
+Object subclass:#XDMAdaptor
+	instanceVariableNames:'document released documentURI'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'XQuery-XDM'
+!
+
+
+!XDMAdaptor class methodsFor:'instance creation'!
+
+new
+    ^ self basicNew initialize.
+
+    "Created: / 24-10-2006 / 11:15:06 / janfrog"
+! !
+
+!XDMAdaptor class methodsFor:'accessing'!
+
+documentClass
+
+    ^self subclassResponsibility
+
+    "Created: / 13-10-2006 / 21:05:26 / janfrog"
+! !
+
+!XDMAdaptor class methodsFor:'testing'!
+
+isAbstract
+
+    ^self == XDMAdaptor
+
+    "Created: / 13-10-2006 / 21:05:14 / janfrog"
+! !
+
+!XDMAdaptor methodsFor:'accessing'!
+
+document
+        ^document.
+!
+
+document: aDocument
+
+    document := aDocument.
+    document ifNotNil:[released := false].
+
+    "Modified: / 24-10-2006 / 11:14:54 / janfrog"
+!
+
+documentURI: uri
+
+    documentURI := uri.
+
+    "Created: / 20-09-2007 / 12:49:21 / janfrog"
+!
+
+itemKind
+    ^ XQuery::AccessedNodeKind instance.
+
+    "Created: / 27-06-2009 / 18:38:15 / Jan Kurs <kursj1@fel.cvut.cz>"
+    "Modified: / 07-10-2009 / 10:26:09 / Jan Kurs <kursj1@fel.cvut.cz>"
+! !
+
+!XDMAdaptor methodsFor:'checking'!
+
+ensureIsValidAttributeId: nodeId 
+
+    (self xpathIsAttribute: nodeId)
+        ifFalse:[self invalidNodeIdError: 'Not an attribute']
+
+    "Created: / 31-10-2007 / 10:21:04 / janfrog"
+!
+
+ensureIsValidElementId: nodeId 
+
+    (self xpathIsElement: nodeId)
+        ifFalse:[self invalidNodeIdError: 'Not an element']
+
+    "Created: / 31-10-2007 / 10:18:19 / janfrog"
+!
+
+ensureIsValidElementOrAttributeId: nodeId 
+
+    ((self xpathIsAttribute: nodeId) or:[self xpathIsElement: nodeId])
+        ifFalse:[self invalidNodeIdError: 'Not an attribute']
+
+    "Created: / 31-10-2007 / 10:22:12 / janfrog"
+!
+
+ensureIsValidElementOrDocumentId: nodeId 
+
+
+    ((self xpathIsElement: nodeId) or:[self xpathIsDocument: nodeId])
+        ifFalse:[self invalidNodeIdError: 'Not an element or document']
+
+    "Created: / 31-10-2007 / 10:18:19 / janfrog"
+!
+
+ensureIsValidNodeId:arg 
+    "raise an error: must be redefined in concrete subclass(es)"
+
+    ^ self subclassResponsibility
+
+    "Created: / 14-12-2006 / 23:44:44 / janfrog"
+!
+
+ensureIsValidNodeIds: aCollection "of node-ids"
+
+    aCollection do:[:nodeId| self ensureIsValidNodeId: nodeId]
+
+    "Created: / 14-11-2007 / 16:11:18 / janfrog"
+!
+
+ensureNotReleased
+
+    released ifTrue:[XPathDocumentAdaptorReleasedError raiseErrorString:'Document adaptor released']
+
+    "Created: / 24-10-2006 / 11:16:30 / janfrog"
+! !
+
+!XDMAdaptor methodsFor:'error reporting'!
+
+invalidNodeIdError: aString
+
+    XQuery::InvalidNodeIdError raiseErrorString: aString
+
+    "Created: / 31-10-2007 / 10:18:59 / janfrog"
+    "Modified: / 06-04-2010 / 11:58:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!XDMAdaptor methodsFor:'initialization & release'!
+
+initialize
+
+    "/super initialize.
+    released := false
+
+    "Created: / 24-10-2006 / 11:15:06 / janfrog"
+    "Modified: / 15-12-2006 / 00:33:39 / janfrog"
+!
+
+primReleaseResources
+
+    ^self subclassResponsibility
+
+    "Created: / 12-12-2006 / 10:48:19 / janfrog"
+!
+
+releaseResources
+
+    "
+        Release all associated resources such as
+        database connections, in-memory tree nodes,
+        indexes and so on.
+        After sending #releaseResources to myself,
+        all subsequent sends of any of #xpath* messages
+        will cause XPathDocumentAdaptorReleasedError
+        exception.
+
+    "
+
+    
+    self primReleaseResources.
+    document := nil.
+    released := true.
+
+    "Created: / 18-10-2006 / 14:58:59 / janfrog"
+    "Modified: / 12-12-2006 / 10:47:49 / janfrog"
+!
+
+releaseResourcesIfNotAlready
+
+    self isReleased ifFalse:[self releaseResources]
+
+    "Created: / 12-12-2006 / 10:48:46 / janfrog"
+! !
+
+!XDMAdaptor methodsFor:'node importing'!
+
+importForeignNode:foreignNodeId adaptor:foreignXPathDocumentAdaptor 
+    |builder|
+
+    builder := self importingBuilder.
+    (XQuery::XQueryResultXMLReader new)
+        setDocumentAdaptor:foreignXPathDocumentAdaptor;
+        setContentHandler:builder;
+        visit:foreignNodeId.
+    ^ builder document
+
+    "Created: / 05-12-2007 / 14:26:29 / janfrog"
+!
+
+importingBuilder
+
+    ^self importingBuilderClass new
+
+    "Created: / 14-11-2007 / 14:29:21 / janfrog"
+!
+
+importingBuilderClass
+
+    ^self subclassResponsibility
+
+    "Created: / 14-11-2007 / 14:29:09 / janfrog"
+! !
+
+!XDMAdaptor methodsFor:'printing'!
+
+printOn: aStream
+
+    super printOn:aStream.
+    aStream nextPutAll:' on '.
+    documentURI printOn: aStream
+
+    "Created: / 20-09-2007 / 12:50:11 / janfrog"
+! !
+
+!XDMAdaptor methodsFor:'testing'!
+
+isReleased
+
+    ^released
+
+    "Created: / 12-12-2006 / 10:45:18 / janfrog"
+! !
+
+!XDMAdaptor methodsFor:'update primitives'!
+
+updDelete: nodeId
+
+    self ensureNotReleased ; ensureIsValidNodeId: nodeId.
+
+    (self xpathIsAttribute: nodeId)
+        ifTrue:[self primUpdDeleteAttribute: nodeId]
+        ifFalse:[self primUpdDeleteNode: nodeId]
+
+    "Created: / 24-10-2007 / 16:09:53 / janfrog"
+    "Modified: / 31-10-2007 / 10:17:25 / janfrog"
+!
+
+updInsert:sourceNodeId after:targetNodeId 
+    "String"
+    
+    self
+        ensureNotReleased;
+        ensureIsValidElementOrAttributeId:sourceNodeId;
+        ensureIsValidElementOrDocumentId:targetNodeId.
+    self 
+        primUpdInsert:sourceNodeId
+        into:(self xpathParentOf: targetNodeId)
+        after:targetNodeId.
+
+    "Modified: / 21-11-2007 / 13:58:38 / janfrog"
+!
+
+updInsert:insertedNodeId asFirstInto:parentNodeId 
+    |childNodes|
+
+    self
+        ensureNotReleased;
+        ensureIsValidNodeId:insertedNodeId;
+        ensureIsValidElementOrDocumentId:parentNodeId.
+    self 
+        primUpdInsert:insertedNodeId
+        into: parentNodeId
+        before:((childNodes := self xpathChildOf:parentNodeId) isEmpty 
+                ifTrue:[ nil ]
+                ifFalse:[ childNodes anyOne ])
+
+    "Modified: / 21-11-2007 / 14:20:28 / janfrog"
+!
+
+updInsert:insertedNodeId asLastInto:parentNodeId 
+    "String"
+    
+    self
+        ensureNotReleased;
+        ensureIsValidElementOrAttributeId:insertedNodeId;
+        ensureIsValidElementOrDocumentId:parentNodeId.
+    self 
+        primUpdInsert:insertedNodeId
+        into:parentNodeId
+        after:(self xpathChildOf:parentNodeId) last
+
+    "Modified: / 21-11-2007 / 13:59:02 / janfrog"
+!
+
+updInsert:insertedNodeId before:referenceNodeId 
+    "String"
+    
+    self
+        ensureNotReleased;
+        ensureIsValidElementOrAttributeId:insertedNodeId;
+        ensureIsValidElementOrDocumentId:referenceNodeId.
+    self 
+        primUpdInsert:insertedNodeId
+        into:(self xpathParentOf: referenceNodeId)
+        before:referenceNodeId.
+
+    "Created: / 21-11-2007 / 11:31:22 / janfrog"
+    "Modified: / 21-11-2007 / 14:19:11 / janfrog"
+!
+
+updInsert:insertedNodeId into:parentNodeId 
+
+    ^self updInsert: insertedNodeId asFirstInto: parentNodeId
+
+    "Modified: / 21-11-2007 / 12:15:08 / janfrog"
+!
+
+updInsertAttribute:anAttr into:targetNodeId 
+    self
+        ensureNotReleased;
+        ensureIsValidElementId:targetNodeId;
+        ensureIsValidAttributeId:anAttr.
+    self primUpdInsertAttribute:anAttr into:targetNodeId
+
+    "Modified: / 31-10-2007 / 10:22:31 / janfrog"
+!
+
+updRename: nodeId to: newName "String"
+
+    self ensureNotReleased ; ensureIsValidElementOrAttributeId: nodeId.
+    self primUpdRename: nodeId to: newName.
+
+    "Modified: / 31-10-2007 / 10:22:31 / janfrog"
+!
+
+updReplaceNode:nodeId with:replacementNodeIds 
+    |realReplacementNodeIds|
+
+    self
+        ensureNotReleased;
+        ensureIsValidNodeId:nodeId;
+        ensureIsValidNodeIds:replacementNodeIds.
+    realReplacementNodeIds := OrderedCollection new:replacementNodeIds size.
+    replacementNodeIds do:[:replacementNodeId | 
+        (self xpathIsDocumentOrDocumentFragment:replacementNodeId) ifTrue:[
+            realReplacementNodeIds addAll:(self xpathChildOf:replacementNodeId)
+        ] ifFalse:[
+            realReplacementNodeIds add:replacementNodeId
+        ]
+    ].
+    (self xpathIsElement:nodeId) ifTrue:[
+        realReplacementNodeIds do:[:node | 
+            self 
+                primUpdInsert:node
+                into: (self xpathParentOf: nodeId)
+                after:nodeId
+        ].
+        self primUpdDeleteNode:nodeId
+    ] ifFalse:[
+        realReplacementNodeIds do:[:node | 
+            self primUpdInsertAttribute:node into:(self xpathParentOf:nodeId)
+        ].
+        self primUpdDeleteAttribute:nodeId
+    ]
+
+    "Created: / 14-11-2007 / 14:17:16 / janfrog"
+    "Modified: / 21-11-2007 / 13:59:39 / janfrog"
+!
+
+updReplaceValueOf:nodeId with:newValue 
+    self
+        ensureNotReleased;
+        ensureIsValidNodeId:nodeId.
+
+    (self xpathIsElement:nodeId) 
+        ifTrue:
+            ["delete all child nodes"            
+            (self xpathChildOf: nodeId) do:[:node|self updDelete: node].
+            "insert new node"
+            self updInsert: newValue into: nodeId]
+        ifFalse:
+            [self primUpdReplaceValueOf:nodeId with:newValue]
+
+    "Modified: / 21-11-2007 / 12:48:36 / janfrog"
+! !
+
+!XDMAdaptor methodsFor:'update primitives - primitives'!
+
+primUpdDeleteAttribute: nodeId
+
+    ^self subclassResponsibility
+
+    "Created: / 31-10-2007 / 09:53:38 / janfrog"
+!
+
+primUpdDeleteNode: nodeId
+
+    self subclassResponsibility
+
+    "Created: / 31-10-2007 / 09:53:52 / janfrog"
+!
+
+primUpdInsert:insertedNodeId into:nodeId after: referenceNodeId
+    ^ self subclassResponsibility
+
+    "Created: / 21-11-2007 / 13:55:03 / janfrog"
+!
+
+primUpdInsert:insertedNodeId into: nodeId before:referenceNodeId 
+    ^ self subclassResponsibility
+
+    "Created: / 21-11-2007 / 13:55:38 / janfrog"
+!
+
+primUpdInsertAttribute:anAttr into: targetNodeId 
+
+    ^self subclassResponsibility
+
+    "Created: / 31-10-2007 / 09:53:38 / janfrog"
+!
+
+primUpdRename: nodeId to: newName
+
+    self subclassResponsibility
+
+    "Created: / 31-10-2007 / 09:54:39 / janfrog"
+!
+
+primUpdReplaceValueOf:nodeId with:newValue 
+    self subclassResponsibility
+
+    "Created: / 14-11-2007 / 15:17:24 / janfrog"
+! !
+
+!XDMAdaptor methodsFor:'xdm accessors'!
+
+dmAttributes: node
+    " The collection of the nodeIds is expected"
+
+    ^ self subclassResponsibility .
+
+    "Created: / 19-04-2009 / 17:51:36 / Jan Kurs <kursj1@fel.cvut.cz>"
+    "Modified: / 15-09-2009 / 19:34:13 / Jan Kurs <kursj1@fel.cvut.cz>"
+!
+
+dmBaseUri: node
+    ^ self subclassResponsibility .
+
+    "Created: / 19-04-2009 / 17:51:52 / Jan Kurs <kursj1@fel.cvut.cz>"
+    "Modified: / 26-07-2009 / 20:23:38 / Jan Kurs <kursj1@fel.cvut.cz>"
+!
+
+dmChildren: nodeId
+    ^ self shouldImplement.
+
+    "Created: / 19-04-2009 / 17:52:05 / Jan Kurs <kursj1@fel.cvut.cz>"
+!
+
+dmDocumentUri: nodeId
+    ^ self shouldImplement.
+
+    "Created: / 19-04-2009 / 17:52:12 / Jan Kurs <kursj1@fel.cvut.cz>"
+!
+
+dmIsId: nodeId
+    ^ self shouldImplement.
+
+    "Created: / 19-04-2009 / 17:52:20 / Jan Kurs <kursj1@fel.cvut.cz>"
+!
+
+dmIsIdrefs: nodeId
+    ^ self shouldImplement.
+
+    "Created: / 19-04-2009 / 17:54:28 / Jan Kurs <kursj1@fel.cvut.cz>"
+!
+
+dmNamespaceNodes: nodeId
+    ^ self shouldImplement.
+
+    "Created: / 19-04-2009 / 17:54:38 / Jan Kurs <kursj1@fel.cvut.cz>"
+!
+
+dmNamspaceBindings: nodeId
+    ^ self shouldImplement.
+
+    "Created: / 19-04-2009 / 17:54:42 / Jan Kurs <kursj1@fel.cvut.cz>"
+!
+
+dmNilled: nodeId
+    ^ self shouldImplement.
+
+    "Created: / 19-04-2009 / 17:54:47 / Jan Kurs <kursj1@fel.cvut.cz>"
+!
+
+dmNodeKind: node
+    ^ self subclassResponsibility .
+
+    "Created: / 19-04-2009 / 17:54:52 / Jan Kurs <kursj1@fel.cvut.cz>"
+    "Modified: / 15-09-2009 / 20:28:44 / Jan Kurs <kursj1@fel.cvut.cz>"
+!
+
+dmNodeName: nodeId
+    ^ self shouldImplement.
+
+    "Created: / 19-04-2009 / 17:54:57 / Jan Kurs <kursj1@fel.cvut.cz>"
+!
+
+dmParent: nodeId
+    ^ self shouldImplement.
+
+    "Created: / 19-04-2009 / 17:55:01 / Jan Kurs <kursj1@fel.cvut.cz>"
+!
+
+dmStringValue: nodeId
+    ^ self shouldImplement.
+
+    "Created: / 19-04-2009 / 17:55:07 / Jan Kurs <kursj1@fel.cvut.cz>"
+!
+
+dmTypeName: nodeId
+    ^ self shouldImplement.
+
+    "Created: / 19-04-2009 / 17:52:37 / Jan Kurs <kursj1@fel.cvut.cz>"
+!
+
+dmTypedValue: nodeId
+    ^ self shouldImplement.
+
+    "Created: / 19-04-2009 / 17:55:14 / Jan Kurs <kursj1@fel.cvut.cz>"
+!
+
+dmUnparsedEntityPublicId: nodeId
+    ^ self shouldImplement.
+
+    "Created: / 19-04-2009 / 17:55:21 / Jan Kurs <kursj1@fel.cvut.cz>"
+!
+
+dmUnparsedEntitySystemId: nodeId
+    ^ self shouldImplement.
+
+    "Created: / 19-04-2009 / 17:55:26 / Jan Kurs <kursj1@fel.cvut.cz>"
+! !
+
+!XDMAdaptor methodsFor:'xpath accessing'!
+
+xpathDocument
+    "
+        Returns a Document node ID
+    "
+
+    self ensureNotReleased.
+    ^document
+
+    "Created: / 18-10-2006 / 15:25:31 / janfrog"
+    "Modified: / 24-10-2006 / 12:01:32 / janfrog"
+    "Modified: / 07-10-2009 / 12:34:24 / Jan Kurs <kursj1@fel.cvut.cz>"
+!
+
+xpathDocumentURI
+    self shouldNeverBeSent.
+
+    "
+        Returns a Document URI
+    "
+
+    self ensureNotReleased.
+    ^documentURI
+
+    "Created: / 20-09-2007 / 12:48:48 / janfrog"
+    "Modified: / 07-10-2009 / 12:32:35 / Jan Kurs <kursj1@fel.cvut.cz>"
+! !
+
+!XDMAdaptor class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id$'
+! !