SoftwarePackageList Structure

<< Click to Display Table of Contents >>

Navigation:  PUM - Modellierung und Codeerzeugung > Strukturen und Muster >

SoftwarePackageList Structure

Beschreibung

Diese Struktur ermöglicht die Abfrage von installierten Software Packages im aktuellen Program. I.d.R. sind Monticello Packages Basis für diese Information, aber das muß nicht so sein - der Entwickler entscheidet.

Name des Software Package

Version des Software packages

Die API-Informationen werden über eine CRUD-Struktur ermittelt - wobei nur der (R)read-Teil zu implementieren ist ...

Beispielimplementierung

Anbei eine Beispielimplementierung des READ-Calls (in Smalltalk):

 

apiSystemSoftwarePackageListRead: aTSTAPIPRSoftwarePackageListStore options: aMSKRestCallOptions

 

 | aTSTAPILicenseInfo totalAPISoftwarePackage sortedTotalAPISoftwarePackage selectedAPISoftwarePackage |

 

  "

   Der Parameter aTSTAPIPRLicenseListStore wird nicht wirklich benötigt - aber man 

   kann sich vorstellen, den Call später zu parametrisieren. Außerdem benötigt man 

   den Parameter als Paging-Information

  "

 

 

  "

   Wir checken ggfs. ob der Benutzer den Call überhaupt machen darf ... der

   eigentliche Check muss entsprechend kodiert werden: isAllowedToRetrieveSoftwarePackagesInfo

  "

  aMSKRestCallOptions getUser isAllowedToRetrieveSoftwarePackagesInfo

    ifFalse:[

      "Wir nutzen die vordefinierte Access Denied Exception"

      TSTEnumErrorDefinition errCodeAccessDeniedThrowSignal: aMSKRestCallOptions 

    ].

 

  "

   In allen PageRequests gibt es die folgende Reihenfolgen

 

     a) Ermittlung der Komplettmenge

     b) Filterung der Komplettmenge

     c) Sortierung der Komplettmenge

     d) Eventuelles Paging ausführen

 

   Dieses Beispiel ist besonders, denn die Rückgabeobjekte werden nicht von persistenten

   Objekten abgeleitet. Daher entfällt hier das Filtern. Die Sortierung muss manuell

   vorgenommen werden

  "

 

  "

    Zuerst die komplette Menge erstellen. Hier wird das manuell zusammengestellt - hier

    könnte man auch die Sortierung direkt mit einbinden ...

  "

  totalAPISoftwarePackage := OrderedCollection new.

 

  totalAPISoftwarePackage

    add: ((TSTAPISoftwarePackage newInitialized setAllAttributesToNil)

             setName: '_GessCATIProject'

             setVersion: 'GessCATIProject-MSK.1000074078';

             yourself).

 

  "

    Wir könnten nun noch sortieren ... um einheitliche Rückgabelisten zu erzwingen

  "   

  sortedTotalAPISoftwarePackage := SortedCollection sortBlock: [ :a :b | a getName < b getName ].

  sortedTotalAPISoftwarePackage addAll: totalAPISoftwarePackage.

 

  "

    Und dann noch ggfs. Paging

  "

  selectedAPISoftwarePackage := sortedTotalAPISoftwarePackage 

                              mskRestStart: aTSTAPIPRSoftwarePackageListStore getStart 

                              limit: aTSTAPIPRSoftwarePackageListStore getLimit 

                              page: aTSTAPIPRSoftwarePackageListStore getPage.

   

  "Wir bauen die Rückgabestruktur zusammen"

  ^(self restAnswerClass 

      okRequestFor: aMSKRestCallOptions restCallInstance 

      result:  (TSTAPISoftwarePackageListStoreRL withAPIList: selectedAPISoftwarePackage total: totalAPISoftwarePackage)) 

     "Wir ändern keine Daten - daher kann man auf ein Commit verzichten, und einfach ein Abort erzwingen"         

     successWithoutCommitCall;

     yourself

 

 

Weitere Codebeispiele

Ermittlung aller vorhanden Software Packages (Snippet):

 

PackageOrganizer default packages do:[ :aPackageInfo |

  |  versionString packageName newInstance |

 

  "Die Liste der Packages soll immer sortiert erscheinen"

  packageInfos := SortedCollection sortBlock: [ :a :b | a getName <  b getName ].

 

  "Meine Packages mit meinem eigenen Code führe ich hieer in einer Liste auf"

  myPackageNames := #( 'GessCATIProject' 'GessCATIProjectExtension' 'GessCATIProjectREST' 'GessCATIProjectInfluxDB'  ).

 

  versionString := aPackageInfo isNil ifTrue:[ 'Not Loaded' ] ifFalse:[ aPackageInfo versionString ].

  "Bei den eigenen Packages packe ich noch ein '_' vor den Namen - dadurch erscheinen sie am Anfang der List"

  packageName := ((myPackageNames includes: aPackageInfo name) ifTrue:[ '_' ] ifFalse:[ '' ]), aPackageInfo name.

 

  newInstance := TSTAPISoftwarePackage newInitialized setAllAttributesToNil.

  newInstance

    setName: packageName asUnicodeString ;

    setVersion: versionString asUnicodeString.

 

  packageInfos add: newInstance

].