|
<< Click to Display Table of Contents >> Navigation: PUM - Modellierung und Codeerzeugung > Strukturen und Muster > SoftwarePackageList Structure |
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 ...
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
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
].