Milestone 21.6.0-m01

Neues in Version 21.6

Umstellung von BigDecimal-Konstanten auf RoundingMode-Enums

Da BigDecimal-Rundungsmodus-Konstanten seit Java 9 deprecated sind, werden stattdessen nun RoundingMode-Enums verwendet. Die alten Methoden, welche BigDecimal-Konstanten nutzen, werden zunächst als deprecated beibehalten und es stehen neue Methoden mit RoundingMode-Enums zur Verfügung.

Umstellung der Faktor-IPS-Runtime auf Java 8

Die folgenden Projekte werden von nun an mit Java 8 kompiliert:

  • org.faktorips.runtime.groovy
  • org.faktorips.runtime
  • org.faktorips.valuetypes.joda
  • org.faktorips.valuetypes

Der Codegenerator nutzt nun den StringBuilder anstelle des StringBuffers.
DecimalUtils wurden von f10-commons zu org.faktorips.valutypes verschoben und dabei zu Decimals umbenannt.

Außerdem wurden folgende Änderungen an den Klassen und Methoden vorgenommen:

Klasse Änderung
org.faktorips.util.IntegerUtils
Gelöscht. Die Utilityklasse hat die Methode compare(int x, int y) zur Verfügung gestellt. Seit Java 7 ist diese Methode in java.lang.Integer enthalten, wodurch die Klasse nutzlos wird.
org.faktorips.runtime.TableFunctionExecution Gelöscht. Das Interface war deprecated und wurde nicht mehr genutzt.
org.faktorips.runtime.modeltype.IModelTypeAttribute Gelöscht. Das Interface war deprecated. Stattdessen kann org.faktorips.runtime.model.type.Attribute direkt genutzt werden.
org.faktorips.runtime.modeltype.IModelTypeAssociation Gelöscht. Das Interface war deprecated. Stattdessen kann org.faktorips.runtime.model.type.Association direkt genutzt werden.
org.faktorips.runtime.modeltype.IModelType Gelöscht. Das Interface war deprecated. Stattdessen kann org.faktorips.runtime.model.type.Type direkt genutzt werden.
org.faktorips.runtime.modeltype.IModelElement Gelöscht. Das Interface war deprecated. Stattdessen kann org.faktorips.runtime.model.type.ModelElement direkt genutzt werden.
org.faktorips.devtools.core.ui.filter.AbstractProductCmptPropertyFilter Gelöscht. Die Klasse war deprecated.
org.faktorips.devtools.core.ui.table.ColumnChangeListener Gelöscht.
org.faktorips.devtools.core.ui.table.IdentifierGenerator Gelöscht.
org.faktorips.runtime.util.StringBuilderJoiner Hinzugefügt. Die Utility Klasse enthält Methoden um Elemente zu existierenden StringBuildern hinzuzufügen, analog String#join.
org.faktorips.runtime.util.AbstractMessageList Hinzugefügt. Die abstrakte Klasse ist eine Superklasse von org.faktorips.util.message.MessageList und org.faktorips.runtime.MessageList.
org.faktorips.runtime.util.IMessage Hinzugefügt. Das Interface wird von org.faktorips.util.message.Message und org.faktorips.runtime.Message implementiert.
org.faktorips.runtime.util.function.IPredicate Deprecated. Stattdessen kann java.util.function.Predicate direkt genutzt werden.

 

Methode Änderung
org.faktorips.runtime.model.type.Association
#getAssociationType()
Gelöscht. Die Methode war deprecated. Stattdessen soll getAssociationKind() genutzt werden.
org.faktorips.runtime.model.type.Association
#isProductRelevant()
Gelöscht. Die Methode war deprecated. Stattdessen soll isMatchingAssociationPresent() genutzt werden.
org.faktorips.runtime.model.type.Attribute
#getAttributeType()
Gelöscht. Die Methode war deprecated. Stattdessen soll getAttributeKind() genutzt werden.
org.faktorips.runtime.model.type.Attribute
#getValueSetType()
Gelöscht. Die Methode war deprecated. Stattdessen soll getValueSetKind() genutzt werden.
org.faktorips.values.ObjectUtil
#equals(Object, Object)
Deprecated. Stattdessen soll java.util.Objects#equals genutzt werden.
org.faktorips.codegen.CodeFragment
#appendJoined(Iterable)
Hinzugefügt. Die Methode konvertiert die Elemente aus dem Iterable Objekt zu Strings und fügt diese dann, separiert durch Kommata, zum Source Code hinzu.
org.faktorips.codegen.CodeFragment
#appendJoined(Object[])
Hinzugefügt. Die Methode konvertiert die Elemente aus dem Array zu Strings und fügt diese dann, separiert durch Kommata, zum Source Code hinzu.
org.faktorips.codegen.JavaCodeFragment
#appendJoined(JavaCodeFragment[])
Hinzugefügt. Die Methode konvertiert die Elemente aus dem Array zu Strings und fügt diese dann, separiert durch Kommata, zum Source Code hinzu.
org.faktorips.runtime.internal.IpsStringUtils
#join(Iterable, String)
Hinzugefügt. Die Methode verbindet die Elemente aus dem Iterable Objekt zu einem String. Die Elemente werden durch den übergebenen String getrennt.
org.faktorips.runtime.internal.IpsStringUtils
#join(Iterable)
Hinzugefügt. Die Methode verbindet die Elemente aus dem Iterable Objekt zu einem String. Die Elemente werden durch Kommata getrennt.
org.faktorips.runtime.internal.IpsStringUtils
#join(Object[], String)
Hinzugefügt. Die Methode verbindet die Elemente aus dem Array zu einem String. Die Elemente werden durch den übergebenen String getrennt.
org.faktorips.runtime.internal.IpsStringUtils
#join(Object[])
Hinzugefügt. Die Methode verbindet die Elemente aus dem Iterable Objekt zu einem String. Die Elemente werden durch Kommata getrennt.
org.faktorips.runtime.internal.IpsStringUtils
#join(Iterable, Function)
Hinzugefügt. Die Methode konvertiert die Elemente aus dem Iterable Objekt mit der übergebenen toString-Methode und verbindet die Elemente dann zu einem String. Die Elemente werden durch Kommata getrennt.
org.faktorips.runtime.internal.tableindex.RangeType
#findValue(TreeMap<K,V>, K)
Hinzugefügt. Alternative Methode zu getValue(TreeMap<K,V>,K) mit einem Optional als Rückgabewert.
org.faktorips.runtime.internal.toc.ProductCmptTocEntry
#findNextGenerationEntry(Calendar)
Hinzugefügt. Altenative Methode zu getNextGenerationEntry(Calendar) mit einem Optional als Rückgabewert.
org.faktorips.runtime.internal.toc.ProductCmptTocEntry
#findPreviousGenerationEntry(Calendar)
Hinzugefügt. Alternative Methode zu getPreviousGenerationEntry(Calendar) mit einem Optional als Rückgabewert.
org.faktorips.runtime.internal.toc.ProductCmptTocEntry
#findLatestGenerationEntry()
Hinzugefügt. Alternative Methode zu getLatestGenerationEntry() mit einem Optional als Rückgabewert.
org.faktorips.runtime.internal.toc.ProductCmptTocEntry
#findGenerationEntry(Calendar)
Hinzugefügt. Alternative Methode zu getGenerationEntry(Calendar) mit einem Optional als Rückgabewert.
org.faktorips.runtime.internal.toc.ProductCmptTocEntry
#findGenerationEntry(DateTime)
Hinzugefügt. Alternative Methode zu getGenerationEntry(DateTime) mit einem Optional als Rückgabewert.
org.faktorips.runtime.internal.XmlUtil
#findFirstElement(Node, String)
Hinzugefügt. Alternative Methode zu getFirstElement(Node,String) mit einem Optional als Rückgabewert.
org.faktorips.runtime.internal.XmlUtil
#findFirstElement(Node)
Hinzugefügt. Alternative Methode zu getFirstElement(Node) mit einem Optional als Rückgabewert.
org.faktorips.runtime.model.type.Type
#findJavaInterface()
Hinzugefügt. Alternative Methode zu getJavaInterface() mit einem Optional als Rückgabewert.
org.faktorips.runtime.model.type.Type
#findDeclaredMethod(Class<T>, AnnotatedElementMatcher<T>)
Hinzugefügt. Alternative Methode zu searchDeclaredMethod(Class<T>, AnnotatedElementMatcher<T>) mit einem Optional als Rückgabewert.
org.faktorips.runtime.model.type.Type
#findSuperType()
Hinzugefügt. Alternative Methode zu getSuperType() mit einem Optional als Rückgabewert.
org.faktorips.runtime.internal.ValueToXmlHelper
#isAttributeTrue(Element, String)
Hinzugefügt. Die Methode gibt zurück, ob das Element ein Attribut mit dem übergebenem Namen und dem Wert true hat.

Generische Attributsvalidierung

Für Vertragsattribute können Wertebereiche (und damit auch ihre Relevanz: ein leerer Wertebereich bedeutet, dass das Attribut nicht relevant ist und keinen Wert haben sollte; ist null nicht erlaubt ist das Attribut ein Pflichtfeld) konfiguriert werden. Schon bisher erlaubte Faktor-IPS die einfache Erzeugung einer Validierungsregel um die Einhaltung eines Wertebereichs zu prüfen – allerdings musste dazu jeweils eine individuelle Fehlermeldung und ggf. die Belegung von Parametern in der Meldung implementiert werden.
Mit Faktor-IPS 21.6 kann nun stattdessen eine generische Validierung (über eine Checkbox auf dem Validierungsregel-Tab des Attributs) aktiviert werden. Diese prüft drei Bedingungen:

  1. Irrelevantes Attribut: Wert ist gesetzt
  2. Pflichtfeld: Wert fehlt
  3. Wertebereich: Wert nicht erlaubt

Die Fehlermeldungen die dabei erzeugt werden können über eine eigene Implementierung von IGenericAttributeValidationConfiguration (bzw. eine Ableitung der DefaultGenericAttributeValidationConfiguration) über den IValidationContext angepasst werden. Ebenso können damit einzelne Attribute für Modellobjekte von der Validierung ausgeschlossen werden, wenn diese z.b. erst nachdem ein anderes Attribut gesetzt ist sinnvoll geprüft werden können.
In der .ipsproject-Konfigurationsdatei kann über <Setting enabled="true" name="genericValidationDefault"/> eingestellt werden, dass diese Validierung für alle neu angelegten Attribute aktiviert sein soll.

Migration

Die Migration auf Faktor-IPS 21.6 muss zwingend von einem Faktor-IPS nicht älter als 20.6 aus geschehen, weil dabei einige interne IDs in den Dateien .project, .ipsproject und ggf. .classpath geändert werden (von org.faktorips.devtools.core zu org.faktorips.devtools.model). Auch in eigenen Plugins müssen diese Anpassungen vorgenommen werden, da viele Klassen verschoben wurden. Dazu genügt in den meisten Fällen die Eclipse-Operation „Organize Imports“.

Erstellung von Faktor-IPS-Projekten mit Maven-Archetypes

Faktor-IPS-Projekte lassen sich durch die Verwendung von Maven-Archetypes direkt als Maven-Projekte erstellen. Eine Anleitung zur Verwendung des Archetypes für Faktor-IPS ist hier zu finden.

Release Notes – Faktor-IPS – Version 21.6

Bugs

  • Tippfehler im Javadoc am getter einer TableUsage (FIPS-6304)
  • Editor scrollt horizontal (FIPS-6528)
  • Null-Werte in EnumContents werden zur Runtime als Leerstring gelesen (FIPS-7096)
  • Money#subtract erlaubt unterschiedliche Währungen (FIPS-7222)
  • DefaultRange#getValues(boolean) sollte upperBound == lowerBound besser unterstützen (FIPS-7342)
  • java.util.ConcurrentModificationException bei Headless Eclipse Build eines Produktprojektes (FIPS-7369)

Improvements

  • Core unabhängig von eclipse.ui machen (FIPS-3557)
  • IpsModel aufräumen: Deprecated Methoden löschen (FIPS-6026)
  • RoundingMode enum statt BigDecimal constants verwenden (FIPS-6234)
  • Mindestanforderung von Luna auf 2019-03 erhöhen (FIPS-6649)
  • API von OrderedValueSet verbessern (FIPS-6653)
  • Faktor-IPS-Runtime auf Java 8 umstellen (FIPS-6802)
  • Maven-Build Erste Schritte (FIPS-6955)
  • Class#newInstance() -> Class#getConstructor()#newInstance() (FIPS-7042)
  • Collector für Decimal & Money (FIPS-7095)
  • Formelsprache: WENN mit Boolean null führt zu NPE (FIPS-7123)
  • Convenience-Methoden Message#asMessageList & MessageList#of (FIPS-7203)
  • Migration für 21.6 (FIPS-7329)
  • Builder-Refactoring (FIPS-7333)
  • MessageListUtil aus f10-commons-ips übernehmen (FIPS-7345)
  • Move m2e to faktorips.base (FIPS-7353)
  • Very easy Warnings fix (FIPS-7407)