blob: 536bca4a06b010fa6caeccb2aa19b5a8dcf8de08 [file] [log] [blame]
package eu.mulk.aendggner.synopse;
import eu.mulk.aendggner.anwendung.BefehlAnwender.AnwendungsErgebnis;
import eu.mulk.aendggner.anwendung.BefehlAnwender.Status;
import eu.mulk.aendggner.gesetz.Gesetz;
import java.util.ArrayList;
import java.util.List;
/** Paart die Normen alter und neuer Fassung zu Synopse-Einträgen. */
public final class SynopseBuilder {
private SynopseBuilder() {}
/**
* @param alt das Stammgesetz vor Anwendung der Befehle.
* @param anwendung das Ergebnis des {@link eu.mulk.aendggner.anwendung.BefehlAnwender}.
* @param parseWarnungen Warnungen aus dem Parsen des Änderungsgesetzes.
* @param vollstaendig auch unveränderte Normen aufnehmen.
*/
public static Synopse baue(
Gesetz alt, AnwendungsErgebnis anwendung, List<String> parseWarnungen, boolean vollstaendig) {
var neu = anwendung.neu();
var eintraege = new ArrayList<Synopse.Eintrag>();
for (var neuNorm : neu.normen()) {
var altNorm = alt.norm(neuNorm.enbez()).orElse(null);
Synopse.Aenderungsart art;
if (altNorm == null) {
art = Synopse.Aenderungsart.NEU;
} else if (neuNorm.weggefallen() && !altNorm.weggefallen()) {
art = Synopse.Aenderungsart.AUFGEHOBEN;
} else if (!gleicherInhalt(altNorm, neuNorm)) {
art = Synopse.Aenderungsart.GEAENDERT;
} else {
art = Synopse.Aenderungsart.UNVERAENDERT;
}
if (art == Synopse.Aenderungsart.UNVERAENDERT && !vollstaendig) {
continue;
}
var ursachen =
anwendung.protokoll().stream()
.filter(a -> a.betroffeneEnbez().contains(neuNorm.enbez()))
.toList();
eintraege.add(new Synopse.Eintrag(altNorm, neuNorm, art, ursachen));
}
var manuell =
anwendung.protokoll().stream().filter(a -> a.status() == Status.MANUELL_PRUEFEN).toList();
return new Synopse(alt, neu, eintraege, gliederungsAenderungen(alt, neu), manuell, parseWarnungen);
}
/** Paart die Gliederungseinheiten nach Kennzahl und sammelt die mit geänderter Überschrift. */
private static List<Synopse.GliederungsAenderung> gliederungsAenderungen(Gesetz alt, Gesetz neu) {
var aenderungen = new ArrayList<Synopse.GliederungsAenderung>();
for (var neuG : neu.gliederungen()) {
alt.gliederungen().stream()
.filter(a -> java.util.Objects.equals(a.kennzahl(), neuG.kennzahl()))
.filter(a -> a.kennzahl() != null)
.findFirst()
.filter(a -> !java.util.Objects.equals(a.titel(), neuG.titel()))
.ifPresent(a -> aenderungen.add(new Synopse.GliederungsAenderung(a, neuG)));
}
return aenderungen;
}
private static boolean gleicherInhalt(
eu.mulk.aendggner.gesetz.Norm a, eu.mulk.aendggner.gesetz.Norm b) {
return a.gesamtText().equals(b.gesamtText()) && java.util.Objects.equals(a.titel(), b.titel());
}
}