Risikoobjekte werden auch mit RDF verarbeitet. Plausi art hinzugefügt. Häufigere prüfung von Plausis. Attribute können änderbar oder nicht änderbar gesetzt werden. Sortieren angepasst.

This commit is contained in:
2025-10-22 15:15:47 +02:00
parent be122fec9a
commit 2c9492938e
9 changed files with 334 additions and 176 deletions

View File

@@ -209,7 +209,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xs
<artifactId>javafx-maven-plugin</artifactId>
<version>0.0.8</version>
<configuration>
<mainClass>at.vvo.omds.client.gui.AllinOneView</mainClass>
<mainClass>at.vvo.omds.client.gui.MainView</mainClass>
</configuration>
</plugin>
</plugins>

View File

@@ -88,9 +88,9 @@ public class ItemAttribute {
&& infoBoxFromItem.get(newSelection).get(stringAttribut) != null
&& !infoBoxFromItem.get(newSelection).get(stringAttribut).isEmpty()){
textField.setText(infoBoxFromItem.get(newSelection).get(stringAttribut));
} else if (stringAttribut.getValue() != null) {
} else if (stringAttribut.getValue() != null && !stringAttribut.getValue().equals("null")) {
textField.setText(stringAttribut.getValue());
} else if (stringAttribut.getValue() == null && stringAttribut.getDefault() != null) {
} else if (stringAttribut.getDefault() != null) {
textField.setText(stringAttribut.getDefault());
}
textField.setPromptText("Text eingeben");
@@ -113,9 +113,9 @@ public class ItemAttribute {
&& infoBoxFromItem.get(newSelection).get(attributDezimal) != null
&& !infoBoxFromItem.get(newSelection).get(attributDezimal).isEmpty()){
textField.setText(infoBoxFromItem.get(newSelection).get(attributDezimal));
} else if (attributDezimal.getValue() != null) {
} else if (attributDezimal.getValue() != null && !(attributDezimal.getValue().toString().equals("-1"))) {
textField.setText(attributDezimal.getValue().toString());
} else if (attributDezimal.getValue() == null && attributDezimal.getDefault() != null) {
} else if (attributDezimal.getDefault() != null) {
textField.setText(attributDezimal.getDefault().toString());
}
textField.setPromptText("Dezimalzahl eingeben");
@@ -136,9 +136,9 @@ public class ItemAttribute {
&& infoBoxFromItem.get(newSelection).get(attributInt) != null
&& !infoBoxFromItem.get(newSelection).get(attributInt).isEmpty()){
textField.setText(infoBoxFromItem.get(newSelection).get(attributInt));
} else if (attributInt.getValue() != null) {
} else if (attributInt.getValue() != null && !attributInt.getValue().equals(-1)) {
textField.setText(attributInt.getValue().toString());
} else if (attributInt.getValue() == null && attributInt.getDefault() != null) {
} else if (attributInt.getDefault() != null) {
textField.setText(attributInt.getDefault().toString());
}
textField.setPromptText("Ganzzahl eingeben");
@@ -309,16 +309,18 @@ public class ItemAttribute {
+ ((FahrzeugType) risikoobjekte.get(i)).getBaujahr() + ")");
int finalI = i;
if (((ProduktbausteinType) newSelection.getValue().getProdukt()).getVersicherteObjekte().stream().anyMatch(v -> ((FahrzeugType) v).getHandelsbez().equals(((FahrzeugType) risikoobjekte.get(finalI)).getHandelsbez()))) {
if (((ProduktbausteinType) newSelection.getValue().getProdukt()).getVersicherteObjekte()
.stream().anyMatch(v -> ((FahrzeugType) v).getHandelsbez()
.equals(((FahrzeugType) risikoobjekte.get(finalI)).getHandelsbez()))) {
checkBox.setSelected(true);
}
checkBox.selectedProperty().addListener((observableValue, oldValue, newValue) -> {
if (newValue) {
((ProduktbausteinType) newSelection.getValue().getProdukt()).getVersicherteObjekte().add(risikoobjekte.get(finalI));
} else {
((ProduktbausteinType) newSelection.getValue().getProdukt()).getVersicherteObjekte().remove(risikoobjekte.get(finalI));
((ProduktbausteinType) newSelection.getValue().getProdukt()).getVersicherteObjekte().remove(finalI);
}
});
}
@@ -340,6 +342,7 @@ public class ItemAttribute {
if (produktbaustein.getMeldungen() != null && !produktbaustein.getMeldungen().isEmpty()) {
attributBox.getChildren().removeIf(n -> n.getId() != null && n.getId().equals("faultsbox"));
VBox faultsBox = new VBox();
faultsBox.setId("faultsbox");
for (ServiceFault sf : produktbaustein.getMeldungen()) {
HBox singleFaultBox = new HBox();
@@ -357,7 +360,7 @@ public class ItemAttribute {
singleFaultBox.getChildren().addAll(symbole, errorText);
singleFaultBox.setId("singleFaultBox");
faultsBox.getChildren().add(singleFaultBox);
faultsBox.getChildren().add(singleFaultBox);
}
if (!faultsBox.getChildren().isEmpty()) {
@@ -405,16 +408,17 @@ public class ItemAttribute {
vpLabel.setPadding(new Insets(10));
attributBox.getChildren().addFirst(vpLabel);
VBox vpMeldungenTexts = new VBox();
vp.getMeldungen().forEach( m -> {
Label vpMeldungText = new Label(m.getErrorMsg() + System.lineSeparator());
vpMeldungText.setPadding(new Insets(10));
vpMeldungenTexts.getChildren().add(vpMeldungText);
});
// VBox vpMeldungenTexts = new VBox();
// vp.getMeldungen().forEach( m -> {
// Label vpMeldungText = new Label(m.getErrorMsg() + System.lineSeparator());
// vpMeldungText.setPadding(new Insets(10));
//
// vpMeldungenTexts.getChildren().add(vpMeldungText);
// });
attributBox.getChildren().removeIf(c -> c.getId() != null && c.getId().equals("vpMeldungenTexts"));
attributBox.getChildren().addAll(vpMeldungenTexts);
// attributBox.getChildren().addAll(vpMeldungenTexts);
return attributBox;
}

View File

@@ -40,7 +40,7 @@ import java.util.*;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicReference;
public class AllinOneView extends Application {
public class MainView extends Application {
Map<String, Integer> timesItemisIncludedById = new HashMap<>();
Map<TreeItem<GuiProdukt>, Map<AttributType, String>> infoBoxFromItem = new HashMap<>();
@@ -58,7 +58,7 @@ public class AllinOneView extends Application {
public void start(Stage stage) {
stage.setTitle("OMDS Client");
stage.getIcons().add(new Image(AllinOneView.class.getResourceAsStream("/logo/VVO_Logo_2024.png")));
stage.getIcons().add(new Image(MainView.class.getResourceAsStream("/logo/VVO_Logo_2024.png")));
TabPane tabPane = new TabPane();
Tab baumView = new Tab("Deckungsbaum");
@@ -285,11 +285,13 @@ public class AllinOneView extends Application {
tv.getSelectionModel().selectedItemProperty().addListener((obs, oldSelection, newSelection) -> {
if (newSelection != null) {
if (!infoBox.getChildren().isEmpty()) {
infoBox.getChildren().removeAll(infoBox.getChildren());
}
if (isMeldungVorhanden((ProduktbausteinType) newSelection.getValue().getProdukt(), tv)){
((ProduktbausteinType) newSelection.getValue().getProdukt()).getAttribute().removeIf(a -> a.getBezeichnung().equals("Praemie"));
}
ItemAttribute itemAttribute = new ItemAttribute();
itemAttribute.setRisikoobjekte(risikoobjektView.getRisikoobjekte());
if (!infoBoxFromItem.isEmpty()) itemAttribute.setInfoBoxFromItem(infoBoxFromItem);
@@ -389,7 +391,7 @@ public class AllinOneView extends Application {
TreeItem<GuiProdukt> clone = null;
try {
clone = treeHelper.cloneTreeItem(
treeHelper.findTreeItem((ProduktbausteinType) item.getProdukt(), originalRoot));
treeHelper.findTreeItem((ProduktbausteinType) item.getProdukt(), tv.getRoot()));
} catch (Exception ex) {
throw new RuntimeException(ex);
}
@@ -402,22 +404,11 @@ public class AllinOneView extends Application {
tv.refresh();
}
VerkaufsproduktType neuRoot = checkPlausis(plausiList, tv.getRoot());
TreeItem<GuiProdukt> newRoot = new TreeItem<>(new GuiProdukt(neuRoot));
newRoot.setExpanded(true);
try {
treeHelper.produktToTree(neuRoot, newRoot);
TreeItem<GuiProdukt> abc = new TreeItem<>();
treeHelper.aprioriProduktToTree(verkaufsprodukt, abc);
tv.setRoot(treeHelper.sortTree(treeHelper.addAprioriToCalc(newRoot, abc)));
// tv.setRoot(treeHelper.sortTree(newRoot));
TreeItem<GuiProdukt> newRoot = checkPlausis(plausiList, tv.getRoot(), verkaufsprodukt);
if (newRoot != null) {
newRoot.setExpanded(true);
tv.setRoot(newRoot);
tv.refresh();
} catch (Exception ex) {
throw new RuntimeException(ex);
}
});
@@ -445,6 +436,15 @@ public class AllinOneView extends Application {
} else {
getTreeItem().getParent().getChildren().remove((getTreeItem()));
}
TreeItem<GuiProdukt> newRoot = checkPlausis(plausiList, tv.getRoot(), verkaufsprodukt);
if (newRoot != null) {
newRoot.setExpanded(true);
tv.setRoot(newRoot);
tv.refresh();
}
timesItemisIncludedById.clear();
refreshTimesItemisIncludedById(tv.getRoot());
});
@@ -486,19 +486,29 @@ public class AllinOneView extends Application {
treeHelper.setTimesItemisIncludedById(timesItemisIncludedById);
if (serverBtn.isSelected()) {
VerkaufsproduktType calcResponse = s.calculateRDFAuskunft(new TreeView<>(cleanedRoot), stichtag.get());
newRoot.getValue().setProdukt(calcResponse);
treeHelper.produktToTree(calcResponse, newRoot);
}else {
CalculateResponse calcResponse = s.calculateAuskunft(new TreeView<>(cleanedRoot), stichtag.get());
newRoot.getValue().setProdukt(calcResponse.getBerechnungsantwort().getVerkaufsprodukt());
treeHelper.produktToTree(calcResponse.getBerechnungsantwort().getVerkaufsprodukt(), newRoot);
}
timesItemisIncludedById = treeHelper.getTimesItemisIncludedById();
newRoot.setExpanded(true);
newRoot = treeHelper.addAprioriToCalc(newRoot, originalRoot);
newRoot = treeHelper.sortTree(newRoot);
tv.setRoot(newRoot);
TreeItem<GuiProdukt> finalRoot = checkPlausis(plausiList, newRoot, verkaufsprodukt);
if (finalRoot != null) {
finalRoot.setExpanded(true);
tv.setRoot(finalRoot);
} else {
newRoot = treeHelper.addAprioriToCalc(newRoot, originalRoot);
newRoot = treeHelper.sortTree(newRoot);
tv.setRoot(newRoot);
}
timesItemisIncludedById.clear();
refreshTimesItemisIncludedById(tv.getRoot());
@@ -574,7 +584,7 @@ public class AllinOneView extends Application {
}
}
private boolean shouldBeIncluded(TreeItem<GuiProdukt> treeItem) {
public boolean shouldBeIncluded(TreeItem<GuiProdukt> treeItem) {
return !(((treeItem.getParent() != null && treeItem.getParent().getValue().isNotIncluded()) || treeItem.getValue().isNotIncluded() ||
(((ProduktbausteinType) treeItem.getValue().getProdukt()).getMinVorkommen() != null && ((ProduktbausteinType) treeItem.getValue().getProdukt()).getMinVorkommen() == 0 &&
(timesItemisIncludedById.get(((ProduktbausteinType) treeItem.getValue().getProdukt()).getId()) == null ||
@@ -634,7 +644,7 @@ public class AllinOneView extends Application {
return erg;
}
private boolean isMeldungVorhanden(ProduktbausteinType produkt, TreeView<GuiProdukt> tv) {
public boolean isMeldungVorhanden(ProduktbausteinType produkt, TreeView<GuiProdukt> tv) {
TreeHelper treeHelper = new TreeHelper();
TreeItem<GuiProdukt> actual = treeHelper.findTreeItem(produkt, tv.getRoot());
@@ -647,7 +657,7 @@ public class AllinOneView extends Application {
return false;
}
public VerkaufsproduktType checkPlausis(List<Plausi> plausiList, TreeItem<GuiProdukt> vp){
public TreeItem<GuiProdukt> checkPlausis(List<Plausi> plausiList, TreeItem<GuiProdukt> vp, APrioriProduktbausteinType verkaufsprodukt){
Repository repo = new SailRepository(new MemoryStore());
repo.init();
@@ -656,19 +666,43 @@ public class AllinOneView extends Application {
conn.add(model);
for (Plausi plausi : plausiList) {
String sparql = plausi.getQuery();
plausiList.stream().filter(p -> p.getArt().equals("update")).forEach(p -> {
String query = p.getQuery();
conn.prepareUpdate(query).execute();
});
model.clear();
conn.getStatements(null, null, null).forEach(model::add);
plausiList.stream().filter(p -> p.getArt().equals("graph")).forEach(p -> {
String sparql = p.getQuery();
GraphQuery q = conn.prepareGraphQuery(sparql);
Model validatedModel = QueryResults.asModel(q.evaluate());
model.addAll(validatedModel);
});
}
ByteArrayOutputStream baos = new ByteArrayOutputStream();
Rio.write(model, baos, RDFFormat.JSONLD);
return rdfHelper.calculateRequestToVerkaufsprodukt(baos.toString());
VerkaufsproduktType neuRoot = rdfHelper.calculateRequestToVerkaufsprodukt(baos.toString());
TreeItem<GuiProdukt> newRoot = new TreeItem<>(new GuiProdukt(neuRoot));
newRoot.setExpanded(true);
try {
treeHelper.produktToTree(neuRoot, newRoot);
TreeItem<GuiProdukt> aprioriTree = new TreeItem<>();
treeHelper.aprioriProduktToTree(verkaufsprodukt, aprioriTree);
return (treeHelper.sortTree(treeHelper.addAprioriToCalc(newRoot, aprioriTree)));
} catch (Exception ex) {
throw new RuntimeException(ex);
}
} catch(Exception ignored) {
ignored.printStackTrace();
System.out.println("CheckPlausi: " + ignored.getMessage());
return null;
}

View File

@@ -3,11 +3,14 @@ package at.vvo.omds.client.gui;
public class Plausi {
String id;
String beschreibung;
String art;
String query;
public Plausi(String name, String beschreibung, String query) {
public Plausi(String name, String beschreibung,String art, String query) {
this.id = name;
this.beschreibung = beschreibung;
this.art = art;
this.query = query;
}
@@ -34,4 +37,8 @@ public class Plausi {
public void setQuery(String query) {
this.query = query;
}
public String getArt() { return art; }
public void setArt(String art) { this.art = art; }
}

View File

@@ -1,6 +1,9 @@
package at.vvo.omds.client.gui;
import at.vvo.omds.types.omds3.r2025_05.common.*;
import at.vvo.omds.types.omds3.r2025_05.on2antrag.sachPrivat.RisikoGebaeudeType;
import at.vvo.omds.types.omds3.r2025_05.on2antrag.sachPrivat.RisikoHaushaltType;
import at.vvo.omds.types.omds3.r2025_05.on2antrag.sachPrivat.VersichertesObjektSachPrivatType;
import jakarta.xml.bind.JAXBElement;
import javafx.scene.control.TreeItem;
import javafx.util.Pair;
@@ -49,7 +52,6 @@ public class RDFHelper {
private List<Pair<String, AttributType>> getAttributesFromRequest(String response) throws IOException {
Model model = Rio.parse(new StringReader(response), "", RDFFormat.JSONLD);
Rio.write(model, System.out, RDFFormat.TURTLE);
List<Pair<String, AttributType>> erg = new ArrayList<>();
String baseIri = "http://vvo.pisanoapi.at/";
@@ -61,12 +63,15 @@ public class RDFHelper {
IRI minIri = iri(baseIri + "min");
IRI defaultIri = iri(baseIri + "default");
IRI valueIri = iri(baseIri + "value");
IRI aenderbarIri = iri(baseIri + "aenderbar");
for (Resource iri : Models.subjectIRIs(model)) {
String bez = Models.objectLiteral(model.filter(iri, bezIri, null)).map(Literal::getLabel).orElse(null);
String prodId = Models.objectResource(model.filter(iri, produktIri, null)).map(Resource::stringValue).orElse(null);
Boolean required = Boolean.valueOf(Models.objectLiteral(model.filter(iri, requiredIri, null)).map(Literal::getLabel).orElse(null));
Boolean aenderbar = Boolean.valueOf(Models.objectLiteral(model.filter(iri, aenderbarIri, null)).map(Literal::getLabel).orElse("true"));
if (iri.stringValue().contains("ElemBoolean")) {
AttributBooleanType ab = new AttributBooleanType();
@@ -81,6 +86,7 @@ public class RDFHelper {
ab.setDefault(def);
ab.setPflichtfeld(required);
ab.setValue(val);
ab.setAenderbar(aenderbar);
Pair<String, AttributType> atPair = new Pair<>(prodId, ab);
erg.add(atPair);
@@ -100,7 +106,8 @@ public class RDFHelper {
ai.setPflichtfeld(required);
ai.setMax(max);
ai.setMin(min);
ai.setValue(val);
if (!val.equals(-1))ai.setValue(val);
ai.setAenderbar(aenderbar);
Pair<String, AttributType> atPair = new Pair<>(prodId, ai);
erg.add(atPair);
@@ -120,7 +127,8 @@ public class RDFHelper {
ad.setPflichtfeld(required);
ad.setMax(max);
ad.setMin(min);
ad.setValue(val);
if (!val.equals(BigDecimal.valueOf(-1)))ad.setValue(val);
ad.setAenderbar(aenderbar);
Pair<String, AttributType> atPair = new Pair<>(prodId, ad);
erg.add(atPair);
@@ -137,6 +145,7 @@ public class RDFHelper {
as.setDefault(def);
as.setPflichtfeld(required);
as.setValue(val);
as.setAenderbar(aenderbar);
Pair<String, AttributType> atPair = new Pair<>(prodId, as);
erg.add(atPair);
@@ -151,8 +160,8 @@ public class RDFHelper {
Model model = Rio.parse(new StringReader(response), "", RDFFormat.JSONLD);
for (Resource iri : Models.subjectIRIs(model)) {
if (iri.stringValue().contains("plausi")) {
String id = iri.stringValue().replace("http://vvo.pisanoapi.at/plausi", "");
if (iri.stringValue().contains("Plausi")) {
String id = iri.stringValue().replace("http://vvo.pisanoapi.at/Plausi", "");
ValueFactory vf = SimpleValueFactory.getInstance();
String beschreibung = Models.objectLiteral(model.filter(iri, vf.createIRI(
@@ -161,7 +170,10 @@ public class RDFHelper {
String query = Models.objectLiteral(model.filter(iri, vf.createIRI(
"http://vvo.pisanoapi.at/query"), null)).map(Literal::getLabel).orElse(null);
result.add(new Plausi(id, beschreibung, query));
String art = Models.objectLiteral(model.filter(iri, vf.createIRI(
"http://vvo.pisanoapi.at/art"), null)).map(Literal::getLabel).orElse(null);
result.add(new Plausi(id, beschreibung, art, query));
}
}
return result;
@@ -177,8 +189,6 @@ public class RDFHelper {
if (iri.stringValue().contains("ProdElement")) {
String id = iri.stringValue();
System.out.println(iri.stringValue());
ValueFactory vf = SimpleValueFactory.getInstance();
int insId = Integer.parseInt(Models.objectLiteral(model.filter(iri, vf.createIRI(
@@ -205,7 +215,7 @@ public class RDFHelper {
.map(Literal::getLabel).orElse(null)) : null;
Optional<String> parentId = Models.objectResource(model.filter(iri, vf.createIRI(
"http://vvo.pisanoapi.at/parent"), null)).map(Resource::stringValue);
"http://vvo.pisanoapi.at/Parent"), null)).map(Resource::stringValue);
APrioriProduktbausteinType verkaufsproduktType;
if (parentId.isPresent()) {
@@ -241,8 +251,6 @@ public class RDFHelper {
Object baustein = entry.getValue();
String parentId = parents.get(id);
System.out.println(id + " " + baustein.getClass().getName());
if (parentId != null && bausteine.containsKey(parentId)){
bausteine.get(parentId).getBausteine().add((APrioriUnterbausteinType) baustein);
}else {
@@ -254,7 +262,6 @@ public class RDFHelper {
}
public VerkaufsproduktType getCalculateRDF(String r) throws DatatypeConfigurationException, IOException {
return calculateRequestToVerkaufsprodukt(restClient.post()
.uri("http://localhost:9090/CalculateRequest")
.contentType(MediaType.APPLICATION_JSON)
@@ -271,8 +278,12 @@ public class RDFHelper {
Map<String, String> parents = new HashMap<>();
List<Pair<String, AttributType>> attListe = getAttributesFromRequest(calculateRequest);
for (Resource iri : Models.subjectIRIs(model)) {
List<Pair<String, FahrzeugType>> risikoObjektListe = getRisikoObjekteFromRequest(calculateRequest);
List<Resource> subjects = new ArrayList<>(Models.subjectIRIs(model));
Collections.reverse(subjects);
for (Resource iri : subjects) {
if (iri.stringValue().contains("Prod")) {
String id = iri.stringValue();
@@ -290,8 +301,21 @@ public class RDFHelper {
"http://vvo.pisanoapi.at/type"), null)).map(Literal::getLabel).orElse(null);
String risikoobjektType = Models.objectLiteral(model.filter(iri, vf.createIRI(
"http://vvo.pisanoapi.at/risikoobjektType"), null)).map(Literal::getLabel).orElse(null);
String meldung = Models.objectLiteral(model.filter(iri, vf.createIRI(
"http://vvo.pisanoapi.at/meldung"), null)).map(Literal::getLabel).orElse(null);
List<ServiceFault> meldungen = model.filter(iri, vf.createIRI(
"http://vvo.pisanoapi.at/Meldung"), null).objects().stream()
.filter(s -> s instanceof IRI).map(s -> {
IRI spezMeldung = (IRI) s;
String msg = Models.objectLiteral(model.filter(spezMeldung, vf.createIRI("http://vvo.pisanoapi.at/errorMsg"), null)).map(Literal::getLabel).orElse(null);
String errorType = Models.objectLiteral(model.filter(spezMeldung, vf.createIRI("http://vvo.pisanoapi.at/errorType"), null)).map(Literal::getLabel).orElse(null);
ServiceFault serviceFault = new ServiceFault();
serviceFault.setErrorMsg(msg);
serviceFault.setErrorType(BigInteger.valueOf(Integer.parseInt("1")));
return serviceFault;
}).toList();
XMLGregorianCalendar verkaufsoffenVon = Models.objectLiteral(model.filter(iri, vf.createIRI(
"http://vvo.pisanoapi.at/salesFrom"), null)).map(Literal::getLabel).isPresent() ? DatatypeFactory.newInstance().newXMLGregorianCalendar(
Models.objectLiteral(model.filter(iri, vf.createIRI(
@@ -300,12 +324,16 @@ public class RDFHelper {
"http://vvo.pisanoapi.at/salesTo"), null)).map(Literal::getLabel).isPresent() ? DatatypeFactory.newInstance().newXMLGregorianCalendar(
Models.objectLiteral(model.filter(iri, vf.createIRI(
"http://vvo.pisanoapi.at/salesTo"), null)).map(Literal::getLabel).orElse(null)) : null;
List<String> fahrzeuge = model.filter(iri, vf.createIRI(
"http://vvo.pisanoapi.at/VersichertesInteresseType"), null).objects().stream()
.filter(s -> s instanceof IRI).map(Value::stringValue).toList();
Optional<String> parentId = Models.objectResource(model.filter(iri, vf.createIRI(
"http://vvo.pisanoapi.at/parent"), null)).map(Resource::stringValue);
"http://vvo.pisanoapi.at/Parent"), null)).map(Resource::stringValue);
ObjectFactoryFactory off = new ObjectFactoryFactory();
ProduktbausteinType verkaufsproduktType = (ProduktbausteinType) off.create(type);
ProduktbausteinType verkaufsproduktType = off.create(type);
verkaufsproduktType.setId(iri.stringValue().substring("http://vvo.pisanoapi.at/ProdElement".length(), iri.stringValue().indexOf("-") > 0 ? iri.stringValue().indexOf("-") : iri.stringValue().length()));
verkaufsproduktType.setBezeichnung(bez);
@@ -316,11 +344,21 @@ public class RDFHelper {
verkaufsproduktType.setMinVorkommen(minOccurrence);
verkaufsproduktType.setRisikoobjektErforderlich(risikoobjektType != null);
if (meldung != null) {
ServiceFault tmp = new ServiceFault();
tmp.setErrorMsg(meldung);
tmp.setErrorType(BigInteger.ONE);
verkaufsproduktType.getMeldungen().add(tmp);
for (ServiceFault meldung : meldungen) {
if (meldung != null) {
ServiceFault tmp = new ServiceFault();
tmp.setErrorMsg(meldung.getErrorMsg());
tmp.setErrorType(meldung.getErrorType());
verkaufsproduktType.getMeldungen().add(tmp);
}
}
for (Pair<String, FahrzeugType> pair : risikoObjektListe) {
for (String fahrzeugId : fahrzeuge) {
if (pair.getKey().equals(fahrzeugId)) {
verkaufsproduktType.getVersicherteObjekte().add(pair.getValue());
}
}
}
for (Pair<String, AttributType> pair : attListe) {
@@ -336,6 +374,7 @@ public class RDFHelper {
List<VerkaufsproduktType> verkaufsprodukteList = new ArrayList<>();
for (Map.Entry<String, ProduktbausteinType> entry : bausteine.entrySet()){
String id = entry.getKey();
ProduktbausteinType baustein = entry.getValue();
@@ -351,17 +390,86 @@ public class RDFHelper {
return verkaufsprodukteList.getFirst();
}
private List<Pair<String, FahrzeugType>> getRisikoObjekteFromRequest(String calculateRequest) throws IOException, DatatypeConfigurationException {
Model model = Rio.parse(new StringReader(calculateRequest), "", RDFFormat.JSONLD);
List<Pair<String, FahrzeugType>> erg = new ArrayList<>();
String baseIri = "http://vvo.pisanoapi.at/";
IRI bezIri = iri(baseIri + "bez");
IRI baujahrIri = iri(baseIri + "baujahr");
IRI erstzulassungIri = iri(baseIri + "erstzulassung");
for (Resource iri : Models.subjectIRIs(model)) {
if (iri.stringValue().contains("Fahrzeug")) {
String id = iri.stringValue();
String bez = Models.objectLiteral(model.filter(iri, bezIri, null)).map(Literal::getLabel).orElse(null);
int baujahr = Integer.parseInt(Models.objectLiteral(model.filter(iri, baujahrIri, null)).map(Literal::getLabel).orElse("-1"));
XMLGregorianCalendar erstzulassung = Models.objectLiteral(model.filter(iri, erstzulassungIri, null)).map(Literal::getLabel).isPresent() ? DatatypeFactory.newInstance().newXMLGregorianCalendar(
Models.objectLiteral(model.filter(iri, erstzulassungIri, null)).map(Literal::getLabel).orElse(null)) : null;
FahrzeugType fahrzeug = new FahrzeugType();
fahrzeug.setErstzulassdat(erstzulassung);
fahrzeug.setBaujahr(baujahr);
fahrzeug.setHandelsbez(bez);
erg.add(new Pair<>(id, fahrzeug));
}
}
return erg;
}
public Model createRdfModel(TreeItem<GuiProdukt> vp) {
Model erg = new LinkedHashModel();
String baseIri = "http://vvo.pisanoapi.at/";
Map<String,Integer> occCounter = new HashMap<>();
addProduktToModel(vp, erg, baseIri, null, occCounter);
Map<String, Integer> idCount = new LinkedHashMap<>();
createIdCount(idCount, vp);
Map<TreeItem<GuiProdukt>, IRI> iriMap = new LinkedHashMap<>();
createIriMap(vp, baseIri, idCount, iriMap);
addProduktToModel(vp, erg, baseIri, null, iriMap);
Rio.write(erg, System.out, RDFFormat.TURTLE);
return erg;
}
public void addProduktToModel(TreeItem<GuiProdukt> guiProdukt, Model model, String baseIri, String parentId, Map<String,Integer> occCounter) {
private void createIdCount(Map<String, Integer> idCount, TreeItem<GuiProdukt> vp) {
if (!idCount.containsKey(((ProduktbausteinType) vp.getValue().getProdukt()).getId())) {
idCount.put(((ProduktbausteinType) vp.getValue().getProdukt()).getId(), 1);
}else {
idCount.put(((ProduktbausteinType) vp.getValue().getProdukt()).getId(), idCount.get(((ProduktbausteinType) vp.getValue().getProdukt()).getId()) + 1);
}
for (TreeItem<GuiProdukt> child : vp.getChildren()){
createIdCount(idCount, child);
}
}
private void createIriMap(TreeItem<GuiProdukt> produkt, String baseIri, Map<String, Integer> idCount, Map<TreeItem<GuiProdukt>, IRI> iriMap) {
IRI baseElemIri = iri(baseIri + "ProdElement");
for (int i = 1; i < idCount.get(((ProduktbausteinType)produkt.getValue().getProdukt()).getId())+1; i++) {
IRI tmpIri = iri(baseElemIri + ((ProduktbausteinType) produkt.getValue().getProdukt()).getId() + "-" + i);
if (!iriMap.containsValue(tmpIri)) {
iriMap.put(produkt, tmpIri);
break;
}
}
for (TreeItem<GuiProdukt> child : produkt.getChildren()){
createIriMap(child, baseIri, idCount, iriMap);
}
}
public void addProduktToModel(TreeItem<GuiProdukt> guiProdukt, Model model, String baseIri, String parentId, Map<TreeItem<GuiProdukt>, IRI> iriMap) {
ProduktbausteinType produkt = (ProduktbausteinType) guiProdukt.getValue().getProdukt();
IRI prodelemIri = iri(baseIri + "ProdElement");
@@ -374,21 +482,24 @@ public class RDFHelper {
IRI maxOccurrenceIri = iri(baseIri + "maxOccurrence");
IRI typeIri = iri(baseIri + "type");
IRI risikoobjektTypeIri = iri(baseIri + "risikoobjektType");
IRI bausteinIri = iri(baseIri + "baustein");
IRI parentIri = iri(baseIri + "parent");
IRI bausteinIri = iri(baseIri + "Baustein");
IRI parentIri = iri(baseIri + "Parent");
int occ = occCounter.merge(String.valueOf(produkt.getId()), 1, Integer::sum);
IRI vpIri = iri(baseIri + "ProdElement" + produkt.getId() + "-" + occ);
IRI vpIri = iriMap.get(guiProdukt);
if (!guiProdukt.getValue().isNotIncluded()) {
model.add(vpIri, RDF.TYPE, prodelemIri);
model.add(vpIri, bezIri, Values.literal(produkt.getBezeichnung()));
model.add(vpIri, salesFromIri, Values.literal(produkt.getVerkaufsoffenVon()));
if (produkt.getVerkaufsoffenVon() != null)
model.add(vpIri, salesFromIri, Values.literal(produkt.getVerkaufsoffenVon()));
if (produkt.getVerkaufsoffenBis() != null)
model.add(vpIri, salesToIri, Values.literal(produkt.getVerkaufsoffenBis()));
model.add(vpIri, minOccurrenceIri, Values.literal(produkt.getMinVorkommen()));
model.add(vpIri, maxOccurrenceIri, Values.literal(produkt.getMaxVorkommen()));
if (produkt.getMinVorkommen() != null)
model.add(vpIri, minOccurrenceIri, Values.literal(produkt.getMinVorkommen()));
if (produkt.getMaxVorkommen() != null)
model.add(vpIri, maxOccurrenceIri, Values.literal(produkt.getMaxVorkommen()));
model.add(vpIri, typeIri, Values.literal(produkt.getTyp()));
if (produkt.isRisikoobjektErforderlich()) model.add(vpIri, risikoobjektTypeIri, Values.literal("FahrzeugType"));
if (parentId != null) model.add(vpIri, parentIri, Values.iri(parentId));
@@ -402,6 +513,7 @@ public class RDFHelper {
IRI atMax = iri(baseIri + "max");
IRI atMin = iri(baseIri + "min");
IRI atDefault = iri(baseIri + "default");
IRI atAenderbar = iri(baseIri + "aenderbar");
if (attribut instanceof AttributIntType){
IRI specificAt = iri(baseIri + "ElemInt" + attribut.getId());
@@ -414,6 +526,7 @@ public class RDFHelper {
model.add(specificAt, atMax, Values.literal(((AttributIntType) attribut).getMax()));
model.add(specificAt, atMin, Values.literal(((AttributIntType) attribut).getMin()));
model.add(specificAt, atDefault, Values.literal(((AttributIntType) attribut).getDefault()));
model.add(specificAt, atAenderbar, Values.literal(attribut.isAenderbar() != null ? attribut.isAenderbar().toString() : true));
} else if (attribut instanceof AttributBooleanType) {
IRI specificAt = iri(baseIri + "ElemBoolean" + attribut.getId());
@@ -444,24 +557,64 @@ public class RDFHelper {
if (((AttributDezimalType) attribut).getValue() != null) model.add(specificAt, atValue, Values.literal(((AttributDezimalType) attribut).getValue()));
model.add(specificAt, atProd, vpIri);
if (((AttributDezimalType) attribut).getMax() != null) model.add(specificAt, atMax, Values.literal(((AttributDezimalType) attribut).getMax()));
if (((AttributDezimalType) attribut).getMin() != null)model.add(specificAt, atMin, Values.literal(((AttributDezimalType) attribut).getMin()));
if (((AttributDezimalType) attribut).getDefault() != null)model.add(specificAt, atDefault, Values.literal(((AttributDezimalType) attribut).getDefault()));
if (((AttributDezimalType) attribut).getMin() != null) model.add(specificAt, atMin, Values.literal(((AttributDezimalType) attribut).getMin()));
if (((AttributDezimalType) attribut).getDefault() != null) model.add(specificAt, atDefault, Values.literal(((AttributDezimalType) attribut).getDefault()));
}
}
int meldungId = 1;
for (ServiceFault sf : produkt.getMeldungen()){
IRI meldung = iri(baseIri + "Meldung");
IRI spezMeldung = iri(baseIri + "Meldung" + meldungId);
IRI meldungMsg = iri(baseIri + "errorMsg");
IRI meldungType = iri(baseIri + "errorType");
model.add(vpIri, meldung, spezMeldung);
model.add(spezMeldung, meldungMsg, Values.literal(sf.getErrorMsg()));
model.add(spezMeldung, meldungType, Values.literal(sf.getErrorType()));
meldungId++;
}
int fahrzeugId = 1;
for (VersichertesInteresseType ro : produkt.getVersicherteObjekte()){
if (ro instanceof FahrzeugType fa){
IRI fahrzeugIri = iri(baseIri + "FahrzeugType");
IRI faIri = iri(fahrzeugIri.stringValue() + fahrzeugId);
IRI faBaujahrIri = iri(baseIri + "baujahr");
IRI faBezIri = iri(baseIri + "bez");
IRI faErstZuIri = iri(baseIri + "erstzulassung");
IRI prodRoIri = iri(baseIri + "VersichertesInteresseType");
model.add(faIri, RDF.TYPE, fahrzeugIri);
model.add(faIri, faBaujahrIri, Values.literal(fa.getBaujahr()));
model.add(faIri, faBezIri, Values.literal(fa.getHandelsbez()));
model.add(faIri, faErstZuIri, Values.literal(fa.getErstzulassdat()));
model.add(vpIri, prodRoIri, faIri);
fahrzeugId++;
} else if (ro instanceof VersicherteLiegenschaftType) {
//To-Do
} else if (ro instanceof RisikoGebaeudeType) {
//To-Do
}else if (ro instanceof RisikoHaushaltType) {
//To-Do
}else if (ro instanceof VersichertePersonType) {
//To-Do
}else if (ro instanceof VersichertesObjektSachPrivatType) {
//To-Do
}
}
// for (int i = 0; i < vp.getVersicherteObjekte().size(); i++) {
// erg.add(vpIri, risikoobjektTypeIri, Values.literal(vp.getVersicherteObjekte().get(i)));
// }
for (int i = 0; i < guiProdukt.getChildren().size(); i++) {
IRI unterbausteinIri = iri(baseIri + "ProdElement" + ((ProduktbausteinType)guiProdukt.getChildren().get(i).getValue().getProdukt()).getId() +
"-" + occCounter.getOrDefault(((ProduktbausteinType)guiProdukt.getChildren().get(i).getValue()
.getProdukt()).getId(), 1));
IRI unterbausteinIri = iriMap.get(guiProdukt.getChildren().get(i));
if (!guiProdukt.getValue().isNotIncluded()) {
model.add(vpIri, bausteinIri, unterbausteinIri);
}
String newParentId = vpIri.stringValue();
addProduktToModel(guiProdukt.getChildren().get(i), model, baseIri, newParentId, occCounter);
addProduktToModel(guiProdukt.getChildren().get(i), model, baseIri, newParentId, iriMap);
}
}
}

View File

@@ -119,6 +119,10 @@ public class RisikoobjektView {
choiceBox.getSelectionModel().selectedItemProperty().addListener((obs, oldVal, newVal) -> {
if (newVal != null) {
int a = createForm.getChildren().size();
for (int i = 1; i < a; i++) {
createForm.getChildren().remove(i);
}
switch (newVal) {
case "Versichertes objekt SachPrivat": {
System.out.println("formular sach Privat");

View File

@@ -2,6 +2,7 @@ package at.vvo.omds.client.gui;
import at.vvo.omds.types.omds3.r2025_05.common.APrioriProduktbausteinType;
import at.vvo.omds.types.omds3.r2025_05.common.ProduktbausteinType;
import javafx.collections.FXCollections;
import javafx.scene.control.TreeItem;
import java.util.*;
@@ -87,6 +88,7 @@ public class TreeHelper {
if (!produkt.getBausteine().isEmpty()) {
for (int i = 0; i < produkt.getBausteine().size(); i++) {
TreeItem<GuiProdukt> up = aprioriItemToCalcItem(new TreeItem<>(new GuiProdukt(produkt.getBausteine().get(i))));
up.getValue().setNotIncluded(true);
up.setExpanded(true);
if (!produkt.getBausteine().get(i).getBausteine().isEmpty()) {
aprioriProduktToTree(produkt.getBausteine().get(i), up);
@@ -101,6 +103,7 @@ public class TreeHelper {
for (int i = 0; i < produkt.getBausteine().size(); i++) {
TreeItem<GuiProdukt> up = new TreeItem<>(new GuiProdukt(produkt.getBausteine().get(i)));
up.setExpanded(true);
if (!produkt.getBausteine().get(i).getBausteine().isEmpty()) {
produktToTree(produkt.getBausteine().get(i), up);
}
@@ -115,36 +118,34 @@ public class TreeHelper {
public TreeItem<GuiProdukt> aprioriItemToCalcItem(TreeItem<GuiProdukt> produkt) throws Exception {
TreeItem<GuiProdukt> ergItem = new TreeItem<>();
Object erg = new ObjectFactoryFactory().create(
ProduktbausteinType erg = new ObjectFactoryFactory().create(
((APrioriProduktbausteinType) produkt.getValue().getProdukt()).getType());
if (erg != null) {
if (ProduktbausteinType.class.isAssignableFrom(erg.getClass())) {
((ProduktbausteinType) erg).setId(
erg.setId(
((APrioriProduktbausteinType) produkt.getValue().getProdukt()).getId());
((ProduktbausteinType) erg).setBezeichnung(
erg.setBezeichnung(
((APrioriProduktbausteinType) produkt.getValue().getProdukt()).getName());
((ProduktbausteinType) erg).setVerkaufsoffenVon(
erg.setVerkaufsoffenVon(
((APrioriProduktbausteinType) produkt.getValue().getProdukt()).getFrom());
((ProduktbausteinType) erg).setVerkaufsoffenBis(
erg.setVerkaufsoffenBis(
((APrioriProduktbausteinType) produkt.getValue().getProdukt()).getTo());
((ProduktbausteinType) erg).getMeldungen().addAll(
erg.getMeldungen().addAll(
((APrioriProduktbausteinType) produkt.getValue().getProdukt()).getMeldungen());
((ProduktbausteinType) erg).getAttribute().addAll(
erg.getAttribute().addAll(
((APrioriProduktbausteinType) produkt.getValue().getProdukt()).getAttribute());
((ProduktbausteinType) erg).setMinVorkommen(
erg.setMinVorkommen(
((APrioriProduktbausteinType) produkt.getValue().getProdukt()).getMinOccurrences());
((ProduktbausteinType) erg).setMaxVorkommen(
erg.setMaxVorkommen(
((APrioriProduktbausteinType) produkt.getValue().getProdukt()).getMaxOccurrences());
((ProduktbausteinType) erg).setTyp(
erg.setTyp(
((APrioriProduktbausteinType) produkt.getValue().getProdukt()).getType());
if (((APrioriProduktbausteinType) produkt.getValue().getProdukt()).getRisikoobjektType() != null) {
((ProduktbausteinType) erg).setRisikoobjektErforderlich(true);
}
erg.setRisikoobjektErforderlich(
((APrioriProduktbausteinType) produkt.getValue().getProdukt()).getRisikoobjektType() != null);
for (int i = 0; i < ((APrioriProduktbausteinType) produkt.getValue().getProdukt()).getBausteine().size(); i++) {
((ProduktbausteinType) erg).getBausteine().add((ProduktbausteinType) aprioriItemToCalcItem(
erg.getBausteine().add((ProduktbausteinType) aprioriItemToCalcItem(
new TreeItem<>(new GuiProdukt(((APrioriProduktbausteinType) produkt.getValue().getProdukt())
.getBausteine().get(i)))).getValue().getProdukt());
}
@@ -161,76 +162,37 @@ public class TreeHelper {
return ergItem;
}
// public TreeItem<GuiProdukt> addAprioriToCalc(TreeItem<GuiProdukt> calcItem, TreeItem<GuiProdukt> aprioriItem) {
// for (TreeItem<GuiProdukt> aprioriChild : aprioriItem.getChildren()) {
// boolean isInCalc = false;
// int i = 0;
// for (TreeItem<GuiProdukt> calcChild : calcItem.getChildren()) {
// if (((ProduktbausteinType) calcChild.getValue().getProdukt()).getId().equals(
// ((ProduktbausteinType) aprioriChild.getValue().getProdukt()).getId())
// && !calcChild.getValue().isNotIncluded()) {
// isInCalc = true;
// if (!aprioriChild.getChildren().isEmpty()) {
// addAprioriToCalc(calcChild, aprioriChild);
//// calcItem.getChildren().set(i, calcChild);
// }
// }
// i++;
// }
// if (!isInCalc) {
// TreeItem<GuiProdukt> missingCalcItem = cloneTreeItem(aprioriChild);
// calcItem.getChildren().add(missingCalcItem);
// missingCalcItem.getValue().setNotIncluded(true);
// }
// }
// return calcItem;
// }
public TreeItem<GuiProdukt> addAprioriToCalc(TreeItem<GuiProdukt> calcItem, TreeItem<GuiProdukt> aprioriItem) {
for (TreeItem<GuiProdukt> aprioriChild : aprioriItem.getChildren()) {
ProduktbausteinType aprioriProd = (ProduktbausteinType) aprioriChild.getValue().getProdukt();
String aprioriId = aprioriProd.getId();
TreeItem<GuiProdukt> matchingCalcChild = calcItem.getChildren().stream()
.filter(c -> {
ProduktbausteinType calcProd = (ProduktbausteinType) c.getValue().getProdukt();
return calcProd.getId().equals(aprioriId) && !c.getValue().isNotIncluded();
})
.findFirst()
.orElse(null);
if (matchingCalcChild != null) {
if (!aprioriChild.getChildren().isEmpty()) {
addAprioriToCalc(matchingCalcChild, aprioriChild);
boolean isInCalc = false;
int i = 0;
for (TreeItem<GuiProdukt> calcChild : calcItem.getChildren()) {
if (((ProduktbausteinType) calcChild.getValue().getProdukt()).getId().equals(
((ProduktbausteinType) aprioriChild.getValue().getProdukt()).getId())
&& !calcChild.getValue().isNotIncluded()) {
isInCalc = true;
if (!aprioriChild.getChildren().isEmpty()) {
addAprioriToCalc(calcChild, aprioriChild);
}
}
} else {
TreeItem<GuiProdukt> cloned = cloneTreeItem(aprioriChild);
cloned.getValue().setNotIncluded(true);
calcItem.getChildren().add(cloned);
i++;
}
if (!isInCalc) {
TreeItem<GuiProdukt> missingCalcItem = cloneTreeItem(aprioriChild);
calcItem.getChildren().add(missingCalcItem);
}
}
return calcItem;
}
public TreeItem<GuiProdukt> sortTree(TreeItem<GuiProdukt> parent) {
// FXCollections.sort(parent.getChildren(), Comparator.comparing(
// item -> ((ProduktbausteinType)((TreeItem<GuiProdukt>)item).getValue().getProdukt()).getBezeichnung()
// ));
//
// Comparator<TreeItem<GuiProdukt>> compareBez = (s1, s2) -> {
// int erg = ((ProduktbausteinType)s1.getValue().getProdukt()).getBezeichnung().compareTo(((ProduktbausteinType)s2.getValue().getProdukt()).getBezeichnung());
// if (erg == 0) {
// return 1;
// }else {
// return erg;
// }
// };
// for (TreeItem<GuiProdukt> child : parent.getChildren()) {
// sortTree(child);
// }
FXCollections.sort(parent.getChildren(), Comparator.comparing(
item -> ((ProduktbausteinType)item.getValue().getProdukt()).getBezeichnung()
));
for (TreeItem<GuiProdukt> child : parent.getChildren()) {
sortTree(child);
}
return parent;
}
}

View File

@@ -38,13 +38,8 @@ public class BuildCalculateRequestAuskunft {
}
static public String buildRDFRequestFromTreeView(TreeView<GuiProdukt> treeView, XMLGregorianCalendar vtBeg) {
VerkaufsproduktType verkaufsprodukt = TreeViewToVerkaufsprodukt(treeView, vtBeg);
verkaufsprodukt.setVtgBeg(vtBeg);
verkaufsprodukt.setTyp(((ProduktbausteinType)treeView.getRoot().getValue().getProdukt()).getTyp());
RDFHelper rdf = new RDFHelper();
Model requestModel = rdf.createRdfModel(new TreeItem<>(new GuiProdukt(verkaufsprodukt, true)));
Model requestModel = rdf.createRdfModel(treeView.getRoot());
ByteArrayOutputStream baos = new ByteArrayOutputStream();
Rio.write(requestModel, baos, RDFFormat.JSONLD);
@@ -58,7 +53,7 @@ public class BuildCalculateRequestAuskunft {
}
public static ProduktbausteinType TreeItemToBaustein(TreeItem<GuiProdukt> treeItem) {
ProduktbausteinType baustein = (ProduktbausteinType) new ObjectFactoryFactory().create(
ProduktbausteinType baustein = new ObjectFactoryFactory().create(
((ProduktbausteinType)treeItem.getValue().getProdukt()).getTyp());
baustein.setBezeichnung(((ProduktbausteinType)treeItem.getValue().getProdukt()).getBezeichnung());
@@ -69,6 +64,7 @@ public class BuildCalculateRequestAuskunft {
baustein.setTyp(((ProduktbausteinType)treeItem.getValue().getProdukt()).getTyp());
baustein.setMinVorkommen(((ProduktbausteinType)treeItem.getValue().getProdukt()).getMinVorkommen());
baustein.setMaxVorkommen(((ProduktbausteinType)treeItem.getValue().getProdukt()).getMaxVorkommen());
baustein.getVersicherteObjekte().addAll(((ProduktbausteinType) treeItem.getValue().getProdukt()).getVersicherteObjekte());
return baustein;
}
@@ -87,7 +83,7 @@ public class BuildCalculateRequestAuskunft {
}
public static ProduktbausteinType addUpFromTreeItem(TreeItem<GuiProdukt> treeItem) {
ProduktbausteinType baustein = (ProduktbausteinType) TreeItemToBaustein(treeItem);
ProduktbausteinType baustein = TreeItemToBaustein(treeItem);
if (!treeItem.getChildren().isEmpty()) {
for (int i = 0; i < treeItem.getChildren().size(); i++) {

View File

@@ -43,8 +43,6 @@ public class CalculateRequestAuskunftService {
String request = BuildCalculateRequestAuskunft.buildRDFRequestFromTreeView(treeView, vtBeg);
System.out.println(request);
RDFHelper rdfHelper = new RDFHelper();
VerkaufsproduktType response = rdfHelper.getCalculateRDF(request);
log.info("Got Response As below ========= : ");