English Documentation

Release Notes

Version 25.7.0

Faktor-IPS 25.7 requires Java 21 for the Eclipse plugin as well as for the runtime library.

JAXB Adapter for Custom Datatypes

When defining a datatype in the .ipsproject file, you can now use the jaxbXmlJavaTypeAdapterClass attribute to define an`XmlAdapter` class that will be generated with an @XmlJavaTypeAdapter annotation on fields using that datatype.

External Internationalization of Multi-Language Strings

String attributes marked as multilingual can now be translated to additional languages not only via the product configuration but also via i18n.properties files. To do this, place a (or multiple) i18n_<language>.properties file(s) in the same package as the product component’s class' model-label-and-descriptions_<language>.properties file(s) (the package is noted in the product component type’s @IpsDocumented annotation). In these files, properties use keys like <runtime ID of the product component, replacing ' ' with '_'>.<attribute name>. For multilingual multi-value attributes, the key can be extended with a 0-based index, following the pattern <runtime ID>.<attribute name>.<index>.

Enum contents can be translated with the same mechanism by using a key following the pattern <qualified name of the content>.<attribute name>.<value of the ID attribute>. Values defined in Enum types were already translatable with .properties files named like the types and using keys like <attribute name>_<value of the ID attribute>.

Default Implementation for areValuesEqual() in IDeltaComputationOptions

A default implementation for areValuesEqual() in IDeltaComputationOptions has been added, which treats null and empty/blank strings as equal. This eliminates the need for repeated implementation in individual subclasses.

Serializable Default Implementation for IRuntimeRepositoryLookup

To make a ClassloaderRuntimeRepository serializable, you now just need to call its withLookup() method. More details in the Javadoc and the (German) documentation at "Serialization & IRuntimeRepositoryLookup".

API-Changes

Generated Code
  • The user-code block for overwritten validation rules now covers a smaller piece of code. This allows the call to the super method and the finding and removal of the old Message to happen outside, so that inside the block only custom checks and parameter assignments have to be implemented.

    • For existing code, this means there may now be some duplicated code (previously handwritten inside the block, now generated outside), which has to be manually cleaned up.

  • Table classes are now generated as final. Faktor-IPS does not allow subclassing of tables and the call chain → init()initKeyMaps()/performAdditionalInitializations() was correctly marked as "possible this-escape" by the Java 21 compiler for non-final classes.

  • The fields in the internal SerializationProxy classes of enums are now generated with @generated Javadoc tags for new classes so that they are now generated differently after changes to the enum model, like a changed datatype for the ID attribute. For existing SerializationProxy classes, @generated is unfortunately not created, because JMerge interprets the missing Javadocs as @generated NOT. You may add the Javadoc manually or delete the SerializationProxies and let them be generated anew.

  • Java methods generated for ProductCmptType methods are no longer documented with {@inheritDoc} when not overriding or implementing anything.

  • Hidden attributes and associations are now marked with "hide" in the @Ipsattribute/Association annotation

  • The migration to Faktor-IPS 25.7, besides writing the updated XML schema references in all files, also adds a line to the MANIFEST.MF, to include the runtime ID prefix.

  • The initialization code for default values of extensible enum attributes with primitive IDs was fixed

Runtime
  • All runtime model-type setter methods with IProductComponent and Calendar as parameters have been overloaded with a variant that instead uses IProductComponentGeneration to set values. This includes setDefaultValue/setValueSet methods for all (Policy/Product)Attributes, TableUsage#setName and Formula#setFormulaText:

    • Attribute#setDefaultValue(IProductComponentGeneration target, Object defaultValue)

    • Attribute#setValueSet(IProductComponentGeneration target, Object defaultValue)

    • TableUsage#setTableName(String tableName, IProductComponentGeneration generation)

    • Formula#setFormulaText(IProductComponentGeneration generation, String formulaText)

  • Added new default implementation for areValuesEqual(Class<?> clazz, String property, Object value1, Object value2) in IDeltaComputationOptions that treats null and empty strings as equal

Compatibility

Older Versions of Faktor-IPS

Due to the change to Java 21, Faktor-IPs 25.7 is not compatible with older versions of Faktor-IPS.

Java
  • The Design-Time (Eclipse-Plugin) requires at least Java 21.

  • The runtime requires at least Java 21. (A migration for EclipseLink is necessary. See the migration section for more information.)

Eclipse

The design time Eclipse plugin requires at least Eclipse 2023-12*and has been tested with that version and all following versions up to and including Eclipse 2025-06.

As Eclipse versions before 2024-06 do not include Java 21, installation and use of Faktor-IPS require a current JRE. It is important to also update the JustJ plugin included in Eclipse.

We recommend using Eclipse 2025-06.

Eclipse 2025-03 has a bug in its internal Java compiler, showing errors where there shouldn’t be any in some constellations, such as in a call to IRuntimeRepository.getExistingEnumValue(Class<T>, Object) with a combination of null and a primitive value for the ID (e.g., IpsStringUtils.isEmpty(columnValue) ? null : Integer.parseInt(columnValue)). This bug will only be fixed in Eclipse 2025-06.

Migration

The migration to Faktor-IPS 25.7, besides writing the updated XML schema references in all files, also adds a line to the MANIFEST.MF, to include the runtime ID prefix.

As Eclipse versions before 2024-06 do not contain Java 21, installing and running Faktor-IPS with those versions requires an updated JRE.

EclipseLink Version 3.0.2 is not compatible with Java 21. Therefore, updating the EclipseLink dependency to at least 3.0.4 is required to use the runtime with Java 21.

Fixed Bugs

  • GIT branch change via console leads to problems in FIPS/Eclipse build

  • Refactoring/renaming of table content leads to exception

  • NullPointerException when trying to migrate a project with IpsNature but without .ipsproject

  • DefaultRange.isUnrestricted() does not handle NullObject

  • Fields in SerializationProxy should be @generated

  • Missing import for generated validator classes with super class from different package

  • Relevance always generates a virtual OrderedValueSet

  • Initialization of default value null for enum-typed attribute with int id throws NumberFormatException

  • Overwriting rules leads to duplicate calls & incomplete generated code

  • Incorrect nullValue validation in DefaultPolicyAttribute

  • Runtime range validation for primitive data types is too lax

  • cvc-complex-type error in .ipstestcase(type)

  • If the same target is linked in multiple associations, it is sometimes deleted from the wrong association.

  • Relevance::asValueSetrange&enum in incorrect order.

  • Wrong ObjectProperties when using validator classes

  • String length value sets in products based on templates are now correctly validated.

  • The XSD schema for test classes and cases was fixed. Parameters were previously only allowed in a specific order.

  • Changes to the order of enum type values are not reflected in the generated Java enums

  • When deleting a template, it is now also removed from all product components and other templates using it. This can be adapted on the preview page of the Delete dialog.

  • When overwriting validation rules, the generated code contained bugs. More under API Changes - Generated Code.

  • Treat null and NullObjects the same when checking whether a range is unlimited

  • Use actual model object in object-only message properties created in validator classes

  • Do not adopt @inheritDoc for target methods of @generated REDIRECT

  • Copy-Wizard Settings Im-/Export logs Exception when closing dialog

  • Typo in validation message for valid-from

  • Error when moving Valid-from date using wizard

  • Archetype uses Java 17 as default

  • NPE in "Open Ips Object in Editor" dialog

  • NPE in DeepCopyWizard

  • Update of commons-beanutils to fix CVE-2025-48734

  • inheritDoc is generated on IPS-Method JavaDoc

  • DeltaComputationOptionsByPosition now uses the new default implementation of areValuesEqual, now treating null and empty strings as equal

  • In the dependencies of the org.faktorips.devtools.model POM of RC 2 some Eclipse projects were missing

  • DeltaComputationOptionsByPosition should not overwrite the new default-areValuesEqual

  • java.util.MissingResourceException in org.faktorips.fl.Messages

  • New PolicyCmptType contains UUIDs

  • When deriving a template, excluded links aren’t set to [0..0]

Additional Functions and Improvement

  • Add setters in Runtime-IpsModel that take IProductComponentGeneration as a parameter. (see also Runtime API-Changes.)

  • DefaultRange#getValues should output values in sorted order

  • repository.eclipse should point to the releases repository instead of updates.

  • Prevent migration from version 23.6 to 24.7 or newer.

  • New DatabaseLengthValidationUtil for generic validation of maximum lengths for strings as well as numeric data types such as (Big)Decimal and Double. For more information, see: Database Field-Length Validation

  • Wizard for moving the valid-from date

  • Context menu for multiselect of links to set all their cardinalities to the value inherited from a template

  • Enable configuration of XmlJavaTypeAdapter for custom data types

  • Copy-Wizard: save and load settings

  • Runtime product components and table contents need a method to set their descrptions

  • Add "hide" flag to runtime

  • Deletion of a template should not leave errors on products previously derived from it.

  • Multiselect→Use cardinality from template