MCMczReader.st
author Claus Gittinger <cg@exept.de>
Sat, 20 Aug 2011 14:21:20 +0200
changeset 307 a3f30c59b670
parent 208 0682c2d1c787
child 483 58521a30b56f
permissions -rw-r--r--
initial checkin

"{ 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:'as yet unclassified'!

associate: tokens

    ^MCLazyPropertyDictionary withTokens: tokens.        

        "
        | result |
        result := Dictionary new.
        tokens pairWiseDo: [:key :value | 
                                        | tmp |
                                        tmp := value.
                                        value isString ifFalse: [tmp := value collect: [:ea | self associate: ea]].
                                        value = 'nil' ifTrue: [tmp := ''].
                                        result at: key put: tmp].
        ^ result
        "

    "Modified: / 28-10-2010 / 15:25:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

extractDefinitionsFrom: member
        | reader rc |
        (rc := (MCSnapshotReader readerClassForFileNamed: member fileName))
                ifNotNil: 
                    [ reader := rc on: (self zip contentsOf: member fileName).
                    definitions addAll: reader definitions]

    "Modified: / 11-09-2010 / 21:50:47 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

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:
                [MCLazyVersionInfo withProperties: dict]
                "
                [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 ifAbsent:#()) collect: [:ea | self extractInfoFrom: ea])
                        stepChildren: ((dict at: #stepChildren ifAbsent: [#()]) collect: [:ea | self extractInfoFrom: ea])]
                "

    "Modified: / 28-10-2010 / 17:53:13 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

infoCache
	^ infoCache ifNil: [infoCache := Dictionary new]
!

loadDefinitions
        definitions := OrderedCollection new.
        (self zip isValidPath: 'snapshot.bin') ifNotNil:
                [ [^ definitions := (DataStream on: (self zip contentsOf: 'snapshot.bin') asByteArray readStream) next definitions]
                        on: Error do: [:fallThrough|self halt ]].
        "otherwise"
        "
        self breakPoint:#jv.
        (self zip membersMatching: 'snapshot/*')
                do: [:m | self extractDefinitionsFrom: m].
        "

    "Modified: / 14-09-2010 / 21:22:25 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

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.4 2011-08-20 12:21:20 cg Exp $'
!

version_CVS
    ^ '$Header: /cvs/stx/stx/goodies/monticello/MCMczReader.st,v 1.4 2011-08-20 12:21:20 cg Exp $'
!

version_SVN
    ^ '§Id: MCMczReader.st 23 2010-10-29 14:41:24Z vranyj1 §'
! !