From be122fec9a83b94346136c806770d21b23b0d4de Mon Sep 17 00:00:00 2001 From: LukasJuraczka Date: Mon, 13 Oct 2025 09:48:22 +0200 Subject: [PATCH] =?UTF-8?q?Plausi=20verarbeitung=20hinzugef=C3=BCgt.=20IsN?= =?UTF-8?q?otIncluded=20Liste=20durch=20GUIProdukt=20Klasse=20ersetzt.=20V?= =?UTF-8?q?iew=20um=20Risikoobjekte=20hinzuzuf=C3=BCgen=20erstellt.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- OMDSServiceDefinition/pom.xml | 181 +++++-- .../vvo/omds/client/BuildRequestHelper.java | 2 - .../at/vvo/omds/client/gui/AllinOneView.java | 420 ++++++++++------ .../at/vvo/omds/client/gui/GuiProdukt.java | 32 ++ .../at/vvo/omds/client/gui/ItemAttribute.java | 182 +++++-- .../omds/client/gui/ObjectFactoryFactory.java | 3 +- .../java/at/vvo/omds/client/gui/Plausi.java | 37 ++ .../at/vvo/omds/client/gui/RDFHelper.java | 467 ++++++++++++++++++ .../vvo/omds/client/gui/RisikoobjektView.java | 215 ++++++++ .../at/vvo/omds/client/gui/TreeHelper.java | 239 +++++---- .../api/apriori/AprioriAuskunftService.java | 17 + .../calc/BuildCalculateRequestAuskunft.java | 49 +- .../calc/CalculateRequestAuskunftService.java | 19 +- .../main/resources/def/r2025_27/binding.xjb | 6 +- .../def/r2025_27/omds3CommonServiceTypes.xsd | 5 +- 15 files changed, 1521 insertions(+), 353 deletions(-) create mode 100644 OMDSServiceDefinition/src/main/java/at/vvo/omds/client/gui/GuiProdukt.java create mode 100644 OMDSServiceDefinition/src/main/java/at/vvo/omds/client/gui/Plausi.java create mode 100644 OMDSServiceDefinition/src/main/java/at/vvo/omds/client/gui/RDFHelper.java create mode 100644 OMDSServiceDefinition/src/main/java/at/vvo/omds/client/gui/RisikoobjektView.java diff --git a/OMDSServiceDefinition/pom.xml b/OMDSServiceDefinition/pom.xml index 47b795df..31b0300a 100644 --- a/OMDSServiceDefinition/pom.xml +++ b/OMDSServiceDefinition/pom.xml @@ -118,48 +118,90 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - org.jvnet.jaxb - jaxb-maven-plugin - 4.0.0 + org.apache.cxf + cxf-codegen-plugin + 4.1.3 + generate-sources + generate-sources + + ${project.build.directory}/generated-sources/cxf + + + ${project.basedir}/src/main/resources/def/${currentReleaseDir}/omds3Services.wsdl + + -xjc-Xannotate + -client + -impl + -server + -p + at.vvo.omds.services + + + ${project.basedir}/src/main/resources/def/${currentReleaseDir}/binding.xjb + + + + - generate + wsdl2java - - true - en - XMLSCHEMA - ${project.basedir}/src/main/resources/def/${currentReleaseDir} - ${project.basedir}/src/main/resources/def/${currentReleaseDir} - ${project.basedir}/src/main/resources/def/${currentReleaseDir} - - *.xsd - - - *.xjb - - - -Xannotate - -Xinheritance - - - - org.jvnet.jaxb - jaxb-plugins - 3.0.0 - - - org.jvnet.jaxb - jaxb-plugin-annotate - 3.0.0 - - - + + + org.jvnet.jaxb + jaxb-plugin-annotate + 3.0.0 + + @@ -167,7 +209,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xs javafx-maven-plugin 0.0.8 - at.vvo.omds.client.gui.AllinOneView + at.vvo.omds.client.gui.AllinOneView @@ -205,12 +247,77 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xs - + org.openjfx javafx-controls 23.0.1 + + + + org.controlsfx + controlsfx + 11.2.2 + + + + + org.jvnet.jaxb2_commons + jaxb2-basics-annotate + 1.1.0 + + + + + com.sun.xml.ws + jaxws-maven-plugin + 4.0.3 + + + + + + org.springframework.boot + spring-boot-restclient + 4.0.0-M3 + + + + + com.fasterxml.jackson.core + jackson-databind + 2.20.0 + + + + + + org.eclipse.rdf4j + rdf4j-model + 5.1.5 + + + + + org.eclipse.rdf4j + rdf4j-rio-turtle + 5.1.5 + + + + + org.eclipse.rdf4j + rdf4j-shacl + 5.1.5 + + + + + org.eclipse.rdf4j + rdf4j-rio-jsonld + 5.1.5 + diff --git a/OMDSServiceDefinition/src/main/java/at/vvo/omds/client/BuildRequestHelper.java b/OMDSServiceDefinition/src/main/java/at/vvo/omds/client/BuildRequestHelper.java index cc80aa72..20a0e54b 100644 --- a/OMDSServiceDefinition/src/main/java/at/vvo/omds/client/BuildRequestHelper.java +++ b/OMDSServiceDefinition/src/main/java/at/vvo/omds/client/BuildRequestHelper.java @@ -37,8 +37,6 @@ public class BuildRequestHelper { } } - - public static XMLGregorianCalendar aktuellesDatum() { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss"); try { diff --git a/OMDSServiceDefinition/src/main/java/at/vvo/omds/client/gui/AllinOneView.java b/OMDSServiceDefinition/src/main/java/at/vvo/omds/client/gui/AllinOneView.java index dc40109c..dfc28ff4 100644 --- a/OMDSServiceDefinition/src/main/java/at/vvo/omds/client/gui/AllinOneView.java +++ b/OMDSServiceDefinition/src/main/java/at/vvo/omds/client/gui/AllinOneView.java @@ -18,10 +18,22 @@ import javafx.scene.layout.*; import javafx.scene.paint.Paint; import javafx.scene.text.*; import javafx.stage.Stage; +import javafx.util.Pair; +import org.controlsfx.control.ToggleSwitch; +import org.eclipse.rdf4j.model.Model; +import org.eclipse.rdf4j.query.GraphQuery; +import org.eclipse.rdf4j.query.QueryResults; +import org.eclipse.rdf4j.repository.Repository; +import org.eclipse.rdf4j.repository.RepositoryConnection; +import org.eclipse.rdf4j.repository.sail.SailRepository; +import org.eclipse.rdf4j.rio.RDFFormat; +import org.eclipse.rdf4j.rio.Rio; +import org.eclipse.rdf4j.sail.memory.MemoryStore; import javax.xml.datatype.DatatypeConfigurationException; import javax.xml.datatype.DatatypeFactory; import javax.xml.datatype.XMLGregorianCalendar; +import java.io.ByteArrayOutputStream; import java.math.BigInteger; import java.time.LocalDate; import java.util.*; @@ -31,10 +43,12 @@ import java.util.concurrent.atomic.AtomicReference; public class AllinOneView extends Application { Map timesItemisIncludedById = new HashMap<>(); - List> isNotIncluded = new ArrayList<>(); - Map, Map> infoBoxFromItem = new HashMap<>(); + Map, Map> infoBoxFromItem = new HashMap<>(); + List plausiList = new ArrayList<>(); + RisikoobjektView risikoobjektView = new RisikoobjektView(); TreeHelper treeHelper = new TreeHelper(); + RDFHelper rdfHelper = new RDFHelper(); public static void main(String[] args) { launch(args); @@ -42,11 +56,50 @@ public class AllinOneView extends Application { @Override public void start(Stage stage) { - AprioriAuskunftService s = new AprioriAuskunftService(new SOAPConnector()); stage.setTitle("OMDS Client"); stage.getIcons().add(new Image(AllinOneView.class.getResourceAsStream("/logo/VVO_Logo_2024.png"))); + TabPane tabPane = new TabPane(); + Tab baumView = new Tab("Deckungsbaum"); + Tab risikoView = new Tab("Risikoobjekte"); + + baumView.setClosable(false); + risikoView.setClosable(false); + + tabPane.getTabs().addAll(baumView, risikoView); + + BorderPane content = new BorderPane(); + StackPane view = new StackPane(); + GridPane risikoobjekt = risikoobjektView.risikoobjekte(); + VBox deckungsbaum = deckungsbaum(); + + content.setTop(tabPane); + content.setCenter(view); + + view.getChildren().addAll(risikoobjekt ,deckungsbaum); + risikoobjekt.setVisible(false); + + + tabPane.getSelectionModel().selectedItemProperty().addListener((obs, oldTab, newTab) -> { + if (newTab == risikoView) { + risikoobjekt.setVisible(true); + deckungsbaum.setVisible(false); + } else if (newTab == baumView) { + risikoobjekt.setVisible(false); + deckungsbaum.setVisible(true); + } + }); + + Scene scene = new Scene(content, 900, 600); + stage.setScene(scene); + + stage.show(); + } + + public VBox deckungsbaum(){ + AprioriAuskunftService s = new AprioriAuskunftService(new SOAPConnector()); + final VBox[] controlBox = {new VBox()}; DatePicker dp = new DatePicker(); ChoiceBox vpBox = new ChoiceBox<>(); @@ -62,60 +115,107 @@ public class AllinOneView extends Application { newCalcRequestControlBox.setVisible(false); newCalcRequestControlBox.setPadding(new Insets(10, 10, 10, 10)); newCalcRequestControlBox.getChildren().add(newCalcRequestButton); + + HBox servBox = new HBox(); + ToggleSwitch serverBtn = new ToggleSwitch("Benutze RDF Messaging"); + serverBtn.setSelected(true); + serverBtn.setDisable(true); + + AtomicReference> responseproduct = new AtomicReference<>(new ArrayList<>()); + dp.setOnAction(e -> { try { stichtag.set(stichtagEvent(dp)); if (stichtagEvent(dp) != null) { try { - response.set(s.aprioriAuskunft(stichtag.get(), "042")); - } catch (NoSuchElementException ex) { - controlBox[0].getChildren().clear(); - controlBox[0].getChildren().add(dp); - vpBox.getItems().clear(); + Pair, List> aprioriPair = s.aprioriRDFAuskunft(stichtag.get(), "042"); + responseproduct.set(aprioriPair.getKey()); + plausiList = aprioriPair.getValue(); - Label label = new Label("Kein Verkaufsoffenes Produkt an dem Datum: " + - stichtag.get().toString().substring(0, stichtag.get().toString().length() - 1) + - System.lineSeparator()); - controlBox[0].getChildren().add(3, label); - throw new NoSuchElementException(ex.getMessage()); - } catch (SOAPExceptionImpl ex) { - HBox errorBox = new HBox(); - errorBox.setAlignment(Pos.CENTER); - errorBox.setPadding(new Insets(10, 10, 10, 10)); - errorBox.getChildren().add(new Text("Keine Verbindung zum Server möglich!")); + newCalcRequestControlBox.setVisible(true); - controlBox[0].getChildren().add(errorBox); - } - newCalcRequestControlBox.setVisible(true); + if (responseproduct.get().size() > 1) { + if (!vpBox.getItems().isEmpty()) { + vpBox.getItems().clear(); + } + for (APrioriVerkaufsproduktType vp : responseproduct.get()) { + vpBox.getItems().add(vp.getName()); + } + vpBox.setVisible(true); + vpBox.setOnAction(ee -> { + for (int i = 0; i < responseproduct.get().size(); i++) { + if (vpBox.getSelectionModel().getSelectedItem() != null && vpBox.getSelectionModel() + .getSelectedItem().equals(responseproduct.get().get(i).getName())) { + try { + controlBox[0] = buttonAuskunft(responseproduct.get().get(i), + controlBox[0], newCalcRequestButton, stichtag, serverBtn); + controlBox[0].getChildren().add(newCalcRequestControlBox); - if (response.get().getVerkaufsprodukt().size() > 1) { - - if (!vpBox.getItems().isEmpty()) { - vpBox.getItems().clear(); - } - for (APrioriVerkaufsproduktType vp : response.get().getVerkaufsprodukt()) { - vpBox.getItems().add(vp.getName()); - } - vpBox.setVisible(true); - vpBox.setOnAction(ee -> { - for (int i = 0; i < response.get().getVerkaufsprodukt().size(); i++) { - if (vpBox.getSelectionModel().getSelectedItem() != null && vpBox.getSelectionModel() - .getSelectedItem().equals(response.get().getVerkaufsprodukt().get(i).getName())) { - try { - controlBox[0] = buttonAuskunft(response.get().getVerkaufsprodukt().get(i), - controlBox[0], newCalcRequestButton, stichtag); - controlBox[0].getChildren().add(newCalcRequestControlBox); - - } catch (Exception ex) { - throw new RuntimeException(ex); + } catch (Exception ex) { + throw new RuntimeException(ex); + } } } + }); + } else { + controlBox[0] = buttonAuskunft(responseproduct.get().getFirst(), + controlBox[0], newCalcRequestButton, stichtag, serverBtn); + } + } catch (Exception rdfex) { + serverBtn.setSelected(false); + + try { + response.set(s.aprioriAuskunft(stichtag.get(), "042")); + + newCalcRequestControlBox.setVisible(true); + if (response.get() != null && response.get().getVerkaufsprodukt().size() > 1) { + + if (!vpBox.getItems().isEmpty()) { + vpBox.getItems().clear(); + } + for (APrioriVerkaufsproduktType vp : response.get().getVerkaufsprodukt()) { + vpBox.getItems().add(vp.getName()); + } + vpBox.setVisible(true); + vpBox.setOnAction(ee -> { + for (int i = 0; i < response.get().getVerkaufsprodukt().size(); i++) { + if (vpBox.getSelectionModel().getSelectedItem() != null && vpBox.getSelectionModel() + .getSelectedItem().equals(response.get().getVerkaufsprodukt().get(i).getName())) { + try { + controlBox[0] = buttonAuskunft(response.get().getVerkaufsprodukt().get(i), + controlBox[0], newCalcRequestButton, stichtag, serverBtn); + controlBox[0].getChildren().add(newCalcRequestControlBox); + + } catch (Exception ex) { + throw new RuntimeException(ex); + } + } + } + }); + } else { + controlBox[0] = buttonAuskunft(response.get().getVerkaufsprodukt().getFirst(), + controlBox[0], newCalcRequestButton, stichtag, serverBtn); } - }); - } else { - controlBox[0] = buttonAuskunft(response.get().getVerkaufsprodukt().getFirst(), - controlBox[0], newCalcRequestButton, stichtag); + } catch (NoSuchElementException ex) { + controlBox[0].getChildren().clear(); + controlBox[0].getChildren().add(dp); + vpBox.getItems().clear(); + + Label label = new Label("Kein Verkaufsoffenes Produkt an dem Datum: " + + stichtag.get().toString().substring(0, stichtag.get().toString().length() - 1) + + System.lineSeparator()); + controlBox[0].getChildren().add(3, label); + throw new NoSuchElementException(ex.getMessage()); + } catch (SOAPExceptionImpl ex) { + HBox errorBox = new HBox(); + errorBox.setAlignment(Pos.CENTER); + errorBox.setPadding(new Insets(10, 10, 10, 10)); + errorBox.getChildren().add(new Text("Keine Verbindung zu einer Rdf oder SOAP Schnittstelle möglich!")); + + controlBox[0].getChildren().add(errorBox); + } } + if (!controlBox[0].getChildren().contains(newCalcRequestControlBox)) { controlBox[0].getChildren().add(newCalcRequestControlBox); } @@ -139,19 +239,22 @@ public class AllinOneView extends Application { VBox.setVgrow(newCalcRequestControlBox, Priority.ALWAYS); newCalcRequestControlBox.setAlignment(Pos.BOTTOM_RIGHT); + newCalcRequestControlBox.setId("newCalcRequestControlBox"); + + servBox.getChildren().add(serverBtn); + servBox.setAlignment(Pos.TOP_RIGHT); HBox aprioriControlBox = new HBox(); + Region region = new Region(); + HBox.setHgrow(region, Priority.ALWAYS); aprioriControlBox.setPadding(new Insets(10, 10, 0, 10)); - aprioriControlBox.getChildren().addAll(dp, vpBox); + aprioriControlBox.getChildren().addAll(dp, vpBox, region, servBox); + controlBox[0].getChildren().addAll(aprioriControlBox); - Scene scene = new Scene(controlBox[0], 900, 600); - stage.setScene(scene); - - stage.show(); + return controlBox[0]; } - public XMLGregorianCalendar stichtagEvent(DatePicker dp) throws DatatypeConfigurationException { if (dp.getValue() == null) { return null; @@ -164,7 +267,7 @@ public class AllinOneView extends Application { } public VBox buttonAuskunft(APrioriVerkaufsproduktType verkaufsprodukt, VBox vbox, Button newCalcRequest, - AtomicReference stichtag) throws Exception { + AtomicReference stichtag, ToggleSwitch serverBtn) throws Exception { while (vbox.getChildren().size() > 1) { vbox.getChildren().removeLast(); } @@ -172,24 +275,28 @@ public class AllinOneView extends Application { VBox treeBox = new VBox(); VBox infoBox = new VBox(); - TreeItem vkp = treeHelper.aprioriItemToCalcItem(new TreeItem<>(verkaufsprodukt)); + TreeItem vkp = treeHelper.aprioriItemToCalcItem(new TreeItem<>(new GuiProdukt(verkaufsprodukt))); vkp.setExpanded(true); - treeHelper.messageToTree(verkaufsprodukt, vkp); + treeHelper.aprioriProduktToTree(verkaufsprodukt, vkp); - TreeView tv = new TreeView<>(vkp); + TreeView tv = new TreeView<>(vkp); + tv.getSelectionModel().selectedItemProperty().addListener((obs, oldSelection, newSelection) -> { if (newSelection != null) { + if (!infoBox.getChildren().isEmpty()) { infoBox.getChildren().removeAll(infoBox.getChildren()); } ItemAttribute itemAttribute = new ItemAttribute(); + itemAttribute.setRisikoobjekte(risikoobjektView.getRisikoobjekte()); if (!infoBoxFromItem.isEmpty()) itemAttribute.setInfoBoxFromItem(infoBoxFromItem); + itemAttribute.addItemInfo(newSelection, infoBox); - if (newSelection.getValue() instanceof VerkaufsproduktType){ - itemAttribute.addVpInfo(infoBox, isMeldungVorhanden((ProduktbausteinType) newSelection.getValue(), tv), (VerkaufsproduktType) newSelection.getValue()); + if (newSelection.getValue().getProdukt() instanceof VerkaufsproduktType){ + itemAttribute.addVpInfo(infoBox, isMeldungVorhanden((ProduktbausteinType) newSelection.getValue().getProdukt(), tv), (VerkaufsproduktType) newSelection.getValue().getProdukt()); } infoBoxFromItem = itemAttribute.getInfoBoxFromItem(); }else{ @@ -197,10 +304,10 @@ public class AllinOneView extends Application { } }); - final TreeItem originalRoot = treeHelper.cloneTreeItem(tv.getRoot()); + final TreeItem originalRoot = treeHelper.cloneTreeItem(tv.getRoot()); tv.setCellFactory(tc -> new TreeCell<>() { @Override - public void updateItem(Object item, boolean empty) { + public void updateItem(GuiProdukt item, boolean empty) { super.updateItem(item, empty); if (item == null || empty) { @@ -211,7 +318,7 @@ public class AllinOneView extends Application { HBox cellBox = new HBox(); Button include = new Button("+"); include.setStyle("-fx-margin: 5;"); - Label label = new Label(((ProduktbausteinType) item).getBezeichnung() + " "); + Label label = new Label(((ProduktbausteinType) item.getProdukt()).getBezeichnung() + " "); Button remove = new Button("-"); remove.setVisible(true); @@ -224,8 +331,8 @@ public class AllinOneView extends Application { if (!shouldBeIncluded(getTreeItem())) { label.setFont(Font.font("System", FontPosture.ITALIC, label.getFont().getSize())); label.setTextFill(Paint.valueOf("#A0A0A0")); - if (!isNotIncluded.contains(getTreeItem())) { - isNotIncluded.add(getTreeItem()); + if (!(getTreeItem().getValue().isNotIncluded())) { + getTreeItem().getValue().setNotIncluded(true); } remove.setDisable(true); remove.setStyle("-fx-background-color: #CCCCCC"); @@ -233,7 +340,7 @@ public class AllinOneView extends Application { label.setTextFill(Paint.valueOf("#000000")); remove.setVisible(true); - isNotIncluded.remove(getTreeItem()); + getTreeItem().getValue().setNotIncluded(false); } Region spacer = new Region(); @@ -242,15 +349,15 @@ public class AllinOneView extends Application { label.setMaxWidth(Double.MAX_VALUE); - if (getTreeItem().getValue() instanceof VerkaufsproduktType || + if (getTreeItem().getValue().getProdukt() instanceof VerkaufsproduktType || getTreeItem().getValue().getClass().equals(APrioriVerkaufsproduktType.class)) { cellBox.getChildren().addAll(label); } else if (timesItemisIncludedById.get( - ((ProduktbausteinType) getTreeItem().getValue()).getId()) != null - && ((ProduktbausteinType) getTreeItem().getValue()).getMaxVorkommen() != null - && ((ProduktbausteinType) getTreeItem().getValue()).getMaxVorkommen() <= + ((ProduktbausteinType) getTreeItem().getValue().getProdukt()).getId()) != null + && ((ProduktbausteinType) getTreeItem().getValue().getProdukt()).getMaxVorkommen() != null + && ((ProduktbausteinType) getTreeItem().getValue().getProdukt()).getMaxVorkommen() <= timeItemIsIncludedByParent(getTreeItem().getParent(), - ((ProduktbausteinType) getTreeItem().getValue()).getId())) { + ((ProduktbausteinType) getTreeItem().getValue().getProdukt()).getId())) { include.setDisable(true); include.setStyle("-fx-background-color: #CCCCCC"); cellBox.getChildren().addAll(label, spacer, include, spacer2, remove); @@ -259,18 +366,18 @@ public class AllinOneView extends Application { } include.setOnAction(e -> { - if (isNotIncluded.contains(getTreeItem())) { + if (getTreeItem().getValue().isNotIncluded()) { label.setFont(Font.font("System", label.getFont().getSize())); label.setTextFill(Paint.valueOf("#000000")); remove.setVisible(true); - timesItemisIncludedById.put(((ProduktbausteinType) getTreeItem().getValue()).getId(), + timesItemisIncludedById.put(((ProduktbausteinType) getTreeItem().getValue().getProdukt()).getId(), (timesItemisIncludedById.get( - ((ProduktbausteinType) getTreeItem().getValue()).getId()) != null ? + ((ProduktbausteinType) getTreeItem().getValue().getProdukt()).getId()) != null ? timesItemisIncludedById.get( - ((ProduktbausteinType) getTreeItem().getValue()).getId()) + 1 : 1)); + ((ProduktbausteinType) getTreeItem().getValue().getProdukt()).getId()) + 1 : 1)); - isNotIncluded.remove(getTreeItem()); + getTreeItem().getValue().setNotIncluded(false); includeAddedParent(getTreeItem()); includeAddedChildren(getTreeItem()); tv.setRoot(treeHelper.sortTree(tv.getRoot())); @@ -278,24 +385,40 @@ public class AllinOneView extends Application { timesItemisIncludedById.clear(); refreshTimesItemisIncludedById(tv.getRoot()); } else { - TreeItem parent = getTreeItem().getParent(); - TreeItem clone = null; + TreeItem parent = getTreeItem().getParent(); + TreeItem clone = null; try { clone = treeHelper.cloneTreeItem( - treeHelper.findTreeItem((ProduktbausteinType) item, originalRoot)); + treeHelper.findTreeItem((ProduktbausteinType) item.getProdukt(), originalRoot)); } catch (Exception ex) { throw new RuntimeException(ex); } parent.getChildren().add(clone); - refreshIsNotIncluded(clone, originalRoot); - timesItemisIncludedById.clear(); refreshTimesItemisIncludedById(tv.getRoot()); tv.setRoot(treeHelper.sortTree(tv.getRoot())); tv.refresh(); } + + VerkaufsproduktType neuRoot = checkPlausis(plausiList, tv.getRoot()); + TreeItem newRoot = new TreeItem<>(new GuiProdukt(neuRoot)); + newRoot.setExpanded(true); + + try { + treeHelper.produktToTree(neuRoot, newRoot); + + TreeItem abc = new TreeItem<>(); + + treeHelper.aprioriProduktToTree(verkaufsprodukt, abc); + + tv.setRoot(treeHelper.sortTree(treeHelper.addAprioriToCalc(newRoot, abc))); +// tv.setRoot(treeHelper.sortTree(newRoot)); + tv.refresh(); + } catch (Exception ex) { + throw new RuntimeException(ex); + } }); remove.setOnAction(e -> { @@ -303,18 +426,18 @@ public class AllinOneView extends Application { Map countByAprioriParent = new HashMap<>(); timesItemisIncludedById.clear(); refreshTimesItemisIncludedById(tv.getRoot()); - timesItemisIncludedById.replace(((ProduktbausteinType) item).getId(), - timesItemisIncludedById.get(((ProduktbausteinType) item).getId()) - 1); + timesItemisIncludedById.replace(((ProduktbausteinType) item.getProdukt()).getId(), + timesItemisIncludedById.get(((ProduktbausteinType) item.getProdukt()).getId()) - 1); if (countChildIds(countByParent, getTreeItem().getParent()).get - (((ProduktbausteinType) item).getId()).equals(countChildIds(countByAprioriParent, - treeHelper.findTreeItem(((ProduktbausteinType) item), originalRoot).getParent()).get( - ((ProduktbausteinType) item).getId()))) { + (((ProduktbausteinType) item.getProdukt()).getId()).equals(countChildIds(countByAprioriParent, + treeHelper.findTreeItem(((ProduktbausteinType) item.getProdukt()), originalRoot).getParent()).get( + ((ProduktbausteinType) item.getProdukt()).getId()))) { label.setFont(Font.font("System", label.getFont().getSize())); label.setTextFill(Paint.valueOf("#A0A0A0")); remove.setVisible(false); - isNotIncluded.add(getTreeItem()); + getTreeItem().getValue().setNotIncluded(true); includeAddedChildren(getTreeItem()); tv.setRoot(treeHelper.sortTree(tv.getRoot())); @@ -326,13 +449,13 @@ public class AllinOneView extends Application { refreshTimesItemisIncludedById(tv.getRoot()); }); - if(((ProduktbausteinType) item).getMeldungen() != null && !((ProduktbausteinType) item).getMeldungen().isEmpty()) { + if(((ProduktbausteinType) item.getProdukt()).getMeldungen() != null && !((ProduktbausteinType) item.getProdukt()).getMeldungen().isEmpty()) { AtomicBoolean symboleAdded = new AtomicBoolean(false); Text symbole = new Text("\u26A0 "); symbole.setFont(Font.font("System", FontWeight.BOLD, symbole.getFont().getSize() + 2)); - ((ProduktbausteinType) item).getMeldungen().forEach(m -> { + ((ProduktbausteinType) item.getProdukt()).getMeldungen().forEach(m -> { if(m.getErrorType().equals(BigInteger.ONE)) { symbole.setFill(Paint.valueOf("#aa3333")); symboleAdded.set(true); @@ -355,14 +478,21 @@ public class AllinOneView extends Application { newCalcRequest.setOnAction(e -> { try { - treeHelper.setIsNotIncluded(isNotIncluded); - TreeItem cleanedRoot = treeHelper.cleanTree(tv.getRoot()); + TreeItem cleanedRoot = treeHelper.cleanTree(tv.getRoot()); + CalculateRequestAuskunftService s = new CalculateRequestAuskunftService(new SOAPConnector()); - CalculateResponse calcResponse = s.aprioriAuskunft(new TreeView<>(cleanedRoot), stichtag.get()); - TreeItem newRoot = new TreeItem<>(cleanedRoot.getValue()); + TreeItem newRoot = new TreeItem<>(cleanedRoot.getValue()); treeHelper.setTimesItemisIncludedById(timesItemisIncludedById); - treeHelper.calcMessageToTree(calcResponse.getBerechnungsantwort().getVerkaufsprodukt(), newRoot); + if (serverBtn.isSelected()) { + VerkaufsproduktType calcResponse = s.calculateRDFAuskunft(new TreeView<>(cleanedRoot), stichtag.get()); + treeHelper.produktToTree(calcResponse, newRoot); + + }else { + CalculateResponse calcResponse = s.calculateAuskunft(new TreeView<>(cleanedRoot), stichtag.get()); + treeHelper.produktToTree(calcResponse.getBerechnungsantwort().getVerkaufsprodukt(), newRoot); + } + timesItemisIncludedById = treeHelper.getTimesItemisIncludedById(); newRoot.setExpanded(true); @@ -400,6 +530,7 @@ public class AllinOneView extends Application { HBox.setHgrow(infoBox, Priority.ALWAYS); HBox splitBox = new HBox(treeBox, infoBox); + splitBox.setId("splitBox"); splitBox.setSpacing(10); splitBox.setPadding(new Insets(20)); splitBox.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE); @@ -419,23 +550,22 @@ public class AllinOneView extends Application { return vbox; } - private void includeAddedParent(TreeItem treeItem) { + private void includeAddedParent(TreeItem treeItem) { if (treeItem.getParent() != null) { - isNotIncluded.remove(treeItem.getParent()); + treeItem.getParent().getValue().setNotIncluded(false); if (treeItem.getParent().getParent() != null) { includeAddedParent(treeItem.getParent()); } } } - private void includeAddedChildren(TreeItem parent) { + private void includeAddedChildren(TreeItem parent) { for (int i = 0; i < parent.getChildren().size(); i++) { - isNotIncluded.remove(parent.getChildren().get(i)); - - if (!shouldBeIncluded(parent.getChildren().get(i)) && !isNotIncluded.contains(parent.getChildren().get(i))) { - isNotIncluded.add(parent.getChildren().get(i)); + parent.getChildren().get(i).getValue().setNotIncluded(false); + if (!shouldBeIncluded(parent.getChildren().get(i)) && !(parent.getChildren().get(i).getValue().isNotIncluded())) { + parent.getChildren().get(i).getValue().setNotIncluded(true); } else { - isNotIncluded.remove(parent.getChildren().get(i)); + parent.getChildren().get(i).getValue().setNotIncluded(false); } if (!parent.getChildren().get(i).getChildren().isEmpty() && parent.getChildren().get(i).getChildren() != null) { @@ -444,37 +574,24 @@ public class AllinOneView extends Application { } } - private void refreshIsNotIncluded(TreeItem clone, TreeItem originalRoot) { - for (int i = 0; i < clone.getChildren().size(); i++) { - if (isNotIncluded.contains(treeHelper.findTreeItem( - ((ProduktbausteinType) clone.getChildren().get(i).getValue()), originalRoot)) || - ((ProduktbausteinType) clone.getChildren().get(i).getValue()).getMinVorkommen() == 0) { - isNotIncluded.add(clone.getChildren().get(i)); - } - if (clone.getChildren().get(i).getChildren() != null || !clone.getChildren().get(i).getChildren().isEmpty()) { - refreshIsNotIncluded(clone.getChildren().get(i), originalRoot); - } - } + private boolean shouldBeIncluded(TreeItem 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 || + timesItemisIncludedById.get(((ProduktbausteinType) treeItem.getValue().getProdukt()).getId()) == 0))) && + !(treeItem.getValue().getProdukt() instanceof VerkaufsproduktType)); } - private boolean shouldBeIncluded(TreeItem treeItem) { - return !((isNotIncluded.contains(treeItem.getParent()) || isNotIncluded.contains(treeItem) || - (((ProduktbausteinType) treeItem.getValue()).getMinVorkommen() != null && ((ProduktbausteinType) treeItem.getValue()).getMinVorkommen() == 0 && - (timesItemisIncludedById.get(((ProduktbausteinType) treeItem.getValue()).getId()) == null || - timesItemisIncludedById.get(((ProduktbausteinType) treeItem.getValue()).getId()) == 0))) && - !(treeItem.getValue() instanceof VerkaufsproduktType)); - } - - private Map countChildIds(Map count, TreeItem root) { + private Map countChildIds(Map count, TreeItem root) { if (root != null) { for (int i = 0; i < root.getChildren().size(); i++) { - TreeItem item = root.getChildren().get(i); + TreeItem item = root.getChildren().get(i); - if (count.get(((ProduktbausteinType) item.getValue()).getId()) == null) { - count.put(((ProduktbausteinType) item.getValue()).getId(), 1); + if (count.get(((ProduktbausteinType) item.getValue().getProdukt()).getId()) == null) { + count.put(((ProduktbausteinType) item.getValue().getProdukt()).getId(), 1); } else { - count.replace(((ProduktbausteinType) item.getValue()).getId(), - count.get(((ProduktbausteinType) item.getValue()).getId()) + 1); + count.replace(((ProduktbausteinType) item.getValue().getProdukt()).getId(), + count.get(((ProduktbausteinType) item.getValue().getProdukt()).getId()) + 1); } if (!item.getChildren().isEmpty()) { @@ -486,15 +603,15 @@ public class AllinOneView extends Application { } - private void refreshTimesItemisIncludedById(TreeItem root) { + private void refreshTimesItemisIncludedById(TreeItem root) { for (int i = 0; i < root.getChildren().size(); i++) { - TreeItem item = root.getChildren().get(i); - if (!isNotIncluded.contains(item)) { - if (timesItemisIncludedById.get(((ProduktbausteinType) item.getValue()).getId()) == null) { - timesItemisIncludedById.put(((ProduktbausteinType) item.getValue()).getId(), 1); + TreeItem item = root.getChildren().get(i); + if (!item.getValue().isNotIncluded()) { + if (timesItemisIncludedById.get(((ProduktbausteinType) item.getValue().getProdukt()).getId()) == null) { + timesItemisIncludedById.put(((ProduktbausteinType) item.getValue().getProdukt()).getId(), 1); } else { - timesItemisIncludedById.replace(((ProduktbausteinType) item.getValue()).getId(), - timesItemisIncludedById.get(((ProduktbausteinType) item.getValue()).getId()) + 1); + timesItemisIncludedById.replace(((ProduktbausteinType) item.getValue().getProdukt()).getId(), + timesItemisIncludedById.get(((ProduktbausteinType) item.getValue().getProdukt()).getId()) + 1); } } if (!item.getChildren().isEmpty()) { @@ -503,12 +620,12 @@ public class AllinOneView extends Application { } } - public int timeItemIsIncludedByParent(TreeItem parent, String itemId) { + public int timeItemIsIncludedByParent(TreeItem parent, String itemId) { int erg = 0; for (int i = 0; i < parent.getChildren().size(); i++) { - TreeItem item = parent.getChildren().get(i); - if (((ProduktbausteinType) item.getValue()).getId().equals(itemId)) { - if (!isNotIncluded.contains(item)) { + TreeItem item = parent.getChildren().get(i); + if (((ProduktbausteinType) item.getValue().getProdukt()).getId().equals(itemId)) { + if (!item.getValue().isNotIncluded()) { erg++; } } @@ -517,11 +634,11 @@ public class AllinOneView extends Application { return erg; } - private boolean isMeldungVorhanden(ProduktbausteinType produkt, TreeView tv) { + private boolean isMeldungVorhanden(ProduktbausteinType produkt, TreeView tv) { TreeHelper treeHelper = new TreeHelper(); - TreeItem actual = treeHelper.findTreeItem(produkt, tv.getRoot()); + TreeItem actual = treeHelper.findTreeItem(produkt, tv.getRoot()); - if (actual != null && ((ProduktbausteinType)actual.getValue()).getMeldungen() != null && !((ProduktbausteinType)actual.getValue()).getMeldungen().isEmpty()) { + if (actual != null && ((ProduktbausteinType)actual.getValue().getProdukt()).getMeldungen() != null && !((ProduktbausteinType)actual.getValue().getProdukt()).getMeldungen().isEmpty()) { return true; } for (ProduktbausteinType child : produkt.getBausteine()){ @@ -529,4 +646,31 @@ public class AllinOneView extends Application { } return false; } + + public VerkaufsproduktType checkPlausis(List plausiList, TreeItem vp){ + Repository repo = new SailRepository(new MemoryStore()); + repo.init(); + + try (RepositoryConnection conn = repo.getConnection()) { + Model model = rdfHelper.createRdfModel(vp); + + conn.add(model); + + for (Plausi plausi : plausiList) { + String sparql = plausi.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()); + } catch(Exception ignored) { + System.out.println("CheckPlausi: " + ignored.getMessage()); + return null; + } + } } diff --git a/OMDSServiceDefinition/src/main/java/at/vvo/omds/client/gui/GuiProdukt.java b/OMDSServiceDefinition/src/main/java/at/vvo/omds/client/gui/GuiProdukt.java new file mode 100644 index 00000000..181799aa --- /dev/null +++ b/OMDSServiceDefinition/src/main/java/at/vvo/omds/client/gui/GuiProdukt.java @@ -0,0 +1,32 @@ +package at.vvo.omds.client.gui; + +public class GuiProdukt { + boolean notIncluded; + Object produkt; + + public GuiProdukt(Object produkt) { + this.produkt = produkt; + this.notIncluded = false; + } + + public GuiProdukt(Object produkt, boolean isNotIncluded) { + this.produkt = produkt; + this.notIncluded = isNotIncluded; + } + + public boolean isNotIncluded() { + return notIncluded; + } + + public void setNotIncluded(boolean notIncluded) { + this.notIncluded = notIncluded; + } + + public Object getProdukt() { + return produkt; + } + + public void setProdukt(Object produkt) { + this.produkt = produkt; + } +} diff --git a/OMDSServiceDefinition/src/main/java/at/vvo/omds/client/gui/ItemAttribute.java b/OMDSServiceDefinition/src/main/java/at/vvo/omds/client/gui/ItemAttribute.java index 7df6b642..ceefab5a 100644 --- a/OMDSServiceDefinition/src/main/java/at/vvo/omds/client/gui/ItemAttribute.java +++ b/OMDSServiceDefinition/src/main/java/at/vvo/omds/client/gui/ItemAttribute.java @@ -3,10 +3,8 @@ package at.vvo.omds.client.gui; import at.vvo.omds.types.omds3.r2025_05.common.*; import javafx.animation.PauseTransition; import javafx.geometry.Insets; -import javafx.scene.control.CheckBox; -import javafx.scene.control.Label; -import javafx.scene.control.TextField; -import javafx.scene.control.TreeItem; +import javafx.scene.Node; +import javafx.scene.control.*; import javafx.scene.layout.HBox; import javafx.scene.layout.VBox; import javafx.scene.paint.Paint; @@ -17,55 +15,37 @@ import javafx.util.Duration; import java.math.BigDecimal; import java.math.BigInteger; -import java.util.HashMap; -import java.util.Map; +import java.util.*; public class ItemAttribute { - Map, Map> infoBoxFromItem = new HashMap<>(); + Map, Map> infoBoxFromItem = new HashMap<>(); + List risikoobjekte = new ArrayList<>(); - public Map, Map> getInfoBoxFromItem() { + public List getRisikoobjekte() { + return risikoobjekte; + } + + public void setRisikoobjekte(List risikoobjekte) { + this.risikoobjekte = risikoobjekte; + } + + public Map, Map> getInfoBoxFromItem() { return infoBoxFromItem; } - public void setInfoBoxFromItem(Map, Map> infoBoxFromItem) { + public void setInfoBoxFromItem(Map, Map> infoBoxFromItem) { this.infoBoxFromItem = infoBoxFromItem; } - public VBox addItemInfo(TreeItem newSelection, VBox attributBox) { - if (((ProduktbausteinType)newSelection.getValue()).getMeldungen() != null && !((ProduktbausteinType)newSelection.getValue()).getMeldungen().isEmpty()){ - attributBox.getChildren().removeIf(n -> n.getId().equals("faultsbox")); - - VBox faultsBox = new VBox(); - for (ServiceFault sf : ((ProduktbausteinType)newSelection.getValue()).getMeldungen()) { - HBox singleFaultBox = new HBox(); - singleFaultBox.setPadding(new Insets(10)); - - Text symbole = new Text("\u26A0 "); - symbole.setFont(Font.font("System", FontWeight.BOLD, symbole.getFont().getSize() + 2)); - - - if (sf.getErrorType().equals(BigInteger.ONE)){ - symbole.setFill(Paint.valueOf("#aa3333")); - } else if (sf.getErrorType().equals(BigInteger.TWO)) { - symbole.setFill(Paint.valueOf("#ccbb00")); - } - Label errorText = new Label(sf.getErrorMsg() + System.lineSeparator()); - - singleFaultBox.getChildren().addAll(symbole, errorText); - faultsBox.getChildren().add(singleFaultBox); - } - - attributBox.getChildren().addFirst(faultsBox); - } - - for(int j = 0; j < ((ProduktbausteinType)newSelection.getValue()).getAttribute().size(); j++) { + public VBox addItemInfo(TreeItem newSelection, VBox attributBox) { + for(int j = 0; j < ((ProduktbausteinType)newSelection.getValue().getProdukt()).getAttribute().size(); j++) { VBox singleAttributBox = new VBox(); singleAttributBox.setPadding(new Insets(10)); Label label = new Label( - ((ProduktbausteinType)newSelection.getValue()).getAttribute().get(j).getBezeichnung() + ": "); + ((ProduktbausteinType)newSelection.getValue().getProdukt()).getAttribute().get(j).getBezeichnung() + ": "); + label.setId("label"); TextField textField = new TextField(); - CheckBox checkBox = new CheckBox(); AttributStringType stringAttribut; @@ -73,14 +53,14 @@ public class ItemAttribute { AttributDezimalType attributDezimal; AttributIntType attributInt; - if (((ProduktbausteinType)newSelection.getValue()).getAttribute().get(j).getClass() + if (((ProduktbausteinType)newSelection.getValue().getProdukt()).getAttribute().get(j).getClass() .equals(AttributBooleanType.class)) { attributDezimal = null; attributInt = null; stringAttribut = null; attributBoolean = (AttributBooleanType) ( - (ProduktbausteinType)newSelection.getValue()).getAttribute().get(j); + (ProduktbausteinType)newSelection.getValue().getProdukt()).getAttribute().get(j); if (infoBoxFromItem.get(newSelection) != null && infoBoxFromItem.get(newSelection).get(attributBoolean) != null && !infoBoxFromItem.get(newSelection).get(attributBoolean).isEmpty()){ @@ -90,13 +70,13 @@ public class ItemAttribute { checkBox.setSelected(true); } } - } else if (((ProduktbausteinType)newSelection.getValue()).getAttribute().get(j).getClass() + } else if (((ProduktbausteinType)newSelection.getValue().getProdukt()).getAttribute().get(j).getClass() .equals(AttributStringType.class)) { attributDezimal = null; attributBoolean = null; attributInt = null; - stringAttribut = (AttributStringType) ((ProduktbausteinType)newSelection.getValue()).getAttribute().get(j); + stringAttribut = (AttributStringType) ((ProduktbausteinType)newSelection.getValue().getProdukt()).getAttribute().get(j); if (stringAttribut.isPflichtfeld()) { label.setText(label.getText().substring(0, label.getText().length()-2) + "*: "); @@ -115,13 +95,13 @@ public class ItemAttribute { } textField.setPromptText("Text eingeben"); - } else if (((ProduktbausteinType)newSelection.getValue()).getAttribute().get(j).getClass() + } else if (((ProduktbausteinType)newSelection.getValue().getProdukt()).getAttribute().get(j).getClass() .equals(AttributDezimalType.class)) { attributBoolean = null; attributInt = null; stringAttribut = null; - attributDezimal = (AttributDezimalType) ((ProduktbausteinType)newSelection.getValue()).getAttribute().get(j); + attributDezimal = (AttributDezimalType) ((ProduktbausteinType)newSelection.getValue().getProdukt()).getAttribute().get(j); if (attributDezimal.isPflichtfeld()) { label.setText(label.getText().substring(0, label.getText().length()-2) + "*: "); @@ -144,7 +124,7 @@ public class ItemAttribute { attributBoolean = null; stringAttribut = null; - attributInt = (AttributIntType) ((ProduktbausteinType)newSelection.getValue()).getAttribute().get(j); + attributInt = (AttributIntType) ((ProduktbausteinType)newSelection.getValue().getProdukt()).getAttribute().get(j); if (attributInt.isPflichtfeld()) { label.setText(label.getText().substring(0, label.getText().length()-2) + "*: "); @@ -183,7 +163,7 @@ public class ItemAttribute { infoBoxFromItem.computeIfAbsent(newSelection, k -> new HashMap<>()).put(attributBoolean, checkBox.isSelected() ? "true" : "false"); attributBoolean.setValue(checkBox.isSelected()); - ((ProduktbausteinType)newSelection.getValue()).getAttribute().set(finalJ, attributBoolean); + ((ProduktbausteinType)newSelection.getValue().getProdukt()).getAttribute().set(finalJ, attributBoolean); } }); textField.focusedProperty().addListener((observableValue, oldVal, newVal) -> { @@ -236,7 +216,7 @@ public class ItemAttribute { }else { if (singleAttributBox.getChildren().size() > 2) singleAttributBox.getChildren().removeLast(); attributDezimal.setValue(new BigDecimal(eingabe)); - ((ProduktbausteinType)newSelection.getValue()).getAttribute().set(finalJ, attributDezimal); + ((ProduktbausteinType)newSelection.getValue().getProdukt()).getAttribute().set(finalJ, attributDezimal); } } else if (attributInt != null) { infoBoxFromItem.computeIfAbsent(newSelection, @@ -268,7 +248,7 @@ public class ItemAttribute { }else { if (singleAttributBox.getChildren().size() > 2) singleAttributBox.getChildren().removeLast(); attributInt.setValue(Integer.parseInt(textField.getText())); - ((ProduktbausteinType)newSelection.getValue()).getAttribute().set(finalJ, attributInt); + ((ProduktbausteinType)newSelection.getValue().getProdukt()).getAttribute().set(finalJ, attributInt); } } else if (stringAttribut != null) { infoBoxFromItem.computeIfAbsent(newSelection, @@ -292,12 +272,12 @@ public class ItemAttribute { pause.play(); if (singleAttributBox.getChildren().size() > 2) singleAttributBox.getChildren().removeLast(); - ((ProduktbausteinType)newSelection.getValue()).getAttribute().set(finalJ, attributInt); + ((ProduktbausteinType)newSelection.getValue().getProdukt()).getAttribute().set(finalJ, attributInt); }else { if (singleAttributBox.getChildren().size() > 2) singleAttributBox.getChildren().removeLast(); stringAttribut.setValue(textField.getText()); - ((ProduktbausteinType)newSelection.getValue()).getAttribute().set(finalJ, stringAttribut); + ((ProduktbausteinType)newSelection.getValue().getProdukt()).getAttribute().set(finalJ, stringAttribut); } } @@ -306,10 +286,110 @@ public class ItemAttribute { if (attributBoolean != null) { singleAttributBox.getChildren().addAll(label, checkBox); }else { + textField.setId("textField"); singleAttributBox.getChildren().addAll(label, textField); } + + singleAttributBox.setId("singleAttributBox"); + attributBox.getChildren().add(singleAttributBox); } + + if (((ProduktbausteinType) newSelection.getValue().getProdukt()).isRisikoobjektErforderlich()) { + + VBox risikoobjektAuswahlBox = new VBox(); + Label vpRo = new Label("Mit dem Baustein assoziierte Risikoobjekte: "); + + for (int i = 0; i < risikoobjekte.size(); i++) { + CheckBox checkBox = new CheckBox(); + checkBox.setText(risikoobjekte.get(i).toString()); + + if (risikoobjekte.get(i) instanceof FahrzeugType) { + checkBox.setText(((FahrzeugType) risikoobjekte.get(i)).getHandelsbez() + " (" + + ((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()))) { + 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)); + } + }); + } + risikoobjektAuswahlBox.getChildren().add(checkBox); + } + + risikoobjektAuswahlBox.getChildren().addFirst(vpRo); + risikoobjektAuswahlBox.setPadding(new Insets(10)); + risikoobjektAuswahlBox.setId("risikoobjektAuswahlBox"); + + attributBox.getChildren().removeIf(c -> c.getId() != null && c.getId().equals("risikoobjektAuswahlBox")); + attributBox.getChildren().add(risikoobjektAuswahlBox); + } + + return addFaultsInfo((ProduktbausteinType) newSelection.getValue().getProdukt(), attributBox); + } + + public VBox addFaultsInfo(ProduktbausteinType produktbaustein, VBox attributBox) { + if (produktbaustein.getMeldungen() != null && !produktbaustein.getMeldungen().isEmpty()) { + attributBox.getChildren().removeIf(n -> n.getId() != null && n.getId().equals("faultsbox")); + VBox faultsBox = new VBox(); + + for (ServiceFault sf : produktbaustein.getMeldungen()) { + HBox singleFaultBox = new HBox(); + + Text symbole = new Text("\u26A0 "); + symbole.setFont(Font.font("System", FontWeight.BOLD, symbole.getFont().getSize() + 2)); + + if (sf.getErrorType().equals(BigInteger.ONE)) { + symbole.setFill(Paint.valueOf("#aa3333")); + } else if (sf.getErrorType().equals(BigInteger.TWO)) { + symbole.setFill(Paint.valueOf("#ccbb00")); + } + Label errorText = new Label(sf.getErrorMsg() + System.lineSeparator()); + errorText.setId("errorText"); + + singleFaultBox.getChildren().addAll(symbole, errorText); + singleFaultBox.setId("singleFaultBox"); + faultsBox.getChildren().add(singleFaultBox); + } + + if (!faultsBox.getChildren().isEmpty()) { + if (produktbaustein.getAttribute().isEmpty()) { + attributBox.getChildren().addAll(faultsBox); + }else { + List singleAttributBoxes = attributBox.getChildren().stream().filter(n -> n.getId() != null && n.getId().equals("singleAttributBox")).toList(); + Optional textField; + Optional label; + for (Node singleAttributBox : singleAttributBoxes) { + textField = ((VBox)singleAttributBox).getChildren().stream().filter(n -> n.getId() != null && n.getId().equals("textField")).findFirst(); + label = ((VBox)singleAttributBox).getChildren().stream().filter(n -> n.getId() != null && n.getId().equals("label")).findFirst(); + List singleFaultBoxes = faultsBox.getChildren().stream().filter(n -> n.getId() != null && n.getId().equals("singleFaultBox")).toList(); + + if (textField.isPresent() && label.isPresent()) { + + for (Node singleFaultBox : singleFaultBoxes) { + Optional errorText = ((HBox)singleFaultBox).getChildren().stream().filter(c -> c.getId() != null && c.getId().equals("errorText")).findFirst(); + + if (errorText.isPresent() && ((Label)errorText.get()).getText().contains(((Label)label.get()).getText().replace(":","").replace("*",""))) { + textField.get().setStyle("-fx-border-color: #dd0000"); + ((VBox)singleAttributBox).getChildren().addLast(faultsBox); + Optional finalTextField = textField; + textField.get().focusedProperty().addListener(s -> finalTextField.get().setStyle(null)); + + } + } + } + } + } + } + } return attributBox; } diff --git a/OMDSServiceDefinition/src/main/java/at/vvo/omds/client/gui/ObjectFactoryFactory.java b/OMDSServiceDefinition/src/main/java/at/vvo/omds/client/gui/ObjectFactoryFactory.java index 46323ac8..35f202b8 100644 --- a/OMDSServiceDefinition/src/main/java/at/vvo/omds/client/gui/ObjectFactoryFactory.java +++ b/OMDSServiceDefinition/src/main/java/at/vvo/omds/client/gui/ObjectFactoryFactory.java @@ -1,9 +1,10 @@ package at.vvo.omds.client.gui; +import at.vvo.omds.types.omds3.r2025_05.common.ProduktbausteinType; import at.vvo.omds.types.omds3.r2025_05.on2antrag.kfz.ObjectFactory; public class ObjectFactoryFactory { - public Object create(String classPath) { + public ProduktbausteinType create(String classPath) { if (classPath != null) { if (classPath.toLowerCase().contains("kfz")){ ObjectFactory of = new ObjectFactory(); diff --git a/OMDSServiceDefinition/src/main/java/at/vvo/omds/client/gui/Plausi.java b/OMDSServiceDefinition/src/main/java/at/vvo/omds/client/gui/Plausi.java new file mode 100644 index 00000000..2c2256a5 --- /dev/null +++ b/OMDSServiceDefinition/src/main/java/at/vvo/omds/client/gui/Plausi.java @@ -0,0 +1,37 @@ +package at.vvo.omds.client.gui; + +public class Plausi { + String id; + String beschreibung; + String query; + + public Plausi(String name, String beschreibung, String query) { + this.id = name; + this.beschreibung = beschreibung; + this.query = query; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getBeschreibung() { + return beschreibung; + } + + public void setBeschreibung(String beschreibung) { + this.beschreibung = beschreibung; + } + + public String getQuery() { + return query; + } + + public void setQuery(String query) { + this.query = query; + } +} diff --git a/OMDSServiceDefinition/src/main/java/at/vvo/omds/client/gui/RDFHelper.java b/OMDSServiceDefinition/src/main/java/at/vvo/omds/client/gui/RDFHelper.java new file mode 100644 index 00000000..a415148f --- /dev/null +++ b/OMDSServiceDefinition/src/main/java/at/vvo/omds/client/gui/RDFHelper.java @@ -0,0 +1,467 @@ +package at.vvo.omds.client.gui; + +import at.vvo.omds.types.omds3.r2025_05.common.*; +import jakarta.xml.bind.JAXBElement; +import javafx.scene.control.TreeItem; +import javafx.util.Pair; +import org.eclipse.rdf4j.model.impl.LinkedHashModel; +import org.eclipse.rdf4j.model.impl.SimpleValueFactory; +import org.eclipse.rdf4j.model.util.Models; +import org.eclipse.rdf4j.model.util.Values; +import org.eclipse.rdf4j.model.vocabulary.RDF; +import org.eclipse.rdf4j.rio.RDFFormat; +import org.eclipse.rdf4j.rio.Rio; +import org.eclipse.rdf4j.model.*; +import org.springframework.http.MediaType; +import org.springframework.web.client.RestClient; + +import javax.xml.datatype.DatatypeConfigurationException; +import javax.xml.datatype.DatatypeFactory; +import javax.xml.datatype.XMLGregorianCalendar; +import java.io.IOException; +import java.io.StringReader; +import java.math.BigDecimal; +import java.math.BigInteger; +import java.util.*; + +import static org.eclipse.rdf4j.model.util.Values.iri; + +public class RDFHelper { + + private final RestClient restClient = RestClient.create(); + + public Pair, List> getAprioriRDF(JAXBElement r) throws DatatypeConfigurationException, IOException { + String response = restClient.post() + .uri("http://localhost:9090/ProductsRequest") + .contentType(MediaType.APPLICATION_JSON) + .body(r.getValue()) + .retrieve() + .toEntity(String.class) + .getBody(); + + + List> attributeListe = getAttributesFromRequest(response); + List result = productsRequestToVerkaufsprodukt(response, attributeListe); + List result2 = productsRequestToPlausi(response); + + return new Pair<>(result, result2); + } + + private List> getAttributesFromRequest(String response) throws IOException { + Model model = Rio.parse(new StringReader(response), "", RDFFormat.JSONLD); + Rio.write(model, System.out, RDFFormat.TURTLE); + List> erg = new ArrayList<>(); + + String baseIri = "http://vvo.pisanoapi.at/"; + + IRI bezIri = iri(baseIri + "bez"); + IRI produktIri = iri(baseIri + "ProdElement"); + IRI requiredIri = iri(baseIri + "required"); + IRI maxIri = iri(baseIri + "max"); + IRI minIri = iri(baseIri + "min"); + IRI defaultIri = iri(baseIri + "default"); + IRI valueIri = iri(baseIri + "value"); + + + 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)); + + if (iri.stringValue().contains("ElemBoolean")) { + AttributBooleanType ab = new AttributBooleanType(); + + Boolean val = Boolean.valueOf(Models.objectLiteral(model.filter(iri, valueIri, null)).map(Literal::getLabel).orElse(null)); + Boolean def = Boolean.valueOf(Models.objectLiteral(model.filter(iri, defaultIri, null)).map(Literal::getLabel).orElse(null)); + + int start = iri.stringValue().lastIndexOf("ElemBoolean"); + ab.setId(BigInteger.valueOf(Long.valueOf(iri.stringValue().substring(start + "ElemBoolean".length())))); + + ab.setBezeichnung(bez); + ab.setDefault(def); + ab.setPflichtfeld(required); + ab.setValue(val); + + Pair atPair = new Pair<>(prodId, ab); + erg.add(atPair); + } else if (iri.stringValue().contains("ElemInt")) { + AttributIntType ai = new AttributIntType(); + + Integer val = Integer.parseInt(Models.objectLiteral(model.filter(iri, valueIri, null)).map(Literal::getLabel).orElse("-1")); + Integer def = Integer.parseInt(Models.objectLiteral(model.filter(iri, defaultIri, null)).map(Literal::getLabel).orElse("-1")); + Integer min = Integer.parseInt(Models.objectLiteral(model.filter(iri, minIri, null)).map(Literal::getLabel).orElse("-1")); + Integer max = Integer.parseInt(Models.objectLiteral(model.filter(iri, maxIri, null)).map(Literal::getLabel).orElse("-1")); + + int start = iri.stringValue().lastIndexOf("ElemInt"); + ai.setId(BigInteger.valueOf(Long.valueOf(iri.stringValue().substring(start + "ElemInt".length())))); + + ai.setBezeichnung(bez); + ai.setDefault(def); + ai.setPflichtfeld(required); + ai.setMax(max); + ai.setMin(min); + ai.setValue(val); + + Pair atPair = new Pair<>(prodId, ai); + erg.add(atPair); + } else if (iri.stringValue().contains("ElemDecimal")) { + AttributDezimalType ad = new AttributDezimalType(); + + BigDecimal val = Models.objectLiteral(model.filter(iri, valueIri, null)).map(Literal::decimalValue).orElse(BigDecimal.valueOf(-1)); + BigDecimal def = Models.objectLiteral(model.filter(iri, defaultIri, null)).map(Literal::decimalValue).orElse(BigDecimal.valueOf(-1)); + BigDecimal min = Models.objectLiteral(model.filter(iri, minIri, null)).map(Literal::decimalValue).orElse(BigDecimal.valueOf(-1)); + BigDecimal max = Models.objectLiteral(model.filter(iri, maxIri, null)).map(Literal::decimalValue).orElse(BigDecimal.valueOf(-1)); + + int start = iri.stringValue().lastIndexOf("ElemDecimal"); + ad.setId(BigInteger.valueOf(Long.valueOf(iri.stringValue().substring(start + "ElemDecimal".length())))); + + ad.setBezeichnung(bez); + ad.setDefault(def); + ad.setPflichtfeld(required); + ad.setMax(max); + ad.setMin(min); + ad.setValue(val); + + Pair atPair = new Pair<>(prodId, ad); + erg.add(atPair); + } else if (iri.stringValue().contains("ElemString")) { + AttributStringType as = new AttributStringType(); + + String val = String.valueOf(Models.objectLiteral(model.filter(iri, valueIri, null)).map(Literal::getLabel).orElse(null)); + String def = String.valueOf(Models.objectLiteral(model.filter(iri, defaultIri, null)).map(Literal::getLabel).orElse(null)); + + int start = iri.stringValue().lastIndexOf("ElemString"); + as.setId(BigInteger.valueOf(Long.parseLong(iri.stringValue().substring(start + "ElemString".length())))); + + as.setBezeichnung(bez); + as.setDefault(def); + as.setPflichtfeld(required); + as.setValue(val); + + Pair atPair = new Pair<>(prodId, as); + erg.add(atPair); + } + } + + return erg; + } + + private List productsRequestToPlausi(String response) throws IOException { + List result = new ArrayList<>(); + 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", ""); + ValueFactory vf = SimpleValueFactory.getInstance(); + + String beschreibung = Models.objectLiteral(model.filter(iri, vf.createIRI( + "http://vvo.pisanoapi.at/beschreibung"), null)).map(Literal::getLabel).orElse(null); + + 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)); + } + } + return result; + } + + private List productsRequestToVerkaufsprodukt(String productsRequest, List> attributeListe) throws IOException, DatatypeConfigurationException { + Model model = Rio.parse(new StringReader(productsRequest), "", RDFFormat.JSONLD); + + Map bausteine = new HashMap<>(); + Map parents = new HashMap<>(); + + for (Resource iri : Models.subjectIRIs(model)) { + 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( + "http://vvo.pisanoapi.at/ins_id"), null)).map(Literal::getLabel).orElse("-1")); + int maxOccurrence = Integer.parseInt(Models.objectLiteral(model.filter(iri, vf.createIRI( + "http://vvo.pisanoapi.at/maxOccurrence"), null)).map(Literal::getLabel).orElse("-1")); + int minOccurrence = Integer.parseInt(Models.objectLiteral(model.filter(iri, vf.createIRI( + "http://vvo.pisanoapi.at/minOccurrence"), null)).map(Literal::getLabel).orElse("-1")); + String bez = Models.objectLiteral(model.filter(iri, vf.createIRI( + "http://vvo.pisanoapi.at/bez"), null)).map(Literal::getLabel).orElse(null); + String type = Models.objectLiteral(model.filter(iri, vf.createIRI( + "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); + 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("http://vvo.pisanoapi.at/salesFrom"), null)) + .map(Literal::getLabel).orElse(null)) : null; + XMLGregorianCalendar verkaufsoffenBis = Models.objectLiteral(model.filter(iri, vf.createIRI( + "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; + + Optional parentId = Models.objectResource(model.filter(iri, vf.createIRI( + "http://vvo.pisanoapi.at/parent"), null)).map(Resource::stringValue); + + APrioriProduktbausteinType verkaufsproduktType; + if (parentId.isPresent()) { + verkaufsproduktType = new APrioriUnterbausteinType(); + } else { + verkaufsproduktType = new APrioriVerkaufsproduktType(); + } + + for (Pair attribute : attributeListe) { + if (attribute.getKey().equals(id)){ + verkaufsproduktType.getAttribute().add(attribute.getValue()); + } + } + + verkaufsproduktType.setId(iri.stringValue().substring("http://vvo.pisanoapi.at/ProdElement".length(), iri.stringValue().indexOf("-") > 0 ? iri.stringValue().indexOf("-") : iri.stringValue().length())); + verkaufsproduktType.setName(bez); + verkaufsproduktType.setType(type); + verkaufsproduktType.setFrom(verkaufsoffenVon); + verkaufsproduktType.setTo(verkaufsoffenBis); + verkaufsproduktType.setMaxOccurrences(maxOccurrence); + verkaufsproduktType.setMinOccurrences(minOccurrence); + verkaufsproduktType.setRisikoobjektType(risikoobjektType); + + parentId.ifPresent(p -> parents.put(id, p)); + bausteine.put(id, verkaufsproduktType); + } + } + + List verkaufsprodukteList = new ArrayList<>(); + + for (Map.Entry entry : bausteine.entrySet()){ + String id = entry.getKey(); + 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 { + verkaufsprodukteList.add((APrioriVerkaufsproduktType) baustein); + } + } + + return verkaufsprodukteList; + } + + public VerkaufsproduktType getCalculateRDF(String r) throws DatatypeConfigurationException, IOException { + + return calculateRequestToVerkaufsprodukt(restClient.post() + .uri("http://localhost:9090/CalculateRequest") + .contentType(MediaType.APPLICATION_JSON) + .body(r) + .retrieve() + .toEntity(String.class) + .getBody()); + } + + public VerkaufsproduktType calculateRequestToVerkaufsprodukt(String calculateRequest) throws IOException, DatatypeConfigurationException { + Model model = Rio.parse(new StringReader(calculateRequest), "", RDFFormat.JSONLD); + + Map bausteine = new LinkedHashMap<>(); + Map parents = new HashMap<>(); + + List> attListe = getAttributesFromRequest(calculateRequest); + for (Resource iri : Models.subjectIRIs(model)) { + + if (iri.stringValue().contains("Prod")) { + String id = iri.stringValue(); + + ValueFactory vf = SimpleValueFactory.getInstance(); + + int insId = Integer.parseInt(Models.objectLiteral(model.filter(iri, vf.createIRI( + "http://vvo.pisanoapi.at/ins_id"), null)).map(Literal::getLabel).orElse("-1")); + int maxOccurrence = Integer.parseInt(Models.objectLiteral(model.filter(iri, vf.createIRI( + "http://vvo.pisanoapi.at/maxOccurrence"), null)).map(Literal::getLabel).orElse("-1")); + int minOccurrence = Integer.parseInt(Models.objectLiteral(model.filter(iri, vf.createIRI( + "http://vvo.pisanoapi.at/minOccurrence"), null)).map(Literal::getLabel).orElse("-1")); + String bez = Models.objectLiteral(model.filter(iri, vf.createIRI( + "http://vvo.pisanoapi.at/bez"), null)).map(Literal::getLabel).orElse(null); + String type = Models.objectLiteral(model.filter(iri, vf.createIRI( + "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); + 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( + "http://vvo.pisanoapi.at/salesFrom"), null)).map(Literal::getLabel).orElse(null)) : null; + XMLGregorianCalendar verkaufsoffenBis = Models.objectLiteral(model.filter(iri, vf.createIRI( + "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; + + Optional parentId = Models.objectResource(model.filter(iri, vf.createIRI( + "http://vvo.pisanoapi.at/parent"), null)).map(Resource::stringValue); + + ObjectFactoryFactory off = new ObjectFactoryFactory(); + ProduktbausteinType verkaufsproduktType = (ProduktbausteinType) 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); + verkaufsproduktType.setTyp(type); + verkaufsproduktType.setVerkaufsoffenVon(verkaufsoffenVon); + verkaufsproduktType.setVerkaufsoffenBis(verkaufsoffenBis); + verkaufsproduktType.setMaxVorkommen(maxOccurrence); + 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 (Pair pair : attListe) { + if (pair.getKey().equals(id)) { + verkaufsproduktType.getAttribute().add(pair.getValue()); + } + } + + parentId.ifPresent(p -> parents.put(id, p)); + bausteine.put(id, verkaufsproduktType); + } + } + + List verkaufsprodukteList = new ArrayList<>(); + + for (Map.Entry entry : bausteine.entrySet()){ + String id = entry.getKey(); + ProduktbausteinType baustein = entry.getValue(); + String parentId = parents.get(id); + + if (parentId != null && bausteine.containsKey(parentId)){ + bausteine.get(parentId).getBausteine().add(baustein); + }else { + verkaufsprodukteList.add((VerkaufsproduktType) baustein); + } + } + + return verkaufsprodukteList.getFirst(); + } + + public Model createRdfModel(TreeItem vp) { + Model erg = new LinkedHashModel(); + String baseIri = "http://vvo.pisanoapi.at/"; + + Map occCounter = new HashMap<>(); + addProduktToModel(vp, erg, baseIri, null, occCounter); + + return erg; + } + + public void addProduktToModel(TreeItem guiProdukt, Model model, String baseIri, String parentId, Map occCounter) { + ProduktbausteinType produkt = (ProduktbausteinType) guiProdukt.getValue().getProdukt(); + + IRI prodelemIri = iri(baseIri + "ProdElement"); + IRI insIdIri = iri(baseIri + "ins_id"); + IRI bezIri = iri(baseIri + "bez"); + IRI createdIri = iri(baseIri + "created"); + IRI salesFromIri = iri(baseIri + "salesFrom"); + IRI salesToIri = iri(baseIri + "salesTo"); + IRI minOccurrenceIri = iri(baseIri + "minOccurrence"); + 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"); + + int occ = occCounter.merge(String.valueOf(produkt.getId()), 1, Integer::sum); + IRI vpIri = iri(baseIri + "ProdElement" + produkt.getId() + "-" + occ); + + 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.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())); + model.add(vpIri, typeIri, Values.literal(produkt.getTyp())); + + if (parentId != null) model.add(vpIri, parentIri, Values.iri(parentId)); + + } + + for (AttributType attribut : produkt.getAttribute()){ + IRI atBez = iri(baseIri + "bez"); + IRI atRequiredIri = iri(baseIri + "required"); + IRI atProd = iri(baseIri + "ProdElement"); + IRI atValue = iri(baseIri + "value"); + IRI atMax = iri(baseIri + "max"); + IRI atMin = iri(baseIri + "min"); + IRI atDefault = iri(baseIri + "default"); + + if (attribut instanceof AttributIntType){ + IRI specificAt = iri(baseIri + "ElemInt" + attribut.getId()); + + model.add(specificAt, RDF.TYPE, iri(baseIri + "ElemInt")); + model.add(specificAt, atBez, Values.literal(attribut.getBezeichnung())); + model.add(specificAt, atRequiredIri, Values.literal(((AttributIntType) attribut).isPflichtfeld())); + if (((AttributIntType) attribut).getValue() != null) model.add(specificAt, atValue, Values.literal(((AttributIntType) attribut).getValue())); + model.add(specificAt, atProd, vpIri); + 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())); + + } else if (attribut instanceof AttributBooleanType) { + IRI specificAt = iri(baseIri + "ElemBoolean" + attribut.getId()); + + model.add(specificAt, RDF.TYPE, iri(baseIri + "ElemBoolean")); + model.add(specificAt, atBez, Values.literal(attribut.getBezeichnung())); + model.add(specificAt, atRequiredIri, Values.literal(((AttributBooleanType) attribut).isPflichtfeld())); + if (((AttributBooleanType) attribut).isValue() != null) model.add(specificAt, atValue, Values.literal(((AttributBooleanType) attribut).isValue())); + model.add(specificAt, atProd, vpIri); + model.add(specificAt, atDefault, Values.literal(((AttributBooleanType) attribut).isDefault())); + + } else if (attribut instanceof AttributStringType) { + IRI specificAt = iri(baseIri + "ElemString" + attribut.getId()); + + model.add(specificAt, RDF.TYPE, iri(baseIri + "ElemString")); + model.add(specificAt, atBez, Values.literal(attribut.getBezeichnung())); + model.add(specificAt, atRequiredIri, Values.literal(((AttributStringType) attribut).isPflichtfeld())); + if (((AttributStringType) attribut).getValue() != null) model.add(specificAt, atValue, Values.literal(((AttributStringType) attribut).getValue())); + model.add(specificAt, atProd, vpIri); + model.add(specificAt, atDefault, Values.literal(((AttributStringType) attribut).getDefault())); + + } else if (attribut instanceof AttributDezimalType) { + IRI specificAt = iri(baseIri + "ElemDecimal" + attribut.getId()); + + model.add(specificAt, RDF.TYPE, iri(baseIri + "ElemDecimal")); + model.add(specificAt, atBez, Values.literal(attribut.getBezeichnung())); + model.add(specificAt, atRequiredIri, Values.literal(((AttributDezimalType) attribut).isPflichtfeld())); + 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())); + } + } +// 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)); + if (!guiProdukt.getValue().isNotIncluded()) { + model.add(vpIri, bausteinIri, unterbausteinIri); + } + + String newParentId = vpIri.stringValue(); + addProduktToModel(guiProdukt.getChildren().get(i), model, baseIri, newParentId, occCounter); + } + } +} diff --git a/OMDSServiceDefinition/src/main/java/at/vvo/omds/client/gui/RisikoobjektView.java b/OMDSServiceDefinition/src/main/java/at/vvo/omds/client/gui/RisikoobjektView.java new file mode 100644 index 00000000..63ac73d6 --- /dev/null +++ b/OMDSServiceDefinition/src/main/java/at/vvo/omds/client/gui/RisikoobjektView.java @@ -0,0 +1,215 @@ +package at.vvo.omds.client.gui; + +import at.vvo.omds.types.omds3.r2025_05.common.FahrzeugType; +import at.vvo.omds.types.omds3.r2025_05.common.VersichertesInteresseMitAttributMetadatenType; +import javafx.geometry.Insets; +import javafx.geometry.Pos; +import javafx.scene.control.*; +import javafx.scene.layout.*; +import javafx.scene.paint.Paint; +import javafx.scene.text.Font; +import javafx.scene.text.FontWeight; + +import javax.xml.datatype.DatatypeConfigurationException; +import javax.xml.datatype.DatatypeFactory; +import javax.xml.datatype.XMLGregorianCalendar; +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.List; + +public class RisikoobjektView { + List risikoobjekte = new ArrayList<>(); + VBox objekteListe = new VBox(); + ScrollPane objekteScroll = new ScrollPane(); + GridPane main = new GridPane(); + + public List getRisikoobjekte() { + return risikoobjekte; + } + + public GridPane risikoobjekte() { + VBox createObjekt = createRisikoobjekt(); + + objekteListe = risikoobjekteListe(); + + objekteScroll.setContent(objekteListe); + objekteScroll.setFitToWidth(true); + objekteScroll.setFitToHeight(false); + objekteScroll.setStyle("-fx-background-color:transparent;"); + + main.add(createObjekt, 0, 0); + main.add(objekteScroll, 1, 0); + + GridPane.setHgrow(createObjekt, Priority.ALWAYS); + GridPane.setVgrow(createObjekt, Priority.ALWAYS); + GridPane.setHgrow(objekteScroll, Priority.ALWAYS); + GridPane.setVgrow(objekteScroll, Priority.ALWAYS); + + createObjekt.setPadding(new Insets(10, 10, 10, 5)); + createObjekt.setStyle("-fx-border-color: black; -fx-border-width: 1px;"); + + objekteScroll.setPadding(new Insets(10, 10, 10, 5)); + objekteScroll.setStyle("-fx-border-color: black; -fx-border-width: 1px;"); + + main.setAlignment(Pos.CENTER); + main.setPadding(new Insets(10)); + main.setHgap(10); + + return main; + } + + private VBox risikoobjekteListe() { + VBox objekteListe = new VBox(10); // spacing + objekteListe.setFillWidth(true); + + if (risikoobjekte != null && !risikoobjekte.isEmpty()) { + for (VersichertesInteresseMitAttributMetadatenType r : risikoobjekte) { + + + HBox singleRisikoobjekt = new HBox(10); + singleRisikoobjekt.setPadding(new Insets(5)); + singleRisikoobjekt.setAlignment(Pos.CENTER); + + VBox objektInfo = new VBox(2); + + if (r instanceof FahrzeugType fahrzeug) { + Label handelsbezeichnung = new Label(fahrzeug.getHandelsbez()); + handelsbezeichnung.setFont(Font.font("System", FontWeight.BOLD, 14)); + + Label baujahr = new Label(fahrzeug.getBaujahr().toString()); + baujahr.setStyle("-fx-text-fill: #555555"); + + Label erstzulassung = new Label(fahrzeug.getErstzulassdat().toString() + .substring(0, fahrzeug.getErstzulassdat().toString().length()-1)); + erstzulassung.setStyle("-fx-text-fill: #555555"); + + objektInfo.getChildren().addAll(handelsbezeichnung, baujahr, erstzulassung); + + Pane separator = new Pane(); + separator.setPrefWidth(2); + separator.setMaxWidth(2); + separator.setStyle("-fx-background-color: black;"); + + Label symbole = new Label("\u26DF"); + symbole.setFont(Font.font(18)); + + VBox symbolBox = new VBox(symbole); + + singleRisikoobjekt.getChildren().addAll(symbolBox, separator, objektInfo); + singleRisikoobjekt.setAlignment(Pos.CENTER_LEFT); + } + + objekteListe.getChildren().add(singleRisikoobjekt); + } + } + return objekteListe; + } + + private VBox createRisikoobjekt() { + VBox createForm = new VBox(); + ChoiceBox choiceBox = new ChoiceBox<>(); + + List risikoobjektArten = new ArrayList<>(); + risikoobjektArten.add("Versichertes objekt SachPrivat"); + risikoobjektArten.add("Versicherte Liegenschaft"); + risikoobjektArten.add("Fahrzeug"); + risikoobjektArten.add("Risiko Gebaeude"); + risikoobjektArten.add("Versicherte Person"); + risikoobjektArten.add("Risiko Haushalt"); + + choiceBox.getSelectionModel().selectedItemProperty().addListener((obs, oldVal, newVal) -> { + if (newVal != null) { + switch (newVal) { + case "Versichertes objekt SachPrivat": { + System.out.println("formular sach Privat"); + break; + } + case "Versicherte Liegenschaft": { + System.out.println("create Versicherte Liegenschaft"); + break; + } + case "Fahrzeug": { + FahrzeugType fahrzeug = new FahrzeugType(); + + VBox createFormBox = new VBox(); + + VBox baujahrBox = new VBox(); + Label label1 = new Label("Baujahr"); + TextField textField1 = new TextField(); + + textField1.setPromptText("Baujahr"); + baujahrBox.setPadding(new Insets(5)); + baujahrBox.getChildren().addAll(label1, textField1); + + textField1.focusedProperty().addListener((observableValue, oldValue, newValue) -> { + if (!newValue) { + Label failedCheck = new Label("Es muss eine 4 stellige Jahreszahl mitgegeben werden"); + failedCheck.setId("failedCheck"); + failedCheck.setTextFill(Paint.valueOf("#DD0000")); + if (textField1.getText().length() != 4) { + textField1.setStyle("-fx-border-color: #dd0000"); + baujahrBox.getChildren().addAll(failedCheck); + } else { + textField1.setStyle("-fx-border-color: #555555"); + baujahrBox.getChildren().removeIf(c -> c.getId() != null && c.getId().equals("failedCheck")); + } + } + }); + + VBox handelsbezeichnungBox = new VBox(); + Label label2 = new Label("Handelsbezeichnung"); + TextField textField2 = new TextField(); + + textField2.setPromptText("Handelsbezeichnung"); + handelsbezeichnungBox.setPadding(new Insets(5)); + handelsbezeichnungBox.getChildren().addAll(label2, textField2); + + VBox erstzulassungBox = new VBox(); + Label label3 = new Label("Erstzulassung"); + DatePicker datePicker = new DatePicker(LocalDate.now()); + + erstzulassungBox.setPadding(new Insets(5)); + erstzulassungBox.getChildren().addAll(label3, datePicker); + + Button createBtn = new Button("Create"); + + createBtn.setOnAction(e -> { + fahrzeug.setBaujahr(Integer.valueOf(textField1.getText())); + fahrzeug.setHandelsbez(textField2.getText()); + try { + int day = datePicker.getValue().getDayOfMonth(); + int month = datePicker.getValue().getMonthValue(); + int year = datePicker.getValue().getYear(); + + XMLGregorianCalendar erstzulassung = DatatypeFactory.newInstance().newXMLGregorianCalendarDate(year, month, day, 0); + + fahrzeug.setErstzulassdat(erstzulassung); + } catch (DatatypeConfigurationException ex) { + throw new RuntimeException(ex); + } + + risikoobjekte.add(fahrzeug); + + objekteListe.getChildren().setAll(risikoobjekteListe().getChildren()); + + createFormBox.getChildren().clear(); + String select = choiceBox.getSelectionModel().getSelectedItem(); + choiceBox.getSelectionModel().clearSelection(); + choiceBox.getSelectionModel().select(select); + + }); + + createFormBox.getChildren().addAll(baujahrBox, handelsbezeichnungBox, erstzulassungBox, createBtn); + createForm.getChildren().add(createFormBox); + break; + } + } + } + }); + + choiceBox.getItems().addAll(risikoobjektArten); + + createForm.getChildren().addAll(choiceBox); + return createForm; + } +} diff --git a/OMDSServiceDefinition/src/main/java/at/vvo/omds/client/gui/TreeHelper.java b/OMDSServiceDefinition/src/main/java/at/vvo/omds/client/gui/TreeHelper.java index f95a98fd..a56370d0 100644 --- a/OMDSServiceDefinition/src/main/java/at/vvo/omds/client/gui/TreeHelper.java +++ b/OMDSServiceDefinition/src/main/java/at/vvo/omds/client/gui/TreeHelper.java @@ -2,17 +2,12 @@ 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 javafx.scene.text.Text; -import javafx.scene.text.TextFlow; -import java.lang.reflect.InvocationTargetException; import java.util.*; public class TreeHelper { Map timesItemisIncludedById = new HashMap<>(); - List> isNotIncluded = new ArrayList<>(); public Map getTimesItemisIncludedById() { return timesItemisIncludedById; @@ -22,22 +17,14 @@ public class TreeHelper { this.timesItemisIncludedById = timesItemisIncludedById; } - public List> getIsNotIncluded() { - return isNotIncluded; - } - - public void setIsNotIncluded(List> isNotIncluded) { - this.isNotIncluded = isNotIncluded; - } - - public TreeItem cleanTree(TreeItem original) { - if (isNotIncluded.contains(original)) { + public TreeItem cleanTree(TreeItem original) { + if (original.getValue().isNotIncluded()) { return null; } - TreeItem newItem = new TreeItem<>(original.getValue()); - for (TreeItem child : original.getChildren()) { - TreeItem cleanedChild = cleanTree(child); + TreeItem newItem = new TreeItem<>(original.getValue()); + for (TreeItem child : original.getChildren()) { + TreeItem cleanedChild = cleanTree(child); if (cleanedChild != null) { newItem.getChildren().add(cleanedChild); } @@ -45,110 +32,121 @@ public class TreeHelper { return newItem; } - public TreeItem cloneTreeItem(TreeItem original) throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException { - Object cloneOriginalValue; + public TreeItem cloneTreeItem(TreeItem original) { + ProduktbausteinType cloneOriginalValue; - cloneOriginalValue = new ObjectFactoryFactory().create(((ProduktbausteinType) original.getValue()).getTyp()); + cloneOriginalValue = new ObjectFactoryFactory().create(((ProduktbausteinType) original.getValue().getProdukt()).getTyp()); - ((ProduktbausteinType) cloneOriginalValue).setId( - ((ProduktbausteinType) original.getValue()).getId()); - ((ProduktbausteinType) cloneOriginalValue).setBezeichnung( - ((ProduktbausteinType) original.getValue()).getBezeichnung()); - ((ProduktbausteinType) cloneOriginalValue).setVerkaufsoffenVon( - ((ProduktbausteinType) original.getValue()).getVerkaufsoffenVon()); - ((ProduktbausteinType) cloneOriginalValue).setVerkaufsoffenBis( - ((ProduktbausteinType) original.getValue()).getVerkaufsoffenBis()); - ((ProduktbausteinType) cloneOriginalValue).getAttribute().addAll( - ((ProduktbausteinType) original.getValue()).getAttribute()); - ((ProduktbausteinType) cloneOriginalValue).getMeldungen().addAll( - ((ProduktbausteinType) original.getValue()).getMeldungen()); - ((ProduktbausteinType) cloneOriginalValue).setMinVorkommen( - ((ProduktbausteinType) original.getValue()).getMinVorkommen()); - ((ProduktbausteinType) cloneOriginalValue).setMaxVorkommen( - ((ProduktbausteinType) original.getValue()).getMaxVorkommen()); - ((ProduktbausteinType) cloneOriginalValue).setTyp( - ((ProduktbausteinType) original.getValue()).getTyp()); + cloneOriginalValue.setId( + ((ProduktbausteinType) original.getValue().getProdukt()).getId()); + cloneOriginalValue.setBezeichnung( + ((ProduktbausteinType) original.getValue().getProdukt()).getBezeichnung()); + cloneOriginalValue.setVerkaufsoffenVon( + ((ProduktbausteinType) original.getValue().getProdukt()).getVerkaufsoffenVon()); + cloneOriginalValue.setVerkaufsoffenBis( + ((ProduktbausteinType) original.getValue().getProdukt()).getVerkaufsoffenBis()); + cloneOriginalValue.getAttribute().addAll( + ((ProduktbausteinType) original.getValue().getProdukt()).getAttribute()); + cloneOriginalValue.getMeldungen().addAll( + ((ProduktbausteinType) original.getValue().getProdukt()).getMeldungen()); + cloneOriginalValue.setMinVorkommen( + ((ProduktbausteinType) original.getValue().getProdukt()).getMinVorkommen()); + cloneOriginalValue.setMaxVorkommen( + ((ProduktbausteinType) original.getValue().getProdukt()).getMaxVorkommen()); + cloneOriginalValue.setTyp( + ((ProduktbausteinType) original.getValue().getProdukt()).getTyp()); + cloneOriginalValue.setRisikoobjektErforderlich( + ((ProduktbausteinType) original.getValue().getProdukt()).isRisikoobjektErforderlich()); + cloneOriginalValue.getVersicherteObjekte().addAll( + ((ProduktbausteinType) original.getValue().getProdukt()).getVersicherteObjekte()); + TreeItem clonedItem = new TreeItem<>(new GuiProdukt(cloneOriginalValue)); - TreeItem clonedItem = new TreeItem<>(cloneOriginalValue); - - for (TreeItem child : original.getChildren()) { + for (TreeItem child : original.getChildren()) { clonedItem.getChildren().add(cloneTreeItem(child)); } + clonedItem.setExpanded(true); + + clonedItem.getValue().setNotIncluded(original.getValue().isNotIncluded()); + return clonedItem; } - public TreeItem findTreeItem(ProduktbausteinType item, TreeItem root) { - if (((ProduktbausteinType) root.getValue()).getId().equals(item.getId())) { + public TreeItem findTreeItem(ProduktbausteinType item, TreeItem root) { + if (((ProduktbausteinType) root.getValue().getProdukt()).getId().equals(item.getId())) { return root; } - for (TreeItem child : root.getChildren()) { - TreeItem found = findTreeItem(item, child); + for (TreeItem child : root.getChildren()) { + TreeItem found = findTreeItem(item, child); if (found != null) return found; } return null; } - public void messageToTree(APrioriProduktbausteinType produkt, TreeItem treeItem) throws Exception { + public void aprioriProduktToTree(APrioriProduktbausteinType produkt, TreeItem treeItem) throws Exception { if (!produkt.getBausteine().isEmpty()) { for (int i = 0; i < produkt.getBausteine().size(); i++) { - TreeItem up = aprioriItemToCalcItem(new TreeItem<>(produkt.getBausteine().get(i))); + TreeItem up = aprioriItemToCalcItem(new TreeItem<>(new GuiProdukt(produkt.getBausteine().get(i)))); up.setExpanded(true); if (!produkt.getBausteine().get(i).getBausteine().isEmpty()) { - messageToTree(produkt.getBausteine().get(i), up); + aprioriProduktToTree(produkt.getBausteine().get(i), up); } treeItem.getChildren().add(up); } } } - public void calcMessageToTree(ProduktbausteinType produkt, TreeItem treeItem) { - if (!produkt.getBausteine().isEmpty()) { + public void produktToTree(ProduktbausteinType produkt, TreeItem treeItem) throws Exception { + if (produkt != null && !produkt.getBausteine().isEmpty()) { for (int i = 0; i < produkt.getBausteine().size(); i++) { - TreeItem up = new TreeItem<>(produkt.getBausteine().get(i)); + TreeItem up = new TreeItem<>(new GuiProdukt(produkt.getBausteine().get(i))); up.setExpanded(true); if (!produkt.getBausteine().get(i).getBausteine().isEmpty()) { - calcMessageToTree(produkt.getBausteine().get(i), up); + produktToTree(produkt.getBausteine().get(i), up); } treeItem.getChildren().add(up); - if (!timesItemisIncludedById.containsKey(((ProduktbausteinType) up.getValue()).getId())) { - timesItemisIncludedById.put(((ProduktbausteinType) up.getValue()).getId(), 1); + if (!timesItemisIncludedById.containsKey(((ProduktbausteinType) up.getValue().getProdukt()).getId())) { + timesItemisIncludedById.put(((ProduktbausteinType) up.getValue().getProdukt()).getId(), 1); } } } } - public TreeItem aprioriItemToCalcItem(TreeItem produkt) throws Exception { + public TreeItem aprioriItemToCalcItem(TreeItem produkt) throws Exception { - TreeItem ergItem = new TreeItem<>(); - Object erg = new ObjectFactoryFactory().create(((APrioriProduktbausteinType) produkt.getValue()).getType()); + TreeItem ergItem = new TreeItem<>(); + Object erg = new ObjectFactoryFactory().create( + ((APrioriProduktbausteinType) produkt.getValue().getProdukt()).getType()); if (erg != null) { if (ProduktbausteinType.class.isAssignableFrom(erg.getClass())) { ((ProduktbausteinType) erg).setId( - ((APrioriProduktbausteinType) produkt.getValue()).getId()); + ((APrioriProduktbausteinType) produkt.getValue().getProdukt()).getId()); ((ProduktbausteinType) erg).setBezeichnung( - ((APrioriProduktbausteinType) produkt.getValue()).getName()); + ((APrioriProduktbausteinType) produkt.getValue().getProdukt()).getName()); ((ProduktbausteinType) erg).setVerkaufsoffenVon( - ((APrioriProduktbausteinType) produkt.getValue()).getFrom()); + ((APrioriProduktbausteinType) produkt.getValue().getProdukt()).getFrom()); ((ProduktbausteinType) erg).setVerkaufsoffenBis( - ((APrioriProduktbausteinType) produkt.getValue()).getTo()); + ((APrioriProduktbausteinType) produkt.getValue().getProdukt()).getTo()); ((ProduktbausteinType) erg).getMeldungen().addAll( - ((APrioriProduktbausteinType) produkt.getValue()).getMeldungen()); + ((APrioriProduktbausteinType) produkt.getValue().getProdukt()).getMeldungen()); ((ProduktbausteinType) erg).getAttribute().addAll( - ((APrioriProduktbausteinType) produkt.getValue()).getAttribute()); + ((APrioriProduktbausteinType) produkt.getValue().getProdukt()).getAttribute()); ((ProduktbausteinType) erg).setMinVorkommen( - ((APrioriProduktbausteinType) produkt.getValue()).getMinOccurrences()); + ((APrioriProduktbausteinType) produkt.getValue().getProdukt()).getMinOccurrences()); ((ProduktbausteinType) erg).setMaxVorkommen( - ((APrioriProduktbausteinType) produkt.getValue()).getMaxOccurrences()); + ((APrioriProduktbausteinType) produkt.getValue().getProdukt()).getMaxOccurrences()); ((ProduktbausteinType) erg).setTyp( - ((APrioriProduktbausteinType) produkt.getValue()).getType()); + ((APrioriProduktbausteinType) produkt.getValue().getProdukt()).getType()); + if (((APrioriProduktbausteinType) produkt.getValue().getProdukt()).getRisikoobjektType() != null) { + ((ProduktbausteinType) erg).setRisikoobjektErforderlich(true); + } - for (int i = 0; i < ((APrioriProduktbausteinType) produkt.getValue()).getBausteine().size(); i++) { + for (int i = 0; i < ((APrioriProduktbausteinType) produkt.getValue().getProdukt()).getBausteine().size(); i++) { ((ProduktbausteinType) erg).getBausteine().add((ProduktbausteinType) aprioriItemToCalcItem( - new TreeItem<>(((APrioriProduktbausteinType) produkt.getValue()) - .getBausteine().get(i))).getValue()); + new TreeItem<>(new GuiProdukt(((APrioriProduktbausteinType) produkt.getValue().getProdukt()) + .getBausteine().get(i)))).getValue().getProdukt()); } for (int i = 0; i < produkt.getChildren().size(); i++) { @@ -157,51 +155,82 @@ public class TreeHelper { } } else { throw new Exception("Objekt kann nicht erzeugt werden. Unbekannte Klasse " - + ((APrioriProduktbausteinType) produkt.getValue()).getType()); + + ((APrioriProduktbausteinType) produkt.getValue().getProdukt()).getType()); } - ergItem.setValue(erg); + ergItem.setValue(new GuiProdukt(erg)); return ergItem; } - public TreeItem addAprioriToCalc(TreeItem calcItem, TreeItem aprioriItem) - throws InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException { - for (TreeItem aprioriChild : aprioriItem.getChildren()) { - boolean isInCalc = false; - int i = 0; - for (TreeItem calcChild : calcItem.getChildren()) { - if (((ProduktbausteinType) calcChild.getValue()).getId().equals(((ProduktbausteinType) aprioriChild.getValue()).getId()) || isNotIncluded.contains(calcChild)) { - isInCalc = true; - if (!aprioriChild.getChildren().isEmpty()) { - calcChild = addAprioriToCalc(calcChild, aprioriChild); - calcItem.getChildren().set(i, calcChild); - } - } - i++; - } - if (!isInCalc) { - TreeItem missingCalcItem = cloneTreeItem(aprioriChild); - calcItem.getChildren().add(missingCalcItem); - if (!isNotIncluded.contains(missingCalcItem)) { - isNotIncluded.add(missingCalcItem); +// public TreeItem addAprioriToCalc(TreeItem calcItem, TreeItem aprioriItem) { +// for (TreeItem aprioriChild : aprioriItem.getChildren()) { +// boolean isInCalc = false; +// int i = 0; +// for (TreeItem 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 missingCalcItem = cloneTreeItem(aprioriChild); +// calcItem.getChildren().add(missingCalcItem); +// missingCalcItem.getValue().setNotIncluded(true); +// } +// } +// return calcItem; +// } + + public TreeItem addAprioriToCalc(TreeItem calcItem, TreeItem aprioriItem) { + + for (TreeItem aprioriChild : aprioriItem.getChildren()) { + ProduktbausteinType aprioriProd = (ProduktbausteinType) aprioriChild.getValue().getProdukt(); + String aprioriId = aprioriProd.getId(); + + TreeItem 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); } + } else { + TreeItem cloned = cloneTreeItem(aprioriChild); + cloned.getValue().setNotIncluded(true); + + calcItem.getChildren().add(cloned); } } + return calcItem; } - public TreeItem sortTree(TreeItem parent) { - FXCollections.sort(parent.getChildren(), Comparator.comparing( - item -> ((ProduktbausteinType) item.getValue()).getBezeichnung().toLowerCase() - )); - - for (TreeItem child : parent.getChildren()) { - sortTree(child); - } + public TreeItem sortTree(TreeItem parent) { +// FXCollections.sort(parent.getChildren(), Comparator.comparing( +// item -> ((ProduktbausteinType)((TreeItem)item).getValue().getProdukt()).getBezeichnung() +// )); +// +// Comparator> 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 child : parent.getChildren()) { +// sortTree(child); +// } return parent; } - - private String itemPfad(TreeItem item) { - if (item.getParent() == null) return ((ProduktbausteinType)item.getValue()).getId(); - return itemPfad(item.getParent()) + "/" + ((ProduktbausteinType)item.getValue()).getId(); - } } diff --git a/OMDSServiceDefinition/src/main/java/at/vvo/omds/client/gui/api/apriori/AprioriAuskunftService.java b/OMDSServiceDefinition/src/main/java/at/vvo/omds/client/gui/api/apriori/AprioriAuskunftService.java index f600aabf..c33178e7 100644 --- a/OMDSServiceDefinition/src/main/java/at/vvo/omds/client/gui/api/apriori/AprioriAuskunftService.java +++ b/OMDSServiceDefinition/src/main/java/at/vvo/omds/client/gui/api/apriori/AprioriAuskunftService.java @@ -1,13 +1,18 @@ package at.vvo.omds.client.gui.api.apriori; +import at.vvo.omds.client.gui.Plausi; +import at.vvo.omds.client.gui.RDFHelper; import at.vvo.omds.client.gui.api.SOAPConnector; +import at.vvo.omds.types.omds3.r2025_05.common.APrioriVerkaufsproduktType; import at.vvo.omds.types.omds3.r2025_05.common.ProductsRequest; import at.vvo.omds.types.omds3.r2025_05.common.ProductsResponse; import jakarta.xml.bind.JAXBElement; +import javafx.util.Pair; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.xml.datatype.XMLGregorianCalendar; +import java.util.List; public class AprioriAuskunftService { @@ -34,4 +39,16 @@ public class AprioriAuskunftService { return response; } + + public Pair, List> aprioriRDFAuskunft(XMLGregorianCalendar stichtag, String vuNr) throws Exception { + JAXBElement r = BuildProductsRequest.aprioriRequest(stichtag, vuNr); + + RDFHelper rdfHelper = new RDFHelper(); + Pair, List> response = rdfHelper.getAprioriRDF(r); + + log.info("Got Response As below ========= : "); + log.info("Status : {}", response.getKey().getFirst().getName()); + + return response; + } } diff --git a/OMDSServiceDefinition/src/main/java/at/vvo/omds/client/gui/api/calc/BuildCalculateRequestAuskunft.java b/OMDSServiceDefinition/src/main/java/at/vvo/omds/client/gui/api/calc/BuildCalculateRequestAuskunft.java index be3a1ea0..2dd02307 100644 --- a/OMDSServiceDefinition/src/main/java/at/vvo/omds/client/gui/api/calc/BuildCalculateRequestAuskunft.java +++ b/OMDSServiceDefinition/src/main/java/at/vvo/omds/client/gui/api/calc/BuildCalculateRequestAuskunft.java @@ -1,14 +1,20 @@ package at.vvo.omds.client.gui.api.calc; +import at.vvo.omds.client.gui.GuiProdukt; import at.vvo.omds.client.gui.ObjectFactoryFactory; +import at.vvo.omds.client.gui.RDFHelper; import at.vvo.omds.types.omds3.r2025_05.common.*; import at.vvo.omds.types.omds3.r2025_05.on2antrag.common.*; import jakarta.xml.bind.JAXBElement; import javafx.scene.control.TreeItem; import javafx.scene.control.TreeView; +import org.eclipse.rdf4j.model.Model; +import org.eclipse.rdf4j.rio.RDFFormat; +import org.eclipse.rdf4j.rio.Rio; import javax.xml.datatype.XMLGregorianCalendar; import javax.xml.namespace.QName; +import java.io.ByteArrayOutputStream; public class BuildCalculateRequestAuskunft { private static final at.vvo.omds.types.omds3.r2025_05.on2antrag.common.ObjectFactory OUOF = @@ -16,11 +22,11 @@ public class BuildCalculateRequestAuskunft { private BuildCalculateRequestAuskunft(){} - static public JAXBElement buildRequestFromTreeView(TreeView treeView, XMLGregorianCalendar vtBeg) { + static public JAXBElement buildRequestFromTreeView(TreeView treeView, XMLGregorianCalendar vtBeg) { CalculateRequest request = OUOF.createCalculateRequest(); VerkaufsproduktType verkaufsprodukt = TreeViewToVerkaufsprodukt(treeView, vtBeg); verkaufsprodukt.setVtgBeg(vtBeg); - verkaufsprodukt.setTyp(((ProduktbausteinType)treeView.getRoot().getValue()).getTyp()); + verkaufsprodukt.setTyp(((ProduktbausteinType)treeView.getRoot().getValue().getProdukt()).getTyp()); SpezBerechnungGenType berechnungsanfrage = new SpezBerechnungGenType(); berechnungsanfrage.setVerkaufsprodukt(verkaufsprodukt); @@ -31,28 +37,43 @@ public class BuildCalculateRequestAuskunft { return createCalculateRequest(request); } + static public String buildRDFRequestFromTreeView(TreeView 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))); + + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + Rio.write(requestModel, baos, RDFFormat.JSONLD); + + return baos.toString(); + } + public static JAXBElement createCalculateRequest(CalculateRequest value) { return new JAXBElement<>(new QName("urn:at.vvo.omds.types.omds3types.v1-3-0.on2antrag.common","CalculateRequest"), CalculateRequest.class, null, value); } - public static ProduktbausteinType TreeItemToBaustein(TreeItem treeItem) { + public static ProduktbausteinType TreeItemToBaustein(TreeItem treeItem) { ProduktbausteinType baustein = (ProduktbausteinType) new ObjectFactoryFactory().create( - ((ProduktbausteinType)treeItem.getValue()).getTyp()); + ((ProduktbausteinType)treeItem.getValue().getProdukt()).getTyp()); - baustein.setBezeichnung(((ProduktbausteinType)treeItem.getValue()).getBezeichnung()); - baustein.setId(((ProduktbausteinType)treeItem.getValue()).getId()); - baustein.setVerkaufsoffenVon(((ProduktbausteinType)treeItem.getValue()).getVerkaufsoffenVon()); - baustein.setVerkaufsoffenBis(((ProduktbausteinType)treeItem.getValue()).getVerkaufsoffenBis()); - baustein.getAttribute().addAll(((ProduktbausteinType)treeItem.getValue()).getAttribute()); - baustein.setTyp(((ProduktbausteinType)treeItem.getValue()).getTyp()); - baustein.setMinVorkommen(((ProduktbausteinType)treeItem.getValue()).getMinVorkommen()); - baustein.setMaxVorkommen(((ProduktbausteinType)treeItem.getValue()).getMaxVorkommen()); + baustein.setBezeichnung(((ProduktbausteinType)treeItem.getValue().getProdukt()).getBezeichnung()); + baustein.setId(((ProduktbausteinType)treeItem.getValue().getProdukt()).getId()); + baustein.setVerkaufsoffenVon(((ProduktbausteinType)treeItem.getValue().getProdukt()).getVerkaufsoffenVon()); + baustein.setVerkaufsoffenBis(((ProduktbausteinType)treeItem.getValue().getProdukt()).getVerkaufsoffenBis()); + baustein.getAttribute().addAll(((ProduktbausteinType)treeItem.getValue().getProdukt()).getAttribute()); + baustein.setTyp(((ProduktbausteinType)treeItem.getValue().getProdukt()).getTyp()); + baustein.setMinVorkommen(((ProduktbausteinType)treeItem.getValue().getProdukt()).getMinVorkommen()); + baustein.setMaxVorkommen(((ProduktbausteinType)treeItem.getValue().getProdukt()).getMaxVorkommen()); return baustein; } - public static VerkaufsproduktType TreeViewToVerkaufsprodukt(TreeView treeView, XMLGregorianCalendar vtBeg) { + public static VerkaufsproduktType TreeViewToVerkaufsprodukt(TreeView treeView, XMLGregorianCalendar vtBeg) { VerkaufsproduktType verkaufsprodukt = (VerkaufsproduktType) TreeItemToBaustein(treeView.getRoot()); verkaufsprodukt.setVtgBeg(vtBeg); @@ -65,7 +86,7 @@ public class BuildCalculateRequestAuskunft { return verkaufsprodukt; } - public static ProduktbausteinType addUpFromTreeItem(TreeItem treeItem) { + public static ProduktbausteinType addUpFromTreeItem(TreeItem treeItem) { ProduktbausteinType baustein = (ProduktbausteinType) TreeItemToBaustein(treeItem); if (!treeItem.getChildren().isEmpty()) { diff --git a/OMDSServiceDefinition/src/main/java/at/vvo/omds/client/gui/api/calc/CalculateRequestAuskunftService.java b/OMDSServiceDefinition/src/main/java/at/vvo/omds/client/gui/api/calc/CalculateRequestAuskunftService.java index b9fe9e69..aebc65dc 100644 --- a/OMDSServiceDefinition/src/main/java/at/vvo/omds/client/gui/api/calc/CalculateRequestAuskunftService.java +++ b/OMDSServiceDefinition/src/main/java/at/vvo/omds/client/gui/api/calc/CalculateRequestAuskunftService.java @@ -1,6 +1,9 @@ package at.vvo.omds.client.gui.api.calc; +import at.vvo.omds.client.gui.GuiProdukt; +import at.vvo.omds.client.gui.RDFHelper; import at.vvo.omds.client.gui.api.SOAPConnector; +import at.vvo.omds.types.omds3.r2025_05.common.VerkaufsproduktType; import at.vvo.omds.types.omds3.r2025_05.on2antrag.common.CalculateRequest; import at.vvo.omds.types.omds3.r2025_05.on2antrag.common.CalculateResponse; import jakarta.xml.bind.JAXBElement; @@ -21,7 +24,7 @@ public class CalculateRequestAuskunftService { this.soapConnector = soapConnector; } - public CalculateResponse aprioriAuskunft(TreeView treeView, XMLGregorianCalendar vtBeg) throws Exception { + public CalculateResponse calculateAuskunft(TreeView treeView, XMLGregorianCalendar vtBeg) throws Exception { String token = ""; JAXBElement r = BuildCalculateRequestAuskunft.buildRequestFromTreeView(treeView, vtBeg); @@ -35,4 +38,18 @@ public class CalculateRequestAuskunftService { return response; } + + public VerkaufsproduktType calculateRDFAuskunft(TreeView treeView, XMLGregorianCalendar vtBeg) throws Exception { + + 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 ========= : "); + log.info("Status : {}", response.getBezeichnung()); + + return response; + } } diff --git a/OMDSServiceDefinition/src/main/resources/def/r2025_27/binding.xjb b/OMDSServiceDefinition/src/main/resources/def/r2025_27/binding.xjb index 85be8dae..21b85cfd 100644 --- a/OMDSServiceDefinition/src/main/resources/def/r2025_27/binding.xjb +++ b/OMDSServiceDefinition/src/main/resources/def/r2025_27/binding.xjb @@ -6,9 +6,9 @@ xmlns:annox="urn:jaxb.jvnet.org:annox" xmlns:inheritance="urn:jaxb.jvnet.org:plugin:inheritance" xsi:schemaLocation="https://jakarta.ee/xml/ns/jaxb https://jakarta.ee/xml/ns/jaxb/bindingschema_3_0.xsd" - jaxb:extensionBindingPrefixes="xjc annox" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" version="3.0"> + jaxb:extensionBindingPrefixes="xjc annox" @@ -606,7 +606,7 @@ - + diff --git a/OMDSServiceDefinition/src/main/resources/def/r2025_27/omds3CommonServiceTypes.xsd b/OMDSServiceDefinition/src/main/resources/def/r2025_27/omds3CommonServiceTypes.xsd index 7f07ed66..a1f1a192 100644 --- a/OMDSServiceDefinition/src/main/resources/def/r2025_27/omds3CommonServiceTypes.xsd +++ b/OMDSServiceDefinition/src/main/resources/def/r2025_27/omds3CommonServiceTypes.xsd @@ -1721,12 +1721,14 @@ + Verkaufsoffen von Verkaufsoffen bis + @@ -3254,7 +3256,7 @@ Basisklasse für alle Fahrzeuge in der Kfz-Versicherung - + @@ -5062,6 +5064,7 @@ + Es gibt zwei Implementierungen für a priori: Verkaufsprodukt und Unterbaustein