Release Notes

Version 23.6.12

Das Patch-Release 23.6.12 behebt folgenden Fehler:

  • ConcurrentModificationException aus AbstractRuntimeRepository.getAllReferencedRepositories() (FIPS-11737)

Version 23.6.11

Das Patch-Release 23.6.11 behebt folgenden Fehler:

  • ModelObjectAttributes::resetAttributes erwartet bei gecachten Attributen und konstanten Attributen einen Setter (FIPS-11713)

Version 23.6.10

  • Attribute bearbeiten-Dialog braucht Scrolleisten (FIPS-11531)

Der Dialog zum Bearbeiten von Attributen wurde im Tab "Validierungsregel" um einen Scrollbalken erweitert. Dies war notwendig, da bei niedrigen Bildschirmauflösungen Teile der Benutzeroberfläche nicht mehr vollständig angezeigt wurden.

Version 23.6.9

Version 23.6.9 behebt einen Fehler mit Java Concurrency:

  • Funktion "Copy Product" wird nicht fertig (FIPS-11369)

Version 23.6.8

  • In Produktvarianten "gelöschte" zu-1-Beziehungen werden nicht ausgefiltert. (FIPS-11309)

Bei Verwendung von Produktvarianten werden Beziehungen mit der Kardinalität 0..0 überschrieben um sie in der Variante auszuschließen. Bei mehrwertigen Assoziationen wurden Links mit upperBound=0 seit FIPS-7905 gefiltert, einwertige Assoziationen bisher jedoch nicht. Dies wurde nun behoben.

Durch die Modifizierung im Codegenerator kommt es hierbei zu kleinen Änderungen in der Generierung der Getter.

Version 23.6.7

Das Patch-Release 23.6.7 behebt folgenden Fehler:

  • Faktorips-validation-maven-plugin bricht mit Exception ab wenn das Produktvarianten-Feature im Projekt konfiguriert ist (FIPS-11253). Bei der Validierung durch das faktorips-validation-maven-plugin werden nun unbekannte Features wie z. B. Produktvarianten ignoriert, andere Elemente des Projekts werden aber weiterhin wie gewohnt validert.

Version 23.6.6

Version 23.6.6 behebt folgende zwei Fehler:

  • Vergleich eines erweiterbaren Enums mit == kann fehlschagen (FIPS-11138). Prinzipiell empfehlen wir erweiterbare Enums wie alle Java-Objekte mit equals zu vergleichen. Dennoch haben wir das Caching verbessert, so dass Enum-Werte nicht mehr verworfen und neu geladen werden.

  • Compile-Fehler bei Großschreibung von Enum-Attributen (FIPS-11189).

Version 23.6.5

Wenn in einer Produktvariante ein Baustein ausgeschlossen wird bleibt dieser aus technischen Gründen mit der Kardinalität [0…​0, 0] erhalten. Ein Aufruf von z.B. getDeckungen() sollte einen solchen Baustein aber seit (Faktor-IPS 22.6) nicht mehr zurückgeben - nur ein Aufruf von getLinksForDeckungen() offenbart noch den Link mit Kardinalität [0…​0, 0]. Dies ist jetzt tatsächlich so (FIPS-10618).

Das Patch-Release behebt außerdem folgende Fehler:

  • Änderungen im Baustein-Editor werden nicht gespeichert (ohne Hinweis an den Benutzer) (FIPS-10517)

  • EnumContent und TableContent-XML-Dateien: Attribute 'xml:space' is not allowed (FIPS-10532)

  • Nicht alle Aufzählungs-Datentypen haben eine getAllValues-Methode (FIPS-10840)

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)