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

Metamodellklassen

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.

PolicyCmptType hausratVertragstypFromInstance = IpsModel.getPolicyCmptType(hausratVertrag);
PolicyCmptType hausratVertragstypFromClass = IpsModel.getPolicyCmptType(HausratVertrag.class);

Codebeispiel: Metamodell aus einer Modellklasse bzw. einem Runtimeobjekt 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überhinaus 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());

Tabellenstrukturen

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 dasFaktor-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.