xquery/trunk/XQuery__AtomicItem.st
changeset 241 e28ef0f20186
child 245 160204fa510e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/xquery/trunk/XQuery__AtomicItem.st	Wed Apr 07 12:37:26 2010 +0000
@@ -0,0 +1,414 @@
+"{ Package: 'stx:goodies/xmlsuite/xquery' }"
+
+"{ NameSpace: XQuery }"
+
+Object subclass:#AtomicItem
+	instanceVariableNames:'nodeId typeName'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'XQuery-Sequence'
+!
+
+
+!AtomicItem class methodsFor:'instance creation'!
+
+withBoolean: boolean
+    ^ self withValue: boolean asType: 'xs:boolean'.
+
+    "Created: / 21-03-2007 / 14:24:49 / janfrog"
+    "Modified: / 05-12-2007 / 15:58:58 / janfrog"
+    "Modified: / 05-10-2009 / 14:16:29 / Jan Kurs <kursj1@fel.cvut.cz>"
+!
+
+withNumber: number
+"/    ^ self withValue: number asType: 'xs:decimal'.
+    ^ (self withValue: number) asGuessedType.
+
+    "Created: / 21-03-2007 / 14:24:29 / janfrog"
+    "Modified: / 05-12-2007 / 15:21:08 / janfrog"
+    "Modified: / 05-10-2009 / 19:51:51 / Jan Kurs <kursj1@fel.cvut.cz>"
+!
+
+withString: string
+    ^ self withValue: string asType: 'xs:string'.
+
+    "Created: / 21-03-2007 / 15:45:27 / janfrog"
+    "Modified: / 05-12-2007 / 15:59:08 / janfrog"
+    "Modified: / 05-10-2009 / 14:16:38 / Jan Kurs <kursj1@fel.cvut.cz>"
+!
+
+withValue: value
+
+    ^ self createConstructedItem: value valueType: 'xs:untypedAtomic'.
+
+    "Created: / 05-10-2009 / 14:16:05 / Jan Kurs <kursj1@fel.cvut.cz>"
+!
+
+withValue: value asType: type
+    ^ self createConstructedItem: value valueType: type.
+
+    "Created: / 05-10-2009 / 14:16:21 / Jan Kurs <kursj1@fel.cvut.cz>"
+! !
+
+!AtomicItem class methodsFor:'private'!
+
+createConstructedItem: value valueType:valueType 
+    ^ self new
+        nodeId: value;
+        typeName: valueType;
+        yourself.
+
+    "Created: / 05-10-2009 / 14:31:28 / Jan Kurs <kursj1@fel.cvut.cz>"
+! !
+
+!AtomicItem methodsFor:'accessing'!
+
+nodeId
+    ^ nodeId
+!
+
+nodeId:something
+    nodeId := something.
+!
+
+typeName
+    ^ typeName
+!
+
+typeName:something
+    typeName := something.
+! !
+
+!AtomicItem methodsFor:'atomic type'!
+
+type
+    ^ self typeName
+
+    "Created: / 05-10-2009 / 18:35:19 / Jan Kurs <kursj1@fel.cvut.cz>"
+!
+
+value
+    ^ nodeId
+
+    "Created: / 05-10-2009 / 14:26:42 / Jan Kurs <kursj1@fel.cvut.cz>"
+!
+
+value: aValue
+    self nodeId: aValue
+
+    "Created: / 21-11-2009 / 20:02:20 / Jan Kurs <kursj1@fel.cvut.cz>"
+! !
+
+!AtomicItem methodsFor:'atomic value operations'!
+
+* anObject
+    self halt: 'deprecated??'.
+
+    (anObject class = self class) ifTrue: [
+        ^ self nodeId * anObject nodeId.
+    ] ifFalse: [
+        ^ self nodeId * anObject.
+    ]
+
+    "Created: / 05-10-2009 / 15:25:54 / Jan Kurs <kursj1@fel.cvut.cz>"
+    "Modified: / 09-11-2009 / 16:50:47 / Jan Kurs <kursj1@fel.cvut.cz>"
+!
+
++ anObject 
+    self halt: 'deprecated??'.
+    (anObject class = self class) ifTrue: [
+        ^ self nodeId + anObject nodeId.
+    ] ifFalse: [
+        ^ self nodeId + anObject.
+    ]
+
+    "Created: / 05-10-2009 / 15:25:54 / Jan Kurs <kursj1@fel.cvut.cz>"
+    "Modified: / 09-11-2009 / 16:47:14 / Jan Kurs <kursj1@fel.cvut.cz>"
+!
+
+- anObject 
+    self halt: 'deprecated??'.
+
+    (anObject class = self class) ifTrue: [
+        ^ self nodeId - anObject nodeId.
+    ] ifFalse: [
+        ^ self nodeId - anObject.
+    ]
+
+    "Created: / 05-10-2009 / 15:25:54 / Jan Kurs <kursj1@fel.cvut.cz>"
+    "Modified: / 09-11-2009 / 16:50:53 / Jan Kurs <kursj1@fel.cvut.cz>"
+!
+
+/ anObject 
+    self halt: 'deprecated??'.
+
+    (anObject class = self class) ifTrue: [
+        ^ self nodeId / anObject nodeId.
+    ] ifFalse: [
+        ^ self nodeId / anObject.
+    ]
+
+    "Created: / 05-10-2009 / 15:25:54 / Jan Kurs <kursj1@fel.cvut.cz>"
+    "Modified: / 09-11-2009 / 16:50:57 / Jan Kurs <kursj1@fel.cvut.cz>"
+!
+
+// anObject 
+    (anObject class = self class) ifTrue: [
+        ^ self nodeId // anObject nodeId.
+    ] ifFalse: [
+        ^ self nodeId // anObject.
+    ]
+
+    "Created: / 05-10-2009 / 15:50:45 / Jan Kurs <kursj1@fel.cvut.cz>"
+!
+
+< anObject 
+    (anObject class = self class) ifTrue: [
+        ^ self nodeId < anObject nodeId.
+    ] ifFalse: [
+        ^ self nodeId < anObject.
+    ]
+
+    "Created: / 05-10-2009 / 15:25:54 / Jan Kurs <kursj1@fel.cvut.cz>"
+!
+
+<= anObject 
+    (anObject class = self class) ifTrue: [
+        ^ self nodeId <= anObject nodeId.
+    ] ifFalse: [
+        ^ self nodeId <= anObject.
+    ]
+
+    "Created: / 05-10-2009 / 15:25:54 / Jan Kurs <kursj1@fel.cvut.cz>"
+!
+
+= anObject 
+    (anObject class = self class) ifTrue: [
+        ^ self nodeId = anObject nodeId.
+    ] ifFalse: [
+        ^ self nodeId = anObject.
+    ]
+
+    "Created: / 05-10-2009 / 15:25:54 / Jan Kurs <kursj1@fel.cvut.cz>"
+!
+
+> anObject 
+    (anObject class = self class) ifTrue: [
+        ^ self nodeId > anObject nodeId.
+    ] ifFalse: [
+        ^ self nodeId > anObject.
+    ]
+
+    "Created: / 05-10-2009 / 15:25:54 / Jan Kurs <kursj1@fel.cvut.cz>"
+!
+
+>= anObject 
+    (anObject class = self class) ifTrue: [
+        ^ self nodeId >= anObject nodeId.
+    ] ifFalse: [
+        ^ self nodeId >= anObject.
+    ]
+
+    "Created: / 05-10-2009 / 15:25:54 / Jan Kurs <kursj1@fel.cvut.cz>"
+!
+
+\\ anObject 
+    (anObject class = self class) ifTrue: [
+        ^ self nodeId \\ anObject nodeId.
+    ] ifFalse: [
+        ^ self nodeId \\ anObject.
+    ]
+
+    "Created: / 05-10-2009 / 16:05:05 / Jan Kurs <kursj1@fel.cvut.cz>"
+!
+
+~= anObject 
+    (anObject class = self class) ifTrue: [
+        ^ self nodeId ~= anObject nodeId.
+    ] ifFalse: [
+        ^ self nodeId ~= anObject.
+    ]
+
+    "Created: / 05-10-2009 / 14:01:58 / Jan Kurs <kursj1@fel.cvut.cz>"
+    "Modified: / 05-10-2009 / 15:36:04 / Jan Kurs <kursj1@fel.cvut.cz>"
+! !
+
+!AtomicItem methodsFor:'casting'!
+
+castAs: anotherTypeName
+    ^ CastingRules new cast: self to: anotherTypeName.
+
+    "Created: / 05-10-2009 / 17:28:26 / Jan Kurs <kursj1@fel.cvut.cz>"
+    "Modified: / 07-11-2009 / 22:43:38 / Jan Kurs <kursj1@fel.cvut.cz>"
+! !
+
+!AtomicItem methodsFor:'converting'!
+
+asDocumentFragment
+
+    | domBuilder |
+    domBuilder := XMLv2::DOM3Builder new.
+    XQueryResultXMLReader new
+            setContentHandler: domBuilder;
+            visit: self.
+    ^domBuilder document
+
+    "Modified: / 07-06-2009 / 21:26:33 / Jan Kurs <kursj1@fel.cvut.cz>"
+!
+
+asGuessedType
+    self messageNotUnderstoodSignal
+    handle:[:ex |
+        ^ self castAs: 'xs:untypedAtomic'.
+    ]
+    do:[
+    
+        self nodeId isString ifTrue: [ ^ self castAs: 'xs:string'].
+
+        self nodeId isNumber ifTrue: [ 
+            self nodeId isInteger ifTrue: [
+                ^ self castAs: 'xs:integer'
+            ].
+            ^ self castAs: 'xs:float'
+        ].
+
+        ^ self castAs: 'xs:untypedAtomic'.
+    ].
+
+    "Created: / 05-10-2009 / 18:58:09 / Jan Kurs <kursj1@fel.cvut.cz>"
+!
+
+asNumber
+
+    ^ self nodeId asNumber.
+
+    "Created: / 05-10-2009 / 14:41:50 / Jan Kurs <kursj1@fel.cvut.cz>"
+!
+
+asString
+
+    ^ self stringValue
+
+    "Created: / 05-10-2009 / 15:29:35 / Jan Kurs <kursj1@fel.cvut.cz>"
+    "Modified: / 24-10-2009 / 20:09:31 / Jan Kurs <kursj1@fel.cvut.cz>"
+!
+
+atomizedValue
+    ^ self
+
+    "Created: / 05-10-2009 / 15:57:18 / Jan Kurs <kursj1@fel.cvut.cz>"
+!
+
+doesNotUnderstand: aMessage
+    " just forward the message"
+    ^ aMessage sendTo: (self nodeId).
+
+    "Created: / 05-10-2009 / 14:55:14 / Jan Kurs <kursj1@fel.cvut.cz>"
+!
+
+stringValue
+    | datatype |
+    datatype := TypeFactory getType: self type.
+    ^ datatype toCanonicalLexicalForm: (self nodeId).
+
+"/    (nodeId class isSubclassOf: Number) ifTrue: [ ^ nodeId storeString].
+"/
+"/    ^ nodeId asString
+
+    "Created: / 05-10-2009 / 14:37:45 / Jan Kurs <kursj1@fel.cvut.cz>"
+    "Modified: / 24-10-2009 / 20:10:02 / Jan Kurs <kursj1@fel.cvut.cz>"
+! !
+
+!AtomicItem methodsFor:'error reporting'!
+
+raiseError: errorType
+    AtomicItemError raiseErrorString: 'Error no.: ', errorType.
+
+    "Created: / 05-10-2009 / 17:20:46 / Jan Kurs <kursj1@fel.cvut.cz>"
+    "Modified: / 24-10-2009 / 16:14:30 / Jan Kurs <kursj1@fel.cvut.cz>"
+!
+
+raiseError: errorType withMessage: message
+    AtomicItemError raiseErrorString: message, ' Error no.: ', errorType.
+
+    "Created: / 05-10-2009 / 17:21:52 / Jan Kurs <kursj1@fel.cvut.cz>"
+    "Modified: / 24-10-2009 / 16:14:25 / Jan Kurs <kursj1@fel.cvut.cz>"
+! !
+
+!AtomicItem methodsFor:'item changing - appending'!
+
+appendInto:parentElement 
+    parentElement appendAtomicValue: self.
+
+    "Created: / 05-10-2009 / 16:10:56 / Jan Kurs <kursj1@fel.cvut.cz>"
+! !
+
+!AtomicItem methodsFor:'printing'!
+
+printOn:aStream 
+    self value printOn: aStream.
+    aStream nextPut:$[.
+    self type printOn:aStream.
+    aStream nextPut:$].
+    aStream nextPut:$ .
+    aStream nextPut:$-.
+    aStream nextPut:$ .
+    super printOn:aStream.
+
+    "Created: / 14-02-2007 / 00:03:56 / janfrog"
+    "Modified: / 05-10-2009 / 19:36:23 / Jan Kurs <kursj1@fel.cvut.cz>"
+! !
+
+!AtomicItem methodsFor:'testing'!
+
+isAtomicValue
+    ^ true
+
+    "Created: / 05-10-2009 / 14:11:14 / Jan Kurs <kursj1@fel.cvut.cz>"
+!
+
+isNode
+    ^ false
+
+    "Created: / 05-10-2009 / 14:11:09 / Jan Kurs <kursj1@fel.cvut.cz>"
+!
+
+isSequenceItem
+    ^ true
+
+    "Created: / 05-10-2009 / 14:11:01 / Jan Kurs <kursj1@fel.cvut.cz>"
+!
+
+isSubtypeOf: anotherTypeName
+    ^ TypeFactory isType: self typeName subtypeOf: anotherTypeName.
+
+    "Created: / 05-10-2009 / 14:11:35 / Jan Kurs <kursj1@fel.cvut.cz>"
+    "Modified: / 07-11-2009 / 23:50:35 / Jan Kurs <kursj1@fel.cvut.cz>"
+!
+
+isSubtypeOf: anotherTypeName or: anotherTypeName2
+    ^ (TypeFactory isType: self typeName subtypeOf: anotherTypeName)
+      or: [(TypeFactory isType: self typeName subtypeOf: anotherTypeName2)]
+
+    "Created: / 15-10-2009 / 15:59:56 / Jan Kurs <kursj1@fel.cvut.cz>"
+!
+
+isSubtypeOf: anotherTypeName or: anotherTypeName2 or: anotherTypeName3
+    ^ (TypeFactory isType: self typeName subtypeOf: anotherTypeName)
+      or: [(TypeFactory isType: self typeName subtypeOf: anotherTypeName2)]
+      or: [(TypeFactory isType: self typeName subtypeOf: anotherTypeName3)]
+
+    "Created: / 15-10-2009 / 16:00:44 / Jan Kurs <kursj1@fel.cvut.cz>"
+!
+
+isType: anotherTypeName
+    ^ self typeName = anotherTypeName.
+
+    "Created: / 05-10-2009 / 17:24:50 / Jan Kurs <kursj1@fel.cvut.cz>"
+! !
+
+!AtomicItem class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id$'
+! !