FAQ

Dieses FAQ wurde von einem Nicht-Entwickler erstellt um bei möglichen auftretenden Fragen zu unterstützen. Es beinhaltet sowohl Erklärungen von technischen Begriffen als auch Lösungsansätze bei Problemstellungen.

Generell gilt im Tutorial:
Modellobjekte haben lila Icons und werden immer in "Hausratmodell" angelegt.
Produktobjekte haben grüne Icons und werden immer in "Hausratprodukte" angelegt.

Java-Testordner (z.B. für JUnit-Tests) sind grundsätzlich unter "src/test/java" anzulegen.

Wenn nach dem Copy-Paste einer Codestelle Fehlermeldungen angezeigt werden kann man mit der Tastenkombination "Strg-Shift-O" fehlende Dependencies automatisch importieren.

Bei den automatisch generierten Codestellen steht "@since 1.0" dabei. Im Tutorial ist das nicht zu sehen - warum?
Die Musterlösung des Tutorials wurde ursprünglich ohne Archetype erstellt. Im Tutorial wird nun aber zum Erstellen der Projekte der Archetype genutzt. Dieser setzt die Version des Projekts auf 1.0 und definiert einen Version Provider in der ".ipsproject"-Datei. Dadurch wird an generierten Codestellen die Version mitgeneriert.
Dies kann ausgeschalten werden indem in der Datei ".ipsproject" der folgende Eintrag gelöscht wird:

<Version versionProvider="org.faktorips.maven.mavenVersionProvider"/>

Teil 1: Modellierung und Produktkonfiguration

Hello Faktor-IPS

  • Faktor-IPS mit anderer Locale (Sprache) starten
    Im Eclipse Installationsordner die Datei "eclipse.ini" suchen. Dort für eine Änderung auf Englisch

-nl
en

eintragen. Für Deutsch "de" nutzen.

  • Was ist ein Maven Archetype?
    Ein Archetype ist ein Maven-Projekt-Template, welches die wichtigsten Projekteinstellungen bereits enthält. Daraus lässt sich nach Eingabe einiger Parameter ein funktionierendes Projekt mit allen benötigten Dateien generieren.

  • Probleme beim Archetype mit dem Befehl "mvn"
    Dies deutet darauf hin, dass Maven nicht installiert ist und eine PATH-Variable, die den mvn-Befehl übersetzt, fehlt. Dies ist normalerweise in Eclipse integriert, funktioniert aber aufgrund eines Bugs nicht ordnungsgemäß. Um den Fehler zu lösen muss Maven manuell installiert werden:

    1. https://maven.apache.org/download.cgi (korrekte Binary downloaden)

    2. In Windows den entpackten Ordner (z.B. apache-maven-3.8.6) nach C:\Program Files\ verschieben

    3. Settings - System - About - Advanced System Settings - Environmental Variables

    4. Systemvariablen (zweite Box) - Variable "Path" suchen und "Bearbeiten…​" - Neu - "C:\Program Files\apache-maven-3.8.6\bin" einfügen und speichern

    5. Die PATH Variable für den Befehl "mvn" ist nun gesetzt und wird nun nach einem Neustart der Kommandozeile dort erkannt. Es kann nun mit dem Tutorial fortgefahren werden.

  • Fehlermeldung: No plugin found for prefix 'archetype' in the current project and in the plugin groups (org.jenkins-ci.tools, org.glassfish.maven.plugin, org.apache.maven.plugins, org.codehaus.mojo) available from the repositories local (C:\Users\USER\.m2\repository), nexus https://nexus.faktorzehn.de/content/groups/private → (Help 1)
    Die Java Version ist zu alt (idR 1.7). Diese kann mit folgendem Befehl über die Kommandozeile gesetzt werden: "export JAVA_HOME=<Pfad zur aktuellen Java Version (bspw Java 11)>". Beispiel: "export JAVA_HOME=C:/Users/USER/eclipse/jdk-11.0.15+10"

Arbeiten mit Modell und Sourcecode

  • Wo finde ich die Einstellung "Published Interfaces generieren"?
    Zu finden unter Project → Properties (und nicht unter Window → Preferences).

  • Fehlermeldung: Die Version "22.6.1.rfinal_20220613-1201 des Features org.faktorips.feature ist zu der von diesem Projekt verlangten Version 21.6.0 nicht kompatibel. Versuchen Sie das Projekt zu migrieren."
    Das Projekt wurde mit einem zu alten Archetype erstellt. Man kann Projekte in Faktor-IPS einfach migrieren. Bevorzugtes Benennungsschema (in dieser Version!): "Unified".

migrating faktor ips

Zugriff auf Produktinformationen zur Laufzeit

  • Was ist ein Classloader?
    Der Classloader lädt die einzelnen Programmdateien (Klassen und Ressourcen), aus denen ein Java-Programm besteht. Faktor-IPS nutzt ihn auch, um die neben den Klassen liegenden Produktdaten zu finden.

  • Ergebnis auf eine Klasse casten - was bedeutet das?
    Klassen können voneinander abgeleitet sein. So kann HausratProdukt eine Spezialisierung von Produkt sein (fachliche Spezialisierung), welches wiederum eine Spezialisierung von ProductComponent ist (technische Spezialisierung). Da das Repository nur weiß, dass alle Produkte Instanzen dieser Basisklasse sind müssen wir dem Programm mitteilen, dass wir hier davon ausgehen zu wissen, welche Spezialisierung in diesem Fall genutzt wird und "casten" darauf.

Statt

ProductComponent p = repository.getProductComponent("Hausrat Kompakt");

schreiben wir

HausratProdukt hp = (HausratProdukt) repository.getProductComponent("Hausrat Kompakt");

und können dadurch auch auf die Methoden zugreifen, die HausratProdukt definiert.

Teil 2: Verwendung von Tabellen und Formeln

Verwendung von Tabellen

  • Erzeugen Sie nun für die Produkte HR-Optimal und HR-Kompakt (bzw. genauer für deren Grunddeckungstypen) jeweils einen Tabelleninhalt mit dem Namen „Tariftabelle Optimal 2019-07“ und „Tariftabelle Kompakt 2019-07“.
    Im Modell Explorer auf HR-Kompakt Rechtsklick → Neu…​ → Tabelleninhalt → TariftabelleHausrat → Name befüllen → Finish

Verwendung von Formeln

  • Die Beziehung zwischen HausratZusatzdeckungs und HausratVertrag sollte in HausratVertrag mit dem Typ "Elternteil zu Kind" angelegt werden. Ansonsten kann die HausratZusatzdeckung mehrere HausratVerträge haben (und daher funktioniert die Logik nicht mehr).

Teil 3: Testen mit Faktor-IPS

Testfall anlegen

Erster Testfall schlägt fehl:
Can’t create instance for toc entry TocEntry(TestCase:produktdaten/test/HausratTest_1.ipstestcase)
java.lang.reflect.InvocationTargetException
Keine Pruefungen vorhanden. Diese muessen in der Java-Klasse, die den Testfalltyp repraesentiert, implementiert werden.

Dies bedeutet, dass keine Asserts in BeitragsberechnungHausratTest.java implementiert wurden:

public void executeAsserts(IpsTestResult result) {
    // begin-user-code
    // TODO : Hier muessen die durchzufuehrenden Pruefungen implementiert werden.
    throw new RuntimeException("Keine Pruefungen vorhanden. Diese muessen in der Java-Klasse, die den Testfalltyp repraesentiert, implementiert werden.");
    // end-user-code
}

Hier nun die Zeile auskommentieren. Es kommt zu einem weiteren Fehler "Not implemented yet!".
Es wird in der Methode executeBusinessLogic() die Funktion inputHausratVertrag.berechneBeitrag() aufgerufen. Wir springen zu dieser indem wir berechneBeitrag() anklicken und F3 drücken.
Hier sehen wir, dass die Funktion noch nicht implementiert wurde.

public void berechneBeitrag() {
    // TODO implement model method.
    throw new RuntimeException("Not implemented yet!");
}