Release Notes

Version 23.6.4

Das Patch-Release 23.6.4 behebt drei Fehler:

  • Exceptions beim Hinzufügen der IpsNature eines Java-Projekts im ErrorLog (FIPS-10515)

  • Exceptions nach Löschen von Proudktbausteinen/IpsObjekten (FIPS-10516)

  • Änderungen im Baustein-Editor werden nicht gespeichert (FIPS-10517)

Version 23.6.3

In Version 23.6.3 werden zwei Fehler behoben:

  • MAX-Formel kann nicht mit Decimal.NULL umgehen (FIPS-10403)

  • Exception nach Änderung im Baustein (FIPS-9915)

Version 23.6.2

In Version 23.6.2 werden zwei Fehler behoben:

  • Der neue Produktwechsel migrierte Derived Unions doppelt, wenn ein AdvancedProductFinderSwitch konfiguriert wurde (FIPS-10325)

  • Der generierte Code in Builder-Klassen nutzte die Generator-Locale aus dem Ziel-Projekt von Beziehungen (FIPS-10332)

Version 23.6.1

Das Patch-Release 23.6.1 bringt ein Update der Groovy-Dependency für die dynamische Ausführung von Formeln, um auch mit der aktuellen Java-Version 20 lauffähig zu sein und behebt Bug FIPS-10229, der verhinderte, dass produktkonfigurierte Wertebereichseinschränkungen in Produktvarianten geladen werden konnten, wenn der Wertebereich eines Strings im Modell dessen Länge limitiert.

Da sich aus der ursprünglich enthaltenen Codegeneratoränderung, die Leerstrings statt null als Defaultwert für Strings nutzte, Probleme in Aufzählungen und mehrwertigen Attributen sowie im Code mancher Projekte ergaben, haben wir diese Änderung zurückgesetzt und werden sie in einem folgenden Faktor-IPS-Release mit mehr Vorlauf und etwas umfangreicheren Anpassungen der Darstellung von Strings und Wertemengen wieder einführen. Zur Vorbereitung empfehlen wir bereits jetzt, in eigenen Projekten den Code zur Behandlung von String-Attributen zu überprüfen. Prinzipiell sollte kein fachlicher Unterschied zwischen null und Leerstring bestehen, wobei Leerstring die bevorzugte Darstellungsform ist. Ein Vergleich meinStringAttribut != null ist fehlerträchtig, besser ist z.B. IpsStringUtils.isNotEmpty(getMeinStringAttribut()). Analog sollten zwei Strings über die neue Hilfsmethode IpsStringUtils.equalsNullAsEmpty(a, b) verglichen werden.

Beim Schreiben eines Produktbausteintyps mit einer als deprecated markierten Methode wurde teilweise ungültiges XML generiert FIPS-10300 - das ist nun korrigiert.

Version 23.6.0

Faktor-IPS wurde weiterentwickelt, um in Zukunft unabhängiger von Eclipse zu sein. Daneben haben wir einige Verbesserungen eingebaut:

Neue Mindestanforderungen

Das Faktor-IPS-Eclipse-Plugin benötigt ab Version 23.6 mindestens Java 17 und Eclipse 2022-12. Diese Änderung wurde notwendig, weil mit Eclipse 2022-09 die Maven-Unterstützung in Eclipse, auf der auch das Faktor-IPS-m2e-Plugin aufbaut, inkompatibel geändert wurde, 2022-09 aber diesbezüglich noch ein paar Bugs hatte.

Faktor-IPS Validation-Plugin

Wir haben es mit einem eigenen 23.1-Release schon vorgestellt, jetzt ist es auch im regulären Release enthalten: das Faktor-IPS Validation-Plugin validiert ein Faktor-IPS-Projekt im Maven-Build ohne ein Eclipse zu starten. Dabei werden die gleichen Validierungen durchgeführt, die auch vom Faktor-IPS-Plugin in einem Eclipse Workspace genutzt werden.

Das Plugin kann folgendermaßen in der POM eingebunden werden:

<pluginManagement>
    <plugins>
        <plugin>
            <groupId>org.faktorips</groupId>
            <artifactId>faktorips-validation-maven-plugin</artifactId>
            <version>${faktorips-version}</version>
        </plugin>
        ...
    </plugins>
</pluginManagement>
<plugins>
    <plugin>
        <groupId>org.faktorips</groupId>
        <artifactId>faktorips-validation-maven-plugin</artifactId>
        <executions>
            <execution>
                <goals>
                    <goal>faktorips-validate</goal>
                </goals>
            </execution>
        </executions>
    </plugin>
    ...
</plugins>

Weitere Informationen können in der Dokumentation des Plugins nachgelesen werden.

Das Validation-Plugin führt in dieser Version nur die Validierungen aus Faktor-IPS selbst aus, eigene Plugins können noch nicht eingebunden werden.

Wir freuen uns über Feedback für die Weiterentwicklung des Plugins.

JAXB / Jakarta XML Binding

JAXB, das "Java XML Binding Framework", war bis Java 8 fester Bestandteil des JDK im Package javax.xml.binding. Seit Java 9 muss man die API und eine passende Implementierung selbst als Projektabhängigkeit konfigurieren. Daneben war JAXB 2 auch Teil der Java EE-Spezifikation bis Java EE 8, während mit der Umbenennung zu Jakarta EE9 auch auf die Nachfolge-Spezifikation Jakarta XML Binding 3 (mit dem gleichen Kürzel JAXB, im Package jakarta.xml.binding) umgestellt wurde.

Um mit Faktor-IPS beide Varianten unterstützen zu können mussten wir unsere API von Abhängigkeiten zu einer konkreten Variante befreien, weshalb z.B. die Methode IRuntimeRepository#newJAXBContext() jetzt deprecated ist und den JAXBContext nur noch über Generics als Rückgabetyp verwendet. Die Erstellung eines JAXBContext, übernimmt, wie im Kapitel JAXB / Jakarta Support beschrieben, jetzt eine spezielle JaxbSupport-Klasse:

private JAXBContext jaxbContext = JaxbSupport.INSTANCE.newJAXBContext(repository);  

Diese Klasse, sowie die von ihr erstellten XmlAdapter und die Basisklasse AbstractJaxbModelObject, finden sich jetzt im neuen Modul faktorips-runtime-javax-xml (für das klassische JAXB) bzw. faktorips-runtime-jakarta-xml (für Jakarta XML Binding), das statt des klassischen faktorips-runtime genutzt werden kann, wenn JAXB im Projekt benötigt wird.

<dependency>
    <groupId>org.faktorips</groupId>
    <artifactId>faktorips-runtime-javax-xml</artifactId>
    <version>${faktorips.version}</version>
</dependency>

bzw.

<dependency>
    <groupId>org.faktorips</groupId>
    <artifactId>faktorips-runtime-jakarta-xml</artifactId>
    <version>${faktorips.version}</version>
</dependency>

Da JAXB als Teil von Java/Jakarta EE häufig schon als Teil eines Anwendungsservers ausgeliefert wird haben wir uns entschieden, die API nur als "provided" Dependency in den neuen Modulen einzubinden. Für Projekte, die nicht auf einem Java EE Server laufen kann es daher notwendig sein, auch für die API und eine Implementierung eine Projektabhängigkeit anzulegen:

<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.1</version>
</dependency>
<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
    <version>2.3.7</version>
</dependency>

bzw.

<dependency>
    <groupId>jakarta.xml.bind</groupId>
    <artifactId>jakarta.xml.bind-api</artifactId>
    <version>4.0.0</version>
</dependency>
<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
    <version>4.0.2</version>
</dependency>

Produktwechsel

Um den Produktwechsel an Vertragsobjektbäumen zu erleichtern gibt es jetzt die Hilfsklasse ProductSwitch. Sie wird mit einem Wurzel-Vertragsobjekt und dem Ziel-Produkt aufgerufen, wechselt dort auf das übergebene Produkt und verfolgt rekursiv alle Beziehungen und wechselt dort auf die entsprechenden Produktbausteine:

ProductSwitchResults switchResults = ProductSwitch.from(hausratVertrag).to(hausratKompakt2023);

Eine ausführlichere Dokumentation findet sich im Kapitel Produktwechsel und im Javadoc der Klassen.

Wertebereiche

Bei den Wertebereichen gibt es kleine Neuerungen:

  • Produktkonfigurierte Wertebereiche können zusätzlich als abgeleitet markiert werden. Im generierten Code kann auf den im Produkt konfigurierten Wertebereich zugegriffen und dieser in eigenem Code genutzt, verändert oder ersetzt werden.

  • Die equals- und hashCode-Methoden der Ranges beachten jetzt auch, ob ein Wertebereich null enthält

Migration

Wird im Projekt JAXB genutzt sollte nach der Migration manuell auf eines der neuen, unter JAXB / Jakarta XML Binding beschriebenen, Module umgestellt und ggf. passende Dependencies zu JAXB-API und -Implementierung hinzugefügt werden. Während der Migration kann bereits die neue Einstellung für die Projekte gewählt werden. Nach der Umstellung auf die neuen JAXB-/Jakarta-Module bleiben im generierten Code alte Import-Statements stehen und verursachen einen Fehler.

Die betroffenen Imports (org.faktorips.runtime.jaxb.*) können mit folgender Regex gefunden und entfernt werden:

import org\.faktorips\.runtime\.(?:jaxb\.[^.]+Adapter|internal\.AbstractJaxbModelObject);

Behobene Fehler

  • AbstractRuntimeRepository#getEnumValue(Class, Object) funktioniert nicht für "echte" Enums (FIPS-7780)

  • DefaultRange#contains checkt nicht ob empty (FIPS-9142)

  • useTableDefinedInSupertype bei Joined_Subclass - fehlende Annotationen (FIPS-9236)

  • UI-Freeze bei großem Enum-Content (FIPS-9295)

  • Builder-Methoden für deprecated Attribute sind nicht deprecated (FIPS-9360)

  • Falsche Version im POM bei addNature Wizard (FIPS-9501)

  • Falsches model auf Maven Central (FIPS-9512)

  • Source-Plugins fehlen in p2repository*.zip (FIPS-9521)

  • Produktbausteine in Ordnern mit Umlauten werden nicht migriert. (FIPS-9549)

  • minimalJavadoc verschluckt @implements/@extends-Annotations (FIPS-9589)

  • Rekursion in AbstractRuntimeRepository#getEnumValueLookupService wird zu oft aufgerufen (FIPS-9621)

  • ProductReleaseProzessor wirft NullPointerException bei als JAR referenzierten Modellen (FIPS-9633)

  • faktorips-valuetypes should use jaxb-api as provided dependency (FIPS-9705)

  • Offline XSD Schema missing (FIPS-9759)

  • IpsModel.getProductCmptType(productComponent) funktioniert nicht für Formel-Subklassen (FIPS-9880)

  • Excel-Import schlägt fehl (FIPS-9902)

  • Leere InternationalString in Enum wird nicht richtig initialisiert (FIPS-9913)

  • Resistenz gegen fehlerhafte Maven Projekte (FIPS-9928)

  • generatePublishedInterfaces wird für Dependencies falsch ausgelesen (FIPS-9982)

  • Unrestricted Java-Enum enthält nicht alle Werte (FIPS-10003)

  • DefaultGenericAttributeValidationConfiguration_en.properties is missing (FIPS-10076)

  • Hinzufügen von Baustein über Produktstrukturexplorer geht nicht (FIPS-10087)

  • An internal error occurred during: "Test Runner". (FIPS-10090)

  • Autocompletion in Formeln funktioniert nicht (FIPS-10125)

  • Name vom Problemmarker nicht da (FIPS-10130)

  • Generierter Javadoc in Tabellen enthält Name einer Konstante (FIPS-10141)

  • Generierung bricht ab - XML-Support kann nicht mit YEAR in Rows umgehen (FIPS-10146)

  • Java-Doc von Builder-Klassen fehlerhaft (FIPS-6141)

  • DefaultRange#equals/hashCode ignorieren containsNull (FIPS-10214)

  • Manchmal Derived Wertebreiche: Label in Produktbausteineditor abgeschnitten (FIPS-10211)

Weitere Funktionen und Verbesserungen

  • Util zum Wechsel von Produktbaustein und seinen Kindern (FIPS-9897)

  • Add YearXmlAdapter (FIPS-10134)

  • Ips-Tests mit JUnit 5 (FIPS-5973)

  • Leerstring als Default-Value für String-Attribute (FIPS-7400)

  • Unterstützung von Jakarta XML-Binding 3.0 (FIPS-8160)

  • Generierte Validierung sollte null in leeren Mengen erlauben (FIPS-8414)

  • IRuntimeRepository#newJaxbContext deprecaten und als Util anbieten (FIPS-8982)

  • Multi-Value-Produktattribut kann nicht als Pflichtattribut konfiguriert werden (FIPS-9117)

  • Vererbung von Label und Description an überschreibenden Attributen und Beziehungen (FIPS-9118)

  • Severity von Datentyp-Validierungen konfigurierbar machen (FIPS-9121)

  • IGenericAttributeValidationConfiguration valueSet anpassbar machen (FIPS-9176)

  • Verbesserung Relevance#asValueSet Methode für erweiterbare Enums (FIPS-9228)

  • Remove Guava Dependency (FIPS-9443)

  • Dependencies (z.B. Datentypen) im validation-plugin (FIPS-9716)

  • Vererbung von Label und Description an überschreibenden Typen und Enums (FIPS-9729)

  • FipsNature-Anlage um XML-Support erweitern (FIPS-9744)

  • Produktkonfigurierter Wertebereich, aber nur manchmal relevant (FIPS-9885)

  • Tests mit Java 20 (FIPS-9972)

  • DefaultGenericAttributeValidationConfiguration#getMessages konsequent nutzen (FIPS-9974)

  • Mehrere MarkerEnums verwenden (FIPS-9992)

  • Jakarta EE 10 statt 9 (FIPS-10057)

  • 23.6 JAXB Migration - default auf none, wenn der JAXB-Support auf false steht (FIPS-10131)

  • Update Eclipse used in Mojo (FIPS-10148)