11.07.2015 Aufrufe

ODL-Sprachkonstrukte und interaktive Benutzerschnittstelle - TUM

ODL-Sprachkonstrukte und interaktive Benutzerschnittstelle - TUM

ODL-Sprachkonstrukte und interaktive Benutzerschnittstelle - TUM

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

4.3 BEISPIELE VON <strong>ODL</strong>-ABFRAGEN 41Quellkomponente <strong>und</strong> eine Zielkomponente auswählt, werden alle Unterkomponenten, Kanäle,Ports <strong>und</strong> lokale Variablen der Zielkomponente in die Quellkomponente verschoben.Diese Formulierung ist nur auf Quellkomponenten anwendbar, die Unterkomponenten <strong>und</strong> keinenAutomaten besitzen (nach den Regeln des QUEST-Metamodells, darf eine Komponenteentweder Unterkomponenten zur Beschreibung der Struktur oder einen Automaten zur Beschreibungdes Verhaltens besitzen).Nun wollen wir noch ein komplexeres Beispiel präsentieren. Die folgende <strong>ODL</strong>-Abfrage erstellteine neue Zwischenkomponente <strong>und</strong> fügt sie in das vom Benutzer ausgewählte Kanalbündel ein, wobeijedes Kanal aus dem Bündel durch zwei neue Kanäle ersetzt wird, welche die Ports des ersetztenKanals mit neuen Ports der eingefügten Komponente verbindet:/* Hauptkomponente auswählen */context mainComponent:Component./* Kanalbündel aus der Hauptkomponenten auswählen */context channelB<strong>und</strong>le:set element(mainComponent.Channels)./* Den Namen für die neue Zwischenkomponente eingeben */context midCompName:String./* Zwischenkomponente in der Hauptkomponente erstellen */new midComp:Component.(result has Name( midComp, midCompName) andresult has SubComponents( mainComponent, midComp ) and/* Alle Kanäle aus dem ausgewählten Kanalbündel auftrennen <strong>und</strong>durch die Zwischenkomponente "durchleiten" */forall channel:element channelB<strong>und</strong>le.(/* Eingangs- <strong>und</strong> Ausgangsport des Kanals merken */exists chPorts:(in:{ p:element( channel.DestinationPort.Component.Ports ) |is DestinationPort( channel, p )},out:{ p:element( channel.SourcePort.Component.Ports ) |is SourcePort( channel, p ) } ).(/* Kanal löschen */result not has Channels( mainComponent, channel ) andresult not has OutChannels( chPorts.out, channel ) andresult not has InChannel( chPorts.in, channel ) and/* Eingangsport in der Zwischekomponente erstellen */new inPort:Port.(result has Name( inPort, channel.Name ) andresult has Type( inPort, channel.Type ) andresult has Direction( inPort, chPorts.in.Direction ) andresult has Ports( midComp, inPort ) and/* Kanal zwischen dem Ausgangsport des gelöschten Kanals <strong>und</strong>dem neuen Eingangsport erstellen */new inChannel:Channel.(result has Name( inChannel, channel.SourcePort.Name ) andresult has Type( inChannel, channel.Type ) andresult has SourcePort( inChannel, chPorts.out ) andresult has DestinationPort( inChannel, inPort ) andresult has OutChannels( chPorts.out, inChannel ) andresult has InChannel( inPort, inChannel ) andresult has Channels( mainComponent, inChannel ))) and/* Ausgangsport in der Zwischekomponente erstellen */

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!