PolicyCmptType hausratVertragstypFromInstance = IpsModel.getPolicyCmptType(hausratVertrag);
PolicyCmptType hausratVertragstypFromClass = IpsModel.getPolicyCmptType(HausratVertrag.class);
Faktor-IPS Metamodell: Modellinformationen zur Runtime
Für die Umsetzung generischer Funktionen werden oft Informationen über die Modellstruktur zur Laufzeit benötigt. Diese Informationen können über das sogenannte „Faktor-IPS Metamodell“ abgefragt werden.
Das Faktor-IPS Metamodell ist Faktor-IPS‘ Pendant zu Javas Reflection API. Es besteht aus Klassen, die Modellelementen entsprechen und Auskunft über das entsprechende Modellelement geben.
Modelelement | Allgemein | Vertragsteilklasse | Produktklasse |
---|---|---|---|
Typen |
Type |
PolicyCmptType |
ProductCmptType |
Attribute |
Attribute |
PolicyAttribute |
ProductAttribute |
Beziehungen |
Association |
PolicyAssociation |
ProductAssociation |
Tabellenstrukturen |
TableStructure, TableColumn |
TableUsage |
|
Aufzählungstypen |
EnumType, EnumAttribute |
Als Einstiegspunkt bietet die zentrale Klasse org.faktorips.runtime.model.IpsModel Methoden an, um ein Metamodelobjekt aus einer Modellklasse bzw. aus einem Runtimeobjekt zu ermitteln.
Typen, Attribute und Beziehungen
Das Metamodell ist in die einzelnen Arten von Objekten unterteilt, wie sie auch in Faktor-IPS angelegt werden können.
Typen
Type, PolicyCmptType und ProductCmptType geben Auskunft über allgemeine Informationen vom Typ, z.B. der Supertyp, oder ob eine Vertragsteilklasse (PolicyCmptType) durch eine Produktbausteinklasse konfiguriert wird. Darüber hinaus kann man von hier aus zu den Metamodellklassen der Attribute sowie Beziehungen (Association) navigieren. Bei ProductCmptType kann man zusätzlich die Tabellenverwendungen (TableUsage) abfragen. Mit diesen Klassen kann man wiederum Zugriffs-Methoden von Attributen, Beziehungen und Tabellen generisch aufrufen.
Attribute
Ein Policy-/ProductAttribute kann den Wert des Attributs von einem konkreten Vertragsobjekt (IModelObject) oder Produkt (IProductComponent) holen und setzen.
Zusätzlich kann PolicyAttribute:
-
den im Produkt definierten Vorbelegungswert abfragen
-
die in einem Vertragsobjekt definierten erlaubte Wertemenge abfragen
Association
Policy- und ProductAssociation ermöglichen das Abfragen der Informationen über eine Vertrags- bzw. Produktbeziehung, z.B. die Kardinalität, den Namen, oder ob es sich um eine abgeleitete Vereinigung handelt. Zusätzlich bieten PolicyAssiciation und ProductAssociation Methoden an, um Zielobjekte der Beziehung eines konkreten Laufzeitobjekts abzufragen, zu entfernen, und neu hinzuzufügen.
TableUsage
Mit einer TableUsage ist es möglich zu der eingestellten Tabellenstruktur zu navigieren sowie die verwendete Tabelle eines ProductComponents abzufragen.
Codebeispiel
// Modellinformationen für hausratVertrag ermitteln
PolicyCmptType policyCmptTypeVertrag = IpsModel.getPolicyCmptType(hausratVertrag);
// Modellinformationen zur Beziehung "GrundDeckung" ermitteln
PolicyAssociation associationGrundDeckung = policyCmptTypeVertrag.getAssociation("GrundDeckung");
// Die Assoziation zur Ermittlung des von hausratVertrag referenzierten Deckungsobjekts verwenden
IModelObject grundDeckung = associationGrundDeckung.getTargetObjects(hausratVertrag).get(0);
// Modellinformationen zur verknüpften Deckung ermitteln
PolicyCmptType policyCmptTypeDeckung = associationGrundDeckung.getTarget();
// Modellinformationen zum Attribut "Versicherungssumme" ermitteln
PolicyAttribute attributeVersicherungssumme = policyCmptTypeDeckung.getAttribute("Versicherungssumme");
// Aktuellen Wert, Vorbelegungs-Wert und Wertemenge der Versicherungssumme an grundDeckung ermitteln
Object value = attributeVersicherungssumme.getValue(grundDeckung);
Object defaultValue = attributeVersicherungssumme.getDefaultValue(hausratVertrag);
ValueSet<?> valueSet = attributeVersicherungssumme.getValueSet(grundDeckung, new ValidationContext());
Tabellenstruktur
Analog zu den Typen kann mit einem Table-Objekt (oder der Klasse) von org.faktorips.runtime.model.IpsModel#getTableStructure
ein TableStructure ermittelt werden. Neben allgemeinen Informationen zur Tabelle gibt dieses Auskunft über die Namen und Datentypen der Spalten sowie generischen Zugriff auf die Werte einer konkreten Tabellen.
Aufzählungstypen
Mit einem Aufzählungswert oder einer Aufzählungsklasse gibt org.faktorips.runtime.model.IpsModel#getEnumType
ein EnumType zurück. Der EnumType kann sowohl für erweiterbare als auch normale Enum-Typen erstellt werden. Er bietet Informationen zu den eingestellten Attributen, z.B. welches Attribut zur Identifikation bzw. zur Darstellung verwendet wird, und ermöglicht generischen Zugriff auf die entsprechenden Werte der Aufzählungen.
@Ips* Annotationen für das Faktor-IPS Metamodell
Das Metamodell bezieht seine Informationen nicht aus separaten Dateien sondern ließt den generierten Code. In diesem stecken alle notwendigen Informationen. Um die Methoden richtig zuzuordnen, generiert Faktor-IPS zusätzliche Annotationen (@Ips…). Beim Laden des Metamodells werden diese Annotationen im Code gelesen und entsprechend interpretiert. Die Annotationen erhöhen auch die Verständlichkeit des generierten Codes, da dem Leser direkt mitgeteilt wird, für welches Artefakt eine Methode generiert wurde.
Labels und Beschreibungen werden nicht als Annotationen geschrieben. Für die übersetzbaren Texte wird je verwendete Sprache eine Property-Datei generiert.