Version 3.22.0

Neues in Version 3.22.0

Modelldefinition

@Since

Ist in der .ipsproject-Datei eine Version oder ein VersionProvider eingetragen kann für Elemente wie Attribute und Beziehungen im Modell angegeben werden, seit welcher Version sie enthalten sind. Dieser Wert wird auch als @Since-Javadoc-Tag in den generierten Code übernommen. Mit der Einführung des m2e-Plugins wurde dieser Mechanismus überarbeitet, so dass hierfür nur die unqualifizierte Versionsnummer vorbelegt wird. OSGI und Maven kennen beide Qualifier in ihren Versionen, die z.B. eine Entwicklungsversion (.qualifier bzw. -SNAPSHOT) oder eine Integration-Build-Nummer kennzeichnen. Für die @Since-Markierung ist aber die schließlich veröffentlichte Version ohne Qualifier interessanter.

Unterschiedliche Einstellungen für Generierung von Interfaces bei Maven-Dependencies zwischen Modellprojekten

Verwendet man Maven zur Pflege von Abhängigkeiten bei Faktor-IPS-Modellprojekten und hat nicht alle Projekte im Workspace kann Faktor-IPS nicht auf die Projekteinstellungen zugreifen und verwendet daher die Einstellungen des referenzierenden Projekts auch um z.B. zu ermitteln, wie ggf. Superklassen aus referenzierten Projekten heißen. Sind dort Einstellungen (generatePublishedInterfaces/generatorLocale/changesInTimeNamingConvention) abweichend gesetzt gibt es nun die Möglichkeit, diese in der Datei MANIFEST.MF mit anzugeben. Dokumentation dazu findet sich unter Faktor-IPS-Projekte als Maven-Dependencies.

Statisch produktdefinierte Validierungsregeln

Nachdem bereits länger Attribute, Beziehungen und Tabellen sowohl in Anpassungsstufen als auch „statisch“ in Produktbausteinen gepflegt werden können ziehen jetzt auch Validierungsregeln nach. Wenn diese über die Produktkonfiguration de-/aktivierbar sind kann jetzt gewählt werden, ob diese Einstellung im Zeitverlauf änderbar sein soll oder nicht. Dies ist besonders wichtig, wenn keine Anpassungsstufen verwendet werden, da in dieser Konstellation bisher die Validierungsregeln nicht produktkonfigurierbar gemacht werden konnten.

Produktdefinition

Sortierung von Produktbausteinen

Bei Produktbausteinen ist es teilweise sinnvoll diese, abweichend von einer alphabetischen Sortierung, fachlich motiviert zu ordnen. Diese Sortierung kann den Überblick über die Bausteine verbessern und hilft z.B. beim Hinzufügen in eine Beziehung per Drag&Drop um auch hier eine einheitliche Reihenfolge zu erhalten. Die Sortierung erfolgt über das Kontextmenü im Modell- oder Produktdefinitions-Explorer mit dem Eintrag „Sortierung ändern…“.

Der Dialog wurde vereinfacht und aufgeräumt um die größere Anzahl von Objekten sinnvoll sortieren zu können. Es wird nun anstatt der Baumdarstellung nur der Inhalt des aktuell selektierten Packages angezeigt. Durch Multiselekt können mehrere Einträge gleichzeitig verschoben werden, zusätzlich gibt es eine Drag&Drop Unterstützung.

Um die Sortierung beim Kopieren oder Umbenennen von Produkten nicht zu verlieren, wurden der Copy-WIzard und die Refactoring Unterstützung erweitert. Diese berücksichtigen nun ggf. vorhandene Sortierungen.

Erweiterungsmöglichkeit für den „Intelligenten Modus“ des Produktkopie-Wizards

Beim Kopieren umfangreicher Produkte kann es hilfreich sein, mit Wissen über das Modell Voreinstellungen zu treffen, welche Elemente kopiert und welche referenziert werden. Dazu kann in einem eigenen Plug-In, als Faktor-IPS Erweiterung, über den Extension Point org.faktorips.devtools.core.ui.deepCopyWizard eine Implementierung des IDeepCopySmartModeBehavior installiert werden.

Runtime

Verbesserung des IpsModel für Beziehungen

Die IpsModel-Klasse PolicyAssociation hat neue Methoden add/removeTargetObjects erhalten mit denen Beziehungen generisch bearbeitet werden können:
IpsModel.getPolicyCmptType(vertrag).getAssociation("deckungen").addTargetObjects(vertrag, grundDeckung, zusatzDeckung);

Eine Zusammenfassung der Möglichkeiten des generischen Zugriffs über das Meta-Modell bietet die neue Dokumentationsseite Faktor-IPS Metamodell: Modellinformationen zur Runtime, Details zu den Aufrufen können dem Javadoc entnommen werden.

Zu beachten ist auch, dass die Methode getDeclaredAttribute(String) jetzt eine IllegalArgumentException wirft, wenn das gesuchte Attribut nicht existiert. Dies war bisher bereits so dokumentiert, die Methode hatte allerdings fälschlicherweise null zurück gegeben.

Generierter Code

Eigene Basisklassen

Bisher leiteten die von Faktor-IPS generierten Vertrags- und Produktklassen immer direkt von AbstractModelObject bzw. ProductComponent ab, so dass es schwierig war, eigenen Code für alle Klassen einheitlich unterzubringen. Jetzt kann über die Code Generator Eigenschaften „Basisklasse für Vertragsklassen“ bzw. „Basisklasse für Produktklassen“ jeweils eine eigene Basisklasse eingestellt werden, die ihrerseits von AbstractModelObject bzw. ProductComponent ableiten muss.

Neue Basisklasse für JAXB-annotierte Vertragsklassen

Im Zuge der Einführung der Möglichkeit, eigene Basisklassen definieren zu können (s.o.) wurden die JAXB-Annotationen aus AbstractModelObject entfernt und in die neu davon abgeleitete Klasse AbstractJaxbModelObject verschoben, die vom Standardbuilder als Basisklasse verwendet wird wenn „JAXB-Support generieren“ ausgewählt und keine eigene Basisklasse für Vertragsklassen angegeben ist. Dabei wurde auch das bisherige Feld id zu jaxbId umbenannt, um ggf. Konflikte mit anderen IDs (z.B. für JPA) zu vermeiden. Der XML-Attributname bleibt unverändert object.id.

Copy-Support

Die Erzeugung von Kopien von Vertragsinstanzen wird auf kovariante Rückgabewerte umgestellt. Dies betrifft die Methoden newCopy() und newCopyInternal() in den generierten Vertragsklassen.

public IModelObject newCopy() {...} wird zu

public Vertrag newCopy() {...}

In Published Interfaces, falls vorhanden, kommt die Methodendeklaration newCopy() mit entsprechend speziellem Rückgabewert hinzu.

Für die konsistente Umstellung ist ein Clean-Build aller Projekte notwendig.

Erhalten manuell eingefügter Annotationen

Im Faktor-IPS Codegenerator gibt es eine neue Option um manuell hinzugefügte Annotationen im generierten Code zu behalten. Analog zu den „Zusätzlichen Annotations“ können Annotations angegeben werden, die im generiertem Code durch den Codegenerator nicht entfernt werden. So kann z.B. @Override an Methoden geschrieben werden, die aus eigenen nicht generierten Interfaces überschrieben werden. Es können mehrere Annotationen mit Semikolon getrennt angegeben werden.

ITable erhält Generics und getAllRows()

Das Interface ITable, auf dem alle generierten Tabellenklassen basieren, erhält (analog zur bisher schon generifizierten Basisklasse Table) einen Typ-Parameter, der die Klasse für eine einzelne Zeile der Tabelle festlegt. Damit kann die Methode List getAllRows(), die bisher lediglich in allen generierten Tabellenklassen angelegt wurde direkt in ITable definiert und in Table implementiert werden.

Code-Generator

Faktor-IPS verwendete bisher Xpand zur Generierung von Java-Code. Da dieses Framework nicht mehr gepflegt wird, wurde der Codegenerator auf das Nachfolgeprojekt Xtend umgestellt. Dadurch kann jetzt unter anderem auch die Codegenerierung einfacher debuggt werden. Sollten Sie eigene Codegeneratoren implementiert haben, können wir Sie gerne bei der Umstellung auf Xtend unterstützen.

Migration

Die Migration auf Version 3.22 aktualisiert die Einstellungen für den Codegenerator und fügt alle Defaultwerte sowie Beschreibungen in die .ipsproject Datei ein. Anschließend wird das ganze Projekt neu gebaut. Aufgrund der konfigurierbaren Basisklassen wird die Basisklasse von Vertragsteilklassen auf AbstractJaxbModelObject angepasst, wenn der JAXB Support aktiviert ist.

Im Zuge der Migration wird außerdem die nicht mehr verwendete Property javaProjectContainsClassesForDynamicDatatypes aus der .ipsproject Datei entfernt.

Neues Add-On

Viele Faktor-IPS-Nutzer verwalten auch ihre Faktor-IPS-Projekte mit Maven. Dabei traten bisher zwei Probleme auf:

  1. Beim Import von Maven-Projekten in Eclipse fehlte die IPS-Nature, so dass die .project-Datei eingecheckt oder die Nature nach einem Import von Hand hinzugefügt werden musste.
  2. Die Projektversion musste in pom.xml und .ipsproject doppelt gepflegt werden.

Beide Probleme können mit dem Faktor-IPS-m2e-Plugin gelöst werden:

  1. Die IPS-Nature wird automatisch hinzugefügt, wenn eine .ipsproject-Datei im Projekt liegt.
  2. Wird in der .ipsproject der Maven-Version-Provider gesetzt (<Version versionProvider="org.faktorips.maven.mavenVersionProvider"/>) so verwendet das Faktor-IPS-Projekt direkt die Version aus der pom.xml.

Das neue Addon kann über die p2 Update Site https://update.faktorzehn.org/faktorips/m2e installiert werden.

Release Notes – Faktor-IPS – Version 3.22.0

Bugs

  • Mehrere ExtensionProperties in der gleichen Definition erlauben (FIPS-824)
  • Komischer Kommentar im generierten Code (FIPS-4104)
  • Im Instanzen-Explorer funktioniert „Aufräumen – Unterschiede beheben“ nicht (FIPS-4701)
  • Definition eigener Datentypen mit Maven nicht möglich (FIPS-4800)
  • Notwendige @Override Annotationen im generierten Code erkennen (FIPS-5341)
  • Defaultvalue null reagiert auf „null“ in der Wertemenge (FIPS-5626)
  • Message.createCopy kopiert keine MessageMarker (FIPS-5660)
  • Getter für Beziehungen mit kleinem Namen bekommen kein CamelCase (FIPS-5673)
  • Synchronize Modifier im AbstractRuntimeRepositoryManager (FIPS-5694)
  • Nach dem Anlegen einer neuen Beziehung mit inverser Beziehung wird im Editor fälschlicher Weise ein Fehler angezeigt (FIPS-5705)
  • Root eines newCopy wird selbst nicht in copyMap gelegt (FIPS-5726)
  • Faktor-IPS cachet externe Ressourcen zu lang (FIPS-5747)
  • JavaDoc in generierten abstrakten Enum Klassen fehlt (FIPS-5773)
  • Fehler beim IPS Builder (FIPS-5780)
  • Neues Produkt ohne Template bekommt Template Icon (FIPS-5784)
  • Unterschiede Beheben stürzt ab (FIPS-5788)
  • Unterschiedliche Einstellungen für Generierung von Interfaces bei Maven-Dependencies zwischen Modellprojekten (FIPS-5804)
  • Kopierwizard wirft NPE wenn Package nicht gefunden wird (FIPS-5805)
  • Nullpointer during search with condition (FIPS-5812)
  • Fix Differences Probleme bei Vorlagen (FIPS-5825)
  • Code generieren mit JDK 9 nicht möglich (FIPS-5832)
  • TestCase(Type)Builder nutzt Builder-Einstellungen nur aus eigenem Projekt (FIPS-5839)
  • Bausteinvorlagen: irreführende Kennzeichnung für nicht in Vorlage enthaltenem Attribut eines Produktbausteines (FIPS-5867)
  • PolicyAttribute.getValueSet soll nicht zurück liefern (FIPS-5990)
  • SPIKE – Unterschiedliche Einstellungen für Generierung von Interfaces bei Maven-Dependencies zwischen Modellprojekten (FIPS-6027)
  • Vergleich zweier Bausteine mit gleichem Enum zeigt unterschiede (FIPS-6038)
  • Fix für FIPS-5867: NPE beim öffnen des Bausteineditors ohne Template (FIPS-6040)
  • Type.getDeclaredAssociation(String) soll eine IllegalArgumentException werfen, wenn keine Association gefunden wird (FIPS-5744)

New Features

  • Fachbereich wünscht Sortierreihenfolge für Produktbausteine (FIPS-2823)
  • Projekt Version automatisch aus der pom.xml lesen: MavenVersionProvider (FIPS-3985)

Tasks

Improvements

  • Als Benutzer möchte ich sehen, ob die ausgelöste Operation „Unterschiede beheben“ gestartet wurde (FIPS-3747)
  • Überschreibung von Beziehungen auch nur auf Produktseite ermöglichen (FIPS-4966)
  • Angabe von Basis-Klassen für ModelObjects und ProductComponents. (FIPS-5280)
  • Validierungsregeln ohne Änderung im Zeitablauf (Anpassungsstufen) (FIPS-5361)
  • Im generierten Code covariant (kovariante) Returntypes verwenden (FIPS-5385)
  • Erweiterung IpsModel um diverse Methoden (FIPS-5470)
  • Verbesserter Smart Mode beim kopieren von Produkten (Deep Copy Wizard) (FIPS-5480)
  • Fehlermeldung für fehlende Datentypen verbessern (FIPS-5622)
  • Fehler im Javadoc für qualifizierte Beziehungen (FIPS-5755)
  • org.faktorips.runtime.model.type.Attribute.getDatatype() sollte keine ClassNotFoundException werfen (FIPS-5795)
  • Ertüchtigung Copy-Wizard („Copie Product…“) (FIPS-5863)
  • Aus ITable Objekt kann man die Tabellenzeilen ohne Reflection nicht auslesen (FIPS-5877)
  • Faktor-IPS Codegenerator mit Xtend (FIPS-5933)
  • IpsProjectProperty javaProjectContainsClassesForDynamicDatatypes wird nicht mehr genutzt (FIPS-5957)
  • Message Builder nimmt Message als Parameter (FIPS-6061)
  • Dependencies aufräumen (FIPS-6086)