'From VisualWorks® NonCommercial, Release 5i.4 of August 9, 2001 on June 13, 2002 at 12:27:02 pm'! !CormasNS.Kernel.Converter2001To2002 class methodsFor: 'convertTo2002'! convertModel: aModelName for: cormas2002 | stFileName modelNameSpace | Cursor wait showWhile:[ stFileName := (Cormas modelPath: aModelName asSymbol) construct: (aModelName , '.st'). "1- Changement de nom des superclasses, au niveau du fichier .st" (self convertSTFileTo2002: stFileName) isNil ifTrue: [^nil]. "2- Création des classes Entity vides, dans Smalltalk, pour pouvoir charger (fileIn) les classes du fichier" self defineTemporaryCormasEntityClasses. "3- Ajout NameSpace, les imports: private Smalltalk.* et private CormasNS.* et cree la Category" "shortModelName:= (Filename splitExtension: ((Filename splitPath:name)) last) first." modelNameSpace := self createSubNameSpace: aModelName. "4- FILE_IN" (stFileName asFilename withEncoding: #Source) fileIn. "5- On deplace les classes du model dans le bon nameSpace et on leur redefini leur superClasse" self moveClassesOfModel: aModelName toNameSpace: modelNameSpace helpedBy: cormas2002. "6- On supprime les classes vides crees en 2-" self removeTemporaryCormasEntityClasses.]! convertSTFileTo2002: fileName | contents upgradeDictionary index stream oldVersion oldVersionFileName firstPart secundPart | "fileName : = chemin complet du fichier." "1- on copie le fichier model.st en model2001.st" oldVersion := fileName directory construct: ((fileName tail tokensBasedOn: $.) first, '2001', fileName extension). oldVersion asFilename exists ifTrue: [Dialog warn: (UserMessage defaultString: 'Conversion already performed !! Just import it !!' key: #alreadyConverted). ^nil]. Dialog warn: (UserMessage defaultString: 'The previous version of your model will be renamed ' key: #previousVersion). oldVersionFileName := Dialog requestFileName: (UserMessage defaultString: 'Your previous version will be renamed as : ' key: #previousVersion) default: oldVersion version: #new. oldVersionFileName isEmpty ifTrue: [^nil]. "Sauvegarde du fichier avec son oldVersionFileName" fileName asFilename copyTo: oldVersionFileName asFilename. "2- on lit le contenu du fichier qu'on stock dans contents" contents := fileName asFilename readStream contents "asText". "3- On cree un dico des termes a REMPLACER. a completer en fonction de tous les changements de noms de methodes et de classes" "attention a ne pas oublier le blanc en fin de string du nouveau nom sous 2002. ex: upgradeDictionary at: 'ancien' put: 'nouveau ' " upgradeDictionary := Dictionary new. upgradeDictionary at: 'SpatialEntity_Element' put: 'SpatialEntityElement'; at: 'SpatialEntity_Aggregate' put: 'SpatialEntityAggregate'; at: 'SpatialEntity_Set_notConnex' put: 'SpatialEntityNotConnex'; at: 'SpatialEntity_CA' put: 'SpatialEntityCell'; at: 'SpatialEntity_Partition' put: 'SpatialEntityAggregate'; at: 'initCharts' put: 'initData'; at: 'initLocalCharts' put: 'initData'; at: 'initGlobalCharts' put: 'initData'; at: 'updateCharts:' put: 'updateData:'; at: 'updateLocalCharts:' put: 'updateData:'; at: 'updateGlobalCharts:' put: 'updateData:'; at: 'aggregate:' put: 'setAggregatesFrom:'; at: 'estObserve:' put: 'isObserved: '; at: 'estObserve' put: 'isObserved'; at: 'space' put: 'spaaaceModel'; "Attention a la boucle infernale !!" at: 'spaaaceModel' put: 'spaceModel'; at: 'colonne' put: 'column'; at: 'ligne' put: 'line'; at: 'connexitePatch' put: 'nbNeighbours'; at: 'Cormas_Model' put: 'CormasModel'; at: 'componentsE ' put: 'elementaryComponents '. upgradeDictionary keysAndValuesDo: [:k :v | index := contents findString: k startingAt: 1. [index ~= 0] whileTrue: [" !!!!!! 'changeFrom: index to: (index + k size) with:' v et k doivent etre de la meme taille" firstPart := contents copyFrom: 1 to: (index - 1). secundPart := contents copyFrom: (index + k size) to: (contents size). contents := firstPart, v, secundPart. index := contents findString: k startingAt: index]]. "4- Sauvegarde du fichier fileName.st avec les nouveaux termes" stream := fileName asFilename writeStream. stream nextPutAll: contents. stream close.! createSubNameSpace: aName "Creates and returns the NameSpace under CormasNS. aName : " ^CormasNS.Models defineNameSpace: aName asSymbol private: false imports: 'private Smalltalk.* private CormasNS.Kernel.*' category: aName , 'Category'! defineFromSuperClassObjectInSmalltalkNameSpace_Class: aString "aString or " Smalltalk defineClass: aString asSymbol superclass: #{Core.Object} indexedType: #none private: false instanceVariableNames: '' classInstanceVariableNames: '' imports: '' category: 'temporary'.! defineTemporaryCormasEntityClasses | entitiesClasses | entitiesClasses := Cormas allClassesInCategory: #'CormasKernel-Entities' fromNameSpace: CormasNS.Kernel. entitiesClasses addAll: (Cormas allClassesInCategory: #'CormasKernel-Communication' fromNameSpace: CormasNS.Kernel). entitiesClasses add: CormasModel. entitiesClasses do: [:aClass | self defineFromSuperClassObjectInSmalltalkNameSpace_Class: aClass name]! moveClassesOfModel: aModelName toNameSpace: aNameSpace helpedBy: cormas2002 | modelClasses nameClasses entitiesClasses | "1- selection des noms de classes dans Smalltalk, a partir de la category" nameClasses := Smalltalk organization listAtCategoryNamed: (Smalltalk at: aModelName asSymbol) category. "2- transformation des noms de classes en classes" modelClasses := OrderedCollection new. nameClasses do: [:aSymbol | modelClasses add: (Smalltalk at: aSymbol)]. "3- recuperation des classes de 'Entities' + Cormas_Model" entitiesClasses := Cormas allClassesInCategory: #'CormasKernel-Entities' fromNameSpace: CormasNS.Kernel. entitiesClasses addAll: (Cormas allClassesInCategory: #'CormasKernel-Communication' fromNameSpace: CormasNS.Kernel). entitiesClasses add: CormasModel. modelClasses := SystemUtils sortForLoading: modelClasses. entitiesClasses := SystemUtils sortForLoading: entitiesClasses. "4- On deplace les classes du modele dans le bon nameSpace et on leur re-assigne leur veritable super classe" modelClasses do: [:aClass | entitiesClasses do: [:superClass | aClass superclass name == superClass name ifTrue: [aClass assignSuperclass: superClass. aClass relocateTo: aNameSpace. aClass allSubclassesDo: [:c | c relocateTo: aNameSpace]]]]. "5- Les appels aux methodes des superclasses ne marchent pas. On fait donc un fileOut, on nettoie tout, puis on refait un fileIn..." cormas2002 currentModel: ((CormasNS.Models at: aModelName asSymbol) at: aModelName asSymbol). cormas2002 stFile. cormas2002 closeModel. modelClasses reverseDo: [:cls | cls removeFromSystem].! removeTemporaryCormasEntityClasses | entitiesClasses t | entitiesClasses := Cormas allClassesInCategory: #temporary fromNameSpace: Smalltalk. t := entitiesClasses size. (1 to: t) reverseDo: [:i | (entitiesClasses at: i) removeFromSystem]! !