Class JexlService

java.lang.Object
de.ivfp.tarifkostenberechner.logic.core.service.AbstractService
de.ivfp.tarifkostenberechner.logic.core.service.JexlService

public class JexlService extends de.ivfp.tarifkostenberechner.logic.core.service.AbstractService

Grundlagen von Jexl

Allgemeines

  • Am Ende jedes Statements (i. d. R. Ende der Zeile) wird ein Semikolon gesetzt, außer wenn dem Statement ein Codeblock mit geschweiften Klammern folgt.
  • Rechenoperatoren: +, -, *, /, % (Zahl 1 % Zahl 2 = Rest von Zahl 1 / Zahl 2)
  • Statt variable = variable + 3; kann variable += 3; geschrieben werden. Dies ist für alle Rechenoperatoren möglich.
  • Um Kommazahlen darzustellen, wird ein Punkt statt eines Kommas verwendet. In den Formeln tauchen Zahlen mit Buchstaben wie 35b auf. Das sind Kommazahlen mit bestimmten Eigenschaften.
  • Wenn alle Zahlen, die an einer Division beteiligt sind, ganze Zahlen sind, wird das Ergebnis auch zu einer ganzen Zahl werden. Um die Nachkommastellen zu erhalten, muss eine der Zahlen in eine Kommazahl umgewandelt werden.

Variablen

In Variablen werden Werte zwischengespeichert, die bei Bedarf abgerufen werden können. Variablen müssen vor Benutzung deklariert werden und ihnen muss ein Wert zugewiesen werden. Die Deklaration erfolgt mit folgenden Schlüsselwörtern:

Mit let werden die meisten Variablen deklariert:

let variable;

const wird verwendet, wenn sichergestellt werden soll, dass der Wert einer Variablen nicht verändert werden kann. Sollte dies dennoch versucht werden, wird ein Fehler ausgelöst:

const variable;

Auf diese Weise sind die Variablen Jexl bekannt. Aber solange ihnen noch kein Wert zugewiesen wurde, haben sie kaum einen Nutzen. Die Zuweisung eines Wertes erfolgt mit =. Wurde die Variable bereits deklariert, muss das Schlüsselwort weggelassen werden.

Variable wurde vorher bereits deklariert:

let variable;
variable = 1 + 2;

Deklaration und Zuweisung können in einer Zeile erfolgen:

let variable = 5;

Externe Variablen

In Jexl gibt es noch externe Variablen, die über den JexlContext zur Verfügung gestellt werden (s. Tabellen in FormulaVariable). Diese Variablen müssen nicht deklariert werden und ihnen muss kein Wert zugewiesen werden. Für die Benutzung müssen sie sich aber im JexlContext (Sammlung der externen Variablen) befinden. Dies geschieht, sobald sie das erste Mal vom System erfasst werden, z. B. durch die Abfrage der Atlas-API oder durch die Berechnung des Wertes über die dazugehörige Formel.

Schreibweise

Die externen Variablen werden komplett mit Kleinbuchstaben geschrieben und aufeinanderfolgende Wörter werden mit einem Unterstrich getrennt, z. B. alter_bei_rentenbeginn. Bei Variablen, die in den Formeln deklariert werden, wird das erste Wort komplett kleingeschrieben und der Anfangsbuchstabe der darauffolgenden Wörter wird großgeschrieben, z. B. alterBeiRentenbeginn.

Listen

Listen sind geordnete Sammlungen von Werten. Jeder Wert in einer Liste ist über seine Positionsnummer, dem Index, erreichbar. Der Index fängt bei 0 an und erhöht sich bei jedem darauffolgenden Wert um je 1. Der erste Wert hat also den Index 0, der zweite Wert den Index 1, usw. Über folgende Syntax wird ein Wert einer Liste mit einem bestimmten Index aufgerufen:

liste[index]


if-Statements

Syntax

if (Bedingung)
{
    ausführbarer Code
}
else if (andere Bedingung)
{
    ausführbarer Code
}
else
{
    ausführbarer Code
}

if-Statements ermöglichen es Bedingungen zu prüfen und je nach Ausgang der Prüfung einen bestimmten Codeblock auszuführen. Ist eine Bedingung wahr, wird der dazugehörige Code innerhalb der geschweiften Klammern ausgeführt; ist sie falsch, wird der Block übersprungen. Ein if-Statement besteht immer aus dem if-Block. Optional können beliebig viele else if-Blöcke mit verschiedenen Bedingungen hinzugefügt werden. Ebenfalls optional kann ein else-Block hinzugefügt werden, der ausgeführt wird, wenn keine Bedingung wahr ist.

Bedingungen

if (Bedingung 1 && (Bedingung 2 || Bedingung 3) && !Bedingung 4)

Die Bedingungen stehen in runden Klammern nach dem entsprechenden Schlüsselwort. Es können beliebig viele Bedingungen miteinander verknüpft werden. Die Bedingungen werden von links nach rechts ausgewertet. Zur Verknüpfung stehen verschiedene Operatoren zur Verfügung:

  • &&: Nur wenn beide Bedingungen wahr sind, wird die Verknüpfung beider Bedingungen als wahr gewertet.
  • ||: Es muss nur eine der beiden Bedingungen wahr sein (es dürfen auch beide wahr sein), damit die Verknüpfung als wahr gewertet wird.
  • (): Mit runden Klammern kann wie in der Mathematik die Reihenfolge der Auswertung beeinflusst werden. Zuerst wird das Innere der Klammern ausgewertet.

Möchte man das Ergebnis umkehren (eine wahre Bedingung wird falsch und umgekehrt), setzt man vor die Bedingung ein !.

Beim obenstehenden Beispiel wird der Code des if-Blocks ausgeführt, wenn Bedingung 1 wahr, Bedingung 2 und/oder Bedingung 3 wahr und Bedingung 4 falsch sind.

Zum Vergleich der Werte von zwei Operanden stehen verschiedene Operatoren zur Verfügung:

==: Wahr, wenn beide Operanden den gleichen Wert haben.

!=: Wahr, wenn beide Operanden nicht den gleichen Wert haben.

<, >, <=, >=: Wahr, wenn der linke Operand kleiner, größer, kleiner gleich, größer gleich ist.

Beispiele
if (Wert 1 == Wert 2)
if (Wert 1 != Wert 2)
if (Wert 1 < Wert 2 || Wert 3 > Wert 4)
if (Wert 1 <= Wert 2 && Wert 3 >= Wert 4)

Ternärer Operator ?:

Bedingung ? wenn wahr : wenn falsch

Mit dem ternären Operator können if-Statements in verkürzter Schreibweise dargestellt werden. Dies empfiehlt sich bei einfachen if-Statements, da bei komplexeren Statements die Lesbarkeit leidet. Wenn die Bedingung wahr ist, wird der Code nach dem Fragezeichen ausgeführt, ansonsten der Code nach dem Doppelpunkt.


Hilfsmethoden

Syntax

methoden:nameDerMethode(Argument 1, Argument 2, ...)

In dieser Klasse befinden sich Hilfsmethoden, die in den Formeln aufgerufen werden können, um häufig benötigte Funktionen einfach einzusetzen. Welche Methoden es gibt und welche Parameter eine Methode besitzt, kann der unten stehenden Übersicht entnommen werden.


return-Schlüsselwort

return Wert;

Das return-Schlüsselwort wird in Funktionen und Methoden verwendet, um diese zu beenden und einen Wert zurückzugeben. Wenn eine Formel einen Wert zurückgibt, wird dieser an den Tarifkostenberechner übergeben. Zwar kann in Jexl das return-Schlüsselwort weggelassen werden, weil Jexl automatisch den Wert des letzten evaluierten Statements zurückgibt, aber es ist zu empfehlen das return-Schlüsselwort immer zu verwenden, um die Rückgabe von unerwarteten Werten zu verhindern und kenntlich zu machen, welcher Wert zurückgegeben werden soll.


null-Schlüsselwort

null ist nicht mit der Zahl 0 zu verwechseln. null steht für die Abwesenheit eines Werts. Wenn z. B. einer Variable null zugewiesen ist, dann hat diese Variable keinen Wert. Man kann null nutzen, um vor der Verwendung einer Variable zu prüfen, ob diese einen Wert hat, damit keine Fehler ausgelöst werden.

Beispiel

if (variable == null)
{
    variable = 0;
}

return variable + 1;
  • Field Details

  • Constructor Details

    • JexlService

      public JexlService()
  • Method Details

    • jahr

      public Integer jahr(LocalDate date)
      Extrahiert die Jahreszahl aus dem gegebenen Datum
      Parameters:
      date - Datum, aus dem die Jahreszahl extrahiert werden soll
      Returns:
      Jahreszahl
    • pow

      public BigDecimal pow(Number base, Number exponent)
      Berechnet eine Exponentialfunktion
      Parameters:
      base - Basis
      exponent - Exponent
      Returns:
      Ergebnis der Exponentialfunktion
    • min

      public BigDecimal min(Number firstNumber, Number secondNumber)
      Ermittelt das Minimum aus zwei gegebenen Zahlen
      Parameters:
      firstNumber - Erste Zahl
      secondNumber - Zweite Zahl
      Returns:
      Minimum
    • max

      public BigDecimal max(Number firstNumber, Number secondNumber)
      Ermittelt das Maximum aus zwei gegebenen Zahlen
      Parameters:
      firstNumber - Erste Zahl
      secondNumber - Zweite Zahl
      Returns:
      Maximum
    • nullCheck

      public BigDecimal nullCheck(Number numberToCheck, Number defaultNumber)
      Prüft, ob eine Zahl einen Wert hat
      Parameters:
      numberToCheck - Zu prüfende Zahl
      defaultNumber - Standardwert
      Returns:
      Es wird die zu prüfende Zahl zurückgegeben, falls sie einen Wert hat, ansonsten der Standardwert. Die zurückgegebene Zahl ist immer eine Kommazahl.
    • summeJahr

      public BigDecimal summeJahr(List<BigDecimal> monthValues, Number laufzeitMonate, Number jahr)
      Berechnet die Summe aller Monatswerte eines Jahres für eine Kostenart
      Parameters:
      monthValues - Monatswerte
      laufzeitMonate - Laufzeit des Tarifs in Monaten
      jahr - Jahr, für das die Summe berechnet wird
      Returns:
      Summe aller Werte eines Jahres
    • getGuthabenJahr

      public BigDecimal getGuthabenJahr(List<BigDecimal> monthValues, Number laufzeitJahre, Number jahr)
      Ermittelt das Guthaben eines Jahres
      Parameters:
      monthValues - Monatswerte des Guthabens
      laufzeitJahre - Laufzeit des Tarifs in Jahren
      jahr - Jahr, für das das Guthaben ermittelt wird
      Returns:
      Guthaben eines Jahres
    • summeGesamt

      public BigDecimal summeGesamt(List<BigDecimal> yearValues)
      Berechnet die Summe aus allen Jahreswerten einer Kostenart
      Parameters:
      yearValues - Jahreswerte
      Returns:
      Gesamtwert
    • isBeitragsmonat

      public boolean isBeitragsmonat(Number zahlweise, Number monat)
      Prüft, ob im gegebenen Monat eine Beitragszahlung erfolgt
      Parameters:
      zahlweise - Zahlweise
      monat - Monat
      Returns:
      true, wenn im gegebenen Monat eine Beitragszahlung erfolgt, ansonsten false