--- /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$'
+! !