Version 19.12

Neues in Version 19.12

Ant-Task für HTML-Export

Jetzt ist es möglich, den HTML-Export auch über einen Ant-Task aufzurufen. Die Konfiguration in XML kann wie im folgenden Beispiel erfolgen:

<faktorips.exportHtml ipsProjectName="org.faktorips.integrationtest.java5" showValidationErrors="true" showInheritedObjectPartsInTable="true" locale="de"
destination="C:\faktorips.integrationtest\target\html\org.faktorips.integrationtest.java5" ipsObjectTypes="ALL" />

Exception bei nicht-existenten Enum-Werten

Beim Laden von Produktbausteinen in Formeln und weiteren Situationen greift Faktor-IPS intern auf Enum-Werte im Repository zu. Existieren die referenzierten Enum-Werte nicht, wird jetzt eine IllegalArgumentException geworfen. Am eigenen Code müssen dafür keine Änderungen vorgenommen werden. Diese Änderung dient der frühstmöglichen Erkennung von Konfigurationsfehlern – treten also jetzt entsprechende Exceptions auf, deuten sie auf fehlerhaft verwendete Enums hin, z.B. Enum Inhalte, die in einem anderen Repository liegen. Der genaue Grund kann der Exception-Message entnommen werden. Auf eine richtige Konfiguration hat diese Änderung keine merkbaren Auswirkungen. Besonders mit in Tests handgeschriebenen Enum-Inhalten können jetzt Fehler auftreten, wo bisher der Wert für den Test nicht relevant war – er sollte dann einfach auf null gesetzt werden statt einen ungültigen Wert wie „ignored“ zu verwenden.

Neue Enum-Methoden getExistingValueBy...

Generierte Enums wurden um die Methoden getExistingValueBy... ergänzt. Sie funktionieren analog zu getValueBy..., werfen aber bei nicht-existenten Enum-Werten eine IllegalArgumentException. Die Verwendung der neuen Methoden wird empfohlen, um fehlende Werte möglichst früh aufzudecken.

Methodenargumente von Settern in Buildern werden umbenannt

Methodenargumente von Builder-Methoden, die dazu dienen den Attributwert zu setzen, werden nun mit einem Prefix „new“ versehen. Diese Änderung im generierten Code ist notwendig, falls ein Vertragstyp ein gleichnamiges Attribut hat. Ohne diese Anpassung würden sonst Compilefehler enstehen. Zum Beispiel wurde bei einem Vertragstyp „Nummernkreis“ mit einem Attribut „Nummernkreis“

public NummernkreisBuilder nummernkreis(String nummernkreis) {
    nummernkreis.setNummernkreis(nummernkreis);
    return this;
}

generiert. Mit der neuen Version wird stattdessen

public NummernkreisBuilder nummernkreis(String newNummernkreis) {
    nummernkreis.setNummernkreis(newNummernkreis);
    return this;
}

generiert um Namenskollisionen zu vermeiden.

Neue Annotationen im generierten Code

Zur Erweiterung des Laufzeitmodells wurden neue Annotationen eingeführt. Diese Annotationen werden im generierten Code für einen PolicyCmptType hinzugefügt, sofern dieser mindestens eine Regel hat.

Annotation Beschreibung Generiert für
@IpsValidationRules Enthält die Liste der Namen aller Regeln in der konfigurierten Reihenfolge, zum Beispiel:
@IpsValidationRules({ "rule1", "rule2" })
PolicyCmptType-Klasse bzw. Published Interface der PolicyCmptType-Klasse
@IpsValidationRule Enthält Informationen über eine Regel, zum Beispiel :
@IpsValidationRule(name = "ruleName", msgCode = MSG_CODE_RULE, severity = Severity.ERROR)
Alle Regelmethoden
@IpsConfiguredValidationRule Enthält Informationen über eine Regel, die von einem Produkt konfiguriert wird, zum Beispiel:
@IpsConfiguredValidationRule(changingOverTime = true, defaultActivated = true)
Methode für Regeln, die durch ein Produkt konfiguriert werden

 

Im Laufzeitmodell wurde die Klasse ValidationRule eingeführt, um eine Laufzeit-Repräsentation für Regeln in einem PolicyCmptType zu ermöglichen. Validierungsregeln können aus einem PolicyCmptType durch folgende neue Methoden abgerufen werden:

Methode Beschreibung
getDeclaredValidationRule(String) Gibt die Validierungsregel mit dem gegebenen Namen zurück. Nur die Klasse des PolicyCmptType wird durchsucht; im Supertyp definierte Regeln werden ignoriert.
getDeclaredValidationRule(int) Gibt die deklarierte Validierungsregel für den gegebenen Index zurück. Nur die Klasse des PolicyCmptType wird durchsucht; im Supertyp definierte Regeln werden ignoriert.
getDeclaredValidationRules() Gibt alle Validierungsregeln zurück, die in der Klasse des PolicyCmptType definiert wurden. Validierungsregeln der Superklasse werden ignoriert.
getValidationRule(String) Gibt die Validierungsregel mit dem gegebenen Namen zurück. Sowohl die Klasse des PolicyCmptType, als auch die Superklasse werden durchsucht.
getValidationRules() Gibt alle Validierungsregeln zurück, die in der Klasse des PolicyCmptType oder der Superklasse definiert wurden.

Faktor-IPS Design-Time-Tools auf Java 8 umgestellt

Zur Verwendung der Faktor-IPS-Plugins wird mindestens Java 8 benötigt. Runtime sowie generierter Code sind weiterhin Java 6 kompatibel. Im Code der Faktor-IPS-Plugins wurden bisher vorhandene funktionale Interfaces wie Function durch ihre Java-8-Pendants ersetzt. Eigene Plugins, die darauf aufbauen, müssen ggf. angepasst werden.

Kopieren von Runtime-IDs

Die Runtime-IDs von Produktbausteinen können jetzt aus Explorer-Kontextmenüs kopiert werden um, besonders bei mehreren Bausteinen, den umständlichen Weg auf den Einstellungen-Tab zu sparen:

Generische Datentypen mit CharSequence statt String

Definiert man Datentypen in der .ipsproject-Datei müssen die dafür verwendeten Klassen Methoden für „valueOf“ und (optional) „isParsable“ anbieten. Statt dort wie bisher String als Parametertyp zu verlangen genügt sich Faktor-IPS 19.12 mit der Superklasse CharSequence, was beispielsweise die Nutzung von java.time.Year als Datentyp erlaubt:

<Datatype id=“Year“ javaClass=“java.time.Year“ valueOfMethod=“parse“ />
Darüberhinaus werden die Methoden für „valueOf“ und „isParsable“ bereits beim Einlesen der .ipsproject-Datei auf passende Rückgabetypen geprüft um nicht erst bei der Codegenerierung Fehler zu erzeugen.

Generischer Parametertyp in ValueSet#contains

Zur Erhöhung der Typsicherheit verwendet ValueSet#contains(Object value) jetzt den entsprechenden Typparameter: ValueSet#contains(T value). Diese Änderung wirkt sich ebenfalls auf Implementierungen des Interfaces ValueSet aus. Unter Umständen sind Anpassungen am aufrufenden Code erforderlich, dabei ist besonders auf die Korrektheit der übergebenen Typen zu achten.

Snapshot-Versionen in der Product Release Extension

Über das neu hinzugefügte Feld versionMustChange kann eine Product Release Extension angeben, ob die vergangene Version wiederverwendet werden darf. Dies ist insbesondere dann nützlich, wenn die Extension mit gleichbleibenden Snapshotversionen benutzt werden soll.

Delta-Ermittlung für Assoziationen

Bisher wurden bei der Ermittlung von Unterschieden zwischen zwei Vertragsobjekten nur Kompositionen beachtet. Änderten sich Assoziationen, wurden diese Änderungen bisher ignoriert. Jetzt werden sie zusätzlich als Delta ausgegeben. Da in Assoziationen enthaltene Objekte auch über einen Kompositions-Pfad erreichbar sind werden gegebenenfalls unterhalb des Ziels auftretende Änderungen weiterhin nur unter dem Delta der Komposition aufgeführt. Sollen Assoziationen wie bisher ignoriert werden kann dies über die neue Methode IDeltaComputationOptions#ignoreAssociations() konfiguriert werden.

Am IModelObjectDelta kann nun über die Methode IModelObjectDelta#getAssociationKind() abgefragt werden, welche Art von Beziehung von der Änderung betroffen sind. Die möglichen Werte sind Association und Composition.

Verbesserte Wertebereiche

Der generierte Code für Wertebereiche und die Methoden zum generischen Zugriff darauf wurden verbessert, so dass nun:

  • auch für unbegrenzte Wertebereiche ohne Null eine Konstante und getSetOfAllowedValuesFor<property>-Methode generiert werden
  • die getValueSet-Methoden im Runtime-PolicyAttribute immer einen Wertebereich liefern. Ist keiner definiert ist dies ein UnrestrictedValueSet incl. Null.
  • das Runtime-PolicyAttribute auch getValue-Methoden ohne IValidationContext anbietet, die einen Default-ValidationContext erstellen – da dieser in den generierten Valueset-Methoden eh nicht genutzt wird
  • die getValue-Methoden auch ggf. von Hand geschriebene/angepasste, mit @IpsAllowedValues annotierte Methoden finden und aufrufen, die keinen IValidationContext-Parameter haben

Zusätzlich kann jetzt im PolicyCmptType auch für Attribute mit unbegrenztem Wertebereich ohne Null eine Validierungsmethode generiert werden.

Bugs

  • XML Deserialisierung ignoriert nicht gefundene Aufzählungstypen (FIPS-589)
  • Codegenerator Compiler-Fehler bei statischen Attributen und ToXML-Support (FIPS-1458)
  • Testfall kopieren räumt bei Abbruch nicht auf (FIPS-1501)
  • Import Enumeration Values – Radio Button Auswahl nicht eindeutig (FIPS-4318)
  • Default-ValidationRule für ein Attribut kann nicht mit unrestricted ValueSet umgehen (FIPS-4707)
  • Keine abstrakte Methode für Derived-Union im nicht abstrakten Typ generieren (FIPS-5651)
  • Neuer Produktbaustein-Wizard zeigt Beschreibung von Produktbausteintyp mit Vorlage unzureichend an (FIPS-5679)
  • Auch der Zugriff auf tableUsages muss Case-insensitiv erfolgen (FIPS-5739)
  • EnumContentType dont open in parent project (FIPS-5962)
  • Deltaermittlung berücksichtigt die Association nicht (FIPS-5998)
  • Debug von IPS-Test in Eclipse 4.9 nicht möglich (FIPS-6021)
  • Generierte doInitFoo-Methoden werfen keine Exception, wenn der EnumValue im Repo nicht gefunden wird (FIPS-6032)
  • Fehlerhaft generierter Builder wenn Modell-Attribut Name = Modell-Objekt Name (FIPS-6195)
  • Generiertes XML ist mit Java 11 nicht mehr indented (FIPS-6349)
  • Entfernen eines Bausteins aus dem Modell führt bei Vorlagen zu einer InvocationTargetException (FIPS-6363)
  • Ips…Types im Readonly-Modus (Parent-Project) mit Anzeigefehlern (FIPS-6371)
  • „Faktor-IPS Nature hinzufügen“ funktioniert genau einmal (FIPS-6418)
  • NPE beim erstellen neuer Beziehungen (FIPS-6441)
  • NPE bei Multiselect von Korrespondenztypen in einem Bearbeitungstyp (FIPS-6452)
  • Test Klasse InferTemplateProcessorTest2 enthaelt failing Tests und wird von Jenkins nicht ausgeführt (FIPS-6533)
  • Für Derived-Attribute (bei jedem Getter-Aufruf) wird keine „getRange“-Methode generiert (FIPS-6535)

New Features

  • Kopieren von Runtime ID im Kontextmenü (FIPS-2367)
  • Ant-Target für HTML-Export (FIPS-5965)
  • Anderer Default für neue Tabellenstrukturen – Multiple anstelle von Single (FIPS-6283)
  • Verbesserte Wertebereiche (FIPS-6492)

Tasks

Improvements

  • Create getExistingValueByXYZ(…) für Enums (FIPS-4220)
  • Aufruf von contains in UnrestrictedValueSet mit falschem Typen liefert true (FIPS-5811)
  • Regeln über IpsModel abfragen (FIPS-5894)
  • Javadoc für ProductCmptType.getDeclaredTableUsage(String) (FIPS-6145)
  • Design Time auf Java 8 umstellen (FIPS-6320)
  • mavenVersionProvider sollte Version ohne Qualifier in TOCs schreiben (FIPS-6436)
  • Build-Release: Validierung der Versionsnummer optional machen (FIPS-6475)
  • valueOfMethod soll Methoden mit einem CharSequence Parameter unterstützen (FIPS-6493)
  • RangeValueSet sollte prüfen können, ob ein EnumValueSet enthalten ist (FIPS-6565)