MCMczReader.st
changeset 32 1bd0dbe2a6c7
child 141 0f1d8459da84
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MCMczReader.st	Wed Nov 22 14:05:02 2006 +0100
@@ -0,0 +1,119 @@
+"{ Package: 'stx:goodies/monticello' }"
+
+MCVersionReader subclass:#MCMczReader
+	instanceVariableNames:'zip infoCache'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Monticello-Storing'
+!
+
+
+!MCMczReader class methodsFor:'accessing'!
+
+extension
+	^ 'mcz'
+! !
+
+!MCMczReader class methodsFor:'testing'!
+
+supportsDependencies
+	^ true
+!
+
+supportsVersions
+	^ true
+! !
+
+!MCMczReader methodsFor:'*monticello'!
+
+associate: tokens
+        | result |
+        result _ Dictionary new.
+        tokens pairsDo: [:key :valueArg | |value|
+                                        value := valueArg.        
+                                        value isString ifFalse: [value _ value collect: [:ea | self associate: ea]].
+                                        result at: key put: value].
+        ^ result
+
+    "Created: / 16-11-2006 / 16:39:45 / cg"
+! !
+
+!MCMczReader methodsFor:'as yet unclassified'!
+
+extractDefinitionsFrom: member
+	| reader |
+	(MCSnapshotReader readerClassForFileNamed: member fileName)
+		ifNotNilDo: [:rc | reader _ rc on: member contentStream text.
+					definitions addAll: reader definitions]
+!
+
+extractDependencyFrom: zipMember
+	^ MCVersionDependency
+		package: (MCPackage named: (zipMember fileName copyAfterLast: $/))
+		info: (self extractInfoFrom: (self parseMember: zipMember fileName))
+!
+
+extractInfoFrom: dict
+	^ self infoCache at: (dict at: #id) ifAbsentPut:
+		[MCVersionInfo
+			name: (dict at: #name ifAbsent: [''])
+			id: (UUID fromString: (dict at: #id))
+			message: (dict at: #message ifAbsent: [''])
+			date: ([Date fromString: (dict at: #date) ] on: Error do: [ :ex | ex return: nil ])
+			time: ([ Time fromString:(dict at: #time)] on: Error do: [ :ex | ex return: nil ])
+			author: (dict at: #author ifAbsent: [''])
+			ancestors: ((dict at: #ancestors) collect: [:ea | self extractInfoFrom: ea])
+			stepChildren: ((dict at: #stepChildren ifAbsent: [#()]) collect: [:ea | self extractInfoFrom: ea])]
+!
+
+infoCache
+	^ infoCache ifNil: [infoCache _ Dictionary new]
+!
+
+loadDefinitions
+	definitions _ OrderedCollection new.
+	(self zip memberNamed: 'snapshot.bin') ifNotNilDo:
+		[:m | [^ definitions _ (DataStream on: m contentStream) next definitions]
+			on: Error do: [:fallThrough ]].
+	"otherwise"
+	(self zip membersMatching: 'snapshot/*')
+		do: [:m | self extractDefinitionsFrom: m].
+!
+
+loadDependencies
+	dependencies _ (self zip membersMatching: 'dependencies/*') collect: [:m | self extractDependencyFrom: m].
+	dependencies _ dependencies asArray.
+!
+
+loadPackage
+	| dict |
+	dict _ self parseMember: 'package'.
+	package _ MCPackage named: (dict at: #name)
+!
+
+loadVersionInfo
+	info _ self extractInfoFrom: (self parseMember: 'version')
+!
+
+parseMember: fileName
+	| tokens |
+	tokens _ (self scanner scanTokens: (self zip contentsOf: fileName)) first.
+	^ self associate: tokens
+!
+
+scanner
+	^ MCScanner
+!
+
+zip
+	zip ifNil:
+		[zip _ ZipArchive new.
+		zip readFrom: stream].
+	^ zip
+! !
+
+!MCMczReader class methodsFor:'documentation'!
+
+version
+    ^ '$Header: /cvs/stx/stx/goodies/monticello/MCMczReader.st,v 1.1 2006-11-22 13:05:02 cg Exp $'
+! !