From 35c743396a0216b29da1b3f152fc56d02e831380 Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Mon, 2 Dec 2024 13:04:44 +0000 Subject: [PATCH 01/12] Raise project to 12.0.0-SNAPSHOT --- sbb-connector-demo/.classpath | 7 +- sbb-connector-demo/.project | 102 +++++++++--------- sbb-connector-demo/.settings/.jsdtscope | 12 --- .../.settings/ch.ivyteam.ivy.designer.prefs | 11 +- .../.settings/org.eclipse.jdt.core.prefs | 6 +- .../org.eclipse.wst.common.component | 21 ++-- ....eclipse.wst.common.project.facet.core.xml | 14 ++- ...rg.eclipse.wst.jsdt.ui.superType.container | 1 - .../org.eclipse.wst.jsdt.ui.superType.name | 1 - sbb-connector-demo/config/variables.yaml | 3 +- .../connector/sbb/demo/BookTripData.d.json | 17 +++ .../connector/sbb/demo/BookTripData.ivyClass | 8 -- .../axonivy/connector/sbb/demo/Data.d.json | 6 ++ .../axonivy/connector/sbb/demo/Data.ivyClass | 2 - .../sbb/demo/trip/SegmentForDisplay.d.json | 32 ++++++ .../sbb/demo/trip/SegmentForDisplay.ivyClass | 17 --- .../sbb/demo/trip/StopFromForDisplay.d.json | 42 ++++++++ .../sbb/demo/trip/StopFromForDisplay.ivyClass | 23 ---- .../sbb/demo/trip/StopToForDisplay.d.json | 42 ++++++++ .../sbb/demo/trip/StopToForDisplay.ivyClass | 23 ---- .../sbb/demo/trip/TripForDisplay.d.json | 52 +++++++++ .../sbb/demo/trip/TripForDisplay.ivyClass | 29 ----- sbb-connector-demo/processes/BookTrip.p.json | 68 ++++++------ .../InputTripSearchData.rddescriptor | 7 -- .../InputTripSearchDataData.d.json | 52 +++++++++ .../InputTripSearchDataData.ivyClass | 29 ----- .../InputTripSearchDataProcess.p.json | 96 ++++++++++------- .../sbb/demo/ShowTrips/ShowTrips.rddescriptor | 7 -- .../sbb/demo/ShowTrips/ShowTripsData.d.json | 17 +++ .../sbb/demo/ShowTrips/ShowTripsData.ivyClass | 8 -- .../demo/ShowTrips/ShowTripsProcess.p.json | 18 ++-- sbb-connector-test/.classpath | 7 +- sbb-connector-test/.project | 102 +++++++++--------- sbb-connector-test/.settings/.jsdtscope | 12 --- .../.settings/ch.ivyteam.ivy.designer.prefs | 11 +- .../.settings/org.eclipse.jdt.core.prefs | 6 +- .../org.eclipse.wst.common.component | 21 ++-- ....eclipse.wst.common.project.facet.core.xml | 14 ++- ...rg.eclipse.wst.jsdt.ui.superType.container | 1 - .../org.eclipse.wst.jsdt.ui.superType.name | 1 - sbb-connector-test/config/variables.yaml | 3 +- .../axonivy/connector/sbb/test/Data.d.json | 6 ++ .../axonivy/connector/sbb/test/Data.ivyClass | 2 - sbb-connector-webtest/.classpath | 7 +- sbb-connector-webtest/.project | 102 +++++++++--------- sbb-connector-webtest/.settings/.jsdtscope | 12 --- .../.settings/ch.ivyteam.ivy.designer.prefs | 11 +- .../.settings/org.eclipse.jdt.core.prefs | 6 +- .../org.eclipse.wst.common.component | 21 ++-- ....eclipse.wst.common.project.facet.core.xml | 14 ++- ...rg.eclipse.wst.jsdt.ui.superType.container | 1 - .../org.eclipse.wst.jsdt.ui.superType.name | 1 - sbb-connector-webtest/config/variables.yaml | 1 + .../axonivy/connector/sbb/webtest/Data.d.json | 6 ++ .../connector/sbb/webtest/Data.ivyClass | 2 - sbb-connector/.classpath | 7 +- sbb-connector/.project | 102 +++++++++--------- sbb-connector/.settings/.jsdtscope | 12 --- .../.settings/ch.ivyteam.ivy.designer.prefs | 11 +- .../.settings/org.eclipse.jdt.core.prefs | 6 +- .../org.eclipse.wst.common.component | 21 ++-- ....eclipse.wst.common.project.facet.core.xml | 14 ++- ...rg.eclipse.wst.jsdt.ui.superType.container | 1 - .../org.eclipse.wst.jsdt.ui.superType.name | 1 - sbb-connector/config/variables.yaml | 3 +- .../com/axonivy/connector/sbb/Data.d.json | 6 ++ .../com/axonivy/connector/sbb/Data.ivyClass | 2 - .../sbb/location/GetLocationsData.d.json | 17 +++ .../sbb/location/GetLocationsData.ivyClass | 8 -- .../location/GetLocationsDataHeaders.d.json | 17 +++ .../location/GetLocationsDataHeaders.ivyClass | 8 -- .../sbb/location/GetLocationsDataIn.d.json | 15 +++ .../sbb/location/GetLocationsDataIn.ivyClass | 6 -- .../GetLocationsDataParameters.d.json | 12 +++ .../GetLocationsDataParameters.ivyClass | 5 - .../connector/sbb/trip/GetTripsData.d.json | 17 +++ .../connector/sbb/trip/GetTripsData.ivyClass | 8 -- .../sbb/trip/GetTripsDataHeaders.d.json | 22 ++++ .../sbb/trip/GetTripsDataHeaders.ivyClass | 11 -- .../connector/sbb/trip/GetTripsDataIn.d.json | 15 +++ .../sbb/trip/GetTripsDataIn.ivyClass | 6 -- .../sbb/trip/GetTripsDataParameters.d.json | 62 +++++++++++ .../sbb/trip/GetTripsDataParameters.ivyClass | 35 ------ sbb-connector/processes/GetLocations.p.json | 57 +++++----- sbb-connector/processes/GetTrips.p.json | 79 ++++++++------ 85 files changed, 954 insertions(+), 775 deletions(-) delete mode 100644 sbb-connector-demo/.settings/.jsdtscope delete mode 100644 sbb-connector-demo/.settings/org.eclipse.wst.jsdt.ui.superType.container delete mode 100644 sbb-connector-demo/.settings/org.eclipse.wst.jsdt.ui.superType.name create mode 100644 sbb-connector-demo/dataclasses/com/axonivy/connector/sbb/demo/BookTripData.d.json delete mode 100644 sbb-connector-demo/dataclasses/com/axonivy/connector/sbb/demo/BookTripData.ivyClass create mode 100644 sbb-connector-demo/dataclasses/com/axonivy/connector/sbb/demo/Data.d.json delete mode 100644 sbb-connector-demo/dataclasses/com/axonivy/connector/sbb/demo/Data.ivyClass create mode 100644 sbb-connector-demo/dataclasses/com/axonivy/connector/sbb/demo/trip/SegmentForDisplay.d.json delete mode 100644 sbb-connector-demo/dataclasses/com/axonivy/connector/sbb/demo/trip/SegmentForDisplay.ivyClass create mode 100644 sbb-connector-demo/dataclasses/com/axonivy/connector/sbb/demo/trip/StopFromForDisplay.d.json delete mode 100644 sbb-connector-demo/dataclasses/com/axonivy/connector/sbb/demo/trip/StopFromForDisplay.ivyClass create mode 100644 sbb-connector-demo/dataclasses/com/axonivy/connector/sbb/demo/trip/StopToForDisplay.d.json delete mode 100644 sbb-connector-demo/dataclasses/com/axonivy/connector/sbb/demo/trip/StopToForDisplay.ivyClass create mode 100644 sbb-connector-demo/dataclasses/com/axonivy/connector/sbb/demo/trip/TripForDisplay.d.json delete mode 100644 sbb-connector-demo/dataclasses/com/axonivy/connector/sbb/demo/trip/TripForDisplay.ivyClass delete mode 100644 sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/InputTripSearchData/InputTripSearchData.rddescriptor create mode 100644 sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/InputTripSearchData/InputTripSearchDataData.d.json delete mode 100644 sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/InputTripSearchData/InputTripSearchDataData.ivyClass delete mode 100644 sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/ShowTrips/ShowTrips.rddescriptor create mode 100644 sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/ShowTrips/ShowTripsData.d.json delete mode 100644 sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/ShowTrips/ShowTripsData.ivyClass delete mode 100644 sbb-connector-test/.settings/.jsdtscope delete mode 100644 sbb-connector-test/.settings/org.eclipse.wst.jsdt.ui.superType.container delete mode 100644 sbb-connector-test/.settings/org.eclipse.wst.jsdt.ui.superType.name create mode 100644 sbb-connector-test/dataclasses/com/axonivy/connector/sbb/test/Data.d.json delete mode 100644 sbb-connector-test/dataclasses/com/axonivy/connector/sbb/test/Data.ivyClass delete mode 100644 sbb-connector-webtest/.settings/.jsdtscope delete mode 100644 sbb-connector-webtest/.settings/org.eclipse.wst.jsdt.ui.superType.container delete mode 100644 sbb-connector-webtest/.settings/org.eclipse.wst.jsdt.ui.superType.name create mode 100644 sbb-connector-webtest/dataclasses/com/axonivy/connector/sbb/webtest/Data.d.json delete mode 100644 sbb-connector-webtest/dataclasses/com/axonivy/connector/sbb/webtest/Data.ivyClass delete mode 100644 sbb-connector/.settings/.jsdtscope delete mode 100644 sbb-connector/.settings/org.eclipse.wst.jsdt.ui.superType.container delete mode 100644 sbb-connector/.settings/org.eclipse.wst.jsdt.ui.superType.name create mode 100644 sbb-connector/dataclasses/com/axonivy/connector/sbb/Data.d.json delete mode 100644 sbb-connector/dataclasses/com/axonivy/connector/sbb/Data.ivyClass create mode 100644 sbb-connector/dataclasses/com/axonivy/connector/sbb/location/GetLocationsData.d.json delete mode 100644 sbb-connector/dataclasses/com/axonivy/connector/sbb/location/GetLocationsData.ivyClass create mode 100644 sbb-connector/dataclasses/com/axonivy/connector/sbb/location/GetLocationsDataHeaders.d.json delete mode 100644 sbb-connector/dataclasses/com/axonivy/connector/sbb/location/GetLocationsDataHeaders.ivyClass create mode 100644 sbb-connector/dataclasses/com/axonivy/connector/sbb/location/GetLocationsDataIn.d.json delete mode 100644 sbb-connector/dataclasses/com/axonivy/connector/sbb/location/GetLocationsDataIn.ivyClass create mode 100644 sbb-connector/dataclasses/com/axonivy/connector/sbb/location/GetLocationsDataParameters.d.json delete mode 100644 sbb-connector/dataclasses/com/axonivy/connector/sbb/location/GetLocationsDataParameters.ivyClass create mode 100644 sbb-connector/dataclasses/com/axonivy/connector/sbb/trip/GetTripsData.d.json delete mode 100644 sbb-connector/dataclasses/com/axonivy/connector/sbb/trip/GetTripsData.ivyClass create mode 100644 sbb-connector/dataclasses/com/axonivy/connector/sbb/trip/GetTripsDataHeaders.d.json delete mode 100644 sbb-connector/dataclasses/com/axonivy/connector/sbb/trip/GetTripsDataHeaders.ivyClass create mode 100644 sbb-connector/dataclasses/com/axonivy/connector/sbb/trip/GetTripsDataIn.d.json delete mode 100644 sbb-connector/dataclasses/com/axonivy/connector/sbb/trip/GetTripsDataIn.ivyClass create mode 100644 sbb-connector/dataclasses/com/axonivy/connector/sbb/trip/GetTripsDataParameters.d.json delete mode 100644 sbb-connector/dataclasses/com/axonivy/connector/sbb/trip/GetTripsDataParameters.ivyClass diff --git a/sbb-connector-demo/.classpath b/sbb-connector-demo/.classpath index aa20b3e..9baacfb 100644 --- a/sbb-connector-demo/.classpath +++ b/sbb-connector-demo/.classpath @@ -5,12 +5,7 @@ - - - - - - + diff --git a/sbb-connector-demo/.project b/sbb-connector-demo/.project index 3e06396..9b7d755 100644 --- a/sbb-connector-demo/.project +++ b/sbb-connector-demo/.project @@ -1,49 +1,53 @@ - - - sbb-connector-demo - - - - - - ch.ivyteam.ivy.designer.dataClasses.ui.ivyDataClassBuilder - - - - - ch.ivyteam.ivy.designer.process.ui.ivyWebServiceProcessClassBuilder - - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.wst.common.project.facet.core.builder - - - - - ch.ivyteam.ivy.designer.ide.ivyModelValidationBuilder - - - - - org.eclipse.m2e.core.maven2Builder - - - - - - ch.ivyteam.ivy.project.IvyProjectNature - org.eclipse.wst.common.modulecore.ModuleCoreNature - org.eclipse.jem.workbench.JavaEMFNature - org.eclipse.jdt.core.javanature - org.eclipse.m2e.core.maven2Nature - org.eclipse.jem.beaninfo.BeanInfoNature - org.eclipse.wst.common.project.facet.core.nature - org.eclipse.wst.jsdt.core.jsNature - - + + + sbb-connector-demo + + + + + + ch.ivyteam.ivy.designer.dataClasses.ui.ivyDataClassBuilder + + + + + ch.ivyteam.ivy.designer.process.ui.ivyWebServiceProcessClassBuilder + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.wst.common.project.facet.core.builder + + + + + ch.ivyteam.ivy.dialog.form.build.ivyDialogFormBuilder + + + + + ch.ivyteam.ivy.designer.ide.ivyModelValidationBuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + ch.ivyteam.ivy.project.IvyProjectNature + org.eclipse.wst.common.modulecore.ModuleCoreNature + org.eclipse.jem.workbench.JavaEMFNature + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + org.eclipse.jem.beaninfo.BeanInfoNature + org.eclipse.wst.common.project.facet.core.nature + + \ No newline at end of file diff --git a/sbb-connector-demo/.settings/.jsdtscope b/sbb-connector-demo/.settings/.jsdtscope deleted file mode 100644 index cf5ec79..0000000 --- a/sbb-connector-demo/.settings/.jsdtscope +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/sbb-connector-demo/.settings/ch.ivyteam.ivy.designer.prefs b/sbb-connector-demo/.settings/ch.ivyteam.ivy.designer.prefs index 76ad318..f4d0770 100644 --- a/sbb-connector-demo/.settings/ch.ivyteam.ivy.designer.prefs +++ b/sbb-connector-demo/.settings/ch.ivyteam.ivy.designer.prefs @@ -1,6 +1,5 @@ -ch.ivyteam.ivy.designer.preferences.DataClassPreferencePage\:DEFAULT_DATA_CLASS=com.axonivy.connector.sbb.demo.Data -ch.ivyteam.ivy.designer.preferences.DataClassPreferencePage\:DEFAULT_NAMESPACE=com.axonivy.connector.sbb.demo -ch.ivyteam.ivy.designer.preferences.DataClassPreferencePage\:useProjectSettings=true -ch.ivyteam.ivy.project.preferences\:PRIMEFACES_VERSION=11 -ch.ivyteam.ivy.project.preferences\:PROJECT_VERSION=100000 -eclipse.preferences.version=1 +ch.ivyteam.ivy.designer.preferences.DataClassPreferencePage\:DEFAULT_NAMESPACE=com.axonivy.connector.sbb.demo +ch.ivyteam.ivy.designer.preferences.DataClassPreferencePage\:useProjectSettings=true +ch.ivyteam.ivy.project.preferences\:PRIMEFACES_VERSION=11 +ch.ivyteam.ivy.project.preferences\:PROJECT_VERSION=120001 +eclipse.preferences.version=1 \ No newline at end of file diff --git a/sbb-connector-demo/.settings/org.eclipse.jdt.core.prefs b/sbb-connector-demo/.settings/org.eclipse.jdt.core.prefs index f78f7f7..96641ff 100644 --- a/sbb-connector-demo/.settings/org.eclipse.jdt.core.prefs +++ b/sbb-connector-demo/.settings/org.eclipse.jdt.core.prefs @@ -1,10 +1,10 @@ eclipse.preferences.version=1 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=17 -org.eclipse.jdt.core.compiler.compliance=17 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=21 +org.eclipse.jdt.core.compiler.compliance=21 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled org.eclipse.jdt.core.compiler.problem.enumIdentifier=error org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning org.eclipse.jdt.core.compiler.release=enabled -org.eclipse.jdt.core.compiler.source=17 +org.eclipse.jdt.core.compiler.source=21 diff --git a/sbb-connector-demo/.settings/org.eclipse.wst.common.component b/sbb-connector-demo/.settings/org.eclipse.wst.common.component index 399510c..9fc69c0 100644 --- a/sbb-connector-demo/.settings/org.eclipse.wst.common.component +++ b/sbb-connector-demo/.settings/org.eclipse.wst.common.component @@ -1,11 +1,10 @@ - - - - - - - - - - - + + + + + + + + + + \ No newline at end of file diff --git a/sbb-connector-demo/.settings/org.eclipse.wst.common.project.facet.core.xml b/sbb-connector-demo/.settings/org.eclipse.wst.common.project.facet.core.xml index c2098f9..621b1f8 100644 --- a/sbb-connector-demo/.settings/org.eclipse.wst.common.project.facet.core.xml +++ b/sbb-connector-demo/.settings/org.eclipse.wst.common.project.facet.core.xml @@ -1,8 +1,6 @@ - - - - - - - - + + + + + + \ No newline at end of file diff --git a/sbb-connector-demo/.settings/org.eclipse.wst.jsdt.ui.superType.container b/sbb-connector-demo/.settings/org.eclipse.wst.jsdt.ui.superType.container deleted file mode 100644 index 3bd5d0a..0000000 --- a/sbb-connector-demo/.settings/org.eclipse.wst.jsdt.ui.superType.container +++ /dev/null @@ -1 +0,0 @@ -org.eclipse.wst.jsdt.launching.baseBrowserLibrary \ No newline at end of file diff --git a/sbb-connector-demo/.settings/org.eclipse.wst.jsdt.ui.superType.name b/sbb-connector-demo/.settings/org.eclipse.wst.jsdt.ui.superType.name deleted file mode 100644 index 05bd71b..0000000 --- a/sbb-connector-demo/.settings/org.eclipse.wst.jsdt.ui.superType.name +++ /dev/null @@ -1 +0,0 @@ -Window \ No newline at end of file diff --git a/sbb-connector-demo/config/variables.yaml b/sbb-connector-demo/config/variables.yaml index ca41237..3d0b275 100644 --- a/sbb-connector-demo/config/variables.yaml +++ b/sbb-connector-demo/config/variables.yaml @@ -1,3 +1,4 @@ +# yaml-language-server: $schema=https://json-schema.axonivy.com/app/12.0.0/variables.json Variables: sbbConnector: uri: https://b2p.app.sbb.ch @@ -5,4 +6,4 @@ Variables: clientId: DEMO clientSecret: DEMO tokenEndpoint: DEMO - scope: DEMO \ No newline at end of file + scope: DEMO diff --git a/sbb-connector-demo/dataclasses/com/axonivy/connector/sbb/demo/BookTripData.d.json b/sbb-connector-demo/dataclasses/com/axonivy/connector/sbb/demo/BookTripData.d.json new file mode 100644 index 0000000..dcc3384 --- /dev/null +++ b/sbb-connector-demo/dataclasses/com/axonivy/connector/sbb/demo/BookTripData.d.json @@ -0,0 +1,17 @@ +{ + "$schema" : "https://json-schema.axonivy.com/data-class/12.0.0/data-class.json", + "simpleName" : "BookTripData", + "namespace" : "com.axonivy.connector.sbb.demo", + "isBusinessCaseData" : false, + "fields" : [ { + "name" : "getTripsDataIn", + "type" : "com.axonivy.connector.sbb.trip.GetTripsDataIn", + "comment" : "Argument for subprocess GetTrips.", + "modifiers" : [ "PERSISTENT" ] + }, { + "name" : "trips", + "type" : "List", + "comment" : "Return value for subprocess GetTrips.", + "modifiers" : [ "PERSISTENT" ] + } ] +} \ No newline at end of file diff --git a/sbb-connector-demo/dataclasses/com/axonivy/connector/sbb/demo/BookTripData.ivyClass b/sbb-connector-demo/dataclasses/com/axonivy/connector/sbb/demo/BookTripData.ivyClass deleted file mode 100644 index e0730e8..0000000 --- a/sbb-connector-demo/dataclasses/com/axonivy/connector/sbb/demo/BookTripData.ivyClass +++ /dev/null @@ -1,8 +0,0 @@ -BookTripData #class -com.axonivy.connector.sbb.demo #namespace -getTripsDataIn com.axonivy.connector.sbb.trip.GetTripsDataIn #field -getTripsDataIn 'Argument for subprocess GetTrips.' #fieldComment -getTripsDataIn PERSISTENT #fieldModifier -trips List #field -trips 'Return value for subprocess GetTrips.' #fieldComment -trips PERSISTENT #fieldModifier diff --git a/sbb-connector-demo/dataclasses/com/axonivy/connector/sbb/demo/Data.d.json b/sbb-connector-demo/dataclasses/com/axonivy/connector/sbb/demo/Data.d.json new file mode 100644 index 0000000..96b5f2b --- /dev/null +++ b/sbb-connector-demo/dataclasses/com/axonivy/connector/sbb/demo/Data.d.json @@ -0,0 +1,6 @@ +{ + "$schema" : "https://json-schema.axonivy.com/data-class/12.0.0/data-class.json", + "simpleName" : "Data", + "namespace" : "com.axonivy.connector.sbb.demo", + "isBusinessCaseData" : false +} \ No newline at end of file diff --git a/sbb-connector-demo/dataclasses/com/axonivy/connector/sbb/demo/Data.ivyClass b/sbb-connector-demo/dataclasses/com/axonivy/connector/sbb/demo/Data.ivyClass deleted file mode 100644 index 5778a66..0000000 --- a/sbb-connector-demo/dataclasses/com/axonivy/connector/sbb/demo/Data.ivyClass +++ /dev/null @@ -1,2 +0,0 @@ -Data #class -com.axonivy.connector.sbb.demo #namespace diff --git a/sbb-connector-demo/dataclasses/com/axonivy/connector/sbb/demo/trip/SegmentForDisplay.d.json b/sbb-connector-demo/dataclasses/com/axonivy/connector/sbb/demo/trip/SegmentForDisplay.d.json new file mode 100644 index 0000000..c75c525 --- /dev/null +++ b/sbb-connector-demo/dataclasses/com/axonivy/connector/sbb/demo/trip/SegmentForDisplay.d.json @@ -0,0 +1,32 @@ +{ + "$schema" : "https://json-schema.axonivy.com/data-class/12.0.0/data-class.json", + "simpleName" : "SegmentForDisplay", + "namespace" : "com.axonivy.connector.sbb.demo.trip", + "isBusinessCaseData" : false, + "fields" : [ { + "name" : "iconClass", + "type" : "String", + "comment" : "Class of icon to represent segment.", + "modifiers" : [ "PERSISTENT" ] + }, { + "name" : "stopFrom", + "type" : "com.axonivy.connector.sbb.demo.trip.StopFromForDisplay", + "comment" : "First stop in segment.", + "modifiers" : [ "PERSISTENT" ] + }, { + "name" : "stopTo", + "type" : "com.axonivy.connector.sbb.demo.trip.StopToForDisplay", + "comment" : "Last stop in segment.", + "modifiers" : [ "PERSISTENT" ] + }, { + "name" : "transportProductName", + "type" : "String", + "comment" : "Operator specific name of vehicle.", + "modifiers" : [ "PERSISTENT" ] + }, { + "name" : "direction", + "type" : "String", + "comment" : "Last station of the associated transportProduct's journey.", + "modifiers" : [ "PERSISTENT" ] + } ] +} \ No newline at end of file diff --git a/sbb-connector-demo/dataclasses/com/axonivy/connector/sbb/demo/trip/SegmentForDisplay.ivyClass b/sbb-connector-demo/dataclasses/com/axonivy/connector/sbb/demo/trip/SegmentForDisplay.ivyClass deleted file mode 100644 index 4a5f5de..0000000 --- a/sbb-connector-demo/dataclasses/com/axonivy/connector/sbb/demo/trip/SegmentForDisplay.ivyClass +++ /dev/null @@ -1,17 +0,0 @@ -SegmentForDisplay #class -com.axonivy.connector.sbb.demo.trip #namespace -iconClass String #field -iconClass 'Class of icon to represent segment.' #fieldComment -iconClass PERSISTENT #fieldModifier -stopFrom com.axonivy.connector.sbb.demo.trip.StopFromForDisplay #field -stopFrom 'First stop in segment.' #fieldComment -stopFrom PERSISTENT #fieldModifier -stopTo com.axonivy.connector.sbb.demo.trip.StopToForDisplay #field -stopTo 'Last stop in segment.' #fieldComment -stopTo PERSISTENT #fieldModifier -transportProductName String #field -transportProductName 'Operator specific name of vehicle.' #fieldComment -transportProductName PERSISTENT #fieldModifier -direction String #field -direction 'Last station of the associated transportProduct''s journey.' #fieldComment -direction PERSISTENT #fieldModifier diff --git a/sbb-connector-demo/dataclasses/com/axonivy/connector/sbb/demo/trip/StopFromForDisplay.d.json b/sbb-connector-demo/dataclasses/com/axonivy/connector/sbb/demo/trip/StopFromForDisplay.d.json new file mode 100644 index 0000000..6defe9b --- /dev/null +++ b/sbb-connector-demo/dataclasses/com/axonivy/connector/sbb/demo/trip/StopFromForDisplay.d.json @@ -0,0 +1,42 @@ +{ + "$schema" : "https://json-schema.axonivy.com/data-class/12.0.0/data-class.json", + "simpleName" : "StopFromForDisplay", + "namespace" : "com.axonivy.connector.sbb.demo.trip", + "isBusinessCaseData" : false, + "fields" : [ { + "name" : "name", + "type" : "String", + "comment" : "Name of Stop.", + "modifiers" : [ "PERSISTENT" ] + }, { + "name" : "departureDateTime", + "type" : "java.time.OffsetDateTime", + "comment" : "Departure dateTime in realtime.", + "modifiers" : [ "PERSISTENT" ] + }, { + "name" : "departureDate", + "type" : "String", + "comment" : "Departure date in realtime parsed for displaying in user dialog.", + "modifiers" : [ "PERSISTENT" ] + }, { + "name" : "departureTime", + "type" : "String", + "comment" : "Departure time in realtime parsed for displaying in user dialog.", + "modifiers" : [ "PERSISTENT" ] + }, { + "name" : "departureDelay", + "type" : "String", + "comment" : "Departure delay in realtime parsed for displaying in user dialog.", + "modifiers" : [ "PERSISTENT" ] + }, { + "name" : "departurePlatform", + "type" : "String", + "comment" : "Departing platform in realtime.", + "modifiers" : [ "PERSISTENT" ] + }, { + "name" : "departurePlatformChanged", + "type" : "Boolean", + "comment" : "Flag to determine whether departurePlatform has changed in comparison to planned departurePlatform.", + "modifiers" : [ "PERSISTENT" ] + } ] +} \ No newline at end of file diff --git a/sbb-connector-demo/dataclasses/com/axonivy/connector/sbb/demo/trip/StopFromForDisplay.ivyClass b/sbb-connector-demo/dataclasses/com/axonivy/connector/sbb/demo/trip/StopFromForDisplay.ivyClass deleted file mode 100644 index 9fd611a..0000000 --- a/sbb-connector-demo/dataclasses/com/axonivy/connector/sbb/demo/trip/StopFromForDisplay.ivyClass +++ /dev/null @@ -1,23 +0,0 @@ -StopFromForDisplay #class -com.axonivy.connector.sbb.demo.trip #namespace -name String #field -name 'Name of Stop.' #fieldComment -name PERSISTENT #fieldModifier -departureDateTime java.time.OffsetDateTime #field -departureDateTime 'Departure dateTime in realtime.' #fieldComment -departureDateTime PERSISTENT #fieldModifier -departureDate String #field -departureDate 'Departure date in realtime parsed for displaying in user dialog.' #fieldComment -departureDate PERSISTENT #fieldModifier -departureTime String #field -departureTime 'Departure time in realtime parsed for displaying in user dialog.' #fieldComment -departureTime PERSISTENT #fieldModifier -departureDelay String #field -departureDelay 'Departure delay in realtime parsed for displaying in user dialog.' #fieldComment -departureDelay PERSISTENT #fieldModifier -departurePlatform String #field -departurePlatform 'Departing platform in realtime.' #fieldComment -departurePlatform PERSISTENT #fieldModifier -departurePlatformChanged Boolean #field -departurePlatformChanged 'Flag to determine whether departurePlatform has changed in comparison to planned departurePlatform.' #fieldComment -departurePlatformChanged PERSISTENT #fieldModifier diff --git a/sbb-connector-demo/dataclasses/com/axonivy/connector/sbb/demo/trip/StopToForDisplay.d.json b/sbb-connector-demo/dataclasses/com/axonivy/connector/sbb/demo/trip/StopToForDisplay.d.json new file mode 100644 index 0000000..44f2992 --- /dev/null +++ b/sbb-connector-demo/dataclasses/com/axonivy/connector/sbb/demo/trip/StopToForDisplay.d.json @@ -0,0 +1,42 @@ +{ + "$schema" : "https://json-schema.axonivy.com/data-class/12.0.0/data-class.json", + "simpleName" : "StopToForDisplay", + "namespace" : "com.axonivy.connector.sbb.demo.trip", + "isBusinessCaseData" : false, + "fields" : [ { + "name" : "name", + "type" : "String", + "comment" : "Name of Stop.", + "modifiers" : [ "PERSISTENT" ] + }, { + "name" : "arrivalDateTime", + "type" : "java.time.OffsetDateTime", + "comment" : "Arrival dateTime in realtime.", + "modifiers" : [ "PERSISTENT" ] + }, { + "name" : "arrivalDate", + "type" : "String", + "comment" : "Arrival date in realtime parsed for displaying in user dialog.", + "modifiers" : [ "PERSISTENT" ] + }, { + "name" : "arrivalTime", + "type" : "String", + "comment" : "Arrival time in realtime parsed for displaying in user dialog.", + "modifiers" : [ "PERSISTENT" ] + }, { + "name" : "arrivalDelay", + "type" : "String", + "comment" : "Arrival delay in realtime parsed for displaying in user dialog.", + "modifiers" : [ "PERSISTENT" ] + }, { + "name" : "arrivalPlatform", + "type" : "String", + "comment" : "Arrival platform in realtime.", + "modifiers" : [ "PERSISTENT" ] + }, { + "name" : "arrivalPlatformChanged", + "type" : "Boolean", + "comment" : "Flag to determine whether arrivalPlatform has changed in comparison to planned departurePlatform.", + "modifiers" : [ "PERSISTENT" ] + } ] +} \ No newline at end of file diff --git a/sbb-connector-demo/dataclasses/com/axonivy/connector/sbb/demo/trip/StopToForDisplay.ivyClass b/sbb-connector-demo/dataclasses/com/axonivy/connector/sbb/demo/trip/StopToForDisplay.ivyClass deleted file mode 100644 index 790cd5c..0000000 --- a/sbb-connector-demo/dataclasses/com/axonivy/connector/sbb/demo/trip/StopToForDisplay.ivyClass +++ /dev/null @@ -1,23 +0,0 @@ -StopToForDisplay #class -com.axonivy.connector.sbb.demo.trip #namespace -name String #field -name 'Name of Stop.' #fieldComment -name PERSISTENT #fieldModifier -arrivalDateTime java.time.OffsetDateTime #field -arrivalDateTime 'Arrival dateTime in realtime.' #fieldComment -arrivalDateTime PERSISTENT #fieldModifier -arrivalDate String #field -arrivalDate 'Arrival date in realtime parsed for displaying in user dialog.' #fieldComment -arrivalDate PERSISTENT #fieldModifier -arrivalTime String #field -arrivalTime 'Arrival time in realtime parsed for displaying in user dialog.' #fieldComment -arrivalTime PERSISTENT #fieldModifier -arrivalDelay String #field -arrivalDelay 'Arrival delay in realtime parsed for displaying in user dialog.' #fieldComment -arrivalDelay PERSISTENT #fieldModifier -arrivalPlatform String #field -arrivalPlatform 'Arrival platform in realtime.' #fieldComment -arrivalPlatform PERSISTENT #fieldModifier -arrivalPlatformChanged Boolean #field -arrivalPlatformChanged 'Flag to determine whether arrivalPlatform has changed in comparison to planned departurePlatform.' #fieldComment -arrivalPlatformChanged PERSISTENT #fieldModifier diff --git a/sbb-connector-demo/dataclasses/com/axonivy/connector/sbb/demo/trip/TripForDisplay.d.json b/sbb-connector-demo/dataclasses/com/axonivy/connector/sbb/demo/trip/TripForDisplay.d.json new file mode 100644 index 0000000..8028cb8 --- /dev/null +++ b/sbb-connector-demo/dataclasses/com/axonivy/connector/sbb/demo/trip/TripForDisplay.d.json @@ -0,0 +1,52 @@ +{ + "$schema" : "https://json-schema.axonivy.com/data-class/12.0.0/data-class.json", + "simpleName" : "TripForDisplay", + "namespace" : "com.axonivy.connector.sbb.demo.trip", + "isBusinessCaseData" : false, + "fields" : [ { + "name" : "onlineOffersLink", + "type" : "String", + "comment" : "Link to offers on website of SBB.", + "modifiers" : [ "PERSISTENT" ] + }, { + "name" : "segments", + "type" : "List", + "comment" : "The segments of the trip and its stops parsed for displaying in user dialog.", + "modifiers" : [ "PERSISTENT" ] + }, { + "name" : "departureDate", + "type" : "String", + "comment" : "Departure date in realtime parsed for displaying in user dialog.", + "modifiers" : [ "PERSISTENT" ] + }, { + "name" : "departureTime", + "type" : "String", + "comment" : "Departure time in realtime parsed for displaying in user dialog.", + "modifiers" : [ "PERSISTENT" ] + }, { + "name" : "departureDelay", + "type" : "String", + "comment" : "Departure delay in realtime parsed for displaying in user dialog.", + "modifiers" : [ "PERSISTENT" ] + }, { + "name" : "arrivalDate", + "type" : "String", + "comment" : "Arrival date in realtime parsed for displaying in user dialog.", + "modifiers" : [ "PERSISTENT" ] + }, { + "name" : "arrivalTime", + "type" : "String", + "comment" : "Arrival time in realtime parsed for displaying in user dialog.", + "modifiers" : [ "PERSISTENT" ] + }, { + "name" : "arrivalDelay", + "type" : "String", + "comment" : "Arrival delay in realtime parsed for displaying in user dialog.", + "modifiers" : [ "PERSISTENT" ] + }, { + "name" : "duration", + "type" : "String", + "comment" : "Duration of the trip in realtime parsed for displaying in user dialog.", + "modifiers" : [ "PERSISTENT" ] + } ] +} \ No newline at end of file diff --git a/sbb-connector-demo/dataclasses/com/axonivy/connector/sbb/demo/trip/TripForDisplay.ivyClass b/sbb-connector-demo/dataclasses/com/axonivy/connector/sbb/demo/trip/TripForDisplay.ivyClass deleted file mode 100644 index 4b0bbaf..0000000 --- a/sbb-connector-demo/dataclasses/com/axonivy/connector/sbb/demo/trip/TripForDisplay.ivyClass +++ /dev/null @@ -1,29 +0,0 @@ -TripForDisplay #class -com.axonivy.connector.sbb.demo.trip #namespace -onlineOffersLink String #field -onlineOffersLink 'Link to offers on website of SBB.' #fieldComment -onlineOffersLink PERSISTENT #fieldModifier -segments List #field -segments 'The segments of the trip and its stops parsed for displaying in user dialog.' #fieldComment -segments PERSISTENT #fieldModifier -departureDate String #field -departureDate 'Departure date in realtime parsed for displaying in user dialog.' #fieldComment -departureDate PERSISTENT #fieldModifier -departureTime String #field -departureTime 'Departure time in realtime parsed for displaying in user dialog.' #fieldComment -departureTime PERSISTENT #fieldModifier -departureDelay String #field -departureDelay 'Departure delay in realtime parsed for displaying in user dialog.' #fieldComment -departureDelay PERSISTENT #fieldModifier -arrivalDate String #field -arrivalDate 'Arrival date in realtime parsed for displaying in user dialog.' #fieldComment -arrivalDate PERSISTENT #fieldModifier -arrivalTime String #field -arrivalTime 'Arrival time in realtime parsed for displaying in user dialog.' #fieldComment -arrivalTime PERSISTENT #fieldModifier -arrivalDelay String #field -arrivalDelay 'Arrival delay in realtime parsed for displaying in user dialog.' #fieldComment -arrivalDelay PERSISTENT #fieldModifier -duration String #field -duration 'Duration of the trip in realtime parsed for displaying in user dialog.' #fieldComment -duration PERSISTENT #fieldModifier diff --git a/sbb-connector-demo/processes/BookTrip.p.json b/sbb-connector-demo/processes/BookTrip.p.json index 85eb57f..650dec0 100644 --- a/sbb-connector-demo/processes/BookTrip.p.json +++ b/sbb-connector-demo/processes/BookTrip.p.json @@ -1,5 +1,5 @@ { - "format" : "10.0.0", + "$schema" : "https://json-schema.axonivy.com/process/12.0.0/process.json", "id" : "189FEADF3244D108", "config" : { "data" : "com.axonivy.connector.sbb.demo.BookTripData" @@ -9,19 +9,22 @@ "type" : "RequestStart", "name" : "start.ivp", "config" : { - "callSignature" : "start", + "signature" : "start", "case" : { "customFields" : [ - { "name" : "conversationId", "type" : "String", "value" : "java.util.UUID.randomUUID().toString()" } + { "name" : "conversationId", "type" : "STRING", "value" : "java.util.UUID.randomUUID().toString()" } ] - }, - "outLink" : "start.ivp", - "tags" : "demo" + } }, + "tags" : [ + "demo" + ], "visual" : { "at" : { "x" : 96, "y" : 64 } }, - "connect" : { "id" : "f4", "to" : "f3" } + "connect" : [ + { "id" : "f4", "to" : "f3" } + ] }, { "id" : "f1", "type" : "TaskEnd", @@ -33,66 +36,59 @@ "type" : "DialogCall", "name" : "Input Trip Search Data", "config" : { - "dialogId" : "com.axonivy.connector.sbb.demo.InputTripSearchData", - "startMethod" : "start(com.axonivy.connector.sbb.trip.GetTripsDataIn)", - "output" : { - "map" : { - "out" : "in", - "out.getTripsDataIn" : "result.getTripsDataIn" - } - }, + "dialog" : "com.axonivy.connector.sbb.demo.InputTripSearchData:start(com.axonivy.connector.sbb.trip.GetTripsDataIn)", "call" : { - "params" : [ - { "name" : "getTripsDataIn", "type" : "com.axonivy.connector.sbb.trip.GetTripsDataIn" } - ], "map" : { "param.getTripsDataIn" : "in.getTripsDataIn", "param.getTripsDataIn.parameters.date" : "new Date()" } + }, + "output" : { + "map" : { + "out" : "in", + "out.getTripsDataIn" : "result.getTripsDataIn" + } } }, "visual" : { "at" : { "x" : 224, "y" : 64 } }, - "connect" : { "id" : "f6", "to" : "f5" } + "connect" : [ + { "id" : "f6", "to" : "f5" } + ] }, { "id" : "f5", "type" : "SubProcessCall", "name" : "Get Trips", "config" : { "processCall" : "GetTrips:call(com.axonivy.connector.sbb.trip.GetTripsDataIn)", - "output" : { - "map" : { - "out" : "in", - "out.trips" : "result.trips" - } - }, "call" : { - "params" : [ - { "name" : "in", "type" : "com.axonivy.connector.sbb.trip.GetTripsDataIn" } - ], "map" : { "param.in" : "in.getTripsDataIn", "param.in.parameters.includeAfter" : "5" } + }, + "output" : { + "map" : { + "out" : "in", + "out.trips" : "result.trips" + } } }, "visual" : { "at" : { "x" : 384, "y" : 64 }, "icon" : "res:/webContent/icons/sbb.png" }, - "connect" : { "id" : "f8", "to" : "f7" } + "connect" : [ + { "id" : "f8", "to" : "f7" } + ] }, { "id" : "f7", "type" : "DialogCall", "name" : "Show Trips", "config" : { - "dialogId" : "com.axonivy.connector.sbb.demo.ShowTrips", - "startMethod" : "start(List)", + "dialog" : "com.axonivy.connector.sbb.demo.ShowTrips:start(List)", "call" : { - "params" : [ - { "name" : "trips", "type" : "List" } - ], "map" : { "param.trips" : "in.trips" } @@ -101,6 +97,8 @@ "visual" : { "at" : { "x" : 544, "y" : 64 } }, - "connect" : { "id" : "f2", "to" : "f1" } + "connect" : [ + { "id" : "f2", "to" : "f1" } + ] } ] } \ No newline at end of file diff --git a/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/InputTripSearchData/InputTripSearchData.rddescriptor b/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/InputTripSearchData/InputTripSearchData.rddescriptor deleted file mode 100644 index ae605f0..0000000 --- a/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/InputTripSearchData/InputTripSearchData.rddescriptor +++ /dev/null @@ -1,7 +0,0 @@ - - - - viewTechnology - JSF - - diff --git a/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/InputTripSearchData/InputTripSearchDataData.d.json b/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/InputTripSearchData/InputTripSearchDataData.d.json new file mode 100644 index 0000000..5f4fafd --- /dev/null +++ b/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/InputTripSearchData/InputTripSearchDataData.d.json @@ -0,0 +1,52 @@ +{ + "$schema" : "https://json-schema.axonivy.com/data-class/12.0.0/data-class.json", + "simpleName" : "InputTripSearchDataData", + "namespace" : "com.axonivy.connector.sbb.demo.InputTripSearchData", + "isBusinessCaseData" : false, + "fields" : [ { + "name" : "getLocationsDataIn", + "type" : "com.axonivy.connector.sbb.location.GetLocationsDataIn", + "comment" : "Argument for subprocess GetLocations.", + "modifiers" : [ "PERSISTENT" ] + }, { + "name" : "locations", + "type" : "List", + "comment" : "Return value of subprocess GetLocations.", + "modifiers" : [ "PERSISTENT" ] + }, { + "name" : "locationNames", + "type" : "List", + "comment" : "List of Location names returned by subprocess GetLocations. Used for autocomplete dropdown menu of input fields From and To.", + "modifiers" : [ "PERSISTENT" ] + }, { + "name" : "locationFrom", + "type" : "ch.sbb.app.b2p.client.Location", + "comment" : "Selected Location from autocomplete dropdown menu of input field From.", + "modifiers" : [ "PERSISTENT" ] + }, { + "name" : "locationTo", + "type" : "ch.sbb.app.b2p.client.Location", + "comment" : "Selected Location from autocomplete dropdown menu of input field To.", + "modifiers" : [ "PERSISTENT" ] + }, { + "name" : "selectEvent", + "type" : "org.primefaces.event.SelectEvent", + "comment" : "Event triggered by selection of Location name in autocomplete dropdown menu to set locationFrom or locationTo.", + "modifiers" : [ "PERSISTENT" ] + }, { + "name" : "time", + "type" : "Time", + "comment" : "Content of input field Time.", + "modifiers" : [ "PERSISTENT" ] + }, { + "name" : "arrival", + "type" : "Boolean", + "comment" : "Flag to determine whether to search for earliest departure or latest arrival at given date and time. False: Earliest departure; True: Latest arrival", + "modifiers" : [ "PERSISTENT" ] + }, { + "name" : "getTripsDataIn", + "type" : "com.axonivy.connector.sbb.trip.GetTripsDataIn", + "comment" : "Argument for subprocess GetTrips.", + "modifiers" : [ "PERSISTENT" ] + } ] +} \ No newline at end of file diff --git a/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/InputTripSearchData/InputTripSearchDataData.ivyClass b/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/InputTripSearchData/InputTripSearchDataData.ivyClass deleted file mode 100644 index 1482216..0000000 --- a/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/InputTripSearchData/InputTripSearchDataData.ivyClass +++ /dev/null @@ -1,29 +0,0 @@ -InputTripSearchDataData #class -com.axonivy.connector.sbb.demo.InputTripSearchData #namespace -getLocationsDataIn com.axonivy.connector.sbb.location.GetLocationsDataIn #field -getLocationsDataIn 'Argument for subprocess GetLocations.' #fieldComment -getLocationsDataIn PERSISTENT #fieldModifier -locations List #field -locations 'Return value of subprocess GetLocations.' #fieldComment -locations PERSISTENT #fieldModifier -locationNames List #field -locationNames 'List of Location names returned by subprocess GetLocations. Used for autocomplete dropdown menu of input fields From and To.' #fieldComment -locationNames PERSISTENT #fieldModifier -locationFrom ch.sbb.app.b2p.client.Location #field -locationFrom 'Selected Location from autocomplete dropdown menu of input field From.' #fieldComment -locationFrom PERSISTENT #fieldModifier -locationTo ch.sbb.app.b2p.client.Location #field -locationTo 'Selected Location from autocomplete dropdown menu of input field To.' #fieldComment -locationTo PERSISTENT #fieldModifier -selectEvent org.primefaces.event.SelectEvent #field -selectEvent 'Event triggered by selection of Location name in autocomplete dropdown menu to set locationFrom or locationTo.' #fieldComment -selectEvent PERSISTENT #fieldModifier -time Time #field -time 'Content of input field Time.' #fieldComment -time PERSISTENT #fieldModifier -arrival Boolean #field -arrival 'Flag to determine whether to search for earliest departure or latest arrival at given date and time. False: Earliest departure; True: Latest arrival' #fieldComment -arrival PERSISTENT #fieldModifier -getTripsDataIn com.axonivy.connector.sbb.trip.GetTripsDataIn #field -getTripsDataIn 'Argument for subprocess GetTrips.' #fieldComment -getTripsDataIn PERSISTENT #fieldModifier diff --git a/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/InputTripSearchData/InputTripSearchDataProcess.p.json b/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/InputTripSearchData/InputTripSearchDataProcess.p.json index 9cef495..ddbbadb 100644 --- a/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/InputTripSearchData/InputTripSearchDataProcess.p.json +++ b/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/InputTripSearchData/InputTripSearchDataProcess.p.json @@ -1,5 +1,5 @@ { - "format" : "10.0.0", + "$schema" : "https://json-schema.axonivy.com/process/12.0.0/process.json", "id" : "18A1BFBC93F677AB", "kind" : "HTML_DIALOG", "config" : { @@ -10,18 +10,10 @@ "type" : "HtmlDialogStart", "name" : "start(GetTripsDataIn)", "config" : { - "callSignature" : "start", - "result" : { - "params" : [ - { "name" : "getTripsDataIn", "type" : "com.axonivy.connector.sbb.trip.GetTripsDataIn" } - ], - "map" : { - "result.getTripsDataIn" : "in.getTripsDataIn" - } - }, + "signature" : "start", "input" : { "params" : [ - { "name" : "getTripsDataIn", "type" : "com.axonivy.connector.sbb.trip.GetTripsDataIn" } + { "name" : "getTripsDataIn", "type" : "com.axonivy.connector.sbb.trip.GetTripsDataIn", "desc" : "" } ], "map" : { "out.getTripsDataIn" : "param.getTripsDataIn", @@ -30,12 +22,22 @@ "out.time" : "new Time()" } }, + "result" : { + "params" : [ + { "name" : "getTripsDataIn", "type" : "com.axonivy.connector.sbb.trip.GetTripsDataIn", "desc" : "" } + ], + "map" : { + "result.getTripsDataIn" : "in.getTripsDataIn" + } + }, "guid" : "189FE362F85F241B" }, "visual" : { "at" : { "x" : 96, "y" : 64 } }, - "connect" : { "id" : "f2", "to" : "f1" } + "connect" : [ + { "id" : "f2", "to" : "f1" } + ] }, { "id" : "f1", "type" : "HtmlDialogEnd", @@ -52,7 +54,9 @@ "visual" : { "at" : { "x" : 96, "y" : 160 } }, - "connect" : { "id" : "f6", "to" : "f8" } + "connect" : [ + { "id" : "f6", "to" : "f8" } + ] }, { "id" : "f4", "type" : "HtmlDialogExit", @@ -80,27 +84,29 @@ "visual" : { "at" : { "x" : 224, "y" : 160 } }, - "connect" : { "id" : "f5", "to" : "f4" } + "connect" : [ + { "id" : "f5", "to" : "f4" } + ] }, { "id" : "f14", "type" : "HtmlDialogMethodStart", "name" : "getLocations(String)", "config" : { - "callSignature" : "getLocations", - "result" : { + "signature" : "getLocations", + "input" : { "params" : [ - { "name" : "locationNames", "type" : "List" } + { "name" : "name", "type" : "String", "desc" : "" } ], "map" : { - "result.locationNames" : "in.locationNames" + "out.getLocationsDataIn.parameters.name" : "param.name" } }, - "input" : { + "result" : { "params" : [ - { "name" : "name", "type" : "String" } + { "name" : "locationNames", "type" : "List", "desc" : "" } ], "map" : { - "out.getLocationsDataIn.parameters.name" : "param.name" + "result.locationNames" : "in.locationNames" } }, "guid" : "189FE45FF14E72DE" @@ -114,7 +120,9 @@ "Used for autocomplete dropdown menu of input fields From and To." ] }, - "connect" : { "id" : "f16", "to" : "f15" } + "connect" : [ + { "id" : "f16", "to" : "f15" } + ] }, { "id" : "f15", "type" : "Alternative", @@ -123,6 +131,11 @@ "at least 1 non-whitespace", "character?" ], + "config" : { + "conditions" : { + "f18" : "!in.getLocationsDataIn.parameters.name.isBlank()" + } + }, "visual" : { "at" : { "x" : 224, "y" : 352 }, "labelOffset" : { "x" : 14, "y" : 34 } @@ -130,7 +143,7 @@ "connect" : [ { "id" : "f18", "to" : "f17", "label" : { "name" : "Yes" - }, "condition" : "!in.getLocationsDataIn.parameters.name.isBlank()" }, + } }, { "id" : "f24", "to" : "f23", "via" : [ { "x" : 224, "y" : 256 } ], "label" : { "name" : "No", "segment" : 1.14, @@ -143,18 +156,15 @@ "name" : "Get Locations", "config" : { "processCall" : "GetLocations:call(com.axonivy.connector.sbb.location.GetLocationsDataIn)", - "output" : { + "call" : { "map" : { - "out" : "in", - "out.locations" : "result.locations" + "param.in" : "in.getLocationsDataIn" } }, - "call" : { - "params" : [ - { "name" : "in", "type" : "com.axonivy.connector.sbb.location.GetLocationsDataIn" } - ], + "output" : { "map" : { - "param.in" : "in.getLocationsDataIn" + "out" : "in", + "out.locations" : "result.locations" } } }, @@ -162,7 +172,9 @@ "at" : { "x" : 416, "y" : 352 }, "icon" : "res:/webContent/icons/sbb.png" }, - "connect" : { "id" : "f20", "to" : "f19" } + "connect" : [ + { "id" : "f20", "to" : "f19" } + ] }, { "id" : "f19", "type" : "Script", @@ -187,7 +199,9 @@ "visual" : { "at" : { "x" : 608, "y" : 352 } }, - "connect" : { "id" : "f22", "to" : "f21" } + "connect" : [ + { "id" : "f22", "to" : "f21" } + ] }, { "id" : "f21", "type" : "HtmlDialogEnd", @@ -212,7 +226,9 @@ "visual" : { "at" : { "x" : 608, "y" : 256 } }, - "connect" : { "id" : "f25", "to" : "f21", "via" : [ { "x" : 800, "y" : 256 } ] } + "connect" : [ + { "id" : "f25", "to" : "f21", "via" : [ { "x" : 800, "y" : 256 } ] } + ] }, { "id" : "f26", "type" : "Script", @@ -244,16 +260,18 @@ "visual" : { "at" : { "x" : 416, "y" : 448 } }, - "connect" : { "id" : "f30", "to" : "f29" } + "connect" : [ + { "id" : "f30", "to" : "f29" } + ] }, { "id" : "f27", "type" : "HtmlDialogMethodStart", "name" : "updateLocation(SelectEvent)", "config" : { - "callSignature" : "updateLocation", + "signature" : "updateLocation", "input" : { "params" : [ - { "name" : "selectEvent", "type" : "org.primefaces.event.SelectEvent" } + { "name" : "selectEvent", "type" : "org.primefaces.event.SelectEvent", "desc" : "" } ], "map" : { "out.selectEvent" : "param.selectEvent" @@ -268,7 +286,9 @@ "Sets originId or destinationId of getTripsDataIn to id of selected Location." ] }, - "connect" : { "id" : "f28", "to" : "f26" } + "connect" : [ + { "id" : "f28", "to" : "f26" } + ] }, { "id" : "f29", "type" : "HtmlDialogEnd", diff --git a/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/ShowTrips/ShowTrips.rddescriptor b/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/ShowTrips/ShowTrips.rddescriptor deleted file mode 100644 index ae605f0..0000000 --- a/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/ShowTrips/ShowTrips.rddescriptor +++ /dev/null @@ -1,7 +0,0 @@ - - - - viewTechnology - JSF - - diff --git a/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/ShowTrips/ShowTripsData.d.json b/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/ShowTrips/ShowTripsData.d.json new file mode 100644 index 0000000..ce9c7c1 --- /dev/null +++ b/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/ShowTrips/ShowTripsData.d.json @@ -0,0 +1,17 @@ +{ + "$schema" : "https://json-schema.axonivy.com/data-class/12.0.0/data-class.json", + "simpleName" : "ShowTripsData", + "namespace" : "com.axonivy.connector.sbb.demo.ShowTrips", + "isBusinessCaseData" : false, + "fields" : [ { + "name" : "trips", + "type" : "List", + "comment" : "Trips as received from Swiss Mobility API.", + "modifiers" : [ "PERSISTENT" ] + }, { + "name" : "tripsForDisplay", + "type" : "List", + "comment" : "Trips parsed for displaying in user dialog.", + "modifiers" : [ "PERSISTENT" ] + } ] +} \ No newline at end of file diff --git a/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/ShowTrips/ShowTripsData.ivyClass b/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/ShowTrips/ShowTripsData.ivyClass deleted file mode 100644 index 1662574..0000000 --- a/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/ShowTrips/ShowTripsData.ivyClass +++ /dev/null @@ -1,8 +0,0 @@ -ShowTripsData #class -com.axonivy.connector.sbb.demo.ShowTrips #namespace -trips List #field -trips 'Trips as received from Swiss Mobility API.' #fieldComment -trips PERSISTENT #fieldModifier -tripsForDisplay List #field -tripsForDisplay 'Trips parsed for displaying in user dialog.' #fieldComment -tripsForDisplay PERSISTENT #fieldModifier diff --git a/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/ShowTrips/ShowTripsProcess.p.json b/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/ShowTrips/ShowTripsProcess.p.json index ab8a470..73dbfb3 100644 --- a/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/ShowTrips/ShowTripsProcess.p.json +++ b/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/ShowTrips/ShowTripsProcess.p.json @@ -1,5 +1,5 @@ { - "format" : "10.0.0", + "$schema" : "https://json-schema.axonivy.com/process/12.0.0/process.json", "id" : "18A1BFBEB2EBD003", "kind" : "HTML_DIALOG", "config" : { @@ -10,10 +10,10 @@ "type" : "HtmlDialogStart", "name" : "start(List)", "config" : { - "callSignature" : "start", + "signature" : "start", "input" : { "params" : [ - { "name" : "trips", "type" : "List" } + { "name" : "trips", "type" : "List", "desc" : "" } ], "map" : { "out.trips" : "param.trips" @@ -24,7 +24,9 @@ "visual" : { "at" : { "x" : 96, "y" : 64 } }, - "connect" : { "id" : "f7", "to" : "f6" } + "connect" : [ + { "id" : "f7", "to" : "f6" } + ] }, { "id" : "f1", "type" : "HtmlDialogEnd", @@ -41,7 +43,9 @@ "visual" : { "at" : { "x" : 96, "y" : 160 } }, - "connect" : { "id" : "f5", "to" : "f4" } + "connect" : [ + { "id" : "f5", "to" : "f4" } + ] }, { "id" : "f4", "type" : "HtmlDialogExit", @@ -243,6 +247,8 @@ "visual" : { "at" : { "x" : 224, "y" : 64 } }, - "connect" : { "id" : "f2", "to" : "f1" } + "connect" : [ + { "id" : "f2", "to" : "f1" } + ] } ] } \ No newline at end of file diff --git a/sbb-connector-test/.classpath b/sbb-connector-test/.classpath index bc1e3c9..8774f33 100644 --- a/sbb-connector-test/.classpath +++ b/sbb-connector-test/.classpath @@ -5,12 +5,7 @@ - - - - - - + diff --git a/sbb-connector-test/.project b/sbb-connector-test/.project index 69726bb..3eefcc2 100644 --- a/sbb-connector-test/.project +++ b/sbb-connector-test/.project @@ -1,49 +1,53 @@ - - - sbb-connector-test - - - - - - ch.ivyteam.ivy.designer.dataClasses.ui.ivyDataClassBuilder - - - - - ch.ivyteam.ivy.designer.process.ui.ivyWebServiceProcessClassBuilder - - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.wst.common.project.facet.core.builder - - - - - ch.ivyteam.ivy.designer.ide.ivyModelValidationBuilder - - - - - org.eclipse.m2e.core.maven2Builder - - - - - - ch.ivyteam.ivy.project.IvyProjectNature - org.eclipse.wst.common.modulecore.ModuleCoreNature - org.eclipse.jem.workbench.JavaEMFNature - org.eclipse.jdt.core.javanature - org.eclipse.m2e.core.maven2Nature - org.eclipse.jem.beaninfo.BeanInfoNature - org.eclipse.wst.common.project.facet.core.nature - org.eclipse.wst.jsdt.core.jsNature - - + + + sbb-connector-test + + + + + + ch.ivyteam.ivy.designer.dataClasses.ui.ivyDataClassBuilder + + + + + ch.ivyteam.ivy.designer.process.ui.ivyWebServiceProcessClassBuilder + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.wst.common.project.facet.core.builder + + + + + ch.ivyteam.ivy.dialog.form.build.ivyDialogFormBuilder + + + + + ch.ivyteam.ivy.designer.ide.ivyModelValidationBuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + ch.ivyteam.ivy.project.IvyProjectNature + org.eclipse.wst.common.modulecore.ModuleCoreNature + org.eclipse.jem.workbench.JavaEMFNature + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + org.eclipse.jem.beaninfo.BeanInfoNature + org.eclipse.wst.common.project.facet.core.nature + + \ No newline at end of file diff --git a/sbb-connector-test/.settings/.jsdtscope b/sbb-connector-test/.settings/.jsdtscope deleted file mode 100644 index cf5ec79..0000000 --- a/sbb-connector-test/.settings/.jsdtscope +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/sbb-connector-test/.settings/ch.ivyteam.ivy.designer.prefs b/sbb-connector-test/.settings/ch.ivyteam.ivy.designer.prefs index 883e01d..84908d1 100644 --- a/sbb-connector-test/.settings/ch.ivyteam.ivy.designer.prefs +++ b/sbb-connector-test/.settings/ch.ivyteam.ivy.designer.prefs @@ -1,6 +1,5 @@ -ch.ivyteam.ivy.designer.preferences.DataClassPreferencePage\:DEFAULT_DATA_CLASS=com.axonivy.connector.sbb.test.Data -ch.ivyteam.ivy.designer.preferences.DataClassPreferencePage\:DEFAULT_NAMESPACE=com.axonivy.connector.sbb.test -ch.ivyteam.ivy.designer.preferences.DataClassPreferencePage\:useProjectSettings=true -ch.ivyteam.ivy.project.preferences\:PRIMEFACES_VERSION=11 -ch.ivyteam.ivy.project.preferences\:PROJECT_VERSION=100000 -eclipse.preferences.version=1 +ch.ivyteam.ivy.designer.preferences.DataClassPreferencePage\:DEFAULT_NAMESPACE=com.axonivy.connector.sbb.test +ch.ivyteam.ivy.designer.preferences.DataClassPreferencePage\:useProjectSettings=true +ch.ivyteam.ivy.project.preferences\:PRIMEFACES_VERSION=11 +ch.ivyteam.ivy.project.preferences\:PROJECT_VERSION=120001 +eclipse.preferences.version=1 \ No newline at end of file diff --git a/sbb-connector-test/.settings/org.eclipse.jdt.core.prefs b/sbb-connector-test/.settings/org.eclipse.jdt.core.prefs index f78f7f7..96641ff 100644 --- a/sbb-connector-test/.settings/org.eclipse.jdt.core.prefs +++ b/sbb-connector-test/.settings/org.eclipse.jdt.core.prefs @@ -1,10 +1,10 @@ eclipse.preferences.version=1 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=17 -org.eclipse.jdt.core.compiler.compliance=17 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=21 +org.eclipse.jdt.core.compiler.compliance=21 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled org.eclipse.jdt.core.compiler.problem.enumIdentifier=error org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning org.eclipse.jdt.core.compiler.release=enabled -org.eclipse.jdt.core.compiler.source=17 +org.eclipse.jdt.core.compiler.source=21 diff --git a/sbb-connector-test/.settings/org.eclipse.wst.common.component b/sbb-connector-test/.settings/org.eclipse.wst.common.component index 13e105a..ad12ab9 100644 --- a/sbb-connector-test/.settings/org.eclipse.wst.common.component +++ b/sbb-connector-test/.settings/org.eclipse.wst.common.component @@ -1,11 +1,10 @@ - - - - - - - - - - - + + + + + + + + + + \ No newline at end of file diff --git a/sbb-connector-test/.settings/org.eclipse.wst.common.project.facet.core.xml b/sbb-connector-test/.settings/org.eclipse.wst.common.project.facet.core.xml index c2098f9..621b1f8 100644 --- a/sbb-connector-test/.settings/org.eclipse.wst.common.project.facet.core.xml +++ b/sbb-connector-test/.settings/org.eclipse.wst.common.project.facet.core.xml @@ -1,8 +1,6 @@ - - - - - - - - + + + + + + \ No newline at end of file diff --git a/sbb-connector-test/.settings/org.eclipse.wst.jsdt.ui.superType.container b/sbb-connector-test/.settings/org.eclipse.wst.jsdt.ui.superType.container deleted file mode 100644 index 3bd5d0a..0000000 --- a/sbb-connector-test/.settings/org.eclipse.wst.jsdt.ui.superType.container +++ /dev/null @@ -1 +0,0 @@ -org.eclipse.wst.jsdt.launching.baseBrowserLibrary \ No newline at end of file diff --git a/sbb-connector-test/.settings/org.eclipse.wst.jsdt.ui.superType.name b/sbb-connector-test/.settings/org.eclipse.wst.jsdt.ui.superType.name deleted file mode 100644 index 05bd71b..0000000 --- a/sbb-connector-test/.settings/org.eclipse.wst.jsdt.ui.superType.name +++ /dev/null @@ -1 +0,0 @@ -Window \ No newline at end of file diff --git a/sbb-connector-test/config/variables.yaml b/sbb-connector-test/config/variables.yaml index ca41237..3d0b275 100644 --- a/sbb-connector-test/config/variables.yaml +++ b/sbb-connector-test/config/variables.yaml @@ -1,3 +1,4 @@ +# yaml-language-server: $schema=https://json-schema.axonivy.com/app/12.0.0/variables.json Variables: sbbConnector: uri: https://b2p.app.sbb.ch @@ -5,4 +6,4 @@ Variables: clientId: DEMO clientSecret: DEMO tokenEndpoint: DEMO - scope: DEMO \ No newline at end of file + scope: DEMO diff --git a/sbb-connector-test/dataclasses/com/axonivy/connector/sbb/test/Data.d.json b/sbb-connector-test/dataclasses/com/axonivy/connector/sbb/test/Data.d.json new file mode 100644 index 0000000..2f0abce --- /dev/null +++ b/sbb-connector-test/dataclasses/com/axonivy/connector/sbb/test/Data.d.json @@ -0,0 +1,6 @@ +{ + "$schema" : "https://json-schema.axonivy.com/data-class/12.0.0/data-class.json", + "simpleName" : "Data", + "namespace" : "com.axonivy.connector.sbb.test", + "isBusinessCaseData" : false +} \ No newline at end of file diff --git a/sbb-connector-test/dataclasses/com/axonivy/connector/sbb/test/Data.ivyClass b/sbb-connector-test/dataclasses/com/axonivy/connector/sbb/test/Data.ivyClass deleted file mode 100644 index 3e998fa..0000000 --- a/sbb-connector-test/dataclasses/com/axonivy/connector/sbb/test/Data.ivyClass +++ /dev/null @@ -1,2 +0,0 @@ -Data #class -com.axonivy.connector.sbb.test #namespace diff --git a/sbb-connector-webtest/.classpath b/sbb-connector-webtest/.classpath index 8a52195..d896a77 100644 --- a/sbb-connector-webtest/.classpath +++ b/sbb-connector-webtest/.classpath @@ -5,12 +5,7 @@ - - - - - - + diff --git a/sbb-connector-webtest/.project b/sbb-connector-webtest/.project index 52d5ab8..4cfc043 100644 --- a/sbb-connector-webtest/.project +++ b/sbb-connector-webtest/.project @@ -1,49 +1,53 @@ - - - sbb-connector-webtest - - - - - - ch.ivyteam.ivy.designer.dataClasses.ui.ivyDataClassBuilder - - - - - ch.ivyteam.ivy.designer.process.ui.ivyWebServiceProcessClassBuilder - - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.wst.common.project.facet.core.builder - - - - - ch.ivyteam.ivy.designer.ide.ivyModelValidationBuilder - - - - - org.eclipse.m2e.core.maven2Builder - - - - - - ch.ivyteam.ivy.project.IvyProjectNature - org.eclipse.wst.common.modulecore.ModuleCoreNature - org.eclipse.jem.workbench.JavaEMFNature - org.eclipse.jdt.core.javanature - org.eclipse.m2e.core.maven2Nature - org.eclipse.jem.beaninfo.BeanInfoNature - org.eclipse.wst.common.project.facet.core.nature - org.eclipse.wst.jsdt.core.jsNature - - + + + sbb-connector-webtest + + + + + + ch.ivyteam.ivy.designer.dataClasses.ui.ivyDataClassBuilder + + + + + ch.ivyteam.ivy.designer.process.ui.ivyWebServiceProcessClassBuilder + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.wst.common.project.facet.core.builder + + + + + ch.ivyteam.ivy.dialog.form.build.ivyDialogFormBuilder + + + + + ch.ivyteam.ivy.designer.ide.ivyModelValidationBuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + ch.ivyteam.ivy.project.IvyProjectNature + org.eclipse.wst.common.modulecore.ModuleCoreNature + org.eclipse.jem.workbench.JavaEMFNature + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + org.eclipse.jem.beaninfo.BeanInfoNature + org.eclipse.wst.common.project.facet.core.nature + + \ No newline at end of file diff --git a/sbb-connector-webtest/.settings/.jsdtscope b/sbb-connector-webtest/.settings/.jsdtscope deleted file mode 100644 index cf5ec79..0000000 --- a/sbb-connector-webtest/.settings/.jsdtscope +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/sbb-connector-webtest/.settings/ch.ivyteam.ivy.designer.prefs b/sbb-connector-webtest/.settings/ch.ivyteam.ivy.designer.prefs index 384fb47..49b12b0 100644 --- a/sbb-connector-webtest/.settings/ch.ivyteam.ivy.designer.prefs +++ b/sbb-connector-webtest/.settings/ch.ivyteam.ivy.designer.prefs @@ -1,6 +1,5 @@ -ch.ivyteam.ivy.designer.preferences.DataClassPreferencePage\:DEFAULT_DATA_CLASS=com.axonivy.connector.sbb.webtest.Data -ch.ivyteam.ivy.designer.preferences.DataClassPreferencePage\:DEFAULT_NAMESPACE=com.axonivy.connector.sbb.webtest -ch.ivyteam.ivy.designer.preferences.DataClassPreferencePage\:useProjectSettings=true -ch.ivyteam.ivy.project.preferences\:PRIMEFACES_VERSION=11 -ch.ivyteam.ivy.project.preferences\:PROJECT_VERSION=100000 -eclipse.preferences.version=1 +ch.ivyteam.ivy.designer.preferences.DataClassPreferencePage\:DEFAULT_NAMESPACE=com.axonivy.connector.sbb.webtest +ch.ivyteam.ivy.designer.preferences.DataClassPreferencePage\:useProjectSettings=true +ch.ivyteam.ivy.project.preferences\:PRIMEFACES_VERSION=11 +ch.ivyteam.ivy.project.preferences\:PROJECT_VERSION=120001 +eclipse.preferences.version=1 \ No newline at end of file diff --git a/sbb-connector-webtest/.settings/org.eclipse.jdt.core.prefs b/sbb-connector-webtest/.settings/org.eclipse.jdt.core.prefs index f78f7f7..96641ff 100644 --- a/sbb-connector-webtest/.settings/org.eclipse.jdt.core.prefs +++ b/sbb-connector-webtest/.settings/org.eclipse.jdt.core.prefs @@ -1,10 +1,10 @@ eclipse.preferences.version=1 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=17 -org.eclipse.jdt.core.compiler.compliance=17 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=21 +org.eclipse.jdt.core.compiler.compliance=21 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled org.eclipse.jdt.core.compiler.problem.enumIdentifier=error org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning org.eclipse.jdt.core.compiler.release=enabled -org.eclipse.jdt.core.compiler.source=17 +org.eclipse.jdt.core.compiler.source=21 diff --git a/sbb-connector-webtest/.settings/org.eclipse.wst.common.component b/sbb-connector-webtest/.settings/org.eclipse.wst.common.component index b2f428e..35952d2 100644 --- a/sbb-connector-webtest/.settings/org.eclipse.wst.common.component +++ b/sbb-connector-webtest/.settings/org.eclipse.wst.common.component @@ -1,11 +1,10 @@ - - - - - - - - - - - + + + + + + + + + + \ No newline at end of file diff --git a/sbb-connector-webtest/.settings/org.eclipse.wst.common.project.facet.core.xml b/sbb-connector-webtest/.settings/org.eclipse.wst.common.project.facet.core.xml index c2098f9..621b1f8 100644 --- a/sbb-connector-webtest/.settings/org.eclipse.wst.common.project.facet.core.xml +++ b/sbb-connector-webtest/.settings/org.eclipse.wst.common.project.facet.core.xml @@ -1,8 +1,6 @@ - - - - - - - - + + + + + + \ No newline at end of file diff --git a/sbb-connector-webtest/.settings/org.eclipse.wst.jsdt.ui.superType.container b/sbb-connector-webtest/.settings/org.eclipse.wst.jsdt.ui.superType.container deleted file mode 100644 index 3bd5d0a..0000000 --- a/sbb-connector-webtest/.settings/org.eclipse.wst.jsdt.ui.superType.container +++ /dev/null @@ -1 +0,0 @@ -org.eclipse.wst.jsdt.launching.baseBrowserLibrary \ No newline at end of file diff --git a/sbb-connector-webtest/.settings/org.eclipse.wst.jsdt.ui.superType.name b/sbb-connector-webtest/.settings/org.eclipse.wst.jsdt.ui.superType.name deleted file mode 100644 index 05bd71b..0000000 --- a/sbb-connector-webtest/.settings/org.eclipse.wst.jsdt.ui.superType.name +++ /dev/null @@ -1 +0,0 @@ -Window \ No newline at end of file diff --git a/sbb-connector-webtest/config/variables.yaml b/sbb-connector-webtest/config/variables.yaml index 64c8fa0..4448394 100644 --- a/sbb-connector-webtest/config/variables.yaml +++ b/sbb-connector-webtest/config/variables.yaml @@ -1,3 +1,4 @@ +# yaml-language-server: $schema=https://json-schema.axonivy.com/app/12.0.0/variables.json # == Variables == # # You can define here your project Variables. diff --git a/sbb-connector-webtest/dataclasses/com/axonivy/connector/sbb/webtest/Data.d.json b/sbb-connector-webtest/dataclasses/com/axonivy/connector/sbb/webtest/Data.d.json new file mode 100644 index 0000000..ec71000 --- /dev/null +++ b/sbb-connector-webtest/dataclasses/com/axonivy/connector/sbb/webtest/Data.d.json @@ -0,0 +1,6 @@ +{ + "$schema" : "https://json-schema.axonivy.com/data-class/12.0.0/data-class.json", + "simpleName" : "Data", + "namespace" : "com.axonivy.connector.sbb.webtest", + "isBusinessCaseData" : false +} \ No newline at end of file diff --git a/sbb-connector-webtest/dataclasses/com/axonivy/connector/sbb/webtest/Data.ivyClass b/sbb-connector-webtest/dataclasses/com/axonivy/connector/sbb/webtest/Data.ivyClass deleted file mode 100644 index 0b5328f..0000000 --- a/sbb-connector-webtest/dataclasses/com/axonivy/connector/sbb/webtest/Data.ivyClass +++ /dev/null @@ -1,2 +0,0 @@ -Data #class -com.axonivy.connector.sbb.webtest #namespace diff --git a/sbb-connector/.classpath b/sbb-connector/.classpath index 94e64f6..cddce2d 100644 --- a/sbb-connector/.classpath +++ b/sbb-connector/.classpath @@ -5,12 +5,7 @@ - - - - - - + diff --git a/sbb-connector/.project b/sbb-connector/.project index 207c18a..250073f 100644 --- a/sbb-connector/.project +++ b/sbb-connector/.project @@ -1,49 +1,53 @@ - - - sbb-connector - - - - - - ch.ivyteam.ivy.designer.dataClasses.ui.ivyDataClassBuilder - - - - - ch.ivyteam.ivy.designer.process.ui.ivyWebServiceProcessClassBuilder - - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.wst.common.project.facet.core.builder - - - - - ch.ivyteam.ivy.designer.ide.ivyModelValidationBuilder - - - - - org.eclipse.m2e.core.maven2Builder - - - - - - ch.ivyteam.ivy.project.IvyProjectNature - org.eclipse.wst.common.modulecore.ModuleCoreNature - org.eclipse.jem.workbench.JavaEMFNature - org.eclipse.jdt.core.javanature - org.eclipse.m2e.core.maven2Nature - org.eclipse.jem.beaninfo.BeanInfoNature - org.eclipse.wst.common.project.facet.core.nature - org.eclipse.wst.jsdt.core.jsNature - - + + + sbb-connector + + + + + + ch.ivyteam.ivy.designer.dataClasses.ui.ivyDataClassBuilder + + + + + ch.ivyteam.ivy.designer.process.ui.ivyWebServiceProcessClassBuilder + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.wst.common.project.facet.core.builder + + + + + ch.ivyteam.ivy.dialog.form.build.ivyDialogFormBuilder + + + + + ch.ivyteam.ivy.designer.ide.ivyModelValidationBuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + ch.ivyteam.ivy.project.IvyProjectNature + org.eclipse.wst.common.modulecore.ModuleCoreNature + org.eclipse.jem.workbench.JavaEMFNature + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + org.eclipse.jem.beaninfo.BeanInfoNature + org.eclipse.wst.common.project.facet.core.nature + + \ No newline at end of file diff --git a/sbb-connector/.settings/.jsdtscope b/sbb-connector/.settings/.jsdtscope deleted file mode 100644 index cf5ec79..0000000 --- a/sbb-connector/.settings/.jsdtscope +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/sbb-connector/.settings/ch.ivyteam.ivy.designer.prefs b/sbb-connector/.settings/ch.ivyteam.ivy.designer.prefs index 73d2b58..f0af8d5 100644 --- a/sbb-connector/.settings/ch.ivyteam.ivy.designer.prefs +++ b/sbb-connector/.settings/ch.ivyteam.ivy.designer.prefs @@ -1,6 +1,5 @@ -ch.ivyteam.ivy.designer.preferences.DataClassPreferencePage\:DEFAULT_DATA_CLASS=com.axonivy.connector.sbb.Data -ch.ivyteam.ivy.designer.preferences.DataClassPreferencePage\:DEFAULT_NAMESPACE=com.axonivy.connector.sbb -ch.ivyteam.ivy.designer.preferences.DataClassPreferencePage\:useProjectSettings=true -ch.ivyteam.ivy.project.preferences\:PRIMEFACES_VERSION=11 -ch.ivyteam.ivy.project.preferences\:PROJECT_VERSION=100000 -eclipse.preferences.version=1 +ch.ivyteam.ivy.designer.preferences.DataClassPreferencePage\:DEFAULT_NAMESPACE=com.axonivy.connector.sbb +ch.ivyteam.ivy.designer.preferences.DataClassPreferencePage\:useProjectSettings=true +ch.ivyteam.ivy.project.preferences\:PRIMEFACES_VERSION=11 +ch.ivyteam.ivy.project.preferences\:PROJECT_VERSION=120001 +eclipse.preferences.version=1 \ No newline at end of file diff --git a/sbb-connector/.settings/org.eclipse.jdt.core.prefs b/sbb-connector/.settings/org.eclipse.jdt.core.prefs index f78f7f7..96641ff 100644 --- a/sbb-connector/.settings/org.eclipse.jdt.core.prefs +++ b/sbb-connector/.settings/org.eclipse.jdt.core.prefs @@ -1,10 +1,10 @@ eclipse.preferences.version=1 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=17 -org.eclipse.jdt.core.compiler.compliance=17 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=21 +org.eclipse.jdt.core.compiler.compliance=21 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled org.eclipse.jdt.core.compiler.problem.enumIdentifier=error org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning org.eclipse.jdt.core.compiler.release=enabled -org.eclipse.jdt.core.compiler.source=17 +org.eclipse.jdt.core.compiler.source=21 diff --git a/sbb-connector/.settings/org.eclipse.wst.common.component b/sbb-connector/.settings/org.eclipse.wst.common.component index 00d3633..01df8b2 100644 --- a/sbb-connector/.settings/org.eclipse.wst.common.component +++ b/sbb-connector/.settings/org.eclipse.wst.common.component @@ -1,11 +1,10 @@ - - - - - - - - - - - + + + + + + + + + + \ No newline at end of file diff --git a/sbb-connector/.settings/org.eclipse.wst.common.project.facet.core.xml b/sbb-connector/.settings/org.eclipse.wst.common.project.facet.core.xml index c2098f9..621b1f8 100644 --- a/sbb-connector/.settings/org.eclipse.wst.common.project.facet.core.xml +++ b/sbb-connector/.settings/org.eclipse.wst.common.project.facet.core.xml @@ -1,8 +1,6 @@ - - - - - - - - + + + + + + \ No newline at end of file diff --git a/sbb-connector/.settings/org.eclipse.wst.jsdt.ui.superType.container b/sbb-connector/.settings/org.eclipse.wst.jsdt.ui.superType.container deleted file mode 100644 index 3bd5d0a..0000000 --- a/sbb-connector/.settings/org.eclipse.wst.jsdt.ui.superType.container +++ /dev/null @@ -1 +0,0 @@ -org.eclipse.wst.jsdt.launching.baseBrowserLibrary \ No newline at end of file diff --git a/sbb-connector/.settings/org.eclipse.wst.jsdt.ui.superType.name b/sbb-connector/.settings/org.eclipse.wst.jsdt.ui.superType.name deleted file mode 100644 index 05bd71b..0000000 --- a/sbb-connector/.settings/org.eclipse.wst.jsdt.ui.superType.name +++ /dev/null @@ -1 +0,0 @@ -Window \ No newline at end of file diff --git a/sbb-connector/config/variables.yaml b/sbb-connector/config/variables.yaml index f5cd8be..6483dd4 100644 --- a/sbb-connector/config/variables.yaml +++ b/sbb-connector/config/variables.yaml @@ -1,3 +1,4 @@ +# yaml-language-server: $schema=https://json-schema.axonivy.com/app/12.0.0/variables.json Variables: sbbConnector: # The URI of the API to use. For example: `https://b2p-int.api.sbb.ch` (integration) or `https://b2p.api.sbb.ch` (production) @@ -12,4 +13,4 @@ Variables: # The endpoint for acquiring the bearer token using your client id and secret. For Example: `https://login.microsoftonline.com/2cda5d11-f0ac-46b3-967d-af1b2e1bd01a/oauth2/v2.0` tokenEndpoint: '' # The scope provided to you by SBB. - scope: '' \ No newline at end of file + scope: '' diff --git a/sbb-connector/dataclasses/com/axonivy/connector/sbb/Data.d.json b/sbb-connector/dataclasses/com/axonivy/connector/sbb/Data.d.json new file mode 100644 index 0000000..79fdee8 --- /dev/null +++ b/sbb-connector/dataclasses/com/axonivy/connector/sbb/Data.d.json @@ -0,0 +1,6 @@ +{ + "$schema" : "https://json-schema.axonivy.com/data-class/12.0.0/data-class.json", + "simpleName" : "Data", + "namespace" : "com.axonivy.connector.sbb", + "isBusinessCaseData" : false +} \ No newline at end of file diff --git a/sbb-connector/dataclasses/com/axonivy/connector/sbb/Data.ivyClass b/sbb-connector/dataclasses/com/axonivy/connector/sbb/Data.ivyClass deleted file mode 100644 index 3903eb7..0000000 --- a/sbb-connector/dataclasses/com/axonivy/connector/sbb/Data.ivyClass +++ /dev/null @@ -1,2 +0,0 @@ -Data #class -com.axonivy.connector.sbb #namespace diff --git a/sbb-connector/dataclasses/com/axonivy/connector/sbb/location/GetLocationsData.d.json b/sbb-connector/dataclasses/com/axonivy/connector/sbb/location/GetLocationsData.d.json new file mode 100644 index 0000000..2432e01 --- /dev/null +++ b/sbb-connector/dataclasses/com/axonivy/connector/sbb/location/GetLocationsData.d.json @@ -0,0 +1,17 @@ +{ + "$schema" : "https://json-schema.axonivy.com/data-class/12.0.0/data-class.json", + "simpleName" : "GetLocationsData", + "namespace" : "com.axonivy.connector.sbb.location", + "isBusinessCaseData" : false, + "fields" : [ { + "name" : "in", + "type" : "com.axonivy.connector.sbb.location.GetLocationsDataIn", + "comment" : "Argument for subprocess GetLocations.", + "modifiers" : [ "PERSISTENT" ] + }, { + "name" : "locations", + "type" : "List", + "comment" : "Return value of subprocess GetLocations.", + "modifiers" : [ "PERSISTENT" ] + } ] +} \ No newline at end of file diff --git a/sbb-connector/dataclasses/com/axonivy/connector/sbb/location/GetLocationsData.ivyClass b/sbb-connector/dataclasses/com/axonivy/connector/sbb/location/GetLocationsData.ivyClass deleted file mode 100644 index 647e9d6..0000000 --- a/sbb-connector/dataclasses/com/axonivy/connector/sbb/location/GetLocationsData.ivyClass +++ /dev/null @@ -1,8 +0,0 @@ -GetLocationsData #class -com.axonivy.connector.sbb.location #namespace -in com.axonivy.connector.sbb.location.GetLocationsDataIn #field -in 'Argument for subprocess GetLocations.' #fieldComment -in PERSISTENT #fieldModifier -locations List #field -locations 'Return value of subprocess GetLocations.' #fieldComment -locations PERSISTENT #fieldModifier diff --git a/sbb-connector/dataclasses/com/axonivy/connector/sbb/location/GetLocationsDataHeaders.d.json b/sbb-connector/dataclasses/com/axonivy/connector/sbb/location/GetLocationsDataHeaders.d.json new file mode 100644 index 0000000..08d05b9 --- /dev/null +++ b/sbb-connector/dataclasses/com/axonivy/connector/sbb/location/GetLocationsDataHeaders.d.json @@ -0,0 +1,17 @@ +{ + "$schema" : "https://json-schema.axonivy.com/data-class/12.0.0/data-class.json", + "simpleName" : "GetLocationsDataHeaders", + "namespace" : "com.axonivy.connector.sbb.location", + "isBusinessCaseData" : false, + "fields" : [ { + "name" : "conversationId", + "type" : "String", + "comment" : "REQUIRED. The Conversation Id of the current business process.", + "modifiers" : [ "PERSISTENT" ] + }, { + "name" : "acceptLanguage", + "type" : "String", + "comment" : "The language of the translatable properties. Available values : de, fr, it, en", + "modifiers" : [ "PERSISTENT" ] + } ] +} \ No newline at end of file diff --git a/sbb-connector/dataclasses/com/axonivy/connector/sbb/location/GetLocationsDataHeaders.ivyClass b/sbb-connector/dataclasses/com/axonivy/connector/sbb/location/GetLocationsDataHeaders.ivyClass deleted file mode 100644 index 7c1ab0c..0000000 --- a/sbb-connector/dataclasses/com/axonivy/connector/sbb/location/GetLocationsDataHeaders.ivyClass +++ /dev/null @@ -1,8 +0,0 @@ -GetLocationsDataHeaders #class -com.axonivy.connector.sbb.location #namespace -conversationId String #field -conversationId 'REQUIRED. The Conversation Id of the current business process.' #fieldComment -conversationId PERSISTENT #fieldModifier -acceptLanguage String #field -acceptLanguage 'The language of the translatable properties. Available values : de, fr, it, en' #fieldComment -acceptLanguage PERSISTENT #fieldModifier diff --git a/sbb-connector/dataclasses/com/axonivy/connector/sbb/location/GetLocationsDataIn.d.json b/sbb-connector/dataclasses/com/axonivy/connector/sbb/location/GetLocationsDataIn.d.json new file mode 100644 index 0000000..c2dc359 --- /dev/null +++ b/sbb-connector/dataclasses/com/axonivy/connector/sbb/location/GetLocationsDataIn.d.json @@ -0,0 +1,15 @@ +{ + "$schema" : "https://json-schema.axonivy.com/data-class/12.0.0/data-class.json", + "simpleName" : "GetLocationsDataIn", + "namespace" : "com.axonivy.connector.sbb.location", + "isBusinessCaseData" : false, + "fields" : [ { + "name" : "parameters", + "type" : "com.axonivy.connector.sbb.location.GetLocationsDataParameters", + "modifiers" : [ "PERSISTENT" ] + }, { + "name" : "headers", + "type" : "com.axonivy.connector.sbb.location.GetLocationsDataHeaders", + "modifiers" : [ "PERSISTENT" ] + } ] +} \ No newline at end of file diff --git a/sbb-connector/dataclasses/com/axonivy/connector/sbb/location/GetLocationsDataIn.ivyClass b/sbb-connector/dataclasses/com/axonivy/connector/sbb/location/GetLocationsDataIn.ivyClass deleted file mode 100644 index eba3f47..0000000 --- a/sbb-connector/dataclasses/com/axonivy/connector/sbb/location/GetLocationsDataIn.ivyClass +++ /dev/null @@ -1,6 +0,0 @@ -GetLocationsDataIn #class -com.axonivy.connector.sbb.location #namespace -parameters com.axonivy.connector.sbb.location.GetLocationsDataParameters #field -parameters PERSISTENT #fieldModifier -headers com.axonivy.connector.sbb.location.GetLocationsDataHeaders #field -headers PERSISTENT #fieldModifier diff --git a/sbb-connector/dataclasses/com/axonivy/connector/sbb/location/GetLocationsDataParameters.d.json b/sbb-connector/dataclasses/com/axonivy/connector/sbb/location/GetLocationsDataParameters.d.json new file mode 100644 index 0000000..c0d72d7 --- /dev/null +++ b/sbb-connector/dataclasses/com/axonivy/connector/sbb/location/GetLocationsDataParameters.d.json @@ -0,0 +1,12 @@ +{ + "$schema" : "https://json-schema.axonivy.com/data-class/12.0.0/data-class.json", + "simpleName" : "GetLocationsDataParameters", + "namespace" : "com.axonivy.connector.sbb.location", + "isBusinessCaseData" : false, + "fields" : [ { + "name" : "name", + "type" : "String", + "comment" : "REQUIRED. Expression (min. 2 characters) to search for locations (STATION's). Example : Bern", + "modifiers" : [ "PERSISTENT" ] + } ] +} \ No newline at end of file diff --git a/sbb-connector/dataclasses/com/axonivy/connector/sbb/location/GetLocationsDataParameters.ivyClass b/sbb-connector/dataclasses/com/axonivy/connector/sbb/location/GetLocationsDataParameters.ivyClass deleted file mode 100644 index 13d3d49..0000000 --- a/sbb-connector/dataclasses/com/axonivy/connector/sbb/location/GetLocationsDataParameters.ivyClass +++ /dev/null @@ -1,5 +0,0 @@ -GetLocationsDataParameters #class -com.axonivy.connector.sbb.location #namespace -name String #field -name 'REQUIRED. Expression (min. 2 characters) to search for locations (STATION''s). Example : Bern' #fieldComment -name PERSISTENT #fieldModifier diff --git a/sbb-connector/dataclasses/com/axonivy/connector/sbb/trip/GetTripsData.d.json b/sbb-connector/dataclasses/com/axonivy/connector/sbb/trip/GetTripsData.d.json new file mode 100644 index 0000000..abe3303 --- /dev/null +++ b/sbb-connector/dataclasses/com/axonivy/connector/sbb/trip/GetTripsData.d.json @@ -0,0 +1,17 @@ +{ + "$schema" : "https://json-schema.axonivy.com/data-class/12.0.0/data-class.json", + "simpleName" : "GetTripsData", + "namespace" : "com.axonivy.connector.sbb.trip", + "isBusinessCaseData" : false, + "fields" : [ { + "name" : "in", + "type" : "com.axonivy.connector.sbb.trip.GetTripsDataIn", + "comment" : "Argument for subprocess GetTrips.", + "modifiers" : [ "PERSISTENT" ] + }, { + "name" : "trips", + "type" : "List", + "comment" : "Return value of subprocess GetTrips.", + "modifiers" : [ "PERSISTENT" ] + } ] +} \ No newline at end of file diff --git a/sbb-connector/dataclasses/com/axonivy/connector/sbb/trip/GetTripsData.ivyClass b/sbb-connector/dataclasses/com/axonivy/connector/sbb/trip/GetTripsData.ivyClass deleted file mode 100644 index 267b024..0000000 --- a/sbb-connector/dataclasses/com/axonivy/connector/sbb/trip/GetTripsData.ivyClass +++ /dev/null @@ -1,8 +0,0 @@ -GetTripsData #class -com.axonivy.connector.sbb.trip #namespace -in com.axonivy.connector.sbb.trip.GetTripsDataIn #field -in 'Argument for subprocess GetTrips.' #fieldComment -in PERSISTENT #fieldModifier -trips List #field -trips 'Return value of subprocess GetTrips.' #fieldComment -trips PERSISTENT #fieldModifier diff --git a/sbb-connector/dataclasses/com/axonivy/connector/sbb/trip/GetTripsDataHeaders.d.json b/sbb-connector/dataclasses/com/axonivy/connector/sbb/trip/GetTripsDataHeaders.d.json new file mode 100644 index 0000000..04710a5 --- /dev/null +++ b/sbb-connector/dataclasses/com/axonivy/connector/sbb/trip/GetTripsDataHeaders.d.json @@ -0,0 +1,22 @@ +{ + "$schema" : "https://json-schema.axonivy.com/data-class/12.0.0/data-class.json", + "simpleName" : "GetTripsDataHeaders", + "namespace" : "com.axonivy.connector.sbb.trip", + "isBusinessCaseData" : false, + "fields" : [ { + "name" : "conversationId", + "type" : "String", + "comment" : "REQUIRED. The Conversation Id of the current business process.", + "modifiers" : [ "PERSISTENT" ] + }, { + "name" : "acceptLanguage", + "type" : "String", + "comment" : "The language of the translatable properties. Available values : de, fr, it, en", + "modifiers" : [ "PERSISTENT" ] + }, { + "name" : "scrollContext", + "type" : "String", + "comment" : "Based on a previous search-response, earlier or later connections for the same trip can be retrieved by scrolling back and forward (by a pointer-context). You must use the same GET request parameters as in the previous trips-request. Additionally either of the given values in the previous response-header for \"Scrollback-Context\" or \"Scrollforward-Context\" can be set for \"Scroll-Context\" to force optional scrolling. Example : 2%7COF%7CMT%C2%B511%C2%B5431359%C2%B5431359%C2%B5431662%C2%B5431662%C2%B50%C2%B50%C2%B5485%C2%B5431330%C2%B55%C2%B5-2147483630%C2%B50%C2%B51%C2%B52%7CPDH%C2%B577a7e8108112554ba5d46aeba769461f%7CRD%C2%B57102020%7CRT%C2%B5114900%7CUS%C2%B50", + "modifiers" : [ "PERSISTENT" ] + } ] +} \ No newline at end of file diff --git a/sbb-connector/dataclasses/com/axonivy/connector/sbb/trip/GetTripsDataHeaders.ivyClass b/sbb-connector/dataclasses/com/axonivy/connector/sbb/trip/GetTripsDataHeaders.ivyClass deleted file mode 100644 index e2f628f..0000000 --- a/sbb-connector/dataclasses/com/axonivy/connector/sbb/trip/GetTripsDataHeaders.ivyClass +++ /dev/null @@ -1,11 +0,0 @@ -GetTripsDataHeaders #class -com.axonivy.connector.sbb.trip #namespace -conversationId String #field -conversationId 'REQUIRED. The Conversation Id of the current business process.' #fieldComment -conversationId PERSISTENT #fieldModifier -acceptLanguage String #field -acceptLanguage 'The language of the translatable properties. Available values : de, fr, it, en' #fieldComment -acceptLanguage PERSISTENT #fieldModifier -scrollContext String #field -scrollContext 'Based on a previous search-response, earlier or later connections for the same trip can be retrieved by scrolling back and forward (by a pointer-context). You must use the same GET request parameters as in the previous trips-request. Additionally either of the given values in the previous response-header for "Scrollback-Context" or "Scrollforward-Context" can be set for "Scroll-Context" to force optional scrolling. Example : 2%7COF%7CMT%C2%B511%C2%B5431359%C2%B5431359%C2%B5431662%C2%B5431662%C2%B50%C2%B50%C2%B5485%C2%B5431330%C2%B55%C2%B5-2147483630%C2%B50%C2%B51%C2%B52%7CPDH%C2%B577a7e8108112554ba5d46aeba769461f%7CRD%C2%B57102020%7CRT%C2%B5114900%7CUS%C2%B50' #fieldComment -scrollContext PERSISTENT #fieldModifier diff --git a/sbb-connector/dataclasses/com/axonivy/connector/sbb/trip/GetTripsDataIn.d.json b/sbb-connector/dataclasses/com/axonivy/connector/sbb/trip/GetTripsDataIn.d.json new file mode 100644 index 0000000..09c70e8 --- /dev/null +++ b/sbb-connector/dataclasses/com/axonivy/connector/sbb/trip/GetTripsDataIn.d.json @@ -0,0 +1,15 @@ +{ + "$schema" : "https://json-schema.axonivy.com/data-class/12.0.0/data-class.json", + "simpleName" : "GetTripsDataIn", + "namespace" : "com.axonivy.connector.sbb.trip", + "isBusinessCaseData" : false, + "fields" : [ { + "name" : "parameters", + "type" : "com.axonivy.connector.sbb.trip.GetTripsDataParameters", + "modifiers" : [ "PERSISTENT" ] + }, { + "name" : "headers", + "type" : "com.axonivy.connector.sbb.trip.GetTripsDataHeaders", + "modifiers" : [ "PERSISTENT" ] + } ] +} \ No newline at end of file diff --git a/sbb-connector/dataclasses/com/axonivy/connector/sbb/trip/GetTripsDataIn.ivyClass b/sbb-connector/dataclasses/com/axonivy/connector/sbb/trip/GetTripsDataIn.ivyClass deleted file mode 100644 index 51c4a70..0000000 --- a/sbb-connector/dataclasses/com/axonivy/connector/sbb/trip/GetTripsDataIn.ivyClass +++ /dev/null @@ -1,6 +0,0 @@ -GetTripsDataIn #class -com.axonivy.connector.sbb.trip #namespace -parameters com.axonivy.connector.sbb.trip.GetTripsDataParameters #field -parameters PERSISTENT #fieldModifier -headers com.axonivy.connector.sbb.trip.GetTripsDataHeaders #field -headers PERSISTENT #fieldModifier diff --git a/sbb-connector/dataclasses/com/axonivy/connector/sbb/trip/GetTripsDataParameters.d.json b/sbb-connector/dataclasses/com/axonivy/connector/sbb/trip/GetTripsDataParameters.d.json new file mode 100644 index 0000000..e13a4d2 --- /dev/null +++ b/sbb-connector/dataclasses/com/axonivy/connector/sbb/trip/GetTripsDataParameters.d.json @@ -0,0 +1,62 @@ +{ + "$schema" : "https://json-schema.axonivy.com/data-class/12.0.0/data-class.json", + "simpleName" : "GetTripsDataParameters", + "namespace" : "com.axonivy.connector.sbb.trip", + "isBusinessCaseData" : false, + "fields" : [ { + "name" : "originId", + "type" : "Number", + "comment" : "REQUIRED. The origin UIC code of the trip. Example : 8507000", + "modifiers" : [ "PERSISTENT" ] + }, { + "name" : "destinationId", + "type" : "Number", + "comment" : "REQUIRED. The destination UIC code of the trip. Example : 8503000", + "modifiers" : [ "PERSISTENT" ] + }, { + "name" : "viaId", + "type" : "List", + "comment" : "The UIC code of forced via(s) during the trip, relates to trainType (number of , in trainType +1 viaId).", + "modifiers" : [ "PERSISTENT" ] + }, { + "name" : "date", + "type" : "Date", + "comment" : "REQUIRED. The desired departure date (local date at origin of trip if arrivalDeparture=\"ED\" or at destination if arrivalDeparture=\"LA\"), relates to time. Example : 2020-11-27", + "modifiers" : [ "PERSISTENT" ] + }, { + "name" : "time", + "type" : "String", + "comment" : "REQUIRED. The desired departure time (local time analog date), relates to date. Example : 10:22", + "modifiers" : [ "PERSISTENT" ] + }, { + "name" : "arrivalDeparture", + "type" : "String", + "comment" : "Search by earliest departure \"ED\" or latest arrival \"LA\". Available values : ED, LA; Default value : ED", + "modifiers" : [ "PERSISTENT" ] + }, { + "name" : "trainType", + "type" : "String", + "comment" : "Allows restriction of TransportProduct-categories per PUBLIC_JOURNEY segment and relates to viaId. If nothing is set all TransportProduct-categories may result by default. For a trip A(origin)--(segment0)--B(via0)--(segment1)--C(destination), the desired TransportProduct-categories for each segment may be restricted. Use ',' to separate different segments (via's) and ';' to separate multiple TransportProduct-categories like {ICE/TGV/RJ; EC/IC; IR; RE/D; BOAT; S/SN/R; BUS; CABLEWAY; ARZ/EXT; TRAMWAY} per segment. \"IR\" restrict to InterRegio for segment0 if viaId=B is given (or otherweise for the whole trip if viaId is not given at all). \"EC/IC,IR\" restrict to EuroCity/InterCity for segment0, for segment1 (and perhaps other via's following) only InterRegio is considered where viaId=B must be set. \"EC/IC;ICE/TGV/RJ,IR;EC/IC\" restrict segment0 to EC/IC or ICE/TGV/RJ, segment1 to IR or EC/IC (and perhaps other via's following) where viaId=B must be set. \",IR\" no restriction for segment0, restrict segment1 to IR (and perhaps other via's following) where viaId=B must be set. Example : IR;ICE/TGV/RJ,EC/IC", + "modifiers" : [ "PERSISTENT" ] + }, { + "name" : "alternateMatch", + "type" : "String", + "comment" : "Allows control over displaying of cancelled trips with an alternate connection. IRRELEVANT delivers as is (cancelled and alternate without enrichment of alternate) BOTH delivers both trips of 1:1 alternative (cancelled and alternate with enrichment of alternative) ALTERNATE_ONLY delivers only the 1:1 alternate trips CANCELLED_ONLY delivers only the 1:1 cancelled trips. Available values : IRRELEVANT, BOTH, ALTERNATE_ONLY, CANCELLED_ONLY; Default value : IRRELEVANT", + "modifiers" : [ "PERSISTENT" ] + }, { + "name" : "includeBefore", + "type" : "Number", + "comment" : "Indicate the minimum number of search results returned before related dateTime. Default value : 0", + "modifiers" : [ "PERSISTENT" ] + }, { + "name" : "includeAfter", + "type" : "Number", + "comment" : "Indicate the minimum number of search results returned after related dateTime. Default value : 5", + "modifiers" : [ "PERSISTENT" ] + }, { + "name" : "calculateEco", + "type" : "Boolean", + "comment" : "Create a simplified Trip::EcoBalance comparison object, based on SBB default car eco-params. Example : true; Default value : false", + "modifiers" : [ "PERSISTENT" ] + } ] +} \ No newline at end of file diff --git a/sbb-connector/dataclasses/com/axonivy/connector/sbb/trip/GetTripsDataParameters.ivyClass b/sbb-connector/dataclasses/com/axonivy/connector/sbb/trip/GetTripsDataParameters.ivyClass deleted file mode 100644 index 5ee5db5..0000000 --- a/sbb-connector/dataclasses/com/axonivy/connector/sbb/trip/GetTripsDataParameters.ivyClass +++ /dev/null @@ -1,35 +0,0 @@ -GetTripsDataParameters #class -com.axonivy.connector.sbb.trip #namespace -originId Number #field -originId 'REQUIRED. The origin UIC code of the trip. Example : 8507000' #fieldComment -originId PERSISTENT #fieldModifier -destinationId Number #field -destinationId 'REQUIRED. The destination UIC code of the trip. Example : 8503000' #fieldComment -destinationId PERSISTENT #fieldModifier -viaId List #field -viaId 'The UIC code of forced via(s) during the trip, relates to trainType (number of , in trainType +1 viaId).' #fieldComment -viaId PERSISTENT #fieldModifier -date Date #field -date 'REQUIRED. The desired departure date (local date at origin of trip if arrivalDeparture="ED" or at destination if arrivalDeparture="LA"), relates to time. Example : 2020-11-27' #fieldComment -date PERSISTENT #fieldModifier -time String #field -time 'REQUIRED. The desired departure time (local time analog date), relates to date. Example : 10:22' #fieldComment -time PERSISTENT #fieldModifier -arrivalDeparture String #field -arrivalDeparture 'Search by earliest departure "ED" or latest arrival "LA". Available values : ED, LA; Default value : ED' #fieldComment -arrivalDeparture PERSISTENT #fieldModifier -trainType String #field -trainType 'Allows restriction of TransportProduct-categories per PUBLIC_JOURNEY segment and relates to viaId. If nothing is set all TransportProduct-categories may result by default. For a trip A(origin)--(segment0)--B(via0)--(segment1)--C(destination), the desired TransportProduct-categories for each segment may be restricted. Use '','' to separate different segments (via''s) and '';'' to separate multiple TransportProduct-categories like {ICE/TGV/RJ; EC/IC; IR; RE/D; BOAT; S/SN/R; BUS; CABLEWAY; ARZ/EXT; TRAMWAY} per segment. "IR" restrict to InterRegio for segment0 if viaId=B is given (or otherweise for the whole trip if viaId is not given at all). "EC/IC,IR" restrict to EuroCity/InterCity for segment0, for segment1 (and perhaps other via''s following) only InterRegio is considered where viaId=B must be set. "EC/IC;ICE/TGV/RJ,IR;EC/IC" restrict segment0 to EC/IC or ICE/TGV/RJ, segment1 to IR or EC/IC (and perhaps other via''s following) where viaId=B must be set. ",IR" no restriction for segment0, restrict segment1 to IR (and perhaps other via''s following) where viaId=B must be set. Example : IR;ICE/TGV/RJ,EC/IC' #fieldComment -trainType PERSISTENT #fieldModifier -alternateMatch String #field -alternateMatch 'Allows control over displaying of cancelled trips with an alternate connection. IRRELEVANT delivers as is (cancelled and alternate without enrichment of alternate) BOTH delivers both trips of 1:1 alternative (cancelled and alternate with enrichment of alternative) ALTERNATE_ONLY delivers only the 1:1 alternate trips CANCELLED_ONLY delivers only the 1:1 cancelled trips. Available values : IRRELEVANT, BOTH, ALTERNATE_ONLY, CANCELLED_ONLY; Default value : IRRELEVANT' #fieldComment -alternateMatch PERSISTENT #fieldModifier -includeBefore Number #field -includeBefore 'Indicate the minimum number of search results returned before related dateTime. Default value : 0' #fieldComment -includeBefore PERSISTENT #fieldModifier -includeAfter Number #field -includeAfter 'Indicate the minimum number of search results returned after related dateTime. Default value : 5' #fieldComment -includeAfter PERSISTENT #fieldModifier -calculateEco Boolean #field -calculateEco 'Create a simplified Trip::EcoBalance comparison object, based on SBB default car eco-params. Example : true; Default value : false' #fieldComment -calculateEco PERSISTENT #fieldModifier diff --git a/sbb-connector/processes/GetLocations.p.json b/sbb-connector/processes/GetLocations.p.json index 5c80c29..30569ad 100644 --- a/sbb-connector/processes/GetLocations.p.json +++ b/sbb-connector/processes/GetLocations.p.json @@ -1,5 +1,5 @@ { - "format" : "10.0.0", + "$schema" : "https://json-schema.axonivy.com/process/12.0.0/process.json", "id" : "189FE241C19F033D", "kind" : "CALLABLE_SUB", "description" : "Can be used to perform a pattern-based search to retrieve a list of matching locations (resp. concrete STATION's) for journey planning.", @@ -11,10 +11,10 @@ "type" : "CallSubStart", "name" : "call(GetLocationsDataIn)", "config" : { - "callSignature" : "call", + "signature" : "call", "input" : { "params" : [ - { "name" : "in", "type" : "com.axonivy.connector.sbb.location.GetLocationsDataIn" } + { "name" : "in", "type" : "com.axonivy.connector.sbb.location.GetLocationsDataIn", "desc" : "" } ], "map" : { "out.in" : "param.in" @@ -22,20 +22,24 @@ }, "result" : { "params" : [ - { "name" : "locations", "type" : "List" } + { "name" : "locations", "type" : "List", "desc" : "" } ], "map" : { "result.locations" : "in.locations" } - }, - "tags" : "connector" + } }, + "tags" : [ + "connector" + ], "visual" : { "at" : { "x" : 96, "y" : 64 }, "description" : "Can be used to perform a pattern-based search to retrieve a list of matching locations (resp. concrete STATION's) for journey planning.", "icon" : "res:/webContent/icons/sbb.png?small" }, - "connect" : { "id" : "f3", "to" : "f5" } + "connect" : [ + { "id" : "f3", "to" : "f5" } + ] }, { "id" : "f1", "type" : "CallSubEnd", @@ -49,28 +53,33 @@ "type" : "RestClientCall", "name" : "Get Locations", "config" : { - "path" : "/api/locations", - "headers" : { - "Accept" : "*/*", - "x-conversation-id" : "ivy.case.customFields().stringField(\"conversationId\").getOrDefault(in.in.headers.conversationId)", - "x-contract-id" : "ivy.var.sbbConnector_contractId", - "Accept-Language" : "in.in.headers.acceptLanguage" - }, - "clientId" : "32c4d3f9-2d6d-4b4d-b0c8-066ebf7f2e04", - "clientErrorCode" : "ivy:error:rest:client", - "queryParams" : { - "name" : "in.in.parameters.name" - }, - "statusErrorCode" : "ivy:error:rest:client", - "responseMapping" : { - "out.locations" : "result" + "target" : { + "clientId" : "32c4d3f9-2d6d-4b4d-b0c8-066ebf7f2e04", + "path" : "/api/locations", + "queryParams" : { + "name" : "in.in.parameters.name" + }, + "headers" : { + "x-conversation-id" : "ivy.case.customFields().stringField(\"conversationId\").getOrDefault(in.in.headers.conversationId)", + "x-contract-id" : "ivy.var.sbbConnector_contractId", + "Accept-Language" : "in.in.headers.acceptLanguage" + } }, - "resultType" : "java.util.List" + "response" : { + "entity" : { + "type" : "java.util.List", + "map" : { + "out.locations" : "result" + } + } + } }, "visual" : { "at" : { "x" : 224, "y" : 64 }, "icon" : "res:/webContent/icons/sbb.png" }, - "connect" : { "id" : "f2", "to" : "f1" } + "connect" : [ + { "id" : "f2", "to" : "f1" } + ] } ] } \ No newline at end of file diff --git a/sbb-connector/processes/GetTrips.p.json b/sbb-connector/processes/GetTrips.p.json index 35dc39a..c2d2f03 100644 --- a/sbb-connector/processes/GetTrips.p.json +++ b/sbb-connector/processes/GetTrips.p.json @@ -1,5 +1,5 @@ { - "format" : "10.0.0", + "$schema" : "https://json-schema.axonivy.com/process/12.0.0/process.json", "id" : "189FE2A1B2075999", "kind" : "CALLABLE_SUB", "description" : "Returns different trips for a specified origin and destination (and vias). The UIC codes of the origin and destination can be resolved using the locations service.", @@ -11,10 +11,10 @@ "type" : "CallSubStart", "name" : "call(GetTripsDataIn)", "config" : { - "callSignature" : "call", + "signature" : "call", "input" : { "params" : [ - { "name" : "in", "type" : "com.axonivy.connector.sbb.trip.GetTripsDataIn" } + { "name" : "in", "type" : "com.axonivy.connector.sbb.trip.GetTripsDataIn", "desc" : "" } ], "map" : { "out.in" : "param.in" @@ -22,20 +22,24 @@ }, "result" : { "params" : [ - { "name" : "trips", "type" : "List" } + { "name" : "trips", "type" : "List", "desc" : "" } ], "map" : { "result.trips" : "in.trips" } - }, - "tags" : "connector" + } }, + "tags" : [ + "connector" + ], "visual" : { "at" : { "x" : 96, "y" : 64 }, "description" : "Returns different trips for a specified origin and destination (and vias). The UIC codes of the origin and destination can be resolved using the locations service.", "icon" : "res:/webContent/icons/sbb.png?small" }, - "connect" : { "id" : "f6", "to" : "f5" } + "connect" : [ + { "id" : "f6", "to" : "f5" } + ] }, { "id" : "f1", "type" : "CallSubEnd", @@ -49,39 +53,44 @@ "type" : "RestClientCall", "name" : "Get Trips", "config" : { - "path" : "/api/trips", - "headers" : { - "Accept" : "*/*", - "x-conversation-id" : "ivy.case.customFields().stringField(\"conversationId\").getOrDefault(in.in.headers.conversationId)", - "x-contract-id" : "ivy.var.sbbConnector_contractId", - "Accept-Language" : "in.in.headers.acceptLanguage", - "Scroll-Context" : "in.in.headers.scrollContext" - }, - "clientId" : "32c4d3f9-2d6d-4b4d-b0c8-066ebf7f2e04", - "clientErrorCode" : "ivy:error:rest:client", - "queryParams" : { - "originId" : "in.in.parameters.originId", - "destinationId" : "in.in.parameters.destinationId", - "viaId" : "in.in.parameters.viaId", - "date" : "in.in.parameters.date", - "time" : "in.in.parameters.time", - "arrivalDeparture" : "in.in.parameters.arrivalDeparture", - "trainType" : "in.in.parameters.trainType", - "alternateMatch" : "in.in.parameters.alternateMatch", - "includeBefore" : "in.in.parameters.includeBefore", - "includeAfter" : "in.in.parameters.includeAfter", - "calculateEco" : "in.in.parameters.calculateEco" - }, - "statusErrorCode" : "ivy:error:rest:client", - "responseMapping" : { - "out.trips" : "result" + "target" : { + "clientId" : "32c4d3f9-2d6d-4b4d-b0c8-066ebf7f2e04", + "path" : "/api/trips", + "queryParams" : { + "originId" : "in.in.parameters.originId", + "destinationId" : "in.in.parameters.destinationId", + "viaId" : "in.in.parameters.viaId", + "date" : "in.in.parameters.date", + "time" : "in.in.parameters.time", + "arrivalDeparture" : "in.in.parameters.arrivalDeparture", + "trainType" : "in.in.parameters.trainType", + "alternateMatch" : "in.in.parameters.alternateMatch", + "includeBefore" : "in.in.parameters.includeBefore", + "includeAfter" : "in.in.parameters.includeAfter", + "calculateEco" : "in.in.parameters.calculateEco" + }, + "headers" : { + "x-conversation-id" : "ivy.case.customFields().stringField(\"conversationId\").getOrDefault(in.in.headers.conversationId)", + "x-contract-id" : "ivy.var.sbbConnector_contractId", + "Accept-Language" : "in.in.headers.acceptLanguage", + "Scroll-Context" : "in.in.headers.scrollContext" + } }, - "resultType" : "java.util.List" + "response" : { + "entity" : { + "type" : "java.util.List", + "map" : { + "out.trips" : "result" + } + } + } }, "visual" : { "at" : { "x" : 224, "y" : 64 }, "icon" : "res:/webContent/icons/sbb.png" }, - "connect" : { "id" : "f2", "to" : "f1" } + "connect" : [ + { "id" : "f2", "to" : "f1" } + ] } ] } \ No newline at end of file From 05e437229c7dd5323a7f58d2d16f78ee5f2e9355 Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Mon, 2 Dec 2024 13:06:38 +0000 Subject: [PATCH 02/12] Update maven version to 12.0.0-SNAPSHOT --- pom.xml | 2 +- sbb-connector-demo/pom.xml | 4 ++-- sbb-connector-product/pom.xml | 2 +- sbb-connector-test/pom.xml | 6 +++--- sbb-connector-webtest/pom.xml | 6 +++--- sbb-connector/pom.xml | 4 ++-- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/pom.xml b/pom.xml index 51f3a96..2428751 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ com.axonivy.connector.sbb sbb-connector sbb-connector-modules - 10.0.3-SNAPSHOT + 12.0.0-SNAPSHOT pom diff --git a/sbb-connector-demo/pom.xml b/sbb-connector-demo/pom.xml index 212cb51..04fa238 100644 --- a/sbb-connector-demo/pom.xml +++ b/sbb-connector-demo/pom.xml @@ -3,10 +3,10 @@ 4.0.0 com.axonivy.connector.sbb sbb-connector-demo - 10.0.3-SNAPSHOT + 12.0.0-SNAPSHOT iar - 10.0.16 + 12.0.0 diff --git a/sbb-connector-product/pom.xml b/sbb-connector-product/pom.xml index 1873f55..c3a6e12 100644 --- a/sbb-connector-product/pom.xml +++ b/sbb-connector-product/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.axonivy.connector.sbb sbb-connector-product - 10.0.3-SNAPSHOT + 12.0.0-SNAPSHOT pom diff --git a/sbb-connector-test/pom.xml b/sbb-connector-test/pom.xml index 3c92aa8..1ac1f47 100644 --- a/sbb-connector-test/pom.xml +++ b/sbb-connector-test/pom.xml @@ -3,11 +3,11 @@ 4.0.0 com.axonivy.connector.sbb sbb-connector-test - 10.0.3-SNAPSHOT + 12.0.0-SNAPSHOT iar-integration-test - 10.0.16 - 10.0.16 + 12.0.0 + 12.0.1 diff --git a/sbb-connector-webtest/pom.xml b/sbb-connector-webtest/pom.xml index 963730b..2a58494 100644 --- a/sbb-connector-webtest/pom.xml +++ b/sbb-connector-webtest/pom.xml @@ -3,11 +3,11 @@ 4.0.0 com.axonivy.connector.sbb sbb-connector-webtest - 10.0.3-SNAPSHOT + 12.0.0-SNAPSHOT iar-integration-test - 10.0.16 - 10.0.16 + 12.0.0 + 12.0.1 diff --git a/sbb-connector/pom.xml b/sbb-connector/pom.xml index 489a295..d105d37 100644 --- a/sbb-connector/pom.xml +++ b/sbb-connector/pom.xml @@ -3,10 +3,10 @@ 4.0.0 com.axonivy.connector.sbb sbb-connector - 10.0.3-SNAPSHOT + 12.0.0-SNAPSHOT iar - 10.0.16 + 12.0.0 From 911b7710c4ad1e87bc679a56e3f5e9cc6b762596 Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Mon, 2 Dec 2024 13:06:38 +0000 Subject: [PATCH 03/12] Update workflow actions to v5 --- .github/workflows/ci.yml | 2 +- .github/workflows/dev.yml | 2 +- .github/workflows/release.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 87d78f0..bd4b9c4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -9,4 +9,4 @@ on: jobs: build: - uses: axonivy-market/github-workflows/.github/workflows/ci.yml@v4 + uses: axonivy-market/github-workflows/.github/workflows/ci.yml@v5 diff --git a/.github/workflows/dev.yml b/.github/workflows/dev.yml index c2fee37..ae5e6c3 100644 --- a/.github/workflows/dev.yml +++ b/.github/workflows/dev.yml @@ -8,4 +8,4 @@ on: jobs: build: - uses: axonivy-market/github-workflows/.github/workflows/dev.yml@v4 + uses: axonivy-market/github-workflows/.github/workflows/dev.yml@v5 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index ab5b0d7..bc801b4 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -4,4 +4,4 @@ on: workflow_dispatch jobs: build: - uses: axonivy-market/github-workflows/.github/workflows/release.yml@v4 + uses: axonivy-market/github-workflows/.github/workflows/release.yml@v5 From 2b742c84296ec91d307495de4e5ad0f3fdb51039 Mon Sep 17 00:00:00 2001 From: Khanh Nguyen Date: Wed, 11 Dec 2024 19:02:04 +0700 Subject: [PATCH 04/12] Convert Primeface version --- sbb-connector-demo/.settings/ch.ivyteam.ivy.designer.prefs | 4 ++-- .../sbb/demo/InputTripSearchData/InputTripSearchData.xhtml | 2 +- sbb-connector-demo/webContent/layouts/frame-10.xhtml | 2 +- sbb-connector-test/.settings/ch.ivyteam.ivy.designer.prefs | 4 ++-- sbb-connector-webtest/.settings/ch.ivyteam.ivy.designer.prefs | 4 ++-- sbb-connector/.settings/ch.ivyteam.ivy.designer.prefs | 4 ++-- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/sbb-connector-demo/.settings/ch.ivyteam.ivy.designer.prefs b/sbb-connector-demo/.settings/ch.ivyteam.ivy.designer.prefs index f4d0770..e02c18b 100644 --- a/sbb-connector-demo/.settings/ch.ivyteam.ivy.designer.prefs +++ b/sbb-connector-demo/.settings/ch.ivyteam.ivy.designer.prefs @@ -1,5 +1,5 @@ ch.ivyteam.ivy.designer.preferences.DataClassPreferencePage\:DEFAULT_NAMESPACE=com.axonivy.connector.sbb.demo ch.ivyteam.ivy.designer.preferences.DataClassPreferencePage\:useProjectSettings=true -ch.ivyteam.ivy.project.preferences\:PRIMEFACES_VERSION=11 +ch.ivyteam.ivy.project.preferences\:PRIMEFACES_VERSION=13 ch.ivyteam.ivy.project.preferences\:PROJECT_VERSION=120001 -eclipse.preferences.version=1 \ No newline at end of file +eclipse.preferences.version=1 diff --git a/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/InputTripSearchData/InputTripSearchData.xhtml b/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/InputTripSearchData/InputTripSearchData.xhtml index b8b8fcb..9957cb2 100644 --- a/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/InputTripSearchData/InputTripSearchData.xhtml +++ b/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/InputTripSearchData/InputTripSearchData.xhtml @@ -50,7 +50,7 @@ - + diff --git a/sbb-connector-demo/webContent/layouts/frame-10.xhtml b/sbb-connector-demo/webContent/layouts/frame-10.xhtml index 936a73b..b6244a1 100644 --- a/sbb-connector-demo/webContent/layouts/frame-10.xhtml +++ b/sbb-connector-demo/webContent/layouts/frame-10.xhtml @@ -32,7 +32,7 @@ and refence it below in the head part. - + 12.0.0-SNAPSHOT pom + + UTF-8 + ${project.name} diff --git a/sbb-connector-demo/pom.xml b/sbb-connector-demo/pom.xml index 04fa238..1104de8 100644 --- a/sbb-connector-demo/pom.xml +++ b/sbb-connector-demo/pom.xml @@ -1,38 +1,41 @@ - - 4.0.0 - com.axonivy.connector.sbb - sbb-connector-demo - 12.0.0-SNAPSHOT - iar - - 12.0.0 - - - - sonatype - https://oss.sonatype.org/content/repositories/snapshots - - always - - - - - - com.axonivy.connector.sbb - sbb-connector - ${project.version} - iar - - - - - - com.axonivy.ivy.ci - project-build-plugin - ${project.build.plugin.version} - true - - - + + 4.0.0 + com.axonivy.connector.sbb + sbb-connector-demo + 12.0.0-SNAPSHOT + iar + + 12.0.0 + UTF-8 + + + + sonatype + https://oss.sonatype.org/content/repositories/snapshots + + always + + + + + + com.axonivy.connector.sbb + sbb-connector + ${project.version} + iar + + + + + + com.axonivy.ivy.ci + project-build-plugin + ${project.build.plugin.version} + true + + + diff --git a/sbb-connector-test/pom.xml b/sbb-connector-test/pom.xml index 1ac1f47..0977e38 100644 --- a/sbb-connector-test/pom.xml +++ b/sbb-connector-test/pom.xml @@ -8,6 +8,7 @@ 12.0.0 12.0.1 + UTF-8 diff --git a/sbb-connector-webtest/pom.xml b/sbb-connector-webtest/pom.xml index 2a58494..3a05cfd 100644 --- a/sbb-connector-webtest/pom.xml +++ b/sbb-connector-webtest/pom.xml @@ -1,32 +1,35 @@ - + 4.0.0 com.axonivy.connector.sbb sbb-connector-webtest 12.0.0-SNAPSHOT iar-integration-test - 12.0.0 - 12.0.1 - - - - sonatype - https://oss.sonatype.org/content/repositories/snapshots - - always - - - - - - sonatype - https://oss.sonatype.org/content/repositories/snapshots - - always - - - + 12.0.0 + 12.0.1 + UTF-8 + + + + sonatype + https://oss.sonatype.org/content/repositories/snapshots + + always + + + + + + sonatype + https://oss.sonatype.org/content/repositories/snapshots + + always + + + com.axonivy.connector.sbb diff --git a/sbb-connector/pom.xml b/sbb-connector/pom.xml index d105d37..656aa47 100644 --- a/sbb-connector/pom.xml +++ b/sbb-connector/pom.xml @@ -7,6 +7,7 @@ iar 12.0.0 + UTF-8 From 30b6fb9eb9806d7d87a6a47da29af2b502ad9b00 Mon Sep 17 00:00:00 2001 From: Khanh Nguyen Date: Thu, 12 Dec 2024 15:45:37 +0700 Subject: [PATCH 06/12] Fixing warnings --- sbb-connector-demo/config/variables.yaml | 7 ----- .../connector/sbb/demo/BookTripData.d.json | 6 ++--- .../InputTripSearchDataData.d.json | 27 +++++++------------ .../sbb/demo/ShowTrips/ShowTripsData.d.json | 6 ++--- sbb-connector-test/config/variables.yaml | 7 ----- .../sbb/location/GetLocationsData.d.json | 6 ++--- .../connector/sbb/trip/GetTripsData.d.json | 3 +-- 7 files changed, 16 insertions(+), 46 deletions(-) diff --git a/sbb-connector-demo/config/variables.yaml b/sbb-connector-demo/config/variables.yaml index 3d0b275..e96d3ef 100644 --- a/sbb-connector-demo/config/variables.yaml +++ b/sbb-connector-demo/config/variables.yaml @@ -1,9 +1,2 @@ # yaml-language-server: $schema=https://json-schema.axonivy.com/app/12.0.0/variables.json Variables: - sbbConnector: - uri: https://b2p.app.sbb.ch - contractId: DEMO - clientId: DEMO - clientSecret: DEMO - tokenEndpoint: DEMO - scope: DEMO diff --git a/sbb-connector-demo/dataclasses/com/axonivy/connector/sbb/demo/BookTripData.d.json b/sbb-connector-demo/dataclasses/com/axonivy/connector/sbb/demo/BookTripData.d.json index dcc3384..6bd9e62 100644 --- a/sbb-connector-demo/dataclasses/com/axonivy/connector/sbb/demo/BookTripData.d.json +++ b/sbb-connector-demo/dataclasses/com/axonivy/connector/sbb/demo/BookTripData.d.json @@ -6,12 +6,10 @@ "fields" : [ { "name" : "getTripsDataIn", "type" : "com.axonivy.connector.sbb.trip.GetTripsDataIn", - "comment" : "Argument for subprocess GetTrips.", - "modifiers" : [ "PERSISTENT" ] + "comment" : "Argument for subprocess GetTrips." }, { "name" : "trips", "type" : "List", - "comment" : "Return value for subprocess GetTrips.", - "modifiers" : [ "PERSISTENT" ] + "comment" : "Return value for subprocess GetTrips." } ] } \ No newline at end of file diff --git a/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/InputTripSearchData/InputTripSearchDataData.d.json b/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/InputTripSearchData/InputTripSearchDataData.d.json index 5f4fafd..f613cc4 100644 --- a/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/InputTripSearchData/InputTripSearchDataData.d.json +++ b/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/InputTripSearchData/InputTripSearchDataData.d.json @@ -6,47 +6,38 @@ "fields" : [ { "name" : "getLocationsDataIn", "type" : "com.axonivy.connector.sbb.location.GetLocationsDataIn", - "comment" : "Argument for subprocess GetLocations.", - "modifiers" : [ "PERSISTENT" ] + "comment" : "Argument for subprocess GetLocations." }, { "name" : "locations", "type" : "List", - "comment" : "Return value of subprocess GetLocations.", - "modifiers" : [ "PERSISTENT" ] + "comment" : "Return value of subprocess GetLocations." }, { "name" : "locationNames", "type" : "List", - "comment" : "List of Location names returned by subprocess GetLocations. Used for autocomplete dropdown menu of input fields From and To.", - "modifiers" : [ "PERSISTENT" ] + "comment" : "List of Location names returned by subprocess GetLocations. Used for autocomplete dropdown menu of input fields From and To." }, { "name" : "locationFrom", "type" : "ch.sbb.app.b2p.client.Location", - "comment" : "Selected Location from autocomplete dropdown menu of input field From.", - "modifiers" : [ "PERSISTENT" ] + "comment" : "Selected Location from autocomplete dropdown menu of input field From." }, { "name" : "locationTo", "type" : "ch.sbb.app.b2p.client.Location", - "comment" : "Selected Location from autocomplete dropdown menu of input field To.", - "modifiers" : [ "PERSISTENT" ] + "comment" : "Selected Location from autocomplete dropdown menu of input field To." }, { "name" : "selectEvent", "type" : "org.primefaces.event.SelectEvent", - "comment" : "Event triggered by selection of Location name in autocomplete dropdown menu to set locationFrom or locationTo.", - "modifiers" : [ "PERSISTENT" ] + "comment" : "Event triggered by selection of Location name in autocomplete dropdown menu to set locationFrom or locationTo." }, { "name" : "time", "type" : "Time", - "comment" : "Content of input field Time.", - "modifiers" : [ "PERSISTENT" ] + "comment" : "Content of input field Time." }, { "name" : "arrival", "type" : "Boolean", - "comment" : "Flag to determine whether to search for earliest departure or latest arrival at given date and time. False: Earliest departure; True: Latest arrival", - "modifiers" : [ "PERSISTENT" ] + "comment" : "Flag to determine whether to search for earliest departure or latest arrival at given date and time. False: Earliest departure; True: Latest arrival" }, { "name" : "getTripsDataIn", "type" : "com.axonivy.connector.sbb.trip.GetTripsDataIn", - "comment" : "Argument for subprocess GetTrips.", - "modifiers" : [ "PERSISTENT" ] + "comment" : "Argument for subprocess GetTrips." } ] } \ No newline at end of file diff --git a/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/ShowTrips/ShowTripsData.d.json b/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/ShowTrips/ShowTripsData.d.json index ce9c7c1..a2d92b8 100644 --- a/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/ShowTrips/ShowTripsData.d.json +++ b/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/ShowTrips/ShowTripsData.d.json @@ -6,12 +6,10 @@ "fields" : [ { "name" : "trips", "type" : "List", - "comment" : "Trips as received from Swiss Mobility API.", - "modifiers" : [ "PERSISTENT" ] + "comment" : "Trips as received from Swiss Mobility API." }, { "name" : "tripsForDisplay", "type" : "List", - "comment" : "Trips parsed for displaying in user dialog.", - "modifiers" : [ "PERSISTENT" ] + "comment" : "Trips parsed for displaying in user dialog." } ] } \ No newline at end of file diff --git a/sbb-connector-test/config/variables.yaml b/sbb-connector-test/config/variables.yaml index 3d0b275..e96d3ef 100644 --- a/sbb-connector-test/config/variables.yaml +++ b/sbb-connector-test/config/variables.yaml @@ -1,9 +1,2 @@ # yaml-language-server: $schema=https://json-schema.axonivy.com/app/12.0.0/variables.json Variables: - sbbConnector: - uri: https://b2p.app.sbb.ch - contractId: DEMO - clientId: DEMO - clientSecret: DEMO - tokenEndpoint: DEMO - scope: DEMO diff --git a/sbb-connector/dataclasses/com/axonivy/connector/sbb/location/GetLocationsData.d.json b/sbb-connector/dataclasses/com/axonivy/connector/sbb/location/GetLocationsData.d.json index 2432e01..56b67a7 100644 --- a/sbb-connector/dataclasses/com/axonivy/connector/sbb/location/GetLocationsData.d.json +++ b/sbb-connector/dataclasses/com/axonivy/connector/sbb/location/GetLocationsData.d.json @@ -6,12 +6,10 @@ "fields" : [ { "name" : "in", "type" : "com.axonivy.connector.sbb.location.GetLocationsDataIn", - "comment" : "Argument for subprocess GetLocations.", - "modifiers" : [ "PERSISTENT" ] + "comment" : "Argument for subprocess GetLocations." }, { "name" : "locations", "type" : "List", - "comment" : "Return value of subprocess GetLocations.", - "modifiers" : [ "PERSISTENT" ] + "comment" : "Return value of subprocess GetLocations." } ] } \ No newline at end of file diff --git a/sbb-connector/dataclasses/com/axonivy/connector/sbb/trip/GetTripsData.d.json b/sbb-connector/dataclasses/com/axonivy/connector/sbb/trip/GetTripsData.d.json index abe3303..5d02c85 100644 --- a/sbb-connector/dataclasses/com/axonivy/connector/sbb/trip/GetTripsData.d.json +++ b/sbb-connector/dataclasses/com/axonivy/connector/sbb/trip/GetTripsData.d.json @@ -11,7 +11,6 @@ }, { "name" : "trips", "type" : "List", - "comment" : "Return value of subprocess GetTrips.", - "modifiers" : [ "PERSISTENT" ] + "comment" : "Return value of subprocess GetTrips." } ] } \ No newline at end of file From 7fffaa1a63704979fbc405f14ff3382f41b06fcf Mon Sep 17 00:00:00 2001 From: Khanh Nguyen Date: Thu, 12 Dec 2024 16:18:05 +0700 Subject: [PATCH 07/12] Update Encoding --- sbb-connector-demo/.settings/org.eclipse.core.resources.prefs | 2 ++ sbb-connector-test/.settings/org.eclipse.core.resources.prefs | 2 ++ .../.settings/org.eclipse.core.resources.prefs | 2 ++ sbb-connector/.settings/org.eclipse.core.resources.prefs | 2 ++ 4 files changed, 8 insertions(+) create mode 100644 sbb-connector-demo/.settings/org.eclipse.core.resources.prefs create mode 100644 sbb-connector-test/.settings/org.eclipse.core.resources.prefs create mode 100644 sbb-connector-webtest/.settings/org.eclipse.core.resources.prefs create mode 100644 sbb-connector/.settings/org.eclipse.core.resources.prefs diff --git a/sbb-connector-demo/.settings/org.eclipse.core.resources.prefs b/sbb-connector-demo/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..99f26c0 --- /dev/null +++ b/sbb-connector-demo/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/sbb-connector-test/.settings/org.eclipse.core.resources.prefs b/sbb-connector-test/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..99f26c0 --- /dev/null +++ b/sbb-connector-test/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/sbb-connector-webtest/.settings/org.eclipse.core.resources.prefs b/sbb-connector-webtest/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..99f26c0 --- /dev/null +++ b/sbb-connector-webtest/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/sbb-connector/.settings/org.eclipse.core.resources.prefs b/sbb-connector/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..99f26c0 --- /dev/null +++ b/sbb-connector/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 From 93a6f75b29543b9be8cdc3b2d877eb97b2b1e8af Mon Sep 17 00:00:00 2001 From: Khanh Nguyen Date: Thu, 12 Dec 2024 18:16:57 +0700 Subject: [PATCH 08/12] Update encoding config --- .settings/org.eclipse.core.resources.prefs | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .settings/org.eclipse.core.resources.prefs diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..99f26c0 --- /dev/null +++ b/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 From 22f8bc99ed1fd70201fa1b90bde9eeb233a43710 Mon Sep 17 00:00:00 2001 From: PHAM HOANG HUNG Date: Thu, 2 Jan 2025 11:52:01 +0700 Subject: [PATCH 09/12] MARP-922 MARP-799 SBB connector needs update for new API --- sbb-connector-demo/cms/cms_en.yaml | 2 +- sbb-connector-demo/config/variables.yaml | 18 + .../connector/sbb/demo/BookTripData.d.json | 8 +- .../sbb/demo/trip/SegmentForDisplay.d.json | 25 +- .../sbb/demo/trip/StopFromForDisplay.d.json | 21 +- .../sbb/demo/trip/StopToForDisplay.d.json | 21 +- .../sbb/demo/trip/TripForDisplay.d.json | 27 +- sbb-connector-demo/processes/BookTrip.p.json | 10 +- .../connector/sbb/demo/trip/PlaceUtils.java | 79 +++ .../InputTripSearchData.xhtml | 41 +- .../InputTripSearchDataData.d.json | 33 +- .../InputTripSearchDataProcess.p.json | 73 ++- .../sbb/demo/ShowTrips/ShowTrips.xhtml | 38 +- .../sbb/demo/ShowTrips/ShowTripsData.d.json | 2 +- .../demo/ShowTrips/ShowTripsProcess.p.json | 150 ++---- sbb-connector-test/pom.xml | 113 ++--- .../connector/sbb/test/constant/Constant.java | 15 + .../sbb/test/location/TestGetLocations.java | 116 ----- .../sbb/test/place/TestGetPlaces.java | 109 +++++ .../connector/sbb/test/trip/TestGetTrips.java | 461 +++++------------- .../sbb/webtest/trip/ITBookTrip.java | 361 ++++---------- sbb-connector/.classpath | 3 +- sbb-connector/config/rest-clients.yaml | 20 +- sbb-connector/config/variables.yaml | 4 + .../connector/sbb/place/GetPlacesData.d.json | 14 + .../sbb/place/GetPlacesDataHeaders.d.json | 23 + .../sbb/place/GetPlacesDataIn.d.json | 13 + .../sbb/place/GetPlacesDataParameters.d.json | 20 + .../GetTripsCollectionData.d.json | 14 + .../GetTripsCollectionDataHeaders.d.json | 23 + .../GetTripsCollectionDataIn.d.json | 13 + .../GetTripsCollectionDataParameters.d.json | 34 ++ ...t_13022aee-0653-4076-b253-a87b352403c8.jar | Bin 0 -> 274444 bytes sbb-connector/processes/GetLocations.p.json | 3 +- sbb-connector/processes/GetPlaces.p.json | 91 ++++ sbb-connector/processes/GetTrips.p.json | 3 +- .../processes/GetTripsCollection.p.json | 96 ++++ .../rest/osdmdata/OSDMDataJsonFeature.java | 34 ++ .../osdmdata/OSDMDataTypeCustomizations.java | 19 + ...eOfTripSearchCriteriaOriginSerializer.java | 55 +++ .../osdmdata/PlaceResponseDeserializer.java | 80 +++ .../TripCollectionResponseDeserializer.java | 55 +++ .../connector/sbb/constant/Constant.java | 8 + .../connector/sbb/utils/DateUtils.java | 15 + 44 files changed, 1296 insertions(+), 1067 deletions(-) create mode 100644 sbb-connector-demo/src/com/axonivy/connector/sbb/demo/trip/PlaceUtils.java create mode 100644 sbb-connector-test/src_test/com/axonivy/connector/sbb/test/constant/Constant.java delete mode 100644 sbb-connector-test/src_test/com/axonivy/connector/sbb/test/location/TestGetLocations.java create mode 100644 sbb-connector-test/src_test/com/axonivy/connector/sbb/test/place/TestGetPlaces.java create mode 100644 sbb-connector/dataclasses/com/axonivy/connector/sbb/place/GetPlacesData.d.json create mode 100644 sbb-connector/dataclasses/com/axonivy/connector/sbb/place/GetPlacesDataHeaders.d.json create mode 100644 sbb-connector/dataclasses/com/axonivy/connector/sbb/place/GetPlacesDataIn.d.json create mode 100644 sbb-connector/dataclasses/com/axonivy/connector/sbb/place/GetPlacesDataParameters.d.json create mode 100644 sbb-connector/dataclasses/com/axonivy/connector/sbb/tripscollection/GetTripsCollectionData.d.json create mode 100644 sbb-connector/dataclasses/com/axonivy/connector/sbb/tripscollection/GetTripsCollectionDataHeaders.d.json create mode 100644 sbb-connector/dataclasses/com/axonivy/connector/sbb/tripscollection/GetTripsCollectionDataIn.d.json create mode 100644 sbb-connector/dataclasses/com/axonivy/connector/sbb/tripscollection/GetTripsCollectionDataParameters.d.json create mode 100644 sbb-connector/lib/generated/rest/jaxRsClient_13022aee-0653-4076-b253-a87b352403c8.jar create mode 100644 sbb-connector/processes/GetPlaces.p.json create mode 100644 sbb-connector/processes/GetTripsCollection.p.json create mode 100644 sbb-connector/src/com/axonivy/connector/sbb/connector/rest/osdmdata/OSDMDataJsonFeature.java create mode 100644 sbb-connector/src/com/axonivy/connector/sbb/connector/rest/osdmdata/OSDMDataTypeCustomizations.java create mode 100644 sbb-connector/src/com/axonivy/connector/sbb/connector/rest/osdmdata/OneOfTripSearchCriteriaOriginSerializer.java create mode 100644 sbb-connector/src/com/axonivy/connector/sbb/connector/rest/osdmdata/PlaceResponseDeserializer.java create mode 100644 sbb-connector/src/com/axonivy/connector/sbb/connector/rest/osdmdata/TripCollectionResponseDeserializer.java create mode 100644 sbb-connector/src/com/axonivy/connector/sbb/constant/Constant.java create mode 100644 sbb-connector/src/com/axonivy/connector/sbb/utils/DateUtils.java diff --git a/sbb-connector-demo/cms/cms_en.yaml b/sbb-connector-demo/cms/cms_en.yaml index 8a8b6d4..e1b3d02 100644 --- a/sbb-connector-demo/cms/cms_en.yaml +++ b/sbb-connector-demo/cms/cms_en.yaml @@ -1,2 +1,2 @@ -demoInfoMessage: This demo uses the Sandbox URI of the Swiss Mobility API, which will only return the Location Bern and a Trip from Bern to Zürich HB. In case you already have access to the Swiss Mobility API, you can substitute your credentials and the other neccessary information in the variables.yaml +demoInfoMessage: This demo uses the Sandbox URI of the Journey Swiss Mobility API, which will only return a list of places and a list of trips. In case you already have access to the Journey Swiss Mobility API, you can substitute your credentials and the other neccessary information in the variables.yaml file of this demo project as explained in the setup section of the documentation for a fully working demonstration. diff --git a/sbb-connector-demo/config/variables.yaml b/sbb-connector-demo/config/variables.yaml index e96d3ef..b64a603 100644 --- a/sbb-connector-demo/config/variables.yaml +++ b/sbb-connector-demo/config/variables.yaml @@ -1,2 +1,20 @@ # yaml-language-server: $schema=https://json-schema.axonivy.com/app/12.0.0/variables.json Variables: + sbbConnector: + # The URI of the API to use. For example: `https://b2p-int.api.sbb.ch` (integration) or `https://b2p.api.sbb.ch` (production) + uri: '' + # The contract id provided to you by SBB. For Example: `ACP1024` + contractId: '' + # The client id provided to you by SBB. For Example: `01234567-89ab-cdef-0123-456789abcdef` + clientId: DEMO + # The client secret provided to you by SBB. + #[password] + clientSecret: ${decrypt:} + # The endpoint for acquiring the bearer token using your client id and secret. For Example: `https://login.microsoftonline.com/2cda5d11-f0ac-46b3-967d-af1b2e1bd01a/oauth2/v2.0` + tokenEndpoint: '' + # The scope provided to you by SBB. + scope: '' + # The URI of the Journey SBB Swiss Mobility API to use . For example: `https://smapi-osdm-journey-int.api.sbb.ch` (integration) or `https://smapi-osdm-journey.api.sbb.ch` (production) + journeyUri: 'https://smapi-osdm-journey-mock.app.sbb.ch' + # The requestor header contains detailed information about who is calling the API. It can include information such as channel, organization, sales unit or workstation id and be used to configure e.g. the fare range provided to the caller. The content of the string is part of a bilateral contract by the two parties and not standardized by OSDM. It is recommend to encrypt the information transferred. + requestor: 'tester' diff --git a/sbb-connector-demo/dataclasses/com/axonivy/connector/sbb/demo/BookTripData.d.json b/sbb-connector-demo/dataclasses/com/axonivy/connector/sbb/demo/BookTripData.d.json index 6bd9e62..e9f029e 100644 --- a/sbb-connector-demo/dataclasses/com/axonivy/connector/sbb/demo/BookTripData.d.json +++ b/sbb-connector-demo/dataclasses/com/axonivy/connector/sbb/demo/BookTripData.d.json @@ -4,12 +4,10 @@ "namespace" : "com.axonivy.connector.sbb.demo", "isBusinessCaseData" : false, "fields" : [ { - "name" : "getTripsDataIn", - "type" : "com.axonivy.connector.sbb.trip.GetTripsDataIn", - "comment" : "Argument for subprocess GetTrips." + "name" : "getTripsCollectionDataIn", + "type" : "com.axonivy.connector.sbb.tripscollection.GetTripsCollectionDataIn" }, { "name" : "trips", - "type" : "List", - "comment" : "Return value for subprocess GetTrips." + "type" : "List" } ] } \ No newline at end of file diff --git a/sbb-connector-demo/dataclasses/com/axonivy/connector/sbb/demo/trip/SegmentForDisplay.d.json b/sbb-connector-demo/dataclasses/com/axonivy/connector/sbb/demo/trip/SegmentForDisplay.d.json index c75c525..adc19b9 100644 --- a/sbb-connector-demo/dataclasses/com/axonivy/connector/sbb/demo/trip/SegmentForDisplay.d.json +++ b/sbb-connector-demo/dataclasses/com/axonivy/connector/sbb/demo/trip/SegmentForDisplay.d.json @@ -6,27 +6,30 @@ "fields" : [ { "name" : "iconClass", "type" : "String", - "comment" : "Class of icon to represent segment.", - "modifiers" : [ "PERSISTENT" ] + "comment" : "Class of icon to represent segment." }, { "name" : "stopFrom", "type" : "com.axonivy.connector.sbb.demo.trip.StopFromForDisplay", - "comment" : "First stop in segment.", - "modifiers" : [ "PERSISTENT" ] + "comment" : "First stop in segment." }, { "name" : "stopTo", "type" : "com.axonivy.connector.sbb.demo.trip.StopToForDisplay", - "comment" : "Last stop in segment.", - "modifiers" : [ "PERSISTENT" ] + "comment" : "Last stop in segment." }, { - "name" : "transportProductName", + "name" : "transportName", "type" : "String", - "comment" : "Operator specific name of vehicle.", - "modifiers" : [ "PERSISTENT" ] + "comment" : "Operator specific name of vehicle." }, { "name" : "direction", "type" : "String", - "comment" : "Last station of the associated transportProduct's journey.", - "modifiers" : [ "PERSISTENT" ] + "comment" : "Last station of the associated transportProduct's journey." + }, { + "name" : "transportDescription", + "type" : "String", + "comment" : "Operator specific description of vehicle." + }, { + "name" : "publishedServiceName", + "type" : "String", + "comment" : "Transport type of vehicle, line number and vehicle number" } ] } \ No newline at end of file diff --git a/sbb-connector-demo/dataclasses/com/axonivy/connector/sbb/demo/trip/StopFromForDisplay.d.json b/sbb-connector-demo/dataclasses/com/axonivy/connector/sbb/demo/trip/StopFromForDisplay.d.json index 6defe9b..8251310 100644 --- a/sbb-connector-demo/dataclasses/com/axonivy/connector/sbb/demo/trip/StopFromForDisplay.d.json +++ b/sbb-connector-demo/dataclasses/com/axonivy/connector/sbb/demo/trip/StopFromForDisplay.d.json @@ -6,37 +6,30 @@ "fields" : [ { "name" : "name", "type" : "String", - "comment" : "Name of Stop.", - "modifiers" : [ "PERSISTENT" ] + "comment" : "Name of Stop." }, { "name" : "departureDateTime", "type" : "java.time.OffsetDateTime", - "comment" : "Departure dateTime in realtime.", - "modifiers" : [ "PERSISTENT" ] + "comment" : "Departure dateTime in realtime." }, { "name" : "departureDate", "type" : "String", - "comment" : "Departure date in realtime parsed for displaying in user dialog.", - "modifiers" : [ "PERSISTENT" ] + "comment" : "Departure date in realtime parsed for displaying in user dialog." }, { "name" : "departureTime", "type" : "String", - "comment" : "Departure time in realtime parsed for displaying in user dialog.", - "modifiers" : [ "PERSISTENT" ] + "comment" : "Departure time in realtime parsed for displaying in user dialog." }, { "name" : "departureDelay", "type" : "String", - "comment" : "Departure delay in realtime parsed for displaying in user dialog.", - "modifiers" : [ "PERSISTENT" ] + "comment" : "Departure delay in realtime parsed for displaying in user dialog." }, { "name" : "departurePlatform", "type" : "String", - "comment" : "Departing platform in realtime.", - "modifiers" : [ "PERSISTENT" ] + "comment" : "Departing platform in realtime." }, { "name" : "departurePlatformChanged", "type" : "Boolean", - "comment" : "Flag to determine whether departurePlatform has changed in comparison to planned departurePlatform.", - "modifiers" : [ "PERSISTENT" ] + "comment" : "Flag to determine whether departurePlatform has changed in comparison to planned departurePlatform." } ] } \ No newline at end of file diff --git a/sbb-connector-demo/dataclasses/com/axonivy/connector/sbb/demo/trip/StopToForDisplay.d.json b/sbb-connector-demo/dataclasses/com/axonivy/connector/sbb/demo/trip/StopToForDisplay.d.json index 44f2992..eb8ddaf 100644 --- a/sbb-connector-demo/dataclasses/com/axonivy/connector/sbb/demo/trip/StopToForDisplay.d.json +++ b/sbb-connector-demo/dataclasses/com/axonivy/connector/sbb/demo/trip/StopToForDisplay.d.json @@ -6,37 +6,30 @@ "fields" : [ { "name" : "name", "type" : "String", - "comment" : "Name of Stop.", - "modifiers" : [ "PERSISTENT" ] + "comment" : "Name of Stop." }, { "name" : "arrivalDateTime", "type" : "java.time.OffsetDateTime", - "comment" : "Arrival dateTime in realtime.", - "modifiers" : [ "PERSISTENT" ] + "comment" : "Arrival dateTime in realtime." }, { "name" : "arrivalDate", "type" : "String", - "comment" : "Arrival date in realtime parsed for displaying in user dialog.", - "modifiers" : [ "PERSISTENT" ] + "comment" : "Arrival date in realtime parsed for displaying in user dialog." }, { "name" : "arrivalTime", "type" : "String", - "comment" : "Arrival time in realtime parsed for displaying in user dialog.", - "modifiers" : [ "PERSISTENT" ] + "comment" : "Arrival time in realtime parsed for displaying in user dialog." }, { "name" : "arrivalDelay", "type" : "String", - "comment" : "Arrival delay in realtime parsed for displaying in user dialog.", - "modifiers" : [ "PERSISTENT" ] + "comment" : "Arrival delay in realtime parsed for displaying in user dialog." }, { "name" : "arrivalPlatform", "type" : "String", - "comment" : "Arrival platform in realtime.", - "modifiers" : [ "PERSISTENT" ] + "comment" : "Arrival platform in realtime." }, { "name" : "arrivalPlatformChanged", "type" : "Boolean", - "comment" : "Flag to determine whether arrivalPlatform has changed in comparison to planned departurePlatform.", - "modifiers" : [ "PERSISTENT" ] + "comment" : "Flag to determine whether arrivalPlatform has changed in comparison to planned departurePlatform." } ] } \ No newline at end of file diff --git a/sbb-connector-demo/dataclasses/com/axonivy/connector/sbb/demo/trip/TripForDisplay.d.json b/sbb-connector-demo/dataclasses/com/axonivy/connector/sbb/demo/trip/TripForDisplay.d.json index 8028cb8..1ed5b3c 100644 --- a/sbb-connector-demo/dataclasses/com/axonivy/connector/sbb/demo/trip/TripForDisplay.d.json +++ b/sbb-connector-demo/dataclasses/com/axonivy/connector/sbb/demo/trip/TripForDisplay.d.json @@ -6,47 +6,38 @@ "fields" : [ { "name" : "onlineOffersLink", "type" : "String", - "comment" : "Link to offers on website of SBB.", - "modifiers" : [ "PERSISTENT" ] + "comment" : "Link to offers on website of SBB." }, { "name" : "segments", "type" : "List", - "comment" : "The segments of the trip and its stops parsed for displaying in user dialog.", - "modifiers" : [ "PERSISTENT" ] + "comment" : "The segments of the trip and its stops parsed for displaying in user dialog." }, { "name" : "departureDate", "type" : "String", - "comment" : "Departure date in realtime parsed for displaying in user dialog.", - "modifiers" : [ "PERSISTENT" ] + "comment" : "Departure date in realtime parsed for displaying in user dialog." }, { "name" : "departureTime", "type" : "String", - "comment" : "Departure time in realtime parsed for displaying in user dialog.", - "modifiers" : [ "PERSISTENT" ] + "comment" : "Departure time in realtime parsed for displaying in user dialog." }, { "name" : "departureDelay", "type" : "String", - "comment" : "Departure delay in realtime parsed for displaying in user dialog.", - "modifiers" : [ "PERSISTENT" ] + "comment" : "Departure delay in realtime parsed for displaying in user dialog." }, { "name" : "arrivalDate", "type" : "String", - "comment" : "Arrival date in realtime parsed for displaying in user dialog.", - "modifiers" : [ "PERSISTENT" ] + "comment" : "Arrival date in realtime parsed for displaying in user dialog." }, { "name" : "arrivalTime", "type" : "String", - "comment" : "Arrival time in realtime parsed for displaying in user dialog.", - "modifiers" : [ "PERSISTENT" ] + "comment" : "Arrival time in realtime parsed for displaying in user dialog." }, { "name" : "arrivalDelay", "type" : "String", - "comment" : "Arrival delay in realtime parsed for displaying in user dialog.", - "modifiers" : [ "PERSISTENT" ] + "comment" : "Arrival delay in realtime parsed for displaying in user dialog." }, { "name" : "duration", "type" : "String", - "comment" : "Duration of the trip in realtime parsed for displaying in user dialog.", - "modifiers" : [ "PERSISTENT" ] + "comment" : "Duration of the trip in realtime parsed for displaying in user dialog." } ] } \ No newline at end of file diff --git a/sbb-connector-demo/processes/BookTrip.p.json b/sbb-connector-demo/processes/BookTrip.p.json index 650dec0..1098143 100644 --- a/sbb-connector-demo/processes/BookTrip.p.json +++ b/sbb-connector-demo/processes/BookTrip.p.json @@ -39,14 +39,13 @@ "dialog" : "com.axonivy.connector.sbb.demo.InputTripSearchData:start(com.axonivy.connector.sbb.trip.GetTripsDataIn)", "call" : { "map" : { - "param.getTripsDataIn" : "in.getTripsDataIn", "param.getTripsDataIn.parameters.date" : "new Date()" } }, "output" : { "map" : { "out" : "in", - "out.getTripsDataIn" : "result.getTripsDataIn" + "out.getTripsCollectionDataIn" : "result.getTripsCollectionDataIn" } } }, @@ -61,11 +60,10 @@ "type" : "SubProcessCall", "name" : "Get Trips", "config" : { - "processCall" : "GetTrips:call(com.axonivy.connector.sbb.trip.GetTripsDataIn)", + "processCall" : "GetTripsCollection:call(com.axonivy.connector.sbb.tripscollection.GetTripsCollectionDataIn)", "call" : { "map" : { - "param.in" : "in.getTripsDataIn", - "param.in.parameters.includeAfter" : "5" + "param.getTripsCollectionDataIn" : "in.getTripsCollectionDataIn" } }, "output" : { @@ -87,7 +85,7 @@ "type" : "DialogCall", "name" : "Show Trips", "config" : { - "dialog" : "com.axonivy.connector.sbb.demo.ShowTrips:start(List)", + "dialog" : "com.axonivy.connector.sbb.demo.ShowTrips:start(List)", "call" : { "map" : { "param.trips" : "in.trips" diff --git a/sbb-connector-demo/src/com/axonivy/connector/sbb/demo/trip/PlaceUtils.java b/sbb-connector-demo/src/com/axonivy/connector/sbb/demo/trip/PlaceUtils.java new file mode 100644 index 0000000..250976d --- /dev/null +++ b/sbb-connector-demo/src/com/axonivy/connector/sbb/demo/trip/PlaceUtils.java @@ -0,0 +1,79 @@ +package com.axonivy.connector.sbb.demo.trip; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.commons.lang3.StringUtils; + +import ch.sbb.api.smapi.osdm.journey.client.Address; +import ch.sbb.api.smapi.osdm.journey.client.FareConnectionPoint; +import ch.sbb.api.smapi.osdm.journey.client.OneOfPlaceResponsePlacesItems; +import ch.sbb.api.smapi.osdm.journey.client.OneOfTripSearchCriteriaDestination; +import ch.sbb.api.smapi.osdm.journey.client.OneOfTripSearchCriteriaOrigin; +import ch.sbb.api.smapi.osdm.journey.client.PointOfInterest; +import ch.sbb.api.smapi.osdm.journey.client.StopPlace; + +public class PlaceUtils { + + public static List getNameOfPlaces(List places) { + List placeNames = new ArrayList<>(); + + for (OneOfPlaceResponsePlacesItems place : places) { + if (place instanceof StopPlace) { + StopPlace sp = (StopPlace) place; + placeNames.add(sp.getName()); + } else if (place instanceof Address) { + Address address = (Address) place; + placeNames.add(address.getName()); + } else if (place instanceof PointOfInterest) { + PointOfInterest poi = (PointOfInterest) place; + placeNames.add(poi.getName()); + } else if (place instanceof FareConnectionPoint) { + FareConnectionPoint fcp = (FareConnectionPoint) place; + placeNames.add(fcp.getName()); + } + } + + return placeNames; + } + + public static OneOfTripSearchCriteriaOrigin getTripSearchCriteriaOrigin(List places, + String nameOfPlace) { + Object obj = getObjectInPlaces(places, nameOfPlace); + return obj != null ? (OneOfTripSearchCriteriaOrigin) obj : null; + } + + public static OneOfTripSearchCriteriaDestination getTripSearchCriteriaDestination( + List places, String nameOfPlace) { + Object obj = getObjectInPlaces(places, nameOfPlace); + return obj != null ? (OneOfTripSearchCriteriaDestination) obj : null; + } + + private static Object getObjectInPlaces(List places, String nameOfPlace) { + for (OneOfPlaceResponsePlacesItems place : places) { + if (place instanceof StopPlace) { + StopPlace sp = (StopPlace) place; + if (StringUtils.equals(nameOfPlace, sp.getName())) { + return sp.getRef(); + } + } else if (place instanceof Address) { + Address address = (Address) place; + if (StringUtils.equals(nameOfPlace, address.getName())) { + return address.getRef(); + } + } else if (place instanceof PointOfInterest) { + PointOfInterest poi = (PointOfInterest) place; + if (StringUtils.equals(nameOfPlace, poi.getName())) { + return poi.getRef(); + } + } else if (place instanceof FareConnectionPoint) { + FareConnectionPoint fcp = (FareConnectionPoint) place; + if (StringUtils.equals(nameOfPlace, fcp.getName())) { + return fcp.getRef(); + } + } + } + + return null; + } +} diff --git a/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/InputTripSearchData/InputTripSearchData.xhtml b/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/InputTripSearchData/InputTripSearchData.xhtml index 9957cb2..44a3b48 100644 --- a/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/InputTripSearchData/InputTripSearchData.xhtml +++ b/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/InputTripSearchData/InputTripSearchData.xhtml @@ -23,39 +23,30 @@ columnClasses="ui-g-12 ui-md-3 ui-lg-2, ui-g-12 ui-md-9 ui-lg-4, ui-g-12 ui-md-3 ui-lg-2, ui-g-12 ui-md-9 ui-lg-4"> - - + + - - + + - - - + + + - - - + + + - - - - - - - -
diff --git a/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/InputTripSearchData/InputTripSearchDataData.d.json b/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/InputTripSearchData/InputTripSearchDataData.d.json index f613cc4..6c3737e 100644 --- a/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/InputTripSearchData/InputTripSearchDataData.d.json +++ b/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/InputTripSearchData/InputTripSearchDataData.d.json @@ -4,9 +4,8 @@ "namespace" : "com.axonivy.connector.sbb.demo.InputTripSearchData", "isBusinessCaseData" : false, "fields" : [ { - "name" : "getLocationsDataIn", - "type" : "com.axonivy.connector.sbb.location.GetLocationsDataIn", - "comment" : "Argument for subprocess GetLocations." + "name" : "getPlacesDataIn", + "type" : "com.axonivy.connector.sbb.place.GetPlacesDataIn" }, { "name" : "locations", "type" : "List", @@ -39,5 +38,33 @@ "name" : "getTripsDataIn", "type" : "com.axonivy.connector.sbb.trip.GetTripsDataIn", "comment" : "Argument for subprocess GetTrips." + }, { + "name" : "places", + "type" : "List" + }, { + "name" : "placeFrom", + "type" : "ch.sbb.api.smapi.osdm.journey.client.OneOfPlaceResponsePlacesItems" + }, { + "name" : "placeTo", + "type" : "ch.sbb.api.smapi.osdm.journey.client.OneOfPlaceResponsePlacesItems" + }, { + "name" : "selectedPlace", + "type" : "ch.sbb.api.smapi.osdm.journey.client.OneOfPlaceResponsePlacesItems" + }, { + "name" : "getTripsCollectionDataIn", + "type" : "com.axonivy.connector.sbb.tripscollection.GetTripsCollectionDataIn" + }, { + "name" : "departureDate", + "type" : "java.util.Date", + "modifiers" : [ "PERSISTENT" ] + }, { + "name" : "arrivalDate", + "type" : "java.util.Date" + }, { + "name" : "origin", + "type" : "String" + }, { + "name" : "destination", + "type" : "String" } ] } \ No newline at end of file diff --git a/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/InputTripSearchData/InputTripSearchDataProcess.p.json b/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/InputTripSearchData/InputTripSearchDataProcess.p.json index ddbbadb..bd0c364 100644 --- a/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/InputTripSearchData/InputTripSearchDataProcess.p.json +++ b/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/InputTripSearchData/InputTripSearchDataProcess.p.json @@ -16,18 +16,15 @@ { "name" : "getTripsDataIn", "type" : "com.axonivy.connector.sbb.trip.GetTripsDataIn", "desc" : "" } ], "map" : { - "out.getTripsDataIn" : "param.getTripsDataIn", - "out.locationFrom" : "new ch.sbb.app.b2p.client.Location()", - "out.locationTo" : "new ch.sbb.app.b2p.client.Location()", "out.time" : "new Time()" } }, "result" : { "params" : [ - { "name" : "getTripsDataIn", "type" : "com.axonivy.connector.sbb.trip.GetTripsDataIn", "desc" : "" } + { "name" : "getTripsCollectionDataIn", "type" : "com.axonivy.connector.sbb.tripscollection.GetTripsCollectionDataIn", "desc" : "" } ], "map" : { - "result.getTripsDataIn" : "in.getTripsDataIn" + "result.getTripsCollectionDataIn" : "in.getTripsCollectionDataIn" } }, "guid" : "189FE362F85F241B" @@ -71,14 +68,9 @@ "output" : { "map" : { "out" : "in", - "out.getTripsDataIn" : "in.getTripsDataIn", - "out.getTripsDataIn.parameters.destinationId" : "in.locationTo.id", - "out.getTripsDataIn.parameters.originId" : "in.locationFrom.id" - }, - "code" : [ - "in.getTripsDataIn.parameters.time = in.time.toString();", - "in.getTripsDataIn.parameters.arrivalDeparture = in.arrival ? \"LA\" : \"ED\";" - ] + "out.getTripsCollectionDataIn.params.arrivalTime" : "com.axonivy.connector.sbb.utils.DateUtils.convertDateToISO8601(in.arrivalDate, 2)", + "out.getTripsCollectionDataIn.params.departureTime" : "com.axonivy.connector.sbb.utils.DateUtils.convertDateToISO8601(in.departureDate, 2)" + } } }, "visual" : { @@ -90,15 +82,16 @@ }, { "id" : "f14", "type" : "HtmlDialogMethodStart", - "name" : "getLocations(String)", + "name" : "getPlaces(String)", "config" : { - "signature" : "getLocations", + "signature" : "getPlaces", "input" : { "params" : [ { "name" : "name", "type" : "String", "desc" : "" } ], "map" : { - "out.getLocationsDataIn.parameters.name" : "param.name" + "out.getPlacesDataIn.params.name" : "param.name", + "out.getPlacesDataIn.params.restrictions.type" : "ch.sbb.api.smapi.osdm.journey.client.PlaceParam.TypeEnum.STOP" } }, "result" : { @@ -133,7 +126,7 @@ ], "config" : { "conditions" : { - "f18" : "!in.getLocationsDataIn.parameters.name.isBlank()" + "f18" : "!in.getPlacesDataIn.params.name.isBlank()" } }, "visual" : { @@ -153,18 +146,18 @@ }, { "id" : "f17", "type" : "SubProcessCall", - "name" : "Get Locations", + "name" : "Get Places", "config" : { - "processCall" : "GetLocations:call(com.axonivy.connector.sbb.location.GetLocationsDataIn)", + "processCall" : "GetPlaces:call(com.axonivy.connector.sbb.place.GetPlacesDataIn)", "call" : { "map" : { - "param.in" : "in.getLocationsDataIn" + "param.getPlacesDataIn.params.name" : "in.getPlacesDataIn.params.name" } }, "output" : { "map" : { "out" : "in", - "out.locations" : "result.locations" + "out.places" : "result.places" } } }, @@ -178,7 +171,7 @@ }, { "id" : "f19", "type" : "Script", - "name" : "Set locationNames", + "name" : "Set Place Names", "config" : { "output" : { "map" : { @@ -186,13 +179,9 @@ "out.locationNames" : "in.locationNames" }, "code" : [ - "import ch.sbb.app.b2p.client.Location;", - "", - "in.locationNames = new List();", + "import com.axonivy.connector.sbb.demo.trip.PlaceUtils;", "", - "for(Location location: in.locations) {", - " in.locationNames.add(location.name);", - "}" + "in.locationNames = PlaceUtils.getNameOfPlaces(in.places);" ] } }, @@ -205,7 +194,7 @@ }, { "id" : "f21", "type" : "HtmlDialogEnd", - "name" : "Return locationNames", + "name" : "Return Place Names", "visual" : { "at" : { "x" : 800, "y" : 352 }, "labelOffset" : { "x" : 10, "y" : 30 } @@ -232,7 +221,7 @@ }, { "id" : "f26", "type" : "Script", - "name" : "Set Location", + "name" : "Set Place Ref", "config" : { "output" : { "map" : { @@ -241,18 +230,12 @@ "out.locationTo" : "in.locationTo" }, "code" : [ - "import ch.sbb.app.b2p.client.Location;", - "", - "for(Location location: in.locations) {", - " if (location.name.equals(in.selectEvent.getObject())) {", - " if (in.selectEvent.getComponent().id.equals(\"from\")) {", - " in.locationFrom = location;", - " }", - " else {", - " in.locationTo = location;", - " }", - " break;", - " }", + "import com.axonivy.connector.sbb.demo.trip.PlaceUtils;", + "String nameOfPlace = String.valueOf(in.selectEvent.getObject());", + "if (in.selectEvent.getComponent().id.equals(\"from\")) {", + " in.getTripsCollectionDataIn.params.origin = PlaceUtils.getTripSearchCriteriaOrigin(in.places, nameOfPlace);", + "} else {", + " in.getTripsCollectionDataIn.params.destination = PlaceUtils.getTripSearchCriteriaDestination(in.places, nameOfPlace);;", "}" ] } @@ -266,9 +249,9 @@ }, { "id" : "f27", "type" : "HtmlDialogMethodStart", - "name" : "updateLocation(SelectEvent)", + "name" : "updatePlace(SelectEvent)", "config" : { - "signature" : "updateLocation", + "signature" : "updatePlace", "input" : { "params" : [ { "name" : "selectEvent", "type" : "org.primefaces.event.SelectEvent", "desc" : "" } @@ -293,7 +276,7 @@ "id" : "f29", "type" : "HtmlDialogEnd", "name" : [ - "Location has", + "Place has", "been updated" ], "visual" : { diff --git a/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/ShowTrips/ShowTrips.xhtml b/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/ShowTrips/ShowTrips.xhtml index d425f54..4798e07 100644 --- a/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/ShowTrips/ShowTrips.xhtml +++ b/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/ShowTrips/ShowTrips.xhtml @@ -22,18 +22,20 @@ tableStyle="width:auto"> -
- + +
+
- +
-
@@ -51,43 +53,49 @@
-
-
-
-
- +
-
-
-
- + +
+ +
+
@@ -97,7 +105,7 @@
- Online Offers diff --git a/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/ShowTrips/ShowTripsData.d.json b/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/ShowTrips/ShowTripsData.d.json index a2d92b8..da09de9 100644 --- a/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/ShowTrips/ShowTripsData.d.json +++ b/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/ShowTrips/ShowTripsData.d.json @@ -5,7 +5,7 @@ "isBusinessCaseData" : false, "fields" : [ { "name" : "trips", - "type" : "List", + "type" : "List", "comment" : "Trips as received from Swiss Mobility API." }, { "name" : "tripsForDisplay", diff --git a/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/ShowTrips/ShowTripsProcess.p.json b/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/ShowTrips/ShowTripsProcess.p.json index 73dbfb3..cecc478 100644 --- a/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/ShowTrips/ShowTripsProcess.p.json +++ b/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/ShowTrips/ShowTripsProcess.p.json @@ -13,7 +13,7 @@ "signature" : "start", "input" : { "params" : [ - { "name" : "trips", "type" : "List", "desc" : "" } + { "name" : "trips", "type" : "List", "desc" : "" } ], "map" : { "out.trips" : "param.trips" @@ -22,7 +22,7 @@ "guid" : "189FEA649F05C6F2" }, "visual" : { - "at" : { "x" : 96, "y" : 64 } + "at" : { "x" : 96, "y" : 80 } }, "connect" : [ { "id" : "f7", "to" : "f6" } @@ -31,7 +31,7 @@ "id" : "f1", "type" : "HtmlDialogEnd", "visual" : { - "at" : { "x" : 352, "y" : 64 } + "at" : { "x" : 480, "y" : 80 } } }, { "id" : "f3", @@ -63,6 +63,11 @@ "out.tripsForDisplay" : "in.tripsForDisplay" }, "code" : [ + "import ch.sbb.api.smapi.osdm.journey.client.Board;", + "import org.apache.commons.lang.StringUtils;", + "import ch.sbb.api.smapi.osdm.journey.client.Alight;", + "import ch.sbb.api.smapi.osdm.journey.client.TripLeg;", + "import ch.sbb.api.smapi.osdm.journey.client.Trip;", "import java.time.Instant;", "import java.time.ZoneId;", "import java.time.ZoneOffset;", @@ -71,7 +76,6 @@ "import ch.sbb.app.b2p.client.TransportProduct;", "import ch.sbb.app.b2p.client.Segment;", "import ch.sbb.app.b2p.client.Link;", - "import ch.sbb.app.b2p.client.Trip;", "import com.axonivy.connector.sbb.demo.trip.StopToForDisplay;", "import com.axonivy.connector.sbb.demo.trip.StopFromForDisplay;", "import java.time.temporal.ChronoUnit;", @@ -83,7 +87,6 @@ "", "DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern(\"dd.MM.yyyy\");", "DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern(\"HH:mm\");", - "", "// Add tripsForDisplay to ShowTripsData", "for (Trip trip: in.trips) {", " TripForDisplay tripForDisplay = new TripForDisplay();", @@ -98,116 +101,47 @@ " ", " // Add segments to tripForDisplay", " String currentDate = null;", - " ", - " for (Segment segment: trip.segments) {", - " SegmentForDisplay segmentForDisplay = new SegmentForDisplay();", - " ", + " for (TripLeg leg: trip.legs) {", " // Add iconClass to segmentForDisplay", - " if (segment.type.toString().equals(\"PUBLIC_JOURNEY\")) {", - " if (segment.transportProduct.vehicleType.equals(TransportProduct.VehicleTypeEnum.BOAT)) {", - " segmentForDisplay.iconClass = SegmentIconClass.BOAT.iconClass;", - " }", - " else if (segment.transportProduct.vehicleType.equals(TransportProduct.VehicleTypeEnum.BUS)) {", - " segmentForDisplay.iconClass = SegmentIconClass.BUS.iconClass;", - " }", - " else if (segment.transportProduct.vehicleType.equals(TransportProduct.VehicleTypeEnum.CABLE)) {", - " segmentForDisplay.iconClass = SegmentIconClass.CABLE.iconClass;", - " }", - " else if (segment.transportProduct.vehicleType.equals(TransportProduct.VehicleTypeEnum.METRO)) {", - " segmentForDisplay.iconClass = SegmentIconClass.METRO.iconClass;", - " }", - " else if (segment.transportProduct.vehicleType.equals(TransportProduct.VehicleTypeEnum.TRAIN)) {", - " segmentForDisplay.iconClass = SegmentIconClass.TRAIN.iconClass;", - " }", - " else if (segment.transportProduct.vehicleType.equals(TransportProduct.VehicleTypeEnum.TRAMWAY)) {", - " segmentForDisplay.iconClass = SegmentIconClass.TRAMWAY.iconClass;", - " }", - " else if (segment.transportProduct.vehicleType.equals(TransportProduct.VehicleTypeEnum.CHAIRLIFT)) {", - " segmentForDisplay.iconClass = SegmentIconClass.CHAIRLIFT.iconClass;", - " }", - " else if (segment.transportProduct.vehicleType.equals(TransportProduct.VehicleTypeEnum.COG_RAILWAY)) {", - " segmentForDisplay.iconClass = SegmentIconClass.COG_RAILWAY.iconClass;", - " }", - " else if (segment.transportProduct.vehicleType.equals(TransportProduct.VehicleTypeEnum.TAXI)) {", - " segmentForDisplay.iconClass = SegmentIconClass.TAXI.iconClass;", - " }", - " else if (segment.transportProduct.vehicleType.equals(TransportProduct.VehicleTypeEnum.LIFT)) {", - " segmentForDisplay.iconClass = SegmentIconClass.LIFT.iconClass;", - " }", - " else if (segment.transportProduct.vehicleType.equals(TransportProduct.VehicleTypeEnum.AIRPLANE)) {", - " segmentForDisplay.iconClass = SegmentIconClass.AIRPLANE.iconClass;", - " }", - " else {", - " segmentForDisplay.iconClass = SegmentIconClass.UNKNOWN.iconClass;", - " }", - " }", - " else {", + " SegmentForDisplay segmentForDisplay = new SegmentForDisplay();", + " String ptMode = leg.timedLeg.service.mode.ptMode;", + " if(\"URBAN\".equalsIgnoreCase(ptMode) || \"INTERREGIONAL\".equalsIgnoreCase(ptMode)) {", + " segmentForDisplay.iconClass = SegmentIconClass.TRAMWAY.iconClass;", + " } else {", " segmentForDisplay.iconClass = SegmentIconClass.WALK.iconClass;", " }", - " ", + "", " // Add stopFrom to segmentForDisplay", - " Stop stopFrom = segment.stops.get(0);", - " segmentForDisplay.stopFrom.name = stopFrom.name;", + " Board board = leg.timedLeg.start;", + " segmentForDisplay.stopFrom.name = board.stopPlaceName + StringUtils.EMPTY + board.plannedStopPointName;", + " segmentForDisplay.stopFrom.departurePlatform = String.valueOf(board.status.order);", + " segmentForDisplay.stopFrom.departurePlatformChanged = board.status.unplannedStop;", " // Add departureDateTime, departureDate, departureTime and departureDelay to segmentForDisplay.stopFrom", - " if (stopFrom.#departureDateTimeRt == null) {", - " segmentForDisplay.stopFrom.departureDateTime = stopFrom.departureDateTime;", - " segmentForDisplay.stopFrom.departureDate = stopFrom.departureDateTime.withOffsetSameInstant(zoneOffset).format(dateFormatter);", - " segmentForDisplay.stopFrom.departureTime = stopFrom.departureDateTime.withOffsetSameInstant(zoneOffset).format(timeFormatter);", - " }", - " else {", - " segmentForDisplay.stopFrom.departureDateTime = stopFrom.departureDateTimeRt;", - " segmentForDisplay.stopFrom.departureDate = stopFrom.departureDateTimeRt.withOffsetSameInstant(zoneOffset).format(dateFormatter);", - " segmentForDisplay.stopFrom.departureTime = stopFrom.departureDateTimeRt.withOffsetSameInstant(zoneOffset).format(timeFormatter);", - " segmentForDisplay.stopFrom.departureDelay = String.format(\"(+%d min)\", ChronoUnit.MINUTES.between(stopFrom.departureDateTime, stopFrom.departureDateTimeRt));", - " }", - " if (segmentForDisplay.stopFrom.departureDate == currentDate) {", - " segmentForDisplay.stopFrom.departureDate = null;", - " }", - " else {", - " currentDate = segmentForDisplay.stopFrom.departureDate;", - " }", - " // Add departurePlatform and departurePlatformChanged to segmentForDisplay.stopFrom", - " if (!stopFrom.departurePlatformChanged) {", - " segmentForDisplay.stopFrom.departurePlatform = stopFrom.departureTrack;", - " }", - " else {", - " segmentForDisplay.stopFrom.departurePlatform = stopFrom.departureTrackRt;", - " segmentForDisplay.stopFrom.departurePlatformChanged = true;", + " segmentForDisplay.stopFrom.departureDateTime = board.serviceDeparture.timetabledTime;", + " segmentForDisplay.stopFrom.departureDate = board.serviceDeparture.timetabledTime.withOffsetSameInstant(zoneOffset).format(dateFormatter);", + " segmentForDisplay.stopFrom.departureTime = board.serviceDeparture.timetabledTime.withOffsetSameInstant(zoneOffset).format(timeFormatter);", + " if (board.serviceDeparture.#observedTime != null ) {", + " segmentForDisplay.stopFrom.departureDelay = String.format(\"(+%d min)\", ChronoUnit.MINUTES.between(board.serviceDeparture.timetabledTime, board.serviceDeparture.observedTime));;", " }", - " ", + "", " // Add stopTo to segmentForDisplay", - " Stop stopTo = segment.stops.get(segment.stops.size() - 1);", - " segmentForDisplay.stopTo.name = stopTo.name;", + " Alight alight = leg.timedLeg.end;", + " segmentForDisplay.stopTo.name = alight.stopPlaceName + StringUtils.EMPTY + alight.plannedStopPointName;", + " segmentForDisplay.stopTo.arrivalPlatform = String.valueOf(alight.status.order);", + " segmentForDisplay.stopTo.arrivalPlatformChanged = alight.status.unplannedStop;", " // Add arrivalDateTime, arrivalDate, arrivalTime and arrivalDelay to segmentForDisplay.stopTo", - " if (stopTo.#arrivalDateTimeRt == null ) {", - " segmentForDisplay.stopTo.arrivalDateTime = stopTo.arrivalDateTime;", - " segmentForDisplay.stopTo.arrivalDate = stopTo.arrivalDateTime.withOffsetSameInstant(zoneOffset).format(dateFormatter);", - " segmentForDisplay.stopTo.arrivalTime = stopTo.arrivalDateTime.withOffsetSameInstant(zoneOffset).format(timeFormatter);", - " }", - " else {", - " segmentForDisplay.stopTo.arrivalDateTime = stopTo.arrivalDateTimeRt;", - " segmentForDisplay.stopTo.arrivalDate = stopTo.arrivalDateTimeRt.withOffsetSameInstant(zoneOffset).format(dateFormatter);", - " segmentForDisplay.stopTo.arrivalTime = stopTo.arrivalDateTimeRt.withOffsetSameInstant(zoneOffset).format(timeFormatter);", - " segmentForDisplay.stopTo.arrivalDelay = String.format(\"(+%d min)\", ChronoUnit.MINUTES.between(stopTo.arrivalDateTime, stopTo.arrivalDateTimeRt));;", - " }", - " if (segmentForDisplay.stopTo.arrivalDate == currentDate) {", - " segmentForDisplay.stopTo.arrivalDate = null;", - " }", - " else {", - " currentDate = segmentForDisplay.stopTo.arrivalDate;", - " }", - " // Add arrivalPlatform and arrivalPlatformChanged to segmentForDisplay.stopTo", - " if (!stopTo.arrivalPlatformChanged) {", - " segmentForDisplay.stopTo.arrivalPlatform = stopTo.arrivalTrack;", + " segmentForDisplay.stopTo.arrivalDateTime = alight.serviceArrival.timetabledTime;", + " segmentForDisplay.stopTo.arrivalDate = alight.serviceArrival.timetabledTime.withOffsetSameInstant(zoneOffset).format(dateFormatter);", + " segmentForDisplay.stopTo.arrivalTime = alight.serviceArrival.timetabledTime.withOffsetSameInstant(zoneOffset).format(timeFormatter);", + " if (alight.serviceArrival.#observedTime != null ) {", + " segmentForDisplay.stopTo.arrivalDelay = String.format(\"(+%d min)\", ChronoUnit.MINUTES.between(alight.serviceArrival.timetabledTime, alight.serviceArrival.observedTime));", " }", - " else {", - " segmentForDisplay.stopTo.arrivalPlatform = stopTo.arrivalTrackRt;", - " segmentForDisplay.stopTo.arrivalPlatformChanged = true;", - " }", - " ", + "", " // Add transportProductName and direction to segmentForDisplay", - " segmentForDisplay.transportProductName = String.format(\"%s %s\", segment.transportProduct.categoryShortForm, segment.transportProduct.number);", - " segmentForDisplay.direction = segment.direction;", + " segmentForDisplay.transportName = leg.timedLeg.service.mode.name;", + " segmentForDisplay.transportDescription = leg.timedLeg.service.mode.description;", + " segmentForDisplay.publishedServiceName = leg.timedLeg.service.publishedServiceName;", + " segmentForDisplay.direction = \"OUT_BOUND\".equals(trip.direction.name()) ? \"Out bound\" : \"In bound\";", " ", " tripForDisplay.segments.add(segmentForDisplay);", " }", @@ -233,19 +167,21 @@ " if (durationPartMinutes.length() < 2) {", " durationPartMinutes = String.format(\"0%s\", durationPartMinutes);", " }", + "", " String durationPartHours = Long.toString((durationMinutes / 60) % 24);", " if (durationPartHours.length() < 2) {", " durationPartHours = String.format(\"0%s\", durationPartHours);", " }", + "", " tripForDisplay.duration = String.format(\"%s:%s\", durationPartHours, durationPartMinutes);", - " ", " in.tripsForDisplay.add(tripForDisplay);", "}" ] } }, "visual" : { - "at" : { "x" : 224, "y" : 64 } + "at" : { "x" : 288, "y" : 80 }, + "size" : { "width" : 176, "height" : 94 } }, "connect" : [ { "id" : "f2", "to" : "f1" } diff --git a/sbb-connector-test/pom.xml b/sbb-connector-test/pom.xml index 0977e38..9cce70a 100644 --- a/sbb-connector-test/pom.xml +++ b/sbb-connector-test/pom.xml @@ -1,67 +1,68 @@ - - 4.0.0 - com.axonivy.connector.sbb - sbb-connector-test - 12.0.0-SNAPSHOT - iar-integration-test - - 12.0.0 + + 4.0.0 + com.axonivy.connector.sbb + sbb-connector-test + 12.0.0-SNAPSHOT + iar-integration-test + 12.0.1 - UTF-8 + 12.0.0 + UTF-8 - - - sonatype - https://oss.sonatype.org/content/repositories/snapshots + + + com.axonivy.ivy.test + unit-tester + ${tester.version} + test + + + com.axonivy.connector.sbb + sbb-connector-demo + ${project.version} + iar + + + + always - - - - sonatype https://oss.sonatype.org/content/repositories/snapshots + + + + always - - - - - com.axonivy.connector.sbb - sbb-connector - ${project.version} - iar - - - com.axonivy.ivy.test - unit-tester - ${tester.version} - test - - - - src_test - - - com.axonivy.ivy.ci - project-build-plugin - ${project.build.plugin.version} - true - - - - - - maven-deploy-plugin - 3.0.0-M1 - - true - - - - - - \ No newline at end of file + sonatype + https://oss.sonatype.org/content/repositories/snapshots + + + + src_test + + + + maven-deploy-plugin + 3.0.0-M1 + + true + + + + + + + com.axonivy.ivy.ci + project-build-plugin + ${project.build.plugin.version} + true + + + + diff --git a/sbb-connector-test/src_test/com/axonivy/connector/sbb/test/constant/Constant.java b/sbb-connector-test/src_test/com/axonivy/connector/sbb/test/constant/Constant.java new file mode 100644 index 0000000..cd601cf --- /dev/null +++ b/sbb-connector-test/src_test/com/axonivy/connector/sbb/test/constant/Constant.java @@ -0,0 +1,15 @@ +package com.axonivy.connector.sbb.test.constant; + +public class Constant { + public static final String REQUESTOR_PARAMETER = "requestor"; + public static final String MOCK_REQUESTOR_VALUE = "requestor"; + public static final String TRACEPARENT_PARAMETER = "traceparent"; + public static final String MOCK_TRACEPARENT_VALUE = "traceparent"; + public static final String TRACESTATE_PARAMETER = "tracestate"; + public static final String MOCK_TRACESTATE_VALUE = "tracestate"; + public static final String ACCEPT_LANGUAGE_PARAMETER = "acceptLanguage"; + public static final String MOCK_ACCEPT_LANGUAGE_VALUE = "en"; + public static final String IN = "in"; + public static final String HEADERS = "headers"; + public static final String PARAMS = "params"; +} diff --git a/sbb-connector-test/src_test/com/axonivy/connector/sbb/test/location/TestGetLocations.java b/sbb-connector-test/src_test/com/axonivy/connector/sbb/test/location/TestGetLocations.java deleted file mode 100644 index 12ba55d..0000000 --- a/sbb-connector-test/src_test/com/axonivy/connector/sbb/test/location/TestGetLocations.java +++ /dev/null @@ -1,116 +0,0 @@ -package com.axonivy.connector.sbb.test.location; - -import static org.assertj.core.api.Assertions.assertThat; - -import org.junit.jupiter.api.Test; - -import com.axonivy.connector.sbb.location.GetLocationsDataHeaders; -import com.axonivy.connector.sbb.location.GetLocationsDataIn; -import com.axonivy.connector.sbb.location.GetLocationsDataParameters; - -import ch.ivyteam.ivy.bpm.engine.client.BpmClient; -import ch.ivyteam.ivy.bpm.engine.client.element.BpmElement; -import ch.ivyteam.ivy.bpm.engine.client.element.BpmProcess; -import ch.ivyteam.ivy.bpm.engine.client.sub.SubProcessCallResult; -import ch.ivyteam.ivy.bpm.exec.client.IvyProcessTest; -import ch.ivyteam.ivy.scripting.objects.List; -import ch.sbb.app.b2p.client.Location; -import ch.sbb.app.b2p.client.Location.VehicleTypesEnum; - -@IvyProcessTest(enableWebServer = true) -@SuppressWarnings("unchecked") -class TestGetLocations { - - private static final BpmProcess GET_LOCATIONS_PROCESS = BpmProcess.path("GetLocations"); - private static final BpmElement GET_LOCATIONS_START = GET_LOCATIONS_PROCESS - .elementName("call(GetLocationsDataIn)"); - private static final BpmElement GET_LOCATIONS = GET_LOCATIONS_PROCESS.elementName("Get Locations"); - - @Test - void call_mockedApi_returnsMockedResponse(BpmClient bpmClient) { - // Arguments - GetLocationsDataHeaders getLocationsDataHeaders = new GetLocationsDataHeaders(); - getLocationsDataHeaders.setConversationId("ConversationId"); - getLocationsDataHeaders.setAcceptLanguage("AcceptLanguage"); - - GetLocationsDataParameters getLocationsDataParameters = new GetLocationsDataParameters(); - getLocationsDataParameters.setName("Name"); - - GetLocationsDataIn getLocationsDataIn = new GetLocationsDataIn(); - getLocationsDataIn.setHeaders(getLocationsDataHeaders); - getLocationsDataIn.setParameters(getLocationsDataParameters); - - // Mocks - List locations = List.create(Location.class); - - bpmClient - .mock() - .element(GET_LOCATIONS) - .with(in -> { - try { - GetLocationsDataIn inGetLocationsDataIn = (GetLocationsDataIn) in.get("in"); - - GetLocationsDataHeaders inGetLocationsDataInHeaders = (GetLocationsDataHeaders) inGetLocationsDataIn - .get("headers"); - assertThat(inGetLocationsDataInHeaders).isEqualTo(getLocationsDataHeaders); - assertThat(inGetLocationsDataInHeaders.get("conversationId")).isEqualTo("ConversationId"); - assertThat(inGetLocationsDataInHeaders.get("acceptLanguage")).isEqualTo("AcceptLanguage"); - - GetLocationsDataParameters inGetLocationsDataInParameters = (GetLocationsDataParameters) inGetLocationsDataIn - .get("parameters"); - assertThat(inGetLocationsDataInParameters).isEqualTo(getLocationsDataParameters); - assertThat(inGetLocationsDataInParameters.get("name")).isEqualTo("Name"); - - in.set("locations", locations); - return in; - } catch (NoSuchFieldException ex) { - throw new RuntimeException(ex); - } - }); - - // Run - SubProcessCallResult result = bpmClient - .start() - .subProcess(GET_LOCATIONS_START) - .execute(getLocationsDataIn) - .subResult(); - - // Assert - assertThat(result.param("locations", List.class)).isSameAs(locations); - } - - @Test - void call_realApi_returnsRealResponse(BpmClient bpmClient) { - // Arguments - GetLocationsDataHeaders getLocationsDataHeaders = new GetLocationsDataHeaders(); - - GetLocationsDataParameters getLocationsDataParameters = new GetLocationsDataParameters(); - getLocationsDataParameters.setName("Name"); - - GetLocationsDataIn getLocationsDataIn = new GetLocationsDataIn(); - getLocationsDataIn.setHeaders(getLocationsDataHeaders); - getLocationsDataIn.setParameters(getLocationsDataParameters); - - // Run - SubProcessCallResult result = bpmClient - .start() - .subProcess(GET_LOCATIONS_START) - .execute(getLocationsDataIn) - .subResult(); - - // Assert - List locations = result.param("locations", List.class); - assertThat(locations.size()).isEqualTo(1); - - Location location = locations.get(0); - assertThat(location.getLinks()).isEmpty(); - assertThat(location.getId()).isEqualTo(8507000); - assertThat(location.getName()).isEqualTo("Bern"); - assertThat(location.getCoordinates().getLatitude()).isEqualTo(46.948825); - assertThat(location.getCoordinates().getLongitude()).isEqualTo(7.439122); - assertThat(location.getType()).isEqualTo("STATION"); - assertThat(location.isTariffBorder()).isFalse(); - assertThat(location.getWeight()).isNull(); - assertThat(location.getVehicleTypes()).isEqualTo(java.util.List.of(VehicleTypesEnum.TRAIN, VehicleTypesEnum.TRAMWAY)); - } -} diff --git a/sbb-connector-test/src_test/com/axonivy/connector/sbb/test/place/TestGetPlaces.java b/sbb-connector-test/src_test/com/axonivy/connector/sbb/test/place/TestGetPlaces.java new file mode 100644 index 0000000..18e4d54 --- /dev/null +++ b/sbb-connector-test/src_test/com/axonivy/connector/sbb/test/place/TestGetPlaces.java @@ -0,0 +1,109 @@ +package com.axonivy.connector.sbb.test.place; + +import static com.axonivy.connector.sbb.constant.Constant.PLACES; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import com.axonivy.connector.sbb.place.GetPlacesDataHeaders; +import com.axonivy.connector.sbb.place.GetPlacesDataIn; +import com.axonivy.connector.sbb.place.GetPlacesDataParameters; +import com.axonivy.connector.sbb.test.constant.Constant; + +import ch.ivyteam.ivy.bpm.engine.client.BpmClient; +import ch.ivyteam.ivy.bpm.engine.client.element.BpmElement; +import ch.ivyteam.ivy.bpm.engine.client.element.BpmProcess; +import ch.ivyteam.ivy.bpm.engine.client.sub.SubProcessCallResult; +import ch.ivyteam.ivy.bpm.exec.client.IvyProcessTest; +import ch.ivyteam.ivy.scripting.objects.List; +import ch.sbb.api.smapi.osdm.journey.client.OneOfPlaceResponsePlacesItems; + +@IvyProcessTest +class TestGetPlaces { + + private static final BpmProcess GET_PLACES_PROCESS = BpmProcess.path("GetPlaces"); + private static final BpmElement GET_PLACES_START = GET_PLACES_PROCESS.elementName("call(GetPlacesDataIn)"); + private static final BpmElement GET_PLACES = GET_PLACES_PROCESS.elementName("Get Places"); + private static final String MOCK_NAME_VALUE = "Bern"; + private static final double MOCK_POSITION_LATITUDE_VALUE = 100; + private static final double MOCK_POSITION_LONGTITUDE_VALUE = 200; + + @Test + void call_mockedApi_returnsMockedResponse(BpmClient bpmClient) { + GetPlacesDataHeaders getPlacesDataHeaders = prepareGetPlacesDataHeaders(); + GetPlacesDataIn getPlacesDataIn = prepareGetPlacesDataIn(getPlacesDataHeaders); + + // Mocks + List places = List.create(OneOfPlaceResponsePlacesItems.class); + + bpmClient.mock().element(GET_PLACES).with(in -> { + try { + GetPlacesDataIn inGetPlacesDataIn = (GetPlacesDataIn) in.get(Constant.IN); + GetPlacesDataHeaders inGetPlacesDataHeaders = (GetPlacesDataHeaders) inGetPlacesDataIn + .get(Constant.HEADERS); + assertEquals(inGetPlacesDataHeaders, getPlacesDataHeaders); + assertEquals(inGetPlacesDataHeaders.get(Constant.REQUESTOR_PARAMETER), Constant.MOCK_REQUESTOR_VALUE); + assertEquals(inGetPlacesDataHeaders.get(Constant.TRACEPARENT_PARAMETER), + Constant.MOCK_TRACEPARENT_VALUE); + assertEquals(inGetPlacesDataHeaders.get(Constant.TRACESTATE_PARAMETER), Constant.MOCK_TRACESTATE_VALUE); + assertEquals(inGetPlacesDataHeaders.get(Constant.ACCEPT_LANGUAGE_PARAMETER), + Constant.MOCK_ACCEPT_LANGUAGE_VALUE); + GetPlacesDataParameters inGetPlacesDataInParameters = (GetPlacesDataParameters) inGetPlacesDataIn + .get(Constant.PARAMS); + assertEquals(inGetPlacesDataInParameters.getName(), MOCK_NAME_VALUE); + assertEquals(inGetPlacesDataInParameters.getGeoPositionLatitude().doubleValue(), + Double.valueOf(MOCK_POSITION_LATITUDE_VALUE)); + assertEquals(inGetPlacesDataInParameters.getGeoPositionLongitude().doubleValue(), + Double.valueOf(MOCK_POSITION_LONGTITUDE_VALUE)); + + in.set(PLACES, places); + return in; + } catch (NoSuchFieldException ex) { + throw new RuntimeException(ex); + } + }); + + // Run + SubProcessCallResult result = bpmClient.start().subProcess(GET_PLACES_START).execute(getPlacesDataIn) + .subResult(); + + // Assert + assertEquals(result.param(PLACES, List.class), places); + } + + @Test + void call_realApi_returnsRealResponse(BpmClient bpmClient) { + GetPlacesDataHeaders getPlacesDataHeaders = prepareGetPlacesDataHeaders(); + GetPlacesDataIn getPlacesDataIn = prepareGetPlacesDataIn(getPlacesDataHeaders); + // Run + SubProcessCallResult result = bpmClient.start().subProcess(GET_PLACES_START).execute(getPlacesDataIn) + .subResult(); + + // Assert + Assertions.assertTrue(result.param(PLACES, List.class).size() > 1); + } + + private GetPlacesDataIn prepareGetPlacesDataIn(GetPlacesDataHeaders getPlacesDataHeaders) { + GetPlacesDataParameters getPlacesDataParameters = new GetPlacesDataParameters(); + getPlacesDataParameters.setName(MOCK_NAME_VALUE); + getPlacesDataParameters.setGeoPositionLatitude(MOCK_POSITION_LATITUDE_VALUE); + getPlacesDataParameters.setGeoPositionLongitude(MOCK_POSITION_LONGTITUDE_VALUE); + + GetPlacesDataIn getPlacesDataIn = new GetPlacesDataIn(); + getPlacesDataIn.setHeaders(getPlacesDataHeaders); + getPlacesDataIn.setParams(getPlacesDataParameters); + + return getPlacesDataIn; + } + + private GetPlacesDataHeaders prepareGetPlacesDataHeaders() { + GetPlacesDataHeaders getPlacesDataHeaders = new GetPlacesDataHeaders(); + getPlacesDataHeaders.setRequestor(Constant.MOCK_REQUESTOR_VALUE); + getPlacesDataHeaders.setTraceparent(Constant.MOCK_TRACEPARENT_VALUE); + getPlacesDataHeaders.setTracestate(Constant.MOCK_TRACESTATE_VALUE); + getPlacesDataHeaders.setAcceptLanguage(Constant.MOCK_ACCEPT_LANGUAGE_VALUE); + return getPlacesDataHeaders; + } + +} diff --git a/sbb-connector-test/src_test/com/axonivy/connector/sbb/test/trip/TestGetTrips.java b/sbb-connector-test/src_test/com/axonivy/connector/sbb/test/trip/TestGetTrips.java index be7c1c0..e26fc18 100644 --- a/sbb-connector-test/src_test/com/axonivy/connector/sbb/test/trip/TestGetTrips.java +++ b/sbb-connector-test/src_test/com/axonivy/connector/sbb/test/trip/TestGetTrips.java @@ -1,365 +1,126 @@ package com.axonivy.connector.sbb.test.trip; -import static org.assertj.core.api.Assertions.assertThat; - -import java.time.OffsetDateTime; -import java.time.ZoneOffset; - +import static com.axonivy.connector.sbb.constant.Constant.TRIPS; +import static org.junit.jupiter.api.Assertions.assertEquals; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -import com.axonivy.connector.sbb.trip.GetTripsDataHeaders; -import com.axonivy.connector.sbb.trip.GetTripsDataIn; -import com.axonivy.connector.sbb.trip.GetTripsDataParameters; +import com.axonivy.connector.sbb.test.constant.Constant; +import com.axonivy.connector.sbb.tripscollection.GetTripsCollectionDataHeaders; +import com.axonivy.connector.sbb.tripscollection.GetTripsCollectionDataIn; +import com.axonivy.connector.sbb.tripscollection.GetTripsCollectionDataParameters; import ch.ivyteam.ivy.bpm.engine.client.BpmClient; import ch.ivyteam.ivy.bpm.engine.client.element.BpmElement; import ch.ivyteam.ivy.bpm.engine.client.element.BpmProcess; import ch.ivyteam.ivy.bpm.engine.client.sub.SubProcessCallResult; import ch.ivyteam.ivy.bpm.exec.client.IvyProcessTest; -import ch.ivyteam.ivy.scripting.objects.Date; import ch.ivyteam.ivy.scripting.objects.List; -import ch.sbb.app.b2p.client.Link; -import ch.sbb.app.b2p.client.LocationIdentity; -import ch.sbb.app.b2p.client.Note; -import ch.sbb.app.b2p.client.Segment; -import ch.sbb.app.b2p.client.Stop; -import ch.sbb.app.b2p.client.TransportProduct; -import ch.sbb.app.b2p.client.Trip; +import ch.sbb.api.smapi.osdm.journey.client.StopPlaceRef; +import ch.sbb.api.smapi.osdm.journey.client.Trip; -@IvyProcessTest(enableWebServer = true) -@SuppressWarnings("unchecked") +@IvyProcessTest class TestGetTrips { - private static final BpmProcess GET_TRIPS_PROCESS = BpmProcess.path("GetTrips"); - private static final BpmElement GET_TRIPS_START = GET_TRIPS_PROCESS - .elementName("call(GetTripsDataIn)"); - private static final BpmElement GET_TRIPS = GET_TRIPS_PROCESS.elementName("Get Trips"); - - @Test - void call_mockedApi_returnsMockedResponse(BpmClient bpmClient) { - // Arguments - GetTripsDataHeaders getTripsDataHeaders = new GetTripsDataHeaders(); - getTripsDataHeaders.setConversationId("ConversationId"); - getTripsDataHeaders.setAcceptLanguage("AcceptLanguage"); - getTripsDataHeaders.setScrollContext("ScrollContext"); - - List getTripsDataParametersViaId = List.create(Integer.class); - Date getTripsDataParametersDate = new Date(); - - GetTripsDataParameters getTripsDataParameters = new GetTripsDataParameters(); - getTripsDataParameters.setOriginId(1); - getTripsDataParameters.setDestinationId(2); - getTripsDataParameters.setViaId(getTripsDataParametersViaId); - getTripsDataParameters.setDate(getTripsDataParametersDate); - getTripsDataParameters.setTime("Time"); - getTripsDataParameters.setArrivalDeparture("ArrivalDeparture"); - getTripsDataParameters.setTrainType("TrainType"); - getTripsDataParameters.setAlternateMatch("AlternateMatch"); - getTripsDataParameters.setIncludeBefore(3); - getTripsDataParameters.setIncludeAfter(4); - getTripsDataParameters.setCalculateEco(true); - - GetTripsDataIn getTripsDataIn = new GetTripsDataIn(); - getTripsDataIn.setHeaders(getTripsDataHeaders); - getTripsDataIn.setParameters(getTripsDataParameters); - - // Mocks - List trips = List.create(Trip.class); - - bpmClient - .mock() - .element(GET_TRIPS) - .with(in -> { - try { - GetTripsDataIn inGetTripsDataIn = (GetTripsDataIn) in.get("in"); - - GetTripsDataHeaders inGetTripsDataInHeaders = (GetTripsDataHeaders) inGetTripsDataIn - .get("headers"); - assertThat(inGetTripsDataInHeaders).isEqualTo(getTripsDataHeaders); - assertThat(inGetTripsDataInHeaders.get("conversationId")).isEqualTo("ConversationId"); - assertThat(inGetTripsDataInHeaders.get("acceptLanguage")).isEqualTo("AcceptLanguage"); - assertThat(inGetTripsDataInHeaders.get("scrollContext")).isEqualTo("ScrollContext"); - - GetTripsDataParameters inGetTripsDataInParameters = (GetTripsDataParameters) inGetTripsDataIn - .get("parameters"); - assertThat(inGetTripsDataInParameters).isEqualTo(getTripsDataParameters); - assertThat(inGetTripsDataInParameters.getOriginId()).isEqualTo(1); - assertThat(inGetTripsDataInParameters.getDestinationId()).isEqualTo(2); - assertThat(inGetTripsDataInParameters.getViaId()).isSameAs(getTripsDataParametersViaId); - assertThat(inGetTripsDataInParameters.getDate()).isSameAs(getTripsDataParametersDate); - assertThat(inGetTripsDataInParameters.getTime()).isEqualTo("Time"); - assertThat(inGetTripsDataInParameters.getArrivalDeparture()).isEqualTo("ArrivalDeparture"); - assertThat(inGetTripsDataInParameters.getTrainType()).isEqualTo("TrainType"); - assertThat(inGetTripsDataInParameters.getAlternateMatch()).isEqualTo("AlternateMatch"); - assertThat(inGetTripsDataInParameters.getIncludeBefore()).isEqualTo(3); - assertThat(inGetTripsDataInParameters.getIncludeAfter()).isEqualTo(4); - assertThat(inGetTripsDataInParameters.getCalculateEco()).isTrue(); - - in.set("trips", trips); - return in; - } catch (NoSuchFieldException ex) { - throw new RuntimeException(ex); - } - }); - - // Run - SubProcessCallResult result = bpmClient - .start() - .subProcess(GET_TRIPS_START) - .execute(getTripsDataIn) - .subResult(); - - // Assert - assertThat(result.param("trips", List.class)).isSameAs(trips); - } - - @Test - void call_realApi_returnsRealResponse(BpmClient bpmClient) { - // Arguments - GetTripsDataHeaders getTripsDataHeaders = new GetTripsDataHeaders(); - - Date getTripsDataParametersDate = new Date("2000-01-01"); - - GetTripsDataParameters getTripsDataParameters = new GetTripsDataParameters(); - getTripsDataParameters.setOriginId(1); - getTripsDataParameters.setDestinationId(2); - getTripsDataParameters.setDate(getTripsDataParametersDate); - getTripsDataParameters.setTime("00:00"); - - GetTripsDataIn getTripsDataIn = new GetTripsDataIn(); - getTripsDataIn.setHeaders(getTripsDataHeaders); - getTripsDataIn.setParameters(getTripsDataParameters); - - // Run - SubProcessCallResult result = bpmClient - .start() - .subProcess(GET_TRIPS_START) - .execute(getTripsDataIn) - .subResult(); - - // Assert - List trips = result.param("trips", List.class); - assertThat(trips.size()).isEqualTo(1); - - Trip trip = trips.get(0); - - java.util.List links = trip.getLinks(); - assertThat(links.size()).isEqualTo(5); - - Link link000 = links.get(0); - assertThat(link000.getRel()).isEqualTo("prices"); - assertThat(link000.getVersion()).isNull(); - assertThat(link000.getHref()).isEqualTo("/v2/prices"); - assertThat(link000.getMethod()).isEqualTo("POST"); - assertThat(link000.getContentTypes()).isEqualTo(java.util.List.of("application/json")); - - Link link001 = links.get(1); - assertThat(link001.getRel()).isEqualTo("trip-offers"); - assertThat(link001.getVersion()).isNull(); - assertThat(link001.getHref()).isEqualTo( - """ - /trip-offers?tripId=wQg8CgJWMRKRBSVDMiVCNkhLSQkJgFQlMjRBJTNEMSU0ME8lM0RCZXJuJTQwWCUzRDc0MzkxMwEZdFklM0Q0Njk0ODgzNCU0MEwlM0Q4NTA3\ - MDAwJTQwYQE-EDI4JTQwOksAEEFhcmF1DUwgODA1MTI2OSU0CUwANwFaADYdTAwyMTEzPkwANDIwMjAwODIzMTAzNCUyGQ8BKywyNElSKzE2KysrJTIBHQAxCQcNBhBD\ - MiVBNz7aAP6PAC4mATRaJUMzJUJDcmljaCtIQhHkBDU0AcgZ5BA3ODE3NzkwADNKMAEV5AgxMjMy5AAENTIJ5AQzN2bkAAxCNktDAexAQjYlMjNWRSUyMzAlMjNDRiUh\ - NAULAEERFABNDQkMU0lDVAEfCCUyMwk6BEtDSkMAMEVSRyUyMzIlMjNISU4NOjhFQ0slMjMzNjYzOTQlN0MuCQAINDcyCRIJCQgwJTcFBBA2NTcwMQkZBDM4ASIBDSQt\ - MjE0NzQ4MzYzCScoMjMa3gEKOAoSCgdNUygSB1NUQVRJT04SGSEemC0wOC0yM1QxMDozNDowMCswMjowMCIHUExBTk5FRAobCg4KAzEzMhU2FRsMKAEKHw1XDDAyMThK\ - IQAIAgo6DSFBfxUhABoyeAAMMToxM0Z4ALgoAxIYEAMaBjAwMDAxMSICSVIqAjE2MgQyMTY5Kg5QVUJMSUNfSk9VUk5FWRrFAVZpADbhAAgxOjJSaQAVxgwyMTE5FaUZ\ - 5wAEFV1BYRUhPsYAADUhODo-ARwoBRIaCAMQBTbIABwzNzIEMjI2Nz7IAA==&passengers=${passengerInfos}\ - """); - assertThat(link001.getMethod()).isEqualTo("GET"); - assertThat(link001.getContentTypes()).isEqualTo(java.util.List.of("application/json")); - - Link link002 = links.get(2); - assertThat(link002.getRel()).isEqualTo("group-trip-offers"); - assertThat(link002.getVersion()).isNull(); - assertThat(link002.getHref()).isEqualTo( - """ - /group-trip-offers?tripId=wQg8CgJWMRKRBSVDMiVCNkhLSQkJgFQlMjRBJTNEMSU0ME8lM0RCZXJuJTQwWCUzRDc0MzkxMwEZdFklM0Q0Njk0ODgzNCU0MEwlM0\ - Q4NTA3MDAwJTQwYQE-EDI4JTQwOksAEEFhcmF1DUwgODA1MTI2OSU0CUwANwFaADYdTAwyMTEzPkwANDIwMjAwODIzMTAzNCUyGQ8BKywyNElSKzE2KysrJTIBHQAxCQ\ - cNBhBDMiVBNz7aAP6PAC4mATRaJUMzJUJDcmljaCtIQhHkBDU0AcgZ5BA3ODE3NzkwADNKMAEV5AgxMjMy5AAENTIJ5AQzN2bkAAxCNktDAexAQjYlMjNWRSUyMzAlMj\ - NDRiUhNAULAEERFABNDQkMU0lDVAEfCCUyMwk6BEtDSkMAMEVSRyUyMzIlMjNISU4NOjhFQ0slMjMzNjYzOTQlN0MuCQAINDcyCRIJCQgwJTcFBBA2NTcwMQkZBDM4AS\ - IBDSQtMjE0NzQ4MzYzCScoMjMa3gEKOAoSCgdNUygSB1NUQVRJT04SGSEemC0wOC0yM1QxMDozNDowMCswMjowMCIHUExBTk5FRAobCg4KAzEzMhU2FRsMKAEKHw1XDD\ - AyMThKIQAIAgo6DSFBfxUhABoyeAAMMToxM0Z4ALgoAxIYEAMaBjAwMDAxMSICSVIqAjE2MgQyMTY5Kg5QVUJMSUNfSk9VUk5FWRrFAVZpADbhAAgxOjJSaQAVxgwyMT\ - E5FaUZ5wAEFV1BYRUhPsYAADUhODo-ARwoBRIaCAMQBTbIABwzNzIEMjI2Nz7IAA==&passengerGroups=${passengerGroupInfos}\ - """); - assertThat(link002.getMethod()).isEqualTo("GET"); - assertThat(link002.getContentTypes()).isEqualTo(java.util.List.of("application/json")); - - Link link003 = links.get(3); - assertThat(link003.getRel()).isEqualTo("online-offers"); - assertThat(link003.getVersion()).isNull(); - assertThat(link003.getHref()).isEqualTo( - """ - https://www.sbb.ch/en/buying/pages/fahrplan/fahrplan.xhtml?recon=wQg8CgJWMRKRBSVDMiVCNkhLSQkJgFQlMjRBJTNEMSU0ME8lM0RCZXJuJTQwWCU\ - zRDc0MzkxMwEZdFklM0Q0Njk0ODgzNCU0MEwlM0Q4NTA3MDAwJTQwYQE-EDI4JTQwOksAEEFhcmF1DUwgODA1MTI2OSU0CUwANwFaADYdTAwyMTEzPkwANDIwMjAwODI\ - zMTAzNCUyGQ8BKywyNElSKzE2KysrJTIBHQAxCQcNBhBDMiVBNz7aAP6PAC4mATRaJUMzJUJDcmljaCtIQhHkBDU0AcgZ5BA3ODE3NzkwADNKMAEV5AgxMjMy5AAENTI\ - J5AQzN2bkAAxCNktDAexAQjYlMjNWRSUyMzAlMjNDRiUhNAULAEERFABNDQkMU0lDVAEfCCUyMwk6BEtDSkMAMEVSRyUyMzIlMjNISU4NOjhFQ0slMjMzNjYzOTQlN0M\ - uCQAINDcyCRIJCQgwJTcFBBA2NTcwMQkZBDM4ASIBDSQtMjE0NzQ4MzYzCScoMjMa3gEKOAoSCgdNUygSB1NUQVRJT04SGSEemC0wOC0yM1QxMDozNDowMCswMjowMCI\ - HUExBTk5FRAobCg4KAzEzMhU2FRsMKAEKHw1XDDAyMThKIQAIAgo6DSFBfxUhABoyeAAMMToxM0Z4ALgoAxIYEAMaBjAwMDAxMSICSVIqAjE2MgQyMTY5Kg5QVUJMSUN\ - fSk9VUk5FWRrFAVZpADbhAAgxOjJSaQAVxgwyMTE5FaUZ5wAEFV1BYRUhPsYAADUhODo-ARwoBRIaCAMQBTbIABwzNzIEMjI2Nz7IAA==&datum=2000-01-01+01:00\ - &zeit=0000\ - """); - assertThat(link003.getMethod()).isEqualTo("GET"); - assertThat(link003.getContentTypes()).isEqualTo(java.util.List.of("text/html")); - - Link link004 = links.get(4); - assertThat(link004.getRel()).isEqualTo("mobile-offers"); - assertThat(link004.getVersion()).isNull(); - assertThat(link004.getHref()).isEqualTo( - """ - https://app.sbbmobile.ch/tripoffer?appid=bookingAPI&recon=wQg8CgJWMRKRBSVDMiVCNkhLSQkJgFQlMjRBJTNEMSU0ME8lM0RCZXJuJTQwWCUzRDc0Mz\ - kxMwEZdFklM0Q0Njk0ODgzNCU0MEwlM0Q4NTA3MDAwJTQwYQE-EDI4JTQwOksAEEFhcmF1DUwgODA1MTI2OSU0CUwANwFaADYdTAwyMTEzPkwANDIwMjAwODIzMTAzNC\ - UyGQ8BKywyNElSKzE2KysrJTIBHQAxCQcNBhBDMiVBNz7aAP6PAC4mATRaJUMzJUJDcmljaCtIQhHkBDU0AcgZ5BA3ODE3NzkwADNKMAEV5AgxMjMy5AAENTIJ5AQzN2\ - bkAAxCNktDAexAQjYlMjNWRSUyMzAlMjNDRiUhNAULAEERFABNDQkMU0lDVAEfCCUyMwk6BEtDSkMAMEVSRyUyMzIlMjNISU4NOjhFQ0slMjMzNjYzOTQlN0MuCQAIND\ - cyCRIJCQgwJTcFBBA2NTcwMQkZBDM4ASIBDSQtMjE0NzQ4MzYzCScoMjMa3gEKOAoSCgdNUygSB1NUQVRJT04SGSEemC0wOC0yM1QxMDozNDowMCswMjowMCIHUExBTk\ - 5FRAobCg4KAzEzMhU2FRsMKAEKHw1XDDAyMThKIQAIAgo6DSFBfxUhABoyeAAMMToxM0Z4ALgoAxIYEAMaBjAwMDAxMSICSVIqAjE2MgQyMTY5Kg5QVUJMSUNfSk9VUk\ - 5FWRrFAVZpADbhAAgxOjJSaQAVxgwyMTE5FaUZ5wAEFV1BYRUhPsYAADUhODo-ARwoBRIaCAMQBTbIABwzNzIEMjI2Nz7IAA==&date=2000-01-01+01:00&class=2\ - """); - assertThat(link004.getMethod()).isEqualTo("GET"); - assertThat(link004.getContentTypes()).isEqualTo(java.util.List.of("text/html")); - - assertThat(trip.getTripId()).isEqualTo( - """ - wQg8CgJWMRKRBSVDMiVCNkhLSQkJgFQlMjRBJTNEMSU0ME8lM0RCZXJuJTQwWCUzRDc0MzkxMwEZdFklM0Q0Njk0ODgzNCU0MEwlM0Q4NTA3MDAwJTQwYQE-EDI4JTQw\ - OksAEEFhcmF1DUwgODA1MTI2OSU0CUwANwFaADYdTAwyMTEzPkwANDIwMjAwODIzMTAzNCUyGQ8BKywyNElSKzE2KysrJTIBHQAxCQcNBhBDMiVBNz7aAP6PAC4mATRa\ - JUMzJUJDcmljaCtIQhHkBDU0AcgZ5BA3ODE3NzkwADNKMAEV5AgxMjMy5AAENTIJ5AQzN2bkAAxCNktDAexAQjYlMjNWRSUyMzAlMjNDRiUhNAULAEERFABNDQkMU0lD\ - VAEfCCUyMwk6BEtDSkMAMEVSRyUyMzIlMjNISU4NOjhFQ0slMjMzNjYzOTQlN0MuCQAINDcyCRIJCQgwJTcFBBA2NTcwMQkZBDM4ASIBDSQtMjE0NzQ4MzYzCScoMjMa\ - 3gEKOAoSCgdNUygSB1NUQVRJT04SGSEemC0wOC0yM1QxMDozNDowMCswMjowMCIHUExBTk5FRAobCg4KAzEzMhU2FRsMKAEKHw1XDDAyMThKIQAIAgo6DSFBfxUhABoy\ - eAAMMToxM0Z4ALgoAxIYEAMaBjAwMDAxMSICSVIqAjE2MgQyMTY5Kg5QVUJMSUNfSk9VUk5FWRrFAVZpADbhAAgxOjJSaQAVxgwyMTE5FaUZ5wAEFV1BYRUhPsYAADUh\ - ODo-ARwoBRIaCAMQBTbIABwzNzIEMjI2Nz7IAA==\ - """); - assertThat(trip.isAlternative()).isFalse(); - assertThat(trip.isValid()).isFalse(); - - java.util.List segments = trip.getSegments(); - assertThat(segments.size()).isEqualTo(1); - - Segment segment = segments.get(0); - assertThat(segment.getType()).isEqualTo(Segment.TypeEnum.PUBLIC_JOURNEY); - - java.util.List stops = segment.getStops(); - assertThat(stops.size()).isEqualTo(2); - - Stop stop000 = stops.get(0); - - LocationIdentity id2_000 = stop000.getId2(); - assertThat(id2_000.getValue()).isEqualTo("8507000"); - assertThat(id2_000.getType()).isEqualTo("UIC"); - assertThat(id2_000.getExternalId()).isNull(); - - assertThat(stop000.getName()).isEqualTo("Bern"); - assertThat(stop000.getDepartureDateTime()) - .isEqualTo(OffsetDateTime.of(1999, 12, 31, 23, 0, 0, 0, ZoneOffset.of("Z"))); - assertThat(stop000.getDepartureDateTimeRt()).isNull(); - assertThat(stop000.getDepartureDelayText()).isNull(); - assertThat(stop000.getArrivalDateTime()).isNull(); - assertThat(stop000.getArrivalDateTimeRt()).isNull(); - assertThat(stop000.getArrivalDelayText()).isNull(); - assertThat(stop000.getDepartureTrack()).isEqualTo("7"); - assertThat(stop000.getDepartureTrackRt()).isNull(); - assertThat(stop000.isDeparturePlatformChanged()).isFalse(); - assertThat(stop000.isDelayUndefined()).isFalse(); - assertThat(stop000.getArrivalTrack()).isNull(); - assertThat(stop000.getArrivalTrackRt()).isNull(); - assertThat(stop000.isArrivalPlatformChanged()).isFalse(); - assertThat(stop000.getStopStatus()).isEqualTo(Stop.StopStatusEnum.PLANNED); - assertThat(stop000.isRequestStop()).isFalse(); - assertThat(stop000.getBoardingAlightingStatus()) - .isEqualTo(Stop.BoardingAlightingStatusEnum.BOARDING_ALIGHTING); - assertThat(stop000.getRouteIndex()).isNull(); - assertThat(stop000.isTariffBorder()).isFalse(); - - Stop stop001 = stops.get(1); - - LocationIdentity id2_001 = stop001.getId2(); - assertThat(id2_001.getValue()).isEqualTo("8503000"); - assertThat(id2_001.getType()).isEqualTo("UIC"); - assertThat(id2_001.getExternalId()).isNull(); - - assertThat(stop001.getName().matches("Z.rich HB")).isTrue(); - assertThat(stop001.getDepartureDateTime()).isNull(); - assertThat(stop001.getDepartureDateTimeRt()).isNull(); - assertThat(stop001.getDepartureDelayText()).isNull(); - assertThat(stop001.getArrivalDateTime()) - .isEqualTo(OffsetDateTime.of(2000, 1, 1, 0, 0, 0, 0, ZoneOffset.of("Z"))); - assertThat(stop001.getArrivalDateTimeRt()).isNull(); - assertThat(stop001.getArrivalDelayText()).isNull(); - assertThat(stop001.getDepartureTrack()).isNull(); - assertThat(stop001.getDepartureTrackRt()).isNull(); - assertThat(stop001.isDeparturePlatformChanged()).isFalse(); - assertThat(stop001.isDelayUndefined()).isFalse(); - assertThat(stop001.getArrivalTrack()).isEqualTo("33"); - assertThat(stop001.getArrivalTrackRt()).isEqualTo("19"); - assertThat(stop001.isArrivalPlatformChanged()).isTrue(); - assertThat(stop001.getStopStatus()).isEqualTo(Stop.StopStatusEnum.PLANNED); - assertThat(stop001.isRequestStop()).isFalse(); - assertThat(stop001.getBoardingAlightingStatus()).isEqualTo(Stop.BoardingAlightingStatusEnum.ALIGHTING); - assertThat(stop001.getRouteIndex()).isNull(); - assertThat(stop001.isTariffBorder()).isFalse(); - - TransportProduct transportProduct = segment.getTransportProduct(); - assertThat(transportProduct.getName()).isNull(); - assertThat(transportProduct.getCategoryShortForm()).isEqualTo("IC"); - assertThat(transportProduct.getCategoryLongForm()).isEqualTo("Intercity"); - assertThat(transportProduct.getLine()).isEqualTo("1"); - assertThat(transportProduct.getNumber()).isEqualTo("721"); - assertThat(transportProduct.getVehicleType()).isEqualTo(TransportProduct.VehicleTypeEnum.TRAIN); - - java.util.List attributes = segment.getAttributes(); - assertThat(attributes.size()).isEqualTo(6); - - Note attribute000 = attributes.get(0); - assertThat(attribute000.getKey()).isEqualTo("RR"); - assertThat(attribute000.getValue()).isEqualTo("Restaurant"); - assertThat(attribute000.getPriority()).isNull(); - assertThat(attribute000.getRouteIndexFrom()).isNull(); - assertThat(attribute000.getRouteIndexTo()).isNull(); - - Note attribute001 = attributes.get(1); - assertThat(attribute001.getKey()).isEqualTo("CC"); - assertThat(attribute001.getValue()).isEqualTo("Couchette"); - assertThat(attribute001.getPriority()).isNull(); - assertThat(attribute001.getRouteIndexFrom()).isNull(); - assertThat(attribute001.getRouteIndexTo()).isNull(); - - Note attribute002 = attributes.get(2); - assertThat(attribute002.getKey()).isEqualTo("WS"); - assertThat(attribute002.getValue()).isEqualTo("Bistro"); - assertThat(attribute002.getPriority()).isNull(); - assertThat(attribute002.getRouteIndexFrom()).isNull(); - assertThat(attribute002.getRouteIndexTo()).isNull(); - - Note attribute003 = attributes.get(3); - assertThat(attribute003.getKey()).isEqualTo("BZ"); - assertThat(attribute003.getValue()).isEqualTo("Business Zone"); - assertThat(attribute003.getPriority()).isNull(); - assertThat(attribute003.getRouteIndexFrom()).isNull(); - assertThat(attribute003.getRouteIndexTo()).isNull(); - - Note attribute004 = attributes.get(4); - assertThat(attribute004.getKey()).isEqualTo("FA"); - assertThat(attribute004.getValue()).isEqualTo("Familien Abteil"); - assertThat(attribute004.getPriority()).isNull(); - assertThat(attribute004.getRouteIndexFrom()).isNull(); - assertThat(attribute004.getRouteIndexTo()).isNull(); - - Note attribute005 = attributes.get(5); - assertThat(attribute005.getKey()).isEqualTo("RZ"); - assertThat(attribute005.getValue()).isEqualTo("Ruhezone"); - assertThat(attribute005.getPriority()).isNull(); - assertThat(attribute005.getRouteIndexFrom()).isNull(); - assertThat(attribute005.getRouteIndexTo()).isNull(); - - assertThat(segment.getMessages().isEmpty()); - assertThat(segment.getDirection()).isEqualTo("St. Gallen"); - assertThat(segment.getJourneyStatus()).isEqualTo(Segment.JourneyStatusEnum.PLANNED); - assertThat(segment.isCancelled()).isFalse(); - assertThat(segment.isPartiallyCancelled()).isFalse(); - assertThat(segment.isReachable()).isTrue(); - assertThat(segment.isRedirected()).isFalse(); - - assertThat(trip.getSearchHint()).isNull(); - assertThat(trip.getScrollCheckSum()).isNull(); - assertThat(trip.getEcoBalance()).isNull(); - } + private static final BpmProcess GET_TRIPS_COLLECTION_PROCESS = BpmProcess.path("GetTripsCollection"); + private static final BpmElement GET_TRIPS_COLLECTION_START = GET_TRIPS_COLLECTION_PROCESS + .elementName("call(GetTripsCollectionDataIn)"); + private static final BpmElement GET_TRIPS_COLLECTION = GET_TRIPS_COLLECTION_PROCESS + .elementName("Get Trips Collection"); + + private static final String MOCK_ARRIVAL_TIME = "5265-17-20T21:44:30"; + private static final String MOCK_DEPARTURE_TIME = "7184-02-28T22:32:10"; + private static final String MOCK_ORIGIN = "BernGleis 1"; + private static final String MOCK_DESTINATION = "BernGleis 10"; + + @Test + void call_mockedApi_returnsMockedResponse(BpmClient bpmClient) { + GetTripsCollectionDataHeaders getTripsCollectionDataHeaders = prepareGetTripsCollectionDataHeaders(); + GetTripsCollectionDataIn getTripsCollectionPlacesDataIn = prepareGetTripsCollectionDataIn( + getTripsCollectionDataHeaders); + List trips = List.create(Trip.class); + bpmClient.mock().element(GET_TRIPS_COLLECTION).with(in -> { + try { + GetTripsCollectionDataIn inGetTripsCollectionDataIn = (GetTripsCollectionDataIn) in.get(Constant.IN); + GetTripsCollectionDataHeaders inGetTripsCollectionDataHeaders = (GetTripsCollectionDataHeaders) inGetTripsCollectionDataIn + .get(Constant.HEADERS); + assertEquals(inGetTripsCollectionDataHeaders, getTripsCollectionDataHeaders); + assertEquals(inGetTripsCollectionDataHeaders.get(Constant.REQUESTOR_PARAMETER), + Constant.MOCK_REQUESTOR_VALUE); + assertEquals(inGetTripsCollectionDataHeaders.get(Constant.TRACEPARENT_PARAMETER), + Constant.MOCK_TRACEPARENT_VALUE); + assertEquals(inGetTripsCollectionDataHeaders.get(Constant.TRACESTATE_PARAMETER), + Constant.MOCK_TRACESTATE_VALUE); + assertEquals(inGetTripsCollectionDataHeaders.get(Constant.ACCEPT_LANGUAGE_PARAMETER), + Constant.MOCK_ACCEPT_LANGUAGE_VALUE); + + GetTripsCollectionDataParameters inGetTripsCollectionDataInParameters = (GetTripsCollectionDataParameters) inGetTripsCollectionDataIn + .get(Constant.PARAMS); + + assertEquals(inGetTripsCollectionDataInParameters.getArrivalTime(), MOCK_ARRIVAL_TIME); + assertEquals(inGetTripsCollectionDataInParameters.getDepartureTime(), MOCK_DEPARTURE_TIME); + StopPlaceRef origin = (StopPlaceRef) inGetTripsCollectionDataInParameters.getOrigin(); + assertEquals(origin.getStopPlaceRef(), MOCK_ORIGIN); + StopPlaceRef destination = (StopPlaceRef) inGetTripsCollectionDataInParameters.getDestination(); + assertEquals(destination.getStopPlaceRef(), MOCK_DESTINATION); + in.set(TRIPS, trips); + return in; + } catch (NoSuchFieldException ex) { + throw new RuntimeException(ex); + } + }); + + // Run + SubProcessCallResult result = bpmClient.start().subProcess(GET_TRIPS_COLLECTION_START) + .execute(getTripsCollectionPlacesDataIn).subResult(); + + // Assert + assertEquals(result.param(TRIPS, List.class), trips); + } + + @Test + void call_realApi_returnsRealResponse(BpmClient bpmClient) { + GetTripsCollectionDataHeaders getTripsCollectionDataHeaders = prepareGetTripsCollectionDataHeaders(); + GetTripsCollectionDataIn getTripsCollectionPlacesDataIn = prepareGetTripsCollectionDataIn( + getTripsCollectionDataHeaders); + + // Run + SubProcessCallResult result = bpmClient.start().subProcess(GET_TRIPS_COLLECTION_START) + .execute(getTripsCollectionPlacesDataIn).subResult(); + + // Assert + Assertions.assertTrue(result.param(TRIPS, List.class).size() > 0); + Trip trip = (Trip) result.param(TRIPS, List.class).get(0); + Assertions.assertTrue(trip != null && trip.getLegs().size() > 0); + } + + private GetTripsCollectionDataIn prepareGetTripsCollectionDataIn( + GetTripsCollectionDataHeaders getTripsCollectionDataHeaders) { + GetTripsCollectionDataParameters getTripsCollectionDataParameters = new GetTripsCollectionDataParameters(); + StopPlaceRef origin = new StopPlaceRef(); + origin.setStopPlaceRef(MOCK_ORIGIN); + getTripsCollectionDataParameters.setOrigin(origin); + + StopPlaceRef destination = new StopPlaceRef(); + destination.setStopPlaceRef(MOCK_DESTINATION); + getTripsCollectionDataParameters.setDestination(destination); + + getTripsCollectionDataParameters.setArrivalTime(MOCK_ARRIVAL_TIME); + getTripsCollectionDataParameters.setDepartureTime(MOCK_DEPARTURE_TIME); + + GetTripsCollectionDataIn getTripsCollectionDataIn = new GetTripsCollectionDataIn(); + getTripsCollectionDataIn.setHeaders(getTripsCollectionDataHeaders); + getTripsCollectionDataIn.setParams(getTripsCollectionDataParameters); + + return getTripsCollectionDataIn; + } + + private GetTripsCollectionDataHeaders prepareGetTripsCollectionDataHeaders() { + GetTripsCollectionDataHeaders getTripsCollectionDataHeaders = new GetTripsCollectionDataHeaders(); + getTripsCollectionDataHeaders.setRequestor(Constant.MOCK_REQUESTOR_VALUE); + getTripsCollectionDataHeaders.setTraceparent(Constant.MOCK_TRACEPARENT_VALUE); + getTripsCollectionDataHeaders.setTracestate(Constant.MOCK_TRACESTATE_VALUE); + getTripsCollectionDataHeaders.setAcceptLanguage(Constant.MOCK_ACCEPT_LANGUAGE_VALUE); + return getTripsCollectionDataHeaders; + } } diff --git a/sbb-connector-webtest/src_test/com/axonivy/connector/sbb/webtest/trip/ITBookTrip.java b/sbb-connector-webtest/src_test/com/axonivy/connector/sbb/webtest/trip/ITBookTrip.java index efe1de7..874c2eb 100644 --- a/sbb-connector-webtest/src_test/com/axonivy/connector/sbb/webtest/trip/ITBookTrip.java +++ b/sbb-connector-webtest/src_test/com/axonivy/connector/sbb/webtest/trip/ITBookTrip.java @@ -1,21 +1,16 @@ package com.axonivy.connector.sbb.webtest.trip; -import static com.codeborne.selenide.Condition.checked; -import static com.codeborne.selenide.Condition.empty; import static com.codeborne.selenide.Condition.text; -import static com.codeborne.selenide.Condition.value; import static com.codeborne.selenide.Selenide.$; import static com.codeborne.selenide.Selenide.$$; import static com.codeborne.selenide.Selenide.open; import static org.assertj.core.api.Assertions.assertThat; +import java.text.ParseException; import java.text.SimpleDateFormat; -import java.time.Instant; -import java.time.ZoneId; -import java.time.ZoneOffset; -import java.util.Calendar; import java.util.Date; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.openqa.selenium.By; import org.openqa.selenium.Keys; @@ -24,276 +19,90 @@ import com.axonivy.ivy.webtest.engine.EngineUrl; import com.codeborne.selenide.ElementsCollection; - @IvyWebTest class ITBookTrip { - private static final SimpleDateFormat DATE_FORMATTER_PRESENTABLE = new SimpleDateFormat("dd.MM.yyyy"); - private static final SimpleDateFormat DATE_FORMATTER = new SimpleDateFormat("yyyy-MM-dd"); - private static final SimpleDateFormat TIME_FORMATTER = new SimpleDateFormat("HH:mm"); - private static final ZoneOffset SWISS_ZONE_OFFSET = ZoneId.of("Europe/Zurich").getRules().getOffset(Instant.now()); - - @Test - void start_showInputTripSearchDataDialog_initialFieldValuesArePresent() { - open(EngineUrl.createProcessUrl("sbb-connector-demo/189FEADF3244D108/start.ivp")); - Date currentDate = new Date(); - - // Assert - $(By.id("form:from_input")).shouldHave(value("")); - $(By.id("form:to_input")).shouldHave(value("")); - $(By.id("form:date_input")).shouldHave(value(DATE_FORMATTER_PRESENTABLE.format(currentDate))); - $(By.id("form:time_input")).shouldHave(value(TIME_FORMATTER.format(currentDate))); - $(By.id("form:departureOrArrival_input")).shouldNotBe(checked); - } - - @Test - void start_inputTripSearchDataFieldsAreEmpty_proceedingShowsErrorMessages() { - open(EngineUrl.createProcessUrl("sbb-connector-demo/189FEADF3244D108/start.ivp")); - - // Empty fields - $(By.id("form:date_input")).sendKeys(Keys.CONTROL, "A", Keys.DELETE); - $(By.id("form:time_input")).sendKeys(Keys.CONTROL, "A", Keys.DELETE); - - // Proceed - $(By.id("form:proceed")).click(); - - // Assert - ElementsCollection errorMessages = $$(By.cssSelector(".ui-messages-error-summary")); - - assertThat(errorMessages).hasSize(4); - errorMessages.get(0).shouldHave(text("From: Value is required.")); - errorMessages.get(1).shouldHave(text("To: Value is required.")); - errorMessages.get(2).shouldHave(text("Date: Value is required.")); - errorMessages.get(3).shouldHave(text("Time: Value is required.")); - } - - @Test - void start_inputTripSearchDataFieldsDateAndTimeHaveInvalidContent_proceedingShowsErrorMessages() { - open(EngineUrl.createProcessUrl("sbb-connector-demo/189FEADF3244D108/start.ivp")); - - $(By.id("form:from_input")).setValue("AA"); - $(By.id("form:from_panel")).click(); - - $(By.id("form:to_input")).setValue("BB"); - $(By.id("form:to_panel")).click(); - - // Insert invalid content into fields Date and Time - $(By.id("form:date_input")).sendKeys(Keys.CONTROL, "A", Keys.DELETE); - $(By.id("form:date_input")).setValue("C"); - - $(By.id("form:time_input")).sendKeys(Keys.CONTROL, "A", Keys.DELETE); - $(By.id("form:time_input")).setValue("D"); - - // Proceed - $(By.id("form:proceed")).click(); - - // Assert - ElementsCollection errorMessages = $$(By.cssSelector(".ui-messages-error-summary")); - - assertThat(errorMessages).hasSize(2); - errorMessages.get(0).shouldHave(text("Date: 'C' could not be understood as a date.")); - errorMessages.get(1).shouldHave(text("Time: 'D' could not be understood as a time.")); - } - - @Test - void start_proceedFromInputTripSearchDataWithOptionEarliestDeparture_showShowTripsDialog() { - open(EngineUrl.createProcessUrl("sbb-connector-demo/189FEADF3244D108/start.ivp")); - Date currentDate = new Date(); - - // Fill fields of InputTripSearchData dialog - $(By.id("form:from_input")).setValue("AA"); - $(By.id("form:from_panel")).click(); - - $(By.id("form:to_input")).setValue("BB"); - $(By.id("form:to_panel")).click(); - - $(By.id("form:time_input")).sendKeys(Keys.CONTROL, "A", Keys.DELETE); - $(By.id("form:time_input")).setValue("10:00"); - - // Proceed - $(By.id("form:proceed")).click(); - - // Assert - $(By.id("form:trips:0:departureDate")).shouldHave(text(DATE_FORMATTER_PRESENTABLE.format(currentDate))); - assertThat($(By.id("form:trips:0:departureTime")).innerHtml().matches("10:00 .")).isTrue(); - assertThat($(By.id("form:trips:0:departureTime")).getAttribute("class").split(" ")).doesNotContain("red"); - assertThat($(By.id("form:trips:0:arrivalDate")).exists()).isFalse(); - $(By.id("form:trips:0:arrivalTime")).shouldHave(text("11:00")); - assertThat($(By.id("form:trips:0:arrivalTime")).getAttribute("class").split(" ")).doesNotContain("red"); - $(By.id("form:trips:0:duration")).shouldHave(text("Duration: 01:00")); - - assertThat($(By.id("icon")).getAttribute("class")).isEqualTo("fa-solid fa-train"); - - $(By.id("form:trips:0:segments:0:departureName")).shouldHave(text("Bern")); - $(By.id("form:trips:0:segments:0:departureDate")).shouldHave(text(DATE_FORMATTER_PRESENTABLE.format(currentDate))); - $(By.id("form:trips:0:segments:0:departureTime")).shouldHave(text("10:00")); - assertThat($(By.id("form:trips:0:segments:0:departureTime")).getAttribute("class").split(" ")) - .doesNotContain("red"); - $(By.id("form:trips:0:segments:0:departurePlatform")).shouldHave(text("Platform: 7")); - assertThat($(By.id("form:trips:0:segments:0:departurePlatform")).getAttribute("class").split(" ")) - .doesNotContain("red"); - - assertThat($(By.id("form:trips:0:segments:0:arrivalName")).innerHtml().matches("Z.rich HB")).isTrue(); - $(By.id("form:trips:0:segments:0:arrivalDate")).shouldBe(empty); - $(By.id("form:trips:0:segments:0:arrivalTime")).shouldHave(text("11:00")); - assertThat($(By.id("form:trips:0:segments:0:arrivalTime")).getAttribute("class").split(" ")) - .doesNotContain("red"); - $(By.id("form:trips:0:segments:0:arrivalPlatform")).shouldHave(text("Platform: 19")); - assertThat($(By.id("form:trips:0:segments:0:arrivalPlatform")).getAttribute("class").split(" ")) - .contains("red"); - - $(By.id("form:trips:0:segments:0:transportProductName")).shouldHave(text("IC 721")); - $(By.id("form:trips:0:segments:0:direction")).shouldHave(text("Direction: St. Gallen")); - - $(By.id("form:trips:0:onlineOffersLink")).shouldHave(text("Online Offers")); - assertThat($(By.id("form:trips:0:onlineOffersLink")).getAttribute("href")).isEqualTo(String.format( - """ - https://www.sbb.ch/en/buying/pages/fahrplan/fahrplan.xhtml?recon=wQg8CgJWMRKRBSVDMiVCNkhLSQkJgFQlMjRBJTNEMSU0ME8lM0RCZXJuJTQwWCU\ - zRDc0MzkxMwEZdFklM0Q0Njk0ODgzNCU0MEwlM0Q4NTA3MDAwJTQwYQE-EDI4JTQwOksAEEFhcmF1DUwgODA1MTI2OSU0CUwANwFaADYdTAwyMTEzPkwANDIwMjAwODI\ - zMTAzNCUyGQ8BKywyNElSKzE2KysrJTIBHQAxCQcNBhBDMiVBNz7aAP6PAC4mATRaJUMzJUJDcmljaCtIQhHkBDU0AcgZ5BA3ODE3NzkwADNKMAEV5AgxMjMy5AAENTI\ - J5AQzN2bkAAxCNktDAexAQjYlMjNWRSUyMzAlMjNDRiUhNAULAEERFABNDQkMU0lDVAEfCCUyMwk6BEtDSkMAMEVSRyUyMzIlMjNISU4NOjhFQ0slMjMzNjYzOTQlN0M\ - uCQAINDcyCRIJCQgwJTcFBBA2NTcwMQkZBDM4ASIBDSQtMjE0NzQ4MzYzCScoMjMa3gEKOAoSCgdNUygSB1NUQVRJT04SGSEemC0wOC0yM1QxMDozNDowMCswMjowMCI\ - HUExBTk5FRAobCg4KAzEzMhU2FRsMKAEKHw1XDDAyMThKIQAIAgo6DSFBfxUhABoyeAAMMToxM0Z4ALgoAxIYEAMaBjAwMDAxMSICSVIqAjE2MgQyMTY5Kg5QVUJMSUN\ - fSk9VUk5FWRrFAVZpADbhAAgxOjJSaQAVxgwyMTE5FaUZ5wAEFV1BYRUhPsYAADUhODo-ARwoBRIaCAMQBTbIABwzNzIEMjI2Nz7IAA==&datum=%s%s&zeit=1000\ - """, - DATE_FORMATTER.format(currentDate), - SWISS_ZONE_OFFSET.toString())); - } - - @Test - void start_proceedFromInputTripSearchDataWithOptionLatestArrival_showShowTripsDialog() { - open(EngineUrl.createProcessUrl("sbb-connector-demo/189FEADF3244D108/start.ivp")); - Date currentDate = new Date(); - - // Fill fields of InputTripSearchData dialog - $(By.id("form:departureOrArrival")).click(); - - $(By.id("form:from_input")).setValue("AA"); - $(By.id("form:from_panel")).click(); - - $(By.id("form:to_input")).setValue("BB"); - $(By.id("form:to_panel")).click(); - - $(By.id("form:time_input")).sendKeys(Keys.CONTROL, "A", Keys.DELETE); - $(By.id("form:time_input")).setValue("10:00"); - - // Proceed - $(By.id("form:proceed")).click(); - - // Assert - $(By.id("form:trips:0:departureDate")).shouldHave(text(DATE_FORMATTER_PRESENTABLE.format(currentDate))); - assertThat($(By.id("form:trips:0:departureTime")).innerHtml().matches("09:00 .")).isTrue(); - assertThat($(By.id("form:trips:0:departureTime")).getAttribute("class").split(" ")).doesNotContain("red"); - assertThat($(By.id("form:trips:0:arrivalDate")).exists()).isFalse(); - $(By.id("form:trips:0:arrivalTime")).shouldHave(text("10:00")); - assertThat($(By.id("form:trips:0:arrivalTime")).getAttribute("class").split(" ")).doesNotContain("red"); - $(By.id("form:trips:0:duration")).shouldHave(text("Duration: 01:00")); - - assertThat($(By.id("icon")).getAttribute("class")).isEqualTo("fa-solid fa-train"); - - $(By.id("form:trips:0:segments:0:departureName")).shouldHave(text("Bern")); - $(By.id("form:trips:0:segments:0:departureDate")).shouldHave(text(DATE_FORMATTER_PRESENTABLE.format(currentDate))); - $(By.id("form:trips:0:segments:0:departureTime")).shouldHave(text("09:00")); - assertThat($(By.id("form:trips:0:segments:0:departureTime")).getAttribute("class").split(" ")) - .doesNotContain("red"); - $(By.id("form:trips:0:segments:0:departurePlatform")).shouldHave(text("Platform: 7")); - assertThat($(By.id("form:trips:0:segments:0:departurePlatform")).getAttribute("class").split(" ")) - .doesNotContain("red"); - - assertThat($(By.id("form:trips:0:segments:0:arrivalName")).innerHtml().matches("Z.rich HB")).isTrue(); - $(By.id("form:trips:0:segments:0:arrivalDate")).shouldBe(empty); - $(By.id("form:trips:0:segments:0:arrivalTime")).shouldHave(text("10:00")); - assertThat($(By.id("form:trips:0:segments:0:arrivalTime")).getAttribute("class").split(" ")) - .doesNotContain("red"); - $(By.id("form:trips:0:segments:0:arrivalPlatform")).shouldHave(text("Platform: 19")); - assertThat($(By.id("form:trips:0:segments:0:arrivalPlatform")).getAttribute("class").split(" ")) - .contains("red"); - - $(By.id("form:trips:0:segments:0:transportProductName")).shouldHave(text("IC 721")); - $(By.id("form:trips:0:segments:0:direction")).shouldHave(text("Direction: St. Gallen")); - - $(By.id("form:trips:0:onlineOffersLink")).shouldHave(text("Online Offers")); - assertThat($(By.id("form:trips:0:onlineOffersLink")).getAttribute("href")).isEqualTo(String.format( - """ - https://www.sbb.ch/en/buying/pages/fahrplan/fahrplan.xhtml?recon=wQg8CgJWMRKRBSVDMiVCNkhLSQkJgFQlMjRBJTNEMSU0ME8lM0RCZXJuJTQwWCU\ - zRDc0MzkxMwEZdFklM0Q0Njk0ODgzNCU0MEwlM0Q4NTA3MDAwJTQwYQE-EDI4JTQwOksAEEFhcmF1DUwgODA1MTI2OSU0CUwANwFaADYdTAwyMTEzPkwANDIwMjAwODI\ - zMTAzNCUyGQ8BKywyNElSKzE2KysrJTIBHQAxCQcNBhBDMiVBNz7aAP6PAC4mATRaJUMzJUJDcmljaCtIQhHkBDU0AcgZ5BA3ODE3NzkwADNKMAEV5AgxMjMy5AAENTI\ - J5AQzN2bkAAxCNktDAexAQjYlMjNWRSUyMzAlMjNDRiUhNAULAEERFABNDQkMU0lDVAEfCCUyMwk6BEtDSkMAMEVSRyUyMzIlMjNISU4NOjhFQ0slMjMzNjYzOTQlN0M\ - uCQAINDcyCRIJCQgwJTcFBBA2NTcwMQkZBDM4ASIBDSQtMjE0NzQ4MzYzCScoMjMa3gEKOAoSCgdNUygSB1NUQVRJT04SGSEemC0wOC0yM1QxMDozNDowMCswMjowMCI\ - HUExBTk5FRAobCg4KAzEzMhU2FRsMKAEKHw1XDDAyMThKIQAIAgo6DSFBfxUhABoyeAAMMToxM0Z4ALgoAxIYEAMaBjAwMDAxMSICSVIqAjE2MgQyMTY5Kg5QVUJMSUN\ - fSk9VUk5FWRrFAVZpADbhAAgxOjJSaQAVxgwyMTE5FaUZ5wAEFV1BYRUhPsYAADUhODo-ARwoBRIaCAMQBTbIABwzNzIEMjI2Nz7IAA==&datum=%s%s&zeit=0900\ - """, - DATE_FORMATTER.format(currentDate), - SWISS_ZONE_OFFSET.toString())); - } - - @Test - void start_proceedFromInputTripSearchDataWithDayChangeDuringTrip_showShowTripsDialog() { - open(EngineUrl.createProcessUrl("sbb-connector-demo/189FEADF3244D108/start.ivp")); - Date currentDate = new Date(); - - Calendar calendar = Calendar.getInstance(); - calendar.setTime(currentDate); - calendar.add(Calendar.DAY_OF_MONTH, 1); - Date tomorrowDate = calendar.getTime(); - - // Fill fields of InputTripSearchData dialog - $(By.id("form:from_input")).setValue("AA"); - $(By.id("form:from_panel")).click(); - - $(By.id("form:to_input")).setValue("BB"); - $(By.id("form:to_panel")).click(); - - $(By.id("form:time_input")).sendKeys(Keys.CONTROL, "A", Keys.DELETE); - $(By.id("form:time_input")).setValue("23:30"); - - // Proceed - $(By.id("form:proceed")).click(); - - // Assert - $(By.id("form:trips:0:departureDate")).shouldHave(text(DATE_FORMATTER_PRESENTABLE.format(currentDate))); - assertThat($(By.id("form:trips:0:departureTime")).innerHtml().matches("23:30 .")).isTrue(); - assertThat($(By.id("form:trips:0:departureTime")).getAttribute("class").split(" ")).doesNotContain("red"); - $(By.id("form:trips:0:arrivalDate")).shouldHave(text(DATE_FORMATTER_PRESENTABLE.format(tomorrowDate))); - $(By.id("form:trips:0:arrivalTime")).shouldHave(text("00:30")); - assertThat($(By.id("form:trips:0:arrivalTime")).getAttribute("class").split(" ")).doesNotContain("red"); - $(By.id("form:trips:0:duration")).shouldHave(text("Duration: 01:00")); - - assertThat($(By.id("icon")).getAttribute("class")).isEqualTo("fa-solid fa-train"); - - $(By.id("form:trips:0:segments:0:departureName")).shouldHave(text("Bern")); - $(By.id("form:trips:0:segments:0:departureDate")).shouldHave(text(DATE_FORMATTER_PRESENTABLE.format(currentDate))); - $(By.id("form:trips:0:segments:0:departureTime")).shouldHave(text("23:30")); - assertThat($(By.id("form:trips:0:segments:0:departureTime")).getAttribute("class").split(" ")) - .doesNotContain("red"); - $(By.id("form:trips:0:segments:0:departurePlatform")).shouldHave(text("Platform: 7")); - assertThat($(By.id("form:trips:0:segments:0:departurePlatform")).getAttribute("class").split(" ")) - .doesNotContain("red"); - - assertThat($(By.id("form:trips:0:segments:0:arrivalName")).innerHtml().matches("Z.rich HB")).isTrue(); - $(By.id("form:trips:0:segments:0:arrivalDate")).shouldHave(text(DATE_FORMATTER_PRESENTABLE.format(tomorrowDate))); - $(By.id("form:trips:0:segments:0:arrivalTime")).shouldHave(text("00:30")); - assertThat($(By.id("form:trips:0:segments:0:arrivalTime")).getAttribute("class").split(" ")) - .doesNotContain("red"); - $(By.id("form:trips:0:segments:0:arrivalPlatform")).shouldHave(text("Platform: 19")); - assertThat($(By.id("form:trips:0:segments:0:arrivalPlatform")).getAttribute("class").split(" ")) - .contains("red"); - - $(By.id("form:trips:0:segments:0:transportProductName")).shouldHave(text("IC 721")); - $(By.id("form:trips:0:segments:0:direction")).shouldHave(text("Direction: St. Gallen")); - - $(By.id("form:trips:0:onlineOffersLink")).shouldHave(text("Online Offers")); - assertThat($(By.id("form:trips:0:onlineOffersLink")).getAttribute("href")).isEqualTo(String.format( - """ - https://www.sbb.ch/en/buying/pages/fahrplan/fahrplan.xhtml?recon=wQg8CgJWMRKRBSVDMiVCNkhLSQkJgFQlMjRBJTNEMSU0ME8lM0RCZXJuJTQwWCU\ - zRDc0MzkxMwEZdFklM0Q0Njk0ODgzNCU0MEwlM0Q4NTA3MDAwJTQwYQE-EDI4JTQwOksAEEFhcmF1DUwgODA1MTI2OSU0CUwANwFaADYdTAwyMTEzPkwANDIwMjAwODI\ - zMTAzNCUyGQ8BKywyNElSKzE2KysrJTIBHQAxCQcNBhBDMiVBNz7aAP6PAC4mATRaJUMzJUJDcmljaCtIQhHkBDU0AcgZ5BA3ODE3NzkwADNKMAEV5AgxMjMy5AAENTI\ - J5AQzN2bkAAxCNktDAexAQjYlMjNWRSUyMzAlMjNDRiUhNAULAEERFABNDQkMU0lDVAEfCCUyMwk6BEtDSkMAMEVSRyUyMzIlMjNISU4NOjhFQ0slMjMzNjYzOTQlN0M\ - uCQAINDcyCRIJCQgwJTcFBBA2NTcwMQkZBDM4ASIBDSQtMjE0NzQ4MzYzCScoMjMa3gEKOAoSCgdNUygSB1NUQVRJT04SGSEemC0wOC0yM1QxMDozNDowMCswMjowMCI\ - HUExBTk5FRAobCg4KAzEzMhU2FRsMKAEKHw1XDDAyMThKIQAIAgo6DSFBfxUhABoyeAAMMToxM0Z4ALgoAxIYEAMaBjAwMDAxMSICSVIqAjE2MgQyMTY5Kg5QVUJMSUN\ - fSk9VUk5FWRrFAVZpADbhAAgxOjJSaQAVxgwyMTE5FaUZ5wAEFV1BYRUhPsYAADUhODo-ARwoBRIaCAMQBTbIABwzNzIEMjI2Nz7IAA==&datum=%s%s&zeit=2330\ - """, - DATE_FORMATTER.format(currentDate), - SWISS_ZONE_OFFSET.toString())); - } + private static final SimpleDateFormat DATE_FORMATTER_PRESENTABLE = new SimpleDateFormat("dd.MM.yyyy"); + private static final SimpleDateFormat DATE_TIME_FORMATTER_PRESENTABLE = new SimpleDateFormat("dd.MM.yyyy HH:mm"); + private static final String MOCK_DATE_VALUE = "10.06.2023"; + private static final String ERROR_MESSAGE_CLASS = ".ui-messages-error-summary"; + + @BeforeEach + void startDemoProcess() { + open(EngineUrl.createProcessUrl("sbb-connector-demo/189FEADF3244D108/start.ivp")); + } + + @Test + void start_inputTripSearchDataFieldsAreEmpty_proceedingShowsErrorMessages() { + startDemoProcess(); + + processToShowTrip(); + + // Assert + ElementsCollection errorMessages = $$(By.cssSelector(ERROR_MESSAGE_CLASS)); + assertThat(errorMessages).hasSize(4); + errorMessages.get(0).shouldHave(text("From: Value is required.")); + errorMessages.get(1).shouldHave(text("To: Value is required.")); + errorMessages.get(2).shouldHave(text("Departure date: Value is required.")); + errorMessages.get(3).shouldHave(text("Arrival date: Value is required.")); + } + + @Test + void start_inputTripSearchDataFieldsDateAndTimeHaveInvalidContent_proceedingShowsErrorMessages() { + startDemoProcess(); + selectFromAndTo(); + + // Insert invalid content into fields Date and Time + $(By.id("form:departure-date_input")).sendKeys(Keys.CONTROL, "A", Keys.DELETE); + $(By.id("form:departure-date_input")).setValue("C"); + + $(By.id("form:arrival-date_input")).sendKeys(Keys.CONTROL, "A", Keys.DELETE); + $(By.id("form:arrival-date_input")).setValue("D"); + + processToShowTrip(); + + // Assert + ElementsCollection errorMessages = $$(By.cssSelector(ERROR_MESSAGE_CLASS)); + assertThat(errorMessages).hasSize(2); + errorMessages.get(0).shouldHave(text("Departure date: 'C' could not be understood as a date and time.")); + errorMessages.get(1).shouldHave(text("Arrival date: 'D' could not be understood as a date and time.")); + } + + @Test + void start_proceedFromInputTripSearchDataWithOptionEarliestDeparture_showShowTripsDialog() throws ParseException { + startDemoProcess(); + Date date = DATE_FORMATTER_PRESENTABLE.parse(MOCK_DATE_VALUE); + String dateStr = DATE_TIME_FORMATTER_PRESENTABLE.format(date); + + selectFromAndTo(); + + $(By.id("form:departure-date_input")).setValue(dateStr); + $(By.id("form:arrival-date_input")).setValue(dateStr); + + processToShowTrip(); + + // Assert + assertThat($(By.id("icon")).getAttribute("class")).isEqualTo("fa-solid fa-train-tram"); + $(By.id("form:trips:0:departure-date")).shouldHave(text(MOCK_DATE_VALUE)); + $(By.id("form:trips:0:duration")).shouldHave(text("Duration: 00:15")); + $(By.id("form:trips:0:segments:0:departure-name")).shouldHave(text("BurgdorfGleis 2")); + $(By.id("form:trips:0:segments:0:arrival-name")).shouldHave(text("BernGleis 9")); + $(By.id("form:trips:0:segments:0:departure-date")).shouldHave(text(MOCK_DATE_VALUE)); + $(By.id("form:trips:0:segments:0:arrival-date")).shouldHave(text(MOCK_DATE_VALUE)); + $(By.id("form:trips:0:segments:0:direction")).shouldHave(text("Out bound")); + $(By.id("form:trips:0:segments:0:transport-name")).shouldHave(text("Zug")); + $(By.id("form:trips:0:segments:0:published-service-name")).shouldHave(text("IR 17 2828")); + $(By.id("form:trips:0:segments:0:transport-description")).shouldHave(text("InterRegio")); + } + + private void selectFromAndTo() { + $(By.id("form:from_input")).setValue("Bern"); + $(By.id("form:from_panel")).click(); + $(By.id("form:to_input")).setValue("Burg"); + $(By.id("form:to_panel")).click(); + } + + private void processToShowTrip() { + $(By.id("form:proceed")).click(); + } } diff --git a/sbb-connector/.classpath b/sbb-connector/.classpath index cddce2d..61b4248 100644 --- a/sbb-connector/.classpath +++ b/sbb-connector/.classpath @@ -5,7 +5,7 @@ - + @@ -25,5 +25,6 @@ + diff --git a/sbb-connector/config/rest-clients.yaml b/sbb-connector/config/rest-clients.yaml index 44028f2..9c710c9 100644 --- a/sbb-connector/config/rest-clients.yaml +++ b/sbb-connector/config/rest-clients.yaml @@ -1,3 +1,4 @@ +# yaml-language-server: $schema=https://json-schema.axonivy.com/app/12.0.0/rest-clients.json RestClients: #The SBB Swiss Mobility API is an interface that you can integrate into your own distribution system. Timetable and fare details are made available to you via this interface. Swiss Mobility API (B2P API): @@ -5,8 +6,8 @@ RestClients: Url: ${ivy.var.sbbConnector.uri} Icon: res:/webContent/icons/sbb.png Features: - - ch.ivyteam.ivy.rest.client.mapper.JsonFeature - com.axonivy.connector.sbb.auth.OAuth2Feature + - ch.ivyteam.ivy.rest.client.mapper.JsonFeature Properties: AUTH.clientId: ${ivy.var.sbbConnector.clientId} AUTH.clientSecret: ${decrypt:\u00AC\u0078\u004A\u00A5\u000B\u0039\u0050\u0072\u0026\u0091\u000E\u0012\u00D2\u0048\u00F6\u009F\u0012\u00CB\u0048\u00B2\u00B2\u0098\u001A\u00BE\u0098\u0070\u0063\u0067\u0010\u00A4\u00A9\u00F5\u002E\u0097\u0021\u0041\u00D7\u001E\u00A5\u0049\u003B\u0065\u0001\u006C\u00EF\u0024\u00D4\u0008\u0031\u0036\u0081\u00DD\u0096\u0013\u00CE\u0016\u00B5\u00FD\u0049\u00D0\u00BE\u004F\u0031\u0032\u00B9\u00DA\u0031\u0097\u0065\u0062\u00FB\u008B\u0050\u00DA\u0008\u0015\u0082\u0019\u00EE\u0007\u0051\u0080\u0026\u005C\u0020\u0095\u00B9\u0026\u0032\u00E6\u0019\u004B\u00DB\u0060\u006F\u004E\u006E\u0016\u00F7\u0052\u0042\u00DE\u00E8\u00A7\u000E\u0046\u00B9\u00BD\u0066\u001F\u0069\u0003\u0006\u00DB\u00BA\u00D3\u00C2\u004E\u0047\u000E\u0013\u00A2\u003B\u00B0\u0053\u000F\u00DB\u00C2\u000D\u0066\u003B\u00A0\u00F1\u00E1\u006C\u00CF\u00D4\u0091\u0008\u0069\u00D4\u0041\u0056\u00BD\u0078\u002E\u0003\u0066\u00B7\u0060\u00A5\u0090\u00A1\u00FF\u00DE\u0009\u0005\u0061\u0013\u0084\u006A\u007C\u00ED\u009C\u000F\u0065\u00AE\u0087\u00EA\u00E8\u0005\u0032\u004E\u0094\u0068\u0071\u006B\u0017\u0055\u00C4\u0092\u00DE\u00E7\u0046\u007C\u0051\u00DE\u0082\u002E\u00A6\u0097\u004A\u0047\u0065\u0043\u004F\u00F4\u00DE\u0091\u003C\u0035\u0018\u005F\u00F2\u0066\u0026\u00F7\u0002\u0095\u001D\u003E\u005E\u0088\u007D\u00DC\u0004\u00E9\u004E\u00A0\u00DA\u00C2\u00A5\u005F\u00CF} @@ -15,3 +16,20 @@ RestClients: OpenAPI: SpecUrl: file:///C:/Users/zugPcLgi/Downloads/api-docs.json Namespace: ch.sbb.app.b2p.client + #This API is one of the modules of the SBB Swiss Mobility API suite (see the SBB Swiss Mobility API Overview). + #The SBB Swiss Mobility API - Journey is a REST API that enables SBB partners to request for places and trips for swiss public transportation in the OSDM Version 3 standard. + SBB Swiss Mobility API - Journey: + UUID: 13022aee-0653-4076-b253-a87b352403c8 + Url: ${ivy.var.sbbConnector.journeyUri} + Icon: res:/webContent/icons/sbb.png + Features: + - com.axonivy.connector.sbb.auth.OAuth2Feature + - com.axonivy.connector.sbb.connector.rest.osdmdata.OSDMDataJsonFeature + Properties: + AUTH.clientId: ${ivy.var.sbbConnector.clientId} + AUTH.clientSecret: ${decrypt:\u00AC\u0078\u004A\u00A5\u000B\u0039\u0050\u0072\u0026\u0091\u000E\u0012\u00D2\u0048\u00F6\u009F\u0012\u00CB\u0048\u00B2\u00B2\u0098\u001A\u00BE\u0098\u0070\u0063\u0067\u0010\u00A4\u00A9\u00F5\u002E\u0097\u0021\u0041\u00D7\u001E\u00A5\u0049\u003B\u0065\u0001\u006C\u00EF\u0024\u00D4\u0008\u0031\u0036\u0081\u00DD\u0096\u0013\u00CE\u0016\u00B5\u00FD\u0049\u00D0\u00BE\u004F\u0031\u0032\u00B9\u00DA\u0031\u0097\u0065\u0062\u00FB\u008B\u0050\u00DA\u0008\u0015\u0082\u0019\u00EE\u0007\u0051\u0080\u0026\u005C\u0020\u0095\u00B9\u0026\u0032\u00E6\u0019\u004B\u00DB\u0060\u006F\u004E\u006E\u0016\u00F7\u0052\u0042\u00DE\u00E8\u00A7\u000E\u0046\u00B9\u00BD\u0066\u001F\u0069\u0003\u0006\u00DB\u00BA\u00D3\u00C2\u004E\u0047\u000E\u0013\u00A2\u003B\u00B0\u0053\u000F\u00DB\u00C2\u000D\u0066\u003B\u00A0\u00F1\u00E1\u006C\u00CF\u00D4\u0091\u0008\u0069\u00D4\u0041\u0056\u00BD\u0078\u002E\u0003\u0066\u00B7\u0060\u00A5\u0090\u00A1\u00FF\u00DE\u0009\u0005\u0061\u0013\u0084\u006A\u007C\u00ED\u009C\u000F\u0065\u00AE\u0087\u00EA\u00E8\u0005\u0032\u004E\u0094\u0068\u0071\u006B\u0017\u0055\u00C4\u0092\u00DE\u00E7\u0046\u007C\u0051\u00DE\u0082\u002E\u00A6\u0097\u004A\u0047\u0065\u0043\u004F\u00F4\u00DE\u0091\u003C\u0035\u0018\u005F\u00F2\u0066\u0026\u00F7\u0002\u0095\u001D\u003E\u005E\u0088\u007D\u00DC\u0004\u00E9\u004E\u00A0\u00DA\u00C2\u00A5\u005F\u00CF} + AUTH.tokenEndpoint: ${ivy.var.sbbConnector.tokenEndpoint} + AUTH.scope: ${ivy.var.sbbConnector.scope} + OpenAPI: + SpecUrl: file:///C:/Users/phhung/Downloads/api-docs.yaml + Namespace: ch.sbb.api.smapi.osdm.journey.client diff --git a/sbb-connector/config/variables.yaml b/sbb-connector/config/variables.yaml index 6483dd4..06669e7 100644 --- a/sbb-connector/config/variables.yaml +++ b/sbb-connector/config/variables.yaml @@ -14,3 +14,7 @@ Variables: tokenEndpoint: '' # The scope provided to you by SBB. scope: '' + # The URI of the Journey SBB Swiss Mobility API to use . For example: `https://smapi-osdm-journey-int.api.sbb.ch` (integration) or `https://smapi-osdm-journey.api.sbb.ch` (production) + journeyUri: '' + # The requestor header contains detailed information about who is calling the API. It can include information such as channel, organization, sales unit or workstation id and be used to configure e.g. the fare range provided to the caller. The content of the string is part of a bilateral contract by the two parties and not standardized by OSDM. It is recommend to encrypt the information transferred. + requestor: '' diff --git a/sbb-connector/dataclasses/com/axonivy/connector/sbb/place/GetPlacesData.d.json b/sbb-connector/dataclasses/com/axonivy/connector/sbb/place/GetPlacesData.d.json new file mode 100644 index 0000000..3c3f084 --- /dev/null +++ b/sbb-connector/dataclasses/com/axonivy/connector/sbb/place/GetPlacesData.d.json @@ -0,0 +1,14 @@ +{ + "$schema" : "https://json-schema.axonivy.com/data-class/12.0.0/data-class.json", + "simpleName" : "GetPlacesData", + "namespace" : "com.axonivy.connector.sbb.place", + "isBusinessCaseData" : false, + "fields" : [ { + "name" : "places", + "type" : "List" + }, { + "name" : "in", + "type" : "com.axonivy.connector.sbb.place.GetPlacesDataIn", + "modifiers" : [ "PERSISTENT" ] + } ] +} \ No newline at end of file diff --git a/sbb-connector/dataclasses/com/axonivy/connector/sbb/place/GetPlacesDataHeaders.d.json b/sbb-connector/dataclasses/com/axonivy/connector/sbb/place/GetPlacesDataHeaders.d.json new file mode 100644 index 0000000..39a6a84 --- /dev/null +++ b/sbb-connector/dataclasses/com/axonivy/connector/sbb/place/GetPlacesDataHeaders.d.json @@ -0,0 +1,23 @@ +{ + "$schema" : "https://json-schema.axonivy.com/data-class/12.0.0/data-class.json", + "simpleName" : "GetPlacesDataHeaders", + "namespace" : "com.axonivy.connector.sbb.place", + "isBusinessCaseData" : false, + "fields" : [ { + "name" : "requestor", + "type" : "String", + "comment" : "REQUIRED. The requestor header contains detailed information about who is calling the API. It can include information such as channel, organization, sales unit or workstation id and be used to configure e.g. the fare range provided to the caller. The content of the string is part of a bilateral contract by the two parties and not standardized by OSDM. It is recommend to encrypt the information transferred." + }, { + "name" : "acceptLanguage", + "type" : "String", + "comment" : "Describes the set of natural languages that are preferred for localized text in the response to the request (see RFC2616-sec14.4). Supporting English (en) is a must." + }, { + "name" : "traceparent", + "type" : "String", + "comment" : "The traceparent header describes the position of the incoming request in its trace graph in a portable, fixed-length format. Its design focuses on fast parsing. Every tracing tool MUST properly set traceparent even when it only relies on vendor-specific information in tracestate (see W3C Trace Context)." + }, { + "name" : "tracestate", + "type" : "String", + "comment" : "The tracestate extends traceparent with vendor-specific data represented by a set of name/value pairs. Storing information in tracestate is optional (see W3C Trace Context)." + } ] +} \ No newline at end of file diff --git a/sbb-connector/dataclasses/com/axonivy/connector/sbb/place/GetPlacesDataIn.d.json b/sbb-connector/dataclasses/com/axonivy/connector/sbb/place/GetPlacesDataIn.d.json new file mode 100644 index 0000000..abafd44 --- /dev/null +++ b/sbb-connector/dataclasses/com/axonivy/connector/sbb/place/GetPlacesDataIn.d.json @@ -0,0 +1,13 @@ +{ + "$schema" : "https://json-schema.axonivy.com/data-class/12.0.0/data-class.json", + "simpleName" : "GetPlacesDataIn", + "namespace" : "com.axonivy.connector.sbb.place", + "isBusinessCaseData" : false, + "fields" : [ { + "name" : "headers", + "type" : "com.axonivy.connector.sbb.place.GetPlacesDataHeaders" + }, { + "name" : "params", + "type" : "com.axonivy.connector.sbb.place.GetPlacesDataParameters" + } ] +} \ No newline at end of file diff --git a/sbb-connector/dataclasses/com/axonivy/connector/sbb/place/GetPlacesDataParameters.d.json b/sbb-connector/dataclasses/com/axonivy/connector/sbb/place/GetPlacesDataParameters.d.json new file mode 100644 index 0000000..0848b93 --- /dev/null +++ b/sbb-connector/dataclasses/com/axonivy/connector/sbb/place/GetPlacesDataParameters.d.json @@ -0,0 +1,20 @@ +{ + "$schema" : "https://json-schema.axonivy.com/data-class/12.0.0/data-class.json", + "simpleName" : "GetPlacesDataParameters", + "namespace" : "com.axonivy.connector.sbb.place", + "isBusinessCaseData" : false, + "fields" : [ { + "name" : "restrictions", + "type" : "ch.sbb.api.smapi.osdm.journey.client.PlaceParam" + }, { + "name" : "name", + "type" : "String", + "modifiers" : [ "PERSISTENT" ] + }, { + "name" : "geoPositionLatitude", + "type" : "Number" + }, { + "name" : "geoPositionLongitude", + "type" : "Number" + } ] +} \ No newline at end of file diff --git a/sbb-connector/dataclasses/com/axonivy/connector/sbb/tripscollection/GetTripsCollectionData.d.json b/sbb-connector/dataclasses/com/axonivy/connector/sbb/tripscollection/GetTripsCollectionData.d.json new file mode 100644 index 0000000..584c107 --- /dev/null +++ b/sbb-connector/dataclasses/com/axonivy/connector/sbb/tripscollection/GetTripsCollectionData.d.json @@ -0,0 +1,14 @@ +{ + "$schema" : "https://json-schema.axonivy.com/data-class/12.0.0/data-class.json", + "simpleName" : "GetTripsCollectionData", + "namespace" : "com.axonivy.connector.sbb.tripscollection", + "isBusinessCaseData" : false, + "fields" : [ { + "name" : "trips", + "type" : "List" + }, { + "name" : "in", + "type" : "com.axonivy.connector.sbb.tripscollection.GetTripsCollectionDataIn", + "modifiers" : [ "PERSISTENT" ] + } ] +} \ No newline at end of file diff --git a/sbb-connector/dataclasses/com/axonivy/connector/sbb/tripscollection/GetTripsCollectionDataHeaders.d.json b/sbb-connector/dataclasses/com/axonivy/connector/sbb/tripscollection/GetTripsCollectionDataHeaders.d.json new file mode 100644 index 0000000..2a1e6ea --- /dev/null +++ b/sbb-connector/dataclasses/com/axonivy/connector/sbb/tripscollection/GetTripsCollectionDataHeaders.d.json @@ -0,0 +1,23 @@ +{ + "$schema" : "https://json-schema.axonivy.com/data-class/12.0.0/data-class.json", + "simpleName" : "GetTripsCollectionDataHeaders", + "namespace" : "com.axonivy.connector.sbb.tripscollection", + "isBusinessCaseData" : false, + "fields" : [ { + "name" : "requestor", + "type" : "String", + "comment" : "REQUIRED. The requestor header contains detailed information about who is calling the API. It can include information such as channel, organization, sales unit or workstation id and be used to configure e.g. the fare range provided to the caller. The content of the string is part of a bilateral contract by the two parties and not standardized by OSDM. It is recommend to encrypt the information transferred." + }, { + "name" : "acceptLanguage", + "type" : "String", + "comment" : "Describes the set of natural languages that are preferred for localized text in the response to the request (see RFC2616-sec14.4). Supporting English (en) is a must." + }, { + "name" : "traceparent", + "type" : "String", + "comment" : "The traceparent header describes the position of the incoming request in its trace graph in a portable, fixed-length format. Its design focuses on fast parsing. Every tracing tool MUST properly set traceparent even when it only relies on vendor-specific information in tracestate (see W3C Trace Context)." + }, { + "name" : "tracestate", + "type" : "String", + "comment" : "The tracestate extends traceparent with vendor-specific data represented by a set of name/value pairs. Storing information in tracestate is optional (see W3C Trace Context)." + } ] +} \ No newline at end of file diff --git a/sbb-connector/dataclasses/com/axonivy/connector/sbb/tripscollection/GetTripsCollectionDataIn.d.json b/sbb-connector/dataclasses/com/axonivy/connector/sbb/tripscollection/GetTripsCollectionDataIn.d.json new file mode 100644 index 0000000..340fc0d --- /dev/null +++ b/sbb-connector/dataclasses/com/axonivy/connector/sbb/tripscollection/GetTripsCollectionDataIn.d.json @@ -0,0 +1,13 @@ +{ + "$schema" : "https://json-schema.axonivy.com/data-class/12.0.0/data-class.json", + "simpleName" : "GetTripsCollectionDataIn", + "namespace" : "com.axonivy.connector.sbb.tripscollection", + "isBusinessCaseData" : false, + "fields" : [ { + "name" : "headers", + "type" : "com.axonivy.connector.sbb.tripscollection.GetTripsCollectionDataHeaders" + }, { + "name" : "params", + "type" : "com.axonivy.connector.sbb.tripscollection.GetTripsCollectionDataParameters" + } ] +} \ No newline at end of file diff --git a/sbb-connector/dataclasses/com/axonivy/connector/sbb/tripscollection/GetTripsCollectionDataParameters.d.json b/sbb-connector/dataclasses/com/axonivy/connector/sbb/tripscollection/GetTripsCollectionDataParameters.d.json new file mode 100644 index 0000000..f3cef9e --- /dev/null +++ b/sbb-connector/dataclasses/com/axonivy/connector/sbb/tripscollection/GetTripsCollectionDataParameters.d.json @@ -0,0 +1,34 @@ +{ + "$schema" : "https://json-schema.axonivy.com/data-class/12.0.0/data-class.json", + "simpleName" : "GetTripsCollectionDataParameters", + "namespace" : "com.axonivy.connector.sbb.tripscollection", + "isBusinessCaseData" : false, + "fields" : [ { + "name" : "arrivalTime", + "type" : "String" + }, { + "name" : "departureTime", + "type" : "String" + }, { + "name" : "destination", + "type" : "ch.sbb.api.smapi.osdm.journey.client.OneOfTripSearchCriteriaDestination" + }, { + "name" : "embed", + "type" : "List" + }, { + "name" : "notVias", + "type" : "List" + }, { + "name" : "origin", + "type" : "ch.sbb.api.smapi.osdm.journey.client.OneOfTripSearchCriteriaOrigin" + }, { + "name" : "parameters", + "type" : "ch.sbb.api.smapi.osdm.journey.client.TripParameters" + }, { + "name" : "returnSearchParameters", + "type" : "ch.sbb.api.smapi.osdm.journey.client.ReturnSearchParameters" + }, { + "name" : "vias", + "type" : "List" + } ] +} \ No newline at end of file diff --git a/sbb-connector/lib/generated/rest/jaxRsClient_13022aee-0653-4076-b253-a87b352403c8.jar b/sbb-connector/lib/generated/rest/jaxRsClient_13022aee-0653-4076-b253-a87b352403c8.jar new file mode 100644 index 0000000000000000000000000000000000000000..c0083c4818d0375713e4c5fe8177c079beaa8095 GIT binary patch literal 274444 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

#h{mqrgwYn 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%0D7k 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 B_s;+T literal 0 HcmV?d00001 diff --git a/sbb-connector/processes/GetLocations.p.json b/sbb-connector/processes/GetLocations.p.json index 30569ad..697e657 100644 --- a/sbb-connector/processes/GetLocations.p.json +++ b/sbb-connector/processes/GetLocations.p.json @@ -30,7 +30,8 @@ } }, "tags" : [ - "connector" + "connector", + "deprecated" ], "visual" : { "at" : { "x" : 96, "y" : 64 }, diff --git a/sbb-connector/processes/GetPlaces.p.json b/sbb-connector/processes/GetPlaces.p.json new file mode 100644 index 0000000..e20cf75 --- /dev/null +++ b/sbb-connector/processes/GetPlaces.p.json @@ -0,0 +1,91 @@ +{ + "$schema" : "https://json-schema.axonivy.com/process/12.0.0/process.json", + "id" : "193FCC46D4415009", + "kind" : "CALLABLE_SUB", + "config" : { + "data" : "com.axonivy.connector.sbb.place.GetPlacesData" + }, + "elements" : [ { + "id" : "f0", + "type" : "CallSubStart", + "name" : "call(GetPlacesDataIn)", + "config" : { + "signature" : "call", + "input" : { + "params" : [ + { "name" : "getPlacesDataIn", "type" : "com.axonivy.connector.sbb.place.GetPlacesDataIn", "desc" : "" } + ], + "map" : { + "out.in" : "param.getPlacesDataIn" + } + }, + "result" : { + "params" : [ + { "name" : "places", "type" : "List", "desc" : "" } + ], + "map" : { + "result.places" : "in.places" + } + } + }, + "tags" : [ + "connector" + ], + "visual" : { + "at" : { "x" : 96, "y" : 64 }, + "icon" : "res:/webContent/icons/sbb.png?small" + }, + "connect" : [ + { "id" : "f2", "to" : "f3" } + ] + }, { + "id" : "f1", + "type" : "CallSubEnd", + "visual" : { + "at" : { "x" : 360, "y" : 64 }, + "labelOffset" : { "x" : 13, "y" : 33 } + } + }, { + "id" : "f3", + "type" : "RestClientCall", + "name" : "Get Places", + "config" : { + "method" : "POST", + "target" : { + "clientId" : "13022aee-0653-4076-b253-a87b352403c8", + "path" : "/v1/places", + "headers" : { + "Requestor" : "ivy.var.sbbConnector_requestor", + "Accept-Language" : "in.in.headers.acceptLanguage", + "traceparent" : "in.in.headers.traceparent", + "tracestate" : "in.in.headers.tracestate" + } + }, + "body" : { + "entity" : { + "type" : "ch.sbb.api.smapi.osdm.journey.client.PlaceRequest", + "map" : { + "param.placeInput.geoPosition.latitude" : "in.in.params.geoPositionLatitude", + "param.placeInput.geoPosition.longitude" : "in.in.params.geoPositionLongitude", + "param.placeInput.name" : "in.in.params.name", + "param.restrictions" : "in.in.params.restrictions" + } + } + }, + "response" : { + "entity" : { + "type" : "ch.sbb.api.smapi.osdm.journey.client.PlaceResponse", + "map" : { + "out.places" : "result.places" + } + } + } + }, + "visual" : { + "at" : { "x" : 232, "y" : 64 } + }, + "connect" : [ + { "id" : "f4", "to" : "f1", "color" : "default" } + ] + } ] +} \ No newline at end of file diff --git a/sbb-connector/processes/GetTrips.p.json b/sbb-connector/processes/GetTrips.p.json index c2d2f03..fe43360 100644 --- a/sbb-connector/processes/GetTrips.p.json +++ b/sbb-connector/processes/GetTrips.p.json @@ -30,7 +30,8 @@ } }, "tags" : [ - "connector" + "connector", + "deprecated" ], "visual" : { "at" : { "x" : 96, "y" : 64 }, diff --git a/sbb-connector/processes/GetTripsCollection.p.json b/sbb-connector/processes/GetTripsCollection.p.json new file mode 100644 index 0000000..811bb54 --- /dev/null +++ b/sbb-connector/processes/GetTripsCollection.p.json @@ -0,0 +1,96 @@ +{ + "$schema" : "https://json-schema.axonivy.com/process/12.0.0/process.json", + "id" : "193FD1D89FF5B75B", + "kind" : "CALLABLE_SUB", + "config" : { + "data" : "com.axonivy.connector.sbb.tripscollection.GetTripsCollectionData" + }, + "elements" : [ { + "id" : "f0", + "type" : "CallSubStart", + "name" : "call(GetTripsCollectionDataIn)", + "config" : { + "signature" : "call", + "input" : { + "params" : [ + { "name" : "getTripsCollectionDataIn", "type" : "com.axonivy.connector.sbb.tripscollection.GetTripsCollectionDataIn", "desc" : "" } + ], + "map" : { + "out.in" : "param.getTripsCollectionDataIn" + } + }, + "result" : { + "params" : [ + { "name" : "trips", "type" : "List", "desc" : "" } + ], + "map" : { + "result.trips" : "in.trips" + } + } + }, + "tags" : [ + "connector" + ], + "visual" : { + "at" : { "x" : 96, "y" : 64 }, + "icon" : "res:/webContent/icons/sbb.png?small" + }, + "connect" : [ + { "id" : "f2", "to" : "f3" } + ] + }, { + "id" : "f1", + "type" : "CallSubEnd", + "visual" : { + "at" : { "x" : 376, "y" : 64 }, + "labelOffset" : { "x" : 13, "y" : 33 } + } + }, { + "id" : "f3", + "type" : "RestClientCall", + "name" : "Get Trips Collection", + "config" : { + "method" : "POST", + "target" : { + "clientId" : "13022aee-0653-4076-b253-a87b352403c8", + "path" : "/v1/trips-collection", + "headers" : { + "Requestor" : "ivy.var.sbbConnector_requestor", + "Accept-Language" : "in.in.headers.acceptLanguage", + "traceparent" : "in.in.headers.traceparent", + "tracestate" : "in.in.headers.tracestate" + } + }, + "body" : { + "entity" : { + "type" : "ch.sbb.api.smapi.osdm.journey.client.TripSearchCriteria", + "map" : { + "param.arrivalTime" : "in.in.params.arrivalTime", + "param.departureTime" : "in.in.params.departureTime", + "param.destination" : "in.in.params.destination", + "param.embed" : "in.in.params.embed", + "param.notVias" : "in.in.params.notVias", + "param.origin" : "in.in.params.origin", + "param.parameters" : "in.in.params.parameters", + "param.returnSearchParameters" : "in.in.params.returnSearchParameters", + "param.vias" : "in.in.params.vias" + } + } + }, + "response" : { + "entity" : { + "type" : "ch.sbb.api.smapi.osdm.journey.client.TripCollectionResponse", + "map" : { + "out.trips" : "result.trips" + } + } + } + }, + "visual" : { + "at" : { "x" : 248, "y" : 64 } + }, + "connect" : [ + { "id" : "f4", "to" : "f1", "color" : "default" } + ] + } ] +} \ No newline at end of file diff --git a/sbb-connector/src/com/axonivy/connector/sbb/connector/rest/osdmdata/OSDMDataJsonFeature.java b/sbb-connector/src/com/axonivy/connector/sbb/connector/rest/osdmdata/OSDMDataJsonFeature.java new file mode 100644 index 0000000..a40c58e --- /dev/null +++ b/sbb-connector/src/com/axonivy/connector/sbb/connector/rest/osdmdata/OSDMDataJsonFeature.java @@ -0,0 +1,34 @@ +package com.axonivy.connector.sbb.connector.rest.osdmdata; + +import javax.ws.rs.Priorities; +import javax.ws.rs.core.FeatureContext; +import javax.ws.rs.core.MediaType; + +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider; + +import ch.ivyteam.ivy.rest.client.mapper.JsonFeature; + +public class OSDMDataJsonFeature extends JsonFeature { + + @Override + public boolean configure(FeatureContext context) { + JacksonJsonProvider provider = new JaxRsClientJson(); + configure(provider, context.getConfiguration()); + context.register(provider, Priorities.ENTITY_CODER); + return true; + } + + public static class JaxRsClientJson extends JacksonJsonProvider { + @Override + public ObjectMapper locateMapper(Class type, MediaType mediaType) { + ObjectMapper mapper = super.locateMapper(type, mediaType); + mapper.setSerializationInclusion(Include.NON_NULL); + mapper.registerModule(new JavaTimeModule()); + mapper.registerModule(new OSDMDataTypeCustomizations(mapper)); + return mapper; + } + } +} \ No newline at end of file diff --git a/sbb-connector/src/com/axonivy/connector/sbb/connector/rest/osdmdata/OSDMDataTypeCustomizations.java b/sbb-connector/src/com/axonivy/connector/sbb/connector/rest/osdmdata/OSDMDataTypeCustomizations.java new file mode 100644 index 0000000..78864fb --- /dev/null +++ b/sbb-connector/src/com/axonivy/connector/sbb/connector/rest/osdmdata/OSDMDataTypeCustomizations.java @@ -0,0 +1,19 @@ +package com.axonivy.connector.sbb.connector.rest.osdmdata; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.module.SimpleModule; + +import ch.sbb.api.smapi.osdm.journey.client.OneOfTripSearchCriteriaOrigin; +import ch.sbb.api.smapi.osdm.journey.client.PlaceResponse; +import ch.sbb.api.smapi.osdm.journey.client.TripCollectionResponse; + +public class OSDMDataTypeCustomizations extends SimpleModule { + + private static final long serialVersionUID = 7937918079183158890L; + + public OSDMDataTypeCustomizations(ObjectMapper mapper) { + addDeserializer(PlaceResponse.class, new PlaceResponseDeserializer(mapper)); + addDeserializer(TripCollectionResponse.class, new TripCollectionResponseDeserializer(mapper)); + addSerializer(OneOfTripSearchCriteriaOrigin.class, new OneOfTripSearchCriteriaOriginSerializer()); + } +} diff --git a/sbb-connector/src/com/axonivy/connector/sbb/connector/rest/osdmdata/OneOfTripSearchCriteriaOriginSerializer.java b/sbb-connector/src/com/axonivy/connector/sbb/connector/rest/osdmdata/OneOfTripSearchCriteriaOriginSerializer.java new file mode 100644 index 0000000..cb2deef --- /dev/null +++ b/sbb-connector/src/com/axonivy/connector/sbb/connector/rest/osdmdata/OneOfTripSearchCriteriaOriginSerializer.java @@ -0,0 +1,55 @@ +package com.axonivy.connector.sbb.connector.rest.osdmdata; + +import java.io.IOException; + +import com.axonivy.connector.sbb.constant.Constant; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.jsontype.TypeSerializer; + +import ch.sbb.api.smapi.osdm.journey.client.AddressRef; +import ch.sbb.api.smapi.osdm.journey.client.FareConnectionPointRef; +import ch.sbb.api.smapi.osdm.journey.client.GeoPositionRef; +import ch.sbb.api.smapi.osdm.journey.client.OneOfTripSearchCriteriaOrigin; +import ch.sbb.api.smapi.osdm.journey.client.PointOfInterestRef; +import ch.sbb.api.smapi.osdm.journey.client.StopPlaceRef; + +public class OneOfTripSearchCriteriaOriginSerializer extends JsonSerializer { + + @Override + public void serialize(OneOfTripSearchCriteriaOrigin origin, JsonGenerator gen, SerializerProvider provider) + throws IOException { + // Do nothing + } + + @Override + public void serializeWithType(OneOfTripSearchCriteriaOrigin value, JsonGenerator gen, + SerializerProvider serializers, TypeSerializer typeSer) throws IOException { + gen.writeStartObject(); + if (value instanceof AddressRef) { + AddressRef addressRef = (AddressRef) value; + writeStringFields(gen, addressRef.getClass().getSimpleName(), addressRef.getAddressRef()); + } else if (value instanceof StopPlaceRef) { + StopPlaceRef stopPlaceRef = (StopPlaceRef) value; + writeStringFields(gen, stopPlaceRef.getClass().getSimpleName(), stopPlaceRef.getStopPlaceRef()); + } else if (value instanceof FareConnectionPointRef) { + FareConnectionPointRef fareConnectionPointRef = (FareConnectionPointRef) value; + writeStringFields(gen, fareConnectionPointRef.getClass().getSimpleName(), fareConnectionPointRef.getName()); + } else if (value instanceof GeoPositionRef) { + GeoPositionRef geoPositionRef = (GeoPositionRef) value; + writeStringFields(gen, geoPositionRef.getClass().getSimpleName(), geoPositionRef.getObjectType()); + } else if (value instanceof PointOfInterestRef) { + PointOfInterestRef pointOfInterestRef = (PointOfInterestRef) value; + writeStringFields(gen, pointOfInterestRef.getClass().getSimpleName(), + pointOfInterestRef.getPointOfInterestRef()); + } + gen.writeEndObject(); + } + + private void writeStringFields(JsonGenerator gen, String objName, String objValue) throws IOException { + gen.writeStringField(Constant.OBJECT_TYPE_JSON_PROPERTY, objName); + String lowerCaseFirstCharacter = Character.toLowerCase(objName.charAt(0)) + objName.substring(1); + gen.writeStringField(lowerCaseFirstCharacter, objValue); + } +} diff --git a/sbb-connector/src/com/axonivy/connector/sbb/connector/rest/osdmdata/PlaceResponseDeserializer.java b/sbb-connector/src/com/axonivy/connector/sbb/connector/rest/osdmdata/PlaceResponseDeserializer.java new file mode 100644 index 0000000..3f66638 --- /dev/null +++ b/sbb-connector/src/com/axonivy/connector/sbb/connector/rest/osdmdata/PlaceResponseDeserializer.java @@ -0,0 +1,80 @@ +package com.axonivy.connector.sbb.connector.rest.osdmdata; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +import com.axonivy.connector.sbb.constant.Constant; +import com.fasterxml.jackson.core.JacksonException; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; + +import ch.sbb.api.smapi.osdm.journey.client.Address; +import ch.sbb.api.smapi.osdm.journey.client.FareConnectionPoint; +import ch.sbb.api.smapi.osdm.journey.client.OneOfPlaceResponsePlacesItems; +import ch.sbb.api.smapi.osdm.journey.client.PlaceResponse; +import ch.sbb.api.smapi.osdm.journey.client.PointOfInterest; +import ch.sbb.api.smapi.osdm.journey.client.StopPlace; + +public class PlaceResponseDeserializer extends JsonDeserializer { + private ObjectMapper mapper; + + public PlaceResponseDeserializer(ObjectMapper mapper) { + this.mapper = mapper; + } + + @Override + public PlaceResponse deserialize(JsonParser parser, DeserializationContext context) + throws IOException, JacksonException { + JsonNode node = parser.readValueAsTree(); + return extractPlaceResponse(node); + } + + private PlaceResponse extractPlaceResponse(JsonNode node) throws JsonProcessingException, IllegalArgumentException { + PlaceResponse result = new PlaceResponse(); + if (Objects.nonNull(node)) { + List places = new ArrayList<>(); + if (node.has(Constant.PLACES)) { + JsonNode placesNode = node.get(Constant.PLACES); + if (placesNode != null && placesNode.isArray()) { + for (JsonNode placeNode : placesNode) { + if (placeNode.has(Constant.OBJECT_TYPE_JSON_PROPERTY) && StopPlace.class.getSimpleName() + .equals(placeNode.get(Constant.OBJECT_TYPE_JSON_PROPERTY).asText())) { + String stopPlaceJson = placeNode.toString().replace(Constant.OBJECT_TYPE_JSON_PROPERTY, + Constant.TYPE_JSON_PROPERTY); + OneOfPlaceResponsePlacesItems place = mapper.readValue(stopPlaceJson, StopPlace.class); + places.add(place); + } else if (placeNode.has(Constant.OBJECT_TYPE_JSON_PROPERTY) && PointOfInterest.class + .getSimpleName().equals(placeNode.get(Constant.OBJECT_TYPE_JSON_PROPERTY).asText())) { + String pointOfInterestJson = placeNode.toString() + .replace(Constant.OBJECT_TYPE_JSON_PROPERTY, Constant.TYPE_JSON_PROPERTY); + OneOfPlaceResponsePlacesItems place = mapper.readValue(pointOfInterestJson, + PointOfInterest.class); + places.add(place); + } else if (placeNode.has(Constant.OBJECT_TYPE_JSON_PROPERTY) && Address.class.getSimpleName() + .equals(placeNode.get(Constant.OBJECT_TYPE_JSON_PROPERTY).asText())) { + String addressJson = placeNode.toString().replace(Constant.OBJECT_TYPE_JSON_PROPERTY, + Constant.TYPE_JSON_PROPERTY); + OneOfPlaceResponsePlacesItems place = mapper.readValue(addressJson, Address.class); + places.add(place); + } else if (placeNode.has(Constant.OBJECT_TYPE_JSON_PROPERTY) && FareConnectionPoint.class + .getSimpleName().equals(placeNode.get(Constant.OBJECT_TYPE_JSON_PROPERTY).asText())) { + String fareConnectionPointJson = placeNode.toString() + .replace(Constant.OBJECT_TYPE_JSON_PROPERTY, Constant.TYPE_JSON_PROPERTY); + OneOfPlaceResponsePlacesItems place = mapper.readValue(fareConnectionPointJson, + FareConnectionPoint.class); + places.add(place); + } + } + } + result.setPlaces(places); + } + } + return result; + } +} diff --git a/sbb-connector/src/com/axonivy/connector/sbb/connector/rest/osdmdata/TripCollectionResponseDeserializer.java b/sbb-connector/src/com/axonivy/connector/sbb/connector/rest/osdmdata/TripCollectionResponseDeserializer.java new file mode 100644 index 0000000..fa08451 --- /dev/null +++ b/sbb-connector/src/com/axonivy/connector/sbb/connector/rest/osdmdata/TripCollectionResponseDeserializer.java @@ -0,0 +1,55 @@ +package com.axonivy.connector.sbb.connector.rest.osdmdata; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +import com.axonivy.connector.sbb.constant.Constant; +import com.fasterxml.jackson.core.JacksonException; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; + +import ch.sbb.api.smapi.osdm.journey.client.Trip; +import ch.sbb.api.smapi.osdm.journey.client.TripCollectionResponse; + +public class TripCollectionResponseDeserializer extends JsonDeserializer { + private ObjectMapper mapper; + + public TripCollectionResponseDeserializer(ObjectMapper mapper) { + this.mapper = mapper; + } + + @Override + public TripCollectionResponse deserialize(JsonParser parser, DeserializationContext context) + throws IOException, JacksonException { + + JsonNode node = parser.readValueAsTree(); + return extractTripResponse(node); + } + + private TripCollectionResponse extractTripResponse(JsonNode node) + throws JsonProcessingException, IllegalArgumentException { + TripCollectionResponse result = new TripCollectionResponse(); + if (Objects.nonNull(node)) { + List trips = new ArrayList<>(); + if (node.has(Constant.TRIPS)) { + JsonNode tripsNode = node.get(Constant.TRIPS); + if (tripsNode != null && tripsNode.isArray()) { + for (JsonNode tripNode : tripsNode) { + String tripNodeJson = tripNode.toString().replace(Constant.OBJECT_TYPE_JSON_PROPERTY, + Constant.TYPE_JSON_PROPERTY); + Trip trip = mapper.readValue(tripNodeJson, Trip.class); + trips.add(trip); + } + } + } + result.setTrips(trips); + } + return result; + } +} \ No newline at end of file diff --git a/sbb-connector/src/com/axonivy/connector/sbb/constant/Constant.java b/sbb-connector/src/com/axonivy/connector/sbb/constant/Constant.java new file mode 100644 index 0000000..db7f852 --- /dev/null +++ b/sbb-connector/src/com/axonivy/connector/sbb/constant/Constant.java @@ -0,0 +1,8 @@ +package com.axonivy.connector.sbb.constant; + +public class Constant { + public final static String PLACES = "places"; + public final static String TRIPS = "trips"; + public final static String OBJECT_TYPE_JSON_PROPERTY = "objectType"; + public final static String TYPE_JSON_PROPERTY = "@type"; +} diff --git a/sbb-connector/src/com/axonivy/connector/sbb/utils/DateUtils.java b/sbb-connector/src/com/axonivy/connector/sbb/utils/DateUtils.java new file mode 100644 index 0000000..1f466c3 --- /dev/null +++ b/sbb-connector/src/com/axonivy/connector/sbb/utils/DateUtils.java @@ -0,0 +1,15 @@ +package com.axonivy.connector.sbb.utils; + +import java.time.ZoneOffset; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Date; + +public class DateUtils { + public static String convertDateToISO8601(Date date, int ZoneOffsetHours) { + ZonedDateTime zonedDateTime = date.toInstant().atZone(ZoneOffset.ofHours(ZoneOffsetHours)); + + // Format to ISO 8601 string + return zonedDateTime.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME); + } +} From 914832df1988c78bdaab1709285b95cb94b8868e Mon Sep 17 00:00:00 2001 From: PHAM HOANG HUNG Date: Thu, 2 Jan 2025 15:04:06 +0700 Subject: [PATCH 10/12] clean up redundant data and remove configuration in demo yaml --- .github/workflows/ci.yml | 2 ++ .github/workflows/dev.yml | 2 ++ sbb-connector-demo/config/variables.yaml | 18 ----------- sbb-connector-demo/processes/BookTrip.p.json | 3 +- .../InputTripSearchDataData.d.json | 32 +++---------------- .../InputTripSearchDataProcess.p.json | 32 ++++++++----------- .../demo/ShowTrips/ShowTripsProcess.p.json | 6 ++-- sbb-connector-test/pom.xml | 12 ++++++- sbb-connector-webtest/pom.xml | 10 ++++++ sbb-connector/config/variables.yaml | 18 +++++------ sbb-connector/processes/GetPlaces.p.json | 2 +- .../processes/GetTripsCollection.p.json | 2 +- 12 files changed, 58 insertions(+), 81 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index bd4b9c4..b04500f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -10,3 +10,5 @@ on: jobs: build: uses: axonivy-market/github-workflows/.github/workflows/ci.yml@v5 + secrets: + mvnArgs: -DjourneyUri=${{ secrets.JOURNEY_URI }} -DclientId=${{ secrets.CLIENT_ID }} \ No newline at end of file diff --git a/.github/workflows/dev.yml b/.github/workflows/dev.yml index ae5e6c3..3abb433 100644 --- a/.github/workflows/dev.yml +++ b/.github/workflows/dev.yml @@ -9,3 +9,5 @@ on: jobs: build: uses: axonivy-market/github-workflows/.github/workflows/dev.yml@v5 + secrets: + mvnArgs: -DjourneyUri=${{ secrets.JOURNEY_URI }} -DclientId=${{ secrets.CLIENT_ID }} diff --git a/sbb-connector-demo/config/variables.yaml b/sbb-connector-demo/config/variables.yaml index b64a603..e96d3ef 100644 --- a/sbb-connector-demo/config/variables.yaml +++ b/sbb-connector-demo/config/variables.yaml @@ -1,20 +1,2 @@ # yaml-language-server: $schema=https://json-schema.axonivy.com/app/12.0.0/variables.json Variables: - sbbConnector: - # The URI of the API to use. For example: `https://b2p-int.api.sbb.ch` (integration) or `https://b2p.api.sbb.ch` (production) - uri: '' - # The contract id provided to you by SBB. For Example: `ACP1024` - contractId: '' - # The client id provided to you by SBB. For Example: `01234567-89ab-cdef-0123-456789abcdef` - clientId: DEMO - # The client secret provided to you by SBB. - #[password] - clientSecret: ${decrypt:} - # The endpoint for acquiring the bearer token using your client id and secret. For Example: `https://login.microsoftonline.com/2cda5d11-f0ac-46b3-967d-af1b2e1bd01a/oauth2/v2.0` - tokenEndpoint: '' - # The scope provided to you by SBB. - scope: '' - # The URI of the Journey SBB Swiss Mobility API to use . For example: `https://smapi-osdm-journey-int.api.sbb.ch` (integration) or `https://smapi-osdm-journey.api.sbb.ch` (production) - journeyUri: 'https://smapi-osdm-journey-mock.app.sbb.ch' - # The requestor header contains detailed information about who is calling the API. It can include information such as channel, organization, sales unit or workstation id and be used to configure e.g. the fare range provided to the caller. The content of the string is part of a bilateral contract by the two parties and not standardized by OSDM. It is recommend to encrypt the information transferred. - requestor: 'tester' diff --git a/sbb-connector-demo/processes/BookTrip.p.json b/sbb-connector-demo/processes/BookTrip.p.json index 1098143..76454a6 100644 --- a/sbb-connector-demo/processes/BookTrip.p.json +++ b/sbb-connector-demo/processes/BookTrip.p.json @@ -63,7 +63,8 @@ "processCall" : "GetTripsCollection:call(com.axonivy.connector.sbb.tripscollection.GetTripsCollectionDataIn)", "call" : { "map" : { - "param.getTripsCollectionDataIn" : "in.getTripsCollectionDataIn" + "param.getTripsCollectionDataIn" : "in.getTripsCollectionDataIn", + "param.getTripsCollectionDataIn.headers.requestor" : "ivy.session.getSessionUserName()" } }, "output" : { diff --git a/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/InputTripSearchData/InputTripSearchDataData.d.json b/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/InputTripSearchData/InputTripSearchDataData.d.json index 6c3737e..f39b1ff 100644 --- a/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/InputTripSearchData/InputTripSearchDataData.d.json +++ b/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/InputTripSearchData/InputTripSearchDataData.d.json @@ -6,38 +6,10 @@ "fields" : [ { "name" : "getPlacesDataIn", "type" : "com.axonivy.connector.sbb.place.GetPlacesDataIn" - }, { - "name" : "locations", - "type" : "List", - "comment" : "Return value of subprocess GetLocations." - }, { - "name" : "locationNames", - "type" : "List", - "comment" : "List of Location names returned by subprocess GetLocations. Used for autocomplete dropdown menu of input fields From and To." - }, { - "name" : "locationFrom", - "type" : "ch.sbb.app.b2p.client.Location", - "comment" : "Selected Location from autocomplete dropdown menu of input field From." - }, { - "name" : "locationTo", - "type" : "ch.sbb.app.b2p.client.Location", - "comment" : "Selected Location from autocomplete dropdown menu of input field To." }, { "name" : "selectEvent", "type" : "org.primefaces.event.SelectEvent", "comment" : "Event triggered by selection of Location name in autocomplete dropdown menu to set locationFrom or locationTo." - }, { - "name" : "time", - "type" : "Time", - "comment" : "Content of input field Time." - }, { - "name" : "arrival", - "type" : "Boolean", - "comment" : "Flag to determine whether to search for earliest departure or latest arrival at given date and time. False: Earliest departure; True: Latest arrival" - }, { - "name" : "getTripsDataIn", - "type" : "com.axonivy.connector.sbb.trip.GetTripsDataIn", - "comment" : "Argument for subprocess GetTrips." }, { "name" : "places", "type" : "List" @@ -66,5 +38,9 @@ }, { "name" : "destination", "type" : "String" + }, { + "name" : "placeNames", + "type" : "List", + "comment" : "List of place names returned by subprocess GetPlaces. Used for autocomplete dropdown menu of input fields From and To." } ] } \ No newline at end of file diff --git a/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/InputTripSearchData/InputTripSearchDataProcess.p.json b/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/InputTripSearchData/InputTripSearchDataProcess.p.json index bd0c364..768d195 100644 --- a/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/InputTripSearchData/InputTripSearchDataProcess.p.json +++ b/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/InputTripSearchData/InputTripSearchDataProcess.p.json @@ -15,9 +15,7 @@ "params" : [ { "name" : "getTripsDataIn", "type" : "com.axonivy.connector.sbb.trip.GetTripsDataIn", "desc" : "" } ], - "map" : { - "out.time" : "new Time()" - } + "map" : { } }, "result" : { "params" : [ @@ -74,7 +72,8 @@ } }, "visual" : { - "at" : { "x" : 224, "y" : 160 } + "at" : { "x" : 248, "y" : 161 }, + "size" : { "width" : 160, "height" : 62 } }, "connect" : [ { "id" : "f5", "to" : "f4" } @@ -96,10 +95,10 @@ }, "result" : { "params" : [ - { "name" : "locationNames", "type" : "List", "desc" : "" } + { "name" : "placeNames", "type" : "List", "desc" : "" } ], "map" : { - "result.locationNames" : "in.locationNames" + "result.placeNames" : "in.placeNames" } }, "guid" : "189FE45FF14E72DE" @@ -135,12 +134,13 @@ }, "connect" : [ { "id" : "f18", "to" : "f17", "label" : { - "name" : "Yes" + "name" : "Yes", + "offset" : { "x" : -3, "y" : -10 } } }, { "id" : "f24", "to" : "f23", "via" : [ { "x" : 224, "y" : 256 } ], "label" : { "name" : "No", "segment" : 1.14, - "offset" : { "x" : -45, "y" : 46 } + "offset" : { "x" : -28, "y" : 46 } } } ] }, { @@ -151,6 +151,7 @@ "processCall" : "GetPlaces:call(com.axonivy.connector.sbb.place.GetPlacesDataIn)", "call" : { "map" : { + "param.getPlacesDataIn.headers.requestor" : "ivy.session.getSessionUserName()", "param.getPlacesDataIn.params.name" : "in.getPlacesDataIn.params.name" } }, @@ -176,12 +177,12 @@ "output" : { "map" : { "out" : "in", - "out.locationNames" : "in.locationNames" + "out.placeNames" : "in.placeNames" }, "code" : [ "import com.axonivy.connector.sbb.demo.trip.PlaceUtils;", "", - "in.locationNames = PlaceUtils.getNameOfPlaces(in.places);" + "in.placeNames = PlaceUtils.getNameOfPlaces(in.places);" ] } }, @@ -202,14 +203,14 @@ }, { "id" : "f23", "type" : "Script", - "name" : "Empty locationNames", + "name" : "Empty place names", "config" : { "output" : { "map" : { "out" : "in", - "out.locationNames" : "in.locationNames" + "out.placeNames" : "in.placeNames" }, - "code" : "in.locationNames = new List();" + "code" : "in.placeNames = new List();" } }, "visual" : { @@ -224,11 +225,6 @@ "name" : "Set Place Ref", "config" : { "output" : { - "map" : { - "out" : "in", - "out.locationFrom" : "in.locationFrom", - "out.locationTo" : "in.locationTo" - }, "code" : [ "import com.axonivy.connector.sbb.demo.trip.PlaceUtils;", "String nameOfPlace = String.valueOf(in.selectEvent.getObject());", diff --git a/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/ShowTrips/ShowTripsProcess.p.json b/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/ShowTrips/ShowTripsProcess.p.json index cecc478..cd549c0 100644 --- a/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/ShowTrips/ShowTripsProcess.p.json +++ b/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/ShowTrips/ShowTripsProcess.p.json @@ -31,7 +31,7 @@ "id" : "f1", "type" : "HtmlDialogEnd", "visual" : { - "at" : { "x" : 480, "y" : 80 } + "at" : { "x" : 432, "y" : 80 } } }, { "id" : "f3", @@ -180,8 +180,8 @@ } }, "visual" : { - "at" : { "x" : 288, "y" : 80 }, - "size" : { "width" : 176, "height" : 94 } + "at" : { "x" : 266, "y" : 80 }, + "size" : { "width" : 140, "height" : 64 } }, "connect" : [ { "id" : "f2", "to" : "f1" } diff --git a/sbb-connector-test/pom.xml b/sbb-connector-test/pom.xml index 9cce70a..f52a6f3 100644 --- a/sbb-connector-test/pom.xml +++ b/sbb-connector-test/pom.xml @@ -20,7 +20,7 @@ com.axonivy.connector.sbb - sbb-connector-demo + sbb-connector ${project.version} iar @@ -63,6 +63,16 @@ ${project.build.plugin.version} true + + maven-surefire-plugin + 3.5.2 + + + ${journeyUri} + ${clientId} + + + diff --git a/sbb-connector-webtest/pom.xml b/sbb-connector-webtest/pom.xml index 3a05cfd..e53abee 100644 --- a/sbb-connector-webtest/pom.xml +++ b/sbb-connector-webtest/pom.xml @@ -53,6 +53,16 @@ ${project.build.plugin.version} true + + maven-surefire-plugin + 3.5.2 + + + ${journeyUri} + ${clientId} + + + \ No newline at end of file diff --git a/sbb-connector/config/variables.yaml b/sbb-connector/config/variables.yaml index 06669e7..2503b72 100644 --- a/sbb-connector/config/variables.yaml +++ b/sbb-connector/config/variables.yaml @@ -2,19 +2,17 @@ Variables: sbbConnector: # The URI of the API to use. For example: `https://b2p-int.api.sbb.ch` (integration) or `https://b2p.api.sbb.ch` (production) - uri: '' + uri: "" # The contract id provided to you by SBB. For Example: `ACP1024` - contractId: '' + contractId: "" # The client id provided to you by SBB. For Example: `01234567-89ab-cdef-0123-456789abcdef` - clientId: '' + clientId: "" # The client secret provided to you by SBB. - # [password] - clientSecret: '' + #[password] + clientSecret: ${decrypt:} # The endpoint for acquiring the bearer token using your client id and secret. For Example: `https://login.microsoftonline.com/2cda5d11-f0ac-46b3-967d-af1b2e1bd01a/oauth2/v2.0` - tokenEndpoint: '' + tokenEndpoint: "" # The scope provided to you by SBB. - scope: '' + scope: "" # The URI of the Journey SBB Swiss Mobility API to use . For example: `https://smapi-osdm-journey-int.api.sbb.ch` (integration) or `https://smapi-osdm-journey.api.sbb.ch` (production) - journeyUri: '' - # The requestor header contains detailed information about who is calling the API. It can include information such as channel, organization, sales unit or workstation id and be used to configure e.g. the fare range provided to the caller. The content of the string is part of a bilateral contract by the two parties and not standardized by OSDM. It is recommend to encrypt the information transferred. - requestor: '' + journeyUri: "" diff --git a/sbb-connector/processes/GetPlaces.p.json b/sbb-connector/processes/GetPlaces.p.json index e20cf75..69672aa 100644 --- a/sbb-connector/processes/GetPlaces.p.json +++ b/sbb-connector/processes/GetPlaces.p.json @@ -55,7 +55,7 @@ "clientId" : "13022aee-0653-4076-b253-a87b352403c8", "path" : "/v1/places", "headers" : { - "Requestor" : "ivy.var.sbbConnector_requestor", + "Requestor" : "in.in.headers.requestor", "Accept-Language" : "in.in.headers.acceptLanguage", "traceparent" : "in.in.headers.traceparent", "tracestate" : "in.in.headers.tracestate" diff --git a/sbb-connector/processes/GetTripsCollection.p.json b/sbb-connector/processes/GetTripsCollection.p.json index 811bb54..ff2d122 100644 --- a/sbb-connector/processes/GetTripsCollection.p.json +++ b/sbb-connector/processes/GetTripsCollection.p.json @@ -55,7 +55,7 @@ "clientId" : "13022aee-0653-4076-b253-a87b352403c8", "path" : "/v1/trips-collection", "headers" : { - "Requestor" : "ivy.var.sbbConnector_requestor", + "Requestor" : "in.in.headers.requestor", "Accept-Language" : "in.in.headers.acceptLanguage", "traceparent" : "in.in.headers.traceparent", "tracestate" : "in.in.headers.tracestate" From c01926ca51c67cdb8ceeb2e04181a435c5a6e275 Mon Sep 17 00:00:00 2001 From: PHAM HOANG HUNG Date: Thu, 2 Jan 2025 16:39:46 +0700 Subject: [PATCH 11/12] refactor code --- .github/workflows/ci.yml | 4 +--- .github/workflows/dev.yml | 2 -- sbb-connector-demo/config/variables.yaml | 3 +++ sbb-connector-test/pom.xml | 12 +----------- sbb-connector-webtest/pom.xml | 10 ---------- .../connector/sbb/webtest/trip/ITBookTrip.java | 4 ---- 6 files changed, 5 insertions(+), 30 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b04500f..9c67d59 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -9,6 +9,4 @@ on: jobs: build: - uses: axonivy-market/github-workflows/.github/workflows/ci.yml@v5 - secrets: - mvnArgs: -DjourneyUri=${{ secrets.JOURNEY_URI }} -DclientId=${{ secrets.CLIENT_ID }} \ No newline at end of file + uses: axonivy-market/github-workflows/.github/workflows/ci.yml@v5 \ No newline at end of file diff --git a/.github/workflows/dev.yml b/.github/workflows/dev.yml index 3abb433..ae5e6c3 100644 --- a/.github/workflows/dev.yml +++ b/.github/workflows/dev.yml @@ -9,5 +9,3 @@ on: jobs: build: uses: axonivy-market/github-workflows/.github/workflows/dev.yml@v5 - secrets: - mvnArgs: -DjourneyUri=${{ secrets.JOURNEY_URI }} -DclientId=${{ secrets.CLIENT_ID }} diff --git a/sbb-connector-demo/config/variables.yaml b/sbb-connector-demo/config/variables.yaml index e96d3ef..6140e03 100644 --- a/sbb-connector-demo/config/variables.yaml +++ b/sbb-connector-demo/config/variables.yaml @@ -1,2 +1,5 @@ # yaml-language-server: $schema=https://json-schema.axonivy.com/app/12.0.0/variables.json Variables: + sbbConnector: + clientId: DEMO + journeyUri: 'https://smapi-osdm-journey-mock.app.sbb.ch' \ No newline at end of file diff --git a/sbb-connector-test/pom.xml b/sbb-connector-test/pom.xml index f52a6f3..9cce70a 100644 --- a/sbb-connector-test/pom.xml +++ b/sbb-connector-test/pom.xml @@ -20,7 +20,7 @@ com.axonivy.connector.sbb - sbb-connector + sbb-connector-demo ${project.version} iar @@ -63,16 +63,6 @@ ${project.build.plugin.version} true - - maven-surefire-plugin - 3.5.2 - - - ${journeyUri} - ${clientId} - - - diff --git a/sbb-connector-webtest/pom.xml b/sbb-connector-webtest/pom.xml index e53abee..3a05cfd 100644 --- a/sbb-connector-webtest/pom.xml +++ b/sbb-connector-webtest/pom.xml @@ -53,16 +53,6 @@ ${project.build.plugin.version} true - - maven-surefire-plugin - 3.5.2 - - - ${journeyUri} - ${clientId} - - - \ No newline at end of file diff --git a/sbb-connector-webtest/src_test/com/axonivy/connector/sbb/webtest/trip/ITBookTrip.java b/sbb-connector-webtest/src_test/com/axonivy/connector/sbb/webtest/trip/ITBookTrip.java index 874c2eb..edc8a95 100644 --- a/sbb-connector-webtest/src_test/com/axonivy/connector/sbb/webtest/trip/ITBookTrip.java +++ b/sbb-connector-webtest/src_test/com/axonivy/connector/sbb/webtest/trip/ITBookTrip.java @@ -34,8 +34,6 @@ void startDemoProcess() { @Test void start_inputTripSearchDataFieldsAreEmpty_proceedingShowsErrorMessages() { - startDemoProcess(); - processToShowTrip(); // Assert @@ -49,7 +47,6 @@ void start_inputTripSearchDataFieldsAreEmpty_proceedingShowsErrorMessages() { @Test void start_inputTripSearchDataFieldsDateAndTimeHaveInvalidContent_proceedingShowsErrorMessages() { - startDemoProcess(); selectFromAndTo(); // Insert invalid content into fields Date and Time @@ -70,7 +67,6 @@ void start_inputTripSearchDataFieldsDateAndTimeHaveInvalidContent_proceedingShow @Test void start_proceedFromInputTripSearchDataWithOptionEarliestDeparture_showShowTripsDialog() throws ParseException { - startDemoProcess(); Date date = DATE_FORMATTER_PRESENTABLE.parse(MOCK_DATE_VALUE); String dateStr = DATE_TIME_FORMATTER_PRESENTABLE.format(date); From 5d38e35e82d1b6decf21b465567776c1d3bb16f8 Mon Sep 17 00:00:00 2001 From: PHAM HOANG HUNG Date: Thu, 2 Jan 2025 17:57:18 +0700 Subject: [PATCH 12/12] MARP-922 Update document --- sbb-connector-demo/processes/BookTrip.p.json | 5 ++-- .../InputTripSearchDataProcess.p.json | 1 - sbb-connector-product/README.md | 22 ++++++++++-------- sbb-connector-product/README_DE.md | 22 ++++++++++-------- .../images/search-for-trips.png | Bin 11632 -> 10961 bytes sbb-connector-product/images/trips.png | Bin 14914 -> 53558 bytes sbb-connector/processes/GetPlaces.p.json | 2 +- .../processes/GetTripsCollection.p.json | 2 +- 8 files changed, 28 insertions(+), 26 deletions(-) diff --git a/sbb-connector-demo/processes/BookTrip.p.json b/sbb-connector-demo/processes/BookTrip.p.json index 76454a6..ae74b89 100644 --- a/sbb-connector-demo/processes/BookTrip.p.json +++ b/sbb-connector-demo/processes/BookTrip.p.json @@ -12,7 +12,7 @@ "signature" : "start", "case" : { "customFields" : [ - { "name" : "conversationId", "type" : "STRING", "value" : "java.util.UUID.randomUUID().toString()" } + { "name" : "requestor", "type" : "STRING", "value" : "ivy.session.getSessionUserName()" } ] } }, @@ -63,8 +63,7 @@ "processCall" : "GetTripsCollection:call(com.axonivy.connector.sbb.tripscollection.GetTripsCollectionDataIn)", "call" : { "map" : { - "param.getTripsCollectionDataIn" : "in.getTripsCollectionDataIn", - "param.getTripsCollectionDataIn.headers.requestor" : "ivy.session.getSessionUserName()" + "param.getTripsCollectionDataIn" : "in.getTripsCollectionDataIn" } }, "output" : { diff --git a/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/InputTripSearchData/InputTripSearchDataProcess.p.json b/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/InputTripSearchData/InputTripSearchDataProcess.p.json index 768d195..b957cb3 100644 --- a/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/InputTripSearchData/InputTripSearchDataProcess.p.json +++ b/sbb-connector-demo/src_hd/com/axonivy/connector/sbb/demo/InputTripSearchData/InputTripSearchDataProcess.p.json @@ -151,7 +151,6 @@ "processCall" : "GetPlaces:call(com.axonivy.connector.sbb.place.GetPlacesDataIn)", "call" : { "map" : { - "param.getPlacesDataIn.headers.requestor" : "ivy.session.getSessionUserName()", "param.getPlacesDataIn.params.name" : "in.getPlacesDataIn.params.name" } }, diff --git a/sbb-connector-product/README.md b/sbb-connector-product/README.md index 6985f78..04969ed 100644 --- a/sbb-connector-product/README.md +++ b/sbb-connector-product/README.md @@ -1,8 +1,8 @@ # SBB Connector -Axon Ivy's SBB Connector integrates the [Swiss Mobility API](https://developer.sbb.ch/apis/b2p/information) provided by SBB. This connector uses a REST client that allows you to retrieve timetables and fare details. Additionally, you can create and manage bookings of Swiss public transport through the API. +Axon Ivy's SBB Connector integrates the [Swiss Mobility API - Journey](https://developer-int.sbb.ch/apis/smapi-osdm-journey/information) provided by SBB. This connector uses a REST client that allows you to retrieve timetables and fare details. Additionally, you can create and manage bookings of Swiss public transport through the API. -Note that credentials are required to gain access to any features of the API. Although they are provided free of charge by SBB, the purpose of their API is to generate sales turnover through it. For more information about access, features and capabilities, visit the info page of the [Swiss Mobility API](https://developer.sbb.ch/apis/b2p/information). +Note that credentials are required to gain access to any features of the API. Although they are provided free of charge by SBB, the purpose of their API is to generate sales turnover through it. For more information about access, features and capabilities, visit the info page of the [Swiss Mobility API - Journey](https://developer-int.sbb.ch/apis/smapi-osdm-journey/information). ## Demo @@ -18,18 +18,20 @@ To use the SBB Connector, add the following variables to your Axon Ivy Project: Variables: sbbConnector: # The URI of the API to use. For example: `https://b2p-int.api.sbb.ch` (integration) or `https://b2p.api.sbb.ch` (production) - uri: '' + uri: "" # The contract id provided to you by SBB. For Example: `ACP1024` - contractId: '' + contractId: "" # The client id provided to you by SBB. For Example: `01234567-89ab-cdef-0123-456789abcdef` - clientId: '' + clientId: "" # The client secret provided to you by SBB. - # [password] - clientSecret: '' + #[password] + clientSecret: *** # The endpoint for acquiring the bearer token using your client id and secret. For Example: `https://login.microsoftonline.com/2cda5d11-f0ac-46b3-967d-af1b2e1bd01a/oauth2/v2.0` - tokenEndpoint: '' + tokenEndpoint: "" # The scope provided to you by SBB. - scope: '' + scope: "" + # The URI of the Journey SBB Swiss Mobility API to use . For example: `https://smapi-osdm-journey-int.api.sbb.ch` (integration) or `https://smapi-osdm-journey.api.sbb.ch` (production) + journeyUri: "" ``` -Any request to the API requires a x-conversation-id header of the current business process. For the already provided subprocesses by the SBB Connector you can either set the customField `conversationId` at the beginning of a process or provide the conversationId as an argument each time you call a subprocess. Take a look at the demo project for an example. +Any request to the Journey SBB Swiss Mobility API requires a `Requestor` header of the current business process. For the already provided subprocesses by the SBB Connector you can either set the customField `requestor` at the beginning of a process or provide the `Requestor` as an argument each time you call a subprocess. Take a look at the demo project for an example. diff --git a/sbb-connector-product/README_DE.md b/sbb-connector-product/README_DE.md index d3f8726..9fa67d1 100644 --- a/sbb-connector-product/README_DE.md +++ b/sbb-connector-product/README_DE.md @@ -1,8 +1,8 @@ # SBB Konnektor -Axon Ivy's SBB Konnektor integriert die [Swiss Mobility API](https://developer.sbb.ch/apis/b2p/information) der SBB (= Schweizerische Bundesbahnen). Dieser Konnektor nutzt einen REST-Client, der es dir ermöglicht, Fahrpläne und Tarifdetails abzurufen. Zusätzlich kannst du über die API Buchungen für den öffentlichen Verkehr der Schweiz erstellen und verwalten. +Axon Ivy's SBB Konnektor integriert die [Swiss Mobility API - Journey](https://developer-int.sbb.ch/apis/smapi-osdm-journey/information) der SBB (= Schweizerische Bundesbahnen). Dieser Konnektor nutzt einen REST-Client, der es dir ermöglicht, Fahrpläne und Tarifdetails abzurufen. Zusätzlich kannst du über die API Buchungen für den öffentlichen Verkehr der Schweiz erstellen und verwalten. -Beachte, dass Zugangsdaten erforderlich sind, um auf die Funktionen der API zuzugreifen. Obwohl diese von der SBB kostenlos zur Verfügung gestellt werden, dient ihre API dazu, Umsätze zu generieren. Weitere Informationen zu Zugang, Funktionen und Möglichkeiten findest du auf der Infoseite der Swiss Mobility API. +Beachte, dass Zugangsdaten erforderlich sind, um auf die Funktionen der API zuzugreifen. Obwohl diese von der SBB kostenlos zur Verfügung gestellt werden, dient ihre API dazu, Umsätze zu generieren. Weitere Informationen zu Zugang, Funktionen und Möglichkeiten findest du auf der Infoseite der Swiss Mobility API- Journey. ## Demo @@ -18,18 +18,20 @@ To use the SBB Connector, add the following variables to your Axon Ivy Project: Variables: sbbConnector: # The URI of the API to use. For example: `https://b2p-int.api.sbb.ch` (integration) or `https://b2p.api.sbb.ch` (production) - uri: '' + uri: "" # The contract id provided to you by SBB. For Example: `ACP1024` - contractId: '' + contractId: "" # The client id provided to you by SBB. For Example: `01234567-89ab-cdef-0123-456789abcdef` - clientId: '' + clientId: "" # The client secret provided to you by SBB. - # [password] - clientSecret: '' + #[password] + clientSecret: *** # The endpoint for acquiring the bearer token using your client id and secret. For Example: `https://login.microsoftonline.com/2cda5d11-f0ac-46b3-967d-af1b2e1bd01a/oauth2/v2.0` - tokenEndpoint: '' + tokenEndpoint: "" # The scope provided to you by SBB. - scope: '' + scope: "" + # The URI of the Journey SBB Swiss Mobility API to use . For example: `https://smapi-osdm-journey-int.api.sbb.ch` (integration) or `https://smapi-osdm-journey.api.sbb.ch` (production) + journeyUri: "" ``` -Any request to the API requires a x-conversation-id header of the current business process. For the already provided subprocesses by the SBB Connector you can either set the customField `conversationId` at the beginning of a process or provide the conversationId as an argument each time you call a subprocess. Take a look at the demo project for an example. +Any request to the Journey SBB Swiss Mobility API requires a `Requestor` header of the current business process. For the already provided subprocesses by the SBB Connector you can either set the customField `requestor` at the beginning of a process or provide the `Requestor` as an argument each time you call a subprocess. Take a look at the demo project for an example. diff --git a/sbb-connector-product/images/search-for-trips.png b/sbb-connector-product/images/search-for-trips.png index f646e6bff4179a39121603f82045d62087de3ca7..b3c38b16ab2a8bfa04f23828e6c2059ff1bc195d 100644 GIT binary patch literal 10961 zcmeHtd05ivyEi&Hl{Ph*iRCt9ndO>Uxu7yNnJuQH=8jmJTJB2zwPo&ilUqoIkj@o-aJx{oMEG^W2~N zoA{fxLJ z%8M(W%SY}LFYVekxohID^JgT)o4F?U&l}%E;%U-AbhM`FN{SXe&e(hZc7DY@u5a~9 zbzruLn;$^Gfv6RE8fB%-W`G;qtR(<|F{4hsW`gMsHiV$ijRrjdwwd~NCjjFX-$1TC z893U!R({WSywO+ho)a?U5QIk$1&;CQ9flnfrw#!{#gH0x`LXcf4d05j!l&N>0H!;q z<;LzV4%BzcC$Rj1Eo~HFYqCBe)*LcpVeFO<5Y2cBn{o*&4#sqh*{)zg{Sw@}VbQ;G zId>-m2{U1>pwp5i0e}!qAK=)7iU%^4*MtKprQIu^KFKT!26HoFfU6k%N||#!dZ*LE zvrXF=MO4cy5=Nzah2~e z_+BpV52s#_5|KkRM!-3iU4%^dmwcy|1dj?8rydlS?dzq-5TC{)$|y}D zjxiN(kzukH0H1mQYjsLgL#)+uEv}RCd#PXOiu86iIERoMSJ~%AZwn9rJ+S@HMSbki zj^gl_n$K*^BFqtMs)ecQG=eZdAMYyK?$pv2-1Ib1Uo)AWQB5Bmtm4G79WhJTsk-XV zxkBlpiWZ9KSqj~g)08V{HLTLdD=!EypJx6sZqL z9ABtJ++0yLeLU3T{I zaA@2_OvOE4(Zr{wpLU7;?&3+&r&WJ%mPb$muxi#=v_aeL;2q6p!b&l4G{ZFitBd*cJN3%l%rAgpf7sv2D_4|5!V}bEE4r-RiWU zvpzW=F6v1pJcJ98eeK}2ZZiO&8KZr)`E`ZLeKdlg+2UJ0?wnRC04B?(TRB3w301Oq zq&hB)a~3}B&nQR*+DsS9+`{D_kfF}!xyZK;umO5pejP>N-NrLa*2jO+OksI%&cATz zNy3dJTMj01a#aSwd0c%o>30m|FXWS9d_lsOQLYpvL!>w?Dc~|GH z@TUwkqsjp9s$k18P5EIPvZadjw%}YDUoK0092u}C_aN-X zQlVkfnjgGLpzch(8sDl{)sh3wr3hq8!}Xj9Ww;NL*;9ia?^8J`>F6IAOSgLM5TaV& zRs&iRY`A)2`L0uI!ba$f3_Zf*yB`36KeF88k-XzL&Qii+=OkJ$Nwn=#!eYlBGAvSah!f-kHIO?)r?d3#8!lV{CqCfo z^$UxN=Bqo*?F$ zfx5fdZa#XnSqzAe?)-mk?CQ?%A?#oyzu3ap@K|~wnBVa5{dw7*GaQIq&qYA<@uSVV z+UfL(4NvZbjrkATw|n?h>}j1Krdpgk{U>~P5+e_8ox~`Bqa*?AS0sFnk4sJa?on0O zJ171<10IybI0|?{le_l)&*q*A?5bC~rWWVc|A3>Gj7|cUvm`rzdI!?t*tYgr6h6G5 zD%)ebAo<-dgk#OS&Tdp4AaJ$RVy#Ur+rsw)K6*$WzxyL0^i;&#V``rZ-+g=Z0+9Uv z$2`E-PIn}=)qZ^_Hm9HfV6a2_&BI+kOCSF_&CzDH6ZgdS{unGC=bv!`e?Tc?g|P1S;r1_0FO07(zO8*j zffITIJn-o{`-oNhBWYHpT51}yQVM|ez%of(INs(I_Y9^%nRr`c6o)VvZD`t8r%OA= z(7#QRAItl4#Ut2#Bv?Cq$rvSxxEJ`YWn;89MDJ9E_HM0z>jtjdR6%1GRe~n9ZQ}vp#HiW&~X%$g>@Nxsik{e7O#GS$Y13M3Cy; zRp&W&zNxtrN#Mj!A(y4~)Dct%D^iLC)B?VrY7clf5(2X3RhFV`V^veUoKVNW)BPJ) zOb2wU5L+AFr`bH5;FljS-#bTQ!2C1_C2spE#d1y-aM$Pwp?um1->|j&m64v)^8@$2 zWfp5Lc;9+ToRSWyJ|{m_?><+cUJ7^Dt7%gx;2)Fr#NHgJb4epaUo>k1HFrs7r@pSU z5=MtTN(w!Naxt$PF)F4R=W0I*6xsR5gr_ndVV758Pf{(73sz4nqDw9iwp>ejBK=xF z$-e|arItLST#9X&+Z|$lXz&>BL*Q}w5}HI1uu43C{=3ldI^1mzDf$(F>f}r~TSppGPlwjn1x7sXj2(P`sZ~vbn)yp@qcv@o}IA%NPDq zMg%gsA;wJ)Pmxp_ycOUfp;DVKH`d>Awf>Dd35uUoCpn8Jh;8p1yc{@jPC7*CGGDLE z(x5--13a8(jkqw0abg)_zd<@Sjk!R(`5F_I>3GsMSN2M?>*T@OFX(gqdwbOjv1+t8|y zwbCIFg6%>3i}I}tF>^}!7k|I5={uxuK>S=(o2$SQ7@Zs()|k zvCQ%80&nTXqRBoPXYD`B)Cg~HFN`H!IP?ugmh%BXn5m^3fQzM5u8GBHQCyJ64-x`zv9ewpx~z>Grm8TT_j;aC=iri7oIn;_PjOR~{e)9EqDK ze)#^#79UJj`T`Voi=7D&Z~NOOk10s~H#eTYjaudb>4H6AX?7FLaAVmQ4BR_>Vchs= zZt}SCPJqJq-_{=xxACEnJ~l?0U%3w7_)__=IEynX*JBIVVv+N>=8buJ{$#>m;yvu^ zxx!Hr+h&V(EO$+~r}ZWLgLPCMh@;P5Y-hNyy1C!;#(!A3!(9x#hEmVZJoGp{0gJPE z)sx8h3tlc}y2}ziKaLxg7w8&^>Fnv>kL0fHJ#cmt#5Ozq7H@H5$CfXP>F1HiB+*H(7=(np%kyi8ZeK$kku98_yJ!+o~rxIMb`w(Rp-pZ=#?n+Y$Rs& zj32Z!k5`LpAV*g)1*J--C}{ej$-Dm7LC8HEJWXaW*NuTM#R_M)*6POHy?8eyJVtAt zqU)jZ=`Is=-JkD+36Iqq#l;%Tm%6-)TGAFrCU8C~YWTN{0jSrQ5D%wa|6CfkB8`13Y}7~f?mEV^ICg3x*Q$c{EHL#YuevTrS@imH zKnb88c|Vh=R?xs+W!PHaI9(r zTJA998~{uk!9Xjm5K7UE#+c@lV)!fsVq6XaXWFC|OJyA(8-+4wYOQPmBf$CDN%g6Q z06}|O__OJz5>NdDZoHT$UA$Vg-vm(alJ{5ADmpHhcQ3VoL-&H+n>4rg#?E^bvnpyu z8N_1yhdwE{R=hx>>cAk7%_w!!4Cs{sZd%a4NhsWiU>Tie3=)3}D1oXZb9&;CDNn(B zdi%_iwRt@Qd6J_;gX5eUn%k-SA53z33h`YoL=4uN%g~OYtY^(dcSBN zM8}@i(;DqZgNWq_bV{I4Zzj0Dmq+oUZQ*YuPRa=RsKGswtbV|;eqDKNpe-DFFv~)X z@I^;2QxW*lyRp~DBfj1qG8F8~F9pVHma%GdhrH(4>JgvJ*mnq-9;Htd!aaGDoQ%V^ zZ{(Fr8oVwAdI>9Y_`{J&j%n>eV3%I6$@g9Q1?|9kHysbM<&yJ}_TyTt$|-VIIav^O zGYA_V07PlT&I1LzbWPiHZY2u(h-vFqX$rm!K^yBfHTZEi|H49b#%kzI(R}?D7bpiy zpkOik2(5~QQzP!~1EEhPA&}$gz#g7OD30HEDT+hZxlxi{6Me+%!x~xl`!d#H-IhYO zI=*LpXbD_Mbu%Ymn#qLGob&@v)M4TZjjqn3j8$#;&XWl*mAp!J)Lm}3Bl;~o zcLdjkgUMHS`YH7;Y$On0xcZ!EH)AhGY3XG9 z6O+}pnkewyE>VFj`i!ruCwRr{8JyNNL3IZkmq)u2@zn@lwB?Yc)@FFP*~D#Em zR$9h3~Ps|+SiFLQv|hN{Uuxi)ghbhep1dh&V^Pb1z!&b_UiuC))o+((cZS) zV&{YfqyoFkrkJyko9Rq>FTef2cU!<=0)%!yrrMhu{HUBw&}@5h704-zbvP!|ePg)2 z{ud`No$y=rw$gUQ;R9}YMZe6$x+FC(kPq|nBrum5+OP*Qfx69c-Nd^C1{`fyvv;Vo8{e7Q9LH=hubViybc+bC1-7|a%+o5B zD42Qmpdrb!a!q)cy0c6tD_Fz!IB6w`WxB(#zB;0Us6SZmVHF(YpEg|u8m`OaXLD4R zCZ0aey`_}ueJOBsU==z&W@*RXBXwU(4ZUKPBjzo%Gu}I55g}k z;7&9kK0zSyS;SY)O>q2}g04xB+M&eF6Nuc9!q}Q5FBu9beLg>zB~fpKEHbij-KtC- z;n1+7a3(mGoNG>{i7uks$jE);q>mjMh1yPl*LiHXImv-6Rp(wbXPiLs4@yvwPr zGx#7sc79m<-C3uybZuB-gl0-?K^n+YBG)6&pgPIhZ@ACgKa*I74=4^GdZ%GzHtsPU zB!cAHqA!*f)Y{7pt)CzP#}*n{lVsQ8o83p7YbV>xU0U{Ed+fa>f8@*@`q-~bweC2P zq1_xRa6D615i>4j)Lp>}{&Te{uTQ~*pUqVr0u zSuLo!s4DC8u*VU!BP;xE%*-P_-HQ2wQm1%(sY?FqD^aq{(;a@reO;Q()dfAz2Nfo8 z5&MkAImQ2WK#!y_xZdHTscp(#(}(c(ZOY@(^b$Rq?t?a5zjTOxfe*bjRo^xq#O&-n zXn#Z{eKy8*QN@Hy@~R4uP<x$k(7x$i z1Ca;4oZkf1%?IHhwpV3qa&r#XWtF)hDTwT7s)8HwIB8?z$O+U}PTN1Wn&0>#FDw1? zdRT9Z)2Kv~iyR{?4sRtd)sR^aT$QItbX&DMP+WrM!CJ)R1puQX4?-%Hr9tZi!JO{c zJsBT1Mq*}_$i}cwL{FBalDPV}^n8F_UYF$Vuu<%dRWCP2LJyRuWfU}_^A1NA>bcf8 zL1WkR?Qa6bPdE|Xax;bhchbdArt2HYiyRH~ z5j~Tya&Zzv6Yzo{9_cJ-D88ZBz01DjFQi z%^EkB-pa_|CZ;O1CwG1EHsB~aiRJ0XoAR|#A-zo*3ikHr4BE?*ZX(S$UZ z4+u=alc$&tQ%v?IYYtj2{WLlX4crCO4Nk~m?&)wUJlr%$f^`5(J!>U#s*&}Pt#L8y zS=j4Zd>5TRpMyVaYSn%XWpBjF2P|Vxc>?Q0U0rMK9#<~+U8t29{cj-`HYkR^J^mFj z?77w3(6s4BR;dBXaayHS9hLQdpUS4_5GanIOEf zv~pp}Q}*v}bpV^>>m}J!2@$SWxl_4V`Gx-UW7WuGZb&=Xw~OgN4n#BdMDxE9Yu6dDfdNKZUYa@Q_)xNh}GU;h0q{lM2v zK^oOm(j%o%C2lG`?{9!%?jIxff(VqeE@_{cZHGR)kqxVl72T@6bD%!mrljafOh{}Y z4m+s(XR=I)7bPIZP;o+M038GpC#pO+EEfOaU`pjvQqTUi%6+T4Yz#kU+gECgnEjlo z9sM6uqu(b;oYD%mRR*=SkUzg6opZFt>uP%_$*v*9Rj}KiALNf8@Pu(( z>1HK*btN%hJ@m1FRXE%)RIiQMj=|$MR`M*Ht7GNKkH~HX$L$BRB$XJx3Hs$Ap3EPw zJA84!nkcvWNnsj-auHT-LVK9MukW)^adD^Q{FZ05JQ*Ff zyy8X0NoMC7viHvTymX(AJyxqx<|HQW^Gx;1%mHg#6DCR9BOc4FdlKwll-JO0B=?Q^ zlp6pHb$#sfg&THCsgChnPdBQ23jgNQzNK!~NpW@(`MXYyObCK9wAv}DEf#tC9l+q>Bflmsz_20QMG3j_S51vjJMz!a%%aw&p`l(9Jx^k%7Rc@2(bI zenyDu_3iY36iRJO?9^#yKJr>v9?^%~9zAz{tNO&cDc-0#bIv zfys0fnUTkLFQ1UY9K}>4#ikG9L`O>KuDR1xG=eCS5UVVCDlXfht>ToPJpNXwmWpC7 zl@|bBf*>h^aK>)#;WF0A_BYok0mGE&y(#La9j3XZVAL{hK)>^Z=v#Ij*|o;0)YPdM@$#?T5ODhZJG4im8r3THmM+c^Kz98yKMH)6N-#m%7J$ zE#*1KL07Q3Wu8v^34X&tiT>Saxp(KU2k07Hi3M9+oVWI<35vz9FJB!{B`yoRGyV;$ zXXiZ=bJ+X)|4k*r&Af0^nO0I!Iik0z{fbMOe{<88ZY?g5{(IJ!`c;s4{@hIl7k-eIMD| zk~ih+uO-=kC2w0J-W`VqwCiOh(lDB8Rf+Gye=`L}%^v{V|Mfq6^GHnl|CJY%{@?t~ z$lHmw{$NoNxd@~?A=x&q1VIH-O-44=-W1Bglx=OsNPSIJ5DuN}W(i!XWXNsFYM7uoO z?7yoehvatMza&k}QpSoQF?s=ko2g(r>0kaIpNrkMDx0v@J%tbGzJIhC|Gs$BoG*wf z_p-=t*BR@Y4qUnA7XT68(0u21y68SZ7#A&6sM6dls?1buRyhaqKzNIbx#lYF9_Cat z>Q2L8BJ0((W!Z{<+p0LvoLydzR@7~_;Qc_SgPW9v?w)Z5?E7oUKR<2Sfy{s`yjqI< zLPq{T7pN9am!)s*^cSR#{mJS-afS`Qjy8Eg%+1Y)&$~owq}s#S$7u~v?W}ZKKHhZ3cl53&e^&pB`d$Yc{<52V*8gk-ihMi@affLPn=lIx9PFJ6`dP`*nFka#WiXF_kl6-4Uo9BO!#s zd1bIxRZ)~5^zk!Nu$8#FszqzyJLoq<1e}>XjCDVwjaXdGqIO9~F59r>d%1!u%A>I{ zRXJ-&2vROa_&lxaAEvc~d1iU?%D^oM1T5Z-*)JZxX}@p@DAK!!j8zcE5WSB`p3N+$H1n(V z2yImj{emMi;hi!VU^QGeEE-US~qUHYesWqZU%|eIxg(nztJ3KS;mJYN> ztGSJRaIo+ca=Y{9XbOo}e+O|UEvk!L9x_a)A+b@83nhzjj_(=rW8EhGO`C2UZ+r1S zj*Jj#J1Oe{($;~*+y9{%QU(3G%j`Q>e}A&_)xF2$UP)({esxJe;n-%-KT)?vrNK>| zwk(o;hxX+z;ex!evFkVovK4V5(&bGnd+4K7v^pufG!3pa@$H98qf+L%N>dBLufAdd zKUHX~7rd}dRfmIVn*gRx*lu}Xp|*LGVsf@#yQ?n8sBI$RDKVG%e}He>&VCUMZ|l7z UAAAokMh?J53+r>`XRqD)U+HPfyZ`_I literal 11632 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 diff --git a/sbb-connector-product/images/trips.png b/sbb-connector-product/images/trips.png index 95fc439e3352835e325b2ae5319fd317e5047d1c..33ef7b18268a71e098b92d950afdc3f37098ade4 100644 GIT binary patch literal 53558 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

Np$r}xCmO&xVpP*&BL1}4}$*{_go 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 literal 14914 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 U%-DJa#gO`?9=|ozjtCl?0fI! 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 G@c#fi8G{A@ diff --git a/sbb-connector/processes/GetPlaces.p.json b/sbb-connector/processes/GetPlaces.p.json index 69672aa..d0becb2 100644 --- a/sbb-connector/processes/GetPlaces.p.json +++ b/sbb-connector/processes/GetPlaces.p.json @@ -55,7 +55,7 @@ "clientId" : "13022aee-0653-4076-b253-a87b352403c8", "path" : "/v1/places", "headers" : { - "Requestor" : "in.in.headers.requestor", + "Requestor" : "ivy.case.customFields().stringField(\"requestor\").getOrDefault(in.in.headers.requestor)", "Accept-Language" : "in.in.headers.acceptLanguage", "traceparent" : "in.in.headers.traceparent", "tracestate" : "in.in.headers.tracestate" diff --git a/sbb-connector/processes/GetTripsCollection.p.json b/sbb-connector/processes/GetTripsCollection.p.json index ff2d122..d36caba 100644 --- a/sbb-connector/processes/GetTripsCollection.p.json +++ b/sbb-connector/processes/GetTripsCollection.p.json @@ -55,7 +55,7 @@ "clientId" : "13022aee-0653-4076-b253-a87b352403c8", "path" : "/v1/trips-collection", "headers" : { - "Requestor" : "in.in.headers.requestor", + "Requestor" : "ivy.case.customFields().stringField(\"requestor\").getOrDefault(in.in.headers.requestor)", "Accept-Language" : "in.in.headers.acceptLanguage", "traceparent" : "in.in.headers.traceparent", "tracestate" : "in.in.headers.tracestate"