diff --git a/.helmignore b/.helmignore deleted file mode 100644 index f7ccba7339b7222d2c9c9ddc9b7e944f689fee64..0000000000000000000000000000000000000000 --- a/.helmignore +++ /dev/null @@ -1 +0,0 @@ -unit-tests/ \ No newline at end of file diff --git a/.mvn/wrapper/MavenWrapperDownloader.java b/.mvn/wrapper/MavenWrapperDownloader.java deleted file mode 100644 index e76d1f3241d38db9b28f05133823bbed1ad289ff..0000000000000000000000000000000000000000 --- a/.mvn/wrapper/MavenWrapperDownloader.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright 2007-present the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import java.net.*; -import java.io.*; -import java.nio.channels.*; -import java.util.Properties; - -public class MavenWrapperDownloader { - - private static final String WRAPPER_VERSION = "0.5.6"; - /** - * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided. - */ - private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/" - + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar"; - - /** - * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to - * use instead of the default one. - */ - private static final String MAVEN_WRAPPER_PROPERTIES_PATH = - ".mvn/wrapper/maven-wrapper.properties"; - - /** - * Path where the maven-wrapper.jar will be saved to. - */ - private static final String MAVEN_WRAPPER_JAR_PATH = - ".mvn/wrapper/maven-wrapper.jar"; - - /** - * Name of the property which should be used to override the default download url for the wrapper. - */ - private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl"; - - public static void main(String args[]) { - System.out.println("- Downloader started"); - File baseDirectory = new File(args[0]); - System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath()); - - // If the maven-wrapper.properties exists, read it and check if it contains a custom - // wrapperUrl parameter. - File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH); - String url = DEFAULT_DOWNLOAD_URL; - if(mavenWrapperPropertyFile.exists()) { - FileInputStream mavenWrapperPropertyFileInputStream = null; - try { - mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile); - Properties mavenWrapperProperties = new Properties(); - mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream); - url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url); - } catch (IOException e) { - System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'"); - } finally { - try { - if(mavenWrapperPropertyFileInputStream != null) { - mavenWrapperPropertyFileInputStream.close(); - } - } catch (IOException e) { - // Ignore ... - } - } - } - System.out.println("- Downloading from: " + url); - - File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH); - if(!outputFile.getParentFile().exists()) { - if(!outputFile.getParentFile().mkdirs()) { - System.out.println( - "- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'"); - } - } - System.out.println("- Downloading to: " + outputFile.getAbsolutePath()); - try { - downloadFileFromURL(url, outputFile); - System.out.println("Done"); - System.exit(0); - } catch (Throwable e) { - System.out.println("- Error downloading"); - e.printStackTrace(); - System.exit(1); - } - } - - private static void downloadFileFromURL(String urlString, File destination) throws Exception { - if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) { - String username = System.getenv("MVNW_USERNAME"); - char[] password = System.getenv("MVNW_PASSWORD").toCharArray(); - Authenticator.setDefault(new Authenticator() { - @Override - protected PasswordAuthentication getPasswordAuthentication() { - return new PasswordAuthentication(username, password); - } - }); - } - URL website = new URL(urlString); - ReadableByteChannel rbc; - rbc = Channels.newChannel(website.openStream()); - FileOutputStream fos = new FileOutputStream(destination); - fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); - fos.close(); - rbc.close(); - } - -} diff --git a/.mvn/wrapper/maven-wrapper.jar b/.mvn/wrapper/maven-wrapper.jar deleted file mode 100644 index 2cc7d4a55c0cd0092912bf49ae38b3a9e3fd0054..0000000000000000000000000000000000000000 Binary files a/.mvn/wrapper/maven-wrapper.jar and /dev/null differ diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties deleted file mode 100644 index 642d572ce90e5085986bdd9c9204b9404f028084..0000000000000000000000000000000000000000 --- a/.mvn/wrapper/maven-wrapper.properties +++ /dev/null @@ -1,2 +0,0 @@ -distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip -wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar diff --git a/Jenkinsfile b/Jenkinsfile deleted file mode 100644 index 6956b9f9ee4a811d6e629efc774eccb46fd3bdbb..0000000000000000000000000000000000000000 --- a/Jenkinsfile +++ /dev/null @@ -1,472 +0,0 @@ -pipeline { - agent { - node { - label 'ozgcloud-jenkins-build-agent-jdk21' - } - } - - environment { - BLUE_OCEAN_URL = "https://jenkins.infra.ozg-cloud.systems/job/intelliform-adapter/job/${env.BRANCH_NAME}/${env.BUILD_NUMBER}/" - RELEASE_REGEX = /\d+.\d+.\d+/ - SNAPSHOT_REGEX = /\d+.\d+.\d+-SNAPSHOT/ - FAILED_STAGE = "" - SH_SUCCESS_STATUS_CODE = 0 - } - - options { - timeout(time: 1, unit: 'HOURS') - disableConcurrentBuilds() - buildDiscarder(logRotator(numToKeepStr: '5')) - } - - stages { - stage('Check Version') { - steps { - script { - FAILED_STAGE = env.STAGE_NAME - def rootPom = readMavenPom file: 'pom.xml' - def rootVersion = rootPom.version - def vorgangManagerVersion = rootPom.properties['vorgang-manager.version'] - - def commonVersion = getParentPomVersion('common/pom.xml') - def routerVersion = getParentPomVersion('router/pom.xml') - def ifAdapterVersion = getParentPomVersion('intelliform-adapter/pom.xml') - def fsAdapterVersion = getParentPomVersion('formsolutions-adapter/pom.xml') - def formCycleAdapterVersion = getParentPomVersion('formcycle-adapter/pom.xml') - def xtaAdapterVersion = getParentPomVersion('xta-adapter/pom.xml') - def enterpriseAdapterVersion = getParentPomVersion('enterprise-adapter/pom.xml') - - if(env.BRANCH_NAME == 'release'){ - if ( !isReleaseVersion([rootVersion, vorgangManagerVersion, commonVersion, routerVersion, ifAdapterVersion, fsAdapterVersion, formCycleAdapterVersion, xtaAdapterVersion, enterpriseAdapterVersion])) { - error("Keine Release Version für Branch ${env.BRANCH_NAME}.") - } - } else { - if ( !isSnapshotVersion([rootVersion, commonVersion, routerVersion, ifAdapterVersion, fsAdapterVersion, formCycleAdapterVersion, xtaAdapterVersion, enterpriseAdapterVersion])) { - error("Keine Snapshot Version für Branch ${env.BRANCH_NAME}.") - } - } - - if ( !isSameVersion([commonVersion, routerVersion, ifAdapterVersion, fsAdapterVersion, formCycleAdapterVersion, xtaAdapterVersion, enterpriseAdapterVersion], rootVersion)) { - error("Versionen sind nicht identisch") - } - } - } - } - stage('Set Version') { - when { - not { - anyOf { - branch 'master' - branch 'release' - } - } - } - steps { - script { - FAILED_STAGE=env.STAGE_NAME - JAR_TAG = getPomVersion('pom.xml').replace("SNAPSHOT", "${env.BRANCH_NAME}-SNAPSHOT") - } - configFileProvider([configFile(fileId: 'maven-settings', variable: 'MAVEN_SETTINGS')]) { - sh "mvn -s $MAVEN_SETTINGS versions:set -DnewVersion=${JAR_TAG} -DprocessAllModules=true" - - } - } - } - stage('Build Eingang-Adapter') { - steps { - script { - FAILED_STAGE=env.STAGE_NAME - } - configFileProvider([configFile(fileId: 'maven-settings', variable: 'MAVEN_SETTINGS')]) { - sh 'mvn --version' - sh 'mvn -s $MAVEN_SETTINGS -P ci-build clean install -Dmaven.wagon.http.retryHandler.count=3' - - script { - try { - if (env.BRANCH_NAME == 'master') { - withSonarQubeEnv('sonarqube-ozg-sh'){ - sh 'mvn -s $MAVEN_SETTINGS sonar:sonar' - } - } - } catch (Exception e) { - unstable("SonarQube failed") - } - } - } - } - post { - always{ - junit testResults: '**/target/surefire-reports/*.xml', skipPublishingChecks: true - } - } - } - - stage('Deploy Eingang-Adapter to Nexus'){ - steps { - script { - FAILED_STAGE = env.STAGE_NAME - } - configFileProvider([configFile(fileId: 'maven-settings', variable: 'MAVEN_SETTINGS')]) { - sh 'mvn -s $MAVEN_SETTINGS -DskipTests deploy' - sh "mvn -s $MAVEN_SETTINGS versions:revert" - } - } - } - - stage('Tag and Push Docker image') { - steps { - script { - FAILED_STAGE=env.STAGE_NAME - IMAGE_TAG = generateImageTag() - - tagAndPushDockerImage('intelliform-adapter', IMAGE_TAG) - tagAndPushDockerImage('formsolutions-adapter', IMAGE_TAG) - tagAndPushDockerImage('formcycle-adapter', IMAGE_TAG) - tagAndPushDockerImage('xta-adapter', IMAGE_TAG) - tagAndPushDockerImage('enterprise-adapter', IMAGE_TAG) - - if (env.BRANCH_NAME == 'master') { - tagAndPushDockerImage('intelliform-adapter', 'snapshot-latest') - tagAndPushDockerImage('formsolutions-adapter', 'snapshot-latest') - tagAndPushDockerImage('formcycle-adapter', 'snapshot-latest') - tagAndPushDockerImage('xta-adapter', 'snapshot-latest') - tagAndPushDockerImage('enterprise-adapter', 'snapshot-latest') - } - else if (env.BRANCH_NAME == 'release') { - tagAndPushDockerImage('intelliform-adapter', 'latest') - tagAndPushDockerImage('formsolutions-adapter', 'latest') - tagAndPushDockerImage('formcycle-adapter', 'latest') - tagAndPushDockerImage('xta-adapter', 'latest') - tagAndPushDockerImage('enterprise-adapter', 'latest') - } - } - } - } - - stage('Test, build and deploy Intelliform-Adapter Helm Chart') { - steps { - script { - FAILED_STAGE=env.STAGE_NAME - HELM_CHART_VERSION = generateHelmChartVersion() - - sh "./run_helm_test.sh" - - dir('src/main/helm') { - sh "helm package --version=${HELM_CHART_VERSION} ." - - deployHelmChart("Intelliform-Adapter", HELM_CHART_VERSION) - } - } - } - } - - stage('Test, build and deploy Xta-Adapter Helm Chart') { - steps { - script { - FAILED_STAGE=env.STAGE_NAME - HELM_CHART_VERSION = generateHelmChartVersion() - - dir('xta-adapter') { - sh "./run_helm_test.sh" - } - - dir('xta-adapter/src/main/helm') { - sh "helm package --version=${HELM_CHART_VERSION} ." - - deployHelmChart("xta-adapter", HELM_CHART_VERSION) - } - } - } - } - - stage('Trigger Dev rollout') { - when { - branch 'master' - } - steps { - script { - FAILED_STAGE = env.STAGE_NAME - - cloneGitopsRepo() - - setNewDevAdapterVersion() - - pushNewDevVersion() - } - } - } - stage('Trigger Test rollout') { - when { - branch 'release' - } - - steps { - script { - FAILED_STAGE = env.STAGE_NAME - - cloneGitopsRepo() - - setNewTestAdapterVersion() - - pushNewTestVersion() - } - } - } - - stage ('Deploy SBOM to DependencyTrack') { - steps { - script { - IMAGE_TAG = generateImageTag() - - configFileProvider([configFile(fileId: 'maven-settings', variable: 'MAVEN_SETTINGS')]) { - withCredentials([string(credentialsId: 'dependency-track-api-key', variable: 'API_KEY')]) { - - catchError(buildResult: 'UNSTABLE', stageResult: 'FAILURE') { - sh "mvn --no-transfer-progress -s $MAVEN_SETTINGS io.github.pmckeown:dependency-track-maven-plugin:upload-bom -Ddependency-track.apiKey=$API_KEY -Ddependency-track.projectVersion=${IMAGE_TAG} -Ddependency-track.dependencyTrackBaseUrl=https://dependency-track.ozg-sh.de" - } - } - } - } - } - } - - } - post { - failure { - script { - if (env.BRANCH_NAME == 'master' || env.BRANCH_NAME == 'release') { - sendFailureMessage() - } - } - } - } -} - -Void deployHelmChart(String helmChartName, String helmChartVersion) { - withCredentials([usernamePassword(credentialsId: 'jenkins-nexus-login', usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD')]){ - if (env.BRANCH_NAME == 'release') { - result = sh script: '''curl -u $USERNAME:$PASSWORD https://nexus.ozg-sh.de/service/rest/v1/components?repository=ozg-base-apps -F file=@'''+helmChartName+'''-'''+helmChartVersion+'''.tgz''', returnStdout: true - } - else { - result = sh script: '''curl -u $USERNAME:$PASSWORD https://nexus.ozg-sh.de/service/rest/v1/components?repository=ozg-base-apps-snapshot -F file=@'''+helmChartName+'''-'''+helmChartVersion+'''.tgz''', returnStdout: true - } - - if (result != '') { - error(result) - } - } -} - -String generateHelmChartVersion() { - def chartVersion = getPomVersion('pom.xml') - - if (env.BRANCH_NAME == 'master') { - chartVersion += "-${env.GIT_COMMIT.take(7)}" - } - else if (env.BRANCH_NAME != 'release') { - chartVersion += "-${env.BRANCH_NAME}" - } - - return chartVersion.replaceAll("_", "-") -} - -Void sendFailureMessage() { - def room = '' - def data = """{"msgtype":"m.text", \ - "body":"Eingang-Manager: Build Failed. Stage: ${FAILED_STAGE} Build-ID: ${env.BUILD_NUMBER} Link: ${BLUE_OCEAN_URL}", \ - "format": "org.matrix.custom.html", \ - "formatted_body":"Eingang-Manager: Build Failed. Stage: ${FAILED_STAGE} Build-ID: <a href='${BLUE_OCEAN_URL}'>${env.BUILD_NUMBER}</a>"}""" - - if (env.BRANCH_NAME == 'master') { - room = "!GjqhmouBtnDbwUkAjx:matrix.ozg-sh.de" - } - else if (env.BRANCH_NAME == 'release') { - room = "!oWZpUGTFsxkJIYNfYg:matrix.ozg-sh.de" - } - - sh "curl -XPOST -H 'authorization: Bearer ${getElementAccessToken()}' -d '${data}' https://matrix.ozg-sh.de/_matrix/client/v3/rooms/$room/send/m.room.message" -} - -String getElementAccessToken() { - withCredentials([string(credentialsId: 'element-login-json', variable: 'LOGIN_JSON')]) { - return readJSON ( text: sh (script: '''curl -XPOST -d \"$LOGIN_JSON\" https://matrix.ozg-sh.de/_matrix/client/v3/login''', returnStdout: true)).access_token - } -} - -Void setNewDevAdapterVersion() { - setNewAfmAdapterVersion('dev') - setNewFsAdapterVersion('dev') - setNewFormcycleAdapterVersion('dev') - setNewXtaAdapterVersion('dev') - setNewEnterpriseAdapterVersion('dev') -} - -Void setNewTestAdapterVersion() { - setNewAfmAdapterVersion('test') - setNewFsAdapterVersion('test') - setNewFormcycleAdapterVersion('test') - setNewEnterpriseAdapterVersion('test') -} - -Void setNewAfmAdapterVersion(String environment) { - dir("gitops") { - def envFile = "${environment}/application/values/afm-adapter-values.yaml" - def envVersions = readYaml file: envFile - - envVersions.afm_adapter.image.tag = IMAGE_TAG - envVersions.afm_adapter.helm.version = HELM_CHART_VERSION - - writeYaml file: envFile, data: envVersions, overwrite: true - } -} - -Void setNewFsAdapterVersion(String environment) { - dir("gitops") { - def envFile = "${environment}/application/values/fs-adapter-values.yaml" - def envVersions = readYaml file: envFile - - envVersions.fs_adapter.image.tag = IMAGE_TAG - envVersions.fs_adapter.helm.version = HELM_CHART_VERSION - - writeYaml file: envFile, data: envVersions, overwrite: true - } -} - -Void setNewFormcycleAdapterVersion(String environment) { - dir("gitops") { - def envFile = "${environment}/application/values/formcycle-adapter-values.yaml" - def envVersions = readYaml file: envFile - - envVersions.formcycle_adapter.image.tag = IMAGE_TAG - envVersions.formcycle_adapter.helm.version = HELM_CHART_VERSION - - writeYaml file: envFile, data: envVersions, overwrite: true - } -} - -Void setNewXtaAdapterVersion(String environment) { - dir("gitops") { - def envFile = "${environment}/application/values/xta-adapter-values.yaml" - def envVersions = readYaml file: envFile - - envVersions.xta_adapter.image.tag = IMAGE_TAG - envVersions.xta_adapter.helm.version = HELM_CHART_VERSION - - writeYaml file: envFile, data: envVersions, overwrite: true - } -} - -Void setNewEnterpriseAdapterVersion(String environment) { - dir("gitops") { - def envFile = "${environment}/application/values/enterprise-adapter-values.yaml" - def envVersions = readYaml file: envFile - - envVersions.enterprise_adapter.image.tag = IMAGE_TAG - envVersions.enterprise_adapter.helm.version = HELM_CHART_VERSION - - writeYaml file: envFile, data: envVersions, overwrite: true - } -} - -Void pushNewDevVersion() { - pushNewGitopsVersion('dev') -} - -Void pushNewTestVersion() { - pushNewGitopsVersion('test') -} - -Void pushNewGitopsVersion(String environment) { - dir('gitops') { - if (!hasAdapterValuesFileChanged(environment)) { - return - } - - withCredentials([usernamePassword(credentialsId: 'jenkins-gitea-access-token', passwordVariable: 'TOKEN', usernameVariable: 'USER')]) { - sh "git add ${environment}/application/values/*-adapter-values.yaml" - - sh "git commit -m 'jenkins rollout ${environment} afm-adapter fs-adapter version ${IMAGE_TAG}'" - sh 'git push https://${USER}:${TOKEN}@git.ozg-sh.de/ozgcloud-devops/gitops.git' - } - } -} - -Boolean hasAdapterValuesFileChanged(String environment) { - return sh (script: "git status | grep '${environment}/application/values/.*-adapter-values.yaml'", returnStatus: true) == env.SH_SUCCESS_STATUS_CODE as Integer -} - -Void configureGit() { - final email = "jenkins@ozg-sh.de" - final name = "jenkins" - - dir("gitops") { - sh "git config user.email '${email}'" - sh "git config user.name '${name}'" - } -} - -Void cloneGitopsRepo() { - withCredentials([usernamePassword(credentialsId: 'jenkins-gitea-access-token', passwordVariable: 'TOKEN', usernameVariable: 'USER')]) { - sh 'git clone https://${USER}:${TOKEN}@git.ozg-sh.de/ozgcloud-devops/gitops.git' - } - - configureGit() -} - -Void tagAndPushDockerImage(String imageName, String newTag){ - withCredentials([usernamePassword(credentialsId: 'jenkins-nexus-login', usernameVariable: 'USER', passwordVariable: 'PASSWORD')]) { - sh 'docker login docker.ozg-sh.de -u ${USER} -p ${PASSWORD}' - - sh "docker tag docker.ozg-sh.de/${imageName}:build-latest docker.ozg-sh.de/${imageName}:${newTag}" - sh "docker push docker.ozg-sh.de/${imageName}:${newTag}" - } -} - -String getPomVersion(String pomFile){ - def pom = readMavenPom file: pomFile - - return pom.version -} - -String generateImageTag() { - def imageTag = "${env.BRANCH_NAME}-${getPomVersion('pom.xml')}" - - if (env.BRANCH_NAME == 'master') { - imageTag += "-${env.GIT_COMMIT.take(7)}" - } - - return imageTag -} - -String getParentPomVersion(String filePath) { - def pom = readMavenPom file: filePath - return pom.parent.version -} - -Boolean isReleaseVersion(List versions) { - return matchRegexVersion(versions, RELEASE_REGEX) -} - -Boolean isSnapshotVersion(List versions) { - return matchRegexVersion(versions, SNAPSHOT_REGEX) -} - -Boolean matchRegexVersion(List versions, String regex) { - for (version in versions) { - if ( !(version ==~ regex) ) { - return false - } - } - - return true -} - -Boolean isSameVersion(List versions, String expectedVersion) { - for (version in versions) { - if ( version != expectedVersion ) { - return false - } - } - - return true -} diff --git a/common/pom.xml b/common/pom.xml deleted file mode 100644 index 5c0eb98874c354c363ec24eddaa8835f0f811c5a..0000000000000000000000000000000000000000 --- a/common/pom.xml +++ /dev/null @@ -1,89 +0,0 @@ -<?xml version="1.0"?> -<!-- - - Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - Ministerpräsidenten des Landes Schleswig-Holstein - Staatskanzlei - Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - - Lizenziert unter der EUPL, Version 1.2 oder - sobald - diese von der Europäischen Kommission genehmigt wurden - - Folgeversionen der EUPL ("Lizenz"); - Sie dürfen dieses Werk ausschließlich gemäß - dieser Lizenz nutzen. - Eine Kopie der Lizenz finden Sie hier: - - https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - - Sofern nicht durch anwendbare Rechtsvorschriften - gefordert oder in schriftlicher Form vereinbart, wird - die unter der Lizenz verbreitete Software "so wie sie - ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - ausdrücklich oder stillschweigend - verbreitet. - Die sprachspezifischen Genehmigungen und Beschränkungen - unter der Lizenz sind dem Lizenztext zu entnehmen. - ---> -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> - - <modelVersion>4.0.0</modelVersion> - - <parent> - <groupId>de.ozgcloud.eingang</groupId> - <artifactId>eingang-manager</artifactId> - <version>2.16.0-SNAPSHOT</version> - <relativePath>../</relativePath> - </parent> - <artifactId>common</artifactId> - <name>Eingangs Adapter - Common</name> - - <dependencies> - <!-- spring --> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-web</artifactId> - </dependency> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-validation</artifactId> - </dependency> - - <!-- Dev --> - <dependency> - <groupId>org.projectlombok</groupId> - <artifactId>lombok</artifactId> - </dependency> - </dependencies> - - <build> - <plugins> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-jar-plugin</artifactId> - <executions> - <execution> - <goals> - <goal>test-jar</goal> - </goals> - </execution> - </executions> - </plugin> - - <plugin> - <groupId>org.jacoco</groupId> - <artifactId>jacoco-maven-plugin</artifactId> - </plugin> - - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-surefire-plugin</artifactId> - </plugin> - - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-failsafe-plugin</artifactId> - </plugin> - </plugins> - </build> - -</project> diff --git a/common/src/main/java/de/ozgcloud/eingang/Application.java b/common/src/main/java/de/ozgcloud/eingang/Application.java deleted file mode 100644 index b4ea3d5e2681ff558140f3d8b26a298118f7d87b..0000000000000000000000000000000000000000 --- a/common/src/main/java/de/ozgcloud/eingang/Application.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang; - -import java.util.TimeZone; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.scheduling.annotation.EnableScheduling; - -@SpringBootApplication(scanBasePackages = { "de.ozgcloud" }) -@EnableScheduling -public class Application { - - public static final String ZUFI_MANAGER_GRPC_CLIENT = "zufi-manager"; - - public static void main(String[] args) { - TimeZone.setDefault(TimeZone.getTimeZone("UTC")); - SpringApplication.run(Application.class, args); - } -} diff --git a/common/src/main/java/de/ozgcloud/eingang/EingangAspectPointcuts.java b/common/src/main/java/de/ozgcloud/eingang/EingangAspectPointcuts.java deleted file mode 100644 index 5a4eafc31fba2d3e5913e47c6e41207412276d10..0000000000000000000000000000000000000000 --- a/common/src/main/java/de/ozgcloud/eingang/EingangAspectPointcuts.java +++ /dev/null @@ -1,26 +0,0 @@ -package de.ozgcloud.eingang; - -import org.aspectj.lang.annotation.Pointcut; - -public class EingangAspectPointcuts { - - @Pointcut("execution(public * *(..))") - void anyPublicMethods() { - // aspect pointcut - no implementation needed - } - - @Pointcut("within(de.ozgcloud..*)") - void anythingInOzgCloud() { - // aspect pointcut - no implementation needed - } - - @Pointcut("anyPublicMethods() && anythingInOzgCloud()") - void anyPublicMethodInOzgCloud() { - // aspect pointcut - no implementation needed - } - - @Pointcut("anyPublicMethodInOzgCloud() && target(de.ozgcloud.eingang.semantik.enginebased.EngineBasedMapper)") - void publicMethodInEngineBasedMapper() { - // aspect pointcut - no implementation needed - } -} diff --git a/common/src/main/java/de/ozgcloud/eingang/EingangLoggingAspect.java b/common/src/main/java/de/ozgcloud/eingang/EingangLoggingAspect.java deleted file mode 100644 index 584acf3a329f1b2e79b62184c861b1b79f1e783c..0000000000000000000000000000000000000000 --- a/common/src/main/java/de/ozgcloud/eingang/EingangLoggingAspect.java +++ /dev/null @@ -1,25 +0,0 @@ -package de.ozgcloud.eingang; - -import org.aspectj.lang.JoinPoint; -import org.aspectj.lang.annotation.AfterReturning; -import org.aspectj.lang.annotation.Aspect; -import org.aspectj.lang.annotation.Before; -import org.springframework.stereotype.Component; - -import de.ozgcloud.common.logging.AspectLoggingUtils; - -@Aspect -@Component -public class EingangLoggingAspect extends EingangAspectPointcuts { - - @Before("publicMethodInEngineBasedMapper()") - public void onEngineBasedMapper(JoinPoint joinPoint) { - AspectLoggingUtils.log(joinPoint); - } - - @AfterReturning(pointcut = "publicMethodInEngineBasedMapper()", returning = "returnValue") - public void afterServiceMethod(JoinPoint joinPoint, Object returnValue) { - AspectLoggingUtils.logReturnValue(joinPoint, returnValue); - } - -} diff --git a/common/src/main/java/de/ozgcloud/eingang/LogRunner.java b/common/src/main/java/de/ozgcloud/eingang/LogRunner.java deleted file mode 100644 index 642b7c4cf4dfa9cc9ab89dac490e3ad0a87ebdec..0000000000000000000000000000000000000000 --- a/common/src/main/java/de/ozgcloud/eingang/LogRunner.java +++ /dev/null @@ -1,21 +0,0 @@ -package de.ozgcloud.eingang; - -import java.nio.charset.Charset; - -import org.springframework.context.ApplicationListener; -import org.springframework.context.event.ContextRefreshedEvent; -import org.springframework.stereotype.Component; - -import lombok.extern.log4j.Log4j2; - -@Log4j2 -@Component -class LogRunner implements ApplicationListener<ContextRefreshedEvent> { - - @Override - public void onApplicationEvent(ContextRefreshedEvent event) { - LOG.info("Standard Charset: " + Charset.defaultCharset()); - - } - -} diff --git a/common/src/main/java/de/ozgcloud/eingang/common/errorhandling/FunctionalException.java b/common/src/main/java/de/ozgcloud/eingang/common/errorhandling/FunctionalException.java deleted file mode 100644 index 23d3d1ed4831e53f92f9ca6fb021906d3dac4c3e..0000000000000000000000000000000000000000 --- a/common/src/main/java/de/ozgcloud/eingang/common/errorhandling/FunctionalException.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.common.errorhandling; - -public class FunctionalException extends RuntimeException { - - private static final long serialVersionUID = 1L; - - public FunctionalException(String message, Throwable cause) { - super(message, cause); - } -} diff --git a/common/src/main/java/de/ozgcloud/eingang/common/errorhandling/TechnicalException.java b/common/src/main/java/de/ozgcloud/eingang/common/errorhandling/TechnicalException.java deleted file mode 100644 index e27ecc57c3857b64ec89bf0d871302df40f3b933..0000000000000000000000000000000000000000 --- a/common/src/main/java/de/ozgcloud/eingang/common/errorhandling/TechnicalException.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.common.errorhandling; - -public class TechnicalException extends RuntimeException { - - private static final long serialVersionUID = 1L; - - public TechnicalException(String message, Throwable cause) { - super(message, cause); - } - - public TechnicalException(String message) { - super(message); - } -} diff --git a/common/src/main/java/de/ozgcloud/eingang/common/formdata/Antragsteller.java b/common/src/main/java/de/ozgcloud/eingang/common/formdata/Antragsteller.java deleted file mode 100644 index 81826cff9dccf04d8b16040f00f1d8c4f967e8a0..0000000000000000000000000000000000000000 --- a/common/src/main/java/de/ozgcloud/eingang/common/formdata/Antragsteller.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.common.formdata; - -import java.util.Map; - -import lombok.Builder; -import lombok.Getter; - -@Getter -@Builder -public class Antragsteller { - - private String anrede; - private String firmaName; - private String vorname; - private String nachname; - private String geburtsname; - private String geburtsdatum; - private String geburtsort; - private String email; - private String telefon; - private String strasse; - private String hausnummer; - private String plz; - private String ort; - - @Deprecated - private String postfachId; - - private Map<String, Object> data; -} diff --git a/common/src/main/java/de/ozgcloud/eingang/common/formdata/DeleteOnCloseInputStream.java b/common/src/main/java/de/ozgcloud/eingang/common/formdata/DeleteOnCloseInputStream.java deleted file mode 100644 index 2f2bd49ab930c0d22c1fb50987e48e81bdb7078e..0000000000000000000000000000000000000000 --- a/common/src/main/java/de/ozgcloud/eingang/common/formdata/DeleteOnCloseInputStream.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.common.formdata; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.nio.file.Files; - -import de.ozgcloud.common.errorhandling.TechnicalException; - -public class DeleteOnCloseInputStream extends FileInputStream { - - private final File file; - - public DeleteOnCloseInputStream(File file) throws FileNotFoundException { - super(file); - this.file = file; - } - - public static DeleteOnCloseInputStream from(File file) { - try { - return new DeleteOnCloseInputStream(file); - } catch (FileNotFoundException e) { - throw new TechnicalException("Error opening file " + file.getName(), e); - } - } - - @Override - public void close() throws IOException { - super.close(); - Files.deleteIfExists(file.toPath()); - } -} diff --git a/common/src/main/java/de/ozgcloud/eingang/common/formdata/FormData.java b/common/src/main/java/de/ozgcloud/eingang/common/formdata/FormData.java deleted file mode 100644 index 26ff0c888125264f81d9d31ea6c8ba5ae8381384..0000000000000000000000000000000000000000 --- a/common/src/main/java/de/ozgcloud/eingang/common/formdata/FormData.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.common.formdata; - -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.UUID; - -import jakarta.validation.constraints.NotNull; - -import lombok.Builder; -import lombok.Getter; -import lombok.Singular; -import lombok.ToString; - -@Getter -@Builder(toBuilder = true) -@ToString -public class FormData { - - @NotNull - @Builder.Default - private String id = UUID.randomUUID().toString(); - - @Builder.Default - private FormHeader header = FormHeader.builder().build(); - - @Singular - private List<ZustaendigeStelle> zustaendigeStelles; - @ToString.Exclude - private Antragsteller antragsteller; - @ToString.Exclude - @Builder.Default - private Map<String, Object> formData = Collections.emptyMap(); - - private int numberOfAttachments; - @Singular - private List<IncomingFileGroup> attachments; - - private int numberOfRepresentations; - @Singular - private List<IncomingFile> representations; - - @Builder.Default - private FormDataControl control = FormDataControl.builder().build(); - - @Getter - @Builder(toBuilder = true) - @ToString - public static class FormDataControl { - @Builder.Default - private Optional<Representations> representations = Optional.empty(); - @Builder.Default - private Optional<FormMetaData> metaData = Optional.empty(); - } - - @Getter - @Builder(toBuilder = true) - public static class Representations { - private String primaryFormDataRepresentation; - private String primaryFormDataPdfRepresentation; - private String formDataModell; - } -} diff --git a/common/src/main/java/de/ozgcloud/eingang/common/formdata/FormDataUtils.java b/common/src/main/java/de/ozgcloud/eingang/common/formdata/FormDataUtils.java deleted file mode 100644 index f15aaa0ea373e12c67f3ca8334ec355ba9c87418..0000000000000000000000000000000000000000 --- a/common/src/main/java/de/ozgcloud/eingang/common/formdata/FormDataUtils.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.common.formdata; - -import java.util.Collections; -import java.util.LinkedHashMap; -import java.util.Map; - -import lombok.NonNull; - -public class FormDataUtils { - - final FormData baseFormData; - final Map<String, Object> modifieableData; - - private FormDataUtils(FormData formData) { - baseFormData = formData; - modifieableData = new LinkedHashMap<>(formData.getFormData()); - } - - public static FormDataUtils from(FormData formData) { - return new FormDataUtils(formData); - } - - public FormDataUtils remove(String key) { - modifieableData.remove(key); - return this; - } - - public FormDataUtils put(@NonNull String key, Object value) { - modifieableData.put(key, value); - return this; - } - - public FormData.FormDataBuilder builder() { - return baseFormData.toBuilder().formData(Collections.unmodifiableMap(modifieableData)); - } - - public FormData build() { - return builder().build(); - } - - @SuppressWarnings("unchecked") - public static Map<String, Object> getSubMap(FormData formData, String key) { - return (Map<String, Object>) formData.getFormData().getOrDefault(key, Map.of()); - } -} diff --git a/common/src/main/java/de/ozgcloud/eingang/common/formdata/FormHeader.java b/common/src/main/java/de/ozgcloud/eingang/common/formdata/FormHeader.java deleted file mode 100644 index 868b83b069bace798dc63571766f04308188d53f..0000000000000000000000000000000000000000 --- a/common/src/main/java/de/ozgcloud/eingang/common/formdata/FormHeader.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.common.formdata; - -import java.time.ZonedDateTime; - -import lombok.Builder; -import lombok.Getter; -import lombok.Setter; -import lombok.ToString; - -@Getter -@Setter -@Builder(toBuilder = true) -@ToString -public class FormHeader { - - private String requestId; - private String vorgangNummer; - @Builder.Default - private ZonedDateTime createdAt = ZonedDateTime.now(); - private String formId; - private String formName; - private String sender; - - private String channel; - private String formEngineName; - - private ServiceKonto serviceKonto; -} diff --git a/common/src/main/java/de/ozgcloud/eingang/common/formdata/FormMetaData.java b/common/src/main/java/de/ozgcloud/eingang/common/formdata/FormMetaData.java deleted file mode 100644 index c84b8b634ee20fc695a27e194a6ed3bae0554621..0000000000000000000000000000000000000000 --- a/common/src/main/java/de/ozgcloud/eingang/common/formdata/FormMetaData.java +++ /dev/null @@ -1,19 +0,0 @@ -package de.ozgcloud.eingang.common.formdata; - -import java.time.ZonedDateTime; - -public interface FormMetaData { - - ZonedDateTime getOrigin(); - ZonedDateTime getDelivery(); - - /** - * Returns the value of the Entry, or null if this MetaData contains no Entry - * for the name. - * - * @param name Name of the requested Entry - * @return Value of the Entry - */ - String getEntry(String name); - -} diff --git a/common/src/main/java/de/ozgcloud/eingang/common/formdata/IncomingFile.java b/common/src/main/java/de/ozgcloud/eingang/common/formdata/IncomingFile.java deleted file mode 100644 index c5e9b9dba3a8af2feadf60499e0ed301dbc9c294..0000000000000000000000000000000000000000 --- a/common/src/main/java/de/ozgcloud/eingang/common/formdata/IncomingFile.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.common.formdata; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.InputStream; - -import de.ozgcloud.common.errorhandling.TechnicalException; -import lombok.Builder; -import lombok.Getter; -import lombok.ToString; - -@Builder(toBuilder = true) -@Getter -@ToString -public class IncomingFile { - - public static final String TMP_FILE_PREFIX = "filecached-inputstream"; - public static final String TMP_FILE_SUFFIX = ".ozg-cloud.tmp"; - - private String id; - private String vendorId; - private String name; - private String contentType; - private long size; - - private File file; - - public InputStream getContentStream() { - try { - return new FileInputStream(file); - } catch (FileNotFoundException e) { - throw new TechnicalException("Error opening file " + file.getName(), e); - } - } - - public InputStream getContentStreamForFinalRead() { - return DeleteOnCloseInputStream.from(file); - } - -} diff --git a/common/src/main/java/de/ozgcloud/eingang/common/formdata/IncomingFileGroup.java b/common/src/main/java/de/ozgcloud/eingang/common/formdata/IncomingFileGroup.java deleted file mode 100644 index 16f8726e0a5db9736aef8a2ebd8917f30097419f..0000000000000000000000000000000000000000 --- a/common/src/main/java/de/ozgcloud/eingang/common/formdata/IncomingFileGroup.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.common.formdata; - -import java.util.List; - -import lombok.Builder; -import lombok.Getter; -import lombok.Singular; -import lombok.ToString; - -@Builder(toBuilder = true) -@Getter -@ToString -public class IncomingFileGroup { - - private String name; - - @Singular - private List<IncomingFile> files; -} diff --git a/common/src/main/java/de/ozgcloud/eingang/common/formdata/PostfachAddressIdentifier.java b/common/src/main/java/de/ozgcloud/eingang/common/formdata/PostfachAddressIdentifier.java deleted file mode 100644 index 5b30bbf835a6ec0bc69a47321483b21fc2502368..0000000000000000000000000000000000000000 --- a/common/src/main/java/de/ozgcloud/eingang/common/formdata/PostfachAddressIdentifier.java +++ /dev/null @@ -1,5 +0,0 @@ -package de.ozgcloud.eingang.common.formdata; - -public interface PostfachAddressIdentifier { - -} diff --git a/common/src/main/java/de/ozgcloud/eingang/common/formdata/ServiceKonto.java b/common/src/main/java/de/ozgcloud/eingang/common/formdata/ServiceKonto.java deleted file mode 100644 index 6cce21a27b16bcf67062209a83427366ba35b583..0000000000000000000000000000000000000000 --- a/common/src/main/java/de/ozgcloud/eingang/common/formdata/ServiceKonto.java +++ /dev/null @@ -1,49 +0,0 @@ -package de.ozgcloud.eingang.common.formdata; - -import java.util.EnumSet; -import java.util.List; - -import org.apache.commons.lang3.StringUtils; - -import lombok.AccessLevel; -import lombok.Builder; -import lombok.Getter; -import lombok.RequiredArgsConstructor; -import lombok.Singular; - -@Getter -@Builder -public class ServiceKonto { - - private String type; - @Singular - private List<PostfachAddress> postfachAddresses; - private String trustLevel; - - @Getter - @Builder - public static class PostfachAddress { - private int type; - private String version; - private PostfachAddressIdentifier identifier; - } - - @RequiredArgsConstructor(access = AccessLevel.PRIVATE) - public enum TrustLevel { - - LEVEL_1("STORK-QAA-Level-1"), - LEVEL_2("STORK-QAA-Level-2"), - LEVEL_3("STORK-QAA-Level-3"), - LEVEL_4("STORK-QAA-Level-4"); - - private final String value; - - public static boolean exists(String trustLevelValue) { - if (StringUtils.isBlank(trustLevelValue)) { - return false; - } - return EnumSet.allOf(TrustLevel.class).stream().map(trustLevel -> trustLevel.value).anyMatch(trustLevelValue::equalsIgnoreCase); - } - } - -} \ No newline at end of file diff --git a/common/src/main/java/de/ozgcloud/eingang/common/formdata/StringBasedIdentifier.java b/common/src/main/java/de/ozgcloud/eingang/common/formdata/StringBasedIdentifier.java deleted file mode 100644 index f4d3eb31bd5b42d1737bdeda08b32bdb4fb8f1b6..0000000000000000000000000000000000000000 --- a/common/src/main/java/de/ozgcloud/eingang/common/formdata/StringBasedIdentifier.java +++ /dev/null @@ -1,14 +0,0 @@ -package de.ozgcloud.eingang.common.formdata; - -import lombok.Builder; -import lombok.Getter; - -@Getter -@Builder -public class StringBasedIdentifier implements PostfachAddressIdentifier { - - public static final String POSTFACH_ID_FIELD = "postfachId"; - - private String postfachId; - -} \ No newline at end of file diff --git a/common/src/main/java/de/ozgcloud/eingang/common/formdata/ZustaendigeStelle.java b/common/src/main/java/de/ozgcloud/eingang/common/formdata/ZustaendigeStelle.java deleted file mode 100644 index 19d6b1b39921e5dcc3224b42066aecff493b28d7..0000000000000000000000000000000000000000 --- a/common/src/main/java/de/ozgcloud/eingang/common/formdata/ZustaendigeStelle.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.common.formdata; - -import lombok.Builder; -import lombok.Getter; -import lombok.ToString; - -@Getter -@Builder(toBuilder = true) -@ToString -public class ZustaendigeStelle { - - private String organisationseinheitenId; - private String bezeichnung; - private String email; - private String gemeindeSchluessel; - private String amtlicherRegionalSchluessel; - private String hausanschriftStrasse; - private String hausanschriftPlz; - private String hausanschriftOrt; - private String telefon; -} diff --git a/common/src/main/java/de/ozgcloud/eingang/common/vorgang/VorgangNummerSupplier.java b/common/src/main/java/de/ozgcloud/eingang/common/vorgang/VorgangNummerSupplier.java deleted file mode 100644 index 29b9ca971b5aa597a7df76abdc2537562202ad59..0000000000000000000000000000000000000000 --- a/common/src/main/java/de/ozgcloud/eingang/common/vorgang/VorgangNummerSupplier.java +++ /dev/null @@ -1,34 +0,0 @@ -package de.ozgcloud.eingang.common.vorgang; - -import java.time.LocalDate; - -import org.apache.commons.lang3.RandomStringUtils; -import org.springframework.stereotype.Component; - -import de.ozgcloud.common.errorhandling.TechnicalException; -import lombok.RequiredArgsConstructor; - -@Component -@RequiredArgsConstructor -public class VorgangNummerSupplier { - - static final String VORGANGNUMMER_TEMPLATE = "%d%X%02d-%s"; - static final char[] BASE30_ALPHABET = { '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'M', - 'N', 'P', 'Q', 'R', 'S', 'T', 'V', 'W', 'X', 'Y', 'Z' }; - static final int SUFFIX_LENGTH = 6; - - public String get() { - return get(SUFFIX_LENGTH); - } - - public String get(int suffixLength) { - if (suffixLength <1){ - throw new TechnicalException("Suffix length must be at least 1"); - } - var today = LocalDate.now(); - var lastYearNumber = today.getYear() % 10; - return VORGANGNUMMER_TEMPLATE.formatted(lastYearNumber, today.getMonthValue(), today.getDayOfMonth(), - RandomStringUtils.random(suffixLength, BASE30_ALPHABET)); - } - -} diff --git a/common/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/common/src/main/resources/META-INF/additional-spring-configuration-metadata.json deleted file mode 100644 index 625980f8393f69927238961461f815b9fe835042..0000000000000000000000000000000000000000 --- a/common/src/main/resources/META-INF/additional-spring-configuration-metadata.json +++ /dev/null @@ -1,22 +0,0 @@ -{"properties": [ - { - "name": "ozgcloud.xta.actions.status-list", - "type": "java.lang.String", - "description": "A description for 'ozgcloud.xta.actions.status-list'" - }, - { - "name": "ozgcloud.xta.identifier", - "type": "java.lang.String", - "description": "XTA Identifier for SOAP Request Header (f.e. 'gae:firstname.lastname@mgm-tp.com')" - }, - { - "name": "ozgcloud.xta.keystore.file", - "type": "java.lang.String", - "description": "Location of the keyfile for xta accesss" - }, - { - "name": "ozgcloud.xta.keystore.password", - "type": "java.lang.String", - "description": "Password of the keyfile for xta accesss" - } -]} \ No newline at end of file diff --git a/common/src/main/resources/application-oc.yml b/common/src/main/resources/application-oc.yml deleted file mode 100644 index 47fbb02d121da8004a23275e648406db9b6bbf28..0000000000000000000000000000000000000000 --- a/common/src/main/resources/application-oc.yml +++ /dev/null @@ -1,2 +0,0 @@ -server: - port: 8080 \ No newline at end of file diff --git a/common/src/test/java/de/ozgcloud/eingang/EingangAdapterApplicationTest.java b/common/src/test/java/de/ozgcloud/eingang/EingangAdapterApplicationTest.java deleted file mode 100644 index 95b9b771bbecb0080688ee6b24e030af553d940a..0000000000000000000000000000000000000000 --- a/common/src/test/java/de/ozgcloud/eingang/EingangAdapterApplicationTest.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang; - -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class EingangAdapterApplicationTest { - - @Test - void contextLoads() { // NOSONAR nothing to check - it it starts it is fine - } -} diff --git a/common/src/test/java/de/ozgcloud/eingang/common/formdata/AntragstellerTestFactory.java b/common/src/test/java/de/ozgcloud/eingang/common/formdata/AntragstellerTestFactory.java deleted file mode 100644 index b14de31089f4ccebf47c253821ce0a67856e84eb..0000000000000000000000000000000000000000 --- a/common/src/test/java/de/ozgcloud/eingang/common/formdata/AntragstellerTestFactory.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.common.formdata; - -import java.util.Map; -import java.util.UUID; - -public class AntragstellerTestFactory { - - public static final String ANREDE = "Herr"; - - public static final String FIRMA_NAME = "Firma X"; - public static final String GEBIET_BEZEICHNUNG_KEY = "GebietBEZEICHNUNG"; - public static final String GEBIET_BEZEICHNUNG_VALUE = "Schleswig"; - - public static final String SUB_PERSOENLICHE_EIGNUNG = "persoenlicheEignung"; - public static final String SUB_VERBOTENE_VEREINIGUNG_KEY = "MitgliedschaftInVerboternerVereinigung"; - public static final String SUB_VERBOTENE_VEREINIGUNG_VALUE = "true"; - - public static final String VORNAME = "Theo"; - public static final String NACHNAME = "Test"; - public static final String GEBURTSNAME = "Toast"; - public static final String GEBURTSDATUM = "30.8.1955"; - public static final String GEBURTSORT = "Mülheim an der Ruhr"; - public static final String EMAIL = "noreply@ozg-sh.de"; - public static final String STRASSE = "Musterstraße"; - public static final String HAUSNUMMER = "1"; - public static final String PLZ = "12345"; - public static final String ORT = "Musterstadt"; - public static final String TELEFON = "+ 0176 888 666 222XX"; - public static final String POSTFACH_ID = UUID.randomUUID().toString(); - - public static Antragsteller create() { - return createBuilder().build(); - } - - public static Antragsteller createFirm() { - return createFirmBuilder().build(); - } - - public static Antragsteller.AntragstellerBuilder createFirmBuilder() { - return createBuilder() - .firmaName(FIRMA_NAME) - .geburtsname(null) - .geburtsdatum(null) - .geburtsort(null); - } - - public static Antragsteller.AntragstellerBuilder createBuilder() { - return Antragsteller.builder() - .anrede(ANREDE) - .vorname(VORNAME) - .nachname(NACHNAME) - .geburtsname(GEBURTSNAME) - .geburtsdatum(GEBURTSDATUM) - .geburtsort(GEBURTSORT) - .email(EMAIL) - .telefon(TELEFON) - .strasse(STRASSE) - .hausnummer(HAUSNUMMER) - .plz(PLZ) - .ort(ORT) - .postfachId(POSTFACH_ID) - .data(Map.of(GEBIET_BEZEICHNUNG_KEY, GEBIET_BEZEICHNUNG_VALUE, - SUB_PERSOENLICHE_EIGNUNG, - Map.of(SUB_VERBOTENE_VEREINIGUNG_KEY, SUB_VERBOTENE_VEREINIGUNG_VALUE))); - } -} diff --git a/common/src/test/java/de/ozgcloud/eingang/common/formdata/DeleteOnCloseInputStreamTest.java b/common/src/test/java/de/ozgcloud/eingang/common/formdata/DeleteOnCloseInputStreamTest.java deleted file mode 100644 index 253b1496782d16771db34ae53cdc28612ee93779..0000000000000000000000000000000000000000 --- a/common/src/test/java/de/ozgcloud/eingang/common/formdata/DeleteOnCloseInputStreamTest.java +++ /dev/null @@ -1,32 +0,0 @@ -package de.ozgcloud.eingang.common.formdata; - -import static org.assertj.core.api.Assertions.*; - -import java.io.File; -import java.io.IOException; - -import org.junit.jupiter.api.Test; - -import de.ozgcloud.common.errorhandling.TechnicalException; - -class DeleteOnCloseInputStreamTest { - - private DeleteOnCloseInputStream stream; - - @Test - void shouldDeleteFileOnClose() throws IOException { - File file = File.createTempFile("Test", "test"); - stream = new DeleteOnCloseInputStream(file); - - stream.close(); - - assertThat(file).doesNotExist(); - } - - @Test - void shouldThrowException() { - var notExists = new File("notExists"); - - assertThatThrownBy(() -> DeleteOnCloseInputStream.from(notExists)).isInstanceOf(TechnicalException.class); - } -} diff --git a/common/src/test/java/de/ozgcloud/eingang/common/formdata/FormDataControlTestFactory.java b/common/src/test/java/de/ozgcloud/eingang/common/formdata/FormDataControlTestFactory.java deleted file mode 100644 index e95c1e0fccf66519d23c26008a3a145bf562a2ff..0000000000000000000000000000000000000000 --- a/common/src/test/java/de/ozgcloud/eingang/common/formdata/FormDataControlTestFactory.java +++ /dev/null @@ -1,23 +0,0 @@ -package de.ozgcloud.eingang.common.formdata; - -import java.util.Optional; - -import de.ozgcloud.eingang.common.formdata.FormData.FormDataControl; -import de.ozgcloud.eingang.common.formdata.FormData.Representations; - -public class FormDataControlTestFactory { - - public static String PRIMARY_FORM_DATA_REPRESENTATION = "Antrag.xml"; - - public static FormDataControl create() { - return createBuilder().build(); - } - - public static FormDataControl.FormDataControlBuilder createBuilder() { - return FormDataControl.builder() - .representations(Optional.of(Representations.builder() - .primaryFormDataRepresentation(PRIMARY_FORM_DATA_REPRESENTATION) - .build())) - .metaData(Optional.of(FormMetaDataTestFactory.create())); - } -} diff --git a/common/src/test/java/de/ozgcloud/eingang/common/formdata/FormDataTestFactory.java b/common/src/test/java/de/ozgcloud/eingang/common/formdata/FormDataTestFactory.java deleted file mode 100644 index 52dcddeaf62afa188e0716294bf84d615eb5c945..0000000000000000000000000000000000000000 --- a/common/src/test/java/de/ozgcloud/eingang/common/formdata/FormDataTestFactory.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.common.formdata; - -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class FormDataTestFactory { - - public static final String SIMPLE_VALUE_KEY = "kontaktsystemtypid"; - public static final String SIMPLE_VALUE = "233034600"; - - public static final String SUBFORM_KEY = "zustaendigestelle"; - public static final String SUBKEY2 = "OrganisationseinheitenAuswahl"; - public static final String SUBVALUE2 = "9535669"; - public static final Map<String, String> SUBFORM_VALUE = Map.of(SUBKEY2, SUBVALUE2); - - public static final String NESTED_LIST_WITH_STRINGS_KEY = "nestedlist"; - public static final String NESTED_LIST_STRING_ELEMENT_1 = "n1"; - public static final String NESTED_LIST_STRING_ELEMENT_2 = "n2"; - public static final List<String> NESTED_LIST_WITH_STRINGS = List.of(NESTED_LIST_STRING_ELEMENT_1, NESTED_LIST_STRING_ELEMENT_2); - - public static final String NESTED_LIST_WITH_OBJECTS_KEY = "nestedlistwithobjects"; - public static final Map<String, Object> NESTED_LIST_OBJECTS_ELEMENT_1 = Map.of("o1", "o2"); - public static final Map<String, Object> NESTED_LIST_OBJECTS_ELEMENT_2 = Map.of("o3", "o4"); - public static final List<Map<String, Object>> NESTED_LIST_WITH_OBJECTS = List.of(NESTED_LIST_OBJECTS_ELEMENT_1, NESTED_LIST_OBJECTS_ELEMENT_2); - - public static final String ATTACHMENT_GROUP_2 = "FileGroup2"; - - public static final String VORGANG_ID = "vorgangId"; - - public static FormData create() { - return createBuilder().build(); - } - - public static FormData.FormDataBuilder createBuilder() { - return FormData.builder() - .header(FormHeaderTestFactory.create()) - .antragsteller(AntragstellerTestFactory.create()) - .zustaendigeStelle(ZustaendigeStelleTestFactory.create()) - .control(FormDataControlTestFactory.create()) - .formData(Map.of( - SIMPLE_VALUE_KEY, SIMPLE_VALUE, - SUBFORM_KEY, SUBFORM_VALUE, - NESTED_LIST_WITH_STRINGS_KEY, NESTED_LIST_WITH_STRINGS, - NESTED_LIST_WITH_OBJECTS_KEY, NESTED_LIST_WITH_OBJECTS)) - // TODO nach entfernen des zweiten Attachments den Wert auf 1 setzen - .numberOfAttachments(2) - // TODO zweites Attachment aus der TestFactory entfernen und die entsprechenden - // Tests anpassen - .attachments(List.of(IncomingFileGroupTestFactory.create(), - IncomingFileGroupTestFactory.createBuilder().name(ATTACHMENT_GROUP_2).build())) - .numberOfRepresentations(1) - .representations(List.of(IncomingFileTestFactory.create())); - } - - @SafeVarargs - public static FormData withFormDataMaps(Map<String, Object>... maps) { - Map<String, Object> formData = new HashMap<>(); - - Arrays.stream(maps).forEach(formData::putAll); - - return createBuilder().formData(Collections.unmodifiableMap(formData)).build(); - } -} diff --git a/common/src/test/java/de/ozgcloud/eingang/common/formdata/FormHeaderTestFactory.java b/common/src/test/java/de/ozgcloud/eingang/common/formdata/FormHeaderTestFactory.java deleted file mode 100644 index 0a371946028f0b2b9bf8b5b99af163d4d540d687..0000000000000000000000000000000000000000 --- a/common/src/test/java/de/ozgcloud/eingang/common/formdata/FormHeaderTestFactory.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.common.formdata; - -import java.time.ZonedDateTime; - -public class FormHeaderTestFactory { - - public static final String CLIENT_ID = "clientId"; -// public static final String CLIENT = "client"; - public static final String CUSTOMER_ID = "customerId"; - public static final String CUSTOMER = "customer"; - public static final String SENDER = "sender"; - public static final String FORM_ENGINE_NAME = "TB3000"; - public static final String FORM_NAME = "formName"; - public static final String FORM_ID = "formId"; - public static final String REQUEST_ID = "requestId"; - public static final String VORGANG_NUMMER = "ABCD-1234"; - public static final String CREATED_AT_STR = "2024-04-01T01:00:30Z"; - public static final ZonedDateTime CREATED_AT = ZonedDateTime.parse(CREATED_AT_STR); - - public static final ServiceKonto SERVICE_KONTO = ServiceKontoTestFactory.create(); - - public static FormHeader create() { - return createBuilder().build(); - } - - public static FormHeader.FormHeaderBuilder createBuilder() { - return FormHeader.builder() - .requestId(REQUEST_ID) - .vorgangNummer(VORGANG_NUMMER) - .createdAt(CREATED_AT) - .formEngineName(FORM_ENGINE_NAME) - .formId(FORM_ID) - .formName(FORM_NAME) - .sender(SENDER) - .serviceKonto(SERVICE_KONTO); - } - -} diff --git a/common/src/test/java/de/ozgcloud/eingang/common/formdata/FormMetaDataTestFactory.java b/common/src/test/java/de/ozgcloud/eingang/common/formdata/FormMetaDataTestFactory.java deleted file mode 100644 index 987fef7dde61f9d310b1700c9b927119a6af6105..0000000000000000000000000000000000000000 --- a/common/src/test/java/de/ozgcloud/eingang/common/formdata/FormMetaDataTestFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package de.ozgcloud.eingang.common.formdata; - -import java.time.ZonedDateTime; - -public class FormMetaDataTestFactory { - - public static final String XTA_IDENTIFIER_ENTRY_NAME = "xtaIdentifier"; - - public static final String XTA_IDENTIFIER = "vbe:010550120100"; - public static final String OE_ID = "010550120100"; - - public static FormMetaData create() { - return new FormMetaData() { - - @Override - public ZonedDateTime getOrigin() { - return ZonedDateTime.now(); - } - - @Override - public ZonedDateTime getDelivery() { - return ZonedDateTime.now(); - } - - @Override - public String getEntry(String name) { - switch (name) { - case XTA_IDENTIFIER_ENTRY_NAME: - return XTA_IDENTIFIER; - } - return null; - } - - }; - } -} diff --git a/common/src/test/java/de/ozgcloud/eingang/common/formdata/FormSolutionsTestFactory.java b/common/src/test/java/de/ozgcloud/eingang/common/formdata/FormSolutionsTestFactory.java deleted file mode 100644 index ebe4063dfcb5106b3e5a593a71ae1db2f5a5cc57..0000000000000000000000000000000000000000 --- a/common/src/test/java/de/ozgcloud/eingang/common/formdata/FormSolutionsTestFactory.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.common.formdata; - -import java.util.List; - -public class FormSolutionsTestFactory { - - public static final String ORGANISATIONSEINHEITEN_ID = "5678"; - public static final String POSTFACH_ID = "51522620-03d2-4507-b1f0-08d86920efed"; - public static final String OBJEKTGRUPPE_0 = "Objektgruppe[0]"; - public static final String PANEL_ID = "Panel_0_1"; - public static final String DECODED_CONTENT = "Lorem ipsum"; - public static final String IDENTIFIER_VALUE = "AS_123"; - public static final String FIM_ID = "S12345678"; - public static final List<String> LEIKA_IDS = List.of("123456890", "223456890"); - public static final String VORGANG_NUMMER = "KFAS_KOP_TEST-yCkgCdqG"; - public static final String COMPONENT_ID = "Textfeld (einzeilig)"; - public static final String COMPONENT_VALUE = "kfjhkfjhk"; - public static final String DATE_COMPONENT_ID = "Datums- / Uhrzeitfeld"; - public static final String DATE_COMPONENT_VALUE = "22.05.1996"; - public static final String ZIP_VALUE = "TG9yZW0gaXBzdW0="; - public static final String ZIP_VALUE_DECODED = "Lorem ipsum"; - public static final String PDF_VALUE = "TG9yZW0gaXBzdW0="; - public static final String PDF_VALUE_DECODED = "Lorem ipsum"; - public static final String ZUSTAENDIGE_STELLE_VALUE = "zustaendigeStelle"; - public static final String ZUSTAENDIGE_STELLE = "5678"; - public static final String POSTFACH_ID_STELLE = "51522620-03d2-4507-b1f0-08d86920efed"; - public static final String FORM_ID_VALUE = "KFAS_KOP_TEST-yCkgCdqG"; - // TODO vereinfachen und in Dateien packen - public static final String SIMPLE_JSON_DATA = "{\"assistant\": " - + "{\"identifier\":\"" + IDENTIFIER_VALUE + "\",\n" - + "\"panels\": [{\"identifier\":\"" + PANEL_ID + "\",\n" - + "\"components\": [" - + "{\"identifier\": \"" + COMPONENT_ID + "\",\"needed\": true,\"stringValue\": \"" + COMPONENT_VALUE + "\"}," - + "{\"identifier\": \"" + DATE_COMPONENT_ID + "\",\"needed\": true,\"stringValue\": \"" + DATE_COMPONENT_VALUE + "\"}\n" - + "]}],\n" - + "\"ozgContainer\": {\"fimId\": \"S12345678\",\"leikaIds\": [\"123456890\",\"223456890\"]}},\n" - + "\"zustaendigeStelle\": \"5678\",\n" - + "\"postkorbhandle\": \"" + POSTFACH_ID_STELLE + "\",\n" - + "\"transactionId\": \"" + FORM_ID_VALUE + "\"\n" - + "}"; - public static final String NESTED_COMPONENTS_JSON = "{\"assistant\":" - + "{\"identifier\": \"" + IDENTIFIER_VALUE + "\",\n" - + "\"panels\": [{\"identifier\": \"" + COMPONENT_ID + "\",\n" - + "\"components\": [" - + "{\"identifier\": \"" + OBJEKTGRUPPE_0 + "\",\"needed\": true,\n" - + "\"components\": [" - + "{\"identifier\": \"" + DATE_COMPONENT_ID + "\",\"needed\": true,\"stringValue\": \"" + DATE_COMPONENT_VALUE + "\"\n" - + "}]}]\n" - + "}]}\n" - + "}"; - private static final String TOP = "{\"assistant\":{\"identifier\": \"" + IDENTIFIER_VALUE + "\",\"panels\": " - + "[{\"identifier\": \"" + COMPONENT_ID + "\",\"components\": " - + "[{\"identifier\": \"" + OBJEKTGRUPPE_0 + "\",\"needed\": true,\"components\": " - + "[{\"identifier\": \"" + DATE_COMPONENT_ID + "\",\"needed\": true,\"stringValue\": \"" + DATE_COMPONENT_VALUE + "\"}]" - + "}]}]},"; - private static final String ZIP = "\"zip\":\"" + ZIP_VALUE + "\""; - private static final String PDF = "\"pdf\":\"" + PDF_VALUE + "\""; - private static final String END = "}"; - public static final String PDF_REPRESENTATION_JSON = TOP + PDF + END; - public static final String ZIP_ATTACHMENT_JSON = TOP + ZIP + END; - public static final String ATTACHMENTS_JSON = TOP + PDF + "," + ZIP + END; -} diff --git a/common/src/test/java/de/ozgcloud/eingang/common/formdata/IncomingFileGroupTestFactory.java b/common/src/test/java/de/ozgcloud/eingang/common/formdata/IncomingFileGroupTestFactory.java deleted file mode 100644 index cc2845a31a5edcb9d0a459db0cb4e8db30043e40..0000000000000000000000000000000000000000 --- a/common/src/test/java/de/ozgcloud/eingang/common/formdata/IncomingFileGroupTestFactory.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.common.formdata; - -import java.util.List; - -public class IncomingFileGroupTestFactory { - public static final String XDOMEA_XML_NAME = "xdomea.xml"; - public static final String REPR_XML_NAME = "repr.xml"; - public static final String REPR_PDF_NAME = "repr.pdf"; - public static final String ATTATCHMENT_XML_NAME = "att.xml"; - public static final String ATTATCHMENT_PNG_NAME = "att.png"; - public static final String ATTATCHMENT_PDF_NAME = "att.pdf"; - - public static final String INCOMING_FILE_ID = "xxx"; - public static final String ID = "id"; - public static final String FILE_REF1 = "FileRef1"; - public static final String VENDOR_ID_XXX = "vendorId:xxx"; - - public static final String NAME = "Ausweis"; - - public static final IncomingFile INCOMING_FILE = IncomingFile.builder().id(INCOMING_FILE_ID).vendorId(VENDOR_ID_XXX).build(); - public static final List<IncomingFileGroup> FILE_GROUPS = List.of(IncomingFileGroup.builder().files(List.of(INCOMING_FILE)).build()); - - public static IncomingFileGroup create() { - return createBuilder().build(); - } - - public static IncomingFileGroup.IncomingFileGroupBuilder createBuilder() { - return IncomingFileGroup.builder() - .name(NAME) - .files(List.of(IncomingFileTestFactory.create())); - } - -} diff --git a/common/src/test/java/de/ozgcloud/eingang/common/formdata/IncomingFileTest.java b/common/src/test/java/de/ozgcloud/eingang/common/formdata/IncomingFileTest.java deleted file mode 100644 index 7d23dfe3ef6e16f8b4d80f2e7fa40bd546c2edaa..0000000000000000000000000000000000000000 --- a/common/src/test/java/de/ozgcloud/eingang/common/formdata/IncomingFileTest.java +++ /dev/null @@ -1,97 +0,0 @@ -package de.ozgcloud.eingang.common.formdata; - -import static de.ozgcloud.eingang.common.formdata.IncomingFileTestFactory.*; -import static org.assertj.core.api.Assertions.*; - -import java.io.File; -import java.io.InputStream; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.function.Predicate; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; - -import lombok.SneakyThrows; - -class IncomingFileTest { - - private static final String TMP_DIRECTORY_PATH = System.getProperty("java.io.tmpdir"); - - private static final Predicate<Path> hasNameSuffix = path -> path.getFileName().toString().endsWith(IncomingFile.TMP_FILE_SUFFIX); - - @Nested - class TestTmpFile { - - @BeforeEach - void init() { - cleanupTempFiles(); - } - - @Test - void shouldCreateTmpFile() { - IncomingFileTestFactory.create().getContentStream(); - - assertThat(noFilesWithSuffixInTempDirectory()).isFalse(); - } - - @Test - void shouldCreateDeleteOnCloseInputStream() { - var file = IncomingFileTestFactory.create(); - file.getContentStream(); - InputStream newStream = file.getContentStreamForFinalRead(); - - assertThat(newStream).isInstanceOf(DeleteOnCloseInputStream.class); - } - - @Test - void validateInputStreamContent() { - InputStream newStream = IncomingFileTestFactory.create().getContentStream(); - - byte[] text = read(newStream); - - assertThat(text).isEqualTo(CONTENT); - } - - @Test - void shouldReturnNewInputStreamOnEveryRequest() { - IncomingFile incomingFile = IncomingFileTestFactory.create(); - - InputStream stream1 = incomingFile.getContentStream(); - InputStream stream2 = incomingFile.getContentStream(); - - assertThat(stream1).isNotSameAs(stream2); - } - - @Test - void contentStreamShouldBeMultipleReadable() { - IncomingFile incomingFile = IncomingFileTestFactory.create(); - - InputStream stream1 = incomingFile.getContentStream(); - InputStream stream2 = incomingFile.getContentStream(); - - assertThat(read(stream1)).isEqualTo(CONTENT); - assertThat(read(stream2)).isEqualTo(CONTENT); - - InputStream stream3 = incomingFile.getContentStream(); - assertThat(read(stream3)).isEqualTo(CONTENT); - } - - @SneakyThrows - private byte[] read(InputStream stream) { - return stream.readAllBytes(); - } - } - - @SneakyThrows - private static void cleanupTempFiles() { - Files.walk(Path.of(TMP_DIRECTORY_PATH), 1).filter(hasNameSuffix).map(Path::toFile).forEach(File::delete); - } - - @SneakyThrows - private static boolean noFilesWithSuffixInTempDirectory() { - return Files.walk(Path.of(TMP_DIRECTORY_PATH), 1).noneMatch(hasNameSuffix); - } - -} diff --git a/common/src/test/java/de/ozgcloud/eingang/common/formdata/IncomingFileTestFactory.java b/common/src/test/java/de/ozgcloud/eingang/common/formdata/IncomingFileTestFactory.java deleted file mode 100644 index 40e803fe1c1a89f4937d00453d574ebb09df7c67..0000000000000000000000000000000000000000 --- a/common/src/test/java/de/ozgcloud/eingang/common/formdata/IncomingFileTestFactory.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.common.formdata; - -import java.util.UUID; - -import org.springframework.http.MediaType; -import org.springframework.mock.web.MockMultipartFile; - -import de.ozgcloud.common.binaryfile.TempFileUtils; -import de.ozgcloud.eingang.common.formdata.IncomingFile.IncomingFileBuilder; -import lombok.SneakyThrows; - -public class IncomingFileTestFactory { - - public static final String ID = UUID.randomUUID().toString(); - public static final String VENDOR_ID = IncomingFileGroupTestFactory.VENDOR_ID_XXX; - public static final String NAME = "XML-Daten.xml"; - public static final String CONTENT_TYPE = "application/xml"; - public static final String PDF_CONTENT_TYPE = MediaType.APPLICATION_PDF_VALUE; - public static final String JSON_CONTENT_TYPE = MediaType.APPLICATION_JSON_VALUE; - public static final byte[] CONTENT = "TESTCONTENT1".getBytes(); - public static final long SIZE = 12; - - public static IncomingFile create() { - return createBuilder().build(); - } - - public static IncomingFileBuilder createBuilder() { - return IncomingFile.builder() - .id(ID) - .vendorId(VENDOR_ID) - .name(NAME) - .contentType(CONTENT_TYPE) - .file(TempFileUtils.writeTmpFile(CONTENT)) - .size(SIZE); - } - - public static MockMultipartFile asMultipartFile(String multipartName) { - return asMultipartFile(multipartName, create()); - } - - @SneakyThrows - public static MockMultipartFile asMultipartFile(String multipartName, IncomingFile file) { - return new MockMultipartFile(multipartName, file.getName(), file.getContentType(), file.getContentStream().readAllBytes()); - } -} diff --git a/common/src/test/java/de/ozgcloud/eingang/common/formdata/PostfachAddressTestFactory.java b/common/src/test/java/de/ozgcloud/eingang/common/formdata/PostfachAddressTestFactory.java deleted file mode 100644 index 2d25ee58700394251782ea7ab84537cd8750efbe..0000000000000000000000000000000000000000 --- a/common/src/test/java/de/ozgcloud/eingang/common/formdata/PostfachAddressTestFactory.java +++ /dev/null @@ -1,27 +0,0 @@ -package de.ozgcloud.eingang.common.formdata; - -import java.util.UUID; - -import de.ozgcloud.eingang.common.formdata.ServiceKonto.PostfachAddress; - -public class PostfachAddressTestFactory { - - public static final int POSTFACH_ADDRESS_TYPE = 1; - public static final String VERSION = "1.0"; - public static final String POSTFACH_ID = UUID.randomUUID().toString(); - - public static PostfachAddress create() { - return createBuilder().build(); - } - - private static PostfachAddress.PostfachAddressBuilder createBuilder() { - return PostfachAddress.builder() - .type(POSTFACH_ADDRESS_TYPE) - .version(VERSION) - .identifier(createStringBasedIdentifier()); - } - - private static PostfachAddressIdentifier createStringBasedIdentifier() { - return StringBasedIdentifier.builder().postfachId(POSTFACH_ID).build(); - } -} \ No newline at end of file diff --git a/common/src/test/java/de/ozgcloud/eingang/common/formdata/ServiceKontoTestFactory.java b/common/src/test/java/de/ozgcloud/eingang/common/formdata/ServiceKontoTestFactory.java deleted file mode 100644 index 9cc248f5806dffcfde00af9baf6085c73e88266e..0000000000000000000000000000000000000000 --- a/common/src/test/java/de/ozgcloud/eingang/common/formdata/ServiceKontoTestFactory.java +++ /dev/null @@ -1,18 +0,0 @@ -package de.ozgcloud.eingang.common.formdata; - -public class ServiceKontoTestFactory { - - public static final String TYPE = "OSI"; - public static final String TRUST_LEVEL = "STORK-QAA-Level-2"; - - public static ServiceKonto create() { - return createBuilder().build(); - } - - public static ServiceKonto.ServiceKontoBuilder createBuilder() { - return ServiceKonto.builder() - .type(TYPE) - .trustLevel(TRUST_LEVEL) - .postfachAddress(PostfachAddressTestFactory.create()); - } -} diff --git a/common/src/test/java/de/ozgcloud/eingang/common/formdata/TrustLevelTest.java b/common/src/test/java/de/ozgcloud/eingang/common/formdata/TrustLevelTest.java deleted file mode 100644 index 93c12966a7e2b57ae3053bb583e585d6683025d9..0000000000000000000000000000000000000000 --- a/common/src/test/java/de/ozgcloud/eingang/common/formdata/TrustLevelTest.java +++ /dev/null @@ -1,32 +0,0 @@ -package de.ozgcloud.eingang.common.formdata; - -import static org.assertj.core.api.Assertions.*; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.NullAndEmptySource; -import org.junit.jupiter.params.provider.ValueSource; - -import de.ozgcloud.eingang.common.formdata.ServiceKonto.TrustLevel; - -class TrustLevelTest { - - @DisplayName("should return true when") - @ParameterizedTest(name = "trust level is {0}") - @ValueSource(strings = {"STORK-QAA-Level-1", "STORK-QAA-Level-2", "STORK-QAA-Level-3", "STORK-QAA-Level-4"}) - void shouldReturnTrue(String trustLevel) { - var isValid = TrustLevel.exists(trustLevel); - - assertThat(isValid).isTrue(); - } - - @DisplayName("should return false when") - @ParameterizedTest(name = "trust level is \"{0}\"") - @NullAndEmptySource - @ValueSource(strings = {"STORK-QAA-Level-0", "unexpected"}) - void shouldReturnFalse(String trustLevel) { - var isValid = TrustLevel.exists(trustLevel); - - assertThat(isValid).isFalse(); - } -} \ No newline at end of file diff --git a/common/src/test/java/de/ozgcloud/eingang/common/formdata/ZustaendigeStelleTestFactory.java b/common/src/test/java/de/ozgcloud/eingang/common/formdata/ZustaendigeStelleTestFactory.java deleted file mode 100644 index fe990b8f81c42db2a65a480524b7a64d0e5a70a4..0000000000000000000000000000000000000000 --- a/common/src/test/java/de/ozgcloud/eingang/common/formdata/ZustaendigeStelleTestFactory.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.common.formdata; - -public class ZustaendigeStelleTestFactory { - - public static final String ORGANISATIONSEINHEIT_ID = "08150815"; - public static final String EMAIL = "hase@loewenkaefig.de"; - public static final String GEMEINDE_SCHLUESSEL = "1234567"; - public static final String AMTLICHER_REGIONAL_SCHLUESSEL = "regional-schluessel"; - public static final String HAUSANSCHRIFT_STRASSE = "Musterstraße"; - public static final String HAUSANSCHRIFT_PLZ = "12345"; - public static final String HAUSANSCHRIFT_ORT = "Musterort"; - public static final String TELEFON = "0123456789"; - - public static ZustaendigeStelle create() { - return createBuilder().build(); - } - - public static ZustaendigeStelle.ZustaendigeStelleBuilder createBuilder() { - return ZustaendigeStelle.builder() // - .organisationseinheitenId(ORGANISATIONSEINHEIT_ID) - .email(EMAIL) - .gemeindeSchluessel(GEMEINDE_SCHLUESSEL) - .amtlicherRegionalSchluessel(AMTLICHER_REGIONAL_SCHLUESSEL) - .hausanschriftStrasse(HAUSANSCHRIFT_STRASSE) - .hausanschriftPlz(HAUSANSCHRIFT_PLZ) - .hausanschriftOrt(HAUSANSCHRIFT_ORT) - .telefon(TELEFON); - } -} diff --git a/common/src/test/java/de/ozgcloud/eingang/common/vorgang/VorgangNummerSupplierTest.java b/common/src/test/java/de/ozgcloud/eingang/common/vorgang/VorgangNummerSupplierTest.java deleted file mode 100644 index fa604a63010e2b45ef5fb16d76438c870ced4603..0000000000000000000000000000000000000000 --- a/common/src/test/java/de/ozgcloud/eingang/common/vorgang/VorgangNummerSupplierTest.java +++ /dev/null @@ -1,106 +0,0 @@ -package de.ozgcloud.eingang.common.vorgang; - -import static org.assertj.core.api.Assertions.*; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.Mockito.*; - -import java.time.LocalDate; - -import org.apache.commons.lang3.RandomStringUtils; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.ValueSource; -import org.mockito.InjectMocks; -import org.mockito.Spy; - -import de.ozgcloud.common.errorhandling.TechnicalException; - -class VorgangNummerSupplierTest { - - @Spy - @InjectMocks - private VorgangNummerSupplier vorgangNummerSupplier; - - - @Test - @DisplayName("should add random suffix of length 6") - void shouldAddSuffix() { - var result = vorgangNummerSupplier.get(); - - assertThat(getSuffix(result)).hasSize(VorgangNummerSupplier.SUFFIX_LENGTH); - } - - @Test - void shouldHaveSuffixSize() { - var result = vorgangNummerSupplier.get(3); - - assertThat(getSuffix(result)).hasSize(3); - } - - @DisplayName("should throw exception when") - @ParameterizedTest(name = "suffix length {0}") - @ValueSource(ints = { -1, 0 }) - void shouldThrowException(int suffixLength) { - assertThrows(TechnicalException.class, () -> vorgangNummerSupplier.get(suffixLength)); - } - - private String getSuffix(String string) { - return string.substring(string.indexOf('-') + 1); - } - - @Test - void shouldCallGetRandomString() { - try (var randomStringUtils = mockStatic(RandomStringUtils.class)) { - vorgangNummerSupplier.get(); - - randomStringUtils.verify(() -> RandomStringUtils.random(VorgangNummerSupplier.SUFFIX_LENGTH, VorgangNummerSupplier.BASE30_ALPHABET)); - } - } - - @Test - void shouldHaveSize() { - var result = vorgangNummerSupplier.get(); - - assertThat(getPrefix(result)).hasSize(5); - } - - private String getPrefix(String string) { - return string.substring(0, string.indexOf('-') + 1); - } - - @Test - void shouldAddLastYearNumberFirst() { - var lastYearNumber = "" + LocalDate.now().getYear() % 10; - - var result = vorgangNummerSupplier.get(); - - assertThat(result.substring(0, 1)).isEqualTo(lastYearNumber); - } - - @Test - void shouldAddMonthValueSecond() { - var monthHexValue = "%X".formatted(LocalDate.now().getMonthValue()); - - var result = vorgangNummerSupplier.get(); - - assertThat(result.substring(1, 2)).isEqualTo(monthHexValue); - } - - @Test - void shouldAddDayValueThird() { - var dayValue = "%02d".formatted(LocalDate.now().getDayOfMonth()); - - var result = vorgangNummerSupplier.get(); - - assertThat(result.substring(2, 4)).isEqualTo(dayValue); - } - - @Test - void shouldAddHyphenAtEnd() { - var result = vorgangNummerSupplier.get(); - - assertThat(result.charAt(4)).isEqualTo('-'); - } - -} \ No newline at end of file diff --git a/common/src/test/resources/application.yml b/common/src/test/resources/application.yml deleted file mode 100644 index 989f0be570f60d5d2644d872f41717bfb3eab932..0000000000000000000000000000000000000000 --- a/common/src/test/resources/application.yml +++ /dev/null @@ -1,16 +0,0 @@ -spring: - profiles: - active: - - local - - itcase - -logging: - level: - ROOT: ERROR - '[org.springframework]': ERROR - config: classpath:log4j2-local.xml - -ozgcloud: - adapter: - routingStrategy: SINGLE - targetVorgangManagerName: kiel \ No newline at end of file diff --git a/common/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker b/common/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker deleted file mode 100644 index ca6ee9cea8ec189a088d50559325d4e84ff8ad09..0000000000000000000000000000000000000000 --- a/common/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker +++ /dev/null @@ -1 +0,0 @@ -mock-maker-inline \ No newline at end of file diff --git a/dependency-check-supressions.xml b/dependency-check-supressions.xml deleted file mode 100644 index 7e26000b0da2c557c2622f9a10a3cfb0b6eb0e19..0000000000000000000000000000000000000000 --- a/dependency-check-supressions.xml +++ /dev/null @@ -1,6 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<suppressions xmlns="https://jeremylong.github.io/DependencyCheck/dependency-suppression.1.3.xsd"> - <suppress> - <vulnerabilityName>CVE-DUMMY</vulnerabilityName> - </suppress> -</suppressions> diff --git a/enterprise-adapter/pom.xml b/enterprise-adapter/pom.xml deleted file mode 100644 index 8adcacf773ee3e7e8b70d68fc1fc2588e01071bf..0000000000000000000000000000000000000000 --- a/enterprise-adapter/pom.xml +++ /dev/null @@ -1,101 +0,0 @@ -<?xml version="1.0"?> -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> - <modelVersion>4.0.0</modelVersion> - <parent> - <groupId>de.ozgcloud.eingang</groupId> - <artifactId>eingang-manager</artifactId> - <version>2.16.0-SNAPSHOT</version> - </parent> - <artifactId>enterprise-adapter</artifactId> - <name>EM - Enterprise Interface Adapter</name> - - <properties> - <spring-boot.build-image.imageName>docker.ozg-sh.de/enterprise-adapter:build-latest</spring-boot.build-image.imageName> - </properties> - - <dependencies> - <!--ozg-Cloud--> - <dependency> - <groupId>de.ozgcloud.eingang</groupId> - <artifactId>common</artifactId> - </dependency> - <dependency> - <groupId>de.ozgcloud.eingang</groupId> - <artifactId>semantik-adapter</artifactId> - </dependency> - - - <!--spring--> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-web</artifactId> - </dependency> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-actuator</artifactId> - </dependency> - - - - <!--dev tools--> - <dependency> - <groupId>org.mapstruct</groupId> - <artifactId>mapstruct</artifactId> - </dependency> - - <!--test --> - <dependency> - <groupId>de.ozgcloud.eingang</groupId> - <artifactId>common</artifactId> - <type>test-jar</type> - <scope>test</scope> - </dependency> - </dependencies> - - <build> - <plugins> - <plugin> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-maven-plugin</artifactId> - </plugin> - - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-surefire-plugin</artifactId> - </plugin> - - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-failsafe-plugin</artifactId> - </plugin> - - <plugin> - <groupId>org.jacoco</groupId> - <artifactId>jacoco-maven-plugin</artifactId> - </plugin> - </plugins> - </build> - - <profiles> - <profile> - <id>ci-build</id> - <build> - <plugins> - <plugin> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-maven-plugin</artifactId> - <executions> - <execution> - <id>build-image</id> - <phase>install</phase> - <goals> - <goal>build-image-no-fork</goal> - </goals> - </execution> - </executions> - </plugin> - </plugins> - </build> - </profile> - </profiles> -</project> diff --git a/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/EnterpriseAdapterConfiguration.java b/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/EnterpriseAdapterConfiguration.java deleted file mode 100644 index 0ac48af3cdb7119aa93b35dc674bdfd31458502e..0000000000000000000000000000000000000000 --- a/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/EnterpriseAdapterConfiguration.java +++ /dev/null @@ -1,19 +0,0 @@ -package de.ozgcloud.eingang.enterprise; - -import java.util.List; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import de.ozgcloud.eingang.semantik.enginebased.EngineBasedSemantikAdapter; -import de.ozgcloud.eingang.semantik.enginebased.a12.A12EngineBasedAdapter; -import de.ozgcloud.eingang.semantik.enginebased.a12.A12EngineBasedMapper; - -@Configuration -class EnterpriseAdapterConfiguration { - - @Bean - EngineBasedSemantikAdapter engineBasedAdapter(List<A12EngineBasedMapper> mapper) { - return new A12EngineBasedAdapter(mapper); - } -} diff --git a/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/entry/EntryController.java b/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/entry/EntryController.java deleted file mode 100644 index 66431be6bf498d341a7b10ca8d38c7de46f42da3..0000000000000000000000000000000000000000 --- a/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/entry/EntryController.java +++ /dev/null @@ -1,123 +0,0 @@ -package de.ozgcloud.eingang.enterprise.entry; - -import java.io.IOException; -import java.io.InputStream; -import java.time.ZonedDateTime; -import java.util.Collection; -import java.util.Objects; - -import org.apache.commons.collections4.CollectionUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.io.Resource; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestPart; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.bind.annotation.ResponseStatus; -import org.springframework.web.multipart.MultipartFile; - -import de.ozgcloud.common.binaryfile.TempFileUtils; -import de.ozgcloud.common.errorhandling.TechnicalException; -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.common.formdata.IncomingFile; -import de.ozgcloud.eingang.common.formdata.IncomingFileGroup; -import de.ozgcloud.eingang.common.vorgang.VorgangNummerSupplier; -import de.ozgcloud.eingang.enterprise.entry.EntryResponse.ResponseVorgang; -import de.ozgcloud.eingang.semantik.SemantikAdapter; - -@Controller -@ResponseBody -@RequestMapping("antrag") -public class EntryController { - - private static final String STARTING_STATUS = "NEU"; - private static final String OTHER_FILE_GROUP_NAME = "Sonstige"; - - @Autowired - private EntryDataMapper mapper; - - @Autowired - private SemantikAdapter semantikAdapter; - @Autowired - private VorgangNummerSupplier vorgangNummerSupplier; - - @ResponseStatus(HttpStatus.ACCEPTED) - @PostMapping(consumes = "multipart/form-data", produces = MediaType.APPLICATION_JSON_VALUE) - public EntryResponse receiveAntrag(@RequestPart("formData") Resource formData, - @RequestPart(name = "representation", required = false) Collection<MultipartFile> representations, - @RequestPart(name = "attachment", required = false) Collection<MultipartFile> attachment) - throws IOException { - var mapped = mapper.mapEntryData(formData.getInputStream()); - mapped = addVorgangNummer(mapped); - mapped = addRepresentations(representations, mapped); - mapped = addAttachments(attachment, mapped); - - var vorgangId = semantikAdapter.processFormData(mapped); - - return buildResponse(mapped, vorgangId); - } - - private FormData addVorgangNummer(FormData formData) { - var header = formData.getHeader().toBuilder().vorgangNummer(vorgangNummerSupplier.get()).build(); - return formData.toBuilder().header(header).build(); - } - - private FormData addRepresentations(Collection<MultipartFile> representations, FormData formData) { - if (Objects.isNull(representations)) { - return formData; - } - - var builder = formData.toBuilder(); - representations.stream().map(this::buildIncomingFile).forEach(builder::representation); - return builder.numberOfRepresentations(representations.size()).build(); - } - - FormData addAttachments(Collection<MultipartFile> attachments, FormData formData) { - if (CollectionUtils.isEmpty(attachments)) { - return formData; - } - - IncomingFileGroup group = buildSonstigeGroup(attachments); - return formData.toBuilder().attachment(group).numberOfAttachments(group.getFiles().size()).build(); - } - - private IncomingFileGroup buildSonstigeGroup(Collection<MultipartFile> attachments) { - var builder = IncomingFileGroup.builder().name(OTHER_FILE_GROUP_NAME); - attachments.stream().map(this::buildIncomingFile).forEach(builder::file); - return builder.build(); - } - - private IncomingFile buildIncomingFile(MultipartFile multipartFile) { - InputStream inStream = getInputStream(multipartFile); - - return IncomingFile.builder() - .name(multipartFile.getOriginalFilename()) - .contentType(multipartFile.getContentType()) - .size(multipartFile.getSize()) - .file(TempFileUtils.writeTmpFile(inStream)) - .build(); - } - - private InputStream getInputStream(MultipartFile multipartFile) { - try { - return multipartFile.getInputStream(); - } catch (IOException e) { - throw new TechnicalException("Error reading incoming multipart File.", e); - } - } - - EntryResponse buildResponse(FormData formData, String vorgangId) { - return EntryResponse.builder() - .transactionId(formData.getHeader().getRequestId()) - .vorgang(ResponseVorgang.builder() - .vorgangId(vorgangId) - .vorgangNummer(formData.getHeader().getVorgangNummer()) - .status(STARTING_STATUS) - .statusSince(ZonedDateTime.now().withNano(0)) - .build()) - .build(); - } -} diff --git a/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/entry/EntryData.java b/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/entry/EntryData.java deleted file mode 100644 index a25b788b39590e1f86375981374c668dd1319e37..0000000000000000000000000000000000000000 --- a/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/entry/EntryData.java +++ /dev/null @@ -1,65 +0,0 @@ -package de.ozgcloud.eingang.enterprise.entry; - -import java.util.List; - -import com.fasterxml.jackson.annotation.JsonProperty; - -import lombok.Builder; -import lombok.Getter; -import lombok.extern.jackson.Jacksonized; - -@Builder -@Getter -@Jacksonized -public class EntryData { - - private ControlData control; - private List<EntryFormDataItem> formData; - - @Builder - @Getter - @Jacksonized - public static class ControlData { - private String transactionId; - private String zustaendigeStelle; - private String[] leikaIds; - private ResultEndpoint resultEndpoint; - private String formId; - @JsonProperty("name") - private String formName; - private Servicekonto serviceKonto; - - private Representations representations; - - @Builder - @Getter - @Jacksonized - public static class ResultEndpoint { - private String address; - } - - @Builder - @Getter - @Jacksonized - public static class Representations { - private String formData; - private String formDataModell; - } - } - - @Builder - @Getter - @Jacksonized - public static class Servicekonto { - private String type; - private PostfachAddress postfachAddress; - } - - @Builder - @Getter - @Jacksonized - public static class PostfachAddress { - private String identifier; - private String type; - } -} diff --git a/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/entry/EntryDataMapper.java b/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/entry/EntryDataMapper.java deleted file mode 100644 index 1c2c5340499d72c4101fc52bbbd40ddec37c3c2d..0000000000000000000000000000000000000000 --- a/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/entry/EntryDataMapper.java +++ /dev/null @@ -1,34 +0,0 @@ -package de.ozgcloud.eingang.enterprise.entry; - -import java.io.IOException; -import java.io.InputStream; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import com.fasterxml.jackson.databind.ObjectMapper; - -import de.ozgcloud.eingang.common.formdata.FormData; - -@Component -class EntryDataMapper { - - @Autowired - private ObjectMapper objectMapper; - @Autowired - private FormDataMapper formDataMapper; - - public FormData mapEntryData(InputStream request) { - return formDataMapper.mapEntryData(readRequest(request)); - } - - EntryData readRequest(InputStream request) { - try { - return objectMapper.readValue(request, EntryData.class); - } catch (IOException e) { - throw new ReadingRequestException(e); - } - - } - -} diff --git a/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/entry/EntryFormDataField.java b/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/entry/EntryFormDataField.java deleted file mode 100644 index 7a7623d46aa01306b28979c9791b17c4677e1653..0000000000000000000000000000000000000000 --- a/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/entry/EntryFormDataField.java +++ /dev/null @@ -1,48 +0,0 @@ -package de.ozgcloud.eingang.enterprise.entry; - -import java.time.LocalDate; -import java.util.Objects; - -import org.apache.commons.lang3.StringUtils; - -import lombok.Builder; -import lombok.Getter; -import lombok.ToString; -import lombok.extern.jackson.Jacksonized; - -@Builder -@Getter -@Jacksonized -@ToString(onlyExplicitlyIncluded = true) -public class EntryFormDataField implements EntryFormDataItem { - - private String name; - @ToString.Include - private String label; - - private String stringValue; - private Boolean booleanValue; - private Number numberValue; - private LocalDate dateValue; - - @Override - public boolean isFormField() { - return true; - } - - public Object getValue() { - if (StringUtils.isNotBlank(stringValue)) { - return stringValue; - } - if (Objects.nonNull(booleanValue)) { - return booleanValue; - } - if (Objects.nonNull(numberValue)) { - return numberValue; - } - if (Objects.nonNull(dateValue)) { - return dateValue; - } - return null; - } -} diff --git a/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/entry/EntryFormDataItem.java b/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/entry/EntryFormDataItem.java deleted file mode 100644 index c2c318fd80dfa8319fa565c56b7a5ee8a0343bf9..0000000000000000000000000000000000000000 --- a/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/entry/EntryFormDataItem.java +++ /dev/null @@ -1,21 +0,0 @@ -package de.ozgcloud.eingang.enterprise.entry; - -import com.fasterxml.jackson.annotation.JsonSubTypes; -import com.fasterxml.jackson.annotation.JsonSubTypes.Type; -import com.fasterxml.jackson.annotation.JsonTypeInfo; -import com.fasterxml.jackson.annotation.JsonTypeInfo.Id; - -@JsonTypeInfo(use = Id.DEDUCTION) -@JsonSubTypes({ @Type(EntryFormDataField.class), @Type(EntryFormDataSubForm.class) }) -public interface EntryFormDataItem { - String getName(); - String getLabel(); - - default boolean isSubForm() { - return false; - } - - default boolean isFormField() { - return false; - } -} diff --git a/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/entry/EntryFormDataSubForm.java b/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/entry/EntryFormDataSubForm.java deleted file mode 100644 index 402f2bc1bdbc8e5af6ae3fc1b4cfa9836c4e5725..0000000000000000000000000000000000000000 --- a/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/entry/EntryFormDataSubForm.java +++ /dev/null @@ -1,28 +0,0 @@ -package de.ozgcloud.eingang.enterprise.entry; - -import java.util.List; - -import lombok.Builder; -import lombok.Getter; -import lombok.Singular; -import lombok.ToString; -import lombok.extern.jackson.Jacksonized; - -@Builder -@Getter -@Jacksonized -@ToString(onlyExplicitlyIncluded = true) -public class EntryFormDataSubForm implements EntryFormDataItem { - - private String name; - @ToString.Include - private String label; - - @Singular - private List<EntryFormDataItem> formItems; - - @Override - public boolean isSubForm() { - return true; - } -} diff --git a/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/entry/EntryResponse.java b/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/entry/EntryResponse.java deleted file mode 100644 index 840df7a6d5b14b01f38bf6ef67d5a5b9e96b00bf..0000000000000000000000000000000000000000 --- a/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/entry/EntryResponse.java +++ /dev/null @@ -1,23 +0,0 @@ -package de.ozgcloud.eingang.enterprise.entry; - -import java.time.ZonedDateTime; - -import lombok.Builder; -import lombok.Getter; - -@Builder -@Getter -class EntryResponse { - - private String transactionId; - private ResponseVorgang vorgang; - - @Builder - @Getter - static class ResponseVorgang { - private String vorgangId; - private String vorgangNummer; - private String status; - private ZonedDateTime statusSince; - } -} diff --git a/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/entry/FormDataMapper.java b/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/entry/FormDataMapper.java deleted file mode 100644 index b671d184d9f6a90939b2d4e10be29722cb365e3f..0000000000000000000000000000000000000000 --- a/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/entry/FormDataMapper.java +++ /dev/null @@ -1,110 +0,0 @@ -package de.ozgcloud.eingang.enterprise.entry; - -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.stream.Collectors; - -import org.apache.commons.lang3.tuple.Pair; -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; - -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.common.formdata.FormData.Representations; -import de.ozgcloud.eingang.common.formdata.FormHeader; -import de.ozgcloud.eingang.common.formdata.PostfachAddressIdentifier; -import de.ozgcloud.eingang.common.formdata.ServiceKonto.PostfachAddress; -import de.ozgcloud.eingang.common.formdata.StringBasedIdentifier; -import de.ozgcloud.eingang.common.formdata.ZustaendigeStelle; - -@Mapper -public interface FormDataMapper { - - public static final String VALUE_KEY = "value"; - public static final String LABEL_KEY = "label"; - - @Mapping(target = "antragsteller", ignore = true) - @Mapping(target = "attachment", ignore = true) - @Mapping(target = "attachments", ignore = true) - @Mapping(target = "numberOfAttachments", ignore = true) - @Mapping(target = "representation", ignore = true) - @Mapping(target = "representations", ignore = true) - @Mapping(target = "numberOfRepresentations", ignore = true) - - @Mapping(target = "id", ignore = true) - @Mapping(target = "header", source = "control") - - @Mapping(target = "zustaendigeStelle", source = "control.zustaendigeStelle") - FormData mapEntryData(EntryData entryData); - - default <T> Optional<T> mapOptional(T obj) { - return Optional.ofNullable(obj); - } - - @Mapping(target = "vorgangNummer", ignore = true) - @Mapping(target = "createdAt", ignore = true) - @Mapping(target = "channel", constant = "B2G") - @Mapping(target = "formEngineName", constant = "A12") // TODO - @Mapping(target = "requestId", source = "transactionId") - @Mapping(target = "sender", ignore = true) // TODO fill from authentication - @Mapping(target = "serviceKonto.postfachAddresses", ignore = true) - FormHeader mapHeader(EntryData.ControlData controlData); - - @Mapping(target = "primaryFormDataPdfRepresentation", ignore = true) - @Mapping(target = "primaryFormDataRepresentation", source = "formData") - Representations mapRepresentations(EntryData.ControlData.Representations representations); - - default ZustaendigeStelle fromId(String organisationsEinheitenId) { - return ZustaendigeStelle.builder().organisationseinheitenId(organisationsEinheitenId).build(); - } - - default Map<String, Object> mapFormItems(List<EntryFormDataItem> items) { - return items.stream().map(item -> Pair.of(item.getName(), - item.isFormField() ? mapFormField((EntryFormDataField) item) : mapSubForm((EntryFormDataSubForm) item))) - .collect(Collectors.toMap(Pair::getKey, Pair::getValue)); - } - - default Map<String, Object> mapFormField(EntryFormDataField field) { - var map = new HashMap<String, Object>(); - map.put(LABEL_KEY, field.getLabel()); - map.put(VALUE_KEY, field.getValue()); - - return Collections.unmodifiableMap(map); - } - - default Map<String, Object> mapSubForm(EntryFormDataSubForm subForm) { - var map = new HashMap<String, Object>(); - map.put(LABEL_KEY, subForm.getLabel()); - map.put(VALUE_KEY, mapFormItems(subForm.getFormItems())); - - return Collections.unmodifiableMap(map); - } - - default PostfachAddress map(de.ozgcloud.eingang.enterprise.entry.EntryData.PostfachAddress address) { - return PostfachAddress.builder() - .version("1") - .type(toNumericType(address.getType())) - .identifier(StringBasedIdentifier.builder().postfachId(address.getIdentifier()).build()) - .build(); - } - - default int toNumericType(String type) { - switch (type) { - case "privat": - return 0; - case "unternehmen": - return 1; - case "behoerde": - return 2; - default: - return -1; - } - } - - default PostfachAddressIdentifier map(String value) { - return StringBasedIdentifier.builder().postfachId(value).build(); - } - -} diff --git a/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/entry/ReadingRequestException.java b/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/entry/ReadingRequestException.java deleted file mode 100644 index 3705dd85e4444cfea85beae8cf3b4954b0eb6df6..0000000000000000000000000000000000000000 --- a/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/entry/ReadingRequestException.java +++ /dev/null @@ -1,14 +0,0 @@ -package de.ozgcloud.eingang.enterprise.entry; - -import de.ozgcloud.common.errorhandling.TechnicalException; - -public class ReadingRequestException extends TechnicalException { - - private static final String MESSAGE = "Error reading Request."; - - public ReadingRequestException(Exception cause) { - super(MESSAGE, cause); - - } - -} diff --git a/enterprise-adapter/src/main/resources/application-local.yml b/enterprise-adapter/src/main/resources/application-local.yml deleted file mode 100644 index df74b44c618294d9436a965e64d4ed14821403e2..0000000000000000000000000000000000000000 --- a/enterprise-adapter/src/main/resources/application-local.yml +++ /dev/null @@ -1,24 +0,0 @@ -logging: - config: classpath:log4j2-local.xml - -server: - port: 9294 - error: - include-stacktrace: always - -management: - server: - port: 0 - endpoints: - enabled-by-default: false - -ozgcloud: - adapter: - targetVorgangManagerName: local - fallbackStrategy: DENY - -grpc: - client: - vorgang-manager-local: - address: static://127.0.0.1:9090 - negotiationType: PLAINTEXT \ No newline at end of file diff --git a/enterprise-adapter/src/main/resources/application.yml b/enterprise-adapter/src/main/resources/application.yml deleted file mode 100644 index 57600862f169f8faff3f60ffb7721c13dddc9a2e..0000000000000000000000000000000000000000 --- a/enterprise-adapter/src/main/resources/application.yml +++ /dev/null @@ -1,44 +0,0 @@ -logging: - level: - ROOT: WARN - '[de.ozgcloud]': INFO - -spring: - servlet: - multipart: - max-file-size: 124MB - max-request-size: 256MB - file-size-threshold: 10MB - -server: - http2: - enabled: true - error: - include-stacktrace: never - -management: - server: - port: 8081 - health: - livenessState: - enabled: true - readinessState: - enabled: true - endpoint: - health: - group: - exploratory: - include: livenessState,readinessState,ping - show-details: always - probes: - enabled: true - prometheus: - enabled: true - endpoints: - web: - exposure: - include: health,prometheus - -ozgcloud: - adapter: - routingStrategy: SINGLE \ No newline at end of file diff --git a/enterprise-adapter/src/main/resources/log4j2-local.xml b/enterprise-adapter/src/main/resources/log4j2-local.xml deleted file mode 100644 index 5d7001e1f9186d197a2d301d3910c9d73ed05d15..0000000000000000000000000000000000000000 --- a/enterprise-adapter/src/main/resources/log4j2-local.xml +++ /dev/null @@ -1,14 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<configuration> - <Appenders> - <Console name="CONSOLE" target="SYSTEM_OUT"> - <PatternLayout pattern="[%-5level] %c{1.} %msg%n"/> - </Console> - </Appenders> - - <Loggers> - <Root level="WARN"> - <appender-ref ref="CONSOLE" /> - </Root> - </Loggers> -</configuration> \ No newline at end of file diff --git a/enterprise-adapter/src/test/java/de/ozgcloud/eingang/enterprise/entry/ControlDataTestFactory.java b/enterprise-adapter/src/test/java/de/ozgcloud/eingang/enterprise/entry/ControlDataTestFactory.java deleted file mode 100644 index ece8a0aaf9f4f39a2044d8af1590f4b2ad638579..0000000000000000000000000000000000000000 --- a/enterprise-adapter/src/test/java/de/ozgcloud/eingang/enterprise/entry/ControlDataTestFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package de.ozgcloud.eingang.enterprise.entry; - -import de.ozgcloud.eingang.enterprise.entry.EntryData.ControlData; -import de.ozgcloud.eingang.enterprise.entry.EntryData.ControlData.Representations; -import de.ozgcloud.eingang.enterprise.entry.EntryData.ControlData.ResultEndpoint; - -public class ControlDataTestFactory { - - public static final String TRANSACTION_ID = "4e7a6ae7-4d0f-444d-8971-7cfc051c9924"; - public static final String ZUSTAENDIGE_STELLE = "248240886"; - public static final String[] LEIKA_IDS = new String[] { "99108011000000", "99108011153000" }; - - public static final String RESULT_ENDPOIN_ADDRESS = "https://idalabs.de/backend/api"; - - public static final String FORM_ID = "KFAS_LIVE_KI_10_Haltverbot_befristet"; - public static final String NAME = "Anmeldung zur Einrichtung einer zeitlich befristeten Haltverbotszone gem. § 45 Abs. 1 Straßenverkehrsordnung (StVO)"; - - public static ControlData create() { - return createBuilder().build(); - } - - public static ControlData.ControlDataBuilder createBuilder() { - return ControlData.builder() - .transactionId(TRANSACTION_ID) - .zustaendigeStelle(ZUSTAENDIGE_STELLE) - .leikaIds(LEIKA_IDS) - .resultEndpoint(ResultEndpoint.builder().address(RESULT_ENDPOIN_ADDRESS).build()) - .formId(FORM_ID) - .formName(NAME) - .serviceKonto(ServicekontoTestFactory.create()) - .representations(Representations.builder() - .formData(FormDataControlTestFactory.PRIMARY_FORM_DATA_REPRESENTATION) - .formDataModell(FormDataControlTestFactory.FORM_DATA_MODELL) - .build()); - } -} diff --git a/enterprise-adapter/src/test/java/de/ozgcloud/eingang/enterprise/entry/EnterpriseEntryITCase.java b/enterprise-adapter/src/test/java/de/ozgcloud/eingang/enterprise/entry/EnterpriseEntryITCase.java deleted file mode 100644 index edde8e256ad108a7458f4325b7444c4a585f776d..0000000000000000000000000000000000000000 --- a/enterprise-adapter/src/test/java/de/ozgcloud/eingang/enterprise/entry/EnterpriseEntryITCase.java +++ /dev/null @@ -1,106 +0,0 @@ -package de.ozgcloud.eingang.enterprise.entry; - -import static org.assertj.core.api.Assertions.*; -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.*; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; - -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.mockito.ArgumentCaptor; -import org.mockito.Captor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.http.MediaType; -import org.springframework.mock.web.MockMultipartFile; -import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.ResultActions; - -import de.ozgcloud.common.test.ITCase; -import de.ozgcloud.common.test.TestUtils; -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.router.VorgangService; -import lombok.SneakyThrows; - -@ITCase -@AutoConfigureMockMvc -@ActiveProfiles({ "itcase", "local" }) -class EnterpriseEntryITCase { - - @MockBean - private VorgangService vorgangService; - - @Autowired - private MockMvc mockMvc; - - @Test - void shouldCallVorgangService() { - doPostRequest(); - - verify(vorgangService).createVorgang(any()); - } - - @SneakyThrows - private ResultActions doPostRequest() { - return mockMvc.perform(multipart("/antrag") - .file(new MockMultipartFile("formData", "simple.json", MediaType.APPLICATION_JSON.toString(), - TestUtils.loadTextFile("request/simple.json").getBytes()))) - .andExpect(status().is2xxSuccessful()); - } - - @Nested - class A12Entry { - - @Captor - private ArgumentCaptor<FormData> formDataCaptor; - - @Test - void shouldCreateVorgang() { - var formData = doPostRequest(); - - assertThat(formData).isNotNull(); - } - - @Test - void shouldHaveNoOfRepresentations() { - var formData = doPostRequest(); - - assertThat(formData.getNumberOfRepresentations()).isEqualTo(2); - } - - @Test - void shouldHaveFormData() { - var formData = doPostRequest(); - - assertThat(formData.getFormData()).containsKeys("Haushaltsjahr", "Anlage_1", "Anlage_2"); - } - - @Test - void shouldHaveMukServiceKonto() { - var formData = doPostRequest(); - - assertThat(formData.getHeader().getServiceKonto().getType()).isEqualTo("MUK"); - } - - @SneakyThrows - private FormData doPostRequest() { - mockMvc.perform(multipart("/antrag") - .file(buildJsonFileMock("formData", "a12_entry.json")) - .file(buildJsonFileMock("representation", "document_JaS.json")) - .file(buildJsonFileMock("representation", "jugendsozialarbeit_an_schulen-DM.json"))) - .andExpect(status().is2xxSuccessful()); - - verify(vorgangService).createVorgang(formDataCaptor.capture()); - return formDataCaptor.getValue(); - } - - } - - private MockMultipartFile buildJsonFileMock(String name, String origName) { - var fileToLoad = "request/%s".formatted(origName); - return new MockMultipartFile(name, origName, MediaType.APPLICATION_JSON.toString(), TestUtils.loadTextFile(fileToLoad).getBytes()); - } -} diff --git a/enterprise-adapter/src/test/java/de/ozgcloud/eingang/enterprise/entry/EntryControllerTest.java b/enterprise-adapter/src/test/java/de/ozgcloud/eingang/enterprise/entry/EntryControllerTest.java deleted file mode 100644 index 5d1515ab2e9d1b8b2d765e1e16408273803fc3da..0000000000000000000000000000000000000000 --- a/enterprise-adapter/src/test/java/de/ozgcloud/eingang/enterprise/entry/EntryControllerTest.java +++ /dev/null @@ -1,248 +0,0 @@ -package de.ozgcloud.eingang.enterprise.entry; - -import static org.assertj.core.api.Assertions.*; -import static org.assertj.core.api.InstanceOfAssertFactories.*; -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.*; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; - -import java.io.InputStream; -import java.util.Collections; -import java.util.List; - -import org.apache.commons.io.IOUtils; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.mockito.ArgumentCaptor; -import org.mockito.Captor; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Spy; -import org.springframework.core.io.Resource; -import org.springframework.mock.web.MockMultipartFile; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.ResultActions; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; - -import de.ozgcloud.common.test.TestUtils; -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.common.formdata.FormDataTestFactory; -import de.ozgcloud.eingang.common.formdata.FormHeader; -import de.ozgcloud.eingang.common.formdata.FormHeaderTestFactory; -import de.ozgcloud.eingang.common.formdata.IncomingFileGroup; -import de.ozgcloud.eingang.common.vorgang.VorgangNummerSupplier; -import de.ozgcloud.eingang.semantik.SemantikAdapter; -import lombok.SneakyThrows; - -class EntryControllerTest { - - @Spy - @InjectMocks - private EntryController controller; - - @Mock - private EntryDataMapper mapper; - @Mock - private SemantikAdapter semantikAdapter; - @Mock - private VorgangNummerSupplier vorgangNummerSupplier; - - private MockMvc mockMvc; - - @BeforeEach - void init() { - mockMvc = MockMvcBuilders.standaloneSetup(controller).build(); - } - - @Nested - class ReceiveAntrag { - - private final FormHeader header = FormHeaderTestFactory.createBuilder().vorgangNummer(null).build(); - private final FormData formData = FormDataTestFactory.createBuilder().header(header).clearAttachments().clearRepresentations().build(); - - @Captor - private ArgumentCaptor<InputStream> streamCaptor; - @Captor - private ArgumentCaptor<FormData> formDataCaptor; - - private final EntryResponse response = EntryResponseTestFactory.create(); - - @BeforeEach - void init() { - when(mapper.mapEntryData(any())).thenReturn(formData); - doReturn(response).when(controller).buildResponse(any(), any()); - when(vorgangNummerSupplier.get()).thenReturn(FormHeaderTestFactory.VORGANG_NUMMER); - } - - @Test - @SneakyThrows - void shouldReturnAccepted() { - doPostRequest().andExpect(status().isAccepted()); - } - - @Test - @SneakyThrows - void shouldCallMapper() { - var request = TestUtils.loadTextFile("request/simple.json"); - - doPostRequest(); - - verify(mapper).mapEntryData(streamCaptor.capture()); - var inputBytes = IOUtils.readFully(streamCaptor.getValue(), request.getBytes().length); - assertThat(inputBytes).hasSameSizeAs(request.getBytes()).isEqualTo(request.getBytes()); - } - - @Test - void shouldCallSemantikAdapter() { - doPostRequest(); - - verify(semantikAdapter).processFormData(notNull()); - } - - @Test - void shouldSetVorgangNummer() { - doPostRequest(); - - verify(semantikAdapter).processFormData(formDataCaptor.capture()); - assertThat(formDataCaptor.getValue().getHeader().getVorgangNummer()).isEqualTo(FormHeaderTestFactory.VORGANG_NUMMER); - } - - @Test - @SneakyThrows - void shouldReturnResponse() { - var response = controller.receiveAntrag(mock(Resource.class), Collections.emptyList(), Collections.emptyList()); - - assertThat(response).isSameAs(this.response); - } - - @SneakyThrows - private ResultActions doPostRequest() { - return mockMvc.perform(multipart("/antrag") - .file(new MockMultipartFile("formData", TestUtils.loadTextFile("request/simple.json").getBytes()))) - .andExpect(status().is2xxSuccessful()); - } - - @Nested - class WithRepresentations { - - @Captor - private ArgumentCaptor<FormData> formDataCaptor; - - @Test - void shouldAddRepresentations() { - var formData = doPostRequest(); - - assertThat(formData.getRepresentations()).hasSize(2); - } - - @Test - void shouldSetNumberOfRepresentations() { - var formData = doPostRequest(); - - assertThat(formData.getNumberOfRepresentations()).isEqualTo(2); - } - - @SneakyThrows - private FormData doPostRequest() { - mockMvc.perform(multipart("/antrag") - .file(new MockMultipartFile("formData", TestUtils.loadTextFile("request/a12_entry.json").getBytes())) - .file(new MockMultipartFile("representation", TestUtils.loadTextFile("request/document_JaS.json").getBytes())) - .file(new MockMultipartFile("representation", - TestUtils.loadTextFile("request/jugendsozialarbeit_an_schulen-DM.json").getBytes()))) - .andExpect(status().is2xxSuccessful()); - - verify(semantikAdapter).processFormData(formDataCaptor.capture()); - return formDataCaptor.getValue(); - } - } - - @Nested - class WithAttachments { - @Test - void shouldAddAttachments() { - var formData = doPostRequest(); - - assertThat(formData.getAttachments()).hasSize(1).first().extracting(IncomingFileGroup::getFiles).asInstanceOf(LIST).hasSize(1); - } - - @Test - void shouldSetNumberOfAttachments() { - var formData = doPostRequest(); - - assertThat(formData.getNumberOfAttachments()).isEqualTo(1); - } - - @SneakyThrows - private FormData doPostRequest() { - mockMvc.perform(multipart("/antrag") - .file(new MockMultipartFile("formData", TestUtils.loadTextFile("request/a12_entry.json").getBytes())) - .file(new MockMultipartFile("attachment", TestUtils.loadTextFile("request/document_JaS.json").getBytes()))) - .andExpect(status().is2xxSuccessful()); - - verify(semantikAdapter).processFormData(formDataCaptor.capture()); - return formDataCaptor.getValue(); - } - - } - - } - - @Nested - class TestAddAttachments { - - private MockMultipartFile file = new MockMultipartFile("attachment", TestUtils.loadTextFile("request/document_JaS.json").getBytes()); - - @Test - void shouldIgnoreNullCollection() { - var formData = FormDataTestFactory.create(); - - var result = controller.addAttachments(null, formData); - - assertThat(result).isSameAs(formData); - } - - @Test - void shouldIgnoreEmptyCollection() { - var formData = FormDataTestFactory.create(); - - var result = controller.addAttachments(Collections.emptyList(), formData); - - assertThat(result).isSameAs(formData); - } - - @Test - void shouldAddToSonstigeGroup() { - var formData = FormDataTestFactory.createBuilder().clearAttachments().build(); - - var result = controller.addAttachments(List.of(file), formData); - - assertThat(result.getAttachments()).hasSize(1).first().extracting(IncomingFileGroup::getName).isEqualTo("Sonstige"); - } - - @Test - void shouldAddFiles() { - var formData = FormDataTestFactory.createBuilder().clearAttachments().build(); - - var result = controller.addAttachments(List.of(file), formData); - - assertThat(result.getAttachments()).hasSize(1).first().extracting(IncomingFileGroup::getFiles).asInstanceOf(LIST).hasSize(1); - } - } - - @Nested - class BuildResponse { - - @Test - @SneakyThrows - void shouldCreateResponse() { - var response = controller.buildResponse(FormDataTestFactory.create(), ResponseVorgangTestFactory.VORGANG_ID); - - assertThat(response).usingRecursiveComparison() - .ignoringFields("vorgang.statusSince") - .isEqualTo(EntryResponseTestFactory.create()); - } - } - -} diff --git a/enterprise-adapter/src/test/java/de/ozgcloud/eingang/enterprise/entry/EntryDataMapperTest.java b/enterprise-adapter/src/test/java/de/ozgcloud/eingang/enterprise/entry/EntryDataMapperTest.java deleted file mode 100644 index 797f0ec78434b82586b90e31cc2c6932188d744c..0000000000000000000000000000000000000000 --- a/enterprise-adapter/src/test/java/de/ozgcloud/eingang/enterprise/entry/EntryDataMapperTest.java +++ /dev/null @@ -1,84 +0,0 @@ -package de.ozgcloud.eingang.enterprise.entry; - -import static org.assertj.core.api.Assertions.*; -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.*; - -import java.io.InputStream; - -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Mockito; -import org.mockito.Spy; - -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; - -import de.ozgcloud.common.test.TestUtils; -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.common.formdata.FormDataTestFactory; -import lombok.SneakyThrows; - -class EntryDataMapperTest { - - @Spy - @InjectMocks - private EntryDataMapper mapper; - @Mock - private FormDataMapper formDataMapper; - - @Spy - private ObjectMapper objectMapper = new ObjectMapper() - .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, true) - .registerModule(new JavaTimeModule()); - - @Nested - class TestMappingEntryData { - - private InputStream jsonInput = TestUtils.loadFile("request/simple.json"); - - @Nested - class TestReadRequest { - @Test - void shouldReadJson() { - var read = mapper.readRequest(jsonInput); - - assertThat(read).usingRecursiveComparison() - .isEqualTo(EntryDataTestFactory.createBuilder().control(ControlDataTestFactory.createBuilder().representations(null).build()) - .build()); - } - } - - @Test - void shouldReadRequest() { - mapper.mapEntryData(jsonInput); - - verify(mapper).readRequest(jsonInput); - } - - @Test - @SneakyThrows - void shouldCallFormDataMapper() { - var entryData = EntryDataTestFactory.create(); - doReturn(entryData).when(objectMapper).readValue(any(InputStream.class), Mockito.<Class<EntryData>>any()); - - mapper.mapEntryData(jsonInput); - - verify(formDataMapper).mapEntryData(entryData); - } - - @Test - void shouldReturnMappedResult() { - FormData formData = FormDataTestFactory.create(); - when(formDataMapper.mapEntryData(any())).thenReturn(formData); - - var result = mapper.mapEntryData(jsonInput); - - assertThat(result).isSameAs(formData); - } - } - -} diff --git a/enterprise-adapter/src/test/java/de/ozgcloud/eingang/enterprise/entry/EntryDataTestFactory.java b/enterprise-adapter/src/test/java/de/ozgcloud/eingang/enterprise/entry/EntryDataTestFactory.java deleted file mode 100644 index 855fa290a29a92945a32767c9f90452b907a9e4c..0000000000000000000000000000000000000000 --- a/enterprise-adapter/src/test/java/de/ozgcloud/eingang/enterprise/entry/EntryDataTestFactory.java +++ /dev/null @@ -1,14 +0,0 @@ -package de.ozgcloud.eingang.enterprise.entry; - -public class EntryDataTestFactory { - - public static EntryData create() { - return createBuilder().build(); - } - - public static EntryData.EntryDataBuilder createBuilder() { - return EntryData.builder() - .control(ControlDataTestFactory.create()) - .formData(EntryFormDataTestFactory.create()); - } -} diff --git a/enterprise-adapter/src/test/java/de/ozgcloud/eingang/enterprise/entry/EntryFormDataTestFactory.java b/enterprise-adapter/src/test/java/de/ozgcloud/eingang/enterprise/entry/EntryFormDataTestFactory.java deleted file mode 100644 index 26ca19bb78272b00118c6ad28d70a86556165df3..0000000000000000000000000000000000000000 --- a/enterprise-adapter/src/test/java/de/ozgcloud/eingang/enterprise/entry/EntryFormDataTestFactory.java +++ /dev/null @@ -1,70 +0,0 @@ -package de.ozgcloud.eingang.enterprise.entry; - -import static de.ozgcloud.eingang.enterprise.entry.FormDataMapper.*; - -import java.time.LocalDate; -import java.util.List; -import java.util.Map; - -public class EntryFormDataTestFactory { - - public static final String FORM_FIELD_NAME = "field_name"; - public static final String FORM_FIELD_VALUE = "field_string_value"; - public static final String FORM_FIELD_LABEL = "field_label"; - - public static final String SUB_FORM_NAME = "antragsteller"; - public static final String SUB_FORM_LABEL = "Antragstellende Person"; - - public static final String SUB_FORM_STRING_FIELD_NAME = "lastname"; - public static final String SUB_FORM_STRING_FIELD_LABEL = "Nachname"; - public static final String SUB_FORM_STRING_FIELD_VALUE = "Täst"; - - public static final String SUB_FORM_NUMBER_FIELD_NAME = "age"; - public static final String SUB_FORM_NUMBER_FIELD_LABEL = "Alter"; - public static final Number SUB_FORM_NUMBER_FIELD_VALUE = 5.5; - - public static final String SUB_FORM_DATE_FIELD_NAME = "birthday"; - public static final String SUB_FORM_DATE_FIELD_LABEL = "Geburtsdatum"; - public static final LocalDate SUB_FORM_DATE_FIELD_VALUE = LocalDate.parse("2017-05-01"); - - public static final String SUB_FORM_BOOLEAN_FIELD_NAME = "geprüft"; - public static final String SUB_FORM_BOOLEAN_FIELD_LABEL = "Geprüft"; - public static final Boolean SUB_FORM_BOOLEAN_FIELD_VALUE = true; - - public static List<EntryFormDataItem> create() { - return List.of( - EntryFormDataField.builder().name(FORM_FIELD_NAME).label(FORM_FIELD_LABEL).stringValue(FORM_FIELD_VALUE).build(), - EntryFormDataSubForm.builder().name(SUB_FORM_NAME).label(SUB_FORM_LABEL) - .formItem(EntryFormDataField.builder() - .name(SUB_FORM_STRING_FIELD_NAME) - .label(SUB_FORM_STRING_FIELD_LABEL) - .stringValue(SUB_FORM_STRING_FIELD_VALUE) - .build()) - .formItem(EntryFormDataField.builder() - .name(SUB_FORM_NUMBER_FIELD_NAME) - .label(SUB_FORM_NUMBER_FIELD_LABEL) - .numberValue(SUB_FORM_NUMBER_FIELD_VALUE) - .build()) - .formItem(EntryFormDataField.builder() - .name(SUB_FORM_DATE_FIELD_NAME) - .label(SUB_FORM_DATE_FIELD_LABEL) - .dateValue(SUB_FORM_DATE_FIELD_VALUE) - .build()) - .formItem(EntryFormDataField.builder() - .name(SUB_FORM_BOOLEAN_FIELD_NAME) - .label(SUB_FORM_BOOLEAN_FIELD_LABEL) - .booleanValue(SUB_FORM_BOOLEAN_FIELD_VALUE) - .build()) - .build()); - } - - public static Map<String, Object> createAsFormDataMap() { - return Map.of( - FORM_FIELD_NAME, Map.of(LABEL_KEY, FORM_FIELD_LABEL, VALUE_KEY, FORM_FIELD_VALUE), - SUB_FORM_NAME, Map.of(LABEL_KEY, SUB_FORM_LABEL, VALUE_KEY, Map.of( - SUB_FORM_STRING_FIELD_NAME, Map.of(LABEL_KEY, SUB_FORM_STRING_FIELD_LABEL, VALUE_KEY, SUB_FORM_STRING_FIELD_VALUE), - SUB_FORM_NUMBER_FIELD_NAME, Map.of(LABEL_KEY, SUB_FORM_NUMBER_FIELD_LABEL, VALUE_KEY, SUB_FORM_NUMBER_FIELD_VALUE), - SUB_FORM_DATE_FIELD_NAME, Map.of(LABEL_KEY, SUB_FORM_DATE_FIELD_LABEL, VALUE_KEY, SUB_FORM_DATE_FIELD_VALUE), - SUB_FORM_BOOLEAN_FIELD_NAME, Map.of(LABEL_KEY, SUB_FORM_BOOLEAN_FIELD_LABEL, VALUE_KEY, SUB_FORM_BOOLEAN_FIELD_VALUE)))); - } -} diff --git a/enterprise-adapter/src/test/java/de/ozgcloud/eingang/enterprise/entry/EntryResponseTestFactory.java b/enterprise-adapter/src/test/java/de/ozgcloud/eingang/enterprise/entry/EntryResponseTestFactory.java deleted file mode 100644 index b72c5b964049b6864305ebcbd626481f08c5cce9..0000000000000000000000000000000000000000 --- a/enterprise-adapter/src/test/java/de/ozgcloud/eingang/enterprise/entry/EntryResponseTestFactory.java +++ /dev/null @@ -1,16 +0,0 @@ -package de.ozgcloud.eingang.enterprise.entry; - -import de.ozgcloud.eingang.common.formdata.FormHeaderTestFactory; - -class EntryResponseTestFactory { - - static final EntryResponse create() { - return createBuilder().build(); - } - - static final EntryResponse.EntryResponseBuilder createBuilder() { - return EntryResponse.builder() - .transactionId(FormHeaderTestFactory.REQUEST_ID) - .vorgang(ResponseVorgangTestFactory.create()); - } -} diff --git a/enterprise-adapter/src/test/java/de/ozgcloud/eingang/enterprise/entry/FormDataControlTestFactory.java b/enterprise-adapter/src/test/java/de/ozgcloud/eingang/enterprise/entry/FormDataControlTestFactory.java deleted file mode 100644 index fe7e1a060b7216a5f466a5fcbd272d5bedbe1c33..0000000000000000000000000000000000000000 --- a/enterprise-adapter/src/test/java/de/ozgcloud/eingang/enterprise/entry/FormDataControlTestFactory.java +++ /dev/null @@ -1,25 +0,0 @@ -package de.ozgcloud.eingang.enterprise.entry; - -import java.util.Optional; - -import de.ozgcloud.eingang.common.formdata.FormData.FormDataControl; -import de.ozgcloud.eingang.common.formdata.FormData.Representations; - -public class FormDataControlTestFactory { - - public static final String PRIMARY_FORM_DATA_REPRESENTATION = "document_JaS.json"; - public static final String PRIMARY_FORM_DATA_PDF_REPRESENTATION = "document.pdf"; - public static final String FORM_DATA_MODELL = "jugendsozialarbeit_an_schulen-DM.json"; - - public static FormDataControl create() { - return createBuilder().build(); - } - - public static FormDataControl.FormDataControlBuilder createBuilder() { - return FormDataControl.builder() - .representations(Optional.of(Representations.builder() - .primaryFormDataRepresentation(PRIMARY_FORM_DATA_REPRESENTATION) - .formDataModell(FORM_DATA_MODELL) - .build())); - } -} diff --git a/enterprise-adapter/src/test/java/de/ozgcloud/eingang/enterprise/entry/FormDataMapperTest.java b/enterprise-adapter/src/test/java/de/ozgcloud/eingang/enterprise/entry/FormDataMapperTest.java deleted file mode 100644 index 3b4d6691965f4a8cc9dc273dd4b3be6ab7409bcb..0000000000000000000000000000000000000000 --- a/enterprise-adapter/src/test/java/de/ozgcloud/eingang/enterprise/entry/FormDataMapperTest.java +++ /dev/null @@ -1,36 +0,0 @@ -package de.ozgcloud.eingang.enterprise.entry; - -import static org.assertj.core.api.Assertions.*; - -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.mapstruct.factory.Mappers; -import org.mockito.InjectMocks; - -class FormDataMapperTest { - - @InjectMocks - private FormDataMapper mapper = Mappers.getMapper(FormDataMapper.class); - - @Nested - class TestMapFormItems { - - @Test - void shouldMapFormItems() { - var mapped = mapper.mapFormItems(EntryFormDataTestFactory.create()); - - assertThat(mapped).usingRecursiveComparison().isEqualTo(EntryFormDataTestFactory.createAsFormDataMap()); - } - } - - @Nested - class TestMapRepresentations { - @Test - void shouldMapRepresentations() { - var mapped = mapper.mapRepresentations(ControlDataTestFactory.create().getRepresentations()); - - assertThat(mapped).usingRecursiveComparison().isEqualTo(FormDataControlTestFactory.create().getRepresentations().get()); - } - } - -} diff --git a/enterprise-adapter/src/test/java/de/ozgcloud/eingang/enterprise/entry/ResponseVorgangTestFactory.java b/enterprise-adapter/src/test/java/de/ozgcloud/eingang/enterprise/entry/ResponseVorgangTestFactory.java deleted file mode 100644 index 021642935a5410133666d9b3b04d1702516b2e66..0000000000000000000000000000000000000000 --- a/enterprise-adapter/src/test/java/de/ozgcloud/eingang/enterprise/entry/ResponseVorgangTestFactory.java +++ /dev/null @@ -1,24 +0,0 @@ -package de.ozgcloud.eingang.enterprise.entry; - -import java.time.ZonedDateTime; -import java.util.UUID; - -import de.ozgcloud.eingang.common.formdata.FormHeaderTestFactory; -import de.ozgcloud.eingang.enterprise.entry.EntryResponse.ResponseVorgang; - -public class ResponseVorgangTestFactory { - - final static String VORGANG_ID = UUID.randomUUID().toString(); - - static ResponseVorgang create() { - return createBuilder().build(); - } - - static ResponseVorgang.ResponseVorgangBuilder createBuilder() { - return ResponseVorgang.builder() - .vorgangId(VORGANG_ID) - .vorgangNummer(FormHeaderTestFactory.VORGANG_NUMMER) - .status("NEU") - .statusSince(ZonedDateTime.now()); - } -} diff --git a/enterprise-adapter/src/test/java/de/ozgcloud/eingang/enterprise/entry/ServicekontoTestFactory.java b/enterprise-adapter/src/test/java/de/ozgcloud/eingang/enterprise/entry/ServicekontoTestFactory.java deleted file mode 100644 index b8c62f7b4b0e3b4d8436e6f88bf17bfc6ab9d0c9..0000000000000000000000000000000000000000 --- a/enterprise-adapter/src/test/java/de/ozgcloud/eingang/enterprise/entry/ServicekontoTestFactory.java +++ /dev/null @@ -1,25 +0,0 @@ -package de.ozgcloud.eingang.enterprise.entry; - -import de.ozgcloud.eingang.enterprise.entry.EntryData.PostfachAddress; -import de.ozgcloud.eingang.enterprise.entry.EntryData.Servicekonto; - -public class ServicekontoTestFactory { - - private static final String TYPE = "OSI"; - private static final String IDENTIFIER = "76f1ae54-1cf1-4ae1-c0b4-08d950d6cfc0"; - private static final String POSTFACH_TYPE = "privat"; - - public static Servicekonto create() { - return createBuilder().build(); - } - - public static Servicekonto.ServicekontoBuilder createBuilder() { - return Servicekonto.builder() - .type(TYPE) - .postfachAddress(PostfachAddress.builder() - .identifier(IDENTIFIER) - .type(POSTFACH_TYPE) - .build()); - - } -} diff --git a/enterprise-adapter/src/test/resources/META-INF/services/org.junit.jupiter.api.extension.Extension b/enterprise-adapter/src/test/resources/META-INF/services/org.junit.jupiter.api.extension.Extension deleted file mode 100644 index 79b126e6cdb86bec1f4f08c205de8961bde1934a..0000000000000000000000000000000000000000 --- a/enterprise-adapter/src/test/resources/META-INF/services/org.junit.jupiter.api.extension.Extension +++ /dev/null @@ -1 +0,0 @@ -org.mockito.junit.jupiter.MockitoExtension \ No newline at end of file diff --git a/enterprise-adapter/src/test/resources/junit-platform.properties b/enterprise-adapter/src/test/resources/junit-platform.properties deleted file mode 100644 index 1cebb76d5a58ac034b2627d12411d82d1e85821e..0000000000000000000000000000000000000000 --- a/enterprise-adapter/src/test/resources/junit-platform.properties +++ /dev/null @@ -1 +0,0 @@ -junit.jupiter.extensions.autodetection.enabled = true \ No newline at end of file diff --git a/enterprise-adapter/src/test/resources/request/a12_entry.json b/enterprise-adapter/src/test/resources/request/a12_entry.json deleted file mode 100644 index 553b82dc2c082291705ae961c432a89e351e9ded..0000000000000000000000000000000000000000 --- a/enterprise-adapter/src/test/resources/request/a12_entry.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "control": { - "transactionId": "4e7a6ae7-4d0f-444d-8971-7cfc051c9924", - "zustaendigeStelle": "248240886", - "leikaIds": [ - "99108011000000", - "99108011153000" - ], - "resultEndpoint": { - "address": "https://idalabs.de/backend/api" - }, - "formId": "KFAS_LIVE_KI_10_Haltverbot_befristet", - "name": "Anmeldung zur Einrichtung einer zeitlich befristeten Haltverbotszone gem. § 45 Abs. 1 Straßenverkehrsordnung (StVO)", - "serviceKonto": { - "type": "MUK", - "postfachAddress": { - "identifier": "e155fcdc-a73e-4ae2-b148-b02e02331ebb", - "type": "unternehmen" - } - }, - "representations": { - "formData": "document_JaS.json", - "modell": "jugendsozialarbeit_an_schulen-DM.json" - } - }, - "formData": [] -} \ No newline at end of file diff --git a/enterprise-adapter/src/test/resources/request/document_JaS.json b/enterprise-adapter/src/test/resources/request/document_JaS.json deleted file mode 100644 index 1245a457921a4f4d8f78de3265ec602ecf21bd38..0000000000000000000000000000000000000000 --- a/enterprise-adapter/src/test/resources/request/document_JaS.json +++ /dev/null @@ -1,99 +0,0 @@ -{ - "root": { - "Haushaltsjahr": "2024", - "Anlage_2": { - "Finanzierungsplan": { - "Insgesamt_Finanzierungsplan": 117450, - "Eigenmittel_von_Hundert": 1.5, - "Eigenmittel_Betrag": 1500, - "Zuwendungen_kirchlicher_Stellen": 0, - "Angabe_der_kirchlichen_Stelle": "-", - "Zuwendungen_Bezirk": 600, - "Beantragter_Zuschuss": 700, - "Erlaeuterungen_Finanzierungsplan": "Das passt doch schon so.", - "Zuwendung_kommunale": { - "Gemeinden": "Eselstadt", - "Zuwendung_Gemeinden": 100000, - "Landkreise": "Esellandkreis", - "Zuwendung_Landkreise": 10000 - }, - "Sonstige_oeffentliche_Mittel": { - "Angabe_Bewilligungstelle_sonsitge_oeffentl_Mittel": "Amt für Eselangelegenheiten", - "Betrag_sonsitge_oeffentl_Mittel": 5000 - }, - "Fremdmittel": { - "Angabe_Bewilligungstelle_Fremdmittel": "Eselförderverband", - "Betrag_Fremdmittel": 250 - } - }, - "Kostenplan": { - "Insgesamt_Kostenplan": 175003, - "Personalkosten_JaS": 100000, - "Personalkosten_Sonstige": 15000, - "Sachkosten": 60000, - "Sonstige_Kosten": 3, - "Erlaeuterungen_Kostenplan": "Eseltrainer sind eben teuer." - } - }, - "Angaben_Antragssteller": { - "Name_Bezeichnung": "Eselschule Eselstadt", - "Strasse_Hausnummer": "Eselweg 12", - "PLZ": "01234", - "Ort": "Eselstadt", - "Telefon": "01234-5678", - "Fax": "01234-5679", - "EMail": "esel@esel.esel", - "Verantwortlicher_Vertreter": "Eva Esel", - "Zustaendiger_Sachbearbeiter": "Miriam Maultier", - "Bankverbindung": { - "Kreditinstitut": "Eselbank", - "Kontoinhaber": "Eselschule Eselstadt", - "IBAN": "DE62500105179236738719", - "BIC": "TDLJCAC5JPS" - }, - "Zustaendiger_Spitzenverband": { - "Bezeichnung": "Schulverband für liebe Esel", - "Strasse_Hausnummer": "Eselstraße 5", - "PLZ": "01234", - "Ort": "Eselstadt" - } - }, - "Angaben_zum_Projekt": { - "Bezeichnung": "Wandern mit lieben Eseln", - "Beginn_der_Massnahme": "2024-03-01", - "Verantwortlicher_Sachbearbeiter": "Eduard Esel", - "Strasse_Hausnummer": "Eselallee 77", - "PLZ": "01234", - "Ort": "Eselstadt", - "Telefon": "01234-9876", - "Fax": "01234-9875", - "EMail": "esel2@esel.esel" - }, - "Anlage_1": { - "Personalkosten": [ - { - "Lfd_Nr": 1, - "Name": "Leon Lieblich", - "Berufsausbildung_Funktion": "Eseltrainer", - "Beschaeftigungszeitraum": "01/99-", - "Woechentliche_Arbeitszeit": 24, - "Regelarbeitszeit": 24, - "Entgeltgruppe": "E14", - "Jahresaufwand": 134000, - "Zuschuss": 32000 - }, - { - "Lfd_Nr": 2, - "Name": "Viktoria Vergnüglich", - "Berufsausbildung_Funktion": "Eseltrainerin", - "Beschaeftigungszeitraum": "01/2023-", - "Woechentliche_Arbeitszeit": 38.5, - "Regelarbeitszeit": 38.5, - "Entgeltgruppe": "E14", - "Jahresaufwand": 123000, - "Zuschuss": 32000 - } - ] - } - } -} \ No newline at end of file diff --git a/enterprise-adapter/src/test/resources/request/jugendsozialarbeit_an_schulen-DM.json b/enterprise-adapter/src/test/resources/request/jugendsozialarbeit_an_schulen-DM.json deleted file mode 100644 index 8d9d251181091c3279f5ca245fcd1da2c4790333..0000000000000000000000000000000000000000 --- a/enterprise-adapter/src/test/resources/request/jugendsozialarbeit_an_schulen-DM.json +++ /dev/null @@ -1,1279 +0,0 @@ -{ - "header": { - "id": "jugendsozialarbeit_an_schulen-DM", - "modelType": "document", - "modelVersion": "26.0.0", - "locales": [ - { - "code": "de" - } - ], - "annotations": [ - { - "name": "roles", - "value": "admin" - } - ], - "modelReferences": [] - }, - "content": { - "modelInfo": { - "name": "jugendsozialarbeit_an_schulen-DM" - }, - "modelConfig": { - "decimalSeparator": ".", - "timeZone": "UTC" - }, - "modelRoot": { - "rootGroups": [ - { - "type": "Group", - "id": "group_e6cca", - "name": "root", - "Group": { - "repeatability": 1, - "required": true, - "elements": [ - { - "type": "Field", - "id": "field_89587", - "name": "Haushaltsjahr", - "Field": { - "fieldType": { - "type": "DateFragmentType", - "DateFragmentType": { - "formatOfFragment": "yyyy" - } - }, - "label": [ - { - "locale": "de", - "text": "Haushaltsjahr" - } - ] - } - }, - { - "type": "Group", - "id": "group_49b20", - "name": "Angaben_Antragssteller", - "Group": { - "repeatability": 1, - "required": true, - "elements": [ - { - "type": "Field", - "id": "field_65687", - "name": "Name_Bezeichnung", - "Field": { - "fieldType": { - "type": "StringType" - }, - "label": [ - { - "locale": "de", - "text": "Name/Bezeichnung" - } - ], - "required": true - } - }, - { - "type": "Field", - "id": "field_4a6d0", - "name": "Strasse_Hausnummer", - "Field": { - "fieldType": { - "type": "StringType" - }, - "label": [ - { - "locale": "de", - "text": "Straße, Hausnummer" - } - ] - } - }, - { - "type": "Field", - "id": "field_b2e13", - "name": "PLZ", - "Field": { - "fieldType": { - "type": "StringType", - "StringType": { - "errorMessage": [ - { - "locale": "de", - "text": "Bitte geben Sie eine valide Postleitzahl an." - } - ], - "pattern": "[\\d]{5}" - } - }, - "label": [ - { - "locale": "de", - "text": "PLZ" - } - ] - } - }, - { - "type": "Field", - "id": "field_a2612", - "name": "Ort", - "Field": { - "fieldType": { - "type": "StringType" - }, - "label": [ - { - "locale": "de", - "text": "Ort" - } - ] - } - }, - { - "type": "Field", - "id": "field_d1dc0", - "name": "Telefon", - "Field": { - "fieldType": { - "type": "StringType" - }, - "label": [ - { - "locale": "de", - "text": "Telefon" - } - ] - } - }, - { - "type": "Field", - "id": "field_3d3e0", - "name": "Fax", - "Field": { - "fieldType": { - "type": "StringType" - }, - "label": [ - { - "locale": "de", - "text": "Fax" - } - ] - } - }, - { - "type": "Field", - "id": "field_a7755", - "name": "EMail", - "Field": { - "fieldType": { - "type": "StringType" - }, - "label": [ - { - "locale": "de", - "text": "E-Mail" - } - ] - } - }, - { - "type": "Field", - "id": "field_a7cef", - "name": "Verantwortlicher_Vertreter", - "Field": { - "fieldType": { - "type": "StringType" - }, - "label": [ - { - "locale": "de", - "text": "Verantwortliche Vertreterin/Verantwortlicher Vertreter" - } - ] - } - }, - { - "type": "Field", - "id": "field_293a6", - "name": "Zustaendiger_Sachbearbeiter", - "Field": { - "fieldType": { - "type": "StringType" - }, - "label": [ - { - "locale": "de", - "text": "Zuständige Sachbearbeiterin/Zuständiger Sachbearbeiter" - } - ] - } - }, - { - "type": "Group", - "id": "group_44061", - "name": "Bankverbindung", - "Group": { - "repeatability": 1, - "elements": [ - { - "type": "Field", - "id": "field_77875", - "name": "Kreditinstitut", - "Field": { - "fieldType": { - "type": "StringType" - }, - "label": [ - { - "locale": "de", - "text": "Kreditinstitut" - } - ] - } - }, - { - "type": "Field", - "id": "field_807c3", - "name": "Kontoinhaber", - "Field": { - "fieldType": { - "type": "StringType" - }, - "label": [ - { - "locale": "de", - "text": "Kontoinhaber" - } - ] - } - }, - { - "type": "Field", - "id": "field_fb270", - "name": "IBAN", - "Field": { - "fieldType": { - "type": "StringType", - "StringType": { - "errorMessage": [ - { - "locale": "de", - "text": "Bitte geben Sie eine valide IBAN an." - } - ], - "pattern": "DE\\d{2}[ ]\\d{4}[ ]\\d{4}[ ]\\d{4}[ ]\\d{4}[ ]\\d{2}|DE\\d{20}" - } - }, - "label": [ - { - "locale": "de", - "text": "IBAN" - } - ] - } - }, - { - "type": "Field", - "id": "field_d1499", - "name": "BIC", - "Field": { - "fieldType": { - "type": "StringType", - "StringType": { - "errorMessage": [ - { - "locale": "de", - "text": "Bitte geben Sie eine valide BIC an." - } - ], - "pattern": "[A-Z]{6,6}[A-Z2-9][A-NP-Z0-9]([A-Z0-9]{3,3}){0,1}" - } - }, - "label": [ - { - "locale": "de", - "text": "BIC" - } - ] - } - } - ] - } - }, - { - "type": "Group", - "id": "group_d267e", - "name": "Zustaendiger_Spitzenverband", - "Group": { - "repeatability": 1, - "elements": [ - { - "type": "Field", - "id": "field_e73fd", - "name": "Bezeichnung", - "Field": { - "fieldType": { - "type": "StringType" - }, - "label": [ - { - "locale": "de", - "text": "Bezeichnung" - } - ] - } - }, - { - "type": "Field", - "id": "field_ca3c1", - "name": "Strasse_Hausnummer", - "Field": { - "fieldType": { - "type": "StringType" - }, - "label": [ - { - "locale": "de", - "text": "Straße, Hausnummer" - } - ] - } - }, - { - "type": "Field", - "id": "field_f002d", - "name": "PLZ", - "Field": { - "fieldType": { - "type": "StringType", - "StringType": { - "errorMessage": [ - { - "locale": "de", - "text": "Bitte geben Sie eine valide Postleitzahl an." - } - ], - "pattern": "[\\d]{5}" - } - }, - "label": [ - { - "locale": "de", - "text": "PLZ" - } - ] - } - }, - { - "type": "Field", - "id": "field_47beb", - "name": "Ort", - "Field": { - "fieldType": { - "type": "StringType" - }, - "label": [ - { - "locale": "de", - "text": "Ort" - } - ] - } - } - ] - } - } - ] - } - }, - { - "type": "Group", - "id": "group_66b19", - "name": "Angaben_zum_Projekt", - "Group": { - "repeatability": 1, - "elements": [ - { - "type": "Field", - "id": "field_de8f8", - "name": "Bezeichnung", - "Field": { - "fieldType": { - "type": "StringType" - }, - "label": [ - { - "locale": "de", - "text": "Bezeichnung der Maßnahme (Name der Schule)" - } - ] - } - }, - { - "type": "Field", - "id": "field_83207", - "name": "Beginn_der_Massnahme", - "Field": { - "fieldType": { - "type": "DateType", - "DateType": { - "format": "yyyy-MM-dd" - } - }, - "label": [ - { - "locale": "de", - "text": "Beginn der Maßnahme seit Genehmigung\nbzw. ggf. seit Aufstockung" - } - ] - } - }, - { - "type": "Field", - "id": "field_18de1", - "name": "Verantwortlicher_Sachbearbeiter", - "Field": { - "fieldType": { - "type": "StringType" - }, - "label": [ - { - "locale": "de", - "text": "Verantwortliche Sachbearbeiterin/Verantwortlicher Sachbearbeiter des Trägers der öffentl. Jugendhilfe (Landkreis/kreisfreie Stadt)" - } - ] - } - }, - { - "type": "Field", - "id": "field_dcaf0", - "name": "Strasse_Hausnummer", - "Field": { - "fieldType": { - "type": "StringType" - }, - "label": [ - { - "locale": "de", - "text": "Straße, Hausnummer" - } - ] - } - }, - { - "type": "Field", - "id": "field_a11e7", - "name": "PLZ", - "Field": { - "fieldType": { - "type": "StringType", - "StringType": { - "errorMessage": [ - { - "locale": "de", - "text": "Bitte geben Sie eine valide Postleitzahl an." - } - ], - "pattern": "[\\d]{5}" - } - }, - "label": [ - { - "locale": "de", - "text": "PLZ" - } - ] - } - }, - { - "type": "Field", - "id": "field_7afb0", - "name": "Ort", - "Field": { - "fieldType": { - "type": "StringType" - }, - "label": [ - { - "locale": "de", - "text": "Ort" - } - ] - } - }, - { - "type": "Field", - "id": "field_4f06a", - "name": "Telefon", - "Field": { - "fieldType": { - "type": "StringType" - }, - "label": [ - { - "locale": "de", - "text": "Telefon" - } - ] - } - }, - { - "type": "Field", - "id": "field_236e2", - "name": "Fax", - "Field": { - "fieldType": { - "type": "StringType" - }, - "label": [ - { - "locale": "de", - "text": "Fax" - } - ] - } - }, - { - "type": "Field", - "id": "field_b59d5", - "name": "EMail", - "Field": { - "fieldType": { - "type": "StringType" - }, - "label": [ - { - "locale": "de", - "text": "E-Mail" - } - ] - } - } - ] - } - }, - { - "type": "Group", - "id": "group_cade6", - "name": "Anlage_1", - "Group": { - "repeatability": 1, - "elements": [ - { - "type": "Group", - "id": "group_7b67f", - "name": "Personalkosten", - "Group": { - "repeatability": 10, - "elements": [ - { - "type": "Field", - "id": "field_275b9", - "name": "Lfd_Nr", - "Field": { - "fieldType": { - "type": "NumberType" - }, - "label": [ - { - "locale": "de", - "text": "Lfd. Nr." - } - ] - } - }, - { - "type": "Field", - "id": "field_2d26e", - "name": "Name", - "Field": { - "fieldType": { - "type": "StringType" - }, - "label": [ - { - "locale": "de", - "text": "Vor- und Zuname der Fachkraft" - } - ] - } - }, - { - "type": "Field", - "id": "field_71e95", - "name": "Berufsausbildung_Funktion", - "Field": { - "fieldType": { - "type": "StringType" - }, - "label": [ - { - "locale": "de", - "text": "Berufsausbildung und Funktion im geförderten Projekt (sofern noch nicht vorliegend, bitte Ausbildungsnachweis beilegen)" - } - ] - } - }, - { - "type": "Field", - "id": "field_e19d7", - "name": "Beschaeftigungszeitraum", - "Field": { - "fieldType": { - "type": "StringType" - }, - "label": [ - { - "locale": "de", - "text": "Beschäftigungszeitraum" - } - ] - } - }, - { - "type": "Field", - "id": "field_79cef", - "name": "Woechentliche_Arbeitszeit", - "Field": { - "fieldType": { - "type": "NumberType", - "NumberType": { - "maxFractionalDigits": 1 - } - }, - "label": [ - { - "locale": "de", - "text": "wöchentl. Arbeitszeit" - } - ] - } - }, - { - "type": "Field", - "id": "field_d1447", - "name": "Regelarbeitszeit", - "Field": { - "fieldType": { - "type": "NumberType", - "NumberType": { - "maxFractionalDigits": 1 - } - }, - "label": [ - { - "locale": "de", - "text": "tarifliche Regelarbeitszeit beim Träger" - } - ] - } - }, - { - "type": "Field", - "id": "field_ff859", - "name": "Entgeltgruppe", - "Field": { - "fieldType": { - "type": "StringType" - }, - "label": [ - { - "locale": "de", - "text": "Entgeltgruppe" - } - ] - } - }, - { - "type": "Field", - "id": "field_f618b", - "name": "Jahresaufwand", - "Field": { - "fieldType": { - "type": "NumberType", - "NumberType": { - "minFractionalDigits": 2, - "maxFractionalDigits": 2, - "trait": "amount" - } - }, - "label": [ - { - "locale": "de", - "text": "Jahresaufwand in €" - } - ] - } - }, - { - "type": "Field", - "id": "field_f994b", - "name": "Zuschuss", - "Field": { - "fieldType": { - "type": "NumberType", - "NumberType": { - "minFractionalDigits": 2, - "maxFractionalDigits": 2, - "trait": "amount" - } - }, - "label": [ - { - "locale": "de", - "text": "Zuschuss Festbetragsförderung (nicht vom Antragsteller auszufüllen)" - } - ] - } - } - ] - } - } - ] - } - }, - { - "type": "Group", - "id": "group_d7cfe", - "name": "Anlage_2", - "Group": { - "repeatability": 1, - "elements": [ - { - "type": "Group", - "id": "group_55285", - "name": "Kostenplan", - "Group": { - "repeatability": 1, - "elements": [ - { - "type": "Field", - "id": "field_98416", - "name": "Personalkosten_JaS", - "Field": { - "fieldType": { - "type": "NumberType", - "NumberType": { - "minFractionalDigits": 2, - "maxFractionalDigits": 2, - "trait": "amount" - } - }, - "label": [ - { - "locale": "de", - "text": "Personalkosten der JaS-Fachkraft/Fachkräfte" - } - ] - } - }, - { - "type": "Field", - "id": "field_ebdd5", - "name": "Personalkosten_Sonstige", - "Field": { - "fieldType": { - "type": "NumberType", - "NumberType": { - "minFractionalDigits": 2, - "maxFractionalDigits": 2, - "trait": "amount" - } - }, - "label": [ - { - "locale": "de", - "text": "Sonstige Personalkosten" - } - ] - } - }, - { - "type": "Field", - "id": "field_20288", - "name": "Sachkosten", - "Field": { - "fieldType": { - "type": "NumberType", - "NumberType": { - "minFractionalDigits": 2, - "maxFractionalDigits": 2, - "trait": "amount" - } - }, - "label": [ - { - "locale": "de", - "text": "Sachkosten für den lfd. Betrieb" - } - ] - } - }, - { - "type": "Field", - "id": "field_b7bb2", - "name": "Sonstige_Kosten", - "Field": { - "fieldType": { - "type": "NumberType", - "NumberType": { - "minFractionalDigits": 2, - "maxFractionalDigits": 2, - "trait": "amount" - } - }, - "label": [ - { - "locale": "de", - "text": "Sonstige Kosten" - } - ] - } - }, - { - "type": "Field", - "id": "field_e4001", - "name": "Insgesamt_Kostenplan", - "Field": { - "fieldType": { - "type": "NumberType", - "NumberType": { - "minFractionalDigits": 2, - "maxFractionalDigits": 2, - "trait": "amount" - } - }, - "label": [ - { - "locale": "de", - "text": "Insgesamt" - } - ] - } - }, - { - "type": "Computation", - "id": "computation_2098f", - "name": "Insgesamt_Kostenplan_Comp", - "Computation": { - "computedFieldId": "field_e4001", - "computationAlternatives": [ - { - "operation": "[Personalkosten_Sonstige]+[Personalkosten_JaS]+[Sachkosten]+[Sonstige_Kosten]" - } - ], - "errorMessage": [ - { - "locale": "de", - "text": "error text for computation of Insgesamt_Kostenplan_Comp" - } - ] - } - }, - { - "type": "Field", - "id": "field_d09ae", - "name": "Erlaeuterungen_Kostenplan", - "Field": { - "fieldType": { - "type": "StringType", - "StringType": { - "lineBreaksPermitted": true - } - }, - "label": [ - { - "locale": "de", - "text": "Erläuterungen" - } - ] - } - } - ] - } - }, - { - "type": "Group", - "id": "group_60c8d", - "name": "Finanzierungsplan", - "Group": { - "repeatability": 1, - "elements": [ - { - "type": "Field", - "id": "field_7e8f3", - "name": "Eigenmittel_von_Hundert", - "Field": { - "fieldType": { - "type": "NumberType", - "NumberType": { - "minFractionalDigits": 2, - "maxFractionalDigits": 2, - "trait": "percent" - } - }, - "label": [ - { - "locale": "de", - "text": "Eigenmittel von Hundert" - } - ] - } - }, - { - "type": "Field", - "id": "field_228aa", - "name": "Eigenmittel_Betrag", - "Field": { - "fieldType": { - "type": "NumberType", - "NumberType": { - "minFractionalDigits": 2, - "maxFractionalDigits": 2, - "trait": "amount" - } - }, - "label": [ - { - "locale": "de", - "text": "Eigenmittel Betrag" - } - ] - } - }, - { - "type": "Field", - "id": "field_264d6", - "name": "Zuwendungen_kirchlicher_Stellen", - "Field": { - "fieldType": { - "type": "NumberType", - "NumberType": { - "minFractionalDigits": 2, - "maxFractionalDigits": 2, - "trait": "amount" - } - }, - "label": [ - { - "locale": "de", - "text": "Zuwendungen kirchlicher Stellen" - } - ] - } - }, - { - "type": "Field", - "id": "field_55d96", - "name": "Angabe_der_kirchlichen_Stelle", - "Field": { - "fieldType": { - "type": "StringType" - }, - "label": [ - { - "locale": "de", - "text": "Angabe der Stelle" - } - ] - } - }, - { - "type": "Group", - "id": "group_cb4bd", - "name": "Zuwendung_kommunale", - "Group": { - "repeatability": 1, - "elements": [ - { - "type": "Field", - "id": "field_516a4", - "name": "Gemeinden", - "Field": { - "fieldType": { - "type": "StringType" - }, - "label": [ - { - "locale": "de", - "text": "Gemeinden" - } - ] - } - }, - { - "type": "Field", - "id": "field_d53ed", - "name": "Zuwendung_Gemeinden", - "Field": { - "fieldType": { - "type": "NumberType", - "NumberType": { - "minFractionalDigits": 2, - "maxFractionalDigits": 2, - "trait": "amount" - } - }, - "label": [ - { - "locale": "de", - "text": "Betrag" - } - ] - } - }, - { - "type": "Field", - "id": "field_3216a", - "name": "Landkreise", - "Field": { - "fieldType": { - "type": "StringType" - }, - "label": [ - { - "locale": "de", - "text": "Landkreise" - } - ] - } - }, - { - "type": "Field", - "id": "field_830de", - "name": "Zuwendung_Landkreise", - "Field": { - "fieldType": { - "type": "NumberType", - "NumberType": { - "minFractionalDigits": 2, - "maxFractionalDigits": 2, - "trait": "amount" - } - }, - "label": [ - { - "locale": "de", - "text": "Betrag" - } - ] - } - } - ] - } - }, - { - "type": "Field", - "id": "field_45f01", - "name": "Zuwendungen_Bezirk", - "Field": { - "fieldType": { - "type": "NumberType", - "NumberType": { - "minFractionalDigits": 2, - "maxFractionalDigits": 2, - "trait": "amount" - } - }, - "label": [ - { - "locale": "de", - "text": "Zuwendungen des Bezirks" - } - ] - } - }, - { - "type": "Group", - "id": "group_dbe9b", - "name": "Sonstige_oeffentliche_Mittel", - "Group": { - "repeatability": 1, - "elements": [ - { - "type": "Field", - "id": "field_fe71d", - "name": "Angabe_Bewilligungstelle_sonsitge_oeffentl_Mittel", - "Field": { - "fieldType": { - "type": "StringType" - }, - "label": [ - { - "locale": "de", - "text": "Angabe der Bewilligungsstelle" - } - ] - } - }, - { - "type": "Field", - "id": "field_1c494", - "name": "Betrag_sonsitge_oeffentl_Mittel", - "Field": { - "fieldType": { - "type": "NumberType", - "NumberType": { - "minFractionalDigits": 2, - "maxFractionalDigits": 2, - "trait": "amount" - } - }, - "label": [ - { - "locale": "de", - "text": "Betrag" - } - ] - } - } - ] - } - }, - { - "type": "Group", - "id": "group_4ec36", - "name": "Fremdmittel", - "Group": { - "repeatability": 1, - "elements": [ - { - "type": "Field", - "id": "field_68026", - "name": "Angabe_Bewilligungstelle_Fremdmittel", - "Field": { - "fieldType": { - "type": "StringType" - }, - "label": [ - { - "locale": "de", - "text": "Angabe der Bewilligungsstelle" - } - ] - } - }, - { - "type": "Field", - "id": "field_e59dd", - "name": "Betrag_Fremdmittel", - "Field": { - "fieldType": { - "type": "NumberType", - "NumberType": { - "minFractionalDigits": 2, - "maxFractionalDigits": 2, - "trait": "amount" - } - }, - "label": [ - { - "locale": "de", - "text": "Betrag" - } - ] - } - } - ] - } - }, - { - "type": "Field", - "id": "field_81843", - "name": "Beantragter_Zuschuss", - "Field": { - "fieldType": { - "type": "NumberType", - "NumberType": { - "minFractionalDigits": 2, - "maxFractionalDigits": 2, - "trait": "amount" - } - }, - "label": [ - { - "locale": "de", - "text": "Beantragter Zuschuss des Bayerischen Staatsministeriums für Familie, Arbeit und Soziales" - } - ] - } - }, - { - "type": "Field", - "id": "field_479e3", - "name": "Insgesamt_Finanzierungsplan", - "Field": { - "fieldType": { - "type": "NumberType", - "NumberType": { - "minFractionalDigits": 2, - "maxFractionalDigits": 2, - "trait": "amount" - } - }, - "label": [ - { - "locale": "de", - "text": "Insgesamt" - } - ] - } - }, - { - "type": "Computation", - "id": "computation_3849f", - "name": "Insgesamt_Kostenplan_Comp", - "Computation": { - "computedFieldId": "field_479e3", - "computationAlternatives": [ - { - "operation": "[Eigenmittel_Betrag]+[Zuwendungen_kirchlicher_Stellen]+[Zuwendung_kommunale/Zuwendung_Gemeinden]+[Zuwendung_kommunale/Zuwendung_Landkreise]+[Sonstige_oeffentliche_Mittel/Betrag_sonsitge_oeffentl_Mittel]+[Fremdmittel/Betrag_Fremdmittel]+[Beantragter_Zuschuss]" - } - ], - "errorMessage": [ - { - "locale": "de", - "text": "error text for computation of Insgesamt_Kostenplan_Comp" - } - ] - } - }, - { - "type": "Field", - "id": "field_b1b30", - "name": "Erlaeuterungen_Finanzierungsplan", - "Field": { - "fieldType": { - "type": "StringType", - "StringType": { - "lineBreaksPermitted": true - } - }, - "label": [ - { - "locale": "de", - "text": "Erläuterungen" - } - ] - } - } - ] - } - } - ] - } - } - ] - } - } - ] - } - } -} \ No newline at end of file diff --git a/enterprise-adapter/src/test/resources/request/simple.json b/enterprise-adapter/src/test/resources/request/simple.json deleted file mode 100644 index 11bd6e9cdb3d6cf7429b7239ca28ac3fb4ffe0bf..0000000000000000000000000000000000000000 --- a/enterprise-adapter/src/test/resources/request/simple.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "control": { - "transactionId": "4e7a6ae7-4d0f-444d-8971-7cfc051c9924", - "zustaendigeStelle": "248240886", - "leikaIds": [ - "99108011000000", - "99108011153000" - ], - "resultEndpoint": { - "address": "https://idalabs.de/backend/api" - }, - "formId": "KFAS_LIVE_KI_10_Haltverbot_befristet", - "name": "Anmeldung zur Einrichtung einer zeitlich befristeten Haltverbotszone gem. § 45 Abs. 1 Straßenverkehrsordnung (StVO)", - "serviceKonto": { - "type": "OSI", - "postfachAddress": { - "identifier": "76f1ae54-1cf1-4ae1-c0b4-08d950d6cfc0", - "type": "privat" - } - } - }, - "formData": [ - { - "name": "field_name", - "label": "field_label", - "stringValue": "field_string_value" - }, - { - "name": "antragsteller", - "label": "Antragstellende Person", - "formItems": [ - { - "name": "lastname", - "label": "Nachname", - "stringValue": "Täst" - }, { - "name": "age", - "label": "Alter", - "numberValue": 5.5 - }, { - "name": "birthday", - "label": "Geburtsdatum", - "dateValue": "2017-05-01" - }, { - "name": "geprüft", - "label": "Geprüft", - "booleanValue": true - } - ] - } - ] -} \ No newline at end of file diff --git a/fim-adapter/pom.xml b/fim-adapter/pom.xml deleted file mode 100644 index b533588b54cf13d7badc6d4a767a6fdec60cb8a8..0000000000000000000000000000000000000000 --- a/fim-adapter/pom.xml +++ /dev/null @@ -1,62 +0,0 @@ -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> - <modelVersion>4.0.0</modelVersion> - <parent> - <groupId>de.ozgcloud.eingang</groupId> - <artifactId>eingang-manager</artifactId> - <version>2.16.0-SNAPSHOT</version> - </parent> - <artifactId>fim-adapter</artifactId> - <name>Eingangs Adapter - FIM</name> - - <dependencies> - <!--ozg-Cloud--> - <dependency> - <groupId>de.ozgcloud.eingang</groupId> - <artifactId>common</artifactId> - </dependency> - <dependency> - <groupId>de.ozgcloud.eingang</groupId> - <artifactId>semantik-adapter</artifactId> - </dependency> - - <!--test --> - <dependency> - <groupId>de.ozgcloud.eingang</groupId> - <artifactId>common</artifactId> - <type>test-jar</type> - <scope>test</scope> - </dependency> - </dependencies> - - <build> - <plugins> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-jar-plugin</artifactId> - <executions> - <execution> - <goals> - <goal>test-jar</goal> - </goals> - </execution> - </executions> - </plugin> - - <plugin> - <groupId>org.jacoco</groupId> - <artifactId>jacoco-maven-plugin</artifactId> - </plugin> - - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-surefire-plugin</artifactId> - </plugin> - - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-failsafe-plugin</artifactId> - </plugin> - </plugins> - </build> -</project> diff --git a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimBasedAdapter.java b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimBasedAdapter.java deleted file mode 100644 index 6a6a8ce22f230439482be03567c495388c3a8915..0000000000000000000000000000000000000000 --- a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimBasedAdapter.java +++ /dev/null @@ -1,96 +0,0 @@ -package de.ozgcloud.eingang.fim; - -import java.io.IOException; -import java.util.Collections; -import java.util.List; -import java.util.Optional; - -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.w3c.dom.Document; -import org.xml.sax.SAXException; - -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.common.formdata.FormData.FormDataControl; -import de.ozgcloud.eingang.common.formdata.FormData.Representations; -import de.ozgcloud.eingang.common.formdata.IncomingFile; -import de.ozgcloud.eingang.semantik.enginebased.EngineBasedSemantikAdapter; -import lombok.NonNull; -import lombok.extern.log4j.Log4j2; - -@Log4j2 -@Component -public class FimBasedAdapter implements EngineBasedSemantikAdapter { - - static final String FIM_FORM_ENGINE_NAME = "FIM"; - - static final String DEFAULT_FORMDATA_REPRESENTATION_NAME = "Antrag.xml"; - - @Autowired - private FimService fimService; - - @Autowired(required = false) - private List<FimEngineBasedMapper> mappers = Collections.emptyList(); - - @Override - public boolean isResponsible(final FormData formData) { - final String formEngineName = formData.getHeader().getFormEngineName(); - return FIM_FORM_ENGINE_NAME.equals(formEngineName); - } - - @Override - public FormData parseFormData(final FormData initialFormData) { - var mapped = useMappers(initialFormData); - LOG.info("FIM Mapper running to map formData"); - - return findFile(initialFormData, getEntryPoint(initialFormData.getControl())) - .map(primaryRepresentation -> doParsing(mapped, primaryRepresentation)) - .orElseGet(() -> { - LOG.error("Entry point file not found for fim data mapping"); - return mapped; - }); - } - - private FormData useMappers(FormData inFormData) { - var processedFormData = inFormData; - - for (var mapper : mappers) { - processedFormData = mapper.parseFormData(processedFormData); - } - - return processedFormData; - } - - private Optional<IncomingFile> findFile(final FormData formData, final String name) { - return formData.getRepresentations().stream() - .filter(file -> file.getName().endsWith(name)) - .findFirst(); - } - - private FormData doParsing(@NonNull FormData formData, @NonNull IncomingFile formDataPrimaryRepresentation) { - try { - return fimService.transformDocument(loadDocument(formDataPrimaryRepresentation), formData); - } catch (ParserConfigurationException | SAXException | IOException | FimException e) { - LOG.error("Can't transform document into fim formdata.", e); - return formData; - } - } - - String getEntryPoint(FormDataControl formDataControl) { - return formDataControl.getRepresentations().map(Representations::getPrimaryFormDataRepresentation) - .orElseGet(() -> { - LOG.error("No entry point found in metadata file for fim data mapping. Trying default."); - return DEFAULT_FORMDATA_REPRESENTATION_NAME; - }); - } - - private Document loadDocument(final IncomingFile incomingFile) throws ParserConfigurationException, IOException, SAXException { - final DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); - return builder.parse(incomingFile.getContentStream()); - } - -} diff --git a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimDataMapper.java b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimDataMapper.java deleted file mode 100644 index 1cfa677b6da117cd91fd7c1419ea4b27ab45dbe2..0000000000000000000000000000000000000000 --- a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimDataMapper.java +++ /dev/null @@ -1,58 +0,0 @@ -package de.ozgcloud.eingang.fim; - -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.Optional; - -import org.apache.commons.lang3.function.TriFunction; -import org.springframework.stereotype.Service; -import org.w3c.dom.Document; -import org.w3c.dom.Element; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; -import org.w3c.dom.Text; - -import de.ozgcloud.eingang.common.formdata.FormData; -import lombok.extern.log4j.Log4j2; - -@Service -@Log4j2 -class FimDataMapper implements TriFunction<Document, FimScheme, FormData, FormData.FormDataBuilder> { - - private static final String LABEL_KEY = "label"; - private static final String VALUE_KEY = "value"; - - @Override - public FormData.FormDataBuilder apply(final Document document, final FimScheme fimScheme, final FormData initialFormData) { - final FormData.FormDataBuilder formDataBuilder = initialFormData.toBuilder(); - Map<String, Object> data = new LinkedHashMap<>(); - process(document.getDocumentElement(), fimScheme, data, 0); - formDataBuilder.formData(data); - return formDataBuilder; - } - - private void process(final Element element, final FimScheme fimScheme, final Map<String, Object> data, final int level) { - final NodeList childNodes = element.getChildNodes(); - - LOG.debug(">".repeat(level) + " " + element.getNodeName()); - - for (int i = 0; i < childNodes.getLength(); i++) { - final Node child = childNodes.item(i); - if (!(child instanceof Element)) { - continue; - } - if (child.getChildNodes().getLength() == 1 && child.getChildNodes().item(0) instanceof Text textNode) { - insertValueIntoFormData(data, fimScheme.getFieldName(child.getNodeName()), child.getNodeName(), textNode.getTextContent()); - } else { - final Map<String, Object> childMap = new LinkedHashMap<>(); - insertValueIntoFormData(data, fimScheme.getFieldName(child.getNodeName()), child.getNodeName(), childMap); - process((Element) child, fimScheme, childMap, level + 1); - } - } - } - - private void insertValueIntoFormData(final Map<String, Object> data, final Optional<String> fieldName, final String nodeName, final Object obj) { - final Map<String, Object> labelMap = Map.of(LABEL_KEY, fieldName.orElse(nodeName), VALUE_KEY, obj); - data.put(nodeName, labelMap); - } -} diff --git a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimEngineBasedMapper.java b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimEngineBasedMapper.java deleted file mode 100644 index f01ac99cc7eebb80f297041f7edba27bf91b2c23..0000000000000000000000000000000000000000 --- a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimEngineBasedMapper.java +++ /dev/null @@ -1,7 +0,0 @@ -package de.ozgcloud.eingang.fim; - -import de.ozgcloud.eingang.semantik.enginebased.EngineBasedMapper; - -public interface FimEngineBasedMapper extends EngineBasedMapper { - -} diff --git a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimException.java b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimException.java deleted file mode 100644 index ec25fcb3101f859b275fc917516449e1a422e95c..0000000000000000000000000000000000000000 --- a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimException.java +++ /dev/null @@ -1,9 +0,0 @@ -package de.ozgcloud.eingang.fim; - -import de.ozgcloud.eingang.common.errorhandling.TechnicalException; - -public class FimException extends TechnicalException { - public FimException(final String ex) { - super(ex); - } -} diff --git a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimProperties.java b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimProperties.java deleted file mode 100644 index df67ec1a3468ca2e96a0a63e8edaa27d1f7ba24c..0000000000000000000000000000000000000000 --- a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimProperties.java +++ /dev/null @@ -1,25 +0,0 @@ -package de.ozgcloud.eingang.fim; - -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.context.annotation.Configuration; -import lombok.Getter; -import org.springframework.validation.annotation.Validated; - -import java.util.ArrayList; -import java.util.List; - -@Validated -@Configuration -@ConfigurationProperties(prefix = FimProperties.PROPERTIES_PREFIX) -@Getter -public class FimProperties { - static final String PROPERTIES_PREFIX = "fim"; - - /** - * List of paths to fim scheme files which should be processed by the fim-adapter. - * - * Only fim data that is in the namespace and versions of these files will be mapped by the fim-adapter. - * All other fim data will be left untouched by the mapper. - */ - private final List<String> schemeLocations = new ArrayList<>(); -} diff --git a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimScheme.java b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimScheme.java deleted file mode 100644 index e38bd99ba4f4d4ab5586b1d4ae436f533017ecc0..0000000000000000000000000000000000000000 --- a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimScheme.java +++ /dev/null @@ -1,42 +0,0 @@ -package de.ozgcloud.eingang.fim; - -import lombok.Getter; -import org.w3c.dom.Document; -import org.w3c.dom.Element; - -import org.w3c.dom.NodeList; - -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.Optional; - -class FimScheme { - - private final Document doc; - @Getter - private final FimSchemeIdentifier identifier; - - @Getter - private final FimSchemeAdapter schemeAdapter; - private final Map<String, Element> fieldIndex = new LinkedHashMap<>(); - - FimScheme(final Document doc, final FimSchemeIdentifier identifier, final FimSchemeAdapter schemeAdapter) { - this.doc = doc; - this.identifier = identifier; - this.schemeAdapter = schemeAdapter; - - buildFieldIndex(); - } - private void buildFieldIndex() { - final NodeList groupList = doc.getElementsByTagName("xs:element"); - for (int i = 0; i < groupList.getLength();i++) { - final Element group = (Element) groupList.item(i); - final String groupName = group.getAttribute("name"); - fieldIndex.put(groupName, group); - } - } - - Optional<String> getFieldName(final String fieldName) { - return schemeAdapter.getFieldName(fieldIndex, fieldName); - } -} diff --git a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimSchemeAdapter.java b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimSchemeAdapter.java deleted file mode 100644 index 13686294fc251cd9ae95758d2d7b885672dd95ea..0000000000000000000000000000000000000000 --- a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimSchemeAdapter.java +++ /dev/null @@ -1,39 +0,0 @@ -package de.ozgcloud.eingang.fim; - -import java.util.Map; -import java.util.Optional; - -import org.w3c.dom.Element; -import org.w3c.dom.NodeList; - -import lombok.extern.log4j.Log4j2; - -@Log4j2 -public abstract class FimSchemeAdapter { - - public abstract FimSchemeIdentifier forIdentifier(); - - public Optional<String> getFieldName(final Map<String, Element> fieldIndex, final String fieldName) { - final String[] fieldNameParts = fieldName.split(":"); - final String fieldNameWithoutNamespace = fieldNameParts[fieldNameParts.length - 1]; - if (!fieldIndex.containsKey(fieldNameWithoutNamespace)) { - LOG.error("Cannot find Field: " + fieldName); - return Optional.empty(); - } - final Element nodeNameElement = fieldIndex.get(fieldNameWithoutNamespace); - final Optional<String> nodeNameOpt = getNameForElement(nodeNameElement); - return nodeNameOpt.map(this::cleanNodeName); - } - - public Optional<String> getNameForElement(final Element element) { - final NodeList nameTags = element.getElementsByTagName("name"); - if (nameTags.getLength() != 1) { - return Optional.empty(); - } - return Optional.ofNullable(nameTags.item(0).getTextContent()); - } - - public String cleanNodeName(final String s) { - return s.trim(); - } -} diff --git a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimSchemeAdapterCatalogue.java b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimSchemeAdapterCatalogue.java deleted file mode 100644 index 934f3f8af3c717e76bbf894362316ad6b13cc2df..0000000000000000000000000000000000000000 --- a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimSchemeAdapterCatalogue.java +++ /dev/null @@ -1,5 +0,0 @@ -package de.ozgcloud.eingang.fim; - -import java.util.LinkedHashMap; -class FimSchemeAdapterCatalogue extends LinkedHashMap<FimSchemeIdentifier, FimSchemeAdapter> { -} diff --git a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimSchemeCatalogue.java b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimSchemeCatalogue.java deleted file mode 100644 index 5c53c1ae7ce88a6389ad60bff758df73a9ddd8ce..0000000000000000000000000000000000000000 --- a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimSchemeCatalogue.java +++ /dev/null @@ -1,6 +0,0 @@ -package de.ozgcloud.eingang.fim; - -import java.util.LinkedHashMap; - -class FimSchemeCatalogue extends LinkedHashMap<FimSchemeIdentifier, FimScheme> { -} diff --git a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimSchemeIdentifier.java b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimSchemeIdentifier.java deleted file mode 100644 index 3f2222a484a57be97508f53d78b6f6bd9c074381..0000000000000000000000000000000000000000 --- a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimSchemeIdentifier.java +++ /dev/null @@ -1,17 +0,0 @@ -package de.ozgcloud.eingang.fim; - -import lombok.EqualsAndHashCode; - -@EqualsAndHashCode -public class FimSchemeIdentifier { - - private final String schemeId; - - FimSchemeIdentifier(String schemeId) { - this.schemeId = schemeId; - } - - public static FimSchemeIdentifier fromString(final String s) { - return new FimSchemeIdentifier(s); - } -} diff --git a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimService.java b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimService.java deleted file mode 100644 index f0930a90d3c5d9c4f78be0ac10ccb383e8a85b46..0000000000000000000000000000000000000000 --- a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimService.java +++ /dev/null @@ -1,104 +0,0 @@ -package de.ozgcloud.eingang.fim; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; - -import jakarta.annotation.PostConstruct; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.io.ResourceLoader; -import org.springframework.stereotype.Service; -import org.w3c.dom.Document; -import org.xml.sax.SAXException; - -import de.ozgcloud.eingang.common.formdata.FormData; -import io.micrometer.common.util.StringUtils; -import lombok.extern.log4j.Log4j2; - -@Service -@Log4j2 -public class FimService { - public static final String UNKNOWN_SCHEME_NAME = "unknown"; - - @Autowired - private FimProperties fimProperties; - - @Autowired - private FimDataMapper fimDataMapper; - - @Autowired - private ResourceLoader resourceLoader; - - @Autowired - private final List<FimSchemeAdapter> fimSchemeAdapters = new ArrayList<>(); - - private final FimSchemeCatalogue fimSchemeCatalogue = new FimSchemeCatalogue(); - private final FimSchemeAdapterCatalogue fimSchemeAdapterCatalogue = new FimSchemeAdapterCatalogue(); - - private static final FimSchemeAdapter DEFAULT_FIM_SCHEME_ADAPTER = new FimSchemeAdapter() { - @Override - public FimSchemeIdentifier forIdentifier() { - return null; - } - }; - - @PostConstruct - private void postConstruct() throws ParserConfigurationException, IOException, SAXException { - for (final FimSchemeAdapter fimSchemeAdapter : fimSchemeAdapters) { - fimSchemeAdapterCatalogue.put(fimSchemeAdapter.forIdentifier(), fimSchemeAdapter); - } - for (final String fimSchemaLocation : fimProperties.getSchemeLocations()) { - final FimScheme fimScheme = loadFimScheme(fimSchemaLocation.trim()); - fimSchemeCatalogue.put(fimScheme.getIdentifier(), fimScheme); - } - final FimScheme unknownScheme = buildUnknownScheme(); - fimSchemeCatalogue.put(unknownScheme.getIdentifier(), unknownScheme); - } - - private FimScheme loadFimScheme(final String path) throws ParserConfigurationException, IOException, SAXException { - LOG.debug("Load FIM schema: " + path); - final DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); - final Document doc = builder.parse(resourceLoader.getResource("classpath:" + path).getFile()); - final String targetNamespace = doc.getDocumentElement().getAttribute("targetNamespace"); - final FimSchemeIdentifier fimSchemeIdentifier = FimSchemeIdentifier.fromString(targetNamespace); - final FimSchemeAdapter fimSchemeAdapter = fimSchemeAdapterCatalogue.getOrDefault(fimSchemeIdentifier, DEFAULT_FIM_SCHEME_ADAPTER); - return new FimScheme(doc, fimSchemeIdentifier, fimSchemeAdapter); - } - - private FimScheme buildUnknownScheme() throws ParserConfigurationException { - final Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument(); - final FimSchemeIdentifier unknownFimSchemeIdentifier = FimSchemeIdentifier.fromString(UNKNOWN_SCHEME_NAME); - final FimSchemeAdapter fimSchemeAdapter = fimSchemeAdapterCatalogue.get(unknownFimSchemeIdentifier); - return new FimScheme(doc, unknownFimSchemeIdentifier, fimSchemeAdapter); - } - - public FormData transformDocument(final Document document, final FormData initialFormData) { - final String[] tagParts = document.getDocumentElement().getTagName().split(":"); - final String namespacePrefix = tagParts.length < 2 ? "" : (":" + tagParts[0]); - final String schemeName = document.getDocumentElement().getAttribute("xmlns" + namespacePrefix); - if (StringUtils.isEmpty(schemeName)) { - throw new FimException("XML Document does not provide a scheme"); - } - final FimScheme scheme = getSchemeForIdentifier(schemeName); - final FormData.FormDataBuilder builder = fimDataMapper.apply(document, scheme, initialFormData); - - builder.header(initialFormData.getHeader()); - - return builder.build(); - } - - FimScheme getSchemeForIdentifier(final String fimSchemaName) { - final FimSchemeIdentifier fimSchemeIdentifier = FimSchemeIdentifier.fromString(fimSchemaName); - final FimScheme fimScheme = fimSchemeCatalogue.get(fimSchemeIdentifier); - if (fimScheme == null) { - LOG.error("Cannot find schema for: " + fimSchemaName); - return fimSchemeCatalogue.get(FimSchemeIdentifier.fromString(UNKNOWN_SCHEME_NAME)); - } - return fimScheme; - } -} diff --git a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/UnknownSchemeAdapter.java b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/UnknownSchemeAdapter.java deleted file mode 100644 index 5015cc5a73da51364f23adf013b7a8ef266c333f..0000000000000000000000000000000000000000 --- a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/UnknownSchemeAdapter.java +++ /dev/null @@ -1,20 +0,0 @@ -package de.ozgcloud.eingang.fim; - -import org.springframework.stereotype.Service; -import org.w3c.dom.Element; - -import java.util.Map; -import java.util.Optional; - -@Service -public class UnknownSchemeAdapter extends FimSchemeAdapter { - - public FimSchemeIdentifier forIdentifier() { - return FimSchemeIdentifier.fromString(FimService.UNKNOWN_SCHEME_NAME); - } - - @Override - public Optional<String> getFieldName(Map<String, Element> fieldIndex, String fieldName) { - return Optional.of(fieldName); - } -} diff --git a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/ZustaendigeStelleMapper.java b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/ZustaendigeStelleMapper.java deleted file mode 100644 index 72146cb778999343ef393a5d78365c1801893a0d..0000000000000000000000000000000000000000 --- a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/ZustaendigeStelleMapper.java +++ /dev/null @@ -1,44 +0,0 @@ -package de.ozgcloud.eingang.fim; - -import java.util.List; -import java.util.Objects; -import java.util.Optional; - -import org.springframework.stereotype.Component; - -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.common.formdata.ZustaendigeStelle; -import lombok.NonNull; - -@Component -class ZustaendigeStelleMapper implements FimEngineBasedMapper { - - static final String XTA_IDENTIFIER_ENTRY_NAME = "xtaIdentifier"; - - // TODO OZG-7086 umstellen auf FIM Headerdaten - - @Override - public FormData parseFormData(FormData formData) { - return formData.getControl().getMetaData() - .map(metaData -> metaData.getEntry(XTA_IDENTIFIER_ENTRY_NAME)) - .filter(Objects::nonNull) - .map(oeId -> setOrganisationsEinheitId(formData.getZustaendigeStelles(), oeId)) - .map(zustStelle -> formData.toBuilder().zustaendigeStelle(zustStelle).build()) - .orElse(formData); - } - - private ZustaendigeStelle setOrganisationsEinheitId(List<ZustaendigeStelle> stelles, @NonNull String oeid) { - var builder = stelles.isEmpty() ? ZustaendigeStelle.builder() : stelles.getFirst().toBuilder(); - - extractOrganisationsEinheitId(oeid).ifPresent(builder::organisationseinheitenId); - return builder.build(); - } - - Optional<String> extractOrganisationsEinheitId(@NonNull String xtaIdentifier) { - var idx = xtaIdentifier.indexOf(":"); - if (idx < 0) { - return Optional.empty(); - } - return Optional.of(xtaIdentifier.substring(idx + 1)); - } -} diff --git a/fim-adapter/src/main/resources/application-fim.yml b/fim-adapter/src/main/resources/application-fim.yml deleted file mode 100644 index 1300ecebf1e79ceb73ec6d4a99104b8652368012..0000000000000000000000000000000000000000 --- a/fim-adapter/src/main/resources/application-fim.yml +++ /dev/null @@ -1,3 +0,0 @@ -fim: - schemeLocations: - - fim-s17000652_1.4/S17000652V1.4_xfall.xsd \ No newline at end of file diff --git a/fim-adapter/src/main/resources/fim-s17000652_1.4/C17000420_genericode.xml b/fim-adapter/src/main/resources/fim-s17000652_1.4/C17000420_genericode.xml deleted file mode 100644 index 585c7415cc3fe84afd749cc634fb068716e1a523..0000000000000000000000000000000000000000 --- a/fim-adapter/src/main/resources/fim-s17000652_1.4/C17000420_genericode.xml +++ /dev/null @@ -1 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?><gc:CodeList xmlns:gc="http://docs.oasis-open.org/codelist/ns/genericode/1.0/"><gc:Identification><gc:ShortName>codelist</gc:ShortName><gc:LongName></gc:LongName><gc:Version>2022-02-16</gc:Version><gc:CanonicalUri>urn:de:fim:codeliste:dokumenttyp</gc:CanonicalUri><gc:CanonicalVersionUri>urn:de:fim:codeliste:dokumenttyp_2022-02-16</gc:CanonicalVersionUri></gc:Identification><gc:ColumnSet><gc:Column Id="code" Use="required"><gc:ShortName>Code</gc:ShortName><gc:Data Type="string"/></gc:Column><gc:Column Id="name" Use="required"><gc:ShortName>Name</gc:ShortName><gc:Data Type="string"/></gc:Column><gc:Key Id="codeKey"><gc:ShortName>CodeKey</gc:ShortName><gc:ColumnRef Ref="code"/></gc:Key><gc:Key Id="codenameKey"><gc:ShortName>CodenameKey</gc:ShortName><gc:ColumnRef Ref="name"/></gc:Key></gc:ColumnSet><gc:SimpleCodeList><gc:Row><gc:Value ColumnRef="code"><gc:SimpleValue>01</gc:SimpleValue></gc:Value><gc:Value ColumnRef="name"><gc:SimpleValue>Anzeige einer öffentlichen Versammlung unter freiem Himmel (ortsfest)</gc:SimpleValue></gc:Value></gc:Row><gc:Row><gc:Value ColumnRef="code"><gc:SimpleValue>02</gc:SimpleValue></gc:Value><gc:Value ColumnRef="name"><gc:SimpleValue>Anzeige einer sich fortbewegenden Versammlung (Aufzug, Umzug)</gc:SimpleValue></gc:Value></gc:Row></gc:SimpleCodeList></gc:CodeList> \ No newline at end of file diff --git a/fim-adapter/src/main/resources/fim-s17000652_1.4/C17001208_genericode.xml b/fim-adapter/src/main/resources/fim-s17000652_1.4/C17001208_genericode.xml deleted file mode 100644 index cbf9e3f5693fb67c02b34955ee48beefc278c948..0000000000000000000000000000000000000000 --- a/fim-adapter/src/main/resources/fim-s17000652_1.4/C17001208_genericode.xml +++ /dev/null @@ -1 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?><gc:CodeList xmlns:gc="http://docs.oasis-open.org/codelist/ns/genericode/1.0/"><gc:Identification><gc:ShortName></gc:ShortName><gc:LongName></gc:LongName><gc:Version>2023-09-26</gc:Version><gc:CanonicalUri>urn:de:fim:codeliste:artteilnahmeveranstaltung</gc:CanonicalUri><gc:CanonicalVersionUri>urn:de:fim:codeliste:artteilnahmeveranstaltung_2023-09-26</gc:CanonicalVersionUri></gc:Identification><gc:ColumnSet><gc:Column Id="code" Use="required"><gc:ShortName>Code</gc:ShortName><gc:Data Type="string"/></gc:Column><gc:Column Id="name" Use="required"><gc:ShortName>Name</gc:ShortName><gc:Data Type="string"/></gc:Column><gc:Key Id="codeKey"><gc:ShortName>CodeKey</gc:ShortName><gc:ColumnRef Ref="code"/></gc:Key><gc:Key Id="codenameKey"><gc:ShortName>CodenameKey</gc:ShortName><gc:ColumnRef Ref="name"/></gc:Key></gc:ColumnSet><gc:SimpleCodeList><gc:Row><gc:Value ColumnRef="code"><gc:SimpleValue>001</gc:SimpleValue></gc:Value><gc:Value ColumnRef="name"><gc:SimpleValue>zu Fuß</gc:SimpleValue></gc:Value></gc:Row><gc:Row><gc:Value ColumnRef="code"><gc:SimpleValue>002</gc:SimpleValue></gc:Value><gc:Value ColumnRef="name"><gc:SimpleValue>per Fahrrad</gc:SimpleValue></gc:Value></gc:Row><gc:Row><gc:Value ColumnRef="code"><gc:SimpleValue>003</gc:SimpleValue></gc:Value><gc:Value ColumnRef="name"><gc:SimpleValue>per Motorrad</gc:SimpleValue></gc:Value></gc:Row><gc:Row><gc:Value ColumnRef="code"><gc:SimpleValue>004</gc:SimpleValue></gc:Value><gc:Value ColumnRef="name"><gc:SimpleValue>per Personenkraftwagen</gc:SimpleValue></gc:Value></gc:Row><gc:Row><gc:Value ColumnRef="code"><gc:SimpleValue>005</gc:SimpleValue></gc:Value><gc:Value ColumnRef="name"><gc:SimpleValue>Sonstiges</gc:SimpleValue></gc:Value></gc:Row></gc:SimpleCodeList></gc:CodeList> \ No newline at end of file diff --git a/fim-adapter/src/main/resources/fim-s17000652_1.4/C17001209_genericode.xml b/fim-adapter/src/main/resources/fim-s17000652_1.4/C17001209_genericode.xml deleted file mode 100644 index b748e48cd9a77475c3c2cea0020d592bbb9cd61f..0000000000000000000000000000000000000000 --- a/fim-adapter/src/main/resources/fim-s17000652_1.4/C17001209_genericode.xml +++ /dev/null @@ -1 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?><gc:CodeList xmlns:gc="http://docs.oasis-open.org/codelist/ns/genericode/1.0/"><gc:Identification><gc:ShortName></gc:ShortName><gc:LongName></gc:LongName><gc:Version>2023-09-29</gc:Version><gc:CanonicalUri>urn:de:fim:codeliste:buehneversammlung</gc:CanonicalUri><gc:CanonicalVersionUri>urn:de:fim:codeliste:buehneversammlung_2023-09-29</gc:CanonicalVersionUri></gc:Identification><gc:ColumnSet><gc:Column Id="code" Use="required"><gc:ShortName>Code</gc:ShortName><gc:Data Type="string"/></gc:Column><gc:Column Id="name" Use="required"><gc:ShortName>Name</gc:ShortName><gc:Data Type="string"/></gc:Column><gc:Key Id="codeKey"><gc:ShortName>CodeKey</gc:ShortName><gc:ColumnRef Ref="code"/></gc:Key><gc:Key Id="codenameKey"><gc:ShortName>CodenameKey</gc:ShortName><gc:ColumnRef Ref="name"/></gc:Key></gc:ColumnSet><gc:SimpleCodeList><gc:Row><gc:Value ColumnRef="code"><gc:SimpleValue>001</gc:SimpleValue></gc:Value><gc:Value ColumnRef="name"><gc:SimpleValue>Ja</gc:SimpleValue></gc:Value></gc:Row><gc:Row><gc:Value ColumnRef="code"><gc:SimpleValue>002</gc:SimpleValue></gc:Value><gc:Value ColumnRef="name"><gc:SimpleValue>Nein</gc:SimpleValue></gc:Value></gc:Row><gc:Row><gc:Value ColumnRef="code"><gc:SimpleValue>003</gc:SimpleValue></gc:Value><gc:Value ColumnRef="name"><gc:SimpleValue>Nicht bekannt</gc:SimpleValue></gc:Value></gc:Row><gc:Row><gc:Value ColumnRef="code"><gc:SimpleValue>004</gc:SimpleValue></gc:Value><gc:Value ColumnRef="name"><gc:SimpleValue>Keine</gc:SimpleValue></gc:Value></gc:Row></gc:SimpleCodeList></gc:CodeList> \ No newline at end of file diff --git a/fim-adapter/src/main/resources/fim-s17000652_1.4/S17000652V1.4_xfall.xsd b/fim-adapter/src/main/resources/fim-s17000652_1.4/S17000652V1.4_xfall.xsd deleted file mode 100644 index c5c859d0a2fec4d7fb668678afd680cbbcbf0088..0000000000000000000000000000000000000000 --- a/fim-adapter/src/main/resources/fim-s17000652_1.4/S17000652V1.4_xfall.xsd +++ /dev/null @@ -1,32 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?><xs:schema xmlns:xfd="urn:xoev-de:xfall:standard:fim-s17000652_1.4" xmlns:xs="http://www.w3.org/2001/XMLSchema" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="urn:xoev-de:xfall:standard:fim-s17000652_1.4" version="V1.4"><xs:element name="fim.S17000652.17000652001004"><xs:complexType><xs:sequence><xs:element name="G17003529" type="xfd:G17003529"><xs:annotation><xs:documentation><name>EfA|SH Standard</name><bezug>tbd</bezug></xs:documentation></xs:annotation></xs:element><xs:element name="F17009191" type="xs:boolean"><xs:annotation><xs:documentation><name>Anzeige durch Person </name><definition>Wahrheitswert: ja oder nein
 -</definition><bezug>Art. 8 GG;§ 11 VershFG SG
 -</bezug></xs:documentation></xs:annotation></xs:element><xs:element minOccurs="0" name="G17002112" type="xfd:G17002112"><xs:annotation><xs:documentation><name>Anzeigenersteller:in</name><bezug>Art. 8 GG; § 11 VershFG SG</bezug></xs:documentation></xs:annotation></xs:element><xs:element minOccurs="0" name="G17005403" type="xfd:G17005403"><xs:annotation><xs:documentation><name>Organisation </name><definition>Angaben zur Organisation, welche die Versammlung durchführen möchte</definition><bezug>Art. 8 GG;§ 11 VershFG SG
 -</bezug></xs:documentation></xs:annotation></xs:element><xs:element name="F17003371" type="xs:string"><xs:annotation><xs:documentation><name>Anzeigenart</name><bezug>Art. 8 GG; § 11 VershFG SG</bezug></xs:documentation></xs:annotation></xs:element><xs:element minOccurs="0" name="G17005404" type="xfd:G17005404"><xs:annotation><xs:documentation><name>Versammlung (ortsfest)</name><bezug>Art. 8 GG ; § 11 VershFG SH</bezug></xs:documentation></xs:annotation></xs:element><xs:element minOccurs="0" name="G17005410" type="xfd:G17005410"><xs:annotation><xs:documentation><name>Versammlung (Aufzug)</name><bezug>Art. 8 GG ; § 11 VersFG SH</bezug></xs:documentation></xs:annotation></xs:element></xs:sequence></xs:complexType></xs:element><xs:complexType name="G17003529"><xs:sequence><xs:element name="G05001479" type="xfd:G05001479"><xs:annotation><xs:documentation><name>nachrichtenkopf</name><beschreibung>Der Nachrichtenkopf beinhaltet alle erforderlichen Informationen für die Zustellung und Verifizierung mit Hilfe des DVDV.</beschreibung><bezug>DVDV</bezug></xs:documentation></xs:annotation></xs:element><xs:element name="F17005454" type="xs:boolean"><xs:annotation><xs:documentation><name>Datenschutzhinweis DSGVO</name><bezug>tbd</bezug></xs:documentation></xs:annotation></xs:element><xs:element name="F17005455" type="xs:boolean"><xs:annotation><xs:documentation><name>Zustimmung zu einem digitalen Bescheid</name><bezug>tbd</bezug></xs:documentation></xs:annotation></xs:element><xs:element name="F17005533" type="xs:string"><xs:annotation><xs:documentation><name>UUID</name><bezug>tbd</bezug></xs:documentation></xs:annotation></xs:element></xs:sequence></xs:complexType><xs:complexType name="G05001479"><xs:sequence><xs:element name="G05001480" type="xfd:G05001480"><xs:annotation><xs:documentation><name>identifikation.nachricht</name><bezug>DVDV</bezug></xs:documentation></xs:annotation></xs:element><xs:element name="G05001481" type="xfd:G05001481"><xs:annotation><xs:documentation><name>Leser</name><bezug>DVDV</bezug></xs:documentation></xs:annotation></xs:element><xs:element name="G05001482" type="xfd:G05001482"><xs:annotation><xs:documentation><name>Autor</name><bezug>DVDV</bezug></xs:documentation></xs:annotation></xs:element></xs:sequence></xs:complexType><xs:complexType name="G05001480"><xs:sequence><xs:element name="F05002750" type="xs:string"><xs:annotation><xs:documentation><name>nachrichtenUUID</name><bezug>DVDV</bezug></xs:documentation></xs:annotation></xs:element><xs:element name="F05002751" type="xs:string"><xs:annotation><xs:documentation><name>erstellungszeitpunkt</name><bezug>DVDV</bezug></xs:documentation></xs:annotation></xs:element><xs:element name="F05002752" type="xs:string"><xs:annotation><xs:documentation><name>nachrichtentyp</name><bezug>DVDV</bezug></xs:documentation></xs:annotation></xs:element><xs:element name="F05002753" type="xs:string"><xs:annotation><xs:documentation><name>dienstname</name><bezug>DVDV</bezug></xs:documentation></xs:annotation></xs:element></xs:sequence></xs:complexType><xs:complexType name="G05001481"><xs:sequence><xs:element name="F05002754" type="xs:string"><xs:annotation><xs:documentation><name>Organisationsname</name><bezug>DVDV</bezug></xs:documentation></xs:annotation></xs:element><xs:element name="F05002755" type="xs:string"><xs:annotation><xs:documentation><name>Organisationsschlüssel</name><bezug>DVDV</bezug></xs:documentation></xs:annotation></xs:element><xs:element name="F05002756" type="xs:string"><xs:annotation><xs:documentation><name>Kategorie</name><bezug>DVDV</bezug></xs:documentation></xs:annotation></xs:element></xs:sequence></xs:complexType><xs:complexType name="G05001482"><xs:sequence><xs:element name="F05002754" type="xs:string"><xs:annotation><xs:documentation><name>Organisationsname</name><bezug>DVDV</bezug></xs:documentation></xs:annotation></xs:element><xs:element name="F05002755" type="xs:string"><xs:annotation><xs:documentation><name>Organisationsschlüssel</name><bezug>DVDV</bezug></xs:documentation></xs:annotation></xs:element><xs:element name="F05002756" type="xs:string"><xs:annotation><xs:documentation><name>Kategorie</name><bezug>DVDV</bezug></xs:documentation></xs:annotation></xs:element></xs:sequence></xs:complexType><xs:complexType name="G17002112"><xs:sequence><xs:element name="F60000228" type="xs:string"><xs:annotation><xs:documentation><name>Vornamen</name><beschreibung>Laut BSI TR-03123 soll Vorname ≤ 80 Zeichen betragen.
 -Laut PAuswV soll Vorname nicht mehr als 26 Zeichen bzw. 2*40 = 80 Zeichen betragen.</beschreibung><definition>Plural zu Vorname</definition><bezug>§ 5 (2) Nr. 2 PAuswG vom 21.6.2019; Anhang 3 PAuswV vom 28.9.2017; 
 -Tabelle 9 BSI TR-03123 Version 1.5.1; XOEV.Kernkomponente.NameNatuerlichePerson.vorname vom 31.08.2020</bezug></xs:documentation></xs:annotation></xs:element><xs:element name="F60000227" type="xs:string"><xs:annotation><xs:documentation><name>Familienname</name><beschreibung>Laut BSI TR-03123 soll die Gesamtlänge für Familienname, Titel und Geburtsname nicht mehr als 120 Zeichen betragen. Laut PAuswV soll Name (Familienname und Geburtsname) nicht mehr als 2*26 = 52 Zeichen bzw. 3*40 = 120 Zeichen betragen.</beschreibung><definition>Familienname einer natürlichen Person bestehend aus Nachname, Zuname bzw. Familienname.</definition><bezug>§ 5 (2) Nr. 1 PAuswG vom 21.6.2019; Anhang 3 PAuswV vom 28.9.2017; Tabelle 9 BSI TR-03123 Version 1.5.1; XOEV.Kernkomponente.NameNatuerlichePerson.familienname vom 31.01.2020</bezug></xs:documentation></xs:annotation></xs:element><xs:element name="G60000086" type="xfd:G60000086"><xs:annotation><xs:documentation><name>Anschrift Inland Straßenanschrift</name></xs:documentation></xs:annotation></xs:element><xs:element minOccurs="0" name="F60000240" type="xs:string"><xs:annotation><xs:documentation><name>Telefon</name><beschreibung>Dieses Feld wurde angelehnt an ITU E.123. Eine Prüfung über ein Pattern erfolgt nicht, um den Eingebenden nicht zu überfordern.</beschreibung><definition>Telefonnummer</definition><bezug>ITU E.123</bezug></xs:documentation></xs:annotation></xs:element><xs:element minOccurs="0" name="F60000242" type="xs:string"><xs:annotation><xs:documentation><name>E-Mail</name><definition>Elektronische Adresse zum Senden und Empfangen von digitalen Nachrichten (E-Mails) z.B. MaxMustermann@email.de</definition><bezug>RFC 5322; RFC 5321</bezug></xs:documentation></xs:annotation></xs:element><xs:element name="F17009011" type="xs:boolean"><xs:annotation><xs:documentation><name>Auswahl Anzeigenersteller:in = Verantwortliche Versammlungsleiter:in</name><definition>Angabe ob Sie als Anzeigenersteller:in ebenfalls Verantwortliche Versammlungsleiter:in sind</definition><bezug>Art. 8 GG; § 11 VershFG SG</bezug></xs:documentation></xs:annotation></xs:element><xs:element minOccurs="0" name="G17002127" type="xfd:G17002127"><xs:annotation><xs:documentation><name>Verantwortliche Versammlungsleiter:in</name><bezug>Art. 8 GG; § 11 VershFG SG</bezug></xs:documentation></xs:annotation></xs:element></xs:sequence></xs:complexType><xs:complexType name="G60000086"><xs:sequence><xs:element name="F60000243" type="xs:string"><xs:annotation><xs:documentation><name>Straße</name><beschreibung>Kompatibilität zu EPA in TR XhD v 1.4 sollte Feldlänge min. 50. Bei XInneres 8 ist die Feldlänge <= 55 Zeichen.</beschreibung><bezug>XInneres.Meldeanschrift.strasse Version 8</bezug></xs:documentation></xs:annotation></xs:element><xs:element minOccurs="0" name="F60000244" type="xs:string"><xs:annotation><xs:documentation><name>Hausnummer</name><beschreibung>Die Modellierung aus XInneres wurde nicht 1:1 übernommen, um die Komplexität für die Ausfüllenden nicht zu hoch zu setzen. Es wurde darauf verzichtet für das Ende von Hausnummernbereichen eigene Felder zu modellieren. Daher ist die Feldlänge hier heraufgesetzt und eine entsprechende Beschreibung wurde eingefügt. Die Feldlänge setzt sich aus der maximalen Feldlänge zweier Hausnummern (jeweils 4), zweier Buchstaben (jeweils 1) und eines Zeichen (-) zusammen.</beschreibung><definition>Es sind die Ziffern und Buchstabeneiner Hausnummer anzugeben. Eine Hausnummer dient der genauen Lokalisierung eines Grundstücks, Gebäudes oder Gebäudeteils (Eingang) in einer Straße. Geben Sie Hausnummernbereiche immer nach folgendem Beispiel ohne Leerzeichen an: 12a-14d</definition><bezug>XInneres.Meldeanschrift.hausnummer Version 8</bezug></xs:documentation></xs:annotation></xs:element><xs:element name="F60000246" type="xs:string"><xs:annotation><xs:documentation><name>Postleitzahl</name><definition>Es ist die Postleitzahl anzugeben.
 -
 -Der Typ dieses Elements ist eine Einschränkung des Basistyps String.Latin.</definition><bezug>XInneres.Meldeanschrift.postleitzahl Version 8</bezug></xs:documentation></xs:annotation></xs:element><xs:element name="F60000247" type="xs:string"><xs:annotation><xs:documentation><name>Ort</name><beschreibung>Kompatibilität zu EPA in TR XhD v 1.4 sollte Feldlänge min. 44. Laut PAuswV 2*25 = 50 Zeichen. Laut Xinneres.Meldeanschrift.Wohnort Version 8 = 40 Zeichen.
 -Laut BSI TR-03123 ≤ 105 Zeichen.</beschreibung><definition>Enthält den Namen eines Ortes (Gemeinde, Ortschaft oder Stadt).</definition><bezug>§ 5 (2) Nr. 9 PAuswG vom 21.6.2019; Anhang 3 Abschnitt 1 (Wohnort) PAuswV vom 28.9.2017; Tabelle 11 BSI TR-03123, Version 1.5.1; Xinneres.Meldeanschrift.Wohnort Version 8; XOEV.Kernkomponente.Anschrift.ort vom 31.01.2020</bezug></xs:documentation></xs:annotation></xs:element><xs:element minOccurs="0" name="F60000248" type="xs:string"><xs:annotation><xs:documentation><name>Anschrift Zusatzangaben</name><definition>Es sind Zusatzangaben zur Anschrift anzugeben, z.B. Hinterhaus, Gartenhaus.
 -</definition><bezug>XInneres.Meldeanschrift.zusatzangaben Version 8</bezug></xs:documentation></xs:annotation></xs:element></xs:sequence></xs:complexType><xs:complexType name="G17002127"><xs:sequence><xs:element name="F60000228" type="xs:string"><xs:annotation><xs:documentation><name>Vornamen</name><beschreibung>Laut BSI TR-03123 soll Vorname ≤ 80 Zeichen betragen.
 -Laut PAuswV soll Vorname nicht mehr als 26 Zeichen bzw. 2*40 = 80 Zeichen betragen.</beschreibung><definition>Plural zu Vorname</definition><bezug>§ 5 (2) Nr. 2 PAuswG vom 21.6.2019; Anhang 3 PAuswV vom 28.9.2017; 
 -Tabelle 9 BSI TR-03123 Version 1.5.1; XOEV.Kernkomponente.NameNatuerlichePerson.vorname vom 31.08.2020</bezug></xs:documentation></xs:annotation></xs:element><xs:element name="F60000227" type="xs:string"><xs:annotation><xs:documentation><name>Familienname</name><beschreibung>Laut BSI TR-03123 soll die Gesamtlänge für Familienname, Titel und Geburtsname nicht mehr als 120 Zeichen betragen. Laut PAuswV soll Name (Familienname und Geburtsname) nicht mehr als 2*26 = 52 Zeichen bzw. 3*40 = 120 Zeichen betragen.</beschreibung><definition>Familienname einer natürlichen Person bestehend aus Nachname, Zuname bzw. Familienname.</definition><bezug>§ 5 (2) Nr. 1 PAuswG vom 21.6.2019; Anhang 3 PAuswV vom 28.9.2017; Tabelle 9 BSI TR-03123 Version 1.5.1; XOEV.Kernkomponente.NameNatuerlichePerson.familienname vom 31.01.2020</bezug></xs:documentation></xs:annotation></xs:element><xs:element name="G60000086" type="xfd:G60000086"><xs:annotation><xs:documentation><name>Anschrift Inland Straßenanschrift</name></xs:documentation></xs:annotation></xs:element><xs:element minOccurs="0" name="F60000242" type="xs:string"><xs:annotation><xs:documentation><name>E-Mail</name><definition>Elektronische Adresse zum Senden und Empfangen von digitalen Nachrichten (E-Mails) z.B. MaxMustermann@email.de</definition><bezug>RFC 5322; RFC 5321</bezug></xs:documentation></xs:annotation></xs:element><xs:element minOccurs="0" name="F60000240" type="xs:string"><xs:annotation><xs:documentation><name>Telefon</name><beschreibung>Dieses Feld wurde angelehnt an ITU E.123. Eine Prüfung über ein Pattern erfolgt nicht, um den Eingebenden nicht zu überfordern.</beschreibung><definition>Telefonnummer</definition><bezug>ITU E.123</bezug></xs:documentation></xs:annotation></xs:element><xs:element minOccurs="0" name="F17011808" type="xs:string"><xs:annotation><xs:documentation><name>Telefonische Erreichbarkeit am Tag der Veranstaltung</name><bezug>§ 11 VershFG</bezug></xs:documentation></xs:annotation></xs:element></xs:sequence></xs:complexType><xs:complexType name="G17005403"><xs:sequence><xs:element name="G17007200" type="xfd:G17007200"><xs:annotation><xs:documentation><name>Daten der anzeigenden Organisation</name><bezug>Art. 8 GG ;§ 11 VershFG SH</bezug></xs:documentation></xs:annotation></xs:element><xs:element name="G17007201" type="xfd:G17007201"><xs:annotation><xs:documentation><name>Ansprechperson der Organisation</name><definition>Sie sollten als Versammlungsleitung oder veranstaltende Person oder Organisation Ihre Telefonnummer oder E-Mail-Adresse, unter der Sie vor und während der Versammlung erreichbar sind, angeben. Dies dient der schnellen, einfachen und vertrauensvollen Zusammenarbeit mit der Versammlungsbehörde und der Sicherstellung des Schutzes Ihrer Versammlung.</definition><bezug>Art. 8 GG;§ 11 VershFG SG</bezug></xs:documentation></xs:annotation></xs:element><xs:element name="G17002127" type="xfd:G17002127"><xs:annotation><xs:documentation><name>Verantwortliche Versammlungsleiter:in</name><bezug>Art. 8 GG; § 11 VershFG SG</bezug></xs:documentation></xs:annotation></xs:element></xs:sequence></xs:complexType><xs:complexType name="G17007200"><xs:sequence><xs:element name="F60000319" type="xs:string"><xs:annotation><xs:documentation><name>Eingetragener Name / Organisationsname</name><beschreibung>Laut XGewerbeanzeige.Betrieb.eingetragenerName soll der eingetragene Name 1-1000 Zeichen betragen.</beschreibung><definition>Die im Handels- oder Genossenschaftsregister eingetragene Firma eines wirtschaftlich Tätigen bzw. einer wirtschaftlichen Tätigkeit (z. B. eingetragenes Einzelunternehmen,eingetragene Zweigniederlassung) bzw. der im Vereinsregister, Partnerschaftsregister oder Stiftungsverzeichnis eingetragene Name.
 -
 -Der eingetragene Name kann auch in einem Register festgehalten sein, welches in einem anderen Staat geführt wird.
 -
 -Der eingetragene Name ist abzugrenzen von der Geschäftsbezeichnung. 
 -
 -Das Kerndatenobjekt bildet auch die Namen juristischer Personen, Personengesellschaften oder sonstiger Personenvereinigungen ab, die nicht in einem Register, aber kraft Gesetz geführt werden.</definition><bezug>XOEV.Kernkomponente.NameOrganisation.name vom 01.08.2017; XGewerbeanzeige.Betrieb.eingetragenerName Version 2.2; XUnternehmen.Kerndatenmodell.Eingetragener Name Version 1.1</bezug></xs:documentation></xs:annotation></xs:element><xs:element minOccurs="0" name="F17011809" type="xs:string"><xs:annotation><xs:documentation><name>Organisationseinheit</name><definition>Optionale Angabe der Organisationseinheit</definition><bezug>Art. 8 GG;§ 11 VershFG SG</bezug></xs:documentation></xs:annotation></xs:element><xs:element name="G60000086" type="xfd:G60000086"><xs:annotation><xs:documentation><name>Anschrift Inland Straßenanschrift</name><definition>Angaben für die Adressierung im Inland, soweit es sich um die Anschrift eines Gebäudes handelt.</definition><bezug>urn:xoevde:xunternehmen:kerndatenobjekt:anschriftinlandstrassenanschrift</bezug></xs:documentation></xs:annotation></xs:element></xs:sequence></xs:complexType><xs:complexType name="G60000086"><xs:sequence><xs:element name="F60000243" type="xs:string"><xs:annotation><xs:documentation><name>Straße</name><beschreibung>Kompatibilität zu EPA in TR XhD v 1.4 sollte Feldlänge min. 50. Bei XInneres 8 ist die Feldlänge <= 55 Zeichen.</beschreibung><bezug>XInneres.Meldeanschrift.strasse Version 8</bezug></xs:documentation></xs:annotation></xs:element><xs:element minOccurs="0" name="F60000244" type="xs:string"><xs:annotation><xs:documentation><name>Hausnummer</name><beschreibung>Die Modellierung aus XInneres wurde nicht 1:1 übernommen, um die Komplexität für die Ausfüllenden nicht zu hoch zu setzen. Es wurde darauf verzichtet für das Ende von Hausnummernbereichen eigene Felder zu modellieren. Daher ist die Feldlänge hier heraufgesetzt und eine entsprechende Beschreibung wurde eingefügt. Die Feldlänge setzt sich aus der maximalen Feldlänge zweier Hausnummern (jeweils 4), zweier Buchstaben (jeweils 1) und eines Zeichen (-) zusammen.</beschreibung><definition>Es sind die Ziffern und Buchstabeneiner Hausnummer anzugeben. Eine Hausnummer dient der genauen Lokalisierung eines Grundstücks, Gebäudes oder Gebäudeteils (Eingang) in einer Straße. Geben Sie Hausnummernbereiche immer nach folgendem Beispiel ohne Leerzeichen an: 12a-14d</definition><bezug>XInneres.Meldeanschrift.hausnummer Version 8</bezug></xs:documentation></xs:annotation></xs:element><xs:element name="F60000246" type="xs:string"><xs:annotation><xs:documentation><name>Postleitzahl</name><definition>Es ist die Postleitzahl anzugeben.
 -
 -Der Typ dieses Elements ist eine Einschränkung des Basistyps String.Latin.</definition><bezug>XInneres.Meldeanschrift.postleitzahl Version 8</bezug></xs:documentation></xs:annotation></xs:element><xs:element name="F60000247" type="xs:string"><xs:annotation><xs:documentation><name>Ort</name><beschreibung>Kompatibilität zu EPA in TR XhD v 1.4 sollte Feldlänge min. 44. Laut PAuswV 2*25 = 50 Zeichen. Laut Xinneres.Meldeanschrift.Wohnort Version 8 = 40 Zeichen. -Laut BSI TR-03123 kleiner gleich 105 Zeichen.</beschreibung><definition>Enthält den Namen eines Ortes (Gemeinde, Ortschaft oder Stadt).</definition><bezug>§ 5 (2) Nr. 9 PAuswG vom 21.6.2019; Anhang 3 Abschnitt 1 (Wohnort) PAuswV vom 28.9.2017; Tabelle 11 BSI TR-03123, Version 1.5.1; Xinneres.Meldeanschrift.Wohnort Version 8; XOEV.Kernkomponente.Anschrift.ort vom 31.01.2020</bezug></xs:documentation></xs:annotation></xs:element><xs:element minOccurs="0" name="F60000248" type="xs:string"><xs:annotation><xs:documentation><name>Anschrift Zusatzangaben</name><definition>Es sind Zusatzangaben zur Anschrift anzugeben, z.B. Hinterhaus, Gartenhaus.
 -</definition><bezug>XInneres.Meldeanschrift.zusatzangaben Version 8</bezug></xs:documentation></xs:annotation></xs:element></xs:sequence></xs:complexType><xs:complexType name="G17007201"><xs:sequence><xs:element name="F60000228" type="xs:string"><xs:annotation><xs:documentation><name>Vornamen</name><beschreibung>Laut BSI TR-03123 soll Vorname <= 80 Zeichen betragen.
 -Laut PAuswV soll Vorname nicht mehr als 26 Zeichen bzw. 2*40 = 80 Zeichen betragen.</beschreibung><definition>Plural zu Vorname</definition><bezug>§ 5 (2) Nr. 2 PAuswG vom 21.6.2019; Anhang 3 PAuswV vom 28.9.2017; 
 -Tabelle 9 BSI TR-03123 Version 1.5.1; XOEV.Kernkomponente.NameNatuerlichePerson.vorname vom 31.08.2020</bezug></xs:documentation></xs:annotation></xs:element><xs:element name="F60000227" type="xs:string"><xs:annotation><xs:documentation><name>Familienname</name><beschreibung>Laut BSI TR-03123 soll die Gesamtlänge für Familienname, Titel und Geburtsname nicht mehr als 120 Zeichen betragen. Laut PAuswV soll Name (Familienname und Geburtsname) nicht mehr als 2*26 = 52 Zeichen bzw. 3*40 = 120 Zeichen betragen.</beschreibung><definition>Familienname einer natürlichen Person bestehend aus Nachname, Zuname bzw. Familienname.</definition><bezug>§ 5 (2) Nr. 1 PAuswG vom 21.6.2019; Anhang 3 PAuswV vom 28.9.2017; Tabelle 9 BSI TR-03123 Version 1.5.1; XOEV.Kernkomponente.NameNatuerlichePerson.familienname vom 31.01.2020</bezug></xs:documentation></xs:annotation></xs:element><xs:element minOccurs="0" name="F60000240" type="xs:string"><xs:annotation><xs:documentation><name>Telefon</name><beschreibung>Dieses Feld wurde angelehnt an ITU E.123. Eine Prüfung über ein Pattern erfolgt nicht, um den Eingebenden nicht zu überfordern.</beschreibung><definition>Telefonnummer</definition><bezug>ITU E.123</bezug></xs:documentation></xs:annotation></xs:element><xs:element minOccurs="0" name="F60000242" type="xs:string"><xs:annotation><xs:documentation><name>E-Mail</name><definition>Elektronische Adresse zum Senden und Empfangen von digitalen Nachrichten (E-Mails) z.B. MaxMustermann@email.de</definition><bezug>RFC 5322; RFC 5321</bezug></xs:documentation></xs:annotation></xs:element></xs:sequence></xs:complexType><xs:complexType name="G17005404"><xs:sequence><xs:element name="G17007202" type="xfd:G17007202"><xs:annotation><xs:documentation><name>Allgemeine Angaben zur Versammlung</name><bezug>Art. 8 GG ; § 11 VershFG SH</bezug></xs:documentation></xs:annotation></xs:element><xs:element name="G17007205" type="xfd:G17007205"><xs:annotation><xs:documentation><name>Weitere Angaben </name><definition>Angaben zur geplanten Durchführung der Versammlung.</definition><bezug>Art. 8 GG ; §§ 9, 11 VersFG SH</bezug></xs:documentation></xs:annotation></xs:element></xs:sequence></xs:complexType><xs:complexType name="G17007202"><xs:sequence><xs:element name="F17003373" type="xs:string"><xs:annotation><xs:documentation><name>Thema der Versammlung</name><bezug>Art. 8 GG; § 11 VershFG SG</bezug></xs:documentation></xs:annotation></xs:element><xs:element minOccurs="0" name="F17011810" type="xs:string"><xs:annotation><xs:documentation><name>Beschreibung der Versammlung</name><bezug>Art. 8 GG ; § 11 VershFG SH</bezug></xs:documentation></xs:annotation></xs:element><xs:element name="F17003377" type="xs:string"><xs:annotation><xs:documentation><name>Versammlungsort</name><bezug>Art. 8 GG; § 11 VershFG SG</bezug></xs:documentation></xs:annotation></xs:element><xs:element minOccurs="0" name="G17005405" type="xfd:G17005405"><xs:annotation><xs:documentation><name>Karte Versammlungsort</name><definition>Anlage eines Kartenausschnitts</definition><bezug>Art. 8 GG; § 11 VershFG SG</bezug></xs:documentation></xs:annotation></xs:element><xs:element name="G17005406" type="xfd:G17005406"><xs:annotation><xs:documentation><name>Zeitraum (Versammlungsanzeige)</name><definition>Gibt den Anfang und das Ende eines Zeitraums an.</definition><bezug>Art. 8 GG; § 11 VershFG SG</bezug></xs:documentation></xs:annotation></xs:element><xs:element minOccurs="0" name="F17011814" type="xs:string"><xs:annotation><xs:documentation><name>Grund für die verspätete Anmeldung</name><definition>Im Falle der nicht fristgemäßen Anmeldung der Versammlung - Optional Grund ergänzen. </definition><bezug>Art. 8 GG ; § 11 VershFG SH</bezug></xs:documentation></xs:annotation></xs:element><xs:element minOccurs="0" name="F17011815" type="xs:string"><xs:annotation><xs:documentation><name>Telefonnummer zur Rücksprache der verspäteten Anmeldung</name><bezug>Art. 8 GG ; § 11 VershFG SH iVm ITU E.123</bezug></xs:documentation></xs:annotation></xs:element></xs:sequence></xs:complexType><xs:complexType name="G17005405"><xs:sequence><xs:element maxOccurs="5" minOccurs="0" name="F60000296" type="xs:string"><xs:annotation><xs:documentation><name>Nachweis</name><definition>Nachweisdokument, um eine Information zu bestätigen, z.B. Sachkundenachweis.</definition></xs:documentation></xs:annotation></xs:element></xs:sequence></xs:complexType><xs:complexType name="G17005406"><xs:sequence><xs:element name="F60000048" type="xs:date"><xs:annotation><xs:documentation><name>Anfang</name><definition>Beinhaltet das Datum des Anfangs eines Zeitraums.</definition><bezug>urn:xoev-de:kosit:xoev:kernkomponente:zeitraum vom 31.08.2020</bezug></xs:documentation></xs:annotation></xs:element><xs:element name="F17001348" type="xs:decimal"><xs:annotation><xs:documentation><name>Uhrzeit Start</name><bezug>div.</bezug></xs:documentation></xs:annotation></xs:element><xs:element name="F60000049" type="xs:date"><xs:annotation><xs:documentation><name>Ende</name><definition>Beinhaltet das Datum des Ende eines Zeitraums.</definition><bezug>urn:xoev-de:kosit:xoev:kernkomponente:zeitraum vom 31.08.2020</bezug></xs:documentation></xs:annotation></xs:element><xs:element name="F17001349" type="xs:decimal"><xs:annotation><xs:documentation><name>Uhrzeit Abschluss</name><bezug>div.</bezug></xs:documentation></xs:annotation></xs:element></xs:sequence></xs:complexType><xs:complexType name="G17007205"><xs:sequence><xs:element name="F17003379" type="xs:integer"><xs:annotation><xs:documentation><name>Anzahl der Teilnehmenden</name><bezug>Art. 8 GG; § 11 VershFG SH</bezug></xs:documentation></xs:annotation></xs:element><xs:element minOccurs="0" name="F17003380" type="xs:integer"><xs:annotation><xs:documentation><name>Anzahl eingeplanter Ordner:innen</name><definition>Empfehlung: 1 Ordner:in je 50 Teilnehmende</definition><bezug>Art. 8 GG; § 11 VershFG SG</bezug></xs:documentation></xs:annotation></xs:element><xs:element minOccurs="0" name="F17003382" type="xs:string"><xs:annotation><xs:documentation><name>Weitere teilnehmende Organisationen</name><bezug>Art. 8 GG; § 11 VershFG SG</bezug></xs:documentation></xs:annotation></xs:element><xs:element name="G17007234" type="xfd:G17007234"><xs:annotation><xs:documentation><name>Aufbauzeit</name><bezug>§§ 11,14 VersFG SH</bezug></xs:documentation></xs:annotation></xs:element><xs:element name="G17007235" type="xfd:G17007235"><xs:annotation><xs:documentation><name>Abbauzeit</name><bezug>§§ 11,14 VersFG SH</bezug></xs:documentation></xs:annotation></xs:element><xs:element minOccurs="0" name="F17003383" type="xs:string"><xs:annotation><xs:documentation><name>Demonstrationsmittel</name><bezug>Art. 8 GG; § 11 VershFG SG</bezug></xs:documentation></xs:annotation></xs:element><xs:element minOccurs="0" name="G17007207" type="xfd:G17007207"><xs:annotation><xs:documentation><name>Zusätzliche Informationen zu den geplanten Demonstrationsmitteln</name><definition>Optionale Schätzung der Anzahl der Fahnen und Transparente.</definition><bezug>Art. 8 GG ; §§ 9, 11 VershFG SH</bezug></xs:documentation></xs:annotation></xs:element><xs:element minOccurs="0" name="F17003384" type="xs:string"><xs:annotation><xs:documentation><name>Lautsprechereinsatz</name><bezug>Art. 8 GG ; § 11 VersFG SG</bezug></xs:documentation></xs:annotation></xs:element><xs:element minOccurs="0" name="G17007208" type="xfd:G17007208"><xs:annotation><xs:documentation><name>Zusätzliche Informationen zum geplanten Lautsprechereinsatz</name><definition>Angaben zum geplanten Einsatz von Lautsprechern und ggf. Transportfahrzeugen (Musikanlagen, Megafone, PKW/LKW usw.)</definition><bezug>Art. 8 GG ; § 11 VersFG SH</bezug></xs:documentation></xs:annotation></xs:element><xs:element maxOccurs="unbounded" minOccurs="0" name="G17007209" type="xfd:G17007209"><xs:annotation><xs:documentation><name>Geplante Bühnen</name><bezug>Art. 8 GG ; § 11 VersFG SH</bezug></xs:documentation></xs:annotation></xs:element><xs:element minOccurs="0" name="G17007210" type="xfd:G17007210"><xs:annotation><xs:documentation><name>Lagepläne / Skizzen der Aufbauten, Bilder / Informationen zu den Demonstrationsmitteln oder sonstige Dokumente/Informationen hochladen</name><bezug>Art. 8 GG ; §§ 9, 11 VersFG SH</bezug></xs:documentation></xs:annotation></xs:element></xs:sequence></xs:complexType><xs:complexType name="G17007234"><xs:sequence><xs:element name="F17011826" type="xs:string"><xs:annotation><xs:documentation><name>Beträgt die Aufbauzeit über 30 Minuten?</name><bezug>Art. 8 GG ; § 11 VersFG SH</bezug></xs:documentation></xs:annotation></xs:element><xs:element minOccurs="0" name="F17011853" type="xs:integer"><xs:annotation><xs:documentation><name>Auf-/Abbauzeit > 30 min </name><definition>Wenn die Auf- bzw. Abbauzeit mehr als 30 min beträgt in "F17011826 Beträgt die Aufbauzeit über 30 Minuten?" bzw. in "F17011827 Beträgt die Abbauzeit über 30 Minuten?" = Auswahl in C17001209 = 001 "Ja", wird "F17011853 Auf-/Abbauzeit > 30 min" zu einer Pflichtangabe.
 -</definition><bezug>§§ 11,14 VersFG SH</bezug></xs:documentation></xs:annotation></xs:element></xs:sequence></xs:complexType><xs:complexType name="G17007235"><xs:sequence><xs:element name="F17011827" type="xs:string"><xs:annotation><xs:documentation><name>Beträgt die Abbauzeit über 30 Minuten?</name><bezug>Art. 8 GG ; § 11 VersFG SH</bezug></xs:documentation></xs:annotation></xs:element><xs:element minOccurs="0" name="F17011853" type="xs:integer"><xs:annotation><xs:documentation><name>Auf-/Abbauzeit > 30 min </name><definition>Wenn die Auf- bzw. Abbauzeit mehr als 30 min beträgt in "F17011826 Beträgt die Aufbauzeit über 30 Minuten?" bzw. in "F17011827 Beträgt die Abbauzeit über 30 Minuten?" = Auswahl in C17001209 = 001 "Ja", wird "F17011853 Auf-/Abbauzeit > 30 min" zu einer Pflichtangabe.
 -</definition><bezug>§§ 11,14 VersFG SH</bezug></xs:documentation></xs:annotation></xs:element></xs:sequence></xs:complexType><xs:complexType name="G17007207"><xs:sequence><xs:element minOccurs="0" name="F17011818" type="xs:integer"><xs:annotation><xs:documentation><name>Anzahl Transparente</name><bezug>Art. 8 GG ; § 11 VersFG SH</bezug></xs:documentation></xs:annotation></xs:element><xs:element minOccurs="0" name="F17011819" type="xs:integer"><xs:annotation><xs:documentation><name>Anzahl Fahnen</name><bezug>Art. 8 GG ; § 11 VersFG SH</bezug></xs:documentation></xs:annotation></xs:element></xs:sequence></xs:complexType><xs:complexType name="G17007208"><xs:sequence><xs:element minOccurs="0" name="F17011820" type="xs:integer"><xs:annotation><xs:documentation><name>Anzahl Lautsprecher(anlagen)</name><bezug>Art. 8 GG ; § 11 VersFG SH</bezug></xs:documentation></xs:annotation></xs:element><xs:element minOccurs="0" name="F17011821" type="xs:integer"><xs:annotation><xs:documentation><name>Anzahl Megafone</name><bezug>Art. 8 GG ; § 11 VersFG SH</bezug></xs:documentation></xs:annotation></xs:element><xs:element minOccurs="0" name="F17011822" type="xs:integer"><xs:annotation><xs:documentation><name>Anzahl PKW</name><bezug>Art. 8 GG ; § 11 VersFG SH</bezug></xs:documentation></xs:annotation></xs:element><xs:element minOccurs="0" name="F17011824" type="xs:integer"><xs:annotation><xs:documentation><name>Anzahl LKW</name><bezug>Art. 8 GG ; § 11 VersFG SH</bezug></xs:documentation></xs:annotation></xs:element><xs:element minOccurs="0" name="F17011823" type="xs:decimal"><xs:annotation><xs:documentation><name>Gewicht LKW</name><bezug>Art. 8 GG ; § 11 VersFG SH</bezug></xs:documentation></xs:annotation></xs:element></xs:sequence></xs:complexType><xs:complexType name="G17007209"><xs:sequence><xs:element name="F17011825" type="xs:boolean"><xs:annotation><xs:documentation><name>Fester Bühnenaufbau? </name><definition>Wahrheitswert: Auswahl = "ja" entspricht "Fester Aufbau" - Auswahl ="nein" entspricht "mobile Bühne"</definition><bezug>Art. 8 GG ; § 11 VersFG SH</bezug></xs:documentation></xs:annotation></xs:element><xs:element name="F60000302" type="xs:decimal"><xs:annotation><xs:documentation><name>Länge in m</name></xs:documentation></xs:annotation></xs:element><xs:element name="F60000303" type="xs:decimal"><xs:annotation><xs:documentation><name>Breite in m</name></xs:documentation></xs:annotation></xs:element><xs:element name="F60000311" type="xs:decimal"><xs:annotation><xs:documentation><name>Gewicht in kg</name></xs:documentation></xs:annotation></xs:element></xs:sequence></xs:complexType><xs:complexType name="G17007210"><xs:sequence><xs:element maxOccurs="unbounded" minOccurs="0" name="F60000296" type="xs:string"><xs:annotation><xs:documentation><name>Nachweis</name><definition>Nachweisdokument, um eine Information zu bestätigen, z.B. Sachkundenachweis.</definition></xs:documentation></xs:annotation></xs:element></xs:sequence></xs:complexType><xs:complexType name="G17005410"><xs:sequence><xs:element name="G17007211" type="xfd:G17007211"><xs:annotation><xs:documentation><name>Allgemeine Angaben zum Aufzug</name><bezug>Art. 8 GG ; § 11 VershFG SH</bezug></xs:documentation></xs:annotation></xs:element><xs:element minOccurs="0" name="F17011830" type="xs:string"><xs:annotation><xs:documentation><name>Art der Teilnahme</name><definition>Auswahl Art der Teilnahme</definition><bezug>Art. 8 GG ; § 11 VersFG SH</bezug></xs:documentation></xs:annotation></xs:element><xs:element name="G17005412" type="xfd:G17005412"><xs:annotation><xs:documentation><name>Anfangspunkt</name><bezug>Art. 8 GG ; § 11 VersFG SG</bezug></xs:documentation></xs:annotation></xs:element><xs:element name="G17005501" type="xfd:G17005501"><xs:annotation><xs:documentation><name>Streckenverlauf</name><definition>Angaben zum Streckenverlauf und ggf. Karte hinzufügen</definition><bezug>Art. 8 GG ; § 11 VersFG SG</bezug></xs:documentation></xs:annotation></xs:element><xs:element maxOccurs="20" minOccurs="0" name="G17005411" type="xfd:G17005411"><xs:annotation><xs:documentation><name>Zwischenkundgebung</name><definition>Angaben zu möglichen Zwischenkundgebungen</definition><bezug>Art. 8 GG; § 11 VershFG SG
 -</bezug></xs:documentation></xs:annotation></xs:element><xs:element name="F17009218" type="xs:boolean"><xs:annotation><xs:documentation><name>Anfangspunkt = Endpunkt der Versammlung</name><definition>Wenn die Versammlung am gleichen Ort beginnt an dem Sie auch endet</definition><bezug>Art. 8 GG;§ 11 VershFG SG
 -</bezug></xs:documentation></xs:annotation></xs:element><xs:element minOccurs="0" name="G17005413" type="xfd:G17005413"><xs:annotation><xs:documentation><name>Anschrift Inland Straßenanschrift (Ende)</name><bezug>Art. 8 GG; § 11 VershFG SG</bezug></xs:documentation></xs:annotation></xs:element><xs:element name="G17007205" type="xfd:G17007205"><xs:annotation><xs:documentation><name>Weitere Angaben </name><definition>Angaben zur geplanten Durchführung der Versammlung.</definition><bezug>Art. 8 GG ; §§ 9, 11 VersFG SH</bezug></xs:documentation></xs:annotation></xs:element></xs:sequence></xs:complexType><xs:complexType name="G17007211"><xs:sequence><xs:element name="F17011828" type="xs:string"><xs:annotation><xs:documentation><name>Thema des Aufzug</name><bezug>Art. 8 GG; § 11 VersFG SG</bezug></xs:documentation></xs:annotation></xs:element><xs:element minOccurs="0" name="F17011829" type="xs:string"><xs:annotation><xs:documentation><name>Beschreibung des Aufzug</name><bezug>Art. 8 GG ; § 11 VersFG SH</bezug></xs:documentation></xs:annotation></xs:element><xs:element name="G17005406" type="xfd:G17005406"><xs:annotation><xs:documentation><name>Zeitraum (Versammlungsanzeige)</name><definition>Gibt den Anfang und das Ende eines Zeitraums an.</definition><bezug>Art. 8 GG; § 11 VershFG SG</bezug></xs:documentation></xs:annotation></xs:element><xs:element minOccurs="0" name="F17011814" type="xs:string"><xs:annotation><xs:documentation><name>Grund für die verspätete Anmeldung</name><definition>Im Falle der nicht fristgemäßen Anmeldung der Versammlung - Optional Grund ergänzen. </definition><bezug>Art. 8 GG ; § 11 VershFG SH</bezug></xs:documentation></xs:annotation></xs:element><xs:element minOccurs="0" name="F17011815" type="xs:string"><xs:annotation><xs:documentation><name>Telefonnummer zur Rücksprache der verspäteten Anmeldung</name><bezug>Art. 8 GG ; § 11 VershFG SH iVm ITU E.123</bezug></xs:documentation></xs:annotation></xs:element></xs:sequence></xs:complexType><xs:complexType name="G17005412"><xs:sequence><xs:element name="G60000086" type="xfd:G60000086"><xs:annotation><xs:documentation><name>Anschrift Inland Straßenanschrift</name><definition>Angaben für die Adressierung im Inland, soweit es sich um die Anschrift eines Gebäudes handelt.</definition><bezug>urn:xoevde:xunternehmen:kerndatenobjekt:anschriftinlandstrassenanschrift</bezug></xs:documentation></xs:annotation></xs:element><xs:element minOccurs="0" name="G17005405" type="xfd:G17005405"><xs:annotation><xs:documentation><name>Karte Versammlungsort</name><definition>Anlage eines Kartenausschnitts</definition><bezug>Art. 8 GG; § 11 VershFG SG</bezug></xs:documentation></xs:annotation></xs:element></xs:sequence></xs:complexType><xs:complexType name="G17005501"><xs:sequence><xs:element name="F17009317" type="xs:string"><xs:annotation><xs:documentation><name>Beschreibung Streckenverlauf </name><definition>Freitextfeld zum Streckenverlauf.</definition><bezug>Art. 8 GG ; § 11 VersFG SG
 -</bezug></xs:documentation></xs:annotation></xs:element><xs:element minOccurs="0" name="G17007212" type="xfd:G17007212"><xs:annotation><xs:documentation><name>Karte Streckenverlauf</name><definition>Anlage eines Kartenausschnitts</definition><bezug>Art. 8 GG; § 11 VershFG SG</bezug></xs:documentation></xs:annotation></xs:element></xs:sequence></xs:complexType><xs:complexType name="G17007212"><xs:sequence><xs:element maxOccurs="5" minOccurs="0" name="F60000296" type="xs:string"><xs:annotation><xs:documentation><name>Nachweis</name><definition>Nachweisdokument, um eine Information zu bestätigen, z.B. Sachkundenachweis.</definition></xs:documentation></xs:annotation></xs:element></xs:sequence></xs:complexType><xs:complexType name="G17005411"><xs:sequence><xs:element name="G17004014" type="xfd:G17004014"><xs:annotation><xs:documentation><name>Zeitraum (Versammlungsanzeige)</name><definition>Gibt den Anfang und das Ende eines Zeitraums an.</definition><bezug>Art. 8 GG; § 11 VershFG SG</bezug></xs:documentation></xs:annotation></xs:element><xs:element name="G60000086" type="xfd:G60000086"><xs:annotation><xs:documentation><name>Anschrift Inland Straßenanschrift</name><definition>Angaben für die Adressierung im Inland, soweit es sich um die Anschrift eines Gebäudes handelt.</definition><bezug>urn:xoevde:xunternehmen:kerndatenobjekt:anschriftinlandstrassenanschrift</bezug></xs:documentation></xs:annotation></xs:element><xs:element minOccurs="0" name="G17005405" type="xfd:G17005405"><xs:annotation><xs:documentation><name>Karte Versammlungsort</name><definition>Anlage eines Kartenausschnitts</definition><bezug>Art. 8 GG; § 11 VershFG SG</bezug></xs:documentation></xs:annotation></xs:element></xs:sequence></xs:complexType><xs:complexType name="G17004014"><xs:sequence><xs:element name="F60000048" type="xs:date"><xs:annotation><xs:documentation><name>Anfang</name><definition>Beinhaltet das Datum des Anfangs eines Zeitraums.</definition><bezug>urn:xoev-de:kosit:xoev:kernkomponente:zeitraum vom 31.08.2020</bezug></xs:documentation></xs:annotation></xs:element><xs:element name="F17001348" type="xs:decimal"><xs:annotation><xs:documentation><name>Uhrzeit Start</name><bezug>div.</bezug></xs:documentation></xs:annotation></xs:element><xs:element name="F60000049" type="xs:date"><xs:annotation><xs:documentation><name>Ende</name><definition>Beinhaltet das Datum des Ende eines Zeitraums.</definition><bezug>urn:xoev-de:kosit:xoev:kernkomponente:zeitraum vom 31.08.2020</bezug></xs:documentation></xs:annotation></xs:element><xs:element name="F17001349" type="xs:decimal"><xs:annotation><xs:documentation><name>Uhrzeit Abschluss</name><bezug>div.</bezug></xs:documentation></xs:annotation></xs:element></xs:sequence></xs:complexType><xs:complexType name="G17005413"><xs:sequence><xs:element name="F60000243" type="xs:string"><xs:annotation><xs:documentation><name>Straße</name><beschreibung>Kompatibilität zu EPA in TR XhD v 1.4 sollte Feldlänge min. 50. Bei XInneres 8 ist die Feldlänge <= 55 Zeichen.</beschreibung><bezug>XInneres.Meldeanschrift.strasse Version 8</bezug></xs:documentation></xs:annotation></xs:element><xs:element minOccurs="0" name="F60000244" type="xs:string"><xs:annotation><xs:documentation><name>Hausnummer</name><beschreibung>Die Modellierung aus XInneres wurde nicht 1:1 übernommen, um die Komplexität für die Ausfüllenden nicht zu hoch zu setzen. Es wurde darauf verzichtet für das Ende von Hausnummernbereichen eigene Felder zu modellieren. Daher ist die Feldlänge hier heraufgesetzt und eine entsprechende Beschreibung wurde eingefügt. Die Feldlänge setzt sich aus der maximalen Feldlänge zweier Hausnummern (jeweils 4), zweier Buchstaben (jeweils 1) und eines Zeichen (-) zusammen.</beschreibung><definition>Es sind die Ziffern und Buchstabeneiner Hausnummer anzugeben. Eine Hausnummer dient der genauen Lokalisierung eines Grundstücks, Gebäudes oder Gebäudeteils (Eingang) in einer Straße. Geben Sie Hausnummernbereiche immer nach folgendem Beispiel ohne Leerzeichen an: 12a-14d</definition><bezug>XInneres.Meldeanschrift.hausnummer Version 8</bezug></xs:documentation></xs:annotation></xs:element><xs:element name="F60000246" type="xs:string"><xs:annotation><xs:documentation><name>Postleitzahl</name><definition>Es ist die Postleitzahl anzugeben.
 -
 -Der Typ dieses Elements ist eine Einschränkung des Basistyps String.Latin.</definition><bezug>XInneres.Meldeanschrift.postleitzahl Version 8</bezug></xs:documentation></xs:annotation></xs:element><xs:element name="F60000247" type="xs:string"><xs:annotation><xs:documentation><name>Ort</name><beschreibung>Kompatibilität zu EPA in TR XhD v 1.4 sollte Feldlänge min. 44. Laut PAuswV 2*25 = 50 Zeichen. Laut Xinneres.Meldeanschrift.Wohnort Version 8 = 40 Zeichen.
 -Laut BSI TR-03123 ≤ 105 Zeichen.</beschreibung><definition>Enthält den Namen eines Ortes (Gemeinde, Ortschaft oder Stadt).</definition><bezug>§ 5 (2) Nr. 9 PAuswG vom 21.6.2019; Anhang 3 Abschnitt 1 (Wohnort) PAuswV vom 28.9.2017; Tabelle 11 BSI TR-03123, Version 1.5.1; Xinneres.Meldeanschrift.Wohnort Version 8; XOEV.Kernkomponente.Anschrift.ort vom 31.01.2020</bezug></xs:documentation></xs:annotation></xs:element><xs:element minOccurs="0" name="G17005405" type="xfd:G17005405"><xs:annotation><xs:documentation><name>Karte Versammlungsort</name><definition>Anlage eines Kartenausschnitts</definition><bezug>Art. 8 GG; § 11 VershFG SG</bezug></xs:documentation></xs:annotation></xs:element></xs:sequence></xs:complexType></xs:schema> \ No newline at end of file diff --git a/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimBasedAdapterTest.java b/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimBasedAdapterTest.java deleted file mode 100644 index 1a09b6a2ef3428543a3981d71f8aa8d38aaf5235..0000000000000000000000000000000000000000 --- a/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimBasedAdapterTest.java +++ /dev/null @@ -1,46 +0,0 @@ -package de.ozgcloud.eingang.fim; - -import static org.assertj.core.api.Assertions.*; - -import java.util.Optional; - -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; - -import de.ozgcloud.eingang.common.formdata.FormData.Representations; -import de.ozgcloud.eingang.common.formdata.FormDataControlTestFactory; - -class FimBasedAdapterTest { - - @InjectMocks - private FimBasedAdapter adapter; - - @Nested - class TestGetEntryPoint { - - @Test - void shouldReturnPrimaryRepresentation() { - var result = adapter.getEntryPoint(FormDataControlTestFactory.create()); - - assertThat(result).isEqualTo(FormDataControlTestFactory.PRIMARY_FORM_DATA_REPRESENTATION); - } - - @Test - void shouldReturnDefaultOnMissingRepresentations() { - var result = adapter.getEntryPoint(FormDataControlTestFactory.createBuilder().representations(Optional.empty()).build()); - - assertThat(result).isEqualTo(FimBasedAdapter.DEFAULT_FORMDATA_REPRESENTATION_NAME); - } - - @Test - void shouldReturnDefaultOnMissingPrimary() { - var control = FormDataControlTestFactory.createBuilder().representations(Optional.of(Representations.builder().build())).build(); - - var result = adapter.getEntryPoint(control); - - assertThat(result).isEqualTo(FimBasedAdapter.DEFAULT_FORMDATA_REPRESENTATION_NAME); - } - } - -} diff --git a/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimServiceITCase.java b/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimServiceITCase.java deleted file mode 100644 index d48cd2d4a98d2fa477c3b066b8680b2d25cb3c46..0000000000000000000000000000000000000000 --- a/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimServiceITCase.java +++ /dev/null @@ -1,199 +0,0 @@ -package de.ozgcloud.eingang.fim; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; - -import java.io.File; -import java.io.IOException; -import java.util.List; -import java.util.Map; - -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; - -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.ImportAutoConfiguration; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.ActiveProfiles; -import org.w3c.dom.Document; -import org.xml.sax.SAXException; - -import de.ozgcloud.common.test.ITCase; -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.common.formdata.FormDataTestFactory; -import de.ozgcloud.eingang.common.formdata.FormHeader; -import de.ozgcloud.eingang.common.formdata.IncomingFile; - -@ITCase -@ActiveProfiles({ "itcase", "test" }) -@ImportAutoConfiguration -@SpringBootTest(classes = FimTestConfig.class) -public class FimServiceITCase { - - @Autowired - private FimService fimService; - - @Autowired - private FimBasedAdapter fimBasedAdapter; - - @Test - void shouldFailOnEmptyScheme() { - assertThatThrownBy(() -> { - final Document document = loadDocument("src/test/resources/test1.xml"); - fimService.transformDocument(document, FormData.builder().build()); - }).isInstanceOf(FimException.class).hasMessage("XML Document does not provide a scheme"); - } - - @Test - void shouldNoFindInvalidScheme() { - final FimScheme scheme = fimService.getSchemeForIdentifier("test"); - - assertThat(FimSchemeIdentifier.fromString("unknown")).isEqualTo(scheme.getIdentifier()); - } - - @Test - void shouldFindVersammlungsScheme() { - final FimScheme scheme = fimService.getSchemeForIdentifier("urn:xoev-de:xfall:standard:fim-s17000652_1.4"); - assertThat(scheme).isNotNull(); - } - - @Test - void shouldFindTest2Scheme() { - final FimScheme scheme = fimService.getSchemeForIdentifier("test2"); - assertThat(scheme).isNotNull(); - } - - @Test - void shouldTransformSimpleDocument() throws ParserConfigurationException, IOException, SAXException { - final Document document = loadDocument("src/test/resources/test2.xml"); - final FormData formData = fimService.transformDocument(document, FormData.builder().build()); - - final Map<String, Object> expected = Map.of( - "xs:fim.S1235", Map.of("label", "Testkey", "value", "Testvalue"), - "xs:fim.S1236", Map.of("label", "xs:fim.S1236", "value", "Testvalue 2")); - assertThat(expected).isEqualTo(formData.getFormData()); - } - - @Test - void shouldTransformSimpleDocumentWithoutNamespace() throws ParserConfigurationException, IOException, SAXException { - final Document document = loadDocument("src/test/resources/test3.xml"); - final FormData formData = fimService.transformDocument(document, FormData.builder().build()); - - final Map<String, Object> expected = Map.of( - "fim.S1235", Map.of("label", "Testkey", "value", "Testvalue"), - "fim.S1236", Map.of("label", "fim.S1236", "value", "Testvalue 2")); - assertThat(expected).isEqualTo(formData.getFormData()); - } - - @Test - void shouldTransformDocument() throws ParserConfigurationException, IOException, SAXException { - final Document document = loadDocument("src/test/resources/S17000652V1.4_test01.xml"); - FormData formData = fimService.transformDocument(document, FormData.builder().build()); - - assertThat(formData).isNotNull(); - - final Map<String, Object> expected = Map.of( - "xfd:G17003529", Map.of( - "label", "EfA|SH Standard", - "value", Map.of( - "xfd:G05001479", Map.of( - "label", "nachrichtenkopf", - "value", Map.of( - "xfd:G05001480", Map.of( - "label", "identifikation.nachricht", - "value", Map.of( - "xfd:F05002750", - Map.of("label", "nachrichtenUUID", "value", "d447e43a-5723-4821-a170-cb44d2dbf143"), - "xfd:F05002751", - Map.of("label", "erstellungszeitpunkt", "value", "2022-08-15T09:30:47"), - "xfd:F05002752", - Map.of("label", "nachrichtentyp", "value", "fim.S17000652.17000652001004"), - "xfd:F05002753", - Map.of("label", "dienstname", "value", "urn:fim:Versammlungsanzeige:1.4"))), - "xfd:G05001481", Map.of( - "label", "Leser", - "value", Map.of( - "xfd:F05002754", Map.of("label", "Organisationsname", "value", "Celle"), - "xfd:F05002755", - Map.of("label", "Organisationsschlüssel", "value", "vbe:010550120100"), - "xfd:F05002756", Map.of("label", "Kategorie", "value", "Versammlungsbehörde"))), - "xfd:G05001482", Map.of( - "label", "Autor", - "value", Map.of( - "xfd:F05002754", - Map.of("label", "Organisationsname", "value", - "OSI-Onlinedienst Niedersachsen Versammlungsanzeige"), - "xfd:F05002755", - Map.of("label", "Organisationsschlüssel", "value", "vbe:010550120100"), - "xfd:F05002756", - Map.of("label", "Kategorie", "value", "Engagement- und Hobbyportal"))))), - "xfd:F17005454", Map.of("label", "Datenschutzhinweis DSGVO", "value", "true"), - "xfd:F17005455", Map.of("label", "Zustimmung zu einem digitalen Bescheid", "value", "true"), - "xfd:F17005533", Map.of("label", "UUID", "value", "String"))), - "xfd:F17009191", Map.of("label", "Anzeige durch Person", "value", "true"), - "xfd:F17003371", Map.of("label", "Anzeigenart", "value", "String")); - - assertThat(expected).isEqualTo(formData.getFormData()); - } - - @Test - void shouldFallbackUnknownScheme() { - IncomingFile r1 = IncomingFile.builder().name("src/test/resources/test3/Antrag.xml").file(new File("src/test/resources/test3/Antrag.xml")) - .build(); - IncomingFile r2 = IncomingFile.builder().name("src/test/resources/test3/fim_xtaMetadata.xml").build(); - final FormData initialFormData = FormDataTestFactory.createBuilder().formData(null) - .header(FormHeader.builder().channel("XTA").formEngineName("FIM").build()) - .representations(List.of(r1, r2)).build(); - - FormData formData = fimBasedAdapter.parseFormData(initialFormData); - - assertThat(formData).isNotNull(); - - final Map<String, Object> expected = Map.of( - "xfd:G17003529", Map.of( - "label", "xfd:G17003529", - "value", Map.of( - "xfd:G05001479", Map.of( - "label", "xfd:G05001479", - "value", Map.of( - "xfd:G05001480", Map.of( - "label", "xfd:G05001480", - "value", Map.of( - "xfd:F05002750", - Map.of("label", "xfd:F05002750", "value", "d447e43a-5723-4821-a170-cb44d2dbf143"), - "xfd:F05002751", Map.of("label", "xfd:F05002751", "value", "2022-08-15T09:30:47"), - "xfd:F05002752", - Map.of("label", "xfd:F05002752", "value", "fim.S17000652.17000652001004"), - "xfd:F05002753", - Map.of("label", "xfd:F05002753", "value", "urn:fim:Versammlungsanzeige:1.4"))), - "xfd:G05001481", Map.of( - "label", "xfd:G05001481", - "value", Map.of( - "xfd:F05002754", Map.of("label", "xfd:F05002754", "value", "Celle"), - "xfd:F05002755", Map.of("label", "xfd:F05002755", "value", "vbe:010550120100"), - "xfd:F05002756", Map.of("label", "xfd:F05002756", "value", "Versammlungsbehörde"))), - "xfd:G05001482", Map.of( - "label", "xfd:G05001482", - "value", Map.of( - "xfd:F05002754", - Map.of("label", "xfd:F05002754", "value", - "OSI-Onlinedienst Niedersachsen Versammlungsanzeige"), - "xfd:F05002755", Map.of("label", "xfd:F05002755", "value", "vbe:010550120100"), - "xfd:F05002756", - Map.of("label", "xfd:F05002756", "value", "Engagement- und Hobbyportal"))))), - "xfd:F17005454", Map.of("label", "xfd:F17005454", "value", "true"), - "xfd:F17005455", Map.of("label", "xfd:F17005455", "value", "true"), - "xfd:F17005533", Map.of("label", "xfd:F17005533", "value", "String"))), - "xfd:F17009191", Map.of("label", "xfd:F17009191", "value", "true"), - "xfd:F17003371", Map.of("label", "xfd:F17003371", "value", "String")); - - assertThat(formData.getFormData()).usingRecursiveComparison().isEqualTo(expected); - } - - private Document loadDocument(final String path) throws ParserConfigurationException, IOException, SAXException { - final DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); - return builder.parse(new File(path)); - } -} diff --git a/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimTestConfig.java b/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimTestConfig.java deleted file mode 100644 index 8e88e6f0ae161bffefca00daaef61bb3871a508a..0000000000000000000000000000000000000000 --- a/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimTestConfig.java +++ /dev/null @@ -1,11 +0,0 @@ -package de.ozgcloud.eingang.fim; - -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; - -@Configuration -@EnableAutoConfiguration -@ComponentScan("de.ozgcloud.eingang") -public class FimTestConfig { -} diff --git a/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/TestNonStandardAdapter.java b/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/TestNonStandardAdapter.java deleted file mode 100644 index 76b10a4ca043b8c31e834a9ea57f45cf6074fa95..0000000000000000000000000000000000000000 --- a/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/TestNonStandardAdapter.java +++ /dev/null @@ -1,23 +0,0 @@ -package de.ozgcloud.eingang.fim; - -import org.springframework.stereotype.Service; -import org.w3c.dom.Element; -import org.w3c.dom.NodeList; - -import java.util.Optional; - -@Service -public class TestNonStandardAdapter extends FimSchemeAdapter { - - public FimSchemeIdentifier forIdentifier() { - return FimSchemeIdentifier.fromString("test2"); - } - - public Optional<String> getNameForElement(final Element element) { - final NodeList nameTags = element.getElementsByTagName("non-standard-name"); - if (nameTags.getLength() != 1) { - return Optional.empty(); - } - return Optional.ofNullable(nameTags.item(0).getTextContent()); - } -} diff --git a/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/ZustaendigeStelleMapperTest.java b/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/ZustaendigeStelleMapperTest.java deleted file mode 100644 index 23fa26757fccee0f45863f256e9f34522ccae81c..0000000000000000000000000000000000000000 --- a/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/ZustaendigeStelleMapperTest.java +++ /dev/null @@ -1,44 +0,0 @@ -package de.ozgcloud.eingang.fim; - -import static org.assertj.core.api.Assertions.*; - -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; - -import de.ozgcloud.eingang.common.formdata.FormDataTestFactory; -import de.ozgcloud.eingang.common.formdata.FormMetaDataTestFactory; -import de.ozgcloud.eingang.common.formdata.ZustaendigeStelle; - -class ZustaendigeStelleMapperTest { - - @InjectMocks - private ZustaendigeStelleMapper mapper; - - @Test - void shouldSetOrganisationsEinheitId() { - var parsed = mapper.parseFormData(FormDataTestFactory.createBuilder().clearZustaendigeStelles().build()); - - assertThat(parsed.getZustaendigeStelles()).hasSize(1).first().extracting(ZustaendigeStelle::getOrganisationseinheitenId) - .isEqualTo(FormMetaDataTestFactory.OE_ID); - -// assertThat(parsed.getZustaendigeStelle().getOrganisationseinheitenId()).isEqualTo(FormMetaDataTestFactory.OE_ID); - } - - @Test - void shouldWorkWithoutGivenZustaendigeStelle() { - var parsed = mapper.parseFormData(FormDataTestFactory.createBuilder().clearZustaendigeStelles().build()); - - assertThat(parsed.getZustaendigeStelles()).hasSize(1).first().extracting(ZustaendigeStelle::getOrganisationseinheitenId) - .isNotNull(); - -// assertThat(parsed.getZustaendigeStelle()).isNotNull(); - } - - @Test - void shouldIgnoreMalformedDestinationId() { - var oeid = mapper.extractOrganisationsEinheitId("quatsch"); - - assertThat(oeid).isEmpty(); - } - -} diff --git a/fim-adapter/src/test/resources/S17000652V1.4_test01.xml b/fim-adapter/src/test/resources/S17000652V1.4_test01.xml deleted file mode 100644 index ca52ce6942015abe0833fb0c7849103070bf1ddf..0000000000000000000000000000000000000000 --- a/fim-adapter/src/test/resources/S17000652V1.4_test01.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!--XML-Beispieldatei von XMLSpy generiert v2024 (x64) (http://www.altova.com)--> -<xfd:fim.S17000652.17000652001004 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xfd="urn:xoev-de:xfall:standard:fim-s17000652_1.4" xsi:schemaLocation="urn:xoev-de:xfall:standard:fim-s17000652_1.4 S17000652V1.4_xfall.xsd"> - <xfd:G17003529> - <xfd:G05001479> - <xfd:G05001480> - <xfd:F05002750>d447e43a-5723-4821-a170-cb44d2dbf143</xfd:F05002750> - <xfd:F05002751>2022-08-15T09:30:47</xfd:F05002751> - <xfd:F05002752>fim.S17000652.17000652001004</xfd:F05002752> - <xfd:F05002753>urn:fim:Versammlungsanzeige:1.4</xfd:F05002753> - </xfd:G05001480> - <xfd:G05001481> - <xfd:F05002754>Celle</xfd:F05002754> - <xfd:F05002755>vbe:010550120100</xfd:F05002755> - <xfd:F05002756>Versammlungsbehörde</xfd:F05002756> - </xfd:G05001481> - <xfd:G05001482> - <xfd:F05002754>OSI-Onlinedienst Niedersachsen Versammlungsanzeige</xfd:F05002754> - <xfd:F05002755>vbe:010550120100</xfd:F05002755> - <xfd:F05002756>Engagement- und Hobbyportal</xfd:F05002756> - </xfd:G05001482> - </xfd:G05001479> - <xfd:F17005454>true</xfd:F17005454> - <xfd:F17005455>true</xfd:F17005455> - <xfd:F17005533>String</xfd:F17005533> - </xfd:G17003529> - <xfd:F17009191>true</xfd:F17009191> - <xfd:F17003371>String</xfd:F17003371> -</xfd:fim.S17000652.17000652001004> diff --git a/fim-adapter/src/test/resources/application-test.yml b/fim-adapter/src/test/resources/application-test.yml deleted file mode 100644 index 148c1af75dbdac7d1dff1c5632d01cf06dae9a83..0000000000000000000000000000000000000000 --- a/fim-adapter/src/test/resources/application-test.yml +++ /dev/null @@ -1,4 +0,0 @@ -fim: - schemeLocations: - - fim-s17000652_1.4/S17000652V1.4_xfall.xsd - - test2/test2.xsd \ No newline at end of file diff --git a/fim-adapter/src/test/resources/test1.xml b/fim-adapter/src/test/resources/test1.xml deleted file mode 100644 index c6cdfdff3da2ba3dc0f88112f8cfaecc6075e731..0000000000000000000000000000000000000000 --- a/fim-adapter/src/test/resources/test1.xml +++ /dev/null @@ -1,3 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<xs:fim> -</xs:fim> diff --git a/fim-adapter/src/test/resources/test2.xml b/fim-adapter/src/test/resources/test2.xml deleted file mode 100644 index 2f0cc4f8bea8e30285f6169ce07494e6beac535d..0000000000000000000000000000000000000000 --- a/fim-adapter/src/test/resources/test2.xml +++ /dev/null @@ -1,5 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<xs:fim.S1234 xmlns:xs="test2" xsi:schemaLocation="test2"> - <xs:fim.S1235>Testvalue</xs:fim.S1235> - <xs:fim.S1236>Testvalue 2</xs:fim.S1236> -</xs:fim.S1234> diff --git a/fim-adapter/src/test/resources/test2/test2.xsd b/fim-adapter/src/test/resources/test2/test2.xsd deleted file mode 100644 index 6df2999b50614b63360e97517f4a880c136a8132..0000000000000000000000000000000000000000 --- a/fim-adapter/src/test/resources/test2/test2.xsd +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<xs:schema xmlns:xfd="test2" xmlns:xs="http://www.w3.org/2001/XMLSchema" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="test2"> - <xs:element name="fim.S1234"> - <xs:annotation><xs:documentation><non-standard-name>Test-Fim-Data</non-standard-name></xs:documentation></xs:annotation> - </xs:element> - <xs:element name="fim.S1235"> - <xs:annotation><xs:documentation><non-standard-name>Testkey</non-standard-name></xs:documentation></xs:annotation> - </xs:element> -</xs:schema> \ No newline at end of file diff --git a/fim-adapter/src/test/resources/test3.xml b/fim-adapter/src/test/resources/test3.xml deleted file mode 100644 index c00618791b8e8cf12a435c98733ced256bc61eab..0000000000000000000000000000000000000000 --- a/fim-adapter/src/test/resources/test3.xml +++ /dev/null @@ -1,5 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<fim.S1234 xmlns="test2" xsi:schemaLocation="test2"> - <fim.S1235>Testvalue</fim.S1235> - <fim.S1236>Testvalue 2</fim.S1236> -</fim.S1234> diff --git a/fim-adapter/src/test/resources/test3/Antrag.xml b/fim-adapter/src/test/resources/test3/Antrag.xml deleted file mode 100644 index 461b8089fd72a1ed3087b78143020c3336ec5947..0000000000000000000000000000000000000000 --- a/fim-adapter/src/test/resources/test3/Antrag.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!--XML-Beispieldatei von XMLSpy generiert v2024 (x64) (http://www.altova.com)--> -<xfd:fim.S17000652.17000652001004 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xfd="empty" xsi:schemaLocation="empty"> - <xfd:G17003529> - <xfd:G05001479> - <xfd:G05001480> - <xfd:F05002750>d447e43a-5723-4821-a170-cb44d2dbf143</xfd:F05002750> - <xfd:F05002751>2022-08-15T09:30:47</xfd:F05002751> - <xfd:F05002752>fim.S17000652.17000652001004</xfd:F05002752> - <xfd:F05002753>urn:fim:Versammlungsanzeige:1.4</xfd:F05002753> - </xfd:G05001480> - <xfd:G05001481> - <xfd:F05002754>Celle</xfd:F05002754> - <xfd:F05002755>vbe:010550120100</xfd:F05002755> - <xfd:F05002756>Versammlungsbehörde</xfd:F05002756> - </xfd:G05001481> - <xfd:G05001482> - <xfd:F05002754>OSI-Onlinedienst Niedersachsen Versammlungsanzeige</xfd:F05002754> - <xfd:F05002755>vbe:010550120100</xfd:F05002755> - <xfd:F05002756>Engagement- und Hobbyportal</xfd:F05002756> - </xfd:G05001482> - </xfd:G05001479> - <xfd:F17005454>true</xfd:F17005454> - <xfd:F17005455>true</xfd:F17005455> - <xfd:F17005533>String</xfd:F17005533> - </xfd:G17003529> - <xfd:F17009191>true</xfd:F17009191> - <xfd:F17003371>String</xfd:F17003371> -</xfd:fim.S17000652.17000652001004> diff --git a/fim-adapter/src/test/resources/test3/fim_xtaMetadata.xml b/fim-adapter/src/test/resources/test3/fim_xtaMetadata.xml deleted file mode 100644 index 645ff9797ce644d64e873d3afae523e60297fd1b..0000000000000000000000000000000000000000 --- a/fim-adapter/src/test/resources/test3/fim_xtaMetadata.xml +++ /dev/null @@ -1,49 +0,0 @@ -a<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing"> - <s:Header> - <a:Action s:mustUnderstand="1">http://www.osci.eu/ws/2008/05/transport/urn/messageTypes/MsgBoxFetchRequest</a:Action> - <h:MsgBoxResponse MsgBoxRequestID="urn:de:xta:messageid:dataport_xta_210:3d280bfa-d790-4865-a6cf-f6656d7be13f" xmlns:h="http://www.osci.eu/ws/2008/05/transport" xmlns="http://www.osci.eu/ws/2008/05/transport" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> - <ItemsPending>0</ItemsPending> - </h:MsgBoxResponse> - <h:MessageMetaData xmlns:h="http://www.osci.eu/ws/2014/10/transport" xmlns="http://www.osci.eu/ws/2014/10/transport"> - <DeliveryAttributes> - <InitialSend>2024-03-21T08:56:35.214+01:00</InitialSend> - <Delivery>2024-03-21T08:56:38.417</Delivery> - </DeliveryAttributes> - <Originators> - <Author> - <Identifier type="xoev" name="Dataport" category="Engagement- und Hobbyportal">ehp:010100100000</Identifier> - </Author> - </Originators> - <Destinations> - <Reader> - <Identifier type="xoev" name="L100012.OE.279550874" category="Versammlungsbehörde">vbe:010550120100</Identifier> - </Reader> - </Destinations> - <MsgIdentification> - <MessageID xmlns="http://www.w3.org/2005/08/addressing">urn:de:xta:messageid:dataport_xta_210:3d280bfa-d790-4865-a6cf-f6656d7be13f</MessageID> - </MsgIdentification> - <Qualifier> - <Service>urn:fim:Versammlungsanzeige:1.4</Service> - <BusinessScenario> - <Defined listURI="urn:de:dataport:codeliste:business.scenario" listVersionID="1"> - <code xmlns="">FIM_DATA</code> - </Defined> - </BusinessScenario> - <MessageType listURI="urn:de:payloadSchema:elementName" listVersionID="1.0" payloadSchema="urn:xoev-de:xfall:standard:fim-s17000652_1.4"> - <code xmlns="">fim.S17000652.17000652001004</code> - <name xmlns="">fim.S17000652.17000652001004</name> - </MessageType> - </Qualifier> - <MsgSize>1738</MsgSize> - </h:MessageMetaData> - </s:Header> - <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> - <GenericContentContainer xmlns="http://xoev.de/transport/xta/211"> - <ContentContainer> - <Message contentType="application/xml" filename="Antrag.xml" size="1738"> - <xop:Include href="cid:http://tempuri.org/1/638485107771249372" xmlns:xop="http://www.w3.org/2004/08/xop/include"/> - </Message> - </ContentContainer> - </GenericContentContainer> - </s:Body> -</s:Envelope> \ No newline at end of file diff --git a/formcycle-adapter/formcycle-adapter-impl/pom.xml b/formcycle-adapter/formcycle-adapter-impl/pom.xml deleted file mode 100644 index f8f93592773647bc7af3dd8de299b2eda40b865e..0000000000000000000000000000000000000000 --- a/formcycle-adapter/formcycle-adapter-impl/pom.xml +++ /dev/null @@ -1,135 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- - - Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - Ministerpräsidenten des Landes Schleswig-Holstein - Staatskanzlei - Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - - Lizenziert unter der EUPL, Version 1.2 oder - sobald - diese von der Europäischen Kommission genehmigt wurden - - Folgeversionen der EUPL ("Lizenz"); - Sie dürfen dieses Werk ausschließlich gemäß - dieser Lizenz nutzen. - Eine Kopie der Lizenz finden Sie hier: - - https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - - Sofern nicht durch anwendbare Rechtsvorschriften - gefordert oder in schriftlicher Form vereinbart, wird - die unter der Lizenz verbreitete Software "so wie sie - ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - ausdrücklich oder stillschweigend - verbreitet. - Die sprachspezifischen Genehmigungen und Beschränkungen - unter der Lizenz sind dem Lizenztext zu entnehmen. - ---> -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> - <modelVersion>4.0.0</modelVersion> - <parent> - <groupId>de.ozgcloud.eingang</groupId> - <artifactId>formcycle-adapter</artifactId> - <version>2.16.0-SNAPSHOT</version> - <relativePath>../</relativePath> - </parent> - - <artifactId>formcycle-adapter-impl</artifactId> - <name>EM - Formcycle Adapter - Implementation</name> - - <properties> - <formcycle-interface.version>${project.version}</formcycle-interface.version> - <jsoup.version>1.17.2</jsoup.version> - </properties> - - <dependencies> - <!--own project--> - <dependency> - <groupId>de.ozgcloud.eingang</groupId> - <artifactId>formcycle-adapter-interface</artifactId> - <version>${formcycle-interface.version}</version> - </dependency> - <dependency> - <groupId>de.ozgcloud.eingang</groupId> - <artifactId>semantik-adapter</artifactId> - </dependency> - <dependency> - <groupId>de.ozgcloud.eingang</groupId> - <artifactId>common</artifactId> - <type>test-jar</type> - <scope>test</scope> - </dependency> - <dependency> - <groupId>de.ozgcloud.vorgang</groupId> - <artifactId>vorgang-manager-utils</artifactId> - </dependency> - <dependency> - <groupId>de.ozgcloud.vorgang</groupId> - <artifactId>vorgang-manager-utils</artifactId> - <type>test-jar</type> - <scope>test</scope> - </dependency> - - <!--spring--> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-web</artifactId> - </dependency> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-actuator</artifactId> - </dependency> - - <dependency> - <groupId>org.jsoup</groupId> - <artifactId>jsoup</artifactId> - <version>${jsoup.version}</version> - </dependency> - </dependencies> - - <build> - <plugins> - <plugin> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-maven-plugin</artifactId> - </plugin> - - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-surefire-plugin</artifactId> - </plugin> - - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-failsafe-plugin</artifactId> - </plugin> - - <plugin> - <groupId>org.jacoco</groupId> - <artifactId>jacoco-maven-plugin</artifactId> - </plugin> - </plugins> - </build> - - <profiles> - <profile> - <id>ci-build</id> - <build> - <plugins> - <plugin> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-maven-plugin</artifactId> - <executions> - <execution> - <id>build-image</id> - <phase>install</phase> - <goals> - <goal>build-image-no-fork</goal> - </goals> - </execution> - </executions> - </plugin> - </plugins> - </build> - </profile> - </profiles> -</project> diff --git a/formcycle-adapter/formcycle-adapter-impl/src/main/java/de/ozgcloud/eingang/formcycle/FormCycleFormDataMapper.java b/formcycle-adapter/formcycle-adapter-impl/src/main/java/de/ozgcloud/eingang/formcycle/FormCycleFormDataMapper.java deleted file mode 100644 index 8db87c762e8ec704b791b8744f3182f2fcd63a8e..0000000000000000000000000000000000000000 --- a/formcycle-adapter/formcycle-adapter-impl/src/main/java/de/ozgcloud/eingang/formcycle/FormCycleFormDataMapper.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.formcycle; - -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; - -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.vorgang.common.grpc.GrpcFormDataMapper; - -@Mapper(uses = GrpcFormDataMapper.class) -public interface FormCycleFormDataMapper { - - @Mapping(target = "antragsteller", ignore = true) - @Mapping(target = "attachment", ignore = true) - @Mapping(target = "attachments", ignore = true) - @Mapping(target = "id", ignore = true) - @Mapping(target = "numberOfAttachments", ignore = true) - @Mapping(target = "numberOfRepresentations", ignore = true) - @Mapping(target = "representation", ignore = true) - @Mapping(target = "representations", ignore = true) - @Mapping(target = "zustaendigeStelle.organisationseinheitenId", source = "header.organisationsEinheitId") - @Mapping(target = "header.formEngineName", constant = "FormCycle") - @Mapping(target = "header.createdAt", source = "header.receivedAt") - @Mapping(target = "header.requestId", source = "header.requestId", defaultExpression = "java(java.util.UUID.randomUUID().toString())") - FormData toFormData(FormCycleFormData fcFormData); -} diff --git a/formcycle-adapter/formcycle-adapter-impl/src/main/java/de/ozgcloud/eingang/formcycle/FormCycleServiceKontoMapper.java b/formcycle-adapter/formcycle-adapter-impl/src/main/java/de/ozgcloud/eingang/formcycle/FormCycleServiceKontoMapper.java deleted file mode 100644 index 5185c70c92b3dff61db99fa0458be3019195a840..0000000000000000000000000000000000000000 --- a/formcycle-adapter/formcycle-adapter-impl/src/main/java/de/ozgcloud/eingang/formcycle/FormCycleServiceKontoMapper.java +++ /dev/null @@ -1,40 +0,0 @@ -package de.ozgcloud.eingang.formcycle; - -import java.util.Collections; -import java.util.List; - -import org.apache.commons.lang3.StringUtils; -import org.mapstruct.CollectionMappingStrategy; -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; -import org.mapstruct.ReportingPolicy; - -import de.ozgcloud.eingang.common.formdata.ServiceKonto; -import de.ozgcloud.eingang.common.formdata.ServiceKonto.PostfachAddress; -import de.ozgcloud.eingang.common.formdata.StringBasedIdentifier; -import de.ozgcloud.eingang.semantik.common.ServiceKontoFactory; - -@Mapper(collectionMappingStrategy = CollectionMappingStrategy.ADDER_PREFERRED, unmappedTargetPolicy = ReportingPolicy.WARN) -interface FormCycleServiceKontoMapper { - - @Mapping(target = "postfachAddress", ignore = true) - @Mapping(target = "type", constant = ServiceKontoFactory.POSTFACH_TYPE_BAYERN_ID) - @Mapping(target = "postfachAddresses", expression = "java(fromGrpcPostfachAddresses(serviceKonto))") - ServiceKonto fromGrpc(FormCycleServiceKonto serviceKonto); - - default String fromString(String str) { - return StringUtils.trimToNull(str); - } - - default List<PostfachAddress> fromGrpcPostfachAddresses(FormCycleServiceKonto serviceKonto) { - return serviceKonto.hasAddress() ? List.of(fromGrpc(serviceKonto.getAddress())) : Collections.emptyList(); - } - - @Mapping(target = "type", ignore = true) - @Mapping(target = "identifier", expression = "java(buildIdentifier(postfachAddress.getIdentifier()))") - PostfachAddress fromGrpc(FormCyclePostfachAddress postfachAddress); - - default StringBasedIdentifier buildIdentifier(String identifier) { - return StringBasedIdentifier.builder().postfachId(identifier).build(); - } -} \ No newline at end of file diff --git a/formcycle-adapter/formcycle-adapter-impl/src/main/java/de/ozgcloud/eingang/formcycle/FormDataController.java b/formcycle-adapter/formcycle-adapter-impl/src/main/java/de/ozgcloud/eingang/formcycle/FormDataController.java deleted file mode 100644 index 128fc4e36b078af117bafc7a7747b984888b4f3c..0000000000000000000000000000000000000000 --- a/formcycle-adapter/formcycle-adapter-impl/src/main/java/de/ozgcloud/eingang/formcycle/FormDataController.java +++ /dev/null @@ -1,162 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.formcycle; - -import java.io.IOException; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; -import java.util.UUID; - -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestPart; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.multipart.MultipartFile; - -import de.ozgcloud.common.binaryfile.TempFileUtils; -import de.ozgcloud.common.errorhandling.TechnicalException; -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.common.formdata.IncomingFile; -import de.ozgcloud.eingang.common.formdata.IncomingFileGroup; -import de.ozgcloud.eingang.common.vorgang.VorgangNummerSupplier; -import de.ozgcloud.eingang.semantik.SemantikAdapter; -import de.ozgcloud.eingang.semantik.enginebased.FilesMapperHelper; -import lombok.RequiredArgsConstructor; -import lombok.extern.log4j.Log4j2; - -@Log4j2 -@Controller -@ResponseBody -@RequestMapping("formData") -@RequiredArgsConstructor -class FormDataController { - - public static final String HTTP_TYPE_PROTOBUF = "application/x-protobuf"; - - private final FormCycleFormDataMapper mapper; - private final SemantikAdapter semantikAdapter; - private final VorgangNummerSupplier vorgangNummerSupplier; - private final FormDataHtmlCleaner formDataHtmlCleaner; - private final FormCycleServiceKontoMapper serviceKontoMapper; - - @PostMapping(consumes = "multipart/form-data", produces = HTTP_TYPE_PROTOBUF) - public FormCycleConfirmationResponse receiveFormData(@RequestPart FormCycleFormData formData, - @RequestPart(required = false) Optional<Collection<MultipartFile>> representations, - @RequestPart(required = false) Optional<Collection<MultipartFile>> attachments) { - - FormData mappedFormData = mapper.toFormData(formData); - mappedFormData = formDataHtmlCleaner.clean(mappedFormData); - mappedFormData = addRepresentations(representations, mappedFormData); - mappedFormData = addFiles(formData, attachments, mappedFormData); - mappedFormData = addServiceKonto(formData, mappedFormData); - mappedFormData = addVorgangNummer(mappedFormData); - - semantikAdapter.processFormData(mappedFormData); - - return FormCycleConfirmationResponse.newBuilder().setVorgangNummer(mappedFormData.getHeader().getVorgangNummer()).build(); - } - - private FormData addVorgangNummer(FormData mappedFormData) { - var formDataHeader = mappedFormData.getHeader().toBuilder().vorgangNummer(vorgangNummerSupplier.get()).build(); - return mappedFormData.toBuilder().header(formDataHeader).build(); - } - - private FormData addRepresentations(Optional<Collection<MultipartFile>> files, FormData mappedFormData) { - Collection<IncomingFile> representations = buildIncomingFiles(files); - return mappedFormData.toBuilder().representations(representations).numberOfRepresentations(representations.size()).build(); - } - - private Collection<IncomingFile> buildIncomingFiles(Optional<Collection<MultipartFile>> files) { - return files.orElseGet(Collections::emptyList).stream().map(this::buildIncomingFile).toList(); - } - - FormData addFiles(FormCycleFormData inFormData, Optional<Collection<MultipartFile>> attachments, FormData mappedFormData) { - var groups = new AttachmentGroupsBuilder(inFormData.getAttachmentGroupList(), attachments).buildGroups(); - - return mappedFormData.toBuilder().attachments(groups).numberOfAttachments(FilesMapperHelper.countAttachedFiles(groups)).build(); - } - - private IncomingFile buildIncomingFile(MultipartFile multipartFile) { - try { - return IncomingFile.builder() - .id(UUID.randomUUID().toString()) - .name(multipartFile.getOriginalFilename()) - .size(multipartFile.getSize()) - .contentType(multipartFile.getContentType()) - .file(TempFileUtils.writeTmpFile(multipartFile.getInputStream())) - .build(); - } catch (IOException e) { - throw new TechnicalException("Error reading incoming file", e); - } - } - - class AttachmentGroupsBuilder { - - private final Collection<FormCycleAttachmentGroup> attachmentGroups; - private final Map<String, IncomingFile> nameToFile = new HashMap<>(); - - public AttachmentGroupsBuilder(Collection<FormCycleAttachmentGroup> attachmentGroups, Optional<Collection<MultipartFile>> attachmentFiles) { - this.attachmentGroups = attachmentGroups; - - attachmentFiles.ifPresent(files -> files.stream().map(FormDataController.this::buildIncomingFile) - .forEach(file -> nameToFile.put(file.getName(), file))); - } - - public Collection<IncomingFileGroup> buildGroups() { - return attachmentGroups.stream().map(this::buildGroup).toList(); - } - - IncomingFileGroup buildGroup(FormCycleAttachmentGroup group) { - var groupBuilder = IncomingFileGroup.builder().name(group.getName()); - - group.getFileIdList().stream().map(this::getFile) - .filter(Optional::isPresent).map(Optional::get) - .forEach(groupBuilder::file); - - return groupBuilder.build(); - } - - Optional<IncomingFile> getFile(String name) { - var file = nameToFile.get(name); - - if (Objects.isNull(file)) { - LOG.warn("Cannot find Attachment-File with name '{}'.", name); - return Optional.empty(); - } - return Optional.of(file); - } - } - - FormData addServiceKonto(FormCycleFormData formData, FormData mappedFormData) { - if (formData.hasServiceKonto()) { - mappedFormData.getHeader().setServiceKonto(serviceKontoMapper.fromGrpc(formData.getServiceKonto())); - } - return mappedFormData; - } -} \ No newline at end of file diff --git a/formcycle-adapter/formcycle-adapter-impl/src/main/java/de/ozgcloud/eingang/formcycle/FormDataHtmlCleaner.java b/formcycle-adapter/formcycle-adapter-impl/src/main/java/de/ozgcloud/eingang/formcycle/FormDataHtmlCleaner.java deleted file mode 100644 index 7ad155733dbc3f2ccce5aefd9b454b5bf10424fd..0000000000000000000000000000000000000000 --- a/formcycle-adapter/formcycle-adapter-impl/src/main/java/de/ozgcloud/eingang/formcycle/FormDataHtmlCleaner.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (C) 2023 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.formcycle; - -import java.util.Collection; -import java.util.Map; -import java.util.stream.Collectors; - -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; -import org.jsoup.safety.Safelist; -import org.springframework.stereotype.Component; -import org.springframework.web.util.HtmlUtils; - -import de.ozgcloud.eingang.common.formdata.FormData; - -@Component -public class FormDataHtmlCleaner { - - public FormData clean(FormData formData) { - return formData.toBuilder().formData(cleanFormData(formData.getFormData())).build(); - } - - Map<String, Object> cleanFormData(Map<String, Object> formData) { - return formData.entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, entry -> cleanValue(entry.getValue()))); - } - - @SuppressWarnings("unchecked") - Object cleanValue(Object value) { - if (value instanceof Map) { - return cleanFormData((Map<String, Object>) value); - } else if (value instanceof Collection<?> values) { - return values.stream().map(this::cleanValue).toList(); - } else if (value instanceof String valueString) { - return parseHtml(valueString); - } - return value; - } - - String parseHtml(String html) { - var outputSettings = new Document.OutputSettings(); // keep new lines - outputSettings.prettyPrint(false); - var htmlText = Jsoup.clean(replaceNewLines(html), "", Safelist.none(), outputSettings); - return HtmlUtils.htmlUnescape(htmlText); - } - - private String replaceNewLines(String html) { - return html.replace("\\\\n", "\n"); - } -} diff --git a/formcycle-adapter/formcycle-adapter-impl/src/main/java/de/ozgcloud/eingang/formcycle/FormcycleAdapterApplication.java b/formcycle-adapter/formcycle-adapter-impl/src/main/java/de/ozgcloud/eingang/formcycle/FormcycleAdapterApplication.java deleted file mode 100644 index dddbd8f53cba6ef112fe68bc79e5689ebb89100b..0000000000000000000000000000000000000000 --- a/formcycle-adapter/formcycle-adapter-impl/src/main/java/de/ozgcloud/eingang/formcycle/FormcycleAdapterApplication.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.formcycle; - -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.TimeZone; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.Bean; -import org.springframework.http.MediaType; -import org.springframework.http.converter.protobuf.ProtobufHttpMessageConverter; - -import de.ozgcloud.eingang.formcycle.common.errorhandling.FormcycleExceptionHandler; -import de.ozgcloud.eingang.formcycle.common.protobuf.CustomProtobufHttpMessageConverter; -import de.ozgcloud.eingang.semantik.enginebased.EngineBasedSemantikAdapter; -import de.ozgcloud.eingang.semantik.enginebased.formcycle.FormCycleEngineBasedAdapter; - -@SpringBootApplication(scanBasePackages = { "de.ozgcloud" }) -public class FormcycleAdapterApplication { - - public static void main(String[] args) { - TimeZone.setDefault(TimeZone.getTimeZone("UTC")); - SpringApplication.run(FormcycleAdapterApplication.class, args); - } - - @Bean - EngineBasedSemantikAdapter engineBasedAdapter() { - return new FormCycleEngineBasedAdapter(); - } - - @Bean - ProtobufHttpMessageConverter protobufMessageConverter() { - return addCustomProtobufMediaType(new CustomProtobufHttpMessageConverter()); - } - - @Deprecated(forRemoval = true, since = "2.1.0") - // FIXME: Remove this method after all customers have updated ozg-cloud plugin to version 1.4.0 or higher - private ProtobufHttpMessageConverter addCustomProtobufMediaType(ProtobufHttpMessageConverter protobufHttpMessageConverter) { - var supportetMediaTypes = new ArrayList<>(protobufHttpMessageConverter.getSupportedMediaTypes()); - supportetMediaTypes.add(new MediaType("application", "protobuf", StandardCharsets.UTF_8)); - protobufHttpMessageConverter.setSupportedMediaTypes(supportetMediaTypes); - return protobufHttpMessageConverter; - } - - @Bean - FormcycleExceptionHandler restResposeEntityExceptionHandler() { - return new FormcycleExceptionHandler(); - } -} diff --git a/formcycle-adapter/formcycle-adapter-impl/src/main/java/de/ozgcloud/eingang/formcycle/common/errorhandling/FormcycleExceptionHandler.java b/formcycle-adapter/formcycle-adapter-impl/src/main/java/de/ozgcloud/eingang/formcycle/common/errorhandling/FormcycleExceptionHandler.java deleted file mode 100644 index d98bdc6aaf6a18ee25015f577945b356205ae3a2..0000000000000000000000000000000000000000 --- a/formcycle-adapter/formcycle-adapter-impl/src/main/java/de/ozgcloud/eingang/formcycle/common/errorhandling/FormcycleExceptionHandler.java +++ /dev/null @@ -1,74 +0,0 @@ -package de.ozgcloud.eingang.formcycle.common.errorhandling; - -import java.util.UUID; - -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.ControllerAdvice; -import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.context.request.WebRequest; -import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler; - -import de.ozgcloud.common.errorhandling.ExceptionUtil; -import de.ozgcloud.common.errorhandling.TechnicalException; -import io.grpc.StatusRuntimeException; -import lombok.extern.log4j.Log4j2; - -@ControllerAdvice -@Log4j2 -public class FormcycleExceptionHandler extends ResponseEntityExceptionHandler { - - static final String TECHNICAL_EXCEPTION_MESSAGE = "Cannot process request."; - static final String CREATE_VORGANG_EXCEPTION_MESSAGE = "Cannot create vorgang."; - static final String UNEXPECTED_EXCEPTION_MESSAGE = "An unexpected error occurred."; - - private static final String EXCEPTION_ID_TEMPLATE = "(ExceptionId:"; - - @ExceptionHandler({ TechnicalException.class }) - public ResponseEntity<InternalExceptionDto> handleTechnicalException(TechnicalException e, WebRequest request) { - LOG.error(TECHNICAL_EXCEPTION_MESSAGE, e); - return buildResponseEntity(TECHNICAL_EXCEPTION_MESSAGE, e.getExceptionId()); - } - - @ExceptionHandler({ StatusRuntimeException.class }) - public ResponseEntity<InternalExceptionDto> handleStatusRuntimeException(StatusRuntimeException e, WebRequest request) { - var logMessage = TECHNICAL_EXCEPTION_MESSAGE; - var exceptionId = getExceptionId(e.getMessage()); - if (!hasExceptionId(e.getMessage())) { - logMessage = ExceptionUtil.formatMessageWithExceptionId(CREATE_VORGANG_EXCEPTION_MESSAGE, exceptionId); - } - LOG.error(logMessage, e); - return buildResponseEntity(CREATE_VORGANG_EXCEPTION_MESSAGE, exceptionId); - } - - boolean hasExceptionId(String message) { - return message.contains(EXCEPTION_ID_TEMPLATE); - } - - String getExceptionId(String message) { - try { - return message.substring(message.indexOf(EXCEPTION_ID_TEMPLATE) + 14, message.indexOf(")")); - } catch (IndexOutOfBoundsException e) { - return createExceptionId(); - } - } - - @ExceptionHandler({ RuntimeException.class }) - public ResponseEntity<InternalExceptionDto> handleUnexpectedException(RuntimeException e, WebRequest request) { - var exceptionId = createExceptionId(); - var messageWithExceptionId = ExceptionUtil.formatMessageWithExceptionId(UNEXPECTED_EXCEPTION_MESSAGE, exceptionId); - LOG.error(messageWithExceptionId, e); - return buildResponseEntity(UNEXPECTED_EXCEPTION_MESSAGE, exceptionId); - } - - String createExceptionId() { - return UUID.randomUUID().toString(); - } - - ResponseEntity<InternalExceptionDto> buildResponseEntity(String message, String exceptionId) { - return ResponseEntity.internalServerError().body(buildInternalExceptionDto(message, exceptionId)); - } - - InternalExceptionDto buildInternalExceptionDto(String message, String exceptionId) { - return InternalExceptionDto.builder().message(message).exceptionId(exceptionId).build(); - } -} diff --git a/formcycle-adapter/formcycle-adapter-impl/src/main/java/de/ozgcloud/eingang/formcycle/common/errorhandling/InternalExceptionDto.java b/formcycle-adapter/formcycle-adapter-impl/src/main/java/de/ozgcloud/eingang/formcycle/common/errorhandling/InternalExceptionDto.java deleted file mode 100644 index 9e72ccd3baee345ffa744753b3bf01c189caa247..0000000000000000000000000000000000000000 --- a/formcycle-adapter/formcycle-adapter-impl/src/main/java/de/ozgcloud/eingang/formcycle/common/errorhandling/InternalExceptionDto.java +++ /dev/null @@ -1,12 +0,0 @@ -package de.ozgcloud.eingang.formcycle.common.errorhandling; - -import lombok.Builder; -import lombok.Getter; - -@Builder -@Getter -public class InternalExceptionDto { - - private String exceptionId; - private String message; -} diff --git a/formcycle-adapter/formcycle-adapter-impl/src/main/java/de/ozgcloud/eingang/formcycle/common/protobuf/CustomProtobufHttpMessageConverter.java b/formcycle-adapter/formcycle-adapter-impl/src/main/java/de/ozgcloud/eingang/formcycle/common/protobuf/CustomProtobufHttpMessageConverter.java deleted file mode 100644 index 6a6ab8e0fca7eb2ac7111aef84ec2d2c6039bcc4..0000000000000000000000000000000000000000 --- a/formcycle-adapter/formcycle-adapter-impl/src/main/java/de/ozgcloud/eingang/formcycle/common/protobuf/CustomProtobufHttpMessageConverter.java +++ /dev/null @@ -1,19 +0,0 @@ -package de.ozgcloud.eingang.formcycle.common.protobuf; - -import java.io.IOException; - -import org.springframework.http.HttpInputMessage; -import org.springframework.http.converter.protobuf.ProtobufHttpMessageConverter; - -import com.google.protobuf.Message; - -@Deprecated(forRemoval = true, since = "2.1.0") -// FIXME: Remove this class after all customers have updated ozg-cloud plugin to version 1.4.0 or higher -public class CustomProtobufHttpMessageConverter extends ProtobufHttpMessageConverter { - - @Override - protected Message readInternal(Class<? extends Message> clazz, HttpInputMessage inputMessage) throws IOException { - inputMessage.getHeaders().setContentType(ProtobufHttpMessageConverter.PROTOBUF); - return super.readInternal(clazz, inputMessage); - } -} diff --git a/formcycle-adapter/formcycle-adapter-impl/src/main/resources/application-local.yml b/formcycle-adapter/formcycle-adapter-impl/src/main/resources/application-local.yml deleted file mode 100644 index 1a493ac915649ada101d24a2374ca06690101907..0000000000000000000000000000000000000000 --- a/formcycle-adapter/formcycle-adapter-impl/src/main/resources/application-local.yml +++ /dev/null @@ -1,21 +0,0 @@ -logging: - config: classpath:log4j2-local.xml - -server: - port: 9293 - error: - include-stacktrace: always - -management: - server.port: 8084 - -ozgcloud: - adapter: - targetVorgangManagerName: local - fallbackStrategy: DENY - -grpc: - client: - vorgang-manager-local: - address: static://127.0.0.1:9090 - negotiationType: PLAINTEXT diff --git a/formcycle-adapter/formcycle-adapter-impl/src/main/resources/application.yml b/formcycle-adapter/formcycle-adapter-impl/src/main/resources/application.yml deleted file mode 100644 index fc501824af18517fcbd7eab7f3d7ad33cf08ff7e..0000000000000000000000000000000000000000 --- a/formcycle-adapter/formcycle-adapter-impl/src/main/resources/application.yml +++ /dev/null @@ -1,46 +0,0 @@ -logging: - level: - ROOT: WARN - '[de.ozgcloud]': INFO - -spring: - profiles: - include: formcycle - servlet: - multipart: - max-file-size: 124MB - max-request-size: 256MB - file-size-threshold: 10MB - -server: - http2: - enabled: true - error: - include-stacktrace: never - -management: - server: - port: 8081 - health: - livenessState: - enabled: true - readinessState: - enabled: true - endpoint: - health: - group: - exploratory: - include: livenessState,readinessState,ping - show-details: always - probes: - enabled: true - prometheus: - enabled: true - endpoints: - web: - exposure: - include: health,prometheus - -ozgcloud: - adapter: - routingStrategy: SINGLE \ No newline at end of file diff --git a/formcycle-adapter/formcycle-adapter-impl/src/main/resources/banner.txt b/formcycle-adapter/formcycle-adapter-impl/src/main/resources/banner.txt deleted file mode 100644 index b3aff18646e90346d8b8f41f395afef037986afc..0000000000000000000000000000000000000000 --- a/formcycle-adapter/formcycle-adapter-impl/src/main/resources/banner.txt +++ /dev/null @@ -1,6 +0,0 @@ - _____ ___ ____ __ __ ______ ______ _ _____ -| ___/ _ \| _ \| \/ |/ ___\ \ / / ___| | | ____| -| |_ | | | | |_) | |\/| | | \ V / | | | | _| -| _|| |_| | _ <| | | | |___ | || |___| |___| |___ -|_| \___/|_| \_\_| |_|\____| |_| \____|_____|_____| -${spring-boot.version} ${application.version} diff --git a/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/ozgcloud/eingang/formcycle/FormCycleAttachmentGroupTestFactory.java b/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/ozgcloud/eingang/formcycle/FormCycleAttachmentGroupTestFactory.java deleted file mode 100644 index 0d7eed096bf428fb629215a40a7946b6c21599dc..0000000000000000000000000000000000000000 --- a/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/ozgcloud/eingang/formcycle/FormCycleAttachmentGroupTestFactory.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.formcycle; - -import de.ozgcloud.eingang.common.formdata.IncomingFileGroupTestFactory; -import de.ozgcloud.eingang.common.formdata.IncomingFileTestFactory; - -public class FormCycleAttachmentGroupTestFactory { - - static FormCycleAttachmentGroup create() { - return createBuilder().build(); - } - - static FormCycleAttachmentGroup.Builder createBuilder() { - return FormCycleAttachmentGroup.newBuilder() - .setName(IncomingFileGroupTestFactory.NAME) - .addFileId(IncomingFileTestFactory.NAME); - } -} diff --git a/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/ozgcloud/eingang/formcycle/FormCycleFormDataMapperTest.java b/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/ozgcloud/eingang/formcycle/FormCycleFormDataMapperTest.java deleted file mode 100644 index 077a22039a5d9da064404d03e2ec4c24b6584915..0000000000000000000000000000000000000000 --- a/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/ozgcloud/eingang/formcycle/FormCycleFormDataMapperTest.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.formcycle; - -import static org.assertj.core.api.Assertions.*; - -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.mapstruct.factory.Mappers; -import org.mockito.InjectMocks; -import org.mockito.Spy; - -import de.ozgcloud.eingang.common.formdata.FormHeaderTestFactory; -import de.ozgcloud.eingang.common.formdata.ZustaendigeStelle; -import de.ozgcloud.vorgang.common.grpc.GrpcFormDataMapper; - -class FormCycleFormDataMapperTest { - - @InjectMocks - private FormCycleFormDataMapper mapper = Mappers.getMapper(FormCycleFormDataMapper.class); - - @Spy - private GrpcFormDataMapper formDataMapper = Mappers.getMapper(GrpcFormDataMapper.class); - - @Nested - class TestToFormData { - - @Test - void shouldMapHeader() { - var expectedFormHeader = FormHeaderTestFactory.create(); - - var mapped = mapper.toFormData(FormCycleFormDataTestFactory.create()); - - assertThat(mapped.getHeader()).usingRecursiveComparison() - .ignoringFields("vorgangNummer", "sender", "formEngineName", "serviceKonto").isEqualTo(expectedFormHeader); - } - - @Test - void shouldMapZustaendigeStelle() { - var mapped = mapper.toFormData(FormCycleFormDataTestFactory.create()); - - assertThat(mapped.getZustaendigeStelles()) - .extracting(ZustaendigeStelle::getOrganisationseinheitenId) - .containsExactly(FormCycleFormHeaderTestFactory.ORGANISATIONSEINHEIT_ID); - } - } - -} diff --git a/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/ozgcloud/eingang/formcycle/FormCycleFormDataTestFactory.java b/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/ozgcloud/eingang/formcycle/FormCycleFormDataTestFactory.java deleted file mode 100644 index 369bc8a1651603190ff0daee48e0dd4a1625e340..0000000000000000000000000000000000000000 --- a/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/ozgcloud/eingang/formcycle/FormCycleFormDataTestFactory.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.formcycle; - -import de.ozgcloud.eingang.common.formdata.IncomingFileGroupTestFactory; -import de.ozgcloud.eingang.formcycle.FormCycleFormData.Builder; -import de.ozgcloud.vorgang.common.grpc.GrpcFormDataTestFactory; -import de.ozgcloud.vorgang.vorgang.GrpcFormData; - -public class FormCycleFormDataTestFactory { - - public static final FormCycleServiceKonto SERVICE_KONTO = FormCycleServiceKontoTestFactory.create(); - - public static FormCycleFormData create() { - return createBuilder().build(); - } - - public static Builder createBuilder() { - return FormCycleFormData.newBuilder() - .setHeader(FormCycleFormHeaderTestFactory.create()) - .setServiceKonto(SERVICE_KONTO) - .setFormData(GrpcFormDataTestFactory.create()) - .addAttachmentGroup(FormCycleAttachmentGroup.newBuilder() - .setName(IncomingFileGroupTestFactory.NAME) - .addFileId(IncomingFileGroupTestFactory.VENDOR_ID_XXX) - .build()); - } - - public static FormCycleFormData withFormData(GrpcFormData formData) { - return createBuilder().clearFormData().setFormData(formData).build(); - } -} \ No newline at end of file diff --git a/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/ozgcloud/eingang/formcycle/FormCycleFormHeaderTestFactory.java b/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/ozgcloud/eingang/formcycle/FormCycleFormHeaderTestFactory.java deleted file mode 100644 index 3065efa67f043925acf7204557ede13253660b10..0000000000000000000000000000000000000000 --- a/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/ozgcloud/eingang/formcycle/FormCycleFormHeaderTestFactory.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.formcycle; - -import de.ozgcloud.eingang.common.formdata.FormHeaderTestFactory; -import de.ozgcloud.eingang.formcycle.FormCycleFormHeader.Builder; - -public class FormCycleFormHeaderTestFactory { - - static final String RECEIVED_AT = FormHeaderTestFactory.CREATED_AT_STR; - static final String ORGANISATIONSEINHEIT_ID = "9030229"; - - static FormCycleFormHeader create() { - return createBuilder().build(); - } - - static Builder createBuilder() { - return FormCycleFormHeader.newBuilder() - .setRequestId(FormHeaderTestFactory.REQUEST_ID) - .setFormName(FormHeaderTestFactory.FORM_NAME) - .setReceivedAt(RECEIVED_AT) - .setFormId(FormHeaderTestFactory.FORM_ID) - .setOrganisationsEinheitId(ORGANISATIONSEINHEIT_ID); - } -} diff --git a/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/ozgcloud/eingang/formcycle/FormCyclePostfachAddressTestFactory.java b/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/ozgcloud/eingang/formcycle/FormCyclePostfachAddressTestFactory.java deleted file mode 100644 index 5744864496aab362d4758109487b5343c91bd63f..0000000000000000000000000000000000000000 --- a/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/ozgcloud/eingang/formcycle/FormCyclePostfachAddressTestFactory.java +++ /dev/null @@ -1,22 +0,0 @@ -package de.ozgcloud.eingang.formcycle; - -import java.util.UUID; - -import de.ozgcloud.eingang.common.formdata.PostfachAddressTestFactory; -import de.ozgcloud.eingang.formcycle.FormCyclePostfachAddress.Builder; - -public class FormCyclePostfachAddressTestFactory { - - public static final String POSTKORB_ID = UUID.randomUUID().toString(); - public static final String VERSION = PostfachAddressTestFactory.VERSION; - - static FormCyclePostfachAddress create() { - return createBuilder().build(); - } - - static Builder createBuilder() { - return FormCyclePostfachAddress.newBuilder() - .setIdentifier(POSTKORB_ID) - .setVersion(VERSION); - } -} diff --git a/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/ozgcloud/eingang/formcycle/FormCycleServiceKontoMapperTest.java b/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/ozgcloud/eingang/formcycle/FormCycleServiceKontoMapperTest.java deleted file mode 100644 index 562bd419be832ff41a59fd1eb2215ed32961d2bd..0000000000000000000000000000000000000000 --- a/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/ozgcloud/eingang/formcycle/FormCycleServiceKontoMapperTest.java +++ /dev/null @@ -1,94 +0,0 @@ -package de.ozgcloud.eingang.formcycle; - -import static org.assertj.core.api.Assertions.*; - -import org.apache.commons.lang3.StringUtils; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.mapstruct.factory.Mappers; - -import de.ozgcloud.eingang.common.formdata.ServiceKonto.PostfachAddress; -import de.ozgcloud.eingang.common.formdata.ServiceKontoTestFactory; -import de.ozgcloud.eingang.common.formdata.StringBasedIdentifier; -import de.ozgcloud.eingang.semantik.common.ServiceKontoFactory; - -class FormCycleServiceKontoMapperTest { - - private final FormCycleServiceKontoMapper mapper = Mappers.getMapper(FormCycleServiceKontoMapper.class); - - @DisplayName("From grpc serviceKonto") - @Nested - class TestFromGrpcServiceKonto { - - @Test - void shouldMapType() { - var result = mapper.fromGrpc(FormCycleServiceKontoTestFactory.create()); - - assertThat(result.getType()).isEqualTo(ServiceKontoFactory.POSTFACH_TYPE_BAYERN_ID); - } - - @DisplayName("trustLevel") - @Nested - class TestTrustLevel { - - @Test - void shouldMap() { - var serviceKonto = mapper.fromGrpc(FormCycleServiceKontoTestFactory.create()); - - assertThat(serviceKonto.getTrustLevel()).isEqualTo(ServiceKontoTestFactory.TRUST_LEVEL); - } - - @Test - void shouldMapAsNullIfEmpty() { - var serviceKontoWithEmptyTrustLevel = FormCycleServiceKontoTestFactory.createBuilder().setTrustLevel(StringUtils.EMPTY).build(); - - var serviceKonto = mapper.fromGrpc(serviceKontoWithEmptyTrustLevel); - - assertThat(serviceKonto.getTrustLevel()).isNull(); - } - } - - @Test - void shouldNotPostfachAddressIfNotExists() { - var serviceKonto = mapper.fromGrpc(FormCycleServiceKontoTestFactory.createBuilder().clearAddress().build()); - - assertThat(serviceKonto.getPostfachAddresses()).isEmpty(); - } - - @DisplayName("postfachAddress") - @Nested - class TestPostfachAddress { - - @Test - void shouldMapPostkorbId() { - var postfachAddress = mapPostfachAddressFromGrpc(); - - assertThat(((StringBasedIdentifier) postfachAddress.getIdentifier()).getPostfachId()) - .isEqualTo(FormCyclePostfachAddressTestFactory.POSTKORB_ID); - } - - @Test - void shouldMapIdentifier() { - var postfachAddress = mapPostfachAddressFromGrpc(); - - assertThat(getIdentifier(postfachAddress)).isEqualTo(FormCyclePostfachAddressTestFactory.POSTKORB_ID); - } - - private String getIdentifier(PostfachAddress postfachAddress) { - return ((StringBasedIdentifier) postfachAddress.getIdentifier()).getPostfachId(); - } - - @Test - void shouldMapVersion() { - var postfachAddress = mapPostfachAddressFromGrpc(); - - assertThat(postfachAddress.getVersion()).isEqualTo(FormCyclePostfachAddressTestFactory.VERSION); - } - - private PostfachAddress mapPostfachAddressFromGrpc() { - return mapper.fromGrpc(FormCycleServiceKontoTestFactory.create()).getPostfachAddresses().get(0); - } - } - } -} \ No newline at end of file diff --git a/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/ozgcloud/eingang/formcycle/FormCycleServiceKontoTestFactory.java b/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/ozgcloud/eingang/formcycle/FormCycleServiceKontoTestFactory.java deleted file mode 100644 index 74548a957b63b1099c06182af1160773d186e63f..0000000000000000000000000000000000000000 --- a/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/ozgcloud/eingang/formcycle/FormCycleServiceKontoTestFactory.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.formcycle; - -import java.util.UUID; - -import de.ozgcloud.eingang.common.formdata.ServiceKontoTestFactory; -import de.ozgcloud.eingang.formcycle.FormCycleServiceKonto.Builder; - -public class FormCycleServiceKontoTestFactory { - - public static final FormCyclePostfachAddress ADDRESS = FormCyclePostfachAddressTestFactory.create(); - public static final String TYPE = UUID.randomUUID().toString(); - - static FormCycleServiceKonto create() { - return createBuilder().build(); - } - - static Builder createBuilder() { - return FormCycleServiceKonto.newBuilder() - .setAddress(ADDRESS) - .setType(TYPE) - .setTrustLevel(ServiceKontoTestFactory.TRUST_LEVEL); - } -} diff --git a/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/ozgcloud/eingang/formcycle/FormDataControllerITCase.java b/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/ozgcloud/eingang/formcycle/FormDataControllerITCase.java deleted file mode 100644 index e3e878598707b5d02b85d7ef618ebd3b1f3b8cec..0000000000000000000000000000000000000000 --- a/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/ozgcloud/eingang/formcycle/FormDataControllerITCase.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.formcycle; - -import static de.ozgcloud.eingang.common.formdata.IncomingFileTestFactory.*; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; - -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.mock.web.MockMultipartFile; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.ResultActions; - -import de.ozgcloud.common.test.ITCase; -import de.ozgcloud.eingang.common.formdata.IncomingFileGroupTestFactory; -import de.ozgcloud.eingang.common.formdata.IncomingFileTestFactory; -import de.ozgcloud.eingang.semantik.SemantikAdapter; -import de.ozgcloud.vorgang.common.grpc.GrpcFormDataTestFactory; -import de.ozgcloud.vorgang.vorgang.GrpcFormField; -import de.ozgcloud.vorgang.vorgang.GrpcSubForm; -import lombok.SneakyThrows; - -@ITCase -//@SpringBootTest(properties = { -// "grpc.client.vorgang-manager-local.address=static://127.0.0.1:9090", -// "grpc.client.vorgang-manager-local.negotiationType=PLAINTEXT" -//}) -//@ActiveProfiles("itcase") -@AutoConfigureMockMvc -class FormDataControllerITCase { - - @Autowired - private MockMvc mockMvc; - - @MockBean - private SemantikAdapter semantikAdapter; - - @Nested - class ReceiveFormData { - - @Test - @SneakyThrows - void shouldProcessSuccessful() { - doPostRequest().andExpect(status().isOk()); - } - - @SneakyThrows - private ResultActions doPostRequest() { - return mockMvc.perform( - multipart("/formData") - .file(new MockMultipartFile("formData", null, FormDataController.HTTP_TYPE_PROTOBUF, buildTestFormData())) - .file(IncomingFileTestFactory.asMultipartFile("representations")) - .file(asMultipartFile("attachments", - createBuilder().name(IncomingFileGroupTestFactory.VENDOR_ID_XXX + "__" + NAME).build()))); - } - } - - private byte[] buildTestFormData() { - return FormDataControllerTest.buildTestFormData(FormCycleFormDataTestFactory.withFormData( - GrpcFormDataTestFactory.createBuilder() - .addField(GrpcFormField.newBuilder().setName("firstname").setLabel("Vorname").setValue("Theo").build()) - .addField(GrpcFormField.newBuilder().setName("lastname").setLabel("Nachname").setValue("Test").build()) - .addField(GrpcFormField.newBuilder().setName("Street").setLabel("Straße").setValue("Hwy 5").build()) - .addForm(GrpcSubForm.newBuilder() - .setTitle("Address").setLabel("Adresse") - .addField(GrpcFormField.newBuilder().setName("firstname").setLabel("Vorname").setValue("Theo").build()) - .addField(GrpcFormField.newBuilder().setName("lastname").setLabel("Nachname").setValue("Test").build()) - .addField(GrpcFormField.newBuilder().setName("street").setLabel("Straße").setValue("Hwy 5").build()) - .build()) - .build())); - } - -} diff --git a/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/ozgcloud/eingang/formcycle/FormDataControllerTest.java b/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/ozgcloud/eingang/formcycle/FormDataControllerTest.java deleted file mode 100644 index 4f753916fd0158272354fe94c32c9a19f006f26c..0000000000000000000000000000000000000000 --- a/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/ozgcloud/eingang/formcycle/FormDataControllerTest.java +++ /dev/null @@ -1,349 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.formcycle; - -import static de.ozgcloud.eingang.common.formdata.IncomingFileTestFactory.*; -import static org.assertj.core.api.Assertions.*; -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.*; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; - -import java.io.ByteArrayOutputStream; -import java.util.Collections; -import java.util.Optional; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.mockito.ArgumentCaptor; -import org.mockito.Captor; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Spy; -import org.springframework.http.converter.protobuf.ProtobufHttpMessageConverter; -import org.springframework.mock.web.MockMultipartFile; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.ResultActions; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; - -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.common.formdata.FormDataTestFactory; -import de.ozgcloud.eingang.common.formdata.FormHeader; -import de.ozgcloud.eingang.common.formdata.FormHeaderTestFactory; -import de.ozgcloud.eingang.common.formdata.IncomingFileGroupTestFactory; -import de.ozgcloud.eingang.common.formdata.IncomingFileTestFactory; -import de.ozgcloud.eingang.common.formdata.ServiceKonto; -import de.ozgcloud.eingang.common.formdata.ServiceKontoTestFactory; -import de.ozgcloud.eingang.common.vorgang.VorgangNummerSupplier; -import de.ozgcloud.eingang.semantik.SemantikAdapter; -import lombok.SneakyThrows; - -class FormDataControllerTest { - - @Spy - @InjectMocks - private FormDataController controller; - - @Mock - private FormCycleFormDataMapper mapper; - @Mock - private SemantikAdapter semantikAdapter; - @Mock - private VorgangNummerSupplier vorgangNummerSupplier; - @Mock - private FormDataHtmlCleaner htmlCleaner; - @Mock - private FormCycleServiceKontoMapper serviceKontoMapper; - - private MockMvc mockMvc; - - @BeforeEach - void init() { - mockMvc = MockMvcBuilders.standaloneSetup(controller) - .setMessageConverters(new ProtobufHttpMessageConverter()) - .build(); - } - - @Nested - class ReceiveFormData { - - private FormData mappedFormData = FormDataTestFactory.create(); - - @Captor - private ArgumentCaptor<FormData> formDataCaptor; - - @BeforeEach - void init() { - when(htmlCleaner.clean(any())).thenReturn(mappedFormData); - when(mapper.toFormData(any())).thenReturn(mappedFormData); - when(vorgangNummerSupplier.get()).thenReturn(FormHeaderTestFactory.VORGANG_NUMMER); - } - - @Test - void shouldReturnSuccess() throws Exception { - doPostRequest().andExpect(status().is2xxSuccessful()); - } - - @Test - void shouldCallVorgangNummerSupplier() { - doPostRequest(); - - verify(vorgangNummerSupplier).get(); - } - - @Test - @SneakyThrows - void shouldResponseWithVorgangNummer() { - - var confirmation = FormCycleConfirmationResponse.parseFrom( - doPostRequest().andReturn().getResponse().getContentAsByteArray()); - - assertThat(confirmation.getVorgangNummer()).isEqualTo(FormHeaderTestFactory.VORGANG_NUMMER); - } - - @Test - void shouldSetVorgangNummer() { - doPostRequest(); - - verify(semantikAdapter).processFormData(formDataCaptor.capture()); - assertThat(formDataCaptor.getValue().getHeader().getRequestId()).isEqualTo(FormHeaderTestFactory.REQUEST_ID); - } - - @Test - void shouldCallHtmlCleaner() { - doPostRequest(); - - verify(htmlCleaner).clean(mappedFormData); - } - - @Test - void shouldCallMapper() { - doPostRequest(); - - verify(mapper).toFormData(notNull()); - } - - @Test - void shouldCallSemantikAdapter() { - doPostRequest(); - - verify(semantikAdapter).processFormData(formDataCaptor.capture()); - assertThat(formDataCaptor.getValue()).usingRecursiveComparison() - .ignoringFields("representations", "attachments", "numberOfAttachments") - .isEqualTo(mappedFormData); - } - - @Test - void shouldCallAddServiceKonto() { - doReturn(mappedFormData).when(controller).addFiles(any(), any(), any()); - - doPostRequest(); - - verify(controller).addServiceKonto(notNull(), eq(mappedFormData)); - } - - @Nested - class Representations { - - @BeforeEach - void init() { - var formData = FormDataTestFactory.createBuilder().clearRepresentations().numberOfRepresentations(0).build(); - when(mapper.toFormData(any())).thenReturn(formData); - when(htmlCleaner.clean(any())).thenReturn(formData); - } - - @Test - void shouldBePresent() { - doPostRequest(); - - verify(semantikAdapter).processFormData(formDataCaptor.capture()); - var formData = formDataCaptor.getValue(); - assertThat(formData.getRepresentations()).hasSize(1); - assertThat(formData.getNumberOfRepresentations()).isEqualTo(1); - } - - @Test - void shouldBeFilled() { - doPostRequest(); - - verify(semantikAdapter).processFormData(formDataCaptor.capture()); - assertThat(formDataCaptor.getValue().getRepresentations()).first().usingRecursiveComparison() - .ignoringFields("id", "vendorId", "file") - .isEqualTo(IncomingFileTestFactory.create()); - } - - @Test - @SneakyThrows - void shouldBeFineWithoutRepresentations() { - mockMvc.perform( - multipart("/formData") - .file(new MockMultipartFile("formData", null, FormDataController.HTTP_TYPE_PROTOBUF, buildTestFormData()))) - .andExpect(status().isOk()); - } - } - - @Nested - class Attachments { - @BeforeEach - void init() { - var formData = FormDataTestFactory.createBuilder().clearAttachments().numberOfAttachments(0).build(); - when(mapper.toFormData(any())).thenReturn(formData); - when(htmlCleaner.clean(any())).thenReturn(formData); - } - - @Test - void shouldHaveGroup() { - doPostRequest(); - - verify(semantikAdapter).processFormData(formDataCaptor.capture()); - assertThat(formDataCaptor.getValue().getAttachments()).hasSize(1); - } - - @Test - void shouldSetNumberOfAttachments() { - doPostRequest(); - - verify(semantikAdapter).processFormData(formDataCaptor.capture()); - assertThat(formDataCaptor.getValue().getNumberOfAttachments()).isEqualTo(1); - } - - } - - @SneakyThrows - private ResultActions doPostRequest() { - return mockMvc.perform( - multipart("/formData") - .file(new MockMultipartFile("formData", null, FormDataController.HTTP_TYPE_PROTOBUF, buildTestFormData())) - .file(IncomingFileTestFactory.asMultipartFile("representations")) - .file(asMultipartFile("attachments", - createBuilder().name(IncomingFileGroupTestFactory.VENDOR_ID_XXX).build()))); - } - } - - @SneakyThrows - static byte[] buildTestFormData() { - return buildTestFormData(FormCycleFormDataTestFactory.create()); - } - - @SneakyThrows - static byte[] buildTestFormData(FormCycleFormData formData) { - var out = new ByteArrayOutputStream(); - formData.writeTo(out); - return out.toByteArray(); - } - - @Nested - class TestAttachmentGroupsBuilder { - - private FormDataController.AttachmentGroupsBuilder groupsBuilder; - - @BeforeEach - void init() { - groupsBuilder = controller.new AttachmentGroupsBuilder( - Collections.singleton(FormCycleAttachmentGroupTestFactory.create()), - Optional.of(Collections.singleton(IncomingFileTestFactory.asMultipartFile(NAME)))); - } - - @Nested - class TestBuildGroup { - @Test - void shouldSetName() { - var group = groupsBuilder.buildGroup(FormCycleAttachmentGroupTestFactory.create()); - - assertThat(group.getName()).isEqualTo(IncomingFileGroupTestFactory.NAME); - } - - @Test - void shouldHaveFile() { - var group = groupsBuilder.buildGroup(FormCycleAttachmentGroupTestFactory.create()); - - assertThat(group.getFiles()).hasSize(1).first() - .usingRecursiveComparison().ignoringFields("id", "vendorId", "file") - .isEqualTo(IncomingFileTestFactory.create()); - } - - @Test - void shouldBeFineWithoutFile() { - var group = groupsBuilder.buildGroup(FormCycleAttachmentGroupTestFactory.createBuilder().clearFileId().build()); - - assertThat(group.getFiles()).isEmpty(); - } - - @Test - void shouldBeFineWithMissingFile() { - var group = groupsBuilder.buildGroup(FormCycleAttachmentGroupTestFactory.createBuilder().clearFileId().addFileId("missing").build()); - - assertThat(group.getFiles()).isEmpty(); - } - } - } - - @DisplayName("Add serviceKonto") - @Nested - class TestServiceKontoMapping { - - @DisplayName("on existing") - @Nested - class TestOnExisting { - - private final ServiceKonto serviceKonto = ServiceKontoTestFactory.create(); - - @BeforeEach - void mock() { - when(serviceKontoMapper.fromGrpc(any(FormCycleServiceKonto.class))).thenReturn(serviceKonto); - } - - @Test - void shouldCallMapper() { - controller.addServiceKonto(FormCycleFormDataTestFactory.create(), buildEmptyFormDataWithHeader()); - - verify(serviceKontoMapper).fromGrpc(FormCycleFormDataTestFactory.SERVICE_KONTO); - } - - @Test - void shouldMapServiceKontoType() { - var formData = controller.addServiceKonto(FormCycleFormDataTestFactory.create(), buildEmptyFormDataWithHeader()); - - assertThat(getServiceKontoType(formData)).isEqualTo(ServiceKontoTestFactory.TYPE); - } - } - - @Test - void shouldBeNullIfNotExists() { - var formData = controller.addServiceKonto(FormCycleFormData.newBuilder().build(), buildEmptyFormDataWithHeader()); - - assertThat(formData.getHeader().getServiceKonto()).isNull(); - } - - private String getServiceKontoType(FormData formData) { - return formData.getHeader().getServiceKonto().getType(); - } - - private FormData buildEmptyFormDataWithHeader() { - return FormData.builder().header(FormHeader.builder().build()).build(); - } - } -} \ No newline at end of file diff --git a/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/ozgcloud/eingang/formcycle/FormDataHtmlCleanerITCase.java b/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/ozgcloud/eingang/formcycle/FormDataHtmlCleanerITCase.java deleted file mode 100644 index 8cfcd3e7db38c32f2d7f66740b0f2f5678f264bd..0000000000000000000000000000000000000000 --- a/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/ozgcloud/eingang/formcycle/FormDataHtmlCleanerITCase.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright (C) 2023 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.formcycle; - -import static org.assertj.core.api.Assertions.*; - -import java.util.Map; - -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Spy; - -import de.ozgcloud.eingang.common.formdata.FormDataTestFactory; - -class FormDataHtmlCleanerITCase { - - @Spy - @InjectMocks - private FormDataHtmlCleaner cleaner; - - static final String KEY_LABEL = "label"; - static final String KEY_VALUE = "value"; - - static final Map<String, Object> FORM_DATA_MAP = Map.of("tf1", Map.of( - KEY_LABEL, "<p><em>Label</em></p>", - KEY_VALUE, "<i>Value</i>"), - "fs1", Map.of( - KEY_LABEL, "Key", - KEY_VALUE, Map.of( - "tf3", Map.of( - KEY_LABEL, "<p><s>Label</s></p>", - KEY_VALUE, "ein Text mit <html><body><h1>Hello</h1><body><html>")), - "tf4", Map.of( - KEY_LABEL, "<p><span style=\"background-color:#1abc9c;\">Wichtig</span></p>", - KEY_VALUE, "Text"), - "ed1", Map.of( - KEY_LABEL, - "<ol>\n\t<li><em><strong><u>ganz</u></strong></em></li>\n\t<li><span style=\"color:#e74c3c;" - + "\">bunt</span></li>\n</ol>", - KEY_VALUE, "TExt\nmit\n Leerzeichen\nund\n Umbrüchen" - ))); - - static final Map<String, Object> EXPECTED_MAP = Map.of("tf1", Map.of( - KEY_LABEL, "Label", - KEY_VALUE, "Value"), - "fs1", Map.of( - KEY_LABEL, "Key", - KEY_VALUE, Map.of( - "tf3", Map.of( - KEY_LABEL, "Label", - KEY_VALUE, "ein Text mit Hello")), - "tf4", Map.of( - KEY_LABEL, "Wichtig", - KEY_VALUE, "Text"), - "ed1", Map.of( - KEY_LABEL, - "\n\tganz\n\tbunt\n", - KEY_VALUE, "TExt\nmit\n Leerzeichen\nund\n Umbrüchen" - ))); - - @Test - void shouldCleanHtml() { - var result = cleaner.clean(FormDataTestFactory.createBuilder().formData(FORM_DATA_MAP).build()); - - assertThat(result.getFormData()).usingRecursiveComparison().isEqualTo(EXPECTED_MAP); - } - -} \ No newline at end of file diff --git a/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/ozgcloud/eingang/formcycle/FormDataHtmlCleanerTest.java b/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/ozgcloud/eingang/formcycle/FormDataHtmlCleanerTest.java deleted file mode 100644 index ad1218279c8210b3ceb2b5c5036a23e0ddee6927..0000000000000000000000000000000000000000 --- a/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/ozgcloud/eingang/formcycle/FormDataHtmlCleanerTest.java +++ /dev/null @@ -1,205 +0,0 @@ -/* - * Copyright (C) 2023 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.formcycle; - -import static org.assertj.core.api.Assertions.*; -import static org.mockito.Mockito.*; - -import java.util.List; -import java.util.Map; - -import org.assertj.core.data.MapEntry; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.CsvSource; -import org.mockito.InjectMocks; -import org.mockito.Spy; - -import de.ozgcloud.eingang.common.formdata.FormData; - -class FormDataHtmlCleanerTest { - - private static final String KEY = "key"; - private static final Object VALUE = "value"; - - @Spy - @InjectMocks - private FormDataHtmlCleaner cleaner; - - @Nested - class TestClean { - - private final static Map<String, Object> FORM_DATA_MAP = Map.of(KEY, VALUE); - private final static FormData FORM_DATA = FormData.builder().formData(FORM_DATA_MAP).build(); - - @Test - void shouldCallCleanFormData() { - cleaner.clean(FORM_DATA); - - verify(cleaner).cleanFormData(FORM_DATA_MAP); - } - - @Test - void shouldSetCleanedFormData() { - var cleanedFormData = Map.of(KEY, VALUE); - doReturn(cleanedFormData).when(cleaner).cleanFormData(anyMap()); - - var result = cleaner.clean(FORM_DATA); - - assertThat(result.getFormData()).isSameAs(cleanedFormData); - } - } - - @Nested - class TestCleanFormData { - - @Test - void shouldCallCleanValue() { - cleaner.cleanFormData(Map.of(KEY, VALUE)); - - verify(cleaner).cleanValue(VALUE); - } - - @Test - void shouldReturnCleanedMap() { - var cleanedValue = "noHtml"; - doReturn(cleanedValue).when(cleaner).cleanValue(any()); - - var result = cleaner.cleanFormData(Map.of(KEY, VALUE)); - - assertThat(result).containsOnly(MapEntry.entry(KEY, cleanedValue)); - } - } - - @Nested - class TestCleanValue { - - @Nested - class TestCleanMap { - - @Test - void shouldCallCleanFormData() { - var expectedMap = Map.of(KEY, VALUE); - - cleaner.cleanValue(expectedMap); - - verify(cleaner).cleanFormData(expectedMap); - } - - @Test - void shouldReturnValue() { - var expectedMap = Map.of(KEY, VALUE); - doReturn(expectedMap).when(cleaner).cleanFormData(anyMap()); - - var result = cleaner.cleanValue(Map.of("a", "b")); - - assertThat(result).isSameAs(expectedMap); - } - } - - @Nested - class TestCleanCollection { - - @Test - void shouldCallCleanValue() { - cleaner.cleanValue(List.of(VALUE)); - - verify(cleaner).cleanValue(VALUE); - } - - @Test - void shouldReturnValue() { - doReturn(List.of(VALUE)).when(cleaner).cleanValue(any()); - - var result = cleaner.cleanValue(List.of("a")); - - assertThat(result).isInstanceOf(List.class).asList().containsExactly(VALUE); - } - } - - @Nested - class TestCleanString { - - @Test - void shouldCallParseHtml() { - var stringValue = VALUE.toString(); - - cleaner.cleanValue(VALUE); - - verify(cleaner).parseHtml(stringValue); - } - - @Test - void shouldReturnValue() { - var cleanedValue = "noHtml"; - doReturn(cleanedValue).when(cleaner).parseHtml(anyString()); - - var result = cleaner.cleanValue(VALUE); - - assertThat(result).isEqualTo(cleanedValue); - } - } - - @Test - void shouldReturnUnmodifiedValue() { - var value = 1; - - var result = cleaner.cleanValue(value); - - assertThat(result).isEqualTo(1); - verify(cleaner, never()).parseHtml(any()); - } - } - - @Nested - class TestParseHtml { - - @Test - void shouldParseHtml() { - var result = cleaner.parseHtml("<html><body><h1>Hello</h1><body><html>"); - - assertThat(result).isEqualTo("Hello"); - } - - @DisplayName("should decode german characters") - @ParameterizedTest(name = "{0} => {2}") - @CsvSource({ "Ä, Ä", "Ö, Ö", "Ü, Ü", "ß, ß" }) - void shouldDecodeUmlaut(String srcValue, String expectedValue) { - var result = cleaner.parseHtml(srcValue); - - assertThat(result).isEqualTo(expectedValue); - } - - @DisplayName("should decode special characters") - @ParameterizedTest(name = "{0} => {1}") - @CsvSource(value = { "&, &", "<, <,", ">, >", "", \"", "', '" }, quoteCharacter = '`') - void shouldDecodeAmpersand(String src, String expected) { - var result = cleaner.parseHtml(src); - - assertThat(result).isEqualTo(expected); - } - } -} \ No newline at end of file diff --git a/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/ozgcloud/eingang/formcycle/FormcycleAdapterApplicationTest.java b/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/ozgcloud/eingang/formcycle/FormcycleAdapterApplicationTest.java deleted file mode 100644 index 194937da4c1bed21bdcc90396bf047a510d259c6..0000000000000000000000000000000000000000 --- a/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/ozgcloud/eingang/formcycle/FormcycleAdapterApplicationTest.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.formcycle; - -import org.junit.jupiter.api.Test; - -import de.ozgcloud.common.test.ITCase; - -@ITCase -class FormcycleAdapterApplicationTest { - - @Test - void shouldStartApplication() { // NOSONAR - // just start without an error - } - -} diff --git a/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/ozgcloud/eingang/formcycle/common/errorhandling/FormcycleExceptionHandlerTest.java b/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/ozgcloud/eingang/formcycle/common/errorhandling/FormcycleExceptionHandlerTest.java deleted file mode 100644 index f5e8ffaf282d688e800ab64cd87d57a478c0fd81..0000000000000000000000000000000000000000 --- a/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/ozgcloud/eingang/formcycle/common/errorhandling/FormcycleExceptionHandlerTest.java +++ /dev/null @@ -1,126 +0,0 @@ -package de.ozgcloud.eingang.formcycle.common.errorhandling; - -import static de.ozgcloud.eingang.formcycle.common.errorhandling.InternalExceptionDtoTestFactory.*; -import static org.assertj.core.api.Assertions.*; -import static org.mockito.Mockito.*; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Spy; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; - -import de.ozgcloud.common.errorhandling.ExceptionUtil; -import de.ozgcloud.common.errorhandling.TechnicalException; -import io.grpc.StatusRuntimeException; - -class FormcycleExceptionHandlerTest { - - @Spy - @InjectMocks - private FormcycleExceptionHandler exceptionHandler; - - @Nested - class TestHandleTechnicalException { - - @Mock - private TechnicalException technicalException; - - @Test - void shouldCallBuildResponseEntity() { - when(technicalException.getExceptionId()).thenReturn(EXCEPTION_ID); - - exceptionHandler.handleTechnicalException(technicalException, null); - - verify(exceptionHandler).buildResponseEntity(FormcycleExceptionHandler.TECHNICAL_EXCEPTION_MESSAGE, EXCEPTION_ID); - } - - } - - @Nested - class TestHandleStatusRuntimeException { - - @Mock - private StatusRuntimeException statusRuntimeException; - - @Test - void shouldCallBuildResponseEntity() { - when(statusRuntimeException.getStackTrace()).thenReturn(new StackTraceElement[0]); - when(statusRuntimeException.getMessage()).thenReturn(ExceptionUtil.formatMessageWithExceptionId(MESSAGE, EXCEPTION_ID)); - - exceptionHandler.handleStatusRuntimeException(statusRuntimeException, null); - - verify(exceptionHandler).buildResponseEntity(FormcycleExceptionHandler.CREATE_VORGANG_EXCEPTION_MESSAGE, EXCEPTION_ID); - } - - @Nested - class TestGetExceptionId { - - @Test - void shouldReturnExceptionIdFromMessage() { - var exceptionId = exceptionHandler.getExceptionId(messageWithExceptionId()); - - assertThat(exceptionId).isEqualTo(EXCEPTION_ID); - } - - @Test - void shouldCreateNewExceptionId() { - var exceptionId = exceptionHandler.getExceptionId(MESSAGE); - - assertThat(exceptionId).isNotEqualTo(EXCEPTION_ID); - } - - } - - } - - @Nested - class TestBuildResponseEntity { - - @Test - void shouldReturnInternaServerError() { - var response = buildResponseEntity(); - - assertThat(response.getStatusCode()).isEqualTo(HttpStatus.INTERNAL_SERVER_ERROR); - } - - @Test - void shouldCallBuildInternalExceptionDto() { - buildResponseEntity(); - - verify(exceptionHandler).buildInternalExceptionDto(InternalExceptionDtoTestFactory.MESSAGE, EXCEPTION_ID); - } - - private ResponseEntity<InternalExceptionDto> buildResponseEntity() { - return exceptionHandler.buildResponseEntity(InternalExceptionDtoTestFactory.MESSAGE, EXCEPTION_ID); - } - - } - - @Nested - class TestBuildInternalExceptionDto { - - @Test - void shouldSetExceptionId() { - var response = buildInternalExceptionDto(); - - assertThat(response.getExceptionId()).isEqualTo(EXCEPTION_ID); - } - - @Test - void shouldSetMessage() { - var response = buildInternalExceptionDto(); - - assertThat(response.getMessage()).isEqualTo(InternalExceptionDtoTestFactory.MESSAGE); - } - - private InternalExceptionDto buildInternalExceptionDto() { - return exceptionHandler.buildInternalExceptionDto(InternalExceptionDtoTestFactory.MESSAGE, EXCEPTION_ID); - } - - } -} \ No newline at end of file diff --git a/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/ozgcloud/eingang/formcycle/common/errorhandling/InternalExceptionDtoTestFactory.java b/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/ozgcloud/eingang/formcycle/common/errorhandling/InternalExceptionDtoTestFactory.java deleted file mode 100644 index 98a8e5f27c53fd8676f1233ae24e3bf7c42306eb..0000000000000000000000000000000000000000 --- a/formcycle-adapter/formcycle-adapter-impl/src/test/java/de/ozgcloud/eingang/formcycle/common/errorhandling/InternalExceptionDtoTestFactory.java +++ /dev/null @@ -1,22 +0,0 @@ -package de.ozgcloud.eingang.formcycle.common.errorhandling; - -import de.ozgcloud.common.errorhandling.ExceptionUtil; -import de.ozgcloud.eingang.formcycle.common.errorhandling.InternalExceptionDto.InternalExceptionDtoBuilder; - -public class InternalExceptionDtoTestFactory { - - public static final String EXCEPTION_ID = "exception-id"; - public static final String MESSAGE = "exception message"; - - public static InternalExceptionDto create() { - return createBuilder().build(); - } - - private static InternalExceptionDtoBuilder createBuilder() { - return InternalExceptionDto.builder().exceptionId(EXCEPTION_ID).message(MESSAGE); - } - - public static String messageWithExceptionId() { - return ExceptionUtil.formatMessageWithExceptionId(MESSAGE, EXCEPTION_ID); - } -} diff --git a/formcycle-adapter/formcycle-adapter-impl/src/test/resources/META-INF/services/org.junit.jupiter.api.extension.Extension b/formcycle-adapter/formcycle-adapter-impl/src/test/resources/META-INF/services/org.junit.jupiter.api.extension.Extension deleted file mode 100644 index 79b126e6cdb86bec1f4f08c205de8961bde1934a..0000000000000000000000000000000000000000 --- a/formcycle-adapter/formcycle-adapter-impl/src/test/resources/META-INF/services/org.junit.jupiter.api.extension.Extension +++ /dev/null @@ -1 +0,0 @@ -org.mockito.junit.jupiter.MockitoExtension \ No newline at end of file diff --git a/formcycle-adapter/formcycle-adapter-impl/src/test/resources/application-itcase.yml b/formcycle-adapter/formcycle-adapter-impl/src/test/resources/application-itcase.yml deleted file mode 100644 index 54587478bf730fd0fac8c2c48dc19ec78aeccaf3..0000000000000000000000000000000000000000 --- a/formcycle-adapter/formcycle-adapter-impl/src/test/resources/application-itcase.yml +++ /dev/null @@ -1,4 +0,0 @@ -ozgcloud: - adapter: - targetVorgangManagerName: local - fallbackStrategy: DENY \ No newline at end of file diff --git a/formcycle-adapter/formcycle-adapter-impl/src/test/resources/junit-platform.properties b/formcycle-adapter/formcycle-adapter-impl/src/test/resources/junit-platform.properties deleted file mode 100644 index 1cebb76d5a58ac034b2627d12411d82d1e85821e..0000000000000000000000000000000000000000 --- a/formcycle-adapter/formcycle-adapter-impl/src/test/resources/junit-platform.properties +++ /dev/null @@ -1 +0,0 @@ -junit.jupiter.extensions.autodetection.enabled = true \ No newline at end of file diff --git a/formcycle-adapter/formcycle-adapter-impl/src/test/resources/log4j2.xml b/formcycle-adapter/formcycle-adapter-impl/src/test/resources/log4j2.xml deleted file mode 100644 index 5d7001e1f9186d197a2d301d3910c9d73ed05d15..0000000000000000000000000000000000000000 --- a/formcycle-adapter/formcycle-adapter-impl/src/test/resources/log4j2.xml +++ /dev/null @@ -1,14 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<configuration> - <Appenders> - <Console name="CONSOLE" target="SYSTEM_OUT"> - <PatternLayout pattern="[%-5level] %c{1.} %msg%n"/> - </Console> - </Appenders> - - <Loggers> - <Root level="WARN"> - <appender-ref ref="CONSOLE" /> - </Root> - </Loggers> -</configuration> \ No newline at end of file diff --git a/formcycle-adapter/formcycle-adapter-interface/pom.xml b/formcycle-adapter/formcycle-adapter-interface/pom.xml deleted file mode 100644 index fb04eeba9c403927511b7407e593ff6ad22bfc63..0000000000000000000000000000000000000000 --- a/formcycle-adapter/formcycle-adapter-interface/pom.xml +++ /dev/null @@ -1,102 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- - - Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - Ministerpräsidenten des Landes Schleswig-Holstein - Staatskanzlei - Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - - Lizenziert unter der EUPL, Version 1.2 oder - sobald - diese von der Europäischen Kommission genehmigt wurden - - Folgeversionen der EUPL ("Lizenz"); - Sie dürfen dieses Werk ausschließlich gemäß - dieser Lizenz nutzen. - Eine Kopie der Lizenz finden Sie hier: - - https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - - Sofern nicht durch anwendbare Rechtsvorschriften - gefordert oder in schriftlicher Form vereinbart, wird - die unter der Lizenz verbreitete Software "so wie sie - ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - ausdrücklich oder stillschweigend - verbreitet. - Die sprachspezifischen Genehmigungen und Beschränkungen - unter der Lizenz sind dem Lizenztext zu entnehmen. - ---> -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> - <modelVersion>4.0.0</modelVersion> - <parent> - <groupId>de.ozgcloud.common</groupId> - <artifactId>ozgcloud-common-dependencies</artifactId> - <version>4.7.0</version> - <relativePath/> - </parent> - - <groupId>de.ozgcloud.eingang</groupId> - <artifactId>formcycle-adapter-interface</artifactId> - <name>EM - Formcycle Adapter - Interface</name> - <version>2.16.0-SNAPSHOT</version> - - <properties> - <vorgang-manager.version>2.0.0</vorgang-manager.version> - <java.version>21</java.version> - <maven.compiler.source>${java.version}</maven.compiler.source> - <maven.compiler.target>${java.version}</maven.compiler.target> - </properties> - - <dependencies> - <dependency> - <groupId>de.ozgcloud.vorgang</groupId> - <artifactId>vorgang-manager-interface</artifactId> - <version>${vorgang-manager.version}</version> - </dependency> - <dependency> - <groupId>de.ozgcloud.vorgang</groupId> - <artifactId>vorgang-manager-interface</artifactId> - <classifier>sources</classifier> - <scope>provided</scope> - <version>${vorgang-manager.version}</version> - </dependency> - - <!-- protobuf --> - <dependency> - <groupId>com.google.protobuf</groupId> - <artifactId>protobuf-java</artifactId> - </dependency> - <dependency> - <groupId>com.google.protobuf</groupId> - <artifactId>protobuf-java-util</artifactId> - </dependency> - </dependencies> - - <build> - <plugins> - <plugin> - <groupId>com.github.os72</groupId> - <artifactId>protoc-jar-maven-plugin</artifactId> - <version>${protoc-jar-plugin.version}</version> - <executions> - <execution> - <phase>generate-sources</phase> - <goals> - <goal>run</goal> - </goals> - <configuration> - <includeMavenTypes>direct</includeMavenTypes> - <outputTargets> - <outputTarget> - <type>java</type> - </outputTarget> - <outputTarget> - <type>grpc-java</type> - <pluginArtifact>io.grpc:protoc-gen-grpc-java:${protoc-gen.version}</pluginArtifact> - </outputTarget> - </outputTargets> - </configuration> - </execution> - </executions> - </plugin> - </plugins> - </build> -</project> diff --git a/formcycle-adapter/formcycle-adapter-interface/src/main/protobuf/form-data.model.proto b/formcycle-adapter/formcycle-adapter-interface/src/main/protobuf/form-data.model.proto deleted file mode 100644 index 28ff49ebad2b3dba76a536a6df872d2f43ed210e..0000000000000000000000000000000000000000 --- a/formcycle-adapter/formcycle-adapter-interface/src/main/protobuf/form-data.model.proto +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -syntax = "proto3"; - -package de.ozgcloud.eingang.formcycle; - -/*import "common.model.proto";*/ -import "vorgang.model.proto"; - -option java_multiple_files = true; -option java_package = "de.ozgcloud.eingang.formcycle"; -option java_outer_classname = "FormcycleFormDataProto"; - -message FormCycleConfirmationResponse { - string vorgangNummer = 1; -} - -message FormCycleFormData { - FormCycleFormHeader header = 1; - FormCycleServiceKonto serviceKonto = 2; - de.ozgcloud.vorgang.vorgang.GrpcFormData formData = 3; - repeated FormCycleAttachmentGroup attachmentGroup = 4; -} - -message FormCycleFormHeader { - string receivedAt = 1; - string formName = 2; - string organisationsEinheitId = 3; - string formId = 4; - string requestId = 5; -} - -message FormCycleServiceKonto { - string type = 1; - FormCyclePostfachAddress address = 2; - string trustLevel = 3; -} - -message FormCyclePostfachAddress { - string version = 1; - string identifier = 2; -} - -message FormCycleAttachmentGroup { - string name = 1; - repeated string fileId = 2; -} \ No newline at end of file diff --git a/formcycle-adapter/pom.xml b/formcycle-adapter/pom.xml deleted file mode 100644 index e4696b1b5723a2e7d65baf436cdbe86ff41a6e1e..0000000000000000000000000000000000000000 --- a/formcycle-adapter/pom.xml +++ /dev/null @@ -1,72 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- - - Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - Ministerpräsidenten des Landes Schleswig-Holstein - Staatskanzlei - Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - - Lizenziert unter der EUPL, Version 1.2 oder - sobald - diese von der Europäischen Kommission genehmigt wurden - - Folgeversionen der EUPL ("Lizenz"); - Sie dürfen dieses Werk ausschließlich gemäß - dieser Lizenz nutzen. - Eine Kopie der Lizenz finden Sie hier: - - https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - - Sofern nicht durch anwendbare Rechtsvorschriften - gefordert oder in schriftlicher Form vereinbart, wird - die unter der Lizenz verbreitete Software "so wie sie - ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - ausdrücklich oder stillschweigend - verbreitet. - Die sprachspezifischen Genehmigungen und Beschränkungen - unter der Lizenz sind dem Lizenztext zu entnehmen. - ---> -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> - <modelVersion>4.0.0</modelVersion> - <parent> - <groupId>de.ozgcloud.eingang</groupId> - <artifactId>eingang-manager</artifactId> - <version>2.16.0-SNAPSHOT</version> - </parent> - - <artifactId>formcycle-adapter</artifactId> - <name>EM - Formcycle Adapter</name> - <description>Eingang Adapter für Formcycle basierte Formulare</description> - <packaging>pom</packaging> - - <modules> - <module>formcycle-adapter-interface</module> - <module>formcycle-adapter-impl</module> - </modules> - - <properties> - <spring-boot.build-image.imageName>docker.ozg-sh.de/formcycle-adapter:build-latest</spring-boot.build-image.imageName> - </properties> - - <dependencies> - <dependency> - <groupId>de.ozgcloud.vorgang</groupId> - <artifactId>vorgang-manager-utils</artifactId> - </dependency> - <dependency> - <groupId>de.ozgcloud.vorgang</groupId> - <artifactId>vorgang-manager-utils</artifactId> - <type>test-jar</type> - <scope>test</scope> - </dependency> - <dependency> - <groupId>de.ozgcloud.vorgang</groupId> - <artifactId>vorgang-manager-interface</artifactId> - </dependency> - <dependency> - <groupId>de.ozgcloud.vorgang</groupId> - <artifactId>vorgang-manager-interface</artifactId> - <classifier>sources</classifier> - <scope>compile</scope> - <version>${vorgang-manager.version}</version> - </dependency> - </dependencies> -</project> diff --git a/formsolutions-adapter/pom.xml b/formsolutions-adapter/pom.xml deleted file mode 100644 index 850c94adc979d478afbde634c655490c5fc2d580..0000000000000000000000000000000000000000 --- a/formsolutions-adapter/pom.xml +++ /dev/null @@ -1,210 +0,0 @@ -<?xml version="1.0"?> -<!-- - - Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - Ministerpräsidenten des Landes Schleswig-Holstein - Staatskanzlei - Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - - Lizenziert unter der EUPL, Version 1.2 oder - sobald - diese von der Europäischen Kommission genehmigt wurden - - Folgeversionen der EUPL ("Lizenz"); - Sie dürfen dieses Werk ausschließlich gemäß - dieser Lizenz nutzen. - Eine Kopie der Lizenz finden Sie hier: - - https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - - Sofern nicht durch anwendbare Rechtsvorschriften - gefordert oder in schriftlicher Form vereinbart, wird - die unter der Lizenz verbreitete Software "so wie sie - ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - ausdrücklich oder stillschweigend - verbreitet. - Die sprachspezifischen Genehmigungen und Beschränkungen - unter der Lizenz sind dem Lizenztext zu entnehmen. - ---> -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> - <modelVersion>4.0.0</modelVersion> - - <parent> - <groupId>de.ozgcloud.eingang</groupId> - <artifactId>eingang-manager</artifactId> - <version>2.16.0-SNAPSHOT</version> - <relativePath>../</relativePath> - </parent> - - <artifactId>formsolutions-adapter</artifactId> - <name>Eingangs Adapter - FormSolutions</name> - <packaging>jar</packaging> - - <properties> - <spring-boot.build-image.imageName>docker.ozg-sh.de/formsolutions-adapter:build-latest</spring-boot.build-image.imageName> - </properties> - - <dependencies> - <!-- own projects --> - <dependency> - <groupId>de.ozgcloud.eingang</groupId> - <artifactId>common</artifactId> - </dependency> - <dependency> - <groupId>de.ozgcloud.eingang</groupId> - <artifactId>router</artifactId> - </dependency> - <dependency> - <groupId>de.ozgcloud.eingang</groupId> - <artifactId>semantik-adapter</artifactId> - </dependency> - - <!-- Spring --> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-web-services</artifactId> - </dependency> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-actuator</artifactId> - </dependency> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-json</artifactId> - </dependency> - - <!-- tag::springws[] --> - <dependency> - <groupId>wsdl4j</groupId> - <artifactId>wsdl4j</artifactId> - </dependency> - - <dependency> - <groupId>org.apache.ws.xmlschema</groupId> - <artifactId>xmlschema-core</artifactId> - </dependency> - <!-- end::springws[] --> - - <!-- Dev --> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-devtools</artifactId> - <scope>runtime</scope> - </dependency> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-configuration-processor</artifactId> - <optional>true</optional> - </dependency> - <dependency> - <groupId>org.projectlombok</groupId> - <artifactId>lombok</artifactId> - </dependency> - - <!-- Test --> - <dependency> - <groupId>de.ozgcloud.common</groupId> - <artifactId>ozgcloud-common-test</artifactId> - <scope>test</scope> - </dependency> - <dependency> - <groupId>de.ozgcloud.eingang</groupId> - <artifactId>common</artifactId> - <type>test-jar</type> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-test</artifactId> - <scope>test</scope> - <exclusions> - <exclusion> - <groupId>org.junit.vintage</groupId> - <artifactId>junit-vintage-engine</artifactId> - </exclusion> - </exclusions> - </dependency> - </dependencies> - - <build> - <finalName>${project.artifactId}</finalName> - <plugins> - <!-- tag::wsdl/xsd[] --> - <plugin> - <groupId>com.evolvedbinary.maven.jvnet</groupId> - <artifactId>jaxb30-maven-plugin</artifactId> - <executions> - <execution> - <goals> - <goal>generate</goal> - </goals> - </execution> - </executions> - <configuration> - <schemaLanguage>WSDL</schemaLanguage> - <generatePackage>de.ozgcloud.eingang.formsolutions</generatePackage> - <schemas> - <schema> - <fileset> - <directory>${basedir}/src/main/resources/wsdl</directory> - <includes> - <include>*.wsdl</include> - </includes> - </fileset> - </schema> - </schemas> - <schemaLanguage>WSDL</schemaLanguage> - </configuration> - </plugin> - - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-surefire-plugin</artifactId> - </plugin> - - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-failsafe-plugin</artifactId> - </plugin> - - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-compiler-plugin</artifactId> - </plugin> - - <plugin> - <groupId>pl.project13.maven</groupId> - <artifactId>git-commit-id-plugin</artifactId> - </plugin> - <plugin> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-maven-plugin</artifactId> - </plugin> - <plugin> - <groupId>org.jacoco</groupId> - <artifactId>jacoco-maven-plugin</artifactId> - </plugin> - </plugins> - </build> - - <profiles> - <profile> - <id>ci-build</id> - <build> - <plugins> - <plugin> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-maven-plugin</artifactId> - <executions> - <execution> - <id>build-image</id> - <phase>install</phase> - <goals> - <goal>build-image-no-fork</goal> - </goals> - </execution> - </executions> - </plugin> - </plugins> - </build> - </profile> - </profiles> -</project> diff --git a/formsolutions-adapter/src/test/resources/META-INF/services/org.junit.jupiter.api.extension.Extension b/formsolutions-adapter/src/test/resources/META-INF/services/org.junit.jupiter.api.extension.Extension deleted file mode 100644 index 79b126e6cdb86bec1f4f08c205de8961bde1934a..0000000000000000000000000000000000000000 --- a/formsolutions-adapter/src/test/resources/META-INF/services/org.junit.jupiter.api.extension.Extension +++ /dev/null @@ -1 +0,0 @@ -org.mockito.junit.jupiter.MockitoExtension \ No newline at end of file diff --git a/formsolutions-adapter/src/test/resources/junit-platform.properties b/formsolutions-adapter/src/test/resources/junit-platform.properties deleted file mode 100644 index 1cebb76d5a58ac034b2627d12411d82d1e85821e..0000000000000000000000000000000000000000 --- a/formsolutions-adapter/src/test/resources/junit-platform.properties +++ /dev/null @@ -1 +0,0 @@ -junit.jupiter.extensions.autodetection.enabled = true \ No newline at end of file diff --git a/forwarder/pom.xml b/forwarder/pom.xml deleted file mode 100644 index 54f6c0f5549dbbbb0d77ebbd2a2712e1be683fe7..0000000000000000000000000000000000000000 --- a/forwarder/pom.xml +++ /dev/null @@ -1,102 +0,0 @@ -<?xml version="1.0"?> -<!-- - - Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - Ministerpräsidenten des Landes Schleswig-Holstein - Staatskanzlei - Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - - Lizenziert unter der EUPL, Version 1.2 oder - sobald - diese von der Europäischen Kommission genehmigt wurden - - Folgeversionen der EUPL ("Lizenz"); - Sie dürfen dieses Werk ausschließlich gemäß - dieser Lizenz nutzen. - Eine Kopie der Lizenz finden Sie hier: - - https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - - Sofern nicht durch anwendbare Rechtsvorschriften - gefordert oder in schriftlicher Form vereinbart, wird - die unter der Lizenz verbreitete Software "so wie sie - ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - ausdrücklich oder stillschweigend - verbreitet. - Die sprachspezifischen Genehmigungen und Beschränkungen - unter der Lizenz sind dem Lizenztext zu entnehmen. - ---> -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> - <modelVersion>4.0.0</modelVersion> - <parent> - <groupId>de.ozgcloud.eingang</groupId> - <artifactId>eingang-manager</artifactId> - <version>2.16.0-SNAPSHOT</version> - <relativePath>../</relativePath> - </parent> - - <artifactId>forwarder</artifactId> - <name>Eingangs Adapter - Forwarder</name> - <packaging>jar</packaging> - - <properties> - <spring-boot.build-image.imageName>docker.ozg-sh.de/forwarder:build-latest</spring-boot.build-image.imageName> - </properties> - - <dependencies> - <!-- own projects --> - <dependency> - <groupId>de.ozgcloud.eingang</groupId> - <artifactId>common</artifactId> - </dependency> - <dependency> - <groupId>de.ozgcloud.eingang</groupId> - <artifactId>router</artifactId> - </dependency> - - <!-- spring --> - <dependency> - <groupId>net.devh</groupId> - <artifactId>grpc-server-spring-boot-starter</artifactId> - </dependency> - <dependency> - <groupId>io.grpc</groupId> - <artifactId>grpc-inprocess</artifactId> - </dependency> - - <!-- Tools --> - <dependency> - <groupId>org.apache.commons</groupId> - <artifactId>commons-lang3</artifactId> - </dependency> - - <!-- Dev --> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-devtools</artifactId> - <scope>runtime</scope> - </dependency> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-configuration-processor</artifactId> - <optional>true</optional> - </dependency> - <dependency> - <groupId>org.projectlombok</groupId> - <artifactId>lombok</artifactId> - </dependency> - - </dependencies> - - <build> - <plugins> - <plugin> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-maven-plugin</artifactId> - </plugin> - - <plugin> - <groupId>org.jacoco</groupId> - <artifactId>jacoco-maven-plugin</artifactId> - </plugin> - </plugins> - </build> -</project> diff --git a/forwarder/src/main/java/de/ozgcloud/eingang/forwarder/RouteCriteria.java b/forwarder/src/main/java/de/ozgcloud/eingang/forwarder/RouteCriteria.java deleted file mode 100644 index a5d26ad1ac47928bbd5fc47ffe6c36ad09a44fb4..0000000000000000000000000000000000000000 --- a/forwarder/src/main/java/de/ozgcloud/eingang/forwarder/RouteCriteria.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.forwarder; - -import java.util.Optional; - -import lombok.Builder; -import lombok.Getter; - -@Getter -@Builder -public class RouteCriteria { - - private Optional<String> gemeindeSchluessel; - private Optional<String> webserviceUrl; - private Optional<String> organisationseinheitenId; -} diff --git a/forwarder/src/main/java/de/ozgcloud/eingang/forwarder/RouteCriteriaMapper.java b/forwarder/src/main/java/de/ozgcloud/eingang/forwarder/RouteCriteriaMapper.java deleted file mode 100644 index 16bf07f374d306f88f954c8e54985ccf55cdd0a8..0000000000000000000000000000000000000000 --- a/forwarder/src/main/java/de/ozgcloud/eingang/forwarder/RouteCriteriaMapper.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.forwarder; - -import java.util.Optional; - -import org.apache.commons.lang3.StringUtils; -import org.mapstruct.Mapper; - -import de.ozgcloud.eingang.forwarding.GrpcRouteCriteria; - -@Mapper -interface RouteCriteriaMapper { - - RouteCriteria fromGrpc(GrpcRouteCriteria grpcRouteCriteria); - - default Optional<String> wrapWithOptional(String val) { - return Optional.ofNullable(StringUtils.trimToNull(val)); - } -} diff --git a/forwarder/src/main/java/de/ozgcloud/eingang/forwarder/RouteForwardingGrpcService.java b/forwarder/src/main/java/de/ozgcloud/eingang/forwarder/RouteForwardingGrpcService.java deleted file mode 100644 index 8b0b197d52fe78ac16b445f974802f0192e08e18..0000000000000000000000000000000000000000 --- a/forwarder/src/main/java/de/ozgcloud/eingang/forwarder/RouteForwardingGrpcService.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.forwarder; - -import org.springframework.beans.factory.annotation.Autowired; - -import de.ozgcloud.eingang.forwarding.GrpcRouteForwardingRequest; -import de.ozgcloud.eingang.forwarding.GrpcRouteForwardingResponse; -import de.ozgcloud.eingang.router.GrpcEingangMapper; -import io.grpc.stub.StreamObserver; -import net.devh.boot.grpc.server.service.GrpcService; - -@GrpcService -public class RouteForwardingGrpcService extends RouteForwardingServiceGrpc.RouteForwardingServiceImplBase { - - @Autowired - private RouteForwardingService service; - @Autowired - private RouteCriteriaMapper criteriaMapper; - - @Autowired - private GrpcEingangMapper eingangMapper; - - @Override - public void routeForwarding(GrpcRouteForwardingRequest request, StreamObserver<GrpcRouteForwardingResponse> responseObserver) { - service.route(criteriaMapper.fromGrpc(request.getRouteCriteria()), eingangMapper.toFormData(request.getEingang())); - } -} diff --git a/forwarder/src/main/java/de/ozgcloud/eingang/forwarder/RouteForwardingService.java b/forwarder/src/main/java/de/ozgcloud/eingang/forwarder/RouteForwardingService.java deleted file mode 100644 index feca46f38c08d5caa37d9d5aa72b4cf3844adc3a..0000000000000000000000000000000000000000 --- a/forwarder/src/main/java/de/ozgcloud/eingang/forwarder/RouteForwardingService.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.forwarder; - -import org.springframework.stereotype.Service; - -import de.ozgcloud.eingang.common.formdata.FormData; - -@Service -class RouteForwardingService { - - public void route(RouteCriteria criteria, FormData formData) { -//FIXME implement me - } -} diff --git a/forwarder/src/test/java/de/ozgcloud/eingang/forwarder/ForwarderApplicationTest.java b/forwarder/src/test/java/de/ozgcloud/eingang/forwarder/ForwarderApplicationTest.java deleted file mode 100644 index b72c4b8f618196ab4887d86c5867a78e6b794e70..0000000000000000000000000000000000000000 --- a/forwarder/src/test/java/de/ozgcloud/eingang/forwarder/ForwarderApplicationTest.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.forwarder; - -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; - -import de.ozgcloud.eingang.Application; - -@SpringBootTest(classes = Application.class) -class ForwarderApplicationTest { - - @Test - void contextLoads() { // NOSONAR nothing to check - it it starts it is fine - } -} diff --git a/forwarder/src/test/java/de/ozgcloud/eingang/forwarder/GrpcRouteForwardingRequestTestFactory.java b/forwarder/src/test/java/de/ozgcloud/eingang/forwarder/GrpcRouteForwardingRequestTestFactory.java deleted file mode 100644 index 7a62f93bf0c247a863242650a5f52d15d9c0fa88..0000000000000000000000000000000000000000 --- a/forwarder/src/test/java/de/ozgcloud/eingang/forwarder/GrpcRouteForwardingRequestTestFactory.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.forwarder; - -import de.ozgcloud.eingang.forwarding.GrpcRouteForwardingRequest; - -public class GrpcRouteForwardingRequestTestFactory { - - public static GrpcRouteForwardingRequest create() { - return createBuilder().build(); - } - - public static GrpcRouteForwardingRequest.Builder createBuilder() { - return GrpcRouteForwardingRequest.newBuilder() - .setRouteCriteria(RouteCriteriaTestFactory.createGrpc()); - } -} diff --git a/forwarder/src/test/java/de/ozgcloud/eingang/forwarder/RouteCriteriaTestFactory.java b/forwarder/src/test/java/de/ozgcloud/eingang/forwarder/RouteCriteriaTestFactory.java deleted file mode 100644 index 7175f025471cd7c59da7ea5f017f845a647221c9..0000000000000000000000000000000000000000 --- a/forwarder/src/test/java/de/ozgcloud/eingang/forwarder/RouteCriteriaTestFactory.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.forwarder; - -import java.util.Optional; - -import de.ozgcloud.eingang.forwarding.GrpcRouteCriteria; - -public class RouteCriteriaTestFactory { - - public static final String GEMEINDE_SCHLUSSEL = "0815"; - public static final String WEBSERVICE_URL = "http://nimmerland.by.kop-cloud.de/ws"; - public static final String ORGANISATIONSEINHEITEN_ID = "4711"; - - public static RouteCriteria create() { - return createBuilder().build(); - } - - public static RouteCriteria.RouteCriteriaBuilder createBuilder() { - return RouteCriteria.builder() - .gemeindeSchluessel(Optional.of(GEMEINDE_SCHLUSSEL)) - .webserviceUrl(Optional.of(WEBSERVICE_URL)) - .organisationseinheitenId(Optional.of(ORGANISATIONSEINHEITEN_ID)); - } - - public static GrpcRouteCriteria createGrpc() { - return createGrpcBuilder().build(); - } - - public static GrpcRouteCriteria.Builder createGrpcBuilder() { - return GrpcRouteCriteria.newBuilder() - .setGemeindeSchluessel(GEMEINDE_SCHLUSSEL) - .setWebserviceUrl(WEBSERVICE_URL) - .setOrganisationseinheitenId(ORGANISATIONSEINHEITEN_ID); - } -} diff --git a/forwarder/src/test/java/de/ozgcloud/eingang/forwarder/RouteForwardingGrpcServiceTest.java b/forwarder/src/test/java/de/ozgcloud/eingang/forwarder/RouteForwardingGrpcServiceTest.java deleted file mode 100644 index 9395816878bacf239b0f7e22bd79074d8e51e40b..0000000000000000000000000000000000000000 --- a/forwarder/src/test/java/de/ozgcloud/eingang/forwarder/RouteForwardingGrpcServiceTest.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.forwarder; - -import static org.assertj.core.api.Assertions.*; -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.*; - -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.mapstruct.factory.Mappers; -import org.mockito.ArgumentCaptor; -import org.mockito.Captor; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Spy; - -import de.ozgcloud.eingang.forwarding.GrpcRouteForwardingResponse; -import de.ozgcloud.eingang.router.GrpcEingangMapper; -import io.grpc.stub.StreamObserver; - -class RouteForwardingGrpcServiceTest { - - @InjectMocks - private RouteForwardingGrpcService service; - - @Mock - private StreamObserver<GrpcRouteForwardingResponse> responseObserver; - - @Mock - private RouteForwardingService routeService; - @Spy - private RouteCriteriaMapper criteriaMapper = Mappers.getMapper(RouteCriteriaMapper.class); - @Spy - private GrpcEingangMapper eingangMapper = Mappers.getMapper(GrpcEingangMapper.class); - - @Nested - class TestRouteForwarding { - - @Captor - private ArgumentCaptor<RouteCriteria> criteriaCaptor; - - @Test - void shouldCallService() { - service.routeForwarding(GrpcRouteForwardingRequestTestFactory.create(), responseObserver); - - verify(routeService).route(any(), any()); - } - - @Test - void shouldHaveRouteCriteria() { - service.routeForwarding(GrpcRouteForwardingRequestTestFactory.create(), responseObserver); - - verify(routeService).route(criteriaCaptor.capture(), any()); - - assertThat(criteriaCaptor.getValue()).usingRecursiveComparison().isEqualTo(RouteCriteriaTestFactory.create()); - } - - @Test - void shouldHaveFormData() { - service.routeForwarding(GrpcRouteForwardingRequestTestFactory.create(), responseObserver); - - verify(routeService).route(any(), notNull()); - verify(eingangMapper).toFormData(any()); - } - } - -} diff --git a/forwarder/src/test/resources/META-INF/services/org.junit.jupiter.api.extension.Extension b/forwarder/src/test/resources/META-INF/services/org.junit.jupiter.api.extension.Extension deleted file mode 100644 index 79b126e6cdb86bec1f4f08c205de8961bde1934a..0000000000000000000000000000000000000000 --- a/forwarder/src/test/resources/META-INF/services/org.junit.jupiter.api.extension.Extension +++ /dev/null @@ -1 +0,0 @@ -org.mockito.junit.jupiter.MockitoExtension \ No newline at end of file diff --git a/forwarder/src/test/resources/application-itcase.yml b/forwarder/src/test/resources/application-itcase.yml deleted file mode 100644 index 7c31e3bba64e10e9674174f9274aee03a753358a..0000000000000000000000000000000000000000 --- a/forwarder/src/test/resources/application-itcase.yml +++ /dev/null @@ -1,3 +0,0 @@ -grpc: - server: - port: 0 \ No newline at end of file diff --git a/forwarder/src/test/resources/application.yml b/forwarder/src/test/resources/application.yml deleted file mode 100644 index 3306e2e6e31d54035f1197d1ec5061691b9964a4..0000000000000000000000000000000000000000 --- a/forwarder/src/test/resources/application.yml +++ /dev/null @@ -1,19 +0,0 @@ -spring: - profiles: - active: - - itcase - -logging: - level: - ROOT: ERROR - -grpc: - client: - vorgang-manager-nf: - address: static://127.0.0.1:9090 - negotiationType: PLAINTEXT - -ozgcloud: - adapter: - routingStrategy: SINGLE - targetVorgangManagerName: nf \ No newline at end of file diff --git a/forwarder/src/test/resources/junit-platform.properties b/forwarder/src/test/resources/junit-platform.properties deleted file mode 100644 index 1cebb76d5a58ac034b2627d12411d82d1e85821e..0000000000000000000000000000000000000000 --- a/forwarder/src/test/resources/junit-platform.properties +++ /dev/null @@ -1 +0,0 @@ -junit.jupiter.extensions.autodetection.enabled = true \ No newline at end of file diff --git a/intelliform-adapter/README.md b/intelliform-adapter/README.md deleted file mode 100644 index 7e447177554039941f7c9e59070e14a2cd6de7cb..0000000000000000000000000000000000000000 --- a/intelliform-adapter/README.md +++ /dev/null @@ -1,4 +0,0 @@ -# intelliform-adapter - -Adapter für die Anbindung von IntelliForm - diff --git a/intelliform-adapter/pom.xml b/intelliform-adapter/pom.xml deleted file mode 100644 index b459d13f0a9c2392ceb2b0945c56c15c884a9ee2..0000000000000000000000000000000000000000 --- a/intelliform-adapter/pom.xml +++ /dev/null @@ -1,257 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- - - Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - Ministerpräsidenten des Landes Schleswig-Holstein - Staatskanzlei - Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - - Lizenziert unter der EUPL, Version 1.2 oder - sobald - diese von der Europäischen Kommission genehmigt wurden - - Folgeversionen der EUPL ("Lizenz"); - Sie dürfen dieses Werk ausschließlich gemäß - dieser Lizenz nutzen. - Eine Kopie der Lizenz finden Sie hier: - - https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - - Sofern nicht durch anwendbare Rechtsvorschriften - gefordert oder in schriftlicher Form vereinbart, wird - die unter der Lizenz verbreitete Software "so wie sie - ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - ausdrücklich oder stillschweigend - verbreitet. - Die sprachspezifischen Genehmigungen und Beschränkungen - unter der Lizenz sind dem Lizenztext zu entnehmen. - ---> -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> - - <modelVersion>4.0.0</modelVersion> - - <parent> - <groupId>de.ozgcloud.eingang</groupId> - <artifactId>eingang-manager</artifactId> - <version>2.16.0-SNAPSHOT</version> - <relativePath>../</relativePath> - </parent> - - <artifactId>intelliform-adapter</artifactId> - <name>Eingangs Adapter - intelliform</name> - <description>IntelliForm-Adapter </description> - - <properties> - <spring-boot.build-image.imageName>docker.ozg-sh.de/intelliform-adapter:build-latest</spring-boot.build-image.imageName> - </properties> - - - <dependencies> - <!-- own projects --> - <dependency> - <groupId>de.ozgcloud.eingang</groupId> - <artifactId>common</artifactId> - </dependency> - <dependency> - <groupId>de.ozgcloud.eingang</groupId> - <artifactId>router</artifactId> - </dependency> - <dependency> - <groupId>de.ozgcloud.eingang</groupId> - <artifactId>semantik-adapter</artifactId> - </dependency> - - <!-- spring --> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-web-services</artifactId> - </dependency> - - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-actuator</artifactId> - </dependency> - - <dependency> - <groupId>org.jsoup</groupId> - <artifactId>jsoup</artifactId> - </dependency> - - - <!-- tools --> - <!-- commons --> - <dependency> - <groupId>org.apache.commons</groupId> - <artifactId>commons-lang3</artifactId> - </dependency> - - <dependency> - <groupId>org.mapstruct</groupId> - <artifactId>mapstruct</artifactId> - </dependency> - - <!-- Dev --> - <dependency> - <groupId>org.projectlombok</groupId> - <artifactId>lombok</artifactId> - </dependency> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-devtools</artifactId> - <scope>runtime</scope> - </dependency> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-configuration-processor</artifactId> - <optional>true</optional> - </dependency> - - <!-- tag::springws[] --> - <dependency> - <groupId>wsdl4j</groupId> - <artifactId>wsdl4j</artifactId> - </dependency> - - <dependency> - <groupId>org.apache.ws.xmlschema</groupId> - <artifactId>xmlschema-core</artifactId> - </dependency> - - - <!-- end::springws[] --> - - <!-- Test --> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-test</artifactId> - <scope>test</scope> - <exclusions> - <exclusion> - <groupId>org.junit.vintage</groupId> - <artifactId>junit-vintage-engine</artifactId> - </exclusion> - </exclusions> - </dependency> - <dependency> - <groupId>org.junit.jupiter</groupId> - <artifactId>junit-jupiter-engine</artifactId> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.junit.jupiter</groupId> - <artifactId>junit-jupiter-params</artifactId> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.mockito</groupId> - <artifactId>mockito-core</artifactId> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.mockito</groupId> - <artifactId>mockito-junit-jupiter</artifactId> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.assertj</groupId> - <artifactId>assertj-core</artifactId> - <scope>test</scope> - </dependency> - - <dependency> - <groupId>org.springframework.ws</groupId> - <artifactId>spring-ws-test</artifactId> - <scope>test</scope> - </dependency> - - <dependency> - <groupId>de.ozgcloud.eingang</groupId> - <artifactId>common</artifactId> - <type>test-jar</type> - <scope>test</scope> - </dependency> - - </dependencies> - - <build> - <finalName>${project.artifactId}</finalName> - <plugins> - <!-- tag::wsdl[] --> - <plugin> - <groupId>com.evolvedbinary.maven.jvnet</groupId> - <artifactId>jaxb30-maven-plugin</artifactId> - <executions> - <execution> - <goals> - <goal>generate</goal> - </goals> - </execution> - </executions> - <configuration> - <strict>false</strict> - <schemaLanguage>WSDL</schemaLanguage> - <generatePackage>de.ozgcloud.eingang.intelliform</generatePackage> - <schemas> - <schema> - <fileset> - <directory>${basedir}/src/main/resources/intelliform</directory> - <includes> - <include>*.wsdl</include> - </includes> - </fileset> - </schema> - </schemas> - </configuration> - </plugin> - <!-- end::wsdl[] --> - - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-compiler-plugin</artifactId> - </plugin> - <plugin> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-maven-plugin</artifactId> - </plugin> - - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-failsafe-plugin</artifactId> - </plugin> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-surefire-plugin</artifactId> - </plugin> - <plugin> - <groupId>org.jacoco</groupId> - <artifactId>jacoco-maven-plugin</artifactId> - </plugin> - <plugin> - <groupId>pl.project13.maven</groupId> - <artifactId>git-commit-id-plugin</artifactId> - </plugin> - </plugins> - </build> - - <profiles> - <profile> - <id>ci-build</id> - <build> - <plugins> - <plugin> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-maven-plugin</artifactId> - <executions> - <execution> - <id>build-image</id> - <phase>install</phase> - <goals> - <goal>build-image-no-fork</goal> - </goals> - </execution> - </executions> - </plugin> - </plugins> - </build> - </profile> - </profiles> - -</project> diff --git a/intelliform-adapter/src/main/java/de/ozgcloud/eingang/WebServiceConfiguration.java b/intelliform-adapter/src/main/java/de/ozgcloud/eingang/WebServiceConfiguration.java deleted file mode 100644 index f5c5c3b23eb015eaaac9aca79f76636e26f354dc..0000000000000000000000000000000000000000 --- a/intelliform-adapter/src/main/java/de/ozgcloud/eingang/WebServiceConfiguration.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang; - -import org.springframework.boot.web.servlet.ServletRegistrationBean; -import org.springframework.context.ApplicationContext; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.core.io.ClassPathResource; -import org.springframework.ws.config.annotation.EnableWs; -import org.springframework.ws.config.annotation.WsConfigurerAdapter; -import org.springframework.ws.transport.http.MessageDispatcherServlet; -import org.springframework.ws.wsdl.wsdl11.DefaultWsdl11Definition; -import org.springframework.xml.xsd.SimpleXsdSchema; -import org.springframework.xml.xsd.XsdSchema; - -@EnableWs -@Configuration -public class WebServiceConfiguration extends WsConfigurerAdapter { - - @Bean - public ServletRegistrationBean<MessageDispatcherServlet> messageDispatcherServlet(ApplicationContext applicationContext) { - MessageDispatcherServlet servlet = new MessageDispatcherServlet(); - servlet.setApplicationContext(applicationContext); - servlet.setTransformWsdlLocations(true); - return new ServletRegistrationBean<>(servlet, "/ws/*"); - } - - @Bean(name = "intelliform_formDatas") - public DefaultWsdl11Definition defaultWsdl11Definition(XsdSchema applicationServiceSchema) { - DefaultWsdl11Definition wsdl11Definition = new DefaultWsdl11Definition(); - wsdl11Definition.setPortTypeName("Application"); - wsdl11Definition.setLocationUri("/ws/if"); - wsdl11Definition.setTargetNamespace("http://xmlns.cit.de/intelliform/2009/webservices/backend"); - wsdl11Definition.setSchema(applicationServiceSchema); - return wsdl11Definition; - } - - @Bean - public XsdSchema applicationServiceSchema() { - return new SimpleXsdSchema(new ClassPathResource("intelliform/ApplicationService.xsd")); - } -} diff --git a/intelliform-adapter/src/main/java/de/ozgcloud/eingang/intelliform/DepositDataMapper.java b/intelliform-adapter/src/main/java/de/ozgcloud/eingang/intelliform/DepositDataMapper.java deleted file mode 100644 index f4b42d22220e907979e96ccdc21b684084ef0ac7..0000000000000000000000000000000000000000 --- a/intelliform-adapter/src/main/java/de/ozgcloud/eingang/intelliform/DepositDataMapper.java +++ /dev/null @@ -1,188 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.intelliform; - -import static java.util.stream.Collectors.*; - -import java.io.IOException; -import java.util.Collection; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.UUID; -import java.util.stream.Collectors; -import java.util.stream.IntStream; -import java.util.stream.Stream; - -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; - -import org.springframework.stereotype.Component; -import org.w3c.dom.Document; -import org.w3c.dom.Element; -import org.w3c.dom.NodeList; -import org.xml.sax.SAXException; - -import de.ozgcloud.common.binaryfile.TempFileUtils; -import de.ozgcloud.eingang.common.errorhandling.TechnicalException; -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.common.formdata.IncomingFile; -import de.ozgcloud.eingang.common.formdata.IncomingFileGroup; -import lombok.RequiredArgsConstructor; - -@Component -@RequiredArgsConstructor -class DepositDataMapper { - - // TODO Resolve code duplication (xta-adapter: de.ozgcloud.eingang.xdomea.XMLHelper) - private static final DocumentBuilder DOCUMENT_BUILDER = createDocumentBuilder(); - - private static DocumentBuilder createDocumentBuilder() { - var documentBuilderFactory = DocumentBuilderFactory.newInstance(); - try { - documentBuilderFactory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); - return documentBuilderFactory.newDocumentBuilder(); - } catch (ParserConfigurationException e) { - throw new TechnicalException("Failed to configure document builder", e); - } - } - - public FormData mapToFormData(DepositData depositData) { - var incomingFileMap = mapDepositAttachmentsToSortedIncomingFiles(depositData); - var document = parsePrimaryXmlRepresentation(depositData, incomingFileMap); - var attachmentGroups = findAttachmentGroups(document); - - return mapToFormDataWithRepresentationsAndAttachments( - getRepresentations(incomingFileMap, getAttachmentFileIds(attachmentGroups)), - getAttachmentFileGroups(attachmentGroups, incomingFileMap) - ); - } - - private List<String> getAttachmentFileIds(Map<String, List<String>> attachmentGroups) { - return attachmentGroups.values().stream() - .flatMap(Collection::stream) - .toList(); - } - - private FormData mapToFormDataWithRepresentationsAndAttachments( - List<IncomingFile> representations, - List<IncomingFileGroup> attachments - ) { - return FormData.builder() - .attachments(attachments) - .numberOfAttachments(attachments.size()) - .representations(representations) - .numberOfRepresentations(representations.size()) - .build(); - } - - Map<String, IncomingFile> mapDepositAttachmentsToSortedIncomingFiles(DepositData depositData) { - var incomingFilesMap = mapDepositAttachmentsToIncomingFiles(depositData); - var primaryId = depositData.getPrimaryDataAttachmentId(); - incomingFilesMap.putFirst(primaryId, getIncomingFileById(primaryId, incomingFilesMap)); - return incomingFilesMap; - } - - private LinkedHashMap<String, IncomingFile> mapDepositAttachmentsToIncomingFiles(DepositData depositData) { - return depositData.getAttachments() - .stream() - .collect(Collectors.toMap( - Attachment::getId, - this::mapAttachmentToIncomingFile, - (u, v) -> v, - LinkedHashMap::new)); - } - - IncomingFile mapAttachmentToIncomingFile(Attachment attachment) { - var file = TempFileUtils.writeTmpFile(attachment.content); - return IncomingFile.builder() - .id(UUID.randomUUID().toString()) - .vendorId(attachment.id) - .name(attachment.name) - .contentType(attachment.contentType) - .size(file.length()) - .file(file) - .build(); - } - - private Document parsePrimaryXmlRepresentation(DepositData depositData, Map<String, IncomingFile> incomingFileMap) { - // Expect that the <primaryDataAttachmentId> refers to the XML file - return parseDocument( - getIncomingFileById(depositData.getPrimaryDataAttachmentId(), incomingFileMap) - ); - } - - private static Document parseDocument(IncomingFile incomingFile) { - try (var inputStream = incomingFile.getContentStream()) { - return DOCUMENT_BUILDER.parse(inputStream); - } catch (SAXException | IOException e) { - throw new TechnicalException("Failed to parse xml document!", e); - } - } - - Map<String, List<String>> findAttachmentGroups(Document document) { - return streamElements(document.getElementsByTagName("file")) - .collect(groupingBy( - element -> element.getParentNode().getNodeName(), - mapping( - element -> element.getAttribute("id"), - toList()))); - } - - private List<IncomingFileGroup> getAttachmentFileGroups(Map<String, List<String>> attachmentGroups, Map<String, IncomingFile> incomingFileMap) { - return attachmentGroups.entrySet().stream() - .map(entry -> IncomingFileGroup.builder() - .name(entry.getKey()) - .files(entry.getValue().stream().map(id -> getIncomingFileById(id, incomingFileMap)).toList()) - .build()) - .toList(); - } - - private List<IncomingFile> getRepresentations(Map<String, IncomingFile> incomingFileMap, List<String> attachmentFileIds) { - return getNamesWithout(incomingFileMap.keySet(), attachmentFileIds).stream() - .map(id -> getIncomingFileById(id, incomingFileMap)) - .toList(); - } - - private IncomingFile getIncomingFileById(String id, Map<String, IncomingFile> incomingFileMap) { - if (!incomingFileMap.containsKey(id)) { - throw new TechnicalException("Failed to find <file> attachment ID '%s' in deposit data!".formatted(id)); - } - return incomingFileMap.get(id); - } - - private List<String> getNamesWithout(Collection<String> names, Collection<String> excludedStrings) { - var excludedStringsSet = Set.copyOf(excludedStrings); - return names.stream().filter(name -> !excludedStringsSet.contains(name)).toList(); - } - - private Stream<Element> streamElements(NodeList nodeList) { - return IntStream.range(0, nodeList.getLength()) - .mapToObj(nodeList::item) - .map(Element.class::cast); - } - -} diff --git a/intelliform-adapter/src/main/java/de/ozgcloud/eingang/intelliform/FormDataEndpoint.java b/intelliform-adapter/src/main/java/de/ozgcloud/eingang/intelliform/FormDataEndpoint.java deleted file mode 100644 index 340276763a73457f180db5233f64e91d3dbc6e44..0000000000000000000000000000000000000000 --- a/intelliform-adapter/src/main/java/de/ozgcloud/eingang/intelliform/FormDataEndpoint.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.intelliform; - -import java.io.IOException; - -import javax.xml.namespace.QName; -import javax.xml.parsers.ParserConfigurationException; - -import jakarta.xml.bind.JAXBElement; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.ws.server.endpoint.annotation.Endpoint; -import org.springframework.ws.server.endpoint.annotation.PayloadRoot; -import org.springframework.ws.server.endpoint.annotation.RequestPayload; -import org.springframework.ws.server.endpoint.annotation.ResponsePayload; - -import de.ozgcloud.eingang.semantik.SemantikAdapter; -import lombok.extern.log4j.Log4j2; - -@Endpoint -@Log4j2 -public class FormDataEndpoint { - - static final String NAMESPACE_URI = "http://xmlns.cit.de/intelliform/2009/webservices/backend"; - static final String PAYLOAD_LOCAL_PART = "deposit"; - - private static final ObjectFactory objectFactory = new ObjectFactory(); - - private static final QName _DepositResponse_QNAME = new QName(NAMESPACE_URI, "depositResponse"); - private static final QName _PrefillResponse_QNAME = new QName(NAMESPACE_URI, "prefillResponse"); - - - @Autowired - private DepositDataMapper depositDataMapper; - @Autowired - private SemantikAdapter semantikAdapter; - - @PayloadRoot(namespace = NAMESPACE_URI, localPart = PAYLOAD_LOCAL_PART) - @ResponsePayload - public JAXBElement<DepositResponse> inputFormData(@RequestPayload Deposit deposit) - throws IOException, ParserConfigurationException { - try { - var formData = depositDataMapper.mapToFormData(deposit.getData()); - semantikAdapter.processFormData(formData); - } catch (Exception e) { - LOG.error("Error processing form data", e); - throw e; - } - - return new JAXBElement<>(_DepositResponse_QNAME, DepositResponse.class, objectFactory.createDepositResponse()); - } - - @PayloadRoot(namespace = NAMESPACE_URI, localPart = "prefill") - @ResponsePayload - public JAXBElement<PrefillResponse> prefillForm(@RequestPayload Prefill prefillRequest) { - PrefillResponse rsp = objectFactory.createPrefillResponse(); - rsp.setReturn(objectFactory.createPrefillResult()); - rsp.getReturn().setPrimaryDataAttachmentId("OZGCloudTeamId"); - - return new JAXBElement<>(_PrefillResponse_QNAME, PrefillResponse.class, rsp); - } -} diff --git a/intelliform-adapter/src/main/resources/application-dev.yml b/intelliform-adapter/src/main/resources/application-dev.yml deleted file mode 100644 index 69939e0578616b5710a27692610dff3ab0af785c..0000000000000000000000000000000000000000 --- a/intelliform-adapter/src/main/resources/application-dev.yml +++ /dev/null @@ -1,13 +0,0 @@ -grpc: - client: - vorgang-manager-kiel: - address: vorgang-manager-clusterip.sh-kiel-dev:9090 - negotiationType: PLAINTEXT - -ozgcloud: - adapter: - organisationseinheiten: - 9081994: kiel - 9080859: kiel - fallbackStrategy: FUNDSTELLE - fundstelleVorgangManagerName: kiel \ No newline at end of file diff --git a/intelliform-adapter/src/main/resources/application-local.yml b/intelliform-adapter/src/main/resources/application-local.yml deleted file mode 100644 index 10ee8e7354442d3a3643c1f11d187a4da104cc0b..0000000000000000000000000000000000000000 --- a/intelliform-adapter/src/main/resources/application-local.yml +++ /dev/null @@ -1,26 +0,0 @@ -logging: - config: classpath:log4j2-local.xml - level: - '[de.ozgcloud]': INFO - - -grpc: - client: - vorgang-manager-local: - address: static://127.0.0.1:9090 - negotiationType: PLAINTEXT - -management: - server: - port: 8082 - -server: - port: 9292 - -ozgcloud: - adapter: - targetVorgangManagerName: local - fallbackStrategy: DENY - routingStrategy: SINGLE - - diff --git a/intelliform-adapter/src/main/resources/application-test.yml b/intelliform-adapter/src/main/resources/application-test.yml deleted file mode 100644 index 6626522d82be3fcb592d256d7853da3baa432955..0000000000000000000000000000000000000000 --- a/intelliform-adapter/src/main/resources/application-test.yml +++ /dev/null @@ -1,20 +0,0 @@ -grpc: - client: - vorgang-manager-kiel: - address: vorgang-manager-clusterip.sh-kiel-test:9090 - negotiationType: PLAINTEXT - vorgang-manager-sl: - address: vorgang-manager-clusterip.sh-sl-test:9090 - negotiationType: PLAINTEXT - -ozgcloud: - adapter: - organisationseinheiten: - 9081994: kiel - 9080859: kiel - 9535669: sl - 235046657: sl - fallbackStrategy: FUNDSTELLE - fundstelleVorgangManagerName: kiel - - diff --git a/intelliform-adapter/src/main/resources/application.yml b/intelliform-adapter/src/main/resources/application.yml deleted file mode 100644 index 8d7d9cb1ba81a598daca364603737a73aad0aa4f..0000000000000000000000000000000000000000 --- a/intelliform-adapter/src/main/resources/application.yml +++ /dev/null @@ -1,50 +0,0 @@ -logging: - level: - ROOT: WARN - '[de.ozgcloud]': INFO - -server: - port: 9292 - -management: - server: - port: 8081 - health: - livenessState: - enabled: true - readinessState: - enabled: true - endpoint: - health: - group: - exploratory: - include: livenessState,readinessState,ping - show-details: always - probes: - enabled: true - prometheus: - enabled: true - endpoints: - web: - exposure: - include: "*" - -grpc: - client: - vorgang-manager-schleswigflensburg: - address: static://127.0.0.1:9090 - negotiationType: PLAINTEXT - vorgang-manager-kiel: - address: static://127.0.0.1:9090 - negotiationType: PLAINTEXT - vorgang-manager-nf: - address: static://127.0.0.1:9090 - negotiationType: PLAINTEXT - -ozgcloud: - adapter: - routingStrategy: MULTI - organisationseinheiten: - 123: kiel - 234: nf - fallbackStrategy: DENY \ No newline at end of file diff --git a/intelliform-adapter/src/main/resources/banner.txt b/intelliform-adapter/src/main/resources/banner.txt deleted file mode 100644 index bc39bb037ef666b7252a871aa8fd9643dc8e5168..0000000000000000000000000000000000000000 --- a/intelliform-adapter/src/main/resources/banner.txt +++ /dev/null @@ -1,5 +0,0 @@ - ___ ___ ___ ___ ___ ___ _____ ___ ___ -|_ _|| __| / \| \ / \| _ \|_ _|| __|| _ \ - | | | _| | - || |) || - || _/ | | | _| | / -|___||_| |_|_||___/ |_|_||_| |_| |___||_|_\ -${spring-boot.version} ${application.version} \ No newline at end of file diff --git a/intelliform-adapter/src/main/resources/intelliform/ApplicationService.wsdl b/intelliform-adapter/src/main/resources/intelliform/ApplicationService.wsdl deleted file mode 100644 index 0c2ef5deb07c11a84b8946222fdc553ea22070fa..0000000000000000000000000000000000000000 --- a/intelliform-adapter/src/main/resources/intelliform/ApplicationService.wsdl +++ /dev/null @@ -1,67 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://xmlns.cit.de/intelliform/2009/webservices/backend" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://xmlns.cit.de/intelliform/2009/webservices/backend" name="ApplicationService"> - <types> - <xsd:schema> - <xsd:import namespace="http://xmlns.cit.de/intelliform/2009/webservices/backend" schemaLocation="ApplicationService.xsd" /> - </xsd:schema> - </types> - <message name="deposit"> - <part name="parameters" element="tns:deposit" /> - </message> - <message name="depositResponse"> - <part name="parameters" element="tns:depositResponse" /> - </message> - <message name="ApplicationFault"> - <part name="fault" element="tns:ApplicationFault" /> - </message> - <message name="prefill"> - <part name="parameters" element="tns:prefill" /> - </message> - <message name="prefillResponse"> - <part name="parameters" element="tns:prefillResponse" /> - </message> - <portType name="Application"> - <operation name="deposit"> - <input message="tns:deposit" /> - <output message="tns:depositResponse" /> - <fault message="tns:ApplicationFault" name="ApplicationFault" /> - </operation> - <operation name="prefill"> - <input message="tns:prefill" /> - <output message="tns:prefillResponse" /> - <fault message="tns:ApplicationFault" name="ApplicationFault" /> - </operation> - </portType> - <binding name="ApplicationPortBinding" type="tns:Application"> - <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document" /> - <operation name="deposit"> - <soap:operation soapAction="" /> - <input> - <soap:body use="literal" /> - </input> - <output> - <soap:body use="literal" /> - </output> - <fault name="ApplicationFault"> - <soap:fault name="ApplicationFault" use="literal" /> - </fault> - </operation> - <operation name="prefill"> - <soap:operation soapAction="" /> - <input> - <soap:body use="literal" /> - </input> - <output> - <soap:body use="literal" /> - </output> - <fault name="ApplicationFault"> - <soap:fault name="ApplicationFault" use="literal" /> - </fault> - </operation> - </binding> - <service name="ApplicationService"> - <port name="ApplicationPort" binding="tns:ApplicationPortBinding"> - <soap:address location="http://localhost:9000/ApplicationService" /> - </port> - </service> -</definitions> \ No newline at end of file diff --git a/intelliform-adapter/src/main/resources/intelliform/ApplicationService.xsd b/intelliform-adapter/src/main/resources/intelliform/ApplicationService.xsd deleted file mode 100644 index cd286752fe05916fd67feb5546ec4412f35b15d6..0000000000000000000000000000000000000000 --- a/intelliform-adapter/src/main/resources/intelliform/ApplicationService.xsd +++ /dev/null @@ -1,134 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<xs:schema xmlns:tns="http://xmlns.cit.de/intelliform/2009/webservices/backend" xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.0" targetNamespace="http://xmlns.cit.de/intelliform/2009/webservices/backend"> - - <xs:element name="ApplicationFault" type="tns:ApplicationFault" /> - - <xs:element name="deposit" type="tns:deposit" /> - - <xs:element name="depositResponse" type="tns:depositResponse" /> - - <xs:element name="prefill" type="tns:prefill" /> - - <xs:element name="prefillResponse" type="tns:prefillResponse" /> - - <xs:complexType name="prefill"> - <xs:sequence> - <xs:element name="data" type="tns:prefillData" minOccurs="0" /> - </xs:sequence> - </xs:complexType> - - <xs:complexType name="prefillData"> - <xs:sequence> - <xs:element name="caller" type="xs:string" minOccurs="0" /> - <xs:element name="client" type="xs:string" minOccurs="0" /> - <xs:element name="clientId" type="xs:string" minOccurs="0" /> - <xs:element name="customParameters" minOccurs="0"> - <xs:complexType> - <xs:sequence> - <xs:element name="entry" type="tns:entry" minOccurs="0" maxOccurs="unbounded" /> - </xs:sequence> - </xs:complexType> - </xs:element> - <xs:element name="customer" type="xs:string" minOccurs="0" /> - <xs:element name="customerId" type="xs:string" minOccurs="0" /> - <xs:element name="form" type="xs:string" minOccurs="0" /> - <xs:element name="formId" type="xs:string" minOccurs="0" /> - <xs:element name="id" type="xs:string" minOccurs="0" /> - <xs:element name="sender" type="xs:string" minOccurs="0" /> - <xs:element name="username" type="xs:string" minOccurs="0" /> - </xs:sequence> - </xs:complexType> - - <xs:complexType name="entry"> - <xs:sequence> - <xs:element name="key" type="xs:string" minOccurs="0" /> - <xs:element name="value" type="xs:string" minOccurs="0" /> - </xs:sequence> - </xs:complexType> - - <xs:complexType name="prefillResponse"> - <xs:sequence> - <xs:element name="return" type="tns:prefillResult" minOccurs="0" /> - </xs:sequence> - </xs:complexType> - - <xs:complexType name="prefillResult"> - <xs:sequence> - <xs:element name="attachments" minOccurs="0"> - <xs:complexType> - <xs:sequence> - <xs:element name="attachment" type="tns:attachment" minOccurs="0" maxOccurs="unbounded" /> - </xs:sequence> - </xs:complexType> - </xs:element> - <xs:element name="customParameters" minOccurs="0"> - <xs:complexType> - <xs:sequence> - <xs:element name="entry" type="tns:entry" minOccurs="0" maxOccurs="unbounded" /> - </xs:sequence> - </xs:complexType> - </xs:element> - <xs:element name="primaryDataAttachmentId" type="xs:string" minOccurs="0" /> - <xs:element name="primaryFormAttachmentId" type="xs:string" minOccurs="0" /> - </xs:sequence> - </xs:complexType> - - <xs:complexType name="attachment"> - <xs:sequence> - <xs:element name="attributes" type="tns:entry" nillable="true" minOccurs="0" maxOccurs="unbounded" /> - <xs:element name="content" type="xs:base64Binary" minOccurs="0" /> - <xs:element name="contentType" type="xs:string" minOccurs="0" /> - <xs:element name="description" type="xs:string" minOccurs="0" /> - <xs:element name="id" type="xs:string" minOccurs="0" /> - <xs:element name="name" type="xs:string" minOccurs="0" /> - </xs:sequence> - </xs:complexType> - - <xs:complexType name="ApplicationFault"> - <xs:sequence> - <xs:element name="customParameters" type="tns:entry" nillable="true" minOccurs="0" maxOccurs="unbounded" /> - <xs:element name="faultId" type="xs:string" minOccurs="0" /> - <xs:element name="message" type="xs:string" minOccurs="0" /> - <xs:element name="userMessage" type="xs:string" minOccurs="0" /> - </xs:sequence> - </xs:complexType> - - <xs:complexType name="deposit"> - <xs:sequence> - <xs:element name="data" type="tns:depositData" minOccurs="0" /> - </xs:sequence> - </xs:complexType> - - <xs:complexType name="depositData"> - <xs:sequence> - <xs:element name="attachments" type="tns:attachment" nillable="true" minOccurs="0" maxOccurs="unbounded" /> - <xs:element name="caller" type="xs:string" minOccurs="0" /> - <xs:element name="client" type="xs:string" minOccurs="0" /> - <xs:element name="clientId" type="xs:string" minOccurs="0" /> - <xs:element name="customParameters" type="tns:entry" nillable="true" minOccurs="0" maxOccurs="unbounded" /> - <xs:element name="customer" type="xs:string" minOccurs="0" /> - <xs:element name="customerId" type="xs:string" minOccurs="0" /> - <xs:element name="form" type="xs:string" minOccurs="0" /> - <xs:element name="formId" type="xs:string" minOccurs="0" /> - <xs:element name="id" type="xs:string" minOccurs="0" /> - <xs:element name="primaryDataAttachmentId" type="xs:string" minOccurs="0" /> - <xs:element name="primaryFormAttachmentId" type="xs:string" minOccurs="0" /> - <xs:element name="sender" type="xs:string" minOccurs="0" /> - <xs:element name="timestamp" type="xs:dateTime" minOccurs="0" /> - <xs:element name="username" type="xs:string" minOccurs="0" /> - </xs:sequence> - </xs:complexType> - - <xs:complexType name="depositResponse"> - <xs:sequence> - <xs:element name="return" type="tns:depositResult" minOccurs="0" /> - </xs:sequence> - </xs:complexType> - - <xs:complexType name="depositResult"> - <xs:sequence> - <xs:element name="attachments" type="tns:attachment" nillable="true" minOccurs="0" maxOccurs="unbounded" /> - <xs:element name="customParameters" type="tns:entry" nillable="true" minOccurs="0" maxOccurs="unbounded" /> - </xs:sequence> - </xs:complexType> -</xs:schema> \ No newline at end of file diff --git a/intelliform-adapter/src/main/resources/logback-spring.xml b/intelliform-adapter/src/main/resources/logback-spring.xml deleted file mode 100644 index ac9706e95c282256f752bd433446e6c92488431b..0000000000000000000000000000000000000000 --- a/intelliform-adapter/src/main/resources/logback-spring.xml +++ /dev/null @@ -1,20 +0,0 @@ -<configuration> - <include resource="org/springframework/boot/logging/logback/defaults.xml"/> - <include resource="org/springframework/boot/logging/logback/console-appender.xml"/> - - <springProfile name="!oc"> - <root> - <appender-ref ref="CONSOLE"/> - </root> - </springProfile> - - <springProfile name="oc"> - <appender name="LOGSTASH" class="ch.qos.logback.core.ConsoleAppender"> - <encoder class="net.logstash.logback.encoder.LogstashEncoder"/> - </appender> - <root> - <appender-ref ref="LOGSTASH"/> - </root> - </springProfile> - -</configuration> diff --git a/intelliform-adapter/src/main/scripts/create-demo-vorgang.sh b/intelliform-adapter/src/main/scripts/create-demo-vorgang.sh deleted file mode 100755 index f7a904da377e7ccd60961c90241df24c2a1c1a8a..0000000000000000000000000000000000000000 --- a/intelliform-adapter/src/main/scripts/create-demo-vorgang.sh +++ /dev/null @@ -1,45 +0,0 @@ -#!/bin/bash -# -# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den -# Ministerpräsidenten des Landes Schleswig-Holstein -# Staatskanzlei -# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung -# -# Lizenziert unter der EUPL, Version 1.2 oder - sobald -# diese von der Europäischen Kommission genehmigt wurden - -# Folgeversionen der EUPL ("Lizenz"); -# Sie dürfen dieses Werk ausschließlich gemäß -# dieser Lizenz nutzen. -# Eine Kopie der Lizenz finden Sie hier: -# -# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 -# -# Sofern nicht durch anwendbare Rechtsvorschriften -# gefordert oder in schriftlicher Form vereinbart, wird -# die unter der Lizenz verbreitete Software "so wie sie -# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - -# ausdrücklich oder stillschweigend - verbreitet. -# Die sprachspezifischen Genehmigungen und Beschränkungen -# unter der Lizenz sind dem Lizenztext zu entnehmen. -# - -set -e -set -x - -# Dev: https://kiel-afm.dev.by.ozg-cloud.de/ws/if -# Test: https://kiel-afm.test.by.ozg-cloud.de/ws/if - -URL=http://localhost:9292/ws/if -if [ -n "$1" ]; then - URL=$1 -fi - -echo "Send request to ${URL} ..." -echo - -SCRIPT_DIR=$(cd $(dirname "${BASH_SOURCE[0]}") && pwd) - -for file in ${SCRIPT_DIR}/vorgang-*.xml; -do - curl -v --header "Content-Type: text/xml;charset=UTF-8" --data @$file ${URL}; -done diff --git a/intelliform-adapter/src/main/scripts/vorgang-A12-deutschlandticket.xml b/intelliform-adapter/src/main/scripts/vorgang-A12-deutschlandticket.xml deleted file mode 100644 index 6ffd8154e303d67ed4c591d1665d0d83b747d3d5..0000000000000000000000000000000000000000 --- a/intelliform-adapter/src/main/scripts/vorgang-A12-deutschlandticket.xml +++ /dev/null @@ -1,1379 +0,0 @@ -<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> - <soap:Body> - <ns2:deposit xmlns:ns2="http://xmlns.cit.de/intelliform/2009/webservices/backend"> - <data> - <attachments> - <attributes> - <key>X-IntelliForm-Signed</key> - <value>false</value> - </attributes> - <content>PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPG15Rm9ybSB4bWxuczpwZGY9 -Imh0dHA6Ly94bWxucy5jaXQuZGUvYXNzaXN0YW50cy9wZGYiIHhtbG5zOnQ9Imh0dHA6Ly94bWxu -cy5jaXQuZGUvaW50ZWxsaWZvcm0vdHJhbnNhY3Rpb24iIHQ6dXVpZD0iYjIyYWFkZTktZWI5OS00 -OTE5LWJmZDItNWIyN2NjZTEwZjdmIiB0OmlkPSIyMDI0MDIwMTUzOTk1MDM4NDQwNyIgdDp0aW1l -c3RhbXA9IjIwMjQtMDItMDFUMTM6NTk6NTUuMDUyWiIgdDpzZW5kZXI9InRlc3QuYWZtLnNjaGxl -c3dpZy1ob2xzdGVpbi5kZSIgdDpmb3JtPSJEZXV0c2NobGFuZHRpY2tldCBFcnN0YXR0dW5nIiB0 -OmZvcm0taWQ9Im1vYl9kdGlja2Vyc3QvbW9iX2R0aWNrZXJzdCIgdDpjdXN0b21lcj0iS3JlaXMg -Tm9yZGZyaWVzbGFuZCIgdDpjdXN0b21lci1pZD0ia3JlaXMtbm9yZGZyaWVzbGFuZC9rcmVpcy1u -b3JkZnJpZXNsYW5kIiB0OmNsaWVudD0iU2NobGVzd2lnLUhvbHN0ZWluIiB0OmNsaWVudC1pZD0i -bGFuZCIgdDpsYW5nPSJkZSI+PERTX2phX25laW4+dHJ1ZTwvRFNfamFfbmVpbj48T3JnYW5pc2F0 -aW9uc2VpbmhlaXRlbklEPjEwMzYzNDU1PC9PcmdhbmlzYXRpb25zZWluaGVpdGVuSUQ+PG5hbWVp -ZD41MjU4MzYyYi04MTg1LTQ1N2ItYTVhNy0wOGQ4NGZkYmNjNmQ8L25hbWVpZD48QW50cmFnc3Rl -bGxlcj48cGVyc192b3JuYW1lPlJpdGE8L3BlcnNfdm9ybmFtZT48cGVyc19uYWNobmFtZT5BYmJh -cmE8L3BlcnNfbmFjaG5hbWU+PHNoX3N0cmFzc2U+QnJhY2tlbjwvc2hfc3RyYXNzZT48c2hfaGF1 -c251bW1lcj41MDwvc2hfaGF1c251bW1lcj48c2hfcGx6PjI1ODczPC9zaF9wbHo+PG9ydD5SYW50 -cnVtPC9vcnQ+PHBlcnNfaWJhbj5ERTcxNTAwMTA1MTc1Mzg2NDc2NzIwPC9wZXJzX2liYW4+PC9B -bnRyYWdzdGVsbGVyPjxkYz50cnVlPC9kYz48c2NodWVsZXJfdm9ybmFtZT5Sb215PC9zY2h1ZWxl -cl92b3JuYW1lPjxzY2h1ZWxlcl9uYWNobmFtZT5BYmJhcmE8L3NjaHVlbGVyX25hY2huYW1lPjxz -Y2h1ZWxlcl9nZWJ1cnRzZGF0dW0+MTk4NS0xMi0xOTwvc2NodWVsZXJfZ2VidXJ0c2RhdHVtPjxz -Y2h1ZWxlcl9zdHJhc3NlPkJyYWNrZW48L3NjaHVlbGVyX3N0cmFzc2U+PHNjaHVlbGVyX2hhdXNu -dW1tZXI+NTA8L3NjaHVlbGVyX2hhdXNudW1tZXI+PHNjaHVlbGVyX3Bsej4yNTg3Mzwvc2NodWVs -ZXJfcGx6PjxzY2h1ZWxlcl9vcnQ+UmFudHJ1bTwvc2NodWVsZXJfb3J0Pjx0aWNrMl92b3JuYW1l -PlJvbXk8L3RpY2syX3Zvcm5hbWU+PHRpY2syX25hY2huYW1lPkFiYmFyYTwvdGljazJfbmFjaG5h -bWU+PHRpY2syX2dlYnVydHNkYXR1bT4xOTg1LTEyLTE5PC90aWNrMl9nZWJ1cnRzZGF0dW0+PHRp -Y2syX3N0cmFzc2U+QnJhY2tlbjwvdGljazJfc3RyYXNzZT48dGljazJfaG51bW1lcj41MDwvdGlj -azJfaG51bW1lcj48dGljazJfcGx6PjI1ODczPC90aWNrMl9wbHo+PHRpY2syX29ydD5SYW50cnVt -PC90aWNrMl9vcnQ+PHNjaHVsX29ydD5IdXN1bTwvc2NodWxfb3J0PjxzY2h1bF9uYW1lPlJ1bmdo -b2x0c2NodWxlIEh1c3VtPC9zY2h1bF9uYW1lPjx0aWNrZXRlcmZhc3N1bmc+PHRpY2tldGVyZmFz -c3VuZy1pdGVtPjx0aWNrZXRtb25hdD4xMjwvdGlja2V0bW9uYXQ+PHRpY2tldGphaHI+MjAyMzwv -dGlja2V0amFocj48dGlja2V0Zm90bz48ZmlsZSBjb250ZW50LXR5cGU9ImFwcGxpY2F0aW9uL3Bk -ZiIgZGVzY3JpcHRpb249IiIgaWQ9ImFzc2lzdGFudHMuODFDMDcyNTUxQTdFNTU2M0YxRUVFNDZB -Q0ExMDcwRDE1MEQ5RTFCMCIgbGVuZ3RoPSIxODk4OSI+ZG9taW5pb25fc21hbGwucGRmPC9maWxl -PjwvdGlja2V0Zm90bz48L3RpY2tldGVyZmFzc3VuZy1pdGVtPjx0aWNrZXRlcmZhc3N1bmctaXRl -bT48dGlja2V0bW9uYXQ+MTwvdGlja2V0bW9uYXQ+PHRpY2tldGphaHI+MjAyNDwvdGlja2V0amFo -cj48dGlja2V0Zm90bz48ZmlsZSBjb250ZW50LXR5cGU9ImFwcGxpY2F0aW9uL3BkZiIgZGVzY3Jp -cHRpb249IiIgaWQ9ImFzc2lzdGFudHMuMkJCNkExQzMzN0QyOEY2MkQ5RkZFMUY1NTBCRDM5Mjcw -M0JEM0M4OCIgbGVuZ3RoPSIxODk4OSI+ZG9taW5pb25fc21hbGwgKDEpLnBkZjwvZmlsZT48L3Rp -Y2tldGZvdG8+PC90aWNrZXRlcmZhc3N1bmctaXRlbT48L3RpY2tldGVyZmFzc3VuZz48L215Rm9y -bT4= - - - -</content> - <contentType>text/xml</contentType> - <id>myForm-xml</id> - <name>XML-Daten.xml</name> - </attachments> - <attachments> - <attributes> - <key>X-IntelliForm-Signed</key> - <value>false</value> - </attributes> - <content>JVBERi0xLjYNCiXi48/TDQolQ3JlYXRlZCBieSBjaXQgcGRmc3VpdGUgKHd3dy5jaXQuZGUpIGJ1 -aWxkIDk4MTQNCjEgMCBvYmoKPDwNCi9Hcm91cCA8PA0KL1MgL1RyYW5zcGFyZW5jeQ0KL0kgdHJ1 -ZQ0KL0NTIC9EZXZpY2VSR0INCj4+DQovQ29udGVudHMgMiAwIFINCi9UeXBlIC9QYWdlDQovUmVz -b3VyY2VzIDI1IDAgUg0KL1BhcmVudCA4IDAgUg0KL01lZGlhQm94IFsgMCAwIDU5NS4yNDcyNCA4 -NDEuODYxNDEgXQ0KPj4KZW5kb2JqCjIgMCBvYmoKPDwNCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlDQov -TGVuZ3RoIDMgMCBSDQo+PnN0cmVhbQ0KeJzNWUuP3DYMvs+v0DnAOCL1sAQMDIznUbS3tAvkUPTU -Ni2KbIvNJX+/oijJdkbS7AZotljElmTx9ZEixYkcQHzePQkp5CDRCePNgOCE0zA4pcSn33fv34i/ -dyDo79MfO2MHa4T14QUgHndGucEsCx9FXnByMLzAFF/OM8Huz92HN6xB+AsS5gcS4sQ46sFZEA+/ -ibfXID2MPvx8kDDhQeK0D081wUHqSR+kmfbuIC0Nx2kfno4+8S4/QRgf4zKvRJJIzHQzzU80P9PD -T788/LC7POzeVdWyOMCtWpfCM8gggVGZKy2sORetaBFkX5L2g7mRBFDomRXg5IkV2WfSGycrD6Di -2NITdF+UshWswZCSlh4jPdy0Hw8QjWCmx2AjzBHI+IJTXwrAYhCuPBo1BsKP3bOPrmExI7lUp7lj -FGkX+/k4FYJ54WB4aPM8RcOW4eIWopdp9VLctuJ3TmCPSSzIyJJcAUwXnKDTPrfQRUxURE3T0LCT -ijanrCcwnipDzZwUR9LYBdV6N/hbUCNI4LJ5WXEf8GIxmj1atEpIdEU5NeiVKM1RciT+gd9eEQNF -opQmt7oImlr8GoaGXBD3ENHMQo2i0GEtAxhnuIR/V7ikCUoERCSgUCGEBUQNV/oaNqHpK61XaaTg -g3bjfXYVjtkzjMnaK5r35+hhf5tGiGyia86LcCfUb2MuqbFxUFHWxVUShn5KXNZh9mXQz1kjDltG -IIYJHldbK7DMfYAVDnibO86TGTd5+JwjnlydsndwcUlRC25lQ0MshBQ8tuReE8cAC+dCyvYpLZ7Y -RCMPSGUEyWRcTmLOzF1rpV2OW5EaYhMPJffm/Iya3bm1M2ZNtpNTZ44dE5NF3+aq9LXNZimPUQUL -yGWJY9emuI7B3rPTeF1BNwRdTqe51Mxc+Ij5gjR6ln7koNYbAHCeMkztCsj21rVY2bspUUEHjLgu -JSrEwPowrl30nIplrKt5+xxZE9QxjtoZOllR5bKyQkZ08EIMTyUvJy+RVWNe5JEt01MsLjYbzXWa -wg6vy2fNQ2C07jlewSD/F/ky6uzbtRHTJ9ZA5xyI55fnMANuUK+Qwxpyb3KYKxyVpATmtwmMAHt2 -BjPSDOONTAVRkMoZkXNTPqTx2sLX11M5RrSld4KSiVVx6yNMxilMVyVdLiWbOX9Pwd+zTnu1hO83 -z8916f9Fftahn9Kvnp/rWny7/KyNqTRj0dtoo3Uwp8uPvnsY68xuDiOUi5RSBUNXpOTTssiHjRMi -KpXGaWkaNbcStc3Urt7BJdmiseKYlKSiFFsuRytZsn+4lFG1XoOasFUqvrlEnjkGtrVhVQZia3I3 -2T8njyt0g80KqlWHGVhTVOnyo8Gqw8TUjeTuEsgi6GMxtkSFcAsVVNFgRQ2RGsSG8tfHnRys+Jx4 -//jdToq9HLx4DE1L+BDHH8VPty5GGFRHAcT2S8EzX63wuid7HMeG8VvSjvWKUGpbb9wAX+VpS5mG -fzXIkXVp2mma0RSs1KB9y8oVYcdGAyFcmzai9N0Q06/65PB+8auB9D1bR29bEbUl7aAdynIHbSVV -oPvKiLouvzDZNGwYSmJMz6kodcPQLWkvrELabxvKORJMrRtJt67mcfAEUZ3UlMbEcHVvAmDo5FaZ -cN5d7rm5MkEacYGNVZcdkLadSnmNxTfeGJVZJfJuuQiwVq7fz4KiTvpCKKpMXgUKKyu/NS+WKL6t -lT6U51+YG3rOFmYAISSrMta3kfxs1h4dQKtyWTpmvq9FpVizZd5pHVCFc1PhTIwf/qqT+HAkayQB -mwaJwhA5d6S8E0/x9mbEKDF2Ts4IBwN6X/435imsDdJE1uGTMnzfYxIHMUO8/f5Ri/M/gjj+C3bw -j/oNCmVuZHN0cmVhbQplbmRvYmoKMyAwIG9iagoxNDAzCmVuZG9iago0IDAgb2JqCjw8DQovQ29s -b3JTcGFjZSBbIC9JbmRleGVkIC9EZXZpY2VSR0IgODMgPDAwMzQ5NDAwMzg5NjAwM2U5YTAwNDI5 -YzA1NDg5ZTBkNDc5ZTA4NDg5ZjA2NDlhMDBjNGRhMTBmNTBhMzEwNGVhMjExNTBhMzE5NTZhNjFi -NThhNzFkNTlhODIyNWRhYTI4NWVhYjI2NjBhYjJiNjNhZDMwNjZhZjMxNjhhZjMyNjdiMDM0NmFi -MTM5NmRiMjNkNzBiNDQyNzRiNjQ1NzdiODQ2NzhiODQ4NzdiNzQ4NzdiODRiN2FiOTUwN2ViYjU0 -ODFiZDU5ODRiZTViODZjMDVkODhjMDYzOGNjMjY4OGZjNDY3OTBjNDZiOTJjNjZmOTZjODcwOTVj -NzcxOTZjODc1OTljOTc5OWRjYjdkYTBjZDgxYTNjZTg1YTVkMDg3YThkMTg4YTdkMThjYWFkMjkx -YWVkNDk1YjFkNTk4YjNkNzliYjVkODllYjhkOWEzYmJkYmE4YmZkZGFiYzFkZWFlYzRlMGIyYzZl -MWI1YzhlMmJhY2NlNGJmZDBlNmMxZDFlNmM1ZDRlOGM4ZDZlOWNjZDllYmQxZGRlZGQ1ZTBlZWQ4 -ZTFlZmQ3ZTJmMGRiZTRmMWRmZThmMmUwZTdmMmUyZWFmM2U4ZWVmNmViZjBmNmVlZjJmOGYyZjVm -OWY2ZjhmYmZkZmVmZTAwMDAwMGZmZmZmZj4gXQ0KL1N1YnR5cGUgL0ltYWdlDQovSGVpZ2h0IDMz -OA0KL0ZpbHRlciAvRmxhdGVEZWNvZGUNCi9UeXBlIC9YT2JqZWN0DQovV2lkdGggMzQyDQovU01h -c2sgNiAwIFINCi9CaXRzUGVyQ29tcG9uZW50IDgNCi9MZW5ndGggNSAwIFINCj4+c3RyZWFtDQp4 -nO19bVcbubJ1aN1utWSMubCIgWcBCZcs5hACi5BwICEEjkkOC8bY+v9/5lGV3qqkNiEzSciHaSfG -bnerpa1dpSq9lO7u/jl+6HFv7NHrqX9eP/AldgHVtm3lP/9/2P+2Cqj+c/zA4x9Uf8Yh/kH1Jxz/ -cPVnHP+g+jOOfzTATzhU9QdBVcl/Xj/kRVGVqlbwX4UP//z/a/+V1atTylWEupbuUxNO/K6f2/T9 -MXmGO35J2Whr5dgbf+J/frfP8EdIewBM8PaoPNs71M/PX6ZXa4tp+B3I3ODr9/wsxdLKkmptGUDm -HpNnJXY/b8g2UKdxyfz4zzXTAJHHSjZBYqRiH4M6fvLzrZRvJ8bc3t3d3Nz8+VGC9qofvlequbdm -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 -T3gw0a5Wm1OT62la+bLkxOwXy3bvAd+KaN/HpNwFGxe3PI3CA6OXp4qlsol/U4i/DAh2ZwJKslQY -oTNweUbIj0wT0WynuqX4P+RbyTLXivTNuw86fOi4uviSpcApmsjEM8x0pKRbIOctUgcq5ATX10zj -NOmR9AdCfpIifZNZcv7jTN8qvXQK/UW5m78XGWWi1Xl7k3tgCR9J/+SaiwZALm/k1xaPpqZQB4Il -UpwtuUbJeOrOFHtcJlLFeyIzdJfk+4BqNKJxV4FY7nSe6RRXjuSw4XdE2UiBJUNCHNimSEunhEht -0qsUa/kJQdMQXzK7eRUxmYwe6wzfKvyPYfEiSRhALEggk4MOaykkKJXOqp2FQqSSHeiuQ1FigDcW -66+DsfSUlhzsmI8uqqd7yIUdtgqpMeXwCb84vfr/Adje284NCmVuZHN0cmVhbQplbmRvYmoKNSAw -IG9iagoyNDMxOAplbmRvYmoKNiAwIG9iago8PA0KL0NvbG9yU3BhY2UgL0RldmljZUdyYXkNCi9E -ZWNvZGUgWyAxIDAgXQ0KL1N1YnR5cGUgL0ltYWdlDQovSGVpZ2h0IDMzOA0KL0ZpbHRlciAvRmxh -dGVEZWNvZGUNCi9UeXBlIC9YT2JqZWN0DQovV2lkdGggMzQyDQovQml0c1BlckNvbXBvbmVudCA4 -DQovTGVuZ3RoIDcgMCBSDQo+PnN0cmVhbQ0KeJzt0sEJAkEQAMEVD8xTxLwvABNQcPwYwvavKoSm -z5OtXvOdOdjpdjznM7PY6bLu81Z1s+t6eHU7VQuqFlQtqFpQtaBqQdWCqgVVC6oWVC2oWlC1oGpB -1YKqBVULqhZULahaULWgakHVgqoFVQuqFlQtqFpQtaBqQdWCqgVVC6oWVC2oWlC1oGpB1YKqBVUL -qhZULahaULWgakHVgqoFVQuqFlQtqFpQtaBqQdWCqgVVC6oWVC2oWlC1oGpB1YKqBVULqhZULaha -ULWgakHVgqoFVQuqFlQtqFpQtaBqQdWCqgVVC6oWVC2oWlC1oGpB1YKqBVULqhZULahaULWgakHV -gqoFVQuqFlQtqFpQtaBqQdWCqgVVC6oWVC2oWlC1oGpB1YKqBVULqhZULahaULWgakHVgqoFVQuq -FlQtqFpQtaBqQdWCqgVVC6oWVC2oWlC1oGpB1YKqBVULqhZULahaULWgakHVgqoFVQuqFlQtqFpQ -taBqQdWCqgVVC6oWVC2oWlC1oGpB1YKqBVULqhZULahaULWgakHVgqoFVQuqFlQtqFpQtaBqQdWC -qgVVC6oWVC2oWlC1oGpB1YKqBVULqhZULahaULWgakHVgqoFVQuqFlQtqFpQtaBqQdWCqgVVC6oW -VC2oWlC1oGpB1YKqBVULqhZULahaULWgakHVgqoFVQuqFlQtqFpQtaBqQdWCqgVVC6oWVC2oWlC1 -oGpB1YKqBVULqhZULahaULWgakHVgqoFVQuqFlQtqFpQtaBqQdWCqgVVC6oWVC2oWlC1oGpB1YKq -BVULqhZULahaULWgakHVgqoFVQuqFlQtqFpQtaBqQdWCqgVVC6oWVC2oWlC1oGpB1YKqBVULqhZU -LahaULWgakHVgqoFVQuqFlQtqFpQtaBqQdWCqgVVC6oWVC2oWlC1oGpB1YKqBVULqhZULahaULWg -akHVgqoFVQuqFlQtqFpQtaBqQdWCqgVVC6oWVC2oWlC1oGpB1YKqBVULqhZULahaULXwr/oDLdXz -xA0KZW5kc3RyZWFtCmVuZG9iago3IDAgb2JqCjc3MgplbmRvYmoKOCAwIG9iago8PA0KL0tpZHMg -WyAxIDAgUiBdDQovVHlwZSAvUGFnZXMNCi9Db3VudCAxDQovUmVzb3VyY2VzIDI1IDAgUg0KL01l -ZGlhQm94IFsgMCAwIDU5NSA4NDEgXQ0KPj4KZW5kb2JqCjkgMCBvYmoKPDwNCi9MZW5ndGgxIDE3 -MzAwDQovRmlsdGVyIC9GbGF0ZURlY29kZQ0KL0xlbmd0aCAxMCAwIFINCj4+c3RyZWFtDQp4nN17 -e3yTVdLwmeeSe5p7G5pCnjRtAVPa0rRgAWm4tBYBCZRCA0IbeqFVaGMTQFCh3LQUkaqIi6CgogKi -pFAFvFGv642V3fWyu75Kve276w2WxfUCTd95zvMkFGTd7/d+319fSp7MmTNnzpyZOXNmTkKkZUkd -0ZFWwhJfzeJg6M6mYBsh5B1CwFyzNCKwk9/PQriHEKatPrRw8f2HrztLCNdAiLJr4aLl9cfypnxF -iC6NkKzTDXXB2oo5y7MJ8eqQx4gGRNwWW6PE9kRsZzQsjtz0rA3+jG0cT/5rUXNNsJH/5BQhBWJ/ -aHHwplADO43Bdhe2habg4rqFhpsHYPs9QrRzQ83hyFbS3UeIL0/sD7XUhe6YdOgItv2EsBMQB/gn -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 -OP9ReoXzdKnHWXVq1SnGcGraqapTm08dOMVrv/xikPPzz0qdhs/A91lpsvPTnlLnuz0ne071sL4e -74jSnlK787tv+5zfwt8qvin7uuKrfFLx97/9reK/y0jFX0mf8+OrTlacBLbik6vYiv9i+5yG953v -M/The8vuKH33ZXihe4zzJX+W8/kXhzj7joL/SOhI6xH2SF+3r++IOb/Uebj48LTDzYdXHd55+MBh -pf0ZCB3cdTB6kDUchI6nIfo0GJ4GleFQ8aFTh9jWaEeUiUa7oyeibO6B4gPMriejTzLdT554ksnd -X7yf2fkEdO87sY+ZtnfzXiZ3b/PeY3v79nI7tmc4/duheSsc2wpbSwc6792S4jRscW5ZtWXzlr4t -fN5dvruY1rsgtLl1M9OxGbo3n9jMTLuj6o7mO9jbSvucO9fDurXDnZFwsTOMC2luGuNsKi10poK9 -YoDXXqH0shUKXHo19lXh+7rS4c65c8qcc/DTkm+u4FE9XD5bsYgFHTuGncIuYm9h+VPT+3y10xnf -9MIrS33TM4eUvuuHSaWCsww5X43vA6VwsvRUKdNaCsn5tgoTGCqM+YYKBtD+BJxOQ7GhyrDKwBkM -uYZphmbDZsNJQ59BWYy4Uwa2mcA0Aq3JwMMR6OicWe7xTD6i7JsxOar0z41CWzSzXHz6ps+JKtqi -pGLO3MpOgDsD6zdtIuMHTo7ml1dGqwcGJkdrEfCJQCsCxoGdyWR8IBwJR5Z4xBdIAIl4POGwCIHY -8kh9FAJPGLuRDAdhI7KEhD3hCITDuFkiiA/DfITDGGoQH8aKEImQROaf4IQTzEdG+IhIU4TDOC6M -fMLydPb55H8Ai6DrtA0KZW5kc3RyZWFtCmVuZG9iagoxMCAwIG9iagoxMDk2MQplbmRvYmoKMTEg -MCBvYmoKPDwNCi9EZXNjZW50IDANCi9DYXBIZWlnaHQgOTc5DQovU3RlbVYgODANCi9UeXBlIC9G -b250RGVzY3JpcHRvcg0KL0ZvbnRGaWxlMiA5IDAgUg0KL0ZsYWdzIDQNCi9Gb250TmFtZSAvQkFB -QUFBK0xpYmVyYXRpb25TYW5zDQovRm9udEJCb3ggWyAtNTQzIC0zMDMgMTMwMCA5NzkgXQ0KL0l0 -YWxpY0FuZ2xlIDANCi9Bc2NlbnQgMA0KPj4KZW5kb2JqCjEyIDAgb2JqCjw8DQovRmlsdGVyIC9G -bGF0ZURlY29kZQ0KL0xlbmd0aCA0NjANCj4+c3RyZWFtDQp4nF2Ty27bMBBF9/oKLtNFIJHUIwEM -AY4dA16kDer0A2SJdgXUlEDLC/99eOcyLdCFjUNyZnhIDfPNfrv345K/h6k/uEWdRj8Ed51uoXfq -6M6jz7RRw9gvaST//aWbszzmHu7XxV32/jStVln+M65dl3BXD+thOrpvWf4jDC6M/qwefm0OcXy4 -zfMfd3F+UUXWtmpwp1jnrZu/dxeXS9bjfojL43J/jCn/Aj7us1NGxpoq/TS469z1LnT+7LJVUbRq -tdu1mfPDf2tVyZTjqf/dhRiqY2hRlC9tZCPcGLAVritwSX4GV4yx4FrYFOCGdV7BT4zfgZ/JJXhN -rsEv5A14Q9bgLVnqvLKm5O7IiNcFHTCvk/8WTP8aZ9H0N6ij6W+xr6a/xRk1/S3OqOlvn8D0t/DR -9Lc4r6Z/KTH0byQ3+YsD/SvZi/5GnOlv15EN/Ss4mOSPvUzyl3n6V9jX0H+L+zT0LyWG/rXEJH98 -C0P/Spj+jeyb7h/+hv6l1KS/bcD0L/GtTbp/nNEkf9y5TfePGJv8kWvpb2U+9Y/M07/CXjb1D9xs -6h82aupItCze1NdTUP0thPgM5OFJ/6PzR+/+vs15mpElv0+6fem/DQplbmRzdHJlYW0KZW5kb2Jq -CjEzIDAgb2JqCjw8DQovU3VidHlwZSAvVHJ1ZVR5cGUNCi9GaXJzdENoYXIgMA0KL1R5cGUgL0Zv -bnQNCi9CYXNlRm9udCAvQkFBQUFBK0xpYmVyYXRpb25TYW5zDQovRm9udERlc2NyaXB0b3IgMTEg -MCBSDQovVG9Vbmljb2RlIDEyIDAgUg0KL0xhc3RDaGFyIDU0DQovV2lkdGhzIFsgNzUwIDY2NiAz -MzMgNTU2IDIyMiA1MDAgMjc3IDcyMiA1NTYgNTU2IDI3NyAyMjIgNTU2IDU1NiA3MjIgNTU2DQoy -NzcgODMzIDUwMCAyNzcgNTU2IDU1NiA1NTYgNTU2IDU1NiA1NTYgNzIyIDU1NiA4MzMgNjY2IDI3 -NyAyNzcNCjcyMiA2NjYgNTU2IDY2NiA2MTAgNjY2IDUwMCA1NTYgNjY2IDUwMCA1NTYgNzc3IDU1 -NiAyNzcgNjY2IDU1Ng0KNTAwIDc3NyA1NTYgNTU2IDU1NiA1NTYgMjc3IF0NCj4+CmVuZG9iagox -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 -F15b+hr3GuF7fWsNpATdWPAq4inhyU8/S0okV+m81lf5adfzz027lj5Hnm6zuZ4MRF1P9E27Tp4o -diW/T5zMzik5ifg9YnlMfEx6jO87kToxfoI3H9t+jJvkV7lOkiJp+kitS3542uU73ng8cJz/ynEi -Ha+obHUd9R1tPHrvUcF8lEhHTcWt9x4h30W1Rx6+2PVwV4XrnsOLXXcfLnd9A0843HeYGz989jB3 -b8e0y3y763bOfIPrBu62QxWuW2+pcH3lpgrXzXiaD7oOctsPJg/uPzh9UAgcJNLBwpJW803kurZa -173XkmuGp13jOKkx9D+KZxbPDJ6+PY17Anv4XUmXK9VmdiXbFrjKiKO3tM7Rq6vje7Vo8tAwqRwm -Q0iF0aBve61rO94jbfNcpf3v9nNiv83eWtlf39/ez1/R5nRt2zLt2rqlzrWlrVbqdhURW29hra1X -g5ALtXxvkidmvpEP8El+P6+5M0QO7SCBnu09nNSzpLpV6lmwEC+Fjtad3Vd139jNbwjMc3XhWRqo -DHChQCLAnSTFxzHJ0SeJHa4jdmkt13UZuW+9vP7Z9fz6tiJXJ863A89L21yu6XbSjpNahyy0kXnO -cVdxrb3XSsy9llpzL0ewswCLSqzHnKV4s0g1eHeZG83bzfvNgtnsMwfMSfNXzK+bp826RpT92cwn -gQSAjBcTDTlJDk1u7Kmq6jipm+7ukHVdW2RyQC7voVdpw2ZZe0CG3s1bgpOE3By67uBBaJrfIdf2 -BOW++aEOOYqERIlxJCzzJ4uhKZTJZrKjVepBslVV2SpAKpvJVGWQyyCdyRDcEJkSYYMZVKpiA4oM -hRnVQaYKqOGoOkxdKApZSjMWvaE7ZkuqsszfKLVnalWEjdED1TJQNedQYzj+G9uWtogNCmVuZHN0 -cmVhbQplbmRvYmoKMTUgMCBvYmoKNjA3NAplbmRvYmoKMTYgMCBvYmoKPDwNCi9EZXNjZW50IDAN -Ci9DYXBIZWlnaHQgMTAyOQ0KL1N0ZW1WIDgwDQovVHlwZSAvRm9udERlc2NyaXB0b3INCi9Gb250 -RmlsZTIgMTQgMCBSDQovRmxhZ3MgNjgNCi9Gb250TmFtZSAvREFBQUFBK0xpYmVyYXRpb25TYW5z -LUJvbGRJdGFsaWMNCi9Gb250QkJveCBbIC00NzcgLTM3NiAxMzU2IDEwMjkgXQ0KL0l0YWxpY0Fu -Z2xlIC0zMA0KL0FzY2VudCAwDQo+PgplbmRvYmoKMTcgMCBvYmoKPDwNCi9GaWx0ZXIgL0ZsYXRl -RGVjb2RlDQovTGVuZ3RoIDI5MA0KPj5zdHJlYW0NCnicXdFLb4MwDADge35Fjt2h4tFCWwkh9YXE -YQ+N7gdAYrpII0QhHPj3i+Nuk3YAfbbjKHGic32ptXLRmx1FA473SksL0zhbAbyDu9IsSblUwj2i -8BdDa1jke5tlcjDUuh+LgkXvvjY5u/DVUY4dPLHo1UqwSt/56uPc+LiZjfmCAbTjMStLLqH3+zy3 -5qUdIApd61r6snLL2rf8LbgtBnga4oSOIkYJk2kF2FbfgRVxXPKiqkoGWv6rJRm1dL34bK1fmvil -cZxtS+80OD+gN+QNeks+oTNyhs6Dd6F3R/kLek+u0AfyFX0kJ+hTcBqjz5Q/oi/kPfpK+6foivJ5 -uNTj9Hg9nP/P2LiYrfUjC48UZoVTUhp+39GMBrvC9w0F8I6QDQplbmRzdHJlYW0KZW5kb2JqCjE4 -IDAgb2JqCjw8DQovU3VidHlwZSAvVHJ1ZVR5cGUNCi9GaXJzdENoYXIgMA0KL1R5cGUgL0ZvbnQN -Ci9CYXNlRm9udCAvREFBQUFBK0xpYmVyYXRpb25TYW5zLUJvbGRJdGFsaWMNCi9Gb250RGVzY3Jp -cHRvciAxNiAwIFINCi9Ub1VuaWNvZGUgMTcgMCBSDQovTGFzdENoYXIgMTUNCi9XaWR0aHMgWyA3 -NTAgNjEwIDI3NyA1NTYgNTU2IDU1NiAzMzMgODg5IDYxMCA2MTAgNTU2IDI3NyAyNzcgNjEwIDM4 -OSAzMzMNCl0NCj4+CmVuZG9iagoxOSAwIG9iago8PA0KL0xlbmd0aDEgMTUzNjANCi9GaWx0ZXIg -L0ZsYXRlRGVjb2RlDQovTGVuZ3RoIDIwIDAgUg0KPj5zdHJlYW0NCnic3Xp7fFTVtfBe5zHvZOZM -5pFkkswZhrzMYyAPXgI5QBKCoHkRzfBKhmRCgklmzExArEqobZEghlZtbbHA7fXzWqsw+CK+8Vr1 -9gotVC21XAutWPtQoS3YFsjJXXvPTAhU7e/3/b6/vpPsc/ZjrbXXXq+99jkTHRgMEhMZIjxROvoC -4VIz/zdCyGFCwNqxISrvW++vwvopQri7u8Lr+r53cNU5QoRuQrRPr+vd1LV4XdmnhJiyCMkp7g4G -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 -ZPPIyIh47z157vodYL4HlHuM5lrzNvc27htfN7vbvg4zvlr7VW4Dzj2IJYolgqUwDK4w8GE4F4Zf -hH8X5rrD4A/D6PhZ5Y4wijPUX+fury1zZ0J6S0Z5eou2nG/RoF4CiNveVuZuw+eaFXXuVbX57pUr -bnWvqJ3uTiuztoioXaGMbwnxYOar+Ho+xG/mxbZmUJoLimuV5pwpeEtLr7256StN25v4xvosdwOW -jPrCes5f31PPjYJVKanNdS+pzXDX1Xrci3HRf69FIUBWnavFUWZvkcDcYikzt3CAFkvG3aMgPenS -48OilODTba4yt5k3mwWz2WeuN4fMI+aT5nGztgr7zpj5EIF6AkMOEGEUdh5Y3lxUtHRUO960NKZt -WBmDu2O5zfSuNK6Iae6OkZYVK1sPANzr//qOHWRh9tJYWXNrrD3bvzTWiRWFVoawYsk+4CAL/ZFo -JDpYlLggEqUPQh8RrEQidAho1wQI645EotEoiaNEiiKkiN5xAPBOIgwQYSgwpZX4B3ondDo2DTDI -SJQCMeRBemct2ksJsQtniExMzyjHH+n/C94y3Q8NCmVuZHN0cmVhbQplbmRvYmoKMjAgMCBvYmoK -OTczNgplbmRvYmoKMjEgMCBvYmoKPDwNCi9EZXNjZW50IDANCi9DYXBIZWlnaHQgMTAzMw0KL1N0 -ZW1WIDgwDQovVHlwZSAvRm9udERlc2NyaXB0b3INCi9Gb250RmlsZTIgMTkgMCBSDQovRmxhZ3Mg -NA0KL0ZvbnROYW1lIC9DQUFBQUErTGliZXJhdGlvblNhbnMtQm9sZA0KL0ZvbnRCQm94IFsgLTQ4 -MSAtMzc2IDEzMDMgMTAzMyBdDQovSXRhbGljQW5nbGUgMA0KL0FzY2VudCAwDQo+PgplbmRvYmoK -MjIgMCBvYmoKPDwNCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlDQovTGVuZ3RoIDQyOA0KPj5zdHJlYW0N -CnicXZPBbqMwEIbvPIWP3UMFHgNpJYSUJkHKYdtq030AApMUqTHIIYe8/Xrmp7vSHhJ9Nv/YH6Mh -3ey3ez/M6XsYuwPP5jT4PvB1vIWOzZHPg08smX7o5mWl/92lnZI01h7u15kve38aqypJf8Vn1znc -zcO6H4/8I0nfQs9h8Gfz8HtziOvDbZq++MJ+NllS16bnUzznZzu9thdOtepx38fHw3x/jCX/Ah/3 -iQ3p2kKlG3u+Tm3HofVnTqosq03VNHXCvv/vWV6g5HjqPtsQozZGsyy3dWRSLnfCTnmVC+dgEi6Q -0XwJXgmvlCkTfkK+EH5GphRe4y7df0HGCW+Q0bu2YM3skH8RbrAfX6qyGWrXwvAvt8Lwz+UcC/9S -zrfwL5+EF/+N8OL/LAz/Uu6y8G80A/9Cz1n8NQ//XHpl4U/K8HfSKwt/Jz2x8HfiRvB30kOCv5P3 -Jfg7uYvg7+Qugr8Tf4K/k54T/FdyPsG/kT4T/El6RYu/9Irgv1MH+Dvdh3+h+0v/SYdnmRIZI5nz -7/E03S2EOJr6MehMyjQOnv9+L9M4SZX+/gBXmNTFDQplbmRzdHJlYW0KZW5kb2JqCjIzIDAgb2Jq -Cjw8DQovU3VidHlwZSAvVHJ1ZVR5cGUNCi9GaXJzdENoYXIgMA0KL1R5cGUgL0ZvbnQNCi9CYXNl -Rm9udCAvQ0FBQUFBK0xpYmVyYXRpb25TYW5zLUJvbGQNCi9Gb250RGVzY3JpcHRvciAyMSAwIFIN -Ci9Ub1VuaWNvZGUgMjIgMCBSDQovTGFzdENoYXIgNDUNCi9XaWR0aHMgWyA3NTAgNzIyIDYxMCAz -MzMgMzg5IDU1NiA2MTAgMjc3IDYxMCAzMzMgNjY2IDU1NiA2MTAgNTU2IDcyMiA2MTANCjUwMCA4 -ODkgNzIyIDU1NiA2MTAgMjc3IDI3NyA1NTYgNjEwIDY2NiAyNzcgNzIyIDI3NyA1NTYgNTU2IDU1 -Ng0KNTU2IDU1NiA1NTYgNTU2IDU1NiA1NTYgNjEwIDYxMCAyNzcgNjEwIDU1NiAzMzMgNjEwIDYx -MCBdDQo+PgplbmRvYmoKMjQgMCBvYmoKPDwNCi9GMSAxMyAwIFINCi9GMiAyMyAwIFINCi9GMyAx -OCAwIFINCj4+CmVuZG9iagoyNSAwIG9iago8PA0KL1Byb2NTZXQgWyAvUERGIC9UZXh0IC9JbWFn -ZUMgL0ltYWdlSSAvSW1hZ2VCIF0NCi9Gb250IDI0IDAgUg0KL1hPYmplY3QgPDwNCi9JbTQgNCAw -IFINCj4+DQo+PgplbmRvYmoKMjYgMCBvYmoKPDwNCi9PcGVuQWN0aW9uIFsgMSAwIFIgL1hZWiBu -dWxsIG51bGwgMSBdDQovVHlwZSAvQ2F0YWxvZw0KL0xhbmcgKGRlLURFKQ0KL1BhZ2VzIDggMCBS -DQo+PgplbmRvYmoKMjcgMCBvYmoKPDwNCi9DcmVhdG9yIDxmZWZmMDA1NzAwNzIwMDY5MDA3NDAw -NjUwMDcyPg0KL0NyZWF0aW9uRGF0ZSAoRDoyMDI0MDIwMTE1MDAwNSswMScwMCcpDQovUHJvZHVj -ZXIgPGZlZmYwMDRjMDA2OTAwNjIwMDcyMDA2NTAwNGYwMDY2MDA2NjAwNjkwMDYzMDA2NTAwMjAw -MDM3MDAyZTAwMzI+DQo+PgplbmRvYmoKeHJlZg0KMCAyOCANCjAwMDAwMDAwMDAgNjU1MzUgZg0K -MDAwMDAwMDA2NyAwMDAwMCBuDQowMDAwMDAwMjUwIDAwMDAwIG4NCjAwMDAwMDE3MzEgMDAwMDAg -bg0KMDAwMDAwMTc1MSAwMDAwMCBuDQowMDAwMDI2Nzg3IDAwMDAwIG4NCjAwMDAwMjY4MDggMDAw -MDAgbg0KMDAwMDAyNzc3OSAwMDAwMCBuDQowMDAwMDI3Nzk4IDAwMDAwIG4NCjAwMDAwMjc5MDcg -MDAwMDAgbg0KMDAwMDAzODk2MyAwMDAwMCBuDQowMDAwMDM4OTg1IDAwMDAwIG4NCjAwMDAwMzkx -OTMgMDAwMDAgbg0KMDAwMDAzOTczMCAwMDAwMCBuDQowMDAwMDQwMTI3IDAwMDAwIG4NCjAwMDAw -NDYyOTYgMDAwMDAgbg0KMDAwMDA0NjMxNyAwMDAwMCBuDQowMDAwMDQ2NTQyIDAwMDAwIG4NCjAw -MDAwNDY5MDkgMDAwMDAgbg0KMDAwMDA0NzE1OSAwMDAwMCBuDQowMDAwMDU2OTkxIDAwMDAwIG4N -CjAwMDAwNTcwMTIgMDAwMDAgbg0KMDAwMDA1NzIyOCAwMDAwMCBuDQowMDAwMDU3NzMzIDAwMDAw -IG4NCjAwMDAwNTgwOTggMDAwMDAgbg0KMDAwMDA1ODE1NyAwMDAwMCBuDQowMDAwMDU4MjcyIDAw -MDAwIG4NCjAwMDAwNTgzODAgMDAwMDAgbg0KdHJhaWxlcg0KPDwNCi9JbmZvIDI3IDAgUg0KL0lE -IFsgPGQwMjBiYzk5MTViOTc3YWY1YmYwZmQ1NDIxMTJhN2ZjPiA8NzhiN2Y4MjI2OWIxY2U1NmNi -OWJmMGI1ZmQ5NjEwNDQ+IF0NCi9Sb290IDI2IDAgUg0KL1NpemUgMjgNCi9Eb2NDaGVja3N1bSAv -QjMwRjcxMzFEM0EyMzI2QjBFMkU3NTQ5NjdBNjY3MTkNCj4+DQpzdGFydHhyZWYNCjU4NTYzDQol -JUVPRg0K -</content> - <contentType>application/pdf</contentType> - <id>assistants.E0FBA361C191F8B723949467AE302BEA24E4745E</id> - <name>20240201539950384407_Antrag_20240201539950384407.pdf</name> - </attachments> - - <attachments> - <attributes> - <key>X-IntelliForm-Signed</key> - <value>false</value> - </attributes> - <content> - JVBERi0xLjYKJcOkw7zDtsOfCjIgMCBvYmoKPDwvTGVuZ3RoIDMgMCBSL0ZpbHRlci9GbGF0ZURl -Y29kZT4+CnN0cmVhbQp4nCXKuwrCQBBG4X6e4q+FjDOTbHYWli0CpkgXGEghdl46wTS+voqc6oMj -rHjTCwJhMUcqiS0n+KDso2K/0XbA83982x80BaWRHTn3XLwgrjjOCjXE/VxFm1WxplX61tnPl1jo -FLTSig8XpBemCmVuZHN0cmVhbQplbmRvYmoKCjMgMCBvYmoKMTA5CmVuZG9iagoKNSAwIG9iago8 -PC9MZW5ndGggNiAwIFIvRmlsdGVyL0ZsYXRlRGVjb2RlL0xlbmd0aDEgNzc5Mj4+CnN0cmVhbQp4 -nOU3e2wb532/746UqCcpRZJl0xY/5iLZepGSaLuWY1m0JFKSJVvUgw7pl3giTyIT8RGSkmOnQdRt -SQw6XlxnS+bEWBpgDdIig09R1ilFZqvr0q3o2rQLiiJNvBpYi/0xG/bSJBvaxdrv++4ky46TYMP+ -20nf3e/9/j7eZdMzChTDHIjgDsflVAUxCADwjwCkPDybpR1DlfcjfAVA+KfJ1FT8hb8+/BGA4Q2A -/Dempo9PvvyD9HcAiqPIH4wqcuTdlosNAKXIh+1RJOy9eTwf8auI3xeNZx9ZJBtLAcwWxC3TybB8 -ERIEcYp4YVx+JGU3tKN/cxPiNCHHlf/88+9HEB8EKMqkkplsBE4uA2xYYvxUWkkNvjDxNuIYn3gG -aQT/2FWMYB7DBRH+X1/G01AJfcYOMEOK32+7xNdgPZwDWGb9WXO/Obj8u//LKEza48/gFXgDTsN7 -cERneMEHMZhBytrre/AzpLLLBwfh25D7HLOvwSLyNbkQPMMyuevlg+dhAf7+Ni8+iMOjGMtfwXuk -FX6Io5KED4kJvgZvo9UPkbbvbqYEnF6Y5ODkGur78KJwCvYKv0bkHOMITsECfwfnyVG0nMU8T69m -vOszRp+Cx/A+ClGYRZhfxo7/+iUULP8Ws3oM9sIfwB6YXqPxFnlJLMT+jcFLWNPvcZpzhZnfJz4o -fEcQPn0Wka/DFC6ZYO7CaXHP51Tof3yJfigh9WItFNyNK2wF883fCW3LH4n3QSH4l2+s0JYHln8r -yjcThnHDRmOH4Udf5CPv64Y4asPyb24+ejNi3G98Bbv1KoC799DBYMA/Njoy7Bvav29wYG9/X6/X -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 -SBbJmfmx0cbGgcX85ZEB1eQ7pJKTau0ou7uHD6p5J1XwHzwUmCfkj4NPnD4NXZsG1LbRgBraFBxQ -Iwi4GTCHgGXTfBV0BTOZbCO/SGMjwjN4h8aZRiQezWhUWOVDY4Zk8IjKcCXSyAQ0nOC9kfGQwPQI -ah/NALsxZqOmxLQzujmurN04UH30vwEOosbUCmVuZHN0cmVhbQplbmRvYmoKCjYgMCBvYmoKNDQx -NwplbmRvYmoKCjcgMCBvYmoKPDwvVHlwZS9Gb250RGVzY3JpcHRvci9Gb250TmFtZS9CQUFBQUEr -TGliZXJhdGlvblNlcmlmCi9GbGFncyA0Ci9Gb250QkJveFstNTQzIC0zMDMgMTI3NyA5ODFdL0l0 -YWxpY0FuZ2xlIDAKL0FzY2VudCAwCi9EZXNjZW50IDAKL0NhcEhlaWdodCA5ODEKL1N0ZW1WIDgw -Ci9Gb250RmlsZTIgNSAwIFIKPj4KZW5kb2JqCgo4IDAgb2JqCjw8L0xlbmd0aCAyMzUvRmlsdGVy -L0ZsYXRlRGVjb2RlPj4Kc3RyZWFtCnicXVC7bsQgEOz5ii0vxQls59FYSKeLTnKRh+LkAzCsHaQY -EMaF/z4LviRSCtAMM7Malp+7x87ZxF+j1z0mGK0zERe/Ro0w4GQdq2owVqcrK7eeVWCcsv22JJw7 -N/q2ZfyNtCXFDQ4n4we8YfwlGozWTXD4OPfE+zWEL5zRJRBMSjA40pwnFZ7VjLykjp0h2abtSJE/ -w/sWEOrCq72K9gaXoDRG5SZkrRAS2stFMnTmn9bsiWHUnyqSsyKnEA+3knBd8P1dxs3+3pQZV3ee -lr/70xL0GiM1LDsp1XIp6/B3bcGHnCrnG97uchYKZW5kc3RyZWFtCmVuZG9iagoKOSAwIG9iago8 -PC9UeXBlL0ZvbnQvU3VidHlwZS9UcnVlVHlwZS9CYXNlRm9udC9CQUFBQUErTGliZXJhdGlvblNl -cmlmCi9GaXJzdENoYXIgMAovTGFzdENoYXIgMwovV2lkdGhzWzAgMjc3IDQ0MyAzODkgXQovRm9u -dERlc2NyaXB0b3IgNyAwIFIKL1RvVW5pY29kZSA4IDAgUgo+PgplbmRvYmoKCjEwIDAgb2JqCjw8 -L0YxIDkgMCBSCj4+CmVuZG9iagoKMTEgMCBvYmoKPDwvRm9udCAxMCAwIFIKL1Byb2NTZXRbL1BE -Ri9UZXh0XQo+PgplbmRvYmoKCjEgMCBvYmoKPDwvVHlwZS9QYWdlL1BhcmVudCA0IDAgUi9SZXNv -dXJjZXMgMTEgMCBSL01lZGlhQm94WzAgMCA1OTUuMzAzOTM3MDA3ODc0IDg0MS44ODk3NjM3Nzk1 -MjhdL0NvbnRlbnRzIDIgMCBSPj4KZW5kb2JqCgo0IDAgb2JqCjw8L1R5cGUvUGFnZXMKL1Jlc291 -cmNlcyAxMSAwIFIKL01lZGlhQm94WyAwIDAgNTk1LjMwMzkzNzAwNzg3NCA4NDEuODg5NzYzNzc5 -NTI4IF0KL0tpZHNbIDEgMCBSIF0KL0NvdW50IDE+PgplbmRvYmoKCjEyIDAgb2JqCjw8L1R5cGUv -Q2F0YWxvZy9QYWdlcyA0IDAgUgovT3BlbkFjdGlvblsxIDAgUiAvWFlaIG51bGwgbnVsbCAwXQov -TGFuZyhkZS1ERSkKPj4KZW5kb2JqCgoxMyAwIG9iago8PC9DcmVhdG9yPEZFRkYwMDU3MDA3MjAw -NjkwMDc0MDA2NTAwNzI+Ci9Qcm9kdWNlcjxGRUZGMDA0QzAwNjkwMDYyMDA3MjAwNjUwMDRGMDA2 -NjAwNjYwMDY5MDA2MzAwNjUwMDIwMDAzNzAwMkUwMDM0PgovQ3JlYXRpb25EYXRlKEQ6MjAyNDA0 -MTgxMjMwMDcrMDInMDAnKT4+CmVuZG9iagoKeHJlZgowIDE0CjAwMDAwMDAwMDAgNjU1MzUgZiAK -MDAwMDAwNTQ5MSAwMDAwMCBuIAowMDAwMDAwMDE5IDAwMDAwIG4gCjAwMDAwMDAxOTkgMDAwMDAg -biAKMDAwMDAwNTYxNSAwMDAwMCBuIAowMDAwMDAwMjE5IDAwMDAwIG4gCjAwMDAwMDQ3MjAgMDAw -MDAgbiAKMDAwMDAwNDc0MSAwMDAwMCBuIAowMDAwMDA0OTMxIDAwMDAwIG4gCjAwMDAwMDUyMzUg -MDAwMDAgbiAKMDAwMDAwNTQwNCAwMDAwMCBuIAowMDAwMDA1NDM2IDAwMDAwIG4gCjAwMDAwMDU3 -NDAgMDAwMDAgbiAKMDAwMDAwNTgzNyAwMDAwMCBuIAp0cmFpbGVyCjw8L1NpemUgMTQvUm9vdCAx -MiAwIFIKL0luZm8gMTMgMCBSCi9JRCBbIDwwQTQzOEYyNEUzREM5QThCMjFFNjZCNkNCMTBFRTQy -Mj4KPDBBNDM4RjI0RTNEQzlBOEIyMUU2NkI2Q0IxMEVFNDIyPiBdCi9Eb2NDaGVja3N1bSAvRkM1 -QzYxM0I4RUM3NDM4NEY2MjM4NEQ5QjYzNjQ5M0YKPj4Kc3RhcnR4cmVmCjYwMTIKJSVFT0YK - - </content> - <contentType>application/pdf</contentType> - <id>assistants.81C072551A7E5563F1EEE46ACA1070D150D9E1B0</id> - <name>dominion_small.pdf</name> - </attachments> - - <attachments> - <attributes> - <key>X-IntelliForm-Signed</key> - <value>false</value> - </attributes> - <content> - JVBERi0xLjYKJcOkw7zDtsOfCjIgMCBvYmoKPDwvTGVuZ3RoIDMgMCBSL0ZpbHRlci9GbGF0ZURl -Y29kZT4+CnN0cmVhbQp4nCXKuwrCQBBG4X6e4q+FjDOTbHYWli0CpkgXGEghdl46wTS+voqc6oMj -rHjTCwJhMUcqiS0n+KDso2K/0XbA83982x80BaWRHTn3XLwgrjjOCjXE/VxFm1WxplX61tnPl1jo -FLTSig8XpBemCmVuZHN0cmVhbQplbmRvYmoKCjMgMCBvYmoKMTA5CmVuZG9iagoKNSAwIG9iago8 -PC9MZW5ndGggNiAwIFIvRmlsdGVyL0ZsYXRlRGVjb2RlL0xlbmd0aDEgNzc5Mj4+CnN0cmVhbQp4 -nOU3e2wb532/746UqCcpRZJl0xY/5iLZepGSaLuWY1m0JFKSJVvUgw7pl3giTyIT8RGSkmOnQdRt -SQw6XlxnS+bEWBpgDdIig09R1ilFZqvr0q3o2rQLiiJNvBpYi/0xG/bSJBvaxdrv++4ky46TYMP+ -20nf3e/9/j7eZdMzChTDHIjgDsflVAUxCADwjwCkPDybpR1DlfcjfAVA+KfJ1FT8hb8+/BGA4Q2A -/Dempo9PvvyD9HcAiqPIH4wqcuTdlosNAKXIh+1RJOy9eTwf8auI3xeNZx9ZJBtLAcwWxC3TybB8 -ERIEcYp4YVx+JGU3tKN/cxPiNCHHlf/88+9HEB8EKMqkkplsBE4uA2xYYvxUWkkNvjDxNuIYn3gG -aQT/2FWMYB7DBRH+X1/G01AJfcYOMEOK32+7xNdgPZwDWGb9WXO/Obj8u//LKEza48/gFXgDTsN7 -cERneMEHMZhBytrre/AzpLLLBwfh25D7HLOvwSLyNbkQPMMyuevlg+dhAf7+Ni8+iMOjGMtfwXuk -FX6Io5KED4kJvgZvo9UPkbbvbqYEnF6Y5ODkGur78KJwCvYKv0bkHOMITsECfwfnyVG0nMU8T69m -vOszRp+Cx/A+ClGYRZhfxo7/+iUULP8Ws3oM9sIfwB6YXqPxFnlJLMT+jcFLWNPvcZpzhZnfJz4o -fEcQPn0Wka/DFC6ZYO7CaXHP51Tof3yJfigh9WItFNyNK2wF883fCW3LH4n3QSH4l2+s0JYHln8r -yjcThnHDRmOH4Udf5CPv64Y4asPyb24+ejNi3G98Bbv1KoC799DBYMA/Njoy7Bvav29wYG9/X6/X -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 -SBbJmfmx0cbGgcX85ZEB1eQ7pJKTau0ou7uHD6p5J1XwHzwUmCfkj4NPnD4NXZsG1LbRgBraFBxQ -Iwi4GTCHgGXTfBV0BTOZbCO/SGMjwjN4h8aZRiQezWhUWOVDY4Zk8IjKcCXSyAQ0nOC9kfGQwPQI -ah/NALsxZqOmxLQzujmurN04UH30vwEOosbUCmVuZHN0cmVhbQplbmRvYmoKCjYgMCBvYmoKNDQx -NwplbmRvYmoKCjcgMCBvYmoKPDwvVHlwZS9Gb250RGVzY3JpcHRvci9Gb250TmFtZS9CQUFBQUEr -TGliZXJhdGlvblNlcmlmCi9GbGFncyA0Ci9Gb250QkJveFstNTQzIC0zMDMgMTI3NyA5ODFdL0l0 -YWxpY0FuZ2xlIDAKL0FzY2VudCAwCi9EZXNjZW50IDAKL0NhcEhlaWdodCA5ODEKL1N0ZW1WIDgw -Ci9Gb250RmlsZTIgNSAwIFIKPj4KZW5kb2JqCgo4IDAgb2JqCjw8L0xlbmd0aCAyMzUvRmlsdGVy -L0ZsYXRlRGVjb2RlPj4Kc3RyZWFtCnicXVC7bsQgEOz5ii0vxQls59FYSKeLTnKRh+LkAzCsHaQY -EMaF/z4LviRSCtAMM7Malp+7x87ZxF+j1z0mGK0zERe/Ro0w4GQdq2owVqcrK7eeVWCcsv22JJw7 -N/q2ZfyNtCXFDQ4n4we8YfwlGozWTXD4OPfE+zWEL5zRJRBMSjA40pwnFZ7VjLykjp0h2abtSJE/ -w/sWEOrCq72K9gaXoDRG5SZkrRAS2stFMnTmn9bsiWHUnyqSsyKnEA+3knBd8P1dxs3+3pQZV3ee -lr/70xL0GiM1LDsp1XIp6/B3bcGHnCrnG97uchYKZW5kc3RyZWFtCmVuZG9iagoKOSAwIG9iago8 -PC9UeXBlL0ZvbnQvU3VidHlwZS9UcnVlVHlwZS9CYXNlRm9udC9CQUFBQUErTGliZXJhdGlvblNl -cmlmCi9GaXJzdENoYXIgMAovTGFzdENoYXIgMwovV2lkdGhzWzAgMjc3IDQ0MyAzODkgXQovRm9u -dERlc2NyaXB0b3IgNyAwIFIKL1RvVW5pY29kZSA4IDAgUgo+PgplbmRvYmoKCjEwIDAgb2JqCjw8 -L0YxIDkgMCBSCj4+CmVuZG9iagoKMTEgMCBvYmoKPDwvRm9udCAxMCAwIFIKL1Byb2NTZXRbL1BE -Ri9UZXh0XQo+PgplbmRvYmoKCjEgMCBvYmoKPDwvVHlwZS9QYWdlL1BhcmVudCA0IDAgUi9SZXNv -dXJjZXMgMTEgMCBSL01lZGlhQm94WzAgMCA1OTUuMzAzOTM3MDA3ODc0IDg0MS44ODk3NjM3Nzk1 -MjhdL0NvbnRlbnRzIDIgMCBSPj4KZW5kb2JqCgo0IDAgb2JqCjw8L1R5cGUvUGFnZXMKL1Jlc291 -cmNlcyAxMSAwIFIKL01lZGlhQm94WyAwIDAgNTk1LjMwMzkzNzAwNzg3NCA4NDEuODg5NzYzNzc5 -NTI4IF0KL0tpZHNbIDEgMCBSIF0KL0NvdW50IDE+PgplbmRvYmoKCjEyIDAgb2JqCjw8L1R5cGUv -Q2F0YWxvZy9QYWdlcyA0IDAgUgovT3BlbkFjdGlvblsxIDAgUiAvWFlaIG51bGwgbnVsbCAwXQov -TGFuZyhkZS1ERSkKPj4KZW5kb2JqCgoxMyAwIG9iago8PC9DcmVhdG9yPEZFRkYwMDU3MDA3MjAw -NjkwMDc0MDA2NTAwNzI+Ci9Qcm9kdWNlcjxGRUZGMDA0QzAwNjkwMDYyMDA3MjAwNjUwMDRGMDA2 -NjAwNjYwMDY5MDA2MzAwNjUwMDIwMDAzNzAwMkUwMDM0PgovQ3JlYXRpb25EYXRlKEQ6MjAyNDA0 -MTgxMjMwMDcrMDInMDAnKT4+CmVuZG9iagoKeHJlZgowIDE0CjAwMDAwMDAwMDAgNjU1MzUgZiAK -MDAwMDAwNTQ5MSAwMDAwMCBuIAowMDAwMDAwMDE5IDAwMDAwIG4gCjAwMDAwMDAxOTkgMDAwMDAg -biAKMDAwMDAwNTYxNSAwMDAwMCBuIAowMDAwMDAwMjE5IDAwMDAwIG4gCjAwMDAwMDQ3MjAgMDAw -MDAgbiAKMDAwMDAwNDc0MSAwMDAwMCBuIAowMDAwMDA0OTMxIDAwMDAwIG4gCjAwMDAwMDUyMzUg -MDAwMDAgbiAKMDAwMDAwNTQwNCAwMDAwMCBuIAowMDAwMDA1NDM2IDAwMDAwIG4gCjAwMDAwMDU3 -NDAgMDAwMDAgbiAKMDAwMDAwNTgzNyAwMDAwMCBuIAp0cmFpbGVyCjw8L1NpemUgMTQvUm9vdCAx -MiAwIFIKL0luZm8gMTMgMCBSCi9JRCBbIDwwQTQzOEYyNEUzREM5QThCMjFFNjZCNkNCMTBFRTQy -Mj4KPDBBNDM4RjI0RTNEQzlBOEIyMUU2NkI2Q0IxMEVFNDIyPiBdCi9Eb2NDaGVja3N1bSAvRkM1 -QzYxM0I4RUM3NDM4NEY2MjM4NEQ5QjYzNjQ5M0YKPj4Kc3RhcnR4cmVmCjYwMTIKJSVFT0YK - - </content> - <contentType>application/pdf</contentType> - <id>assistants.2BB6A1C337D28F62D9FFE1F550BD392703BD3C88</id> - <name>dominion_small (1).pdf</name> - </attachments> - - <caller /> - <client>Schleswig-Holstein</client> - <clientId>land</clientId> - <customer>Kreis Nordfriesland</customer> - <customerId>kreis-nordfriesland/kreis-nordfriesland</customerId> - <form>Deutschlandticket Erstattung</form> - <formId>mob_dtickerst/mob_dtickerst</formId> - <id>20240201539950384407</id> - <primaryDataAttachmentId>myForm-xml</primaryDataAttachmentId> - <sender>intelliform.by.kop-cloud.de</sender> - <timestamp>2021-04-15T08:33:39.443Z</timestamp> - <username /> - </data> - </ns2:deposit> - </soap:Body> -</soap:Envelope> \ No newline at end of file diff --git a/intelliform-adapter/src/main/scripts/vorgang-Eingliederungshilfe.xml b/intelliform-adapter/src/main/scripts/vorgang-Eingliederungshilfe.xml deleted file mode 100644 index 013815591bf0b04d68b375575899795d9b700673..0000000000000000000000000000000000000000 --- a/intelliform-adapter/src/main/scripts/vorgang-Eingliederungshilfe.xml +++ /dev/null @@ -1,117 +0,0 @@ -<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> - <soap:Body> - <ns2:deposit xmlns:ns2="http://xmlns.cit.de/intelliform/2009/webservices/backend"> - <data> - <attachments> - <attributes> - <key>X-IntelliForm-Signed</key> - <value>false</value> - </attributes> - <content>PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPG15Rm9ybSB4bWxuczpwZGY9Imh0dHA6Ly94bWxucy5jaXQuZGUvYXNzaXN0YW50cy9wZGYiIHhtbG5zOnQ9Imh0dHA6Ly94bWxucy5jaXQuZGUvaW50ZWxsaWZvcm0vdHJhbnNhY3Rpb24iIHhtbG5zOnU9Imh0dHA6Ly94bWxucy5jaXQuZGUvaW50ZWxsaWZvcm0vdXNlciIgdDppZD0iMjAyMTA0MTQzMjQxMjAwOTAyMDciIHQ6dGltZXN0YW1wPSIyMDIxLTA0LTE0VDA3OjAwOjEyLjQ4OFoiIHQ6c2VuZGVyPSJzdGFnZS5hZm0uc2NobGVzd2lnLWhvbHN0ZWluLmRlIiB0OmZvcm09IkVpbmdsaWVkZXJ1bmdzaGlsZmUgTWluZGVyasOkaHJpZ2UiIHQ6Zm9ybS1pZD0icGZtX3Bvc3RmYWNobWl0dGVpbHVuZyIgdDpjdXN0b21lcj0iS3JlaXMgU2VnZWJlcmciIHQ6Y3VzdG9tZXItaWQ9ImtyZWlzLXNlZ2ViZXJnL2tyZWlzLXNlZ2ViZXJnIiB0OmNsaWVudD0iU2NobGVzd2lnLUhvbHN0ZWluIiB0OmNsaWVudC1pZD0ibGFuZCIgdTpVc2VybmFtZT0iYWZtdDcwQHdlYi5kZSIgdTpQcmluY2lwYWxUeXBlPSJDaXRpemVuIiB1OnVzZXJuYW1lPSJkZTkzN2ExNy1iMTU2LTRhYWYtOTQ3Ni0yNjU4YmM4NzI2NTkiIHU6R2l2ZW5OYW1lcz0iRGF0YXBvcnQiIHU6QXNzdXJhbmNlTGV2ZWw9IkxvdyIgdTpkaXNwbGF5TmFtZT0iRGF0YXBvcnQgU0gtVXNlciIgdTptYWlsQWRkcmVzcz0iYWZtdDcwQHdlYi5kZSIgdTpFbWFpbEFkZHJlc3M9ImFmbXQ3MEB3ZWIuZGUiIHU6Zmlyc3ROYW1lPSJEYXRhcG9ydCIgdTpsYXN0TmFtZT0iU0gtVXNlciI+PGxlaXN0dW5nZW4+PGhlaWxwIGxhYmVsPSJIZWlscMOkZGFnb2dpc2NoZSBMZWlzdHVuZ2VuIj50cnVlPC9oZWlscD48aGlsZmUgbGFiZWw9IkhpbGZlIHp1ciBUZWlsaGFiZSBpbiBkZXIgR2VtZWluc2NoYWZ0Ij5mYWxzZTwvaGlsZmU+PG90aGVyIGxhYmVsPSIiPmZhbHNlPC9vdGhlcj48c2NodWwgbGFiZWw9IkxlaXN0dW5nZW4genVyIFRlaWxoYWJlIGFuIEJpbGR1bmciPmZhbHNlPC9zY2h1bD48dW50ZXJiIGxhYmVsPSJMZWlzdHVuZ2VuIMO8YmVyIFRhZyB1bmQgTmFjaHQiPmZhbHNlPC91bnRlcmI+PC9sZWlzdHVuZ2VuPjxiZWdydWVuZHVuZz50ZXN0PC9iZWdydWVuZHVuZz48bmFtZWlkPmRlOTM3YTE3LWIxNTYtNGFhZi05NDc2LTI2NThiYzg3MjY1OTwvbmFtZWlkPjxyZXN0X3Jlc3BvbnNlX25hbWU+W3sibWVtYmVyY29udGV4dCI6ImRlOTM3YTE3LWIxNTYtNGFhZi05NDc2LTI2NThiYzg3MjY1OSIsIm1lbWJlcnNjb3BlIjpbeyJ0ZW5hbnQiOiJTSCIsIm1haWxib3hndWlkIjoiYzVhNDQ2YjctZDZiMC00YzYxLTlhZDItYWFlNjAwODU3OTgyIiwibWFpbGJveG5hbWUiOiJOL0EiLCJtYWlsYm94ZGVzY3JpcHRpb24iOiJUZXN0IiwibWFpbGJveHR5cGUiOjEsImd1aWQiOiIwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDAiLCJpZCI6MjM1OTkxNn1dfV08L3Jlc3RfcmVzcG9uc2VfbmFtZT48bWFpbGJveGd1aWQ+YzVhNDQ2YjctZDZiMC00YzYxLTlhZDItYWFlNjAwODU3OTgyPC9tYWlsYm94Z3VpZD48bmFjaG5hbWU+dGVydDwvbmFjaG5hbWU+PHZvcm5hbWU+dGVzdDwvdm9ybmFtZT48Z2VidXJ0c2RhdHVtPjIwMDAtMDQtMDc8L2dlYnVydHNkYXR1bT48ZGV1dHNjaD5kZXV0c2NoPC9kZXV0c2NoPjxiZXRyZXV1bmdfb19zY2h1bGU+ZGFoZWltPC9iZXRyZXV1bmdfb19zY2h1bGU+PHN0cmFzc2U+dGVzdDwvc3RyYXNzZT48aGF1c251bW1lcj4xMjI8L2hhdXNudW1tZXI+PHBsej4yMjIyMjwvcGx6PjxvcnQ+dGVzdDwvb3J0PjxwZmxlZ2VncmFkPmtlaW5lcjwvcGZsZWdlZ3JhZD48a3Jhbmtlbmthc3NlPnRlc3Q8L2tyYW5rZW5rYXNzZT48dmVyc2ljaGVydW5nc251bW1lcj53ZXRzZXQ8L3ZlcnNpY2hlcnVuZ3NudW1tZXI+PHNjaHdlcmJlaGluZGVydW5nPmZhbHNlPC9zY2h3ZXJiZWhpbmRlcnVuZz48ZWdoX2ZvbGdlYW50cmFnPmZhbHNlPC9lZ2hfZm9sZ2VhbnRyYWc+PGJldHJldXVuZz5kYWhlaW08L2JldHJldXVuZz48ZWx0ZXJuPjxlbHRlcm4taXRlbT48cm9sbGVfZWx0ZXI+dmF0ZXI8L3JvbGxlX2VsdGVyPjxuYWNobmFtZV9lbHRlcj5TSC1Vc2VyPC9uYWNobmFtZV9lbHRlcj48dm9ybmFtZV9lbHRlcj5EYXRhcG9ydDwvdm9ybmFtZV9lbHRlcj48Z2VidXJ0c3RhZ19lbHRlcj4yMDAwLTA0LTA5PC9nZWJ1cnRzdGFnX2VsdGVyPjxmZXN0bmV0el9lbHRlcj4yMzQ8L2Zlc3RuZXR6X2VsdGVyPjxtYWlsX2VsdGVyPmFmbXQ3MEB3ZWIuZGU8L21haWxfZWx0ZXI+PGFsdF9hZHJfZWx0ZXI+ZmFsc2U8L2FsdF9hZHJfZWx0ZXI+PC9lbHRlcm4taXRlbT48L2VsdGVybj48c29yZ2VyZWNodD52YXRlcjwvc29yZ2VyZWNodD48Z2VzY2h3aXN0ZXIvPjxwZmxlZ2VmYW1pbGllPmZhbHNlPC9wZmxlZ2VmYW1pbGllPjxhcnp0PnRlc3Q8L2FyenQ+PGRpYWdub3Nlbj50ZXN0PC9kaWFnbm9zZW4+PHVudGVyc3VjaHVuZ2VuPjxhdWdlbiBsYWJlbD0iQXVnZW5hcnp0Ij5mYWxzZTwvYXVnZW4+PGhubyBsYWJlbD0iSE5PLUFyenQiPnRydWU8L2hubz48a2ggbGFiZWw9IkRpYWdub3N0aWtlbiBpbSBLcmFua2VuaGF1cyI+ZmFsc2U8L2toPjxvcnRobyBsYWJlbD0iT3J0aG9ww6RkaWUiPmZhbHNlPC9vcnRobz48b3RoZXIgbGFiZWw9IiI+ZmFsc2U8L290aGVyPjxwc3ljaGF0ZXIgbGFiZWw9IktpbmRlci0gdW5kIEp1Z2VuZHBzeWNoaWF0ZXIiPmZhbHNlPC9wc3ljaGF0ZXI+PHNvemlhbCBsYWJlbD0iU296aWFscMOkZGlhdHJpc2NoZXMgWmVudHJ1bSI+ZmFsc2U8L3NvemlhbD48L3VudGVyc3VjaHVuZ2VuPjxtYXNzbmFobWVuPjxlcmdvIGxhYmVsPSJFcmdvdGhlcmFwaWUiPnRydWU8L2VyZ28+PGtnIGxhYmVsPSJLcmFua2VuZ3ltbmFzdGlrIj5mYWxzZTwva2c+PGxvZ28gbGFiZWw9IkxvZ29ww6RkaWUiPmZhbHNlPC9sb2dvPjxtdXNpayBsYWJlbD0iVGVpbG5haG1lIGFuIGVpbmVyIE11c2lrZ3J1cHBlIj5mYWxzZTwvbXVzaWs+PG90aGVyIGxhYmVsPSIiPmZhbHNlPC9vdGhlcj48cHN5Y2hvIGxhYmVsPSJQc3ljaG90aGVyYXBpZSI+ZmFsc2U8L3BzeWNobz48c2Nod2ltbWVuIGxhYmVsPSJTY2h3aW1tZW4iPmZhbHNlPC9zY2h3aW1tZW4+PHNwcmFjaCBsYWJlbD0iU3ByYWNoZsO2cmRlcnVuZyBpbiBkZXIgS2luZGVydGFnZXNzdMOkdHRlIj5mYWxzZTwvc3ByYWNoPjx2ZXJlaW4gbGFiZWw9Ik1pdGdsaWVkc2NoYWZ0IGluIGVpbmVtIFR1cm4tL1Nwb3J0dmVyZWluIj5mYWxzZTwvdmVyZWluPjwvbWFzc25haG1lbj48anVnZW5kYW10X2tvbnRha3Q+ZmFsc2U8L2p1Z2VuZGFtdF9rb250YWt0PjxqdWdlbmRhbXRfYWt0ZW5laW5zaWNodD50cnVlPC9qdWdlbmRhbXRfYWt0ZW5laW5zaWNodD48cGVyc29uYWxhdXN3ZWlzPjxwZXJzb25hbGF1c3dlaXMtaXRlbT48ZmlsZSBjb250ZW50LXR5cGU9ImFwcGxpY2F0aW9uL3BkZiIgZGVzY3JpcHRpb249IiIgaWQ9ImFzc2lzdGFudHMuM0Y0QzVGOUI5NzM3MzMzOTMzQjkzNTZFNDlBQTM1RUIzRDkyNzJCOSIgbGVuZ3RoPSIxODE5MjYiPnRlc3QucGRmPC9maWxlPjwvcGVyc29uYWxhdXN3ZWlzLWl0ZW0+PC9wZXJzb25hbGF1c3dlaXM+PHNvcmdlcmVjaHRzbmFjaHdlaXM+PGZpbGUgY29udGVudC10eXBlPSJhcHBsaWNhdGlvbi9wZGYiIGRlc2NyaXB0aW9uPSIiIGlkPSJhc3Npc3RhbnRzLjdDOUFDMDc0M0NFMDY1QTc0RTBEQzJEODVGOTY4MkJGQzQ5MDM1QkIiIGxlbmd0aD0iMTgxOTI2Ij50ZXN0ICgxKS5wZGY8L2ZpbGU+PC9zb3JnZXJlY2h0c25hY2h3ZWlzPjxlcmtsYWVydW5nX2VpbnZlcnN0YWVuZG5pcz50cnVlPC9lcmtsYWVydW5nX2VpbnZlcnN0YWVuZG5pcz48ZGF0ZW5zY2h1dHo+dHJ1ZTwvZGF0ZW5zY2h1dHo+PHBvc3RmYWNoYmV0cmVmZj5JaHIgQW50cmFnIGF1ZiBFaW5nbGllZGVydW5nc2hpbGZlIGbDvHIgTWluZGVyasOkaHJpZ2U8L3Bvc3RmYWNoYmV0cmVmZj48cG9zdGZhY2huYWNocmljaHQ+U2VociBnZWVocnRlL3IgQW50cmFnc3RlbGxlcippbiwgJmx0O2JyLyZndDsmbHQ7YnIvJmd0O0lociBBbnRyYWcgd3VyZGUgZXJmb2xncmVpY2ggw7xiZXJtaXR0ZWx0LiZsdDtici8mZ3Q7Jmx0O2JyLyZndDtCaXR0ZSBiZWFjaHRlbiBTaWUsIGRhc3MgZGllIEJlYXJiZWl0dW5nc3plaXQgbmFjaCBFaW5nYW5nIGFsbGVyIFVudGVybGFnZW4gMiBXb2NoZW4gYmlzIDIgTW9uYXRlIGJldHLDpGd0LiBTaWUgZXJoYWx0ZW4gdW5hdWZnZWZvcmRlcnQgZWluZSBSw7xja21lbGR1bmcgenUgSWhyZW0gQW50cmFnLiZsdDtici8mZ3Q7Jmx0O2JyLyZndDtJaHJlIFZvcmdhbmdzbnVtbWVyIGZpbmRlbiBTaWUgaW0gYW5nZWjDpG5ndGVuIERva3VtZW50LiAmbHQ7YnIvJmd0O0JpdHRlIGdlYmVuIFNpZSBkaWVzZSBWb3JnYW5nc251bW1lciBiZWkgYWxsZW4gQW5mcmFnZW4genUgSWhyZW0gQW50cmFnIGFuLiZsdDtici8mZ3Q7Jmx0O2JyLyZndDsmbHQ7YnIvJmd0O01pdCBmcmVuZGxpY2hlbiBHcsO8w59lbiZsdDtici8mZ3Q7SWhyIEtyZWlzIFNlZ2ViZXJnJmx0O2JyLyZndDsmbHQ7YnIvJmd0Oy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSZsdDtici8mZ3Q7Jmx0O2JyLyZndDtLcmVpcyBTZWdlYmVyZyAmbHQ7YnIvJmd0O0VpbmdsaWVkZXJ1bmdzaGlsZmUgZsO8ciBNaW5kZXJqw6RocmlnZSZsdDtici8mZ3Q7Jmx0O2JyLyZndDtQb3N0YW5zY2hyaWZ0OiZsdDtici8mZ3Q7SGFtYnVyZ2VyIFN0ci4gMzAmbHQ7YnIvJmd0OzIzNzk1IEJhZCBTZWdlYmVyZyZsdDtici8mZ3Q7Jmx0O2JyLyZndDtCZXN1Y2hlcmFuc2NocmlmdDombHQ7YnIvJmd0O0J1cmdmZWxkc3RyLiA0MWEgJmx0O2JyLyZndDsyMzc5NSBCYWQgU2VnZWJlcmcgJmx0O2JyLyZndDsmbHQ7YnIvJmd0O0ZheDogKzQ5NDU1MS85NTEtOTU2NSAmbHQ7YnIvJmd0O0UtTWFpbDogJmx0O2EgaGVyZj0ibWFpbHRvOmludGVncmF0aW9uLmtpbmRlckBzZWdlYmVyZy5kZSImZ3Q7aW50ZWdyYXRpb24ua2luZGVyQHNlZ2ViZXJnLmRlJmx0Oy9hJmd0OyZsdDtici8mZ3Q7SW50ZXJuZXQ6ICZsdDthIGhyZWY9Ind3dy5zZWdlYmVyZy5kZSImZ3Q7d3d3LnNlZ2ViZXJnLmRlJmx0Oy9hJmd0OyZsdDtici8mZ3Q7PC9wb3N0ZmFjaG5hY2hyaWNodD48L215Rm9ybT4=</content> - <contentType>text/xml</contentType> - <id>myForm-xml</id> - <name>XML-Daten.xml</name> - </attachments> - <attachments> - <attributes> - <key>X-IntelliForm-Signed</key> - <value>false</value> - </attributes> - <content>PHNhbWw6QXNzZXJ0aW9uIHhtbG5zOnNhbWw9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphc3NlcnRpb24iIElEPSJfZDViZDQ3ZmMtZWU4MC00MDk0LWE5M2ItY2UzZDUyMTk1OWU4IiBJc3N1ZUluc3RhbnQ9IjIwMjEtMDQtMTRUMDc6MDA6MTMuNjM4WiIgVmVyc2lvbj0iMi4wIiB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPjxzYW1sOklzc3Vlcj51cm46ZGF0YXBvcnQ6b3NpOnNlcnZpY2Vrb250bzppZHA6cnoyOnN0YWdlOnNoPC9zYW1sOklzc3Vlcj48U2lnbmF0dXJlIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIj48U2lnbmVkSW5mbz48Q2Fub25pY2FsaXphdGlvbk1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMTAveG1sLWV4Yy1jMTRuIyIvPjxTaWduYXR1cmVNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGRzaWctbW9yZSNyc2Etc2hhMjU2Ii8+PFJlZmVyZW5jZSBVUkk9IiNfZDViZDQ3ZmMtZWU4MC00MDk0LWE5M2ItY2UzZDUyMTk1OWU4Ij48VHJhbnNmb3Jtcz48VHJhbnNmb3JtIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI2VudmVsb3BlZC1zaWduYXR1cmUiLz48VHJhbnNmb3JtIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8xMC94bWwtZXhjLWMxNG4jIj48SW5jbHVzaXZlTmFtZXNwYWNlcyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8xMC94bWwtZXhjLWMxNG4jIiBQcmVmaXhMaXN0PSIjZGVmYXVsdCBzYW1sIGRzIHhzIHhzaSIvPjwvVHJhbnNmb3JtPjwvVHJhbnNmb3Jtcz48RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8wNC94bWxlbmMjc2hhMjU2Ii8+PERpZ2VzdFZhbHVlPi8raURwbHVXdGFMd20rY1M5aCtYVEc0aTBiQy9jYS9WbjdMMWFObWtXNFk9PC9EaWdlc3RWYWx1ZT48L1JlZmVyZW5jZT48L1NpZ25lZEluZm8+PFNpZ25hdHVyZVZhbHVlPkdVMm9NOWNTZWFyZCt0MlU1WTBzNDVQKzlQdzJKNVdwSzh6MXNYa2NvT0RHY0lhVzljU3dKa0RTc2U0Z0lHQ1VYTXYxcWRhbytJdmFuQlJReXc3Mmo1SFVWdFNkWktBUkg5NjBoeEJ4YVhQRVN3VUQ5OTF4TzlYWVJ2ZmoxZU5waTNkRWpVRWtKUEN3T1g2NmlsWUZhQ0VCeFdwOXF4MGVVZVdzdnVOOUg1aytoWFJpdHpPdGdRMmFTenUrZUlzQnpOU3hoVHJkSXJPck9nV0orVHEwTmhZOC84WDNUT3EzQW9qMHJJTHcrVEZYMWFENmo2NUNWKzQ0eGtCWjlDK0F3NENrcTRRYUk4ckt6UzY4djlReUt2MTVOT2dhcmx6TGE3OUNNc2h1aUk4eDZldFZOSHpHcm15RC9Nc243bmticlhEWTdoQUNuL294bXlydk1YQXpGdz09PC9TaWduYXR1cmVWYWx1ZT48S2V5SW5mbz48WDUwOURhdGE+PFg1MDlDZXJ0aWZpY2F0ZT5NSUlHM3pDQ0JNZWdBd0lCQWdJVGJRQUxpdm01eVVoSU9TYmQwQUFCQUF1SytUQU5CZ2txaGtpRzl3MEJBUXNGQURBK01Rc3dDUVlEVlFRR0V3SkVSVEVXTUJRR0ExVUVDZ3dOUkdGMFlYQnZjblFnUWNPMlVqRVhNQlVHQTFVRUF3d09SR0YwWVhCdmNuUWdRMEVnTURRd0hoY05NakF3TkRJM01EY3dOelUwV2hjTk1qSXdOek14TURjd056VTBXakNCcWpFTE1Ba0dBMVVFQmhNQ1JFVXhHekFaQmdOVkJBZ01FbE5qYUd4bGMzZHBaeTFJYjJ4emRHVnBiakVTTUJBR0ExVUVCd3dKUVd4MFpXNW9iMng2TVJFd0R3WURWUVFLREFoRVlYUmhjRzl5ZERFTk1Bc0dBMVVFQ3d3RVZGb3hOREZJTUVZR0ExVUVBd3cvYzJGdGJDNXBaSEF1YzJWeWRtbGpaV3R2Ym5SdkxuTjBZV2RsTG5ObGNuWnBZMlZ3YjNKMFlXd3VjMk5vYkdWemQybG5MV2h2YkhOMFpXbHVMbVJsTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUFwUFRUZHhpQ3laenJEU2NZclQ5ckNxcHl1RFRqYzY1ZTJTTzBjRE03Mmd0dW1zOFZqQVp2T1Jic09vWm90dEFUYmlSWWpXM2t1Z3ZkeGFHdk1lYlRCNE93YVd0UDlwUDNRdTZjaWVrRG9IdmpQUHQyTG05TmdNT3BTVFNMSENxT3QrdWFiNEdYU1NPQmt3TXFlNDNMa2RaU3E5WS9tazJ6QlBZcXlVMzEwN2dkd01xUWRGdWhqZU5iYVEvMFFYa1laTGdVeFR1OGpVSmxGZXh1QkxZTjZ1WHJHVllyV0dQTU9Vdk83cGYzc3BzMjRnUVJFWlVHMkJkU0tkbjhqaDRjR0Y2ODhtNk5uTlBOVGZ5L3BWbmRDVDQzY0lGT0JQSHRvTitTcWs2ZGVKVVJoY3hyeE56U3Z2RUYvRWVMOE1WSUU3Ym5IRGhaZGtmbXU5MkVldlNoQXdJREFRQUJvNElDWnpDQ0FtTXdIUVlEVlIwT0JCWUVGQmczOU0yVGlPNkE0aHh1QjFKKytLbTgxYUVpTUE0R0ExVWREd0VCL3dRRUF3SUZvREJLQmdOVkhSRUVRekJCZ2o5ellXMXNMbWxrY0M1elpYSjJhV05sYTI5dWRHOHVjM1JoWjJVdWMyVnlkbWxqWlhCdmNuUmhiQzV6WTJoc1pYTjNhV2N0YUc5c2MzUmxhVzR1WkdVd0h3WURWUjBqQkJnd0ZvQVVzZUttMi95SjVUZm83NkxMT295WTBQUkpKTjh3UmdZRFZSMGZCRDh3UFRBN29EbWdONFkxYUhSMGNEb3ZMM0JyYVM1elpYSjJhV05sWkhCaGIzSXVaR1V2WTNKc0wwUmhkR0Z3YjNKMEpUSXdRMEVsTWpBd05DNWpjbXd3Z1lBR0NDc0dBUVVGQndFQkJIUXdjakFyQmdnckJnRUZCUWN3QVlZZmFIUjBjRG92TDNCcmFTNXpaWEoyYVdObFpIQmhiM0l1WkdVdmIyTnpjREJEQmdnckJnRUZCUWN3QW9ZM2FIUjBjRG92TDNCcmFTNXpaWEoyYVdObFpIQmhiM0l1WkdVdlkyRXZSR0YwWVhCdmNuUWxNakJEUVNVeU1EQTBLREVwTG1OeWREQU1CZ05WSFJNQkFmOEVBakFBTUQwR0NTc0dBUVFCZ2pjVkJ3UXdNQzRHSmlzR0FRUUJnamNWQ09yYVk0WE0zRUNDcVpjZ2hOVGpjNEg0cFhhQlhvTzFsanVEdnJ0dUFnRmtBZ0VpTUNjR0ExVWRKUVFnTUI0R0NDc0dBUVVGQndNQkJnZ3JCZ0VGQlFjREFnWUlLd1lCQlFVSUFnSXdNd1lKS3dZQkJBR0NOeFVLQkNZd0pEQUtCZ2dyQmdFRkJRY0RBVEFLQmdnckJnRUZCUWNEQWpBS0JnZ3JCZ0VGQlFnQ0FqQlBCZ05WSFNBRVNEQkdNRVFHRFNzR0FRUUJncWxYZzMyQlNBSXdNekF4QmdnckJnRUZCUWNDQVJZbGFIUjBjRG92TDNCcmFTNXpaWEoyYVdObFpIQmhiM0l1WkdVdlkyVnlkR05zWVhOekFEQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FnRUFPbG9Kc05vaUdoN09TRWdLelF1TEE1ZUozUFpLOGJ4MGdmVXlOZVJvSVlVQnErZ1lVSW1IM2tRU3R1bDg2WXhwU3JrUzNGNkU3c2pqWitncHRXai95aDcwMUYzR0EvZEk3TDVBTGNmSXdWWjlVckIzdnlKWHYwWGNQSmlMb05uZ3N0TDdBUzFobFV3d0NYN0pCS1FVdnFnS2dMWGFyWGpHYko2emZCMlVTSG9LSWJkVlo4R0ZhUENPWU5QZmlHanBDaSs4WUllTWY5eHRhSUJ6dGFRUEJ2eW4yVC9CNzBNSjBLK1JFZTdzTUNSSXBmYTdsZThRNVBlaGJEQWpkOWhCb3hzbWJtUXhxZmtKUHNYVDNqeGIxZk5pWHRyNjFRVkh0ODQ4dTNkOXhCVkc5OSthRlZlNnJRd01wdDA4TWpBYWdWemNpS2RlRU01WTAzaUNBVFdabDZEYjZINjhlVU9FdTdJTmxmNDF1UGQ3U0FOMnpRT1pIZ3pnZTJjbXNwcGZlKyt4NU1VK3YyUy9rOUJrVHQwU2FqWEtHcjczdk92VU1pMUhvNjEwMkpKdWg5K2NyVDRRM1VFRkp3QStkZHVVK25MVDRDWGZjOGs3RGVCTGJBME1IQzNhOXFLcmZKcnNlM2NkVmdRQmVSWFFDTk55OGJHV2swdHNueXhWMDJhdG92TnJ6ZXBMekE3dCtOU2lPNUNUWXo5U3NXSXRLTk5Wd3kyZ3ZwQjVNU1Fsc2tQRWNFMzh2UTYvc1p2Nks0MGczbnY1Q2Z1RlMyait2eDdsSTVCVmJQSW1KNDN3QXB0dktnUVAyVEtuTFEwTmRCWE5VSzlQZGI3MlJtM1BGTlp3eHVMdncyV1BXNk9SNVRvdk44Q3VIdHNGTmU0UHlPTVg2QnN4elVqb0dFMD08L1g1MDlDZXJ0aWZpY2F0ZT48L1g1MDlEYXRhPjwvS2V5SW5mbz48L1NpZ25hdHVyZT48c2FtbDpTdWJqZWN0PjxzYW1sOk5hbWVJRCBGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpuYW1laWQtZm9ybWF0OnBlcnNpc3RlbnQiIE5hbWVRdWFsaWZpZXI9InVybjpvc3A6bmFtZXM6cmVhbG06c3RhZ2U6c2giPmRlOTM3YTE3LWIxNTYtNGFhZi05NDc2LTI2NThiYzg3MjY1OTwvc2FtbDpOYW1lSUQ+PHNhbWw6U3ViamVjdENvbmZpcm1hdGlvbiBNZXRob2Q9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpjbTpiZWFyZXIiPjxzYW1sOlN1YmplY3RDb25maXJtYXRpb25EYXRhIEluUmVzcG9uc2VUbz0iX2Q3M2VlMTJlYmIwMjY0OWQyM2Q4M2U2OWM2OWM4NTcxIiBOb3RPbk9yQWZ0ZXI9IjIwMjEtMDQtMTRUMTc6MDA6MTMuNjM4WiIgUmVjaXBpZW50PSJodHRwczovL3N0YWdlLmFmbS5zY2hsZXN3aWctaG9sc3RlaW4uZGUvb3NpL1NoaWJib2xldGguc3NvL1NBTUwyL1BPU1QiLz48L3NhbWw6U3ViamVjdENvbmZpcm1hdGlvbj48L3NhbWw6U3ViamVjdD48c2FtbDpDb25kaXRpb25zIE5vdE9uT3JBZnRlcj0iMjAyMS0wNC0xNFQxNzowMDoxMy42MzhaIj48c2FtbDpBdWRpZW5jZVJlc3RyaWN0aW9uPjxzYW1sOkF1ZGllbmNlPmh0dHBzOi8vc3RhZ2UuYWZtLnNjaGxlc3dpZy1ob2xzdGVpbi5kZTwvc2FtbDpBdWRpZW5jZT48L3NhbWw6QXVkaWVuY2VSZXN0cmljdGlvbj48L3NhbWw6Q29uZGl0aW9ucz48c2FtbDpBdXRoblN0YXRlbWVudCBBdXRobkluc3RhbnQ9IjIwMjEtMDQtMTRUMDc6MDA6MTMuNjM4WiIgU2Vzc2lvbkluZGV4PSJiZjA0NjNhNy0xYjdkLTQ5ZWMtODE5Yy1jZDFhZGM4ZTFlZGEiPjxzYW1sOkF1dGhuQ29udGV4dD48c2FtbDpBdXRobkNvbnRleHRDbGFzc1JlZj5odHRwOi8vZWlkYXMuZXVyb3BhLmV1L0xvQS9sb3c8L3NhbWw6QXV0aG5Db250ZXh0Q2xhc3NSZWY+PC9zYW1sOkF1dGhuQ29udGV4dD48L3NhbWw6QXV0aG5TdGF0ZW1lbnQ+PHNhbWw6QXR0cmlidXRlU3RhdGVtZW50PjxzYW1sOkF0dHJpYnV0ZSBOYW1lPSJVc2VybmFtZSIgTmFtZUZvcm1hdD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmF0dHJuYW1lLWZvcm1hdDpiYXNpYyI+PHNhbWw6QXR0cmlidXRlVmFsdWUgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6dHlwZT0ieHM6c3RyaW5nIj5hZm10NzBAd2ViLmRlPC9zYW1sOkF0dHJpYnV0ZVZhbHVlPjwvc2FtbDpBdHRyaWJ1dGU+PHNhbWw6QXR0cmlidXRlIE5hbWU9IkFzc3VyYW5jZUxldmVsIiBOYW1lRm9ybWF0PSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YXR0cm5hbWUtZm9ybWF0OmJhc2ljIj48c2FtbDpBdHRyaWJ1dGVWYWx1ZSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTp0eXBlPSJ4czpzdHJpbmciPkxvdzwvc2FtbDpBdHRyaWJ1dGVWYWx1ZT48L3NhbWw6QXR0cmlidXRlPjxzYW1sOkF0dHJpYnV0ZSBOYW1lPSJUaXRsZSIgTmFtZUZvcm1hdD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmF0dHJuYW1lLWZvcm1hdDpiYXNpYyI+PHNhbWw6QXR0cmlidXRlVmFsdWUgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6dHlwZT0ieHM6c3RyaW5nIj5IZXJyPC9zYW1sOkF0dHJpYnV0ZVZhbHVlPjwvc2FtbDpBdHRyaWJ1dGU+PHNhbWw6QXR0cmlidXRlIE5hbWU9IkdpdmVuTmFtZXMiIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6YmFzaWMiPjxzYW1sOkF0dHJpYnV0ZVZhbHVlIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnR5cGU9InhzOnN0cmluZyI+RGF0YXBvcnQ8L3NhbWw6QXR0cmlidXRlVmFsdWU+PC9zYW1sOkF0dHJpYnV0ZT48c2FtbDpBdHRyaWJ1dGUgTmFtZT0iRmFtaWx5TmFtZXMiIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6YmFzaWMiPjxzYW1sOkF0dHJpYnV0ZVZhbHVlIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnR5cGU9InhzOnN0cmluZyI+U0gtVXNlcjwvc2FtbDpBdHRyaWJ1dGVWYWx1ZT48L3NhbWw6QXR0cmlidXRlPjxzYW1sOkF0dHJpYnV0ZSBOYW1lPSJFbWFpbEFkZHJlc3MiIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6YmFzaWMiPjxzYW1sOkF0dHJpYnV0ZVZhbHVlIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnR5cGU9InhzOnN0cmluZyI+YWZtdDcwQHdlYi5kZTwvc2FtbDpBdHRyaWJ1dGVWYWx1ZT48L3NhbWw6QXR0cmlidXRlPjxzYW1sOkF0dHJpYnV0ZSBOYW1lPSJQcmluY2lwYWxUeXBlIiBOYW1lRm9ybWF0PSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YXR0cm5hbWUtZm9ybWF0OmJhc2ljIj48c2FtbDpBdHRyaWJ1dGVWYWx1ZSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTp0eXBlPSJ4czpzdHJpbmciPkNpdGl6ZW48L3NhbWw6QXR0cmlidXRlVmFsdWU+PC9zYW1sOkF0dHJpYnV0ZT48c2FtbDpBdHRyaWJ1dGUgTmFtZT0iQ2l0aXplblByb2ZpbGVUeXBlIiBOYW1lRm9ybWF0PSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YXR0cm5hbWUtZm9ybWF0OmJhc2ljIj48c2FtbDpBdHRyaWJ1dGVWYWx1ZSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTp0eXBlPSJ4czpzdHJpbmciPlN0YW5kYXJkPC9zYW1sOkF0dHJpYnV0ZVZhbHVlPjwvc2FtbDpBdHRyaWJ1dGU+PC9zYW1sOkF0dHJpYnV0ZVN0YXRlbWVudD48L3NhbWw6QXNzZXJ0aW9uPg==</content> - <contentType>text/xml</contentType> - <id>saml-assertion</id> - <name>SAML-Assertion.xml</name> - </attachments> - <attachments> - <attributes> - <key>X-IntelliForm-Signed</key> - <value>false</value> - </attributes> - <content>JVBERi0xLjUNCiW1tbW1DQoxIDAgb2JqDQo8PC9UeXBlL0NhdGFsb2cvUGFnZXMgMiAwIFIvTGFuZyhkZS1ERSkgL1N0cnVjdFRyZWVSb290IDEwIDAgUi9NYXJrSW5mbzw8L01hcmtlZCB0cnVlPj4+Pg0KZW5kb2JqDQoyIDAgb2JqDQo8PC9UeXBlL1BhZ2VzL0NvdW50IDEvS2lkc1sgMyAwIFJdID4+DQplbmRvYmoNCjMgMCBvYmoNCjw8L1R5cGUvUGFnZS9QYXJlbnQgMiAwIFIvUmVzb3VyY2VzPDwvRm9udDw8L0YxIDUgMCBSPj4vRXh0R1N0YXRlPDwvR1M3IDcgMCBSL0dTOCA4IDAgUj4+L1Byb2NTZXRbL1BERi9UZXh0L0ltYWdlQi9JbWFnZUMvSW1hZ2VJXSA+Pi9NZWRpYUJveFsgMCAwIDU5NS4zMiA4NDEuOTJdIC9Db250ZW50cyA0IDAgUi9Hcm91cDw8L1R5cGUvR3JvdXAvUy9UcmFuc3BhcmVuY3kvQ1MvRGV2aWNlUkdCPj4vVGFicy9TL1N0cnVjdFBhcmVudHMgMD4+DQplbmRvYmoNCjQgMCBvYmoNCjw8L0ZpbHRlci9GbGF0ZURlY29kZS9MZW5ndGggMTI1Pj4NCnN0cmVhbQ0KeJxT0A9QsLHR93X2dFEwsLNTcHJxVnAK4eXSdzNUMDTQs7RQCEnj5TJUMABCQwVzAz0LMwVzMwM9MyOFkFygMvdgc4X0Yl4uA4V0MM8CynPn5YrWKEktLtGMVQjx4uVyBZoJMhdmkoWFnoEJsknRGgpIShVcfZ0VAKkCHzkNCmVuZHN0cmVhbQ0KZW5kb2JqDQo1IDAgb2JqDQo8PC9UeXBlL0ZvbnQvU3VidHlwZS9UcnVlVHlwZS9OYW1lL0YxL0Jhc2VGb250L0FCQ0RFRStDYWxpYnJpL0VuY29kaW5nL1dpbkFuc2lFbmNvZGluZy9Gb250RGVzY3JpcHRvciA2IDAgUi9GaXJzdENoYXIgMzIvTGFzdENoYXIgMTE2L1dpZHRocyAxNyAwIFI+Pg0KZW5kb2JqDQo2IDAgb2JqDQo8PC9UeXBlL0ZvbnREZXNjcmlwdG9yL0ZvbnROYW1lL0FCQ0RFRStDYWxpYnJpL0ZsYWdzIDMyL0l0YWxpY0FuZ2xlIDAvQXNj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</content> - <contentType>application/pdf</contentType> - <id>assistants.3F4C5F9B9737333933B9356E49AA35EB3D9272B9</id> - <name>test.pdf</name> - </attachments> - <attachments> - <attributes> - <key>X-IntelliForm-Signed</key> - <value>false</value> - </attributes> - <content>JVBERi0xLjUNCiW1tbW1DQoxIDAgb2JqDQo8PC9UeXBlL0NhdGFsb2cvUGFnZXMgMiAwIFIvTGFuZyhkZS1ERSkgL1N0cnVjdFRyZWVSb290IDEwIDAgUi9NYXJrSW5mbzw8L01hcmtlZCB0cnVlPj4+Pg0KZW5kb2JqDQoyIDAgb2JqDQo8PC9UeXBlL1BhZ2VzL0NvdW50IDEvS2lkc1sgMyAwIFJdID4+DQplbmRvYmoNCjMgMCBvYmoNCjw8L1R5cGUvUGFnZS9QYXJlbnQgMiAwIFIvUmVzb3VyY2VzPDwvRm9udDw8L0YxIDUgMCBSPj4vRXh0R1N0YXRlPDwvR1M3IDcgMCBSL0dTOCA4IDAgUj4+L1Byb2NTZXRbL1BERi9UZXh0L0ltYWdlQi9JbWFnZUMvSW1hZ2VJXSA+Pi9NZWRpYUJveFsgMCAwIDU5NS4zMiA4NDEuOTJdIC9Db250ZW50cyA0IDAgUi9Hcm91cDw8L1R5cGUvR3JvdXAvUy9UcmFuc3BhcmVuY3kvQ1MvRGV2aWNlUkdCPj4vVGFicy9TL1N0cnVjdFBhcmVudHMgMD4+DQplbmRvYmoNCjQgMCBvYmoNCjw8L0ZpbHRlci9GbGF0ZURlY29kZS9MZW5ndGggMTI1Pj4NCnN0cmVhbQ0KeJxT0A9QsLHR93X2dFEwsLNTcHJxVnAK4eXSdzNUMDTQs7RQCEnj5TJUMABCQwVzAz0LMwVzMwM9MyOFkFygMvdgc4X0Yl4uA4V0MM8CynPn5YrWKEktLtGMVQjx4uVyBZoJMhdmkoWFnoEJsknRGgpIShVcfZ0VAKkCHzkNCmVuZHN0cmVhbQ0KZW5kb2JqDQo1IDAgb2JqDQo8PC9UeXBlL0ZvbnQvU3VidHlwZS9UcnVlVHlwZS9OYW1lL0YxL0Jhc2VGb250L0FCQ0RFRStDYWxpYnJpL0VuY29kaW5nL1dpbkFuc2lFbmNvZGluZy9Gb250RGVzY3JpcHRvciA2IDAgUi9GaXJzdENoYXIgMzIvTGFzdENoYXIgMTE2L1dpZHRocyAxNyAwIFI+Pg0KZW5kb2JqDQo2IDAgb2JqDQo8PC9UeXBlL0ZvbnREZXNjcmlwdG9yL0ZvbnROYW1lL0FCQ0RFRStDYWxpYnJpL0ZsYWdzIDMyL0l0YWxpY0FuZ2xlIDAvQXNj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</content> - <contentType>application/pdf</contentType> - <id>assistants.7C9AC0743CE065A74E0DC2D85F9682BFC49035BB</id> - <name>test (1).pdf</name> - </attachments> - <attachments> - <attributes> - <key>X-IntelliForm-Signed</key> - <value>false</value> - </attributes> - <content>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ZW5kb2JqDQozNCAwIG9iag0KPDwNCi9PcGVuQWN0aW9uIFsgMSAwIFIgL1hZWiBudWxsIG51bGwgMSBdDQovVHlwZSAvQ2F0YWxvZw0KL0xhbmcgKGRlLURFKQ0KL1BhZ2VzIDE2IDAgUg0KPj4NCmVuZG9iag0KMzUgMCBvYmoNCjw8DQovQ3JlYXRvciA8ZmVmZjAwNTcwMDcyMDA2OTAwNzQwMDY1MDA3Mj4NCi9DcmVhdGlvbkRhdGUgKEQ6MjAyMTA0MTQwOTAxNDUrMDInMDAnKQ0KL1Byb2R1Y2VyIChjaXQgcGRmc3VpdGUgXCh3d3cuY2l0LmRlXCkpDQovQXV0aG9yIDxmZWZmMDA0YjAwNmMwMDYxMDA3NTAwNzMwMDIwMDA1NzAwNjEwMDZlMDA2ZTAwNjUwMDcyPg0KPj4NCmVuZG9iag0KeHJlZg0KMCAzNiANCjAwMDAwMDAwMDAgNjU1MzUgZg0KMDAwMDAwMDA2OCAwMDAwMCBuDQowMDAwMDAwMjU1IDAwMDAwIG4NCjAwMDAwMTI3MjYgMDAwMDAgbg0KMDAwMDAxMjc1MCAwMDAwMCBuDQowMDAwMDQ0MzE5IDAwMDAwIG4NCjAwMDAwNTQxODMgMDAwMDAgbg0KMDAwMDA1NDIwNiAwMDAwMCBuDQowMDAwMDU0MzkzIDAwMDAwIG4NCjAwMDAwNjU3NTEgMDAwMDAgbg0KMDAwMDA2NTc3NSAwMDAwMCBuDQowMDAwMDY1OTY0IDAwMDAwIG4NCjAwMDAwNzc4NTkgMDAwMDAgbg0KMDAwMDA3Nzg4NCAwMDAwMCBuDQowMDAwMDc4MDczIDAwMDAwIG4NCjAwMDAwODkwNTkgMDAwMDAgbg0KMDAwMDA4OTA4NCAwMDAwMCBuDQowMDAwMDg5MjE3IDAwMDAwIG4NCjAwMDAwOTEyNjAgMDAwMDAgbg0KMDAwMDA5MTI4NCAwMDAwMCBuDQowMDAwMDkxNDk3IDAwMDAwIG4NCjAwMDAwOTE4MDYgMDAwMDAgbg0KMDAwMDA5MTk5MCAwMDAwMCBuDQowMDAwMTAwNDEyIDAwMDAwIG4NCjAwMDAxMDA0MzYgMDAwMDAgbg0KMDAwMDEwMDY1OCAwMDAwMCBuDQowMDAwMTAxMjA5IDAwMDAwIG4NCjAwMDAxMDE2MjMgMDAwMDAgbg0KMDAwMDExMDE3MCAwMDAwMCBuDQowMDAwMTEwMTk0IDAwMDAwIG4NCjAwMDAxMTA0MTMgMDAwMDAgbg0KMDAwMDExMDk5MiAwMDAwMCBuDQowMDAwMTExNDI4IDAwMDAwIG4NCjAwMDAxMTE0OTAgMDAwMDAgbg0KMDAwMDExMTYwOCAwMDAwMCBuDQowMDAwMTExNzIwIDAwMDAwIG4NCnRyYWlsZXINCjw8DQovSW5mbyAzNSAwIFINCi9JRCBbIDw4YmVlYWQzNmY0ODliNDBkNzk2NWZhNDQ5ODVjOWFmNT4gPDAxMDJlNWRhZGQwNTgzMzQ4YTMzN2NiOTc3ZjE0MzQ5PiBdDQovUm9vdCAzNCAwIFINCi9TaXplIDM2DQovRG9jQ2hlY2tzdW0gLzA1NjMzRjY4QUU3RkI1MUU5MzA1QTBDNDdEMTI3MjlGDQo+Pg0Kc3RhcnR4cmVmDQoxMTE5MzMNCiUlRU9GDQo=</content> - <contentType>application/pdf</contentType> - <id>myForm-pdf</id> - <name>Eingliederungshilfe-Antrag.pdf</name> - </attachments> - <attachments> - <attributes> - <key>X-IntelliForm-Signed</key> - <value>false</value> - </attributes> - <content>PGh0bWwgeG1sbnM6dD0iaHR0cDovL3htbG5zLmNpdC5kZS9pbnRlbGxpZm9ybS90cmFuc2FjdGlvbiI+CjxoZWFkPgo8TUVUQSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KPC9oZWFkPgo8Ym9keSBzdHlsZT0iZm9udC1mYW1pbHk6IFZlcmRhbmE7IGZvbnQtc2l6ZTogMTFwdDsiPgogICAgICAgICAgICBTZWhyIGdlZWhydGUvciBBbnRyYWdzdGVsbGVyKmluLCA8YnI+Cjxicj4KSWhyIEFudHJhZyB3dXJkZSBlcmZvbGdyZWljaCAmdXVtbDtiZXJtaXR0ZWx0Ljxicj4KPGJyPgpCaXR0ZSBiZWFjaHRlbiBTaWUsIGRhc3MgZGllIEJlYXJiZWl0dW5nc3plaXQgbmFjaCBFaW5nYW5nIGFsbGVyIFVudGVybGFnZW4gMiBXb2NoZW4gYmlzIDIgTW9uYXRlIGJldHImYXVtbDtndC4gU2llIGVyaGFsdGVuIHVuYXVmZ2Vmb3JkZXJ0IGVpbmUgUiZ1dW1sO2NrbWVsZHVuZyB6dSBJaHJlbSBBbnRyYWcuPGJyPgo8YnI+IApJaHJlIFZvcmdhbmdzbnVtbWVyIGxhdXRldDogCjUxLzUxLjIwLzIwMjEwNDE0MzI0MTIwMDkwMjA3LgpCaXR0ZSBnZWJlbiBTaWUgZGllc2UgVm9yZ2FuZ3NudW1tZXIgYmVpIGFsbGVuIEFuZnJhZ2VuIHp1IElocmVtIEFudHJhZyBhbi48YnI+Cjxicj4KPGJyPgpNaXQgZnJlbmRsaWNoZW4gR3ImdXVtbDsmc3psaWc7ZW48YnI+CklociBLcmVpcyBTZWdlYmVyZzxicj4KPGJyPgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08YnI+Cjxicj4KPHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hOyBmb250LXNpemU6IDlwdDsiPktyZWlzIFNlZ2ViZXJnIDxicj4KRWluZ2xpZWRlcnVuZ3NoaWxmZSBmJnV1bWw7ciBNaW5kZXJqJmF1bWw7aHJpZ2U8YnI+Cjxicj4KUG9zdGFuc2NocmlmdDo8YnI+CkhhbWJ1cmdlciBTdHIuIDMwPGJyPgoyMzc5NSBCYWQgU2VnZWJlcmc8YnI+Cjxicj4KQmVzdWNoZXJhbnNjaHJpZnQ6PGJyPgpCdXJnZmVsZHN0ci4gNDFhIDxicj4KMjM3OTUgQmFkIFNlZ2ViZXJnIDxicj4KPGJyPgpGYXg6ICs0OTQ1NTEvOTUxLTk1NjUgPGJyPgpFLU1haWw6IDxhIGhlcmY9Im1haWx0bzppbnRlZ3JhdGlvbi5raW5kZXJAc2VnZWJlcmcuZGUgIj5pbnRlZ3JhdGlvbi5raW5kZXJAc2VnZWJlcmcuZGUgPC9hPgo8YnI+CkludGVybmV0OiA8YSBocmVmPSJ3d3cuc2VnZWJlcmcuZGUiPnd3dy5zZWdlYmVyZy5kZTwvYT48L3NwYW4+Cjxicj4KPC9ib2R5Pgo8L2h0bWw+Cg==</content> - <contentType>text/xml</contentType> - <id>EmailBodyTemplate</id> - <name>EmailBodyTemplate.xml</name> - </attachments> - <caller/> - <client>Schleswig-Holstein</client> - <clientId>land</clientId> - <customParameters> - <key>AbsenderBehoerdenkennung</key> - <value>afmsh:afm_eEingliederungshilfe</value> - </customParameters> - <customParameters> - <key>EmailAdresseSachbearbeitung</key> - <value>noreply@ozg-sh.de</value> - </customParameters> - <customParameters> - <key>EmailSubjectTemplate</key> - <value>EGH Stage Deposit Prüfung</value> - </customParameters> - <customParameters> - <key>EmpfaengerBehoerdenkennung</key> - <value>afmsh:12345_eEingliederungshilfe</value> - </customParameters> - <customParameters> - <key>mailboxguid</key> - <value>c5a446b7-d6b0-4c61-9ad2-aae600857982</value> - </customParameters> - <customParameters> - <key>PostfachAttachmentIds</key> - <value>myForm-pdf</value> - </customParameters> - <customParameters> - <key>PostfachBodyTemplate</key> - <value>Sehr geehrte/r Antragsteller*in, <br/><br/>Ihr Antrag wurde erfolgreich übermittelt.<br/><br/>Bitte beachten Sie, dass die Bearbeitungszeit nach Eingang aller Unterlagen 2 Wochen bis 2 Monate beträgt. Sie erhalten unaufgefordert eine Rückmeldung zu Ihrem Antrag.<br/><br/>Ihre Vorgangsnummer finden Sie im angehängten Dokument. <br/>Bitte geben Sie diese Vorgangsnummer bei allen Anfragen zu Ihrem Antrag an.<br/><br/><br/>Mit frendlichen Grüßen<br/>Ihr Kreis Segeberg<br/><br/>---------------------------------------------------<br/><br/>Kreis Segeberg <br/>Eingliederungshilfe für Minderjährige<br/><br/>Postanschrift:<br/>Hamburger Str. 30<br/>23795 Bad Segeberg<br/><br/>Besucheranschrift:<br/>Burgfeldstr. 41a <br/>23795 Bad Segeberg <br/><br/>Fax: +494551/951-9565 <br/>E-Mail: <a herf="mailto:integration.kinder@segeberg.de">integration.kinder@segeberg.de</a><br/>Internet: <a href="www.segeberg.de">www.segeberg.de</a><br/></value> - </customParameters> - <customParameters> - <key>PostfachIsHtml</key> - <value>true</value> - </customParameters> - <customParameters> - <key>PostfachSubjectTemplate</key> - <value>Ihr Antrag auf Eingliederungshilfe für Minderjährige</value> - </customParameters> - <customer>Kreis Segeberg</customer> - <customerId>kreis-segeberg/kreis-segeberg</customerId> - <form>Eingliederungshilfe Minderjährige</form> - <formId>pfm_postfachmitteilung</formId> - <id>20210414324120090207</id> - <primaryDataAttachmentId>myForm-xml</primaryDataAttachmentId> - <primaryFormAttachmentId>myForm-pdf</primaryFormAttachmentId> - <sender>stage.afm.schleswig-holstein.de</sender> - <timestamp>2021-04-14T09:01:49.030+02:00</timestamp> - <username>de937a17-b156-4aaf-9476-2658bc872659</username> - </data> - </ns2:deposit> - </soap:Body> -</soap:Envelope> diff --git a/intelliform-adapter/src/main/scripts/vorgang-GewerbeAnmeldung.xml b/intelliform-adapter/src/main/scripts/vorgang-GewerbeAnmeldung.xml deleted file mode 100644 index cc000e0537a7518032d609b184dfdb95f44faf79..0000000000000000000000000000000000000000 --- a/intelliform-adapter/src/main/scripts/vorgang-GewerbeAnmeldung.xml +++ /dev/null @@ -1,30 +0,0 @@ -<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> - <soap:Body> - <ns2:deposit xmlns:ns2="http://xmlns.cit.de/intelliform/2009/webservices/backend"> - <data> - <attachments> - <attributes> - <key>X-IntelliForm-Signed</key> - <value>false</value> - </attributes> - <content>PG15Rm9ybSB4bWxuczpwZGY9Imh0dHA6Ly94bWxucy5jaXQuZGUvYXNzaXN0YW50cy9wZGYiDQoJeG1sbnM6dD0iaHR0cDovL3htbG5zLmNpdC5kZS9pbnRlbGxpZm9ybS90cmFuc2FjdGlvbiINCgl0OmlkPSIyMDIwMTIwMjU3NTIzMDQ0MzAwNCIgdDp0aW1lc3RhbXA9IjIwMjAtMTItMDJUMTQ6NTg6NDMuNzkwWiINCgl0OnNlbmRlcj0iYWZtLnNjaGxlc3dpZy1ob2xzdGVpbi5kZSIgdDpmb3JtPSJHZXdlcmJlYW5tZWxkdW5nIg0KCXQ6Zm9ybS1pZD0iZUdld2VyYmUvZUdld2VyYmVBbm1lbGR1bmciDQoJdDpjdXN0b21lcj0iRWluaGVpdGxpY2hlciBBbnNwcmVjaHBhcnRuZXIiIHQ6Y3VzdG9tZXItaWQ9ImVhLXNoIg0KCXQ6Y2xpZW50PSJTY2hsZXN3aWctSG9sc3RlaW4iIHQ6Y2xpZW50LWlkPSJsYW5kIj4NCgk8R3VlbHRpZ0FiPjIwMjAtMTEtMDI8L0d1ZWx0aWdBYj4NCgk8R3J1bmRBbm1lbGR1bmdTY2hsdWVzc2VsPjAxPC9HcnVuZEFubWVsZHVuZ1NjaGx1ZXNzZWw+DQoJPEFubGllZ2VuSUQ+ODkzODYzNDwvQW5saWVnZW5JRD4NCgk8TmllZGVybGFzc3VuZ0FydD4xPC9OaWVkZXJsYXNzdW5nQXJ0Pg0KCTxJc3RSZWlzZWdld2VyYmU+ZmFsc2U8L0lzdFJlaXNlZ2V3ZXJiZT4NCgk8QmV0cmllYkFydEluZHVzdHJpZT5mYWxzZTwvQmV0cmllYkFydEluZHVzdHJpZT4NCgk8QmV0cmllYkFydEhhbmR3ZXJrPmZhbHNlPC9CZXRyaWViQXJ0SGFuZHdlcms+DQoJPEJldHJpZWJBcnRIYW5kZWw+ZmFsc2U8L0JldHJpZWJBcnRIYW5kZWw+DQoJPEJldHJpZWJBcnRTb25zdGlnZXM+dHJ1ZTwvQmV0cmllYkFydFNvbnN0aWdlcz4NCgk8cmVjaHRzZm9ybT5uaWNodCBlaW5nZXRyYWdlbmVzIEVpbnplbHVudGVybmVobWVuPC9yZWNodHNmb3JtPg0KCTxyZm0+MTgwPC9yZm0+DQoJPHJlZ2lzdGVyYXJ0IC8+DQoJPG1pbjJnZXNlbGxzY2hhZnRlcj5mYWxzZTwvbWluMmdlc2VsbHNjaGFmdGVyPg0KCTxnZXNldHpsaWNoZXJ2ZXJ0cmV0ZXI+SW5oYWJlcjwvZ2VzZXR6bGljaGVydmVydHJldGVyPg0KCTxCZXRyaWViPg0KCQk8SUQ+OTEwODM4PC9JRD4NCgkJPGdlc2NoYWVmdHNiZXplaWNobnVuZz5PWkctQ29uc3VsdGluZzwvZ2VzY2hhZWZ0c2JlemVpY2hudW5nPg0KCQk8RWludHJhZ3VuZ1BMWiAvPg0KCQk8RWludHJhZ3VuZ09ydCAvPg0KCQk8R2VyaWNodFNjaGx1ZXNzZWwgLz4NCgk8L0JldHJpZWI+DQoJPHNoX3N0cmFzc2U+UmV2ZW50bG91YWxsZTwvc2hfc3RyYXNzZT4NCgk8c2hfenVzYXR6IC8+DQoJPHNoX2hhdXNudW1tZXI+Njwvc2hfaGF1c251bW1lcj4NCgk8c2hfcGx6PjI0MTA1PC9zaF9wbHo+DQoJPG9ydF9hdXN3YWhsPjkwMDY0MDIkMDEwMDIwMDA8L29ydF9hdXN3YWhsPg0KCTxzaF9vcnRzdGVpbCAvPg0KCTxvcnQ+S2llbDwvb3J0Pg0KCTxHZWJpZXRJRD45MDA2NDAyPC9HZWJpZXRJRD4NCgk8R2ViaWV0QkVaRUlDSE5VTkc+S2llbDwvR2ViaWV0QkVaRUlDSE5VTkc+DQoJPEdlYmlldEdOUjk0X0dOUj4wMTAwMjAwMDwvR2ViaWV0R05SOTRfR05SPg0KCTxzdGFhdD4wMDA8L3N0YWF0Pg0KCTxpc28zMTY2bnVtZXJpc2NoPjI3NjwvaXNvMzE2Nm51bWVyaXNjaD4NCgk8a29udF90ZWxlZm9ubnVtbWVyPjA0MzEgMTIzPC9rb250X3RlbGVmb25udW1tZXI+DQoJPGtvbnRfdGVsZWZheG51bW1lcj4rIDQ5IDQ2MjEgOTY1NDwva29udF90ZWxlZmF4bnVtbWVyPg0KCTxrb250X2VtYWlsPm1heC50ZXN0ZXJtYW5uQGdteC5kZTwva29udF9lbWFpbD4NCgk8a29udF9kZW1haWw+bWF4LnRlc3Rlcm1hbm5AZ214LmRlLW1haWwuZGU8L2tvbnRfZGVtYWlsPg0KCTxrb250X2hvbWVwYWdlPmh0dHA6Ly93d3cubWF4LXRlc3Rlci5kZTwva29udF9ob21lcGFnZT4NCgk8Yl9rb250X3ZvcndhaGxfdGVsZWZvbj4wNDMxPC9iX2tvbnRfdm9yd2FobF90ZWxlZm9uPg0KCTxiX2tvbnRfdGVsZWZvbj4xMjM8L2Jfa29udF90ZWxlZm9uPg0KCTxiX2tvbnRfdm9yd2FobF90ZWxlZmF4PisgNDkgNDYyMTwvYl9rb250X3ZvcndhaGxfdGVsZWZheD4NCgk8Yl9rb250X3RlbGVmYXg+OTY1NDwvYl9rb250X3RlbGVmYXg+DQoJPFRhZXRpZ2tlaXRlbkdlc2FtdD4NCgkJPFRhZXRpZ2tlaXRlbkdlc2FtdC1pdGVtPg0KCQkJPGF1c3dhaGxfb2JlcmJlZ3JpZmY+UzwvYXVzd2FobF9vYmVyYmVncmlmZj4NCgkJCTxhdXN3YWhsX2thdGVnb3JpZT45NjwvYXVzd2FobF9rYXRlZ29yaWU+DQoJCQk8Y2hlY2tfdGFldGlna2VpdHNzY2h3ZXJwdW5rdD50cnVlPC9jaGVja190YWV0aWdrZWl0c3NjaHdlcnB1bmt0Pg0KCQkJPGFfdGFldGlna2VpdD5PWkctRW50d2lja2x1bmc8L2FfdGFldGlna2VpdD4NCgkJCTxiX29iZXJiZWdyaWZmPlMgRXJicmluZ3VuZyB2b24gc29uc3RpZ2VuIERpZW5zdGxlaXN0dW5nZW48L2Jfb2JlcmJlZ3JpZmY+DQoJCQk8Yl9rYXRlZ29yaWU+OTYgRXJicmluZ3VuZyB2b24gc29uc3RpZ2VuIMO8YmVyd2llZ2VuZCBwZXJzw7ZubGljaGVuDQoJCQkJRGllbnN0bGVpc3R1bmdlbjwvYl9rYXRlZ29yaWU+DQoJCQk8Yl91bnRlcmtsYXNzZT45Ni4wOS4wIEVyYnJpbmd1bmcgdm9uIHNvbnN0aWdlbiBEaWVuc3RsZWlzdHVuZ2VuIGEuDQoJCQkJbi4gZy48L2JfdW50ZXJrbGFzc2U+DQoJCQk8Yl91bnRlcmtsYXNzZV9zY2hsdWVzc2VsPjk2LjA5LjA8L2JfdW50ZXJrbGFzc2Vfc2NobHVlc3NlbD4NCgkJCTxiX2lua2w+LSBUw6R0aWdrZWl0ZW4gdm9uIEFzdHJvbG9naW5uZW4sIEFzdHJvbG9nZW4gU3Bpcml0aXN0aW5uZW51bmQNCgkJCQlTcGlyaXRpc3RlbiAtIEVyYnJpbmd1bmcgcGVyc8O2bmxpY2hlciBEaWVuc3RsZWlzdHVuZ2VuIHdpZQ0KCQkJCUJlZ2xlaXRkaWVuc3RlLCBIZWlyYXRzLSB1bmQgUGFydG5lcnZlcm1pdHRsdW5nIC0gQmV0cmV1dW5nIHZvbg0KCQkJCUhhdXN0aWVyZW4gd2llIFVudGVyYnJpbmd1bmcsIFBmbGVnZSwgQmVhdWZzaWNodGlndW5nIHVuZCBEcmVzc3VyIC0NCgkJCQlUw6R0aWdrZWl0ZW4gdm9uIEFobmVuZm9yc2NodW5nc2luc3RpdHV0ZW4gLSBUw6R0aWdrZWl0ZW4gdm9uDQoJCQkJVMOkdG93aWVydW5ncy0gdW5kIFBpZXJjaW5nc3R1ZGlvcyAtIFTDpHRpZ2tlaXRlbiB2b24gU2NodWhwdXR6ZXJpbm5lbg0KCQkJCXVuZCBTY2h1aHB1dHplcm4sIFRyw6RnZXJpbm5lbiB1bmQgVHLDpGdlcm4sIFBhcmtwbGF0enp1d2Vpc2VyaW5uZW4NCgkJCQl1bmQgLXp1d2Vpc2VybiB1c3cuIC0gQmV0cmllYiB2b24gbcO8bnpiZXRyaWViZW5lbiBHZXLDpHRlbiBmw7xyDQoJCQkJcGVyc8O2bmxpY2hlIERpZW5zdGxlaXN0dW5nZW4gd2llIEZvdG9hdXRvbWF0ZW4sIFdhYWdlbiwNCgkJCQlCbHV0ZHJ1Y2ttZXNzZXJuLCBTY2hsaWXDn2bDpGNoZXJuIHVzdy48L2JfaW5rbD4NCgkJPC9UYWV0aWdrZWl0ZW5HZXNhbXQtaXRlbT4NCgk8L1RhZXRpZ2tlaXRlbkdlc2FtdD4NCgk8SXN0TmViZW5lcndlcmI+ZmFsc2U8L0lzdE5lYmVuZXJ3ZXJiPg0KCTxBbnphaGxWb2xsemVpdEJlc2NoYWVmdGlndGU+MTwvQW56YWhsVm9sbHplaXRCZXNjaGFlZnRpZ3RlPg0KCTxBbnphaGxUZWlsemVpdEJlc2NoYWVmdGlndGU+MDwvQW56YWhsVGVpbHplaXRCZXNjaGFlZnRpZ3RlPg0KCTxCZXRlaWxpZ3RlUGVyc29uPg0KCQk8QmV0ZWlsaWd0ZVBlcnNvbi1pdGVtPg0KCQkJPHBlcnNvbkZ1bmt0aW9uPjE8L3BlcnNvbkZ1bmt0aW9uPg0KCQkJPHBlcnNvbkZ1bmt0aW9uVGV4dD5FaW56ZWxnZXdlcmJldHJlaWJlbmRlcjwvcGVyc29uRnVua3Rpb25UZXh0Pg0KCQkJPGRva3RvcmdyYWRTY2hsdWVzc2VsIC8+DQoJCQk8ZG9rdG9yZ3JhZCAvPg0KCQkJPGZhbWlsaWVubmFtZT5UZXN0ZXJtYW5uPC9mYW1pbGllbm5hbWU+DQoJCQk8dm9ybmFtZT5NYXg8L3Zvcm5hbWU+DQoJCQk8Z2VzY2hsZWNodFRleHQ+bcOkbm5saWNoPC9nZXNjaGxlY2h0VGV4dD4NCgkJCTxnZXNjaGxlY2h0PjE8L2dlc2NobGVjaHQ+DQoJCQk8Z2VidXJ0c25hbWU+TWF4IFRlc3Rlcm1hbm48L2dlYnVydHNuYW1lPg0KCQkJPGdlYnVydHNkYXR1bT4xOTk1LTAzLTIxPC9nZWJ1cnRzZGF0dW0+DQoJCQk8Z2VidXJ0c29ydD5GbGVuc2J1cmc8L2dlYnVydHNvcnQ+DQoJCQk8Z2VidXJ0c2xhbmQ+RGV1dHNjaGxhbmQ8L2dlYnVydHNsYW5kPg0KCQkJPGdlYnVydHNsYW5kU2NobHVlc2VsPjAwMDwvZ2VidXJ0c2xhbmRTY2hsdWVzZWw+DQoJCQk8c3RhYXRzYW5nZWhvZXJpZ2tlaXQ+ZGV1dHNjaDwvc3RhYXRzYW5nZWhvZXJpZ2tlaXQ+DQoJCQk8c3RhYXRzYW5nZWhvZXJpZ2tlaXRTY2hsdWVzc2VsPjAwMDwvc3RhYXRzYW5nZWhvZXJpZ2tlaXRTY2hsdWVzc2VsPg0KCQkJPGFkcl9zdHJhc3NlPkvDtm5pZ3N3ZWc8L2Fkcl9zdHJhc3NlPg0KCQkJPGFkcl96dXNhdHo+QXBwYXJ0bWVudCAzMjE8L2Fkcl96dXNhdHo+DQoJCQk8YWRyX2hhdXNudW1tZXI+NzQ8L2Fkcl9oYXVzbnVtbWVyPg0KCQkJPGFkcl9wbHo+MjQ4Mzc8L2Fkcl9wbHo+DQoJCQk8YWRyX29ydD5TY2hsZXN3aWc8L2Fkcl9vcnQ+DQoJCQk8YWRyX29ydHN0ZWlsPlNjaGxlc3dpZzwvYWRyX29ydHN0ZWlsPg0KCQkJPGFkcl9sYW5kPkRldXRzY2hsYW5kJERFJERFVSQyNzYkLmRlPC9hZHJfbGFuZD4NCgkJCTxiX2Fkcl9udW1lcmlzY2g+Mjc2PC9iX2Fkcl9udW1lcmlzY2g+DQoJCQk8Yl9hZHJfbGFuZD5EZXV0c2NobGFuZDwvYl9hZHJfbGFuZD4NCgkJCTxiX2Fkcl9hbHBoYTI+REU8L2JfYWRyX2FscGhhMj4NCgkJCTxiX2Fkcl9hbHBoYTM+REVVPC9iX2Fkcl9hbHBoYTM+DQoJCQk8Yl9hZHJfZG9tYWluPi5kZTwvYl9hZHJfZG9tYWluPg0KCQkJPGtvbnRfdGVsZWZvbm51bW1lcj4rIDQ5IDQ2MjEgOTY1NDwva29udF90ZWxlZm9ubnVtbWVyPg0KCQkJPGtvbnRfdGVsZWZheG51bW1lcj4rIDQ5IDQ2MjEgOTY1NDwva29udF90ZWxlZmF4bnVtbWVyPg0KCQkJPGtvbnRfZW1haWw+bWF4LnRlc3Rlcm1hbm5AZ214LmRlPC9rb250X2VtYWlsPg0KCQkJPGtvbnRfZGVtYWlsPm1heC50ZXN0ZXJtYW5uQGdteC5kZS1tYWlsLmRlPC9rb250X2RlbWFpbD4NCgkJCTxrb250X2hvbWVwYWdlPmh0dHA6Ly93d3cubWF4LXRlc3Rlci5kZTwva29udF9ob21lcGFnZT4NCgkJCTxiX2tvbnRfdm9yd2FobF90ZWxlZm9uPisgNDkgNDYyMTwvYl9rb250X3ZvcndhaGxfdGVsZWZvbj4NCgkJCTxiX2tvbnRfdGVsZWZvbj45NjU0PC9iX2tvbnRfdGVsZWZvbj4NCgkJCTxiX2tvbnRfdm9yd2FobF90ZWxlZmF4PisgNDkgNDYyMTwvYl9rb250X3ZvcndhaGxfdGVsZWZheD4NCgkJCTxiX2tvbnRfdGVsZWZheD45NjU0PC9iX2tvbnRfdGVsZWZheD4NCgkJCTxTdGF0dXNfRXJsYXVibmlzPjA8L1N0YXR1c19FcmxhdWJuaXM+DQoJCQk8Yl9FcmxhdWJuaXM+TGllZ3QgbmljaHQgdm9yPC9iX0VybGF1Ym5pcz4NCgkJPC9CZXRlaWxpZ3RlUGVyc29uLWl0ZW0+DQoJPC9CZXRlaWxpZ3RlUGVyc29uPg0KCTxLb250YWt0c3lzdGVtVHlwQT4yMzMwMzQ2MDA8L0tvbnRha3RzeXN0ZW1UeXBBPg0KCTxLb250YWt0c3lzdGVtVHlwQj4yMzMwMzQ2MDE8L0tvbnRha3RzeXN0ZW1UeXBCPg0KCTx6dXN0YWVuZGlnZXN0ZWxsZT4NCgkJPE9yZ2FuaXNhdGlvbnNlaW5oZWl0ZW5BdXN3YWhsPjkwMzAyMjk8L09yZ2FuaXNhdGlvbnNlaW5oZWl0ZW5BdXN3YWhsPg0KCQk8T3JnYW5pc2F0aW9uc2VpbmhlaXRlbklEPjkwMzAyMjk8L09yZ2FuaXNhdGlvbnNlaW5oZWl0ZW5JRD4NCgkJPE9yZ2FuaXNhdGlvbnNlaW5oZWl0ZW5CRVpFSUNITlVORz5MYW5kZXNoYXVwdHN0YWR0IEtpZWwgLSBCw7xyZ2VyLSB1bmQNCgkJCU9yZG51bmdzYW10LCBHZXdlcmJlbWVsZGVzdGVsbGU8L09yZ2FuaXNhdGlvbnNlaW5oZWl0ZW5CRVpFSUNITlVORz4NCgkJPHN0cmFzc2U+RmFicmlrc3RyYcOfZTwvc3RyYXNzZT4NCgkJPGhhdXNudW1tZXI+OC0xMCAgICAgIDwvaGF1c251bW1lcj4NCgkJPHBvc3RsZWl0emFobD4yNDEwMzwvcG9zdGxlaXR6YWhsPg0KCQk8b3J0SUQ+OTAwNjQwMjwvb3J0SUQ+DQoJCTxvcnQ+S2llbDwvb3J0Pg0KCQk8dGVsZWZvbm51bW1lcj4rNDkgNDMxIDkwMS0yODA3PC90ZWxlZm9ubnVtbWVyPg0KCQk8dGVsZWZheG51bW1lcj4rNDkgNDMxIDkwMS02MjA3MDwvdGVsZWZheG51bW1lcj4NCgkJPGVtYWlsYWRyZXNzZT5HZXdlcmJlbWVsZGVzdGVsbGVAa2llbC5kZTwvZW1haWxhZHJlc3NlPg0KCQk8ZGVtYWlsYWRyZXNzZSAvPg0KCQk8a29udGFrdHN5c3RlbV9rZW5udW5nIC8+DQoJCTxrb250YWt0c3lzdGVtX2tlbm51bmd6dXNhdHogLz4NCgkJPEFubGllZ2VuQkVaRUlDSE5VTkc+R2V3ZXJiZWFubWVsZHVuZywgRWxla3Ryb25pc2NoZSBHZXdlcmJlYW56ZWlnZTwvQW5saWVnZW5CRVpFSUNITlVORz4NCgkJPGxlaWthS0VZTElTVD45OTA1MDAxMjEwNDAwMDwvbGVpa2FLRVlMSVNUPg0KCTwvenVzdGFlbmRpZ2VzdGVsbGU+DQoJPGVtcGZhbmdlbmRlc3RlbGxlPg0KCQk8T3JnYW5pc2F0aW9uc2VpbmhlaXRlbkF1c3dhaGw+OTA2ODg3MzwvT3JnYW5pc2F0aW9uc2VpbmhlaXRlbkF1c3dhaGw+DQoJCTxPcmdhbmlzYXRpb25zZWluaGVpdGVuSUQ+OTA2ODg3MzwvT3JnYW5pc2F0aW9uc2VpbmhlaXRlbklEPg0KCQk8T3JnYW5pc2F0aW9uc2VpbmhlaXRlbkJFWkVJQ0hOVU5HPkVpbmhlaXRsaWNoZXIgQW5zcHJlY2hwYXJ0bmVyDQoJCQlTY2hsZXN3aWctSG9sc3RlaW48L09yZ2FuaXNhdGlvbnNlaW5oZWl0ZW5CRVpFSUNITlVORz4NCgkJPHN0cmFzc2U+UmV2ZW50bG91YWxsZWU8L3N0cmFzc2U+DQoJCTxoYXVzbnVtbWVyPjY8L2hhdXNudW1tZXI+DQoJCTxwb3N0bGVpdHphaGw+MjQxMDU8L3Bvc3RsZWl0emFobD4NCgkJPG9ydElEPjkwMDY0MDI8L29ydElEPg0KCQk8b3J0PktpZWw8L29ydD4NCgkJPHRlbGVmb25udW1tZXI+KzQ5IDQzMSA5ODgtODY1MDwvdGVsZWZvbm51bW1lcj4NCgkJPHRlbGVmYXhudW1tZXI+KzQ5IDQzMSA5ODgtNjE2MTExMTwvdGVsZWZheG51bW1lcj4NCgkJPGVtYWlsYWRyZXNzZT5pbmZvQGVhLXNoLmRlPC9lbWFpbGFkcmVzc2U+DQoJCTxkZW1haWxhZHJlc3NlPmVhLXBvc3RzdGVsbGVAZWEtc2guZGUtbWFpbC5kZTwvZGVtYWlsYWRyZXNzZT4NCgkJPGtvbnRha3RzeXN0ZW1fa2VubnVuZz5hZm1zaDo5MDY4ODczX0F1c25haG1lTEtXRmFocnZlcmJvdDwva29udGFrdHN5c3RlbV9rZW5udW5nPg0KCQk8a29udGFrdHN5c3RlbV9rZW5udW5nenVzYXR6PmFsbGU8L2tvbnRha3RzeXN0ZW1fa2VubnVuZ3p1c2F0ej4NCgk8L2VtcGZhbmdlbmRlc3RlbGxlPg0KCTxlcmtsYWVydW5nZW4+DQoJCTxjaGVja19nZWJ1ZWhyZW4+dHJ1ZTwvY2hlY2tfZ2VidWVocmVuPg0KCQk8Y2hlY2tfcmljaHRpZ2tlaXQ+dHJ1ZTwvY2hlY2tfcmljaHRpZ2tlaXQ+DQoJCTxjaGVja19kYXRlbnNjaHV0ej50cnVlPC9jaGVja19kYXRlbnNjaHV0ej4NCgkJPGNoZWNrX21pc3NicmF1Y2g+dHJ1ZTwvY2hlY2tfbWlzc2JyYXVjaD4NCgkJPGNoZWNrX2hpbndlaXM+dHJ1ZTwvY2hlY2tfaGlud2Vpcz4NCgkJPGJfZ2VidWVocmVuX2Jlc2NocmlmdHVuZz4qIERpZSBHZXdlcmJlYW5tZWxkdW5nIGlzdCBrb3N0ZW5wZmxpY2h0aWcuDQoJCQlEaWUgSMO2aGUgZGVyIEdlYsO8aHJlbiBiZW1pc3N0IHNpY2ggbmFjaCBkZXIgTGFuZGVzdmVyb3JkbnVuZyDDvGJlcg0KCQkJVmVyd2FsdHVuZ3NnZWLDvGhyZW4gKEFsbGdlbWVpbmVyIEdlYsO8aHJlbnRhcmlmKSBUYXJpZnN0ZWxsZSAxMS4xLjEgLQ0KCQkJVndHZWJWLiBHZW5hdWUgQXVza8O8bmZ0ZSBoaWVyenUgZXJ0ZWlsdCBkYXMgenVzdMOkbmRpZ2UgR2V3ZXJiZWFtdC48L2JfZ2VidWVocmVuX2Jlc2NocmlmdHVuZz4NCgkJPGJfZ2VidWVocmVuX2ludHJvIC8+DQoJCTxiX3JpY2h0aWdrZWl0PiogSWNoIGJlc3TDpHRpZ2UgZGllIFJpY2h0aWdrZWl0IG1laW5lciBBbmdhYmVuLjwvYl9yaWNodGlna2VpdD4NCgkJPGJfZGF0ZW5zY2h1dHo+KiBJY2ggZXJrbMOkcmUgbWljaCBkYW1pdCBlaW52ZXJzdGFuZGVuLCBkYXNzIGRlcg0KCQkJRWluaGVpdGxpY2hlciBBbnNwcmVjaHBhcnRuZXIgU2NobGVzd2lnLUhvbHN0ZWluIHp1ciBFcmbDvGxsdW5nIHNlaW5lcg0KCQkJQXVmZ2FiZW4gbWVpbmUgRGF0ZW4gdW50ZXIgRWluaGFsdHVuZyBkZXIgQmVzdGltbXVuZ2VuIGRlcg0KCQkJRGF0ZW5zY2h1dHotR3J1bmR2ZXJvcmRudW5nIChEUy1HVk8pIHVuZCBkZXMNCgkJCUxhbmRlc2RhdGVuc2NodXR6Z2VzZXR6ZXMgU2NobGVzd2lnLUhvbHN0ZWluIChMRFNHLVNIKSBzcGVpY2hlcnQsDQoJCQl2ZXJhcmJlaXRldCB1bmQgZGllc2UgaW0gUmFobWVuIGRlciBnZXNldHpsaWNoZW4gQmVzdGltbXVuZ2VuIGFuIGRpZQ0KCQkJZsO8ciBkaWUgRW50c2NoZWlkdW5nIHp1c3TDpG5kaWdlIFN0ZWxsZSB3ZWl0ZXJsZWl0ZXQuIEViZW5zbyBiaW4gaWNoDQoJCQltaXQgZGVyIHJlY2h0c2tvbmZvcm1lbiBEYXRlbnZlcmFyYmVpdHVuZyB1bmQgU3BlaWNoZXJ1bmcgZHVyY2ggZGllDQoJCQl6dXN0w6RuZGlnZSBTdGVsbGUgZWludmVyc3RhbmRlbi4gTWlyIGlzdCBiZWthbm50LCBkYXNzIGljaCBkaWUNCgkJCUVpbndpbGxpZ3VuZyBpbiBkaWUgVmVyYXJiZWl0dW5nIHVuZCDDnGJlcm1pdHRsdW5nIGplZGVyemVpdCBnZWdlbsO8YmVyDQoJCQlkZW0gRWluaGVpdGxpY2hlciBBbnNwcmVjaHBhcnRuZXIgU2NobGVzd2lnLUhvbHN0ZWluLCBSZXZlbnRsb3VhbGxlZQ0KCQkJNiwgMjQxMDUgS2llbCB3aWRlcnJ1ZmVuIGthbm4uIEVpbiBXaWRlcnJ1ZiBpc3QgYWJlciBudXIgd2lya3NhbSBmw7xyDQoJCQlkaWUgWnVrdW5mdC4gVmVyYXJiZWl0dW5nZW4sIGRpZSB2b3IgZGVtIFdpZGVycnVmIGVyZm9sZ3Qgc2luZCwgc2luZA0KCQkJZGF2b24gbmljaHQgYmV0cm9mZmVuLiDDnGJlciBkaWUgVmVyYXJiZWl0dW5nIG1laW5lciBwZXJzb25lbmJlem9nZW5lbg0KCQkJRGF0ZW4gdW5kIGRpZSBtaXIgbmFjaCBkZW4gZGF0ZW5zY2h1dHpyZWNodGxpY2hlbiBSZWdlbHVuZ2VuDQoJCQl6dXN0ZWhlbmRlbiBBbnNwcsO8Y2hlIHVuZCBSZWNodGUgaGFiZSBpY2ggdW50ZXIgRGF0ZW5zY2h1dHplcmtsw6RydW5nDQoJCQlLZW5udG5pcyBlcmxhbmd0LjwvYl9kYXRlbnNjaHV0ej4NCgkJPGJfbWlzc2JyYXVjaD4qIE1pciBpc3QgYmVrYW5udCwgZGFzcyB6dXIgVmVyZm9sZ3VuZyB3aWRlcnJlY2h0bGljaGVyDQoJCQlOdXR6dW5nIGRpZSBEYXRlbiBtZWluZXMgenVyIERhdGVuZWluZ2FiZSBnZW51dHp0ZW4gRW5kZ2Vyw6R0ZXMNCgkJCWF1ZmdlemVpY2huZXQgdW5kIHZlcndlbmRldCB3ZXJkZW4ga8O2bm5lbi48L2JfbWlzc2JyYXVjaD4NCgkJPGJfaGlud2Vpc19iZXNjaHJpZnR1bmc+KiBEaWVzZSBBbnplaWdlIGJlcmVjaHRpZ3QgbmljaHQgenVtIEJlZ2lubg0KCQkJZGVzIEdld2VyYmViZXRyaWViZXMsIHdlbm4gbm9jaCBlaW5lIEVybGF1Ym5pcyBvZGVyIGVpbmUgRWludHJhZ3VuZw0KCQkJaW4gZGllIEhhbmR3ZXJrc3JvbGxlIG5vdHdlbmRpZyBpc3QuIFp1d2lkZXJoYW5kbHVuZ2VuIGvDtm5uZW4gbWl0DQoJCQlHZWxkYnXDn2Ugb2RlciBHZWxkc3RyYWZlIG9kZXIgRnJlaWhlaXRzc3RyYWZlIGdlYWhuZGV0IHdlcmRlbi4gRGllc2UNCgkJCUFuemVpZ2UgaXN0IGtlaW5lIEdlbmVobWlndW5nIHp1ciBFcnJpY2h0dW5nIGVpbmVyIEJldHJpZWJzc3TDpHR0ZQ0KCQkJZW50c3ByZWNoZW5kIGRlbSBQbGFudW5ncy0gdW5kIEJhdXJlY2h0LjwvYl9oaW53ZWlzX2Jlc2NocmlmdHVuZz4NCgkJPGJfaGlud2Vpc19pbnRybz5IaW53ZWlzPC9iX2hpbndlaXNfaW50cm8+DQoJCTxwb2xpY3l1cmw+aHR0cDovL3dhZm14cGEwMDIuZHBhb3IuZGUvc2gvZGF0ZW5zY2h1dHovZGF0ZW5zY2h1dHplcmtsYWVydW5nRUFfZGUuZG9jPC9wb2xpY3l1cmw+DQoJPC9lcmtsYWVydW5nZW4+DQoJPGJfdGltZXN0YW1wPjIwMjAxMjAyMTYwMzIzPC9iX3RpbWVzdGFtcD4NCgk8bG9nb3VybD5odHRwOi8vd2FmbXhwYTAwMi5kcGFvci5kZS9zaC9sb2dvcy9rb3BmXzkwNjg4NzMuZG9jPC9sb2dvdXJsPg0KCTxmbT4NCgkJPGFuc3ByZWNocGFydG5lcj4NCgkJCTxmaXJtZW5uYW1lIC8+DQoJCQk8YW5yZWRlPkhlcnI8L2FucmVkZT4NCgkJCTx2b3JuYW1lPk1heDwvdm9ybmFtZT4NCgkJCTxmYW1pbGllbm5hbWU+VGVzdGVybWFubjwvZmFtaWxpZW5uYW1lPg0KCQkJPGFuc2NocmlmdD4NCgkJCQk8c3RyYXNzZT5SZXZlbnRsb3VhbGxlPC9zdHJhc3NlPg0KCQkJCTxoYXVzbnVtbWVyPjY8L2hhdXNudW1tZXI+DQoJCQkJPHBvc3RmYWNoIC8+DQoJCQkJPHBvc3RsZWl0emFobD4yNDEwNTwvcG9zdGxlaXR6YWhsPg0KCQkJCTxvcnQ+S2llbDwvb3J0Pg0KCQkJCTxvcnRzdGVpbCAvPg0KCQkJCTx6dXNhdHogLz4NCgkJCQk8c3RhYXQ+RGV1dHNjaGxhbmQ8L3N0YWF0Pg0KCQkJPC9hbnNjaHJpZnQ+DQoJCQk8a29udGFrdD4NCgkJCQk8dGVsZWZvbm51bW1lcj4wNDMxIDEyMzwvdGVsZWZvbm51bW1lcj4NCgkJCQk8bW9iaWxudW1tZXIgLz4NCgkJCQk8dGVsZWZheG51bW1lcj4rIDQ5IDQ2MjEgOTY1NDwvdGVsZWZheG51bW1lcj4NCgkJCQk8ZW1haWxhZHJlc3NlPm1heC50ZXN0ZXJtYW5uQGdteC5kZTwvZW1haWxhZHJlc3NlPg0KCQkJCTxkZW1haWxhZHJlc3NlPm1heC50ZXN0ZXJtYW5uQGdteC5kZS1tYWlsLmRlPC9kZW1haWxhZHJlc3NlPg0KCQkJPC9rb250YWt0Pg0KCQk8L2Fuc3ByZWNocGFydG5lcj4NCgkJPHZlcndhbHR1bmdzbGVpc3R1bmdlbj4NCgkJCTx2ZXJ3YWx0dW5nc2xlaXN0dW5nPg0KCQkJCTxhdXNnZXdhZWhsdGVfenVzdGFlbmRpZ2VzdGVsbGU+DQoJCQkJCTxPcmdhbmlzYXRpb25zZWluaGVpdGVuSUQ+OTA4MTk5NDwvT3JnYW5pc2F0aW9uc2VpbmhlaXRlbklEPg0KCQkJCQk8T3JnYW5pc2F0aW9uc2VpbmhlaXRlbkJFWkVJQ0hOVU5HPkxhbmRlc2hhdXB0c3RhZHQgS2llbCAtIELDvHJnZXItDQoJCQkJCQl1bmQgT3JkbnVuZ3NhbXQsIEdld2VyYmVtZWxkZXN0ZWxsZTwvT3JnYW5pc2F0aW9uc2VpbmhlaXRlbkJFWkVJQ0hOVU5HPg0KCQkJCTwvYXVzZ2V3YWVobHRlX3p1c3RhZW5kaWdlc3RlbGxlPg0KCQkJCTxHZWJpZXRJRD45MDA2NDAyPC9HZWJpZXRJRD4NCgkJCQk8R2ViaWV0QkVaRUlDSE5VTkc+S2llbDwvR2ViaWV0QkVaRUlDSE5VTkc+DQoJCQkJPEFubGllZ2VuSUQ+ODkzODYzNDwvQW5saWVnZW5JRD4NCgkJCQk8QW5saWVnZW5CRVpFSUNITlVORz5HZXdlcmJlYW5tZWxkdW5nLCBFbGVrdHJvbmlzY2hlIEdld2VyYmVhbnplaWdlPC9BbmxpZWdlbkJFWkVJQ0hOVU5HPg0KCQkJCTxsZWlrYUtFWUxJU1Q+OTkwNTAwMTIxMDQwMDA8L2xlaWthS0VZTElTVD4NCgkJCQk8bGVpa2FCRVpFSUNITlVORyAvPg0KCQkJPC92ZXJ3YWx0dW5nc2xlaXN0dW5nPg0KCQk8L3ZlcndhbHR1bmdzbGVpc3R1bmdlbj4NCgk8L2ZtPg0KPC9teUZvcm0+</content> - <contentType>text/xml</contentType> - <id>myForm-xml</id> - <name>XML-Daten.xml</name> - </attachments> - <caller /> - <client>sh-dev</client> - <clientId>sh-dev</clientId> - <customer>Kiel</customer> - <customerId>Kiel</customerId> - <form>SimpleFormSendetAnHomeServer</form> - <formId>SimpleFormSendetAnHomeServer</formId> - <id>20210415307020414701</id> - <primaryDataAttachmentId>myForm-xml</primaryDataAttachmentId> - <sender>intelliform.by.kop-cloud.de</sender> - <timestamp>2021-04-15T08:33:39.443Z</timestamp> - <username /> - </data> - </ns2:deposit> - </soap:Body> -</soap:Envelope> \ No newline at end of file diff --git a/intelliform-adapter/src/main/scripts/vorgang-Waffenschein.xml b/intelliform-adapter/src/main/scripts/vorgang-Waffenschein.xml deleted file mode 100644 index 3259751f7e9ada064cd22dd82dbb70773490b97e..0000000000000000000000000000000000000000 --- a/intelliform-adapter/src/main/scripts/vorgang-Waffenschein.xml +++ /dev/null @@ -1,50 +0,0 @@ -<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> - <soap:Body> - <ns2:deposit xmlns:ns2="http://xmlns.cit.de/intelliform/2009/webservices/backend"> - <data> - <attachments> - <attributes> - <key>X-IntelliForm-Signed</key> - <value>false</value> - </attributes> - <content>PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPG15Rm9ybSB4bWxuczpwZGY9Imh0dHA6Ly94bWxucy5jaXQuZGUvYXNzaXN0YW50cy9wZGYiCiAgICB4bWxuczp0PSJodHRwOi8veG1sbnMuY2l0LmRlL2ludGVsbGlmb3JtL3RyYW5zYWN0aW9uIgogICAgdDppZD0iMjAyMDExMTgzNjU2NzA4NjYxMDEiIHQ6dGltZXN0YW1wPSIyMDIwLTExLTE4VDA5OjA5OjI3LjYyN1oiCiAgICB0OnNlbmRlcj0iYWZtLnNjaGxlc3dpZy1ob2xzdGVpbi5kZSIKICAgIHQ6Zm9ybT0iS2xlaW5lciBXYWZmZW5zY2hlaW4gZ2VtLiDCpyAxMCBBYnMuIDQgU2F0eiA0IFdhZmZlbmdlc2V0eiAoV2FmZkcpIgogICAgdDpmb3JtLWlkPSJ3YWZmZW4va2xlaW5lcldhZmZlbnNjaGVpbiIKICAgIHQ6Y3VzdG9tZXI9IkVpbmhlaXRsaWNoZXIgQW5zcHJlY2hwYXJ0bmVyIiB0OmN1c3RvbWVyLWlkPSJlYS1zaCIKICAgIHQ6Y2xpZW50PSJTY2hsZXN3aWctSG9sc3RlaW4iIHQ6Y2xpZW50LWlkPSJsYW5kIj4KICAgIDxrb250YWt0c3lzdGVtdHlwaWQ+MjMzMDM0NjAwPC9rb250YWt0c3lzdGVtdHlwaWQ+CiAgICA8a29udGFrdHN5c3RlbXR5cGlkbG4+MjMzMDM0NjAxPC9rb250YWt0c3lzdGVtdHlwaWRsbj4KICAgIDxBbmxpZWdlbklEPjg5NjY2NzE8L0FubGllZ2VuSUQ+CiAgICA8bWFpbGJveGd1aWQ+Zjk3NzM2OGItNjk5MS00NmI5LWFmMTgtOGEyYTAzZDlhZDFiPC9tYWlsYm94Z3VpZD4KICAgIDxhbnRyYWdzdGVsbGVyPgogICAgICAgIDxwZXJzX2FucmVkZT5IZXJyJDAzPC9wZXJzX2FucmVkZT4KICAgICAgICA8cGVyc19uYWNobmFtZT5UZXN0ZXJtYW5uPC9wZXJzX25hY2huYW1lPgogICAgICAgIDxwZXJzX3Zvcm5hbWU+TWF4PC9wZXJzX3Zvcm5hbWU+CiAgICAgICAgPHBlcnNfZ2VidXJ0c25hbWU+TWF4IFRlc3Rlcm1hbm48L3BlcnNfZ2VidXJ0c25hbWU+CiAgICAgICAgPHBlcnNfZ2VidXJ0c2RhdHVtPjE5OTUtMDMtMjE8L3BlcnNfZ2VidXJ0c2RhdHVtPgogICAgICAgIDxwZXJzX2dlYnVydHNvcnQ+RmxlbnNidXJnPC9wZXJzX2dlYnVydHNvcnQ+CiAgICAgICAgPHBlcnNfZ2VidXJ0c2xhbmQ+ZGV1dHNjaCREZXV0c2NobGFuZCQwMDA8L3BlcnNfZ2VidXJ0c2xhbmQ+CiAgICAgICAgPHBlcnNfc3RhYXRzYW5nZWhvZXJpZ2tlaXQ+ZGV1dHNjaCREZXV0c2NobGFuZCQwMDA8L3BlcnNfc3RhYXRzYW5nZWhvZXJpZ2tlaXQ+CiAgICAgICAgPGJfYW5yZWRlPkhlcnI8L2JfYW5yZWRlPgogICAgICAgIDxiX2FucmVkZV9zY2hsdWVzc2VsbnI+MDM8L2JfYW5yZWRlX3NjaGx1ZXNzZWxucj4KICAgICAgICA8Yl9nZWJ1cnRzbGFuZD5EZXV0c2NobGFuZDwvYl9nZWJ1cnRzbGFuZD4KICAgICAgICA8Yl9nZWJ1cnRzbGFuZF9zaWduYXR1cj4wMDA8L2JfZ2VidXJ0c2xhbmRfc2lnbmF0dXI+CiAgICAgICAgPGJfc3RhYXRzYW5nZWhvZXJpZ2tlaXQ+ZGV1dHNjaDwvYl9zdGFhdHNhbmdlaG9lcmlna2VpdD4KICAgICAgICA8Yl9zdGFhdHNhbmdlaG9lcmlna2VpdF9zaWduYXR1cj4wMDA8L2Jfc3RhYXRzYW5nZWhvZXJpZ2tlaXRfc2lnbmF0dXI+CiAgICAgICAgPHNoX3N0cmFzc2U+S8O2bmlnc3dlZzwvc2hfc3RyYXNzZT4KICAgICAgICA8c2hfaGF1c251bW1lcj43NDwvc2hfaGF1c251bW1lcj4KICAgICAgICA8c2hfcGx6PjI0ODM3PC9zaF9wbHo+CiAgICAgICAgPG9ydF9hdXN3YWhsPjkwMDczMTQkMDEwNTkwNzU8L29ydF9hdXN3YWhsPgogICAgICAgIDxvcnQ+U2NobGVzd2lnPC9vcnQ+CiAgICAgICAgPEdlYmlldElEPjkwMDczMTQ8L0dlYmlldElEPgogICAgICAgIDxHZWJpZXRCRVpFSUNITlVORz5TY2hsZXN3aWc8L0dlYmlldEJFWkVJQ0hOVU5HPgogICAgICAgIDxHZWJpZXRHTlI5NF9HTlI+MDEwNTkwNzU8L0dlYmlldEdOUjk0X0dOUj4KICAgICAgICA8c3RhYXQ+MDAwPC9zdGFhdD4KICAgICAgICA8aXNvMzE2Nm51bWVyaXNjaD4yNzY8L2lzbzMxNjZudW1lcmlzY2g+CiAgICAgICAgPGtvbnRfdGVsZWZvbm51bW1lcj4rIDQ5IDQ2MjEgOTY1NDwva29udF90ZWxlZm9ubnVtbWVyPgogICAgICAgIDxrb250X21vYmlsbnVtbWVyPis0OSAxMjM8L2tvbnRfbW9iaWxudW1tZXI+CiAgICAgICAgPGtvbnRfdGVsZWZheG51bW1lcj4rIDQ5IDQ2MjEgOTY1NDwva29udF90ZWxlZmF4bnVtbWVyPgogICAgICAgIDxrb250X2VtYWlsPm1heC50ZXN0ZXJtYW5uQGdteC5kZTwva29udF9lbWFpbD4KICAgICAgICA8a29udF9kZW1haWw+bWF4LnRlc3Rlcm1hbm5AZ214LmRlLW1haWwuZGU8L2tvbnRfZGVtYWlsPgogICAgICAgIDxwZXJzb2VubGljaGVFaWdudW5nPgogICAgICAgICAgICA8bWFlbmdlbHZvcmhhbmRlbj5mYWxzZTwvbWFlbmdlbHZvcmhhbmRlbj4KICAgICAgICAgICAgPGVybWl0dGx1bmdzdmVyZmFocmVuPmZhbHNlPC9lcm1pdHRsdW5nc3ZlcmZhaHJlbj4KICAgICAgICAgICAgPE1pdGdsaWVkc2NoYWZ0SW5WZXJib3Rlcm5lclZlcmVpbmlndW5nPmZhbHNlPC9NaXRnbGllZHNjaGFmdEluVmVyYm90ZXJuZXJWZXJlaW5pZ3VuZz4KICAgICAgICA8L3BlcnNvZW5saWNoZUVpZ251bmc+CiAgICA8L2FudHJhZ3N0ZWxsZXI+CiAgICA8R2ViaWV0SUQ+OTAwNzMxNDwvR2ViaWV0SUQ+CiAgICA8enVzdGFlbmRpZ2VzdGVsbGU+CiAgICAgICAgPE9yZ2FuaXNhdGlvbnNlaW5oZWl0ZW5BdXN3YWhsPjkwMzAyMjk8L09yZ2FuaXNhdGlvbnNlaW5oZWl0ZW5BdXN3YWhsPgogICAgICAgIDxPcmdhbmlzYXRpb25zZWluaGVpdGVuSUQ+OTAzMDIyOTwvT3JnYW5pc2F0aW9uc2VpbmhlaXRlbklEPgogICAgICAgIDxPcmdhbmlzYXRpb25zZWluaGVpdGVuQkVaRUlDSE5VTkc+TGFuZGVzaGF1cHRzdGFkdCBLaWVsIC0gQsO8cmdlci0gdW5kCgkJCU9yZG51bmdzYW10LCBHZXdlcmJlbWVsZGVzdGVsbGU8L09yZ2FuaXNhdGlvbnNlaW5oZWl0ZW5CRVpFSUNITlVORz4KICAgICAgICA8c3RyYXNzZT5GbGVuc2J1cmdlciBTdHJhw59lPC9zdHJhc3NlPgogICAgICAgIDxoYXVzbnVtbWVyPjc8L2hhdXNudW1tZXI+CiAgICAgICAgPHBvc3RsZWl0emFobD4yNDgzNzwvcG9zdGxlaXR6YWhsPgogICAgICAgIDxvcnRJRD45MDA3MzE0PC9vcnRJRD4KICAgICAgICA8b3J0PlNjaGxlc3dpZzwvb3J0PgogICAgICAgIDx0ZWxlZm9ubnVtbWVyPjA0NjIxIDg3LTA8L3RlbGVmb25udW1tZXI+CiAgICAgICAgPHRlbGVmYXhudW1tZXI+MDQ2MjEgODctMzY2PC90ZWxlZmF4bnVtbWVyPgogICAgICAgIDxlbWFpbGFkcmVzc2U+R2VmYWhyZW5hYndlaHJAS2llbC5kZTwvZW1haWxhZHJlc3NlPgogICAgICAgIDxkZW1haWxhZHJlc3NlIC8+CiAgICAgICAgPGtvbnRha3RzeXN0ZW1fa2VubnVuZz5hZm1zaDo5NTM1NjY5X2tsZWluZXJXYWZmZW5zY2hlaW48L2tvbnRha3RzeXN0ZW1fa2VubnVuZz4KICAgICAgICA8a29udGFrdHN5c3RlbV9rZW5udW5nenVzYXR6IC8+CiAgICAgICAgPEFubGllZ2VuQkVaRUlDSE5VTkc+V2FmZmVuc2NoZWluIC8gS2xlaW5lciBXYWZmZW5zY2hlaW48L0FubGllZ2VuQkVaRUlDSE5VTkc+CiAgICAgICAgPGxlaWthS0VZTElTVD45OTA4OTAwODAwMDAwMDs5OTA4OTAwODAwMTAwMDwvbGVpa2FLRVlMSVNUPgogICAgICAgIDxhdXN3YWhsX3p1c3RlbGx1bmc+YWJob2xlbjwvYXVzd2FobF96dXN0ZWxsdW5nPgogICAgICAgIDxiX3p1c3RlbGx1bmc+SWNoIGhvbGUgZGVuIEtsZWluZW4gV2FmZmVuc2NoZWluIHNlbGJzdCBhYi48L2JfenVzdGVsbHVuZz4KICAgIDwvenVzdGFlbmRpZ2VzdGVsbGU+CiAgICA8ZW1wZmFuZ2VuZGVzdGVsbGU+CiAgICAgICAgPE9yZ2FuaXNhdGlvbnNlaW5oZWl0ZW5BdXN3YWhsPjkwNjg4NzM8L09yZ2FuaXNhdGlvbnNlaW5oZWl0ZW5BdXN3YWhsPgogICAgICAgIDxPcmdhbmlzYXRpb25zZWluaGVpdGVuSUQ+OTA2ODg3MzwvT3JnYW5pc2F0aW9uc2VpbmhlaXRlbklEPgogICAgICAgIDxPcmdhbmlzYXRpb25zZWluaGVpdGVuQkVaRUlDSE5VTkc+RWluaGVpdGxpY2hlciBBbnNwcmVjaHBhcnRuZXIKICAgICAgICAgICAgU2NobGVzd2lnLUhvbHN0ZWluPC9PcmdhbmlzYXRpb25zZWluaGVpdGVuQkVaRUlDSE5VTkc+CiAgICAgICAgPHN0cmFzc2U+UmV2ZW50bG91YWxsZWU8L3N0cmFzc2U+CiAgICAgICAgPGhhdXNudW1tZXI+NjwvaGF1c251bW1lcj4KICAgICAgICA8cG9zdGxlaXR6YWhsPjI0MTA1PC9wb3N0bGVpdHphaGw+CiAgICAgICAgPG9ydElEPjkwMDY0MDI8L29ydElEPgogICAgICAgIDxvcnQ+S2llbDwvb3J0PgogICAgICAgIDx0ZWxlZm9ubnVtbWVyPis0OSA0MzEgOTg4LTg2NTA8L3RlbGVmb25udW1tZXI+CiAgICAgICAgPHRlbGVmYXhudW1tZXI+KzQ5IDQzMSA5ODgtNjE2MTExMTwvdGVsZWZheG51bW1lcj4KICAgICAgICA8ZW1haWxhZHJlc3NlPmluZm9AZWEtc2guZGU8L2VtYWlsYWRyZXNzZT4KICAgICAgICA8ZGVtYWlsYWRyZXNzZT5lYS1wb3N0c3RlbGxlQGVhLXNoLmRlLW1haWwuZGU8L2RlbWFpbGFkcmVzc2U+CiAgICAgICAgPGtvbnRha3RzeXN0ZW1fa2VubnVuZz5hZm1zaDo5MDY4ODczX0F1c25haG1lTEtXRmFocnZlcmJvdDwva29udGFrdHN5c3RlbV9rZW5udW5nPgogICAgICAgIDxrb250YWt0c3lzdGVtX2tlbm51bmd6dXNhdHo+YWxsZTwva29udGFrdHN5c3RlbV9rZW5udW5nenVzYXR6PgogICAgPC9lbXBmYW5nZW5kZXN0ZWxsZT4KICAgIDxlcmtsYWVydW5nZW4+CiAgICAgICAgPGNoZWNrX2dlYnVlaHJlbj50cnVlPC9jaGVja19nZWJ1ZWhyZW4+CiAgICAgICAgPGNoZWNrX3JpY2h0aWdrZWl0PnRydWU8L2NoZWNrX3JpY2h0aWdrZWl0PgogICAgICAgIDxjaGVja19kYXRlbnNjaHV0ej50cnVlPC9jaGVja19kYXRlbnNjaHV0ej4KICAgICAgICA8Y2hlY2tfbWlzc2JyYXVjaD50cnVlPC9jaGVja19taXNzYnJhdWNoPgogICAgICAgIDxiX2dlYnVlaHJlbl9iZXNjaHJpZnR1bmc+KiBNaXIgaXN0IGJla2FubnQsIGRhc3MgZHVyY2ggZGFzIEVpbnJlaWNoZW4KICAgICAgICAgICAgZGVzIGVsZWt0cm9uaXNjaGVuIEFudHJhZ2VzIHZvbiBkZXIgenVzdMOkbmRpZ2VuIFN0ZWxsZSBHZWLDvGhyZW4KICAgICAgICAgICAgZXJob2JlbiB3ZXJkZW4ga8O2bm5lbi48L2JfZ2VidWVocmVuX2Jlc2NocmlmdHVuZz4KICAgICAgICA8Yl9nZWJ1ZWhyZW5faW50cm8+R2Viw7xociBiZWkgQXVzc3RlbGx1bmcgZGVzIGtsZWluZW4gV2FmZmVuc2NoZWluczoKICAgICAgICAgICAgNjAsMDAgRXVyby4gQmVhcmJlaXR1bmdzZ2Viw7xociBiZWkgVmVyc2FndW5nOiA0NSwwMCBFdXJvLgogICAgICAgICAgICBTaWUgc2luZCBnZW3DpMOfIMKnIDM5IFdhZmZHIHZlcnBmbGljaHRldCwgZGVyIHp1c3TDpG5kaWdlbiBCZWjDtnJkZSBkaWUgenVyCiAgICAgICAgICAgIER1cmNoZsO8aHJ1bmcgZGVzIEdlc2V0emVzIGVyZm9yZGVybGljaGVuIEF1c2vDvG5mdGUgenUgZXJ0ZWlsZW4uIFp1cgogICAgICAgICAgICBQcsO8ZnVuZyBJaHJlciB3YWZmZW5yZWNodGxpY2hlbiBadXZlcmzDpHNzaWdrZWl0IHVuZCBFaWdudW5nIGhvbHQgZGllCiAgICAgICAgICAgIEJlaMO2cmRlIGVpbmUgdW5iZXNjaHLDpG5rdGUgQXVza3VuZnQgYXVzIGRlbSBCdW5kZXN6ZW50cmFscmVnaXN0ZXIsCiAgICAgICAgICAgIGVpbmUgQXVza3VuZnQgYXVzIGRlbSB6ZW50cmFsZW4gc3RhYXRzYW53YWx0c2NoYWZ0bGljaGVuCiAgICAgICAgICAgIFZlcmZhaHJlbnNyZWdpc3RlciwgZWluZSBTdGVsbHVuZ25haG1lIGRlciDDtnJ0bGljaGVuCiAgICAgICAgICAgIFBvbGl6ZWlkaWVuc3RzdGVsbGUgdW5kIElocmVyIFdvaG5zaXR6Z2VtZWluZGUgZWluLjwvYl9nZWJ1ZWhyZW5faW50cm8+CiAgICAgICAgPGJfcmljaHRpZ2tlaXQ+KiBJY2ggYmVzdMOkdGlnZSBkaWUgUmljaHRpZ2tlaXQgbWVpbmVyIEFuZ2FiZW4uPC9iX3JpY2h0aWdrZWl0PgogICAgICAgIDxiX2RhdGVuc2NodXR6PiogSWNoIGVya2zDpHJlIG1pY2ggZGFtaXQgZWludmVyc3RhbmRlbiwgZGFzcyBkZXIKICAgICAgICAgICAgRWluaGVpdGxpY2hlciBBbnNwcmVjaHBhcnRuZXIgU2NobGVzd2lnLUhvbHN0ZWluIHp1ciBFcmbDvGxsdW5nIHNlaW5lcgogICAgICAgICAgICBBdWZnYWJlbiBtZWluZSBEYXRlbiB1bnRlciBFaW5oYWx0dW5nIGRlciBCZXN0aW1tdW5nZW4gZGVyCiAgICAgICAgICAgIERhdGVuc2NodXR6LUdydW5kdmVyb3JkbnVuZyAoRFMtR1ZPKSB1bmQgZGVzCiAgICAgICAgICAgIExhbmRlc2RhdGVuc2NodXR6Z2VzZXR6ZXMgU2NobGVzd2lnLUhvbHN0ZWluIChMRFNHLVNIKSBzcGVpY2hlcnQsCiAgICAgICAgICAgIHZlcmFyYmVpdGV0IHVuZCBkaWVzZSBpbSBSYWhtZW4gZGVyIGdlc2V0emxpY2hlbiBCZXN0aW1tdW5nZW4gYW4gZGllCiAgICAgICAgICAgIGbDvHIgZGllIEVudHNjaGVpZHVuZyB6dXN0w6RuZGlnZSBTdGVsbGUgd2VpdGVybGVpdGV0LiBFYmVuc28gYmluIGljaAogICAgICAgICAgICBtaXQgZGVyIHJlY2h0c2tvbmZvcm1lbiBEYXRlbnZlcmFyYmVpdHVuZyB1bmQgU3BlaWNoZXJ1bmcgZHVyY2ggZGllCiAgICAgICAgICAgIHp1c3TDpG5kaWdlIFN0ZWxsZSBlaW52ZXJzdGFuZGVuLiBNaXIgaXN0IGJla2FubnQsIGRhc3MgaWNoIGRpZQogICAgICAgICAgICBFaW53aWxsaWd1bmcgaW4gZGllIFZlcmFyYmVpdHVuZyB1bmQgw5xiZXJtaXR0bHVuZyBqZWRlcnplaXQgZ2VnZW7DvGJlcgogICAgICAgICAgICBkZW0gRWluaGVpdGxpY2hlciBBbnNwcmVjaHBhcnRuZXIgU2NobGVzd2lnLUhvbHN0ZWluLCBSZXZlbnRsb3VhbGxlZQogICAgICAgICAgICA2LCAyNDEwNSBLaWVsIHdpZGVycnVmZW4ga2Fubi4gRWluIFdpZGVycnVmIGlzdCBhYmVyIG51ciB3aXJrc2FtIGbDvHIKICAgICAgICAgICAgZGllIFp1a3VuZnQuIFZlcmFyYmVpdHVuZ2VuLCBkaWUgdm9yIGRlbSBXaWRlcnJ1ZiBlcmZvbGd0IHNpbmQsIHNpbmQKICAgICAgICAgICAgZGF2b24gbmljaHQgYmV0cm9mZmVuLiDDnGJlciBkaWUgVmVyYXJiZWl0dW5nIG1laW5lciBwZXJzb25lbmJlem9nZW5lbgogICAgICAgICAgICBEYXRlbiB1bmQgZGllIG1pciBuYWNoIGRlbiBkYXRlbnNjaHV0enJlY2h0bGljaGVuIFJlZ2VsdW5nZW4KICAgICAgICAgICAgenVzdGVoZW5kZW4gQW5zcHLDvGNoZSB1bmQgUmVjaHRlIGhhYmUgaWNoIHVudGVyIERhdGVuc2NodXR6ZXJrbMOkcnVuZwogICAgICAgICAgICBLZW5udG5pcyBlcmxhbmd0LjwvYl9kYXRlbnNjaHV0ej4KICAgICAgICA8Yl9taXNzYnJhdWNoPiogTWlyIGlzdCBiZWthbm50LCBkYXNzIHp1ciBWZXJmb2xndW5nIHdpZGVycmVjaHRsaWNoZXIKICAgICAgICAgICAgTnV0enVuZyBkaWUgRGF0ZW4gbWVpbmVzIHp1ciBEYXRlbmVpbmdhYmUgZ2VudXR6dGVuIEVuZGdlcsOkdGVzCiAgICAgICAgICAgIGF1ZmdlemVpY2huZXQgdW5kIHZlcndlbmRldCB3ZXJkZW4ga8O2bm5lbi48L2JfbWlzc2JyYXVjaD4KICAgICAgICA8cG9saWN5dXJsPmh0dHA6Ly93YWZteHBhMDAyLmRwYW9yLmRlL3NoL2RhdGVuc2NodXR6L2RhdGVuc2NodXR6ZXJrbGFlcnVuZ0VBX2RlLmRvYzwvcG9saWN5dXJsPgogICAgPC9lcmtsYWVydW5nZW4+CiAgICA8bG9nb3VybD5odHRwOi8vd2FmbXhwYTAwMi5kcGFvci5kZS9zaC9sb2dvcy9rb3BmXzkwNjg4NzMuZG9jPC9sb2dvdXJsPgogICAgPGZtPgogICAgICAgIDxhbnNwcmVjaHBhcnRuZXI+CiAgICAgICAgICAgIDxmaXJtZW5uYW1lIC8+CiAgICAgICAgICAgIDxhbnJlZGU+SGVycjwvYW5yZWRlPgogICAgICAgICAgICA8dm9ybmFtZT5NYXg8L3Zvcm5hbWU+CiAgICAgICAgICAgIDxmYW1pbGllbm5hbWU+VGVzdGVybWFubjwvZmFtaWxpZW5uYW1lPgogICAgICAgICAgICA8YW5zY2hyaWZ0PgogICAgICAgICAgICAgICAgPHN0cmFzc2U+S8O2bmlnc3dlZzwvc3RyYXNzZT4KICAgICAgICAgICAgICAgIDxoYXVzbnVtbWVyPjc0PC9oYXVzbnVtbWVyPgogICAgICAgICAgICAgICAgPHBvc3RmYWNoIC8+CiAgICAgICAgICAgICAgICA8cG9zdGxlaXR6YWhsPjI0ODM3PC9wb3N0bGVpdHphaGw+CiAgICAgICAgICAgICAgICA8b3J0PlNjaGxlc3dpZzwvb3J0PgogICAgICAgICAgICAgICAgPG9ydHN0ZWlsIC8+CiAgICAgICAgICAgICAgICA8enVzYXR6IC8+CiAgICAgICAgICAgICAgICA8c3RhYXQ+RGV1dHNjaGxhbmQ8L3N0YWF0PgogICAgICAgICAgICA8L2Fuc2NocmlmdD4KICAgICAgICAgICAgPGtvbnRha3Q+CiAgICAgICAgICAgICAgICA8dGVsZWZvbm51bW1lcj4rIDQ5IDQ2MjEgOTY1NDwvdGVsZWZvbm51bW1lcj4KICAgICAgICAgICAgICAgIDxtb2JpbG51bW1lcj4rNDkgMTIzPC9tb2JpbG51bW1lcj4KICAgICAgICAgICAgICAgIDx0ZWxlZmF4bnVtbWVyPisgNDkgNDYyMSA5NjU0PC90ZWxlZmF4bnVtbWVyPgogICAgICAgICAgICAgICAgPGVtYWlsYWRyZXNzZT5tYXgudGVzdGVybWFubkBnbXguZGU8L2VtYWlsYWRyZXNzZT4KICAgICAgICAgICAgICAgIDxkZW1haWxhZHJlc3NlPm1heC50ZXN0ZXJtYW5uQGdteC5kZS1tYWlsLmRlPC9kZW1haWxhZHJlc3NlPgogICAgICAgICAgICA8L2tvbnRha3Q+CiAgICAgICAgPC9hbnNwcmVjaHBhcnRuZXI+CiAgICAgICAgPHZlcndhbHR1bmdzbGVpc3R1bmdlbj4KICAgICAgICAgICAgPHZlcndhbHR1bmdzbGVpc3R1bmc+CiAgICAgICAgICAgICAgICA8YXVzZ2V3YWVobHRlX3p1c3RhZW5kaWdlc3RlbGxlPgogICAgICAgICAgICAgICAgICAgIDxPcmdhbmlzYXRpb25zZWluaGVpdGVuSUQ+OTUzNTY2OTwvT3JnYW5pc2F0aW9uc2VpbmhlaXRlbklEPgogICAgICAgICAgICAgICAgICAgIDxPcmdhbmlzYXRpb25zZWluaGVpdGVuQkVaRUlDSE5VTkc+S3JlaXMKICAgICAgICAgICAgICAgICAgICAgICAgU2NobGVzd2lnLUZsZW5zYnVyZy9LcmVpc3ZlcndhbHR1bmcgLSBBbGxnZW1laW5lCiAgICAgICAgICAgICAgICAgICAgICAgIE9yZG51bmdzYW5nZWxlZ2VuaGVpdGVuPC9PcmdhbmlzYXRpb25zZWluaGVpdGVuQkVaRUlDSE5VTkc+CiAgICAgICAgICAgICAgICA8L2F1c2dld2FlaGx0ZV96dXN0YWVuZGlnZXN0ZWxsZT4KICAgICAgICAgICAgICAgIDxHZWJpZXRJRD45MDA3MzE0PC9HZWJpZXRJRD4KICAgICAgICAgICAgICAgIDxHZWJpZXRCRVpFSUNITlVORz5TY2hsZXN3aWc8L0dlYmlldEJFWkVJQ0hOVU5HPgogICAgICAgICAgICAgICAgPEFubGllZ2VuSUQ+ODk2NjY3MTwvQW5saWVnZW5JRD4KICAgICAgICAgICAgICAgIDxBbmxpZWdlbkJFWkVJQ0hOVU5HPldhZmZlbnNjaGVpbiAvIEtsZWluZXIgV2FmZmVuc2NoZWluPC9BbmxpZWdlbkJFWkVJQ0hOVU5HPgogICAgICAgICAgICAgICAgPGxlaWthS0VZTElTVD45OTA4OTAwODAwMDAwMDs5OTA4OTAwODAwMTAwMDwvbGVpa2FLRVlMSVNUPgogICAgICAgICAgICAgICAgPGxlaWthQkVaRUlDSE5VTkcgLz4KICAgICAgICAgICAgPC92ZXJ3YWx0dW5nc2xlaXN0dW5nPgogICAgICAgIDwvdmVyd2FsdHVuZ3NsZWlzdHVuZ2VuPgogICAgPC9mbT4KPC9teUZvcm0+</content> - <contentType>text/xml</contentType> - <id>myForm-xml</id> - <name>XML-Daten.xml</name> - </attachments> - <attachments> - <attributes> - <key>X-IntelliForm-Signed</key> - <value>false</value> - </attributes> - <content>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</content> - <contentType>image/jpeg</contentType> - <id>assistants.E0FBA361C191F8B723949467AE302BEA24E4745E</id> - <name>Helge1.jpg</name> - </attachments> - <attachments> - <attributes> - <key>X-IntelliForm-Signed</key> - <value>false</value> - </attributes> - <content>UEsDBBQAAAgAACxEj1JexjIMJwAAACcAAAAIAAAAbWltZXR5cGVhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnRleHRQSwMEFAAACAAALESPUgYCUOZqAQAAagEAABgAAABUaHVtYm5haWxzL3RodW1ibmFpbC5wbmeJUE5HDQoaCgAAAA1JSERSAAAAtQAAAQAIAwAAAML9x+kAAAA8UExURYyQkJCTlZ6fo6qknrm2tri6vMW2qsrGv8rQ1d/Uytvm79vq9ezn5O/0+fDq5fT3+vj39////wAAAP///81aQL0AAADpSURBVHja7dK5DYAwEADB4zU2j6H/ZskpAOmk2Qom2HgyFtTU1NTU1NTU1NTU1J+us99Hz6ZexyGmPZu6LluZm6+pqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqan/6AXwWwUaPv4WoAAAAABJRU5ErkJgglBLAwQUAAgICAAsRI9SAAAAAAAAAAAAAAAACwAAAGNvbnRlbnQueG1spVddb9s2FH3vrxA0YG8M7bgDEi12H1oU2JoURZ0Be2UoSiYmiRpJWfa/3yVp0ZRjOVz8Ilu851zeb1IPn3Z1lWyZVFw0y3R+M0sT1lCR86Zcpn89f0V36afVhwdRFJyyLBe0q1mjERWNht8E2I3KnHSZdrLJBFFcZQ2pmco0zUTLmoGVhejM7uVWlN5X0XQLDtma7XQs2WBHXPISv7MFh+xckj6WbLAQ1JBeiFjyTlWoEBD1uiWan1ixq3jzzzLdaN1mGPd9f9MvboQs8fz+/h5bqTeYelzbycqicopZxcxmCs9v5njA1kyTWPsMNjSp6eoXJqNDQzR5lVW1LaMrYltOhIZuiIyuDQsep3eRx6d3kYfcmujNRE7u8BMI7ePp8VgLso7dy2BHoaKSt9FuOnTIF0J4Uw3BNag193Y2+4jde4DuL8J7yTWTAZxehFNSUR9xUZ8LGuDmGBCIbU2Z+sI3gVAThFvsxB6s8knV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</content> - <contentType>application/vnd.oasis.opendocument.text</contentType> - <id>assistants.52D79E5B2118D1740045AB87151535DCAD24E9A7</id> - <name>Helgetext2.odt</name> - </attachments> - <caller /> - <client>sh-dev</client> - <clientId>sh-dev</clientId> - <customer>Kiel</customer> - <customerId>Kiel</customerId> - <form>SimpleFormSendetAnHomeServer</form> - <formId>SimpleFormSendetAnHomeServer</formId> - <id>20210415307020414701</id> - <primaryDataAttachmentId>myForm-xml</primaryDataAttachmentId> - <sender>intelliform.by.kop-cloud.de</sender> - <timestamp>2021-04-15T08:33:39.443Z</timestamp> - <username /> - </data> - </ns2:deposit> - </soap:Body> -</soap:Envelope> \ No newline at end of file diff --git a/intelliform-adapter/src/main/scripts/vorgang-Wahlhelferin.xml b/intelliform-adapter/src/main/scripts/vorgang-Wahlhelferin.xml deleted file mode 100644 index aad271e9026b144522736beaf0e7623b5890b4e3..0000000000000000000000000000000000000000 --- a/intelliform-adapter/src/main/scripts/vorgang-Wahlhelferin.xml +++ /dev/null @@ -1,59 +0,0 @@ -<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> - <soap:Body> - <ns2:deposit xmlns:ns2="http://xmlns.cit.de/intelliform/2009/webservices/backend"> - <data> - <attachments> - <attributes> - <key>X-IntelliForm-Signed</key> - <value>false</value> - </attributes> - <content>PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPG15Rm9ybSB4bWxuczp0PSJodHRwOi8veG1sbnMuY2l0LmRlL2ludGVsbGlmb3JtL3RyYW5zYWN0aW9uIiB0OmZvcm0tdmVyc2lvbj0iMi4wMTMiIHQ6dXVpZD0iNzgxNGI2YjUtMmZlYy00ZDBiLTg4OGYtYTM3N2ExOWIwZGEzIiB0OmlkPSIyMDIxMTIwODQyNjkyMDE3OTIwMCIgdDp0aW1lc3RhbXA9IjIwMjEtMTItMDhUMTA6NTE6MzIuNTMxWiIgdDpzZW5kZXI9InN0YWdlLmFmbS5zY2hsZXN3aWctaG9sc3RlaW4uZGUiIHQ6Zm9ybT0iV2FobGhlbGZlcmluIHdlcmRlbiIgdDpmb3JtLWlkPSJvZHBfd2FobGhlbGZlci9vZHBfd2FobGhlbGZlciIgdDpjdXN0b21lcj0iU2NobGVzd2lnLUhvbHN0ZWluIiB0OmN1c3RvbWVyLWlkPSJzaCIgdDpjbGllbnQ9IlNjaGxlc3dpZy1Ib2xzdGVpbiIgdDpjbGllbnQtaWQ9ImxhbmQiPgogIDxnZWJpZXRfaWQ+OTAwNzE3ODwvZ2ViaWV0X2lkPgogIDxzZXNzaW9uaWQ+ZjA1M2M0MmMtZjU0ZS00ZTZlLWIxODMtNWVmM2QxZDFlMDQyPC9zZXNzaW9uaWQ+CiAgPGFubGllZ2VuX2lkPjg5Njc5MTM8L2FubGllZ2VuX2lkPgogIDx6c3Rfb25saW5lX2RpZW5zdD5XYWhsaGVsZmVyIC0gQWx0ZW5ob2x6L0UtTWFpbC1adXN0ZWxsdW5nOzI1NDQwNDQwMDtodHRwczovL3d3dy5kYXRhcG9ydC5kZS9kYXRlbnNjaHV0ei87aHR0cHM6Ly93d3cuZGF0YXBvcnQuZGUvaW1wcmVzc3VtLztFTUFJTF9MTjs7b2xhZi5sZWllckBkYXRhcG9ydC5kZTs7dHJ1ZTwvenN0X29ubGluZV9kaWVuc3Q+CiAgPGdlYmlldGJlemVpY2hudW5nPkFsdGVuaG9sejwvZ2ViaWV0YmV6ZWljaG51bmc+CiAgPGRhdGVuc2NodXR6X3p1c3RpbW11bmc+dHJ1ZTwvZGF0ZW5zY2h1dHpfenVzdGltbXVuZz4KICA8d2FobD5MYW5kdGFnc3dhaGwgU2NobGVzd2lnIEhvaGxzdGVpbiA4LiBNYWkgMjAyMjwvd2FobD4KICA8d2VpdGVyZV93YWhsZW4+dHJ1ZTwvd2VpdGVyZV93YWhsZW4+CiAgPGVpbnNhdHpvcnQ+CiAgICA8YXVzc2VyaGFsYiBsYWJlbD0iTmljaHQgaW0gZWlnZW5lbiBXYWhsYmV6aXJrIj5mYWxzZTwvYXVzc2VyaGFsYj4KICAgIDxvdGhlciBsYWJlbD0iIj5mYWxzZTwvb3RoZXI+CiAgICA8d29obm9ydCBsYWJlbD0iTnVyIGluIFdvaG5vcnRuw6RoZSI+dHJ1ZTwvd29obm9ydD4KICA8L2VpbnNhdHpvcnQ+CiAgPGVyZmFocnVuZz5KYTwvZXJmYWhydW5nPgogIDxmdW5rdGlvbj4KICAgIDxiZWlzaXR6ZXIgbGFiZWw9IkJlaXNpdHplcjppbiI+ZmFsc2U8L2JlaXNpdHplcj4KICAgIDxzY2hyaWZ0ZnVlaHJlciBsYWJlbD0iU2NocmlmdGbDvGhyZXI6aW4iPmZhbHNlPC9zY2hyaWZ0ZnVlaHJlcj4KICAgIDxzdGVsbF9zY2hyaWZ0ZnVlaHJlciBsYWJlbD0iU3RlbGx2ZXJ0cmV0ZW5kZTpyIFNjaHJpZnRmw7xocmVyOmluIj5mYWxzZTwvc3RlbGxfc2NocmlmdGZ1ZWhyZXI+CiAgICA8c3RlbGxfd2FobHZvcnN0ZWhlciBsYWJlbD0iU3RlbGx2ZXJ0cmV0ZW5kZTpyIFdhaGx2b3JzdGVoZXI6aW4iPmZhbHNlPC9zdGVsbF93YWhsdm9yc3RlaGVyPgogICAgPHdhaGx2b3JzdGVoZXIgbGFiZWw9IldhaGx2b3JzdGVoZXI6aW4iPnRydWU8L3dhaGx2b3JzdGVoZXI+CiAgPC9mdW5rdGlvbj4KICA8cG9zdGZhY2huYWNocmljaHQ+U2VociBnZWVocnRlL3IgQW56ZWlnZW5kZSpyLCAmbHQ7YnIvJmd0OyZsdDtici8mZ3Q7SWhyIEFudHJhZyB3dXJkZSBhbiBkaWUgenVzdMOkbmRpZ2UgU3RlbGxlIGdlc2VuZGV0LiZsdDtici8mZ3Q7Jmx0O2JyLyZndDtJaHJlIFZvcmdhbmdzbnVtbWVyIHVuZCB6dXN0w6RuZGlnZSBTdGVsbGUgZmluZGVuIFNpZSBpbSBhbmdlaMOkbmd0ZW4gRG9rdW1lbnQuJmx0O2JyLyZndDtCaXR0ZSBnZWJlbiBTaWUgZGllc2UgVm9yZ2FuZ3NudW1tZXIgYmVpIGFsbGVuIEFuZnJhZ2VuIHp1IElocmVyIEFuemVpZ2UgYW4uJmx0O2JyLyZndDsmbHQ7YnIvJmd0OyZsdDtici8mZ3Q7TWl0IGZyZXVuZGxpY2hlbiBHcsO8w59lbiZsdDtici8mZ3Q7SWhyZSBPbmxpbmUtQmVow7ZyZGUmbHQ7YnIvJmd0OyZsdDtici8mZ3Q7PC9wb3N0ZmFjaG5hY2hyaWNodD4KICA8bmFtZWlkLz4KICA8cmVzdF9yZXNwb25zZV9uYW1lLz4KICA8bWFpbGJveGd1aWQvPgogIDxuYWNobmFtZT5mcmdoPC9uYWNobmFtZT4KICA8dm9ybmFtZT5mcmdoPC92b3JuYW1lPgogIDxnZWJ1cnRzZGF0dW0vPgogIDxzdGFhdGVuPkRFPC9zdGFhdGVuPgogIDxzdHJhc3NlX25yPgogICAgPHN0cmFzc2VfbnItaXRlbT4KICAgICAgPHN0cmFzc2U+c2ZnPC9zdHJhc3NlPgogICAgICA8aGF1c251bW1lcj4yMjwvaGF1c251bW1lcj4KICAgICAgPGFkcmVzc3p1c2F0ei8+CiAgICA8L3N0cmFzc2VfbnItaXRlbT4KICA8L3N0cmFzc2VfbnI+CiAgPHBsel9vcnQ+CiAgICA8cGx6X29ydC1pdGVtPgogICAgICA8cG9zdGxlaXR6YWhsPjIyMjIyPC9wb3N0bGVpdHphaGw+CiAgICAgIDxvcnQ+c2RmZ3NmZDwvb3J0PgogICAgPC9wbHpfb3J0LWl0ZW0+CiAgPC9wbHpfb3J0PgogIDxlbWFpbD5zZGZnc0Bhc2RmLmNvbTwvZW1haWw+CiAgPHRlbGVmb24+MjM0PC90ZWxlZm9uPgogIDxPcmdhbmlzYXRpb25zZWluaGVpdGVuSUQ+OTAzMDIyOTwvT3JnYW5pc2F0aW9uc2VpbmhlaXRlbklEPgogIDxPcmdhbmlzYXRpb25zZWluaGVpdGVuQkVaRUlDSE5VTkc+TGFuZGVzaGF1cHRzdGFkdCBLaWVsIC0gQsO8cmdlci0gdW5kCgkJCU9yZG51bmdzYW10LCBHZXdlcmJlbWVsZGVzdGVsbGU8L09yZ2FuaXNhdGlvbnNlaW5oZWl0ZW5CRVpFSUNITlVORz4KICA8enVzdF9rb250YWt0c3lzdGVta2VubnVuZ19uYi8+CiAgPHp1c3Rfa29udGFrdHN5c3RlbWtlbm51bmdfbG4+b2xhZi5sZWllckBkYXRhcG9ydC5kZTwvenVzdF9rb250YWt0c3lzdGVta2VubnVuZ19sbj4KICA8enVzdF9rb250YWt0c3lzdGVta2VubnVuZ193cy8+CiAgPHp1c3Rfc3RyYXNzZT5BbHRlbmhvbHplciBTdHJhw59lPC96dXN0X3N0cmFzc2U+CiAgPHp1c3RfaGF1c251bW1lcj4xMDwvenVzdF9oYXVzbnVtbWVyPgogIDx6dXN0X3Bvc3RsZWl0emFobD4yNDE2MTwvenVzdF9wb3N0bGVpdHphaGw+CiAgPG9ydElEPjkwMDcxNzg8L29ydElEPgogIDx6dXN0X29ydD5BbHRlbmhvbHo8L3p1c3Rfb3J0PgogIDx6dXN0X3RlbGVmb25udW1tZXI+KzQ5IDQwIDQyODQ2LTQwMzI8L3p1c3RfdGVsZWZvbm51bW1lcj4KICA8enVzdF9mYXhudW1tZXIvPgogIDx6dXN0X2VtYWlsYWRyZXNzZT5SYW1pbi5KZXlyYW5pQGRhdGFwb3J0LmRlPC96dXN0X2VtYWlsYWRyZXNzZT4KICA8enVzdGVsbHVuZ19uYWNocmljaHRlbmJyb2tlcj5mYWxzZTwvenVzdGVsbHVuZ19uYWNocmljaHRlbmJyb2tlcj4KICA8enVzdGVsbHVuZ19lbGVrdHJvbmlzY2g+dHJ1ZTwvenVzdGVsbHVuZ19lbGVrdHJvbmlzY2g+CjwvbXlGb3JtPg==</content> - <contentType>text/xml</contentType> - <id>myForm-xml</id> - <name>XML-Daten.xml</name> - </attachments> - <attachments> - <attributes> - <key>X-IntelliForm-Signed</key> - <value>false</value> - </attributes> - <content>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DQovVHlwZSAvQ2F0YWxvZw0KL0xhbmcgKGRlLURFKQ0KL091dGxpbmVzIDIzIDAgUg0KL1BhZ2VzIDEwIDAgUg0KPj4KZW5kb2JqCjI2IDAgb2JqCjw8DQovQ3JlYXRvciA8ZmVmZjAwNTcwMDcyMDA2OTAwNzQwMDY1MDA3Mj4NCi9DcmVhdGlvbkRhdGUgKEQ6MjAyMTEyMDgxMTUxNTYrMDEnMDAnKQ0KL1Byb2R1Y2VyIDxmZWZmMDA0YzAwNjkwMDYyMDA3MjAwNjUwMDRmMDA2NjAwNjYwMDY5MDA2MzAwNjUwMDIwMDAzNjAwMmUwMDM0Pg0KL0F1dGhvciA8ZmVmZjAwNGIwMDZjMDA2MTAwNzUwMDczMDAyMDAwNTcwMDYxMDA2ZTAwNmUwMDY1MDA3Mj4NCj4+CmVuZG9iagp4cmVmDQowIDI3IA0KMDAwMDAwMDAwMCA2NTUzNSBmDQowMDAwMDAwMDY3IDAwMDAwIG4NCjAwMDAwMDAyNTEgMDAwMDAgbg0KMDAwMDAwMTcxMCAwMDAwMCBuDQowMDAwMDAxNzMwIDAwMDAwIG4NCjAwMDAwMDE5MTQgMDAwMDAgbg0KMDAwMDAwMzQ4OCAwMDAwMCBuDQowMDAwMDAzNTA4IDAwMDAwIG4NCjAwMDAwMDM2OTIgMDAwMDAgbg0KMDAwMDAwNDYzNiAwMDAwMCBuDQowMDAwMDA0NjU1IDAwMDAwIG4NCjAwMDAwMDQ3NzcgMDAwMDAgbg0KMDAwMDAxODQ2MSAwMDAwMCBuDQowMDAwMDE4NDgzIDAwMDAwIG4NCjAwMDAwMTg2OTcgMDAwMDAgbg0KMDAwMDAxOTMxMyAwMDAwMCBuDQowMDAwMDE5Nzg4IDAwMDAwIG4NCjAwMDAwMjc0NDUgMDAwMDAgbg0KMDAwMDAyNzQ2NiAwMDAwMCBuDQowMDAwMDI3Njg3IDAwMDAwIG4NCjAwMDAwMjgxMDEgMDAwMDAgbg0KMDAwMDAyODM4NSAwMDAwMCBuDQowMDAwMDI4NDMyIDAwMDAwIG4NCjAwMDAwMjg0OTQgMDAwMDAgbg0KMDAwMDAyODU1NiAwMDAwMCBuDQowMDAwMDI4NzQ5IDAwMDAwIG4NCjAwMDAwMjg4NzYgMDAwMDAgbg0KdHJhaWxlcg0KPDwNCi9JbmZvIDI2IDAgUg0KL0lEIFsgPGFhNThmNDE1OWVlNzI2NWY1MTg0N2ZiNmU1NmZmYTA1PiA8Y2Q3MmFiZTE4ZDk4NGM4NjAyMTJjOTU5NzM5MzNiNmU+IF0NCi9Sb290IDI1IDAgUg0KL1NpemUgMjcNCi9Eb2NDaGVja3N1bSAvOTA3Q0UzMzczRTZCREE3QzVERjk1NUNGMERBNEU3ODYNCj4+DQpzdGFydHhyZWYNCjI5MTIzDQolJUVPRg0K</content> - <contentType>application/pdf</contentType> - <id>myForm-pdf</id> - <name>Wahlhelferin.pdf</name> - </attachments> - <attachments> - <attributes> - <key>X-IntelliForm-Signed</key> - <value>false</value> - </attributes> - <content>PGh0bWwgeG1sbnM6dD0iaHR0cDovL3htbG5zLmNpdC5kZS9pbnRlbGxpZm9ybS90cmFuc2FjdGlvbiI+CjxoZWFkPgo8TUVUQSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+CjwvaGVhZD4KPGJvZHkgc3R5bGU9ImZvbnQtZmFtaWx5OiBBcmlhbDsgZm9udC1zaXplOiAxMXB0OyI+CjxwPlNlaHIgZ2VlaHJ0ZS9yIFNhY2hiZWFyYmVpdGVyKmluPC9wPgo8cD5FaW4gbmV1ZXIgQW50cmFnIHd1cmRlIGdlc3RlbGx0PC9wPgo8cD5BY2h0dW5nOiBBbnR3b3J0ZW4gU2llIG5pY2h0IGF1ZiBkaWVzZSBFLU1haWwuIERpZSBFLU1haWwgd3VyZGUgYXV0b21hdGlzY2ggZXJzdGVsbHQuIEVpbmUgQW50d29ydCB3aXJkIG5pY2h0IGJlYXJiZWl0ZXQgdW5kIGdlbGVzZW4hLiBCaXR0ZSB3ZW5kZW4gU2llIHNpY2ggYW4gZGVuIGltIEFudHJhZyBnZW5hbm50ZW4gQW50cmFnc3RlbGxlci48L3A+CjwvYm9keT4KPC9odG1sPgo=</content> - <contentType>text/xml</contentType> - <id>EmailBodySachbearbeiterTemplate</id> - <name>EmailBodySachbearbeiterTemplate.xml</name> - </attachments> - <caller/> - <client>Schleswig-Holstein</client> - <clientId>land</clientId> - <customParameters> - <key>EmailAdresseSachbearbeiter</key> - <value>noreply@ozg-sh.de</value> - </customParameters> - <customParameters> - <key>EmailSubjectSachbearbeiterTemplate</key> - <value>Wahlhelferin</value> - </customParameters> - <customer>Schleswig-Holstein</customer> - <customerId>sh</customerId> - <form>Wahlhelferin werden</form> - <formId>odp_wahlhelfer/odp_wahlhelfer</formId> - <id>20211208426920179200</id> - <primaryDataAttachmentId>myForm-xml</primaryDataAttachmentId> - <primaryFormAttachmentId>myForm-pdf</primaryFormAttachmentId> - <sender>stage.afm.schleswig-holstein.de</sender> - <timestamp>2021-12-08T11:51:57.542+01:00</timestamp> - <username/> - </data> - </ns2:deposit> - </soap:Body> -</soap:Envelope> \ No newline at end of file diff --git a/intelliform-adapter/src/test/java/de/ozgcloud/eingang/intelliform/AttachmentTestFactory.java b/intelliform-adapter/src/test/java/de/ozgcloud/eingang/intelliform/AttachmentTestFactory.java deleted file mode 100644 index a2157603218be1f371cd3d516e93640ba2bb5703..0000000000000000000000000000000000000000 --- a/intelliform-adapter/src/test/java/de/ozgcloud/eingang/intelliform/AttachmentTestFactory.java +++ /dev/null @@ -1,205 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.intelliform; - -import static java.util.stream.Collectors.*; - -import java.util.List; -import java.util.Map; -import java.util.stream.IntStream; -import java.util.stream.Stream; - -import lombok.Builder; - -public class AttachmentTestFactory { - - public static final String XML_FILE_NAME = "XML-Daten-1.xml"; - - public static final String XML_CONTENT_TYPE = "text/xml"; - public static final String XML_CONTENT_STRING = """ - <?xml version="1.0" encoding="UTF-8"?> - <myForm xmlns:pdf="http://xmlns.cit.de/assistants/pdf" - xmlns:t="http://xmlns.cit.de/intelliform/transaction" - t:id="20201118365670866101\" t:timestamp=\"2020-11-18T09:09:27.627Z" - t:sender="afm.schleswig-holstein.de" - t:form="Kleiner Waffenschein gem. § 10 Abs. 4 Satz 4 Waffengesetz (WaffG)" - t:form-id="waffen/kleinerWaffenschein" - t:customer="Einheitlicher Ansprechpartner" t:customer-id="ea-sh" - t:client="Schleswig-Holstein" - t:client-id="land"> - <Upload1> - <file content-type="image/png" description="" id="VendorId3333" length="155251">Image.png</file> - </Upload1> - </myForm>"""; - public static final String XML_CONTENT = XML_CONTENT_STRING; - public static final String XML_ATTACHMENT_ID = "myForm-xml"; - public static final String XML_ROHFORM_ATTACHMENT_ID = "myForm-xml-rohform"; - public static final String XML_ORIGINALFORM_ATTACHMENT_ID = "myForm-xml-originalform"; - public static final String XML_NAME = "XML-Daten.xml"; - - public static final String PDF_ATTACHMENT_CONTENT_TYPE = "application/pdf"; - public static final String PDF_ATTACHMENT_CONTENT = "TestContent2"; - public static final String PDF_ATTACHMENT_NAME = "Scan1.pdf"; - public static final String PDF_ATTACHMENT_ID = "VendorId2222"; - public static final String PDF2_ATTACHMENT_ID = "VendorIdpdf2"; - - public static final String PNG_ATTACHMENT_CONTENT_TYPE = "application/pdf"; - public static final String PNG_ATTACHMENT_CONTENT = "TestContent3"; - public static final String PNG_ATTACHMENT_NAME = "Image.png"; - public static final String PNG_ATTACHMENT_ID = "VendorId3333"; - - public static final String JPG_ATTACHMENT_ID = "VendorIdjpg1"; - public static final String ODT_ATTACHMENT_ID = "VendorIdodt1"; - - public static final String ODT_ATTACHMENT_CONTENT_TYPE = "application/vnd.oasis.opendocument.text"; - - public static final String DOCX_ATTACHMENT_CONTENT_TYPE = "application/vnd.openxmlformats-officedocument.wordprocessingml.document"; - public static final String DOCX_ATTACHMENT_CONTENT = "TestContent4"; - - public static final String DOCX1_ATTACHMENT_ID = "VendorIddocx1"; - public static final String DOCX2_ATTACHMENT_ID = "VendorIddocx2"; - public static final String DOCX3_ATTACHMENT_ID = "VendorIddocx3"; - public static final String DOCX4_ATTACHMENT_ID = "VendorIddocx4"; - public static final String DOCX5_ATTACHMENT_ID = "VendorIddocx5"; - public static final String DOCX6_ATTACHMENT_ID = "VendorIddocx6"; - public static final String DOCX7_ATTACHMENT_ID = "VendorIddocx7"; - public static final String DOCX8_ATTACHMENT_ID = "VendorIddocx8"; - public static final String ORGANISATIONSEINHEITEN_ID = "10363455"; - - public static final String ANTRAGSTELLER_ANREDE = "Herr"; - public static final String ANTRAGSTELLER_ANREDE_CODE = "03"; - public static final String ANTRAGSTELLER_NACHNAME = "Mustermann"; - - public static final String ATTRIBUTES_ENTRY_KEY = "X-IntelliForm-Signed"; - public static final String ATTRIBUTES_ENTRY_VALUE = "false"; - - public static Attachment createXmlDaten() { - return createXmlDatenWithContent(XML_CONTENT); - } - - public static Attachment createPdf() { - return createAttachment(MetaAttachment.builder() - .id(PDF_ATTACHMENT_ID) - .name(PDF_ATTACHMENT_NAME) - .contentType(PDF_ATTACHMENT_CONTENT_TYPE) - .content(PDF_ATTACHMENT_CONTENT) - .build()); - } - - public static Attachment createPng() { - return createAttachment(MetaAttachment.builder() - .id(PNG_ATTACHMENT_ID) - .name(PNG_ATTACHMENT_NAME) - .contentType(PNG_ATTACHMENT_CONTENT_TYPE) - .content(PNG_ATTACHMENT_CONTENT) - .build()); - } - - public static Attachment createAttachment(MetaAttachment metaAttachment) { - var attachment = new Attachment(); - attachment.getAttributes().add(createAttributesEntry()); - attachment.setContent(metaAttachment.content.getBytes()); - attachment.setContentType(metaAttachment.contentType); - attachment.setId(metaAttachment.id); - attachment.setName(metaAttachment.name); - return attachment; - } - - private static Entry createAttributesEntry() { - var attributesEntry = new Entry(); - attributesEntry.setKey(ATTRIBUTES_ENTRY_KEY); - attributesEntry.setValue(ATTRIBUTES_ENTRY_VALUE); - return attributesEntry; - } - - public static List<Attachment> createManyAttachments(String xmlTemplateString, Map<String, String> templateValues, - String... attachmentParameterMatrix) { - - var metaAttachments = arrayToMetaAttachments(attachmentParameterMatrix); - - var allTemplateValues = Stream.concat( - templateValues.entrySet().stream(), - metaAttachments.stream().map(metaAttachment -> Map.entry(metaAttachment.templateId, metaAttachment.id)) - ).collect(toMap(Map.Entry::getKey, Map.Entry::getValue)); - - var xmlFormString = fillTemplateString( - xmlTemplateString, - allTemplateValues - ); - - return Stream.concat( - Stream.of( - createAttachment(MetaAttachment.builder() - .id(XML_ROHFORM_ATTACHMENT_ID) - .name("XML-Daten (Rohform).xml") - .contentType(XML_CONTENT_TYPE) - .content(xmlFormString) - .build() - ), - createAttachment(MetaAttachment.builder() - .id(XML_ORIGINALFORM_ATTACHMENT_ID) - .name("XML-Daten (Originalform).xml") - .contentType(XML_CONTENT_TYPE) - .content(xmlFormString) - .build() - ), - createXmlDatenWithContent(xmlFormString)), - metaAttachments.stream().map(AttachmentTestFactory::createAttachment) - ).toList(); - } - - private static Attachment createXmlDatenWithContent(String content) { - return createAttachment(MetaAttachment.builder() - .id(XML_ATTACHMENT_ID) - .name(XML_NAME) - .contentType(XML_CONTENT_TYPE) - .content(content) - .build() - ); - } - - @Builder - public record MetaAttachment(String id, String name, String contentType, String content, String templateId) { - } - - private static List<MetaAttachment> arrayToMetaAttachments(String[] array) { - int parameterCount = 5; - if (array.length % parameterCount != 0) { - throw new IllegalArgumentException("Matrix length must be divisible by %d.".formatted(parameterCount)); - } - - return IntStream.range(0, array.length / parameterCount) - .boxed() - .map(row -> row * parameterCount) - .map(offset -> new MetaAttachment(array[offset], array[offset + 1], array[offset + 2], array[offset + 3], array[offset + 4])) - .toList(); - } - - private static String fillTemplateString(String templateString, Map<String, String> templateValues) { - return templateValues.entrySet().stream() - .reduce(templateString, - (currentString, entry) -> currentString.replace("${" + entry.getKey() + "}", entry.getValue()), - (s1, s2) -> s1); - } -} diff --git a/intelliform-adapter/src/test/java/de/ozgcloud/eingang/intelliform/DepositDataMapperTest.java b/intelliform-adapter/src/test/java/de/ozgcloud/eingang/intelliform/DepositDataMapperTest.java deleted file mode 100644 index 14e6051660099f272547fd68a7ec71fe265422e5..0000000000000000000000000000000000000000 --- a/intelliform-adapter/src/test/java/de/ozgcloud/eingang/intelliform/DepositDataMapperTest.java +++ /dev/null @@ -1,448 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.intelliform; - -import static de.ozgcloud.eingang.intelliform.AttachmentTestFactory.*; -import static de.ozgcloud.eingang.intelliform.DepositDataTestFactory.*; -import static java.util.Collections.*; -import static org.assertj.core.api.Assertions.*; -import static org.mockito.Mockito.*; - -import java.io.IOException; -import java.io.StringReader; -import java.nio.charset.Charset; -import java.util.List; - -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; - -import org.apache.commons.io.FileUtils; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.mockito.ArgumentCaptor; -import org.mockito.Captor; -import org.mockito.Spy; -import org.w3c.dom.Document; -import org.xml.sax.InputSource; -import org.xml.sax.SAXException; - -import de.ozgcloud.eingang.common.errorhandling.TechnicalException; -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.common.formdata.IncomingFile; -import de.ozgcloud.eingang.common.formdata.IncomingFileGroup; -import lombok.SneakyThrows; - -class DepositDataMapperTest { - - @Spy - private DepositDataMapper mapper; - - @DisplayName("map to form data") - @Nested - class TestMapToFormData { - - @Captor - private ArgumentCaptor<Attachment> attachmentArgumentCaptor; - - private DepositData depositData; - - @DisplayName("with normal attachments") - @Nested - class TestWithNormalAttachments { - @BeforeEach - void mock() { - depositData = DepositDataTestFactory.create(ATTACHMENTS); - } - - @DisplayName("should throw technical exception if primary xml link is incorrect") - @Test - void shouldThrowTechnicalExceptionIfPrimaryXmlLinkIsIncorrect() { - depositData.setPrimaryDataAttachmentId("incorrect"); - - assertThatThrownBy(TestMapToFormData.this::doMapping) - .isInstanceOf(TechnicalException.class); - } - - @DisplayName("should use map to incoming file method") - @Test - void shouldUseMapToIncomingFileMethod() { - doMapping(); - verify(mapper, times(ATTACHMENTS.size())).mapAttachmentToIncomingFile(attachmentArgumentCaptor.capture()); - - assertThat(attachmentArgumentCaptor.getAllValues()).isEqualTo(ATTACHMENTS); - } - - @DisplayName("should return with representations") - @Test - void shouldReturnWithRepresentations() { - var formData = doMapping(); - - var incomingFileIds = formData.getRepresentations().stream().map(IncomingFile::getVendorId).toList(); - assertThat(incomingFileIds).containsExactly(XML_ATTACHMENT_ID, PDF_ATTACHMENT_ID); - } - - @DisplayName("should return with one attachment") - @Test - void shouldReturnWithOneAttachment() { - var formData = doMapping(); - - var incomingFileIds = formData.getAttachments().stream() - .flatMap(group -> group.getFiles().stream()) - .map(IncomingFile::getVendorId) - .toList(); - assertThat(incomingFileIds).containsExactly(PNG_ATTACHMENT_ID); - } - - @DisplayName("should return with attachment group name") - @Test - void shouldReturnWithAttachmentGroupName() { - var formData = doMapping(); - - var incomingFileIds = formData.getAttachments().stream() - .map(IncomingFileGroup::getName) - .toList(); - assertThat(incomingFileIds).containsExactly("Upload1"); - } - - @DisplayName("should return with number of representations") - @Test - void shouldReturnWithNumberOfRepresentations() { - var formData = doMapping(); - - assertThat(formData.getNumberOfRepresentations()).isEqualTo(2); - } - } - - @DisplayName("with duplicate keys") - @Nested - class TestWithDuplicateKeys { - @BeforeEach - void mock() { - depositData = DepositDataTestFactory.create(List.of( - withEmptyName(createXmlDaten()), - createXmlDaten(), - withEmptyName(createPdf()), - createPdf(), - withEmptyName(createPng()), - createPng() - )); - } - - private Attachment withEmptyName(Attachment attachment) { - attachment.setName(""); - return attachment; - } - - @DisplayName("should keep last entry for representations") - @Test - void shouldKeepLastEntryForRepresentations() { - var formData = doMapping(); - - var representationFiles = formData.getRepresentations(); - assertThat(getAttachmentVendorIds(representationFiles)).containsExactly(XML_ATTACHMENT_ID, PDF_ATTACHMENT_ID); - assertThat(getAttachmentFileNames(representationFiles)).containsExactly(XML_NAME, PDF_ATTACHMENT_NAME); - } - - @DisplayName("should keep last entry for attachments") - @Test - void shouldKeepLastEntryForAttachments() { - var formData = doMapping(); - - var attachmentFiles = formData.getAttachments().stream() - .map(IncomingFileGroup::getFiles) - .flatMap(List::stream) - .toList(); - assertThat(getAttachmentVendorIds(attachmentFiles)).containsExactly(PNG_ATTACHMENT_ID); - assertThat(getAttachmentFileNames(attachmentFiles)).containsExactly(PNG_ATTACHMENT_NAME); - } - - private List<String> getAttachmentFileNames(List<IncomingFile> incomingFileList) { - return incomingFileList.stream() - .map(IncomingFile::getName) - .toList(); - } - - private List<String> getAttachmentVendorIds(List<IncomingFile> incomingFileList) { - return incomingFileList.stream() - .map(IncomingFile::getVendorId) - .toList(); - } - } - - @DisplayName("with many attachments") - @Nested - class TestWithManyAttachments { - @BeforeEach - void mock() { - depositData = DepositDataTestFactory.create(MANY_ATTACHMENTS); - } - - @DisplayName("should return with representations") - @Test - void shouldReturnWithRepresentations() { - var formData = doMapping(); - - var incomingFileIds = formData.getRepresentations().stream() - .map(IncomingFile::getVendorId) - .toList(); - assertThat(incomingFileIds).containsExactly( - XML_ATTACHMENT_ID, - XML_ROHFORM_ATTACHMENT_ID, - XML_ORIGINALFORM_ATTACHMENT_ID - ); - } - - @DisplayName("should return with attachment groups") - @Test - void shouldReturnWithAttachmentGroups() { - var formData = doMapping(); - - var incomingFileIds = formData.getAttachments().stream() - .flatMap(group -> group.getFiles().stream()) - .map(IncomingFile::getVendorId) - .toList(); - assertThat(incomingFileIds).containsExactlyInAnyOrder( - DOCX1_ATTACHMENT_ID, - PDF_ATTACHMENT_ID, - DOCX2_ATTACHMENT_ID, - DOCX3_ATTACHMENT_ID, - DOCX4_ATTACHMENT_ID, - DOCX5_ATTACHMENT_ID, - DOCX6_ATTACHMENT_ID, - DOCX7_ATTACHMENT_ID, - DOCX8_ATTACHMENT_ID, - PDF2_ATTACHMENT_ID, - ODT_ATTACHMENT_ID, - JPG_ATTACHMENT_ID, - PNG_ATTACHMENT_ID - ); - } - } - - @DisplayName("with empty attachments") - @Nested - class TestWithEmptyAttachments { - @DisplayName("should throw technical exception") - @Test - void shouldThrowTechnicalException() { - depositData = DepositDataTestFactory.create(emptyList()); - - assertThatThrownBy(TestMapToFormData.this::doMapping) - .isInstanceOf(TechnicalException.class); - } - } - - private FormData doMapping() { - return mapper.mapToFormData(depositData); - } - - } - - @DisplayName("map deposit attachments to sorted incoming files") - @Nested - class TestMapDepositAttachmentsToSortedIncomingFiles { - - @DisplayName("should fail without primaryDataAttachmentId attachment") - @Test - void shouldFailWithoutPrimaryDataAttachmentIdAttachment() { - var depositData = DepositDataTestFactory.create(emptyList()); - - assertThatThrownBy(() -> mapper.mapDepositAttachmentsToSortedIncomingFiles(depositData)) - .isInstanceOf(TechnicalException.class); - } - - @DisplayName("should keep entry order") - @Test - void shouldKeepEntryOrder() { - var depositData = DepositDataTestFactory.create(ATTACHMENTS); - - var incomingFileMap = mapper.mapDepositAttachmentsToSortedIncomingFiles(depositData); - - var keys = incomingFileMap.keySet().stream().toList(); - assertThat(keys).containsExactly(XML_ATTACHMENT_ID, PDF_ATTACHMENT_ID, PNG_ATTACHMENT_ID); - } - - @DisplayName("should move primary attachment id to first position") - @Test - void shouldMovePrimaryAttachmentIdToFirstPosition() { - var rohformId = "XML-daten-rohform"; - var depositData = DepositDataTestFactory.create(List.of( - AttachmentTestFactory.createAttachment(MetaAttachment.builder() - .id(rohformId) - .name("XML-Daten (Rohform).xml") - .contentType(XML_CONTENT_TYPE) - .content("abc") - .build() - ), - AttachmentTestFactory.createPdf(), - AttachmentTestFactory.createXmlDaten(), - AttachmentTestFactory.createPng() - )); - - var incomingFileMap = mapper.mapDepositAttachmentsToSortedIncomingFiles(depositData); - - var keys = incomingFileMap.keySet().stream().toList(); - assertThat(keys).containsExactly(XML_ATTACHMENT_ID, rohformId, PDF_ATTACHMENT_ID, PNG_ATTACHMENT_ID); - } - - @DisplayName("should keep last entry for duplicate key") - @Test - void shouldKeepLastEntryForDuplicateKey() { - var depositData = DepositDataTestFactory.create(List.of( - AttachmentTestFactory.createXmlDaten(), - AttachmentTestFactory.createPdf(), - AttachmentTestFactory.createXmlDaten() - )); - - var incomingFileMap = mapper.mapDepositAttachmentsToSortedIncomingFiles(depositData); - - var keys = incomingFileMap.keySet().stream().toList(); - assertThat(keys).containsExactly(XML_ATTACHMENT_ID, PDF_ATTACHMENT_ID); - } - } - - @DisplayName("map attachment to incoming file") - @Nested - class TestMapAttachmentToIncomingFile { - private Attachment attachment; - - @BeforeEach - void mock() { - attachment = AttachmentTestFactory.createXmlDaten(); - } - - @DisplayName("should have ID") - @Test - void shouldHaveId() { - var incomingFile = doMapping(); - - assertThat(incomingFile.getId()).isNotNull(); - } - - @DisplayName("should have vendor ID") - @Test - void shouldHaveVendorId() { - var incomingFile = doMapping(); - - assertThat(incomingFile.getVendorId()).isEqualTo(XML_ATTACHMENT_ID); - } - - @DisplayName("should have name") - @Test - void shouldHaveName() { - var incomingFile = doMapping(); - - assertThat(incomingFile.getName()).isEqualTo(XML_NAME); - } - - @DisplayName("should have content type") - @Test - void shouldHaveContentType() { - var incomingFile = doMapping(); - - assertThat(incomingFile.getContentType()).isEqualTo(XML_CONTENT_TYPE); - } - - @DisplayName("should have size") - @Test - void shouldHaveSize() { - var incomingFile = doMapping(); - - assertThat(incomingFile.getSize()).isEqualTo(XML_CONTENT.getBytes().length); - } - - @DisplayName("should have file with content") - @SneakyThrows - @Test - void shouldHaveFileWithContent() { - var incomingFile = doMapping(); - - var content = FileUtils.readFileToString(incomingFile.getFile(), Charset.defaultCharset()); - assertThat(content).isEqualTo(XML_CONTENT_STRING); - } - - private IncomingFile doMapping() { - return mapper.mapAttachmentToIncomingFile(attachment); - } - } - - @DisplayName("find attachment groups") - @Nested - class TestFindAttachmentGroups { - - private Document document; - - @BeforeEach - void mock() { - document = buildXMLDocument(""" - <myForm t:client-id="land"> - <Upload1> - <file content-type="image/png" description="" id="VendorId3333" length="155251">Image.png</file> - </Upload1> - <Upload2> - <file id="VendorId1111">name1.txt</file> - <file id="VendorId2222">name2.txt</file> - </Upload2> - <file id="VendorIdxxxx">namex.txt</file> - </myForm>"""); - } - - @DisplayName("should have groups with parent element name") - @Test - void shouldHaveGroupsWithParentElementName() { - var attachmentGroups = mapper.findAttachmentGroups(document); - - assertThat(attachmentGroups).containsOnlyKeys("Upload1", "Upload2", "myForm"); - } - - @DisplayName("should have Upload1 group with fileId") - @Test - void shouldHaveUpload1GroupWithFileId() { - var attachmentGroups = mapper.findAttachmentGroups(document); - - assertThat(attachmentGroups.get("Upload1")).containsExactly("VendorId3333"); - } - - @DisplayName("should have two fileIds in Upload2 group") - @Test - void shouldHaveTwoFileIdsInUpload2Group() { - var attachmentGroups = mapper.findAttachmentGroups(document); - - assertThat(attachmentGroups.get("Upload2")).containsExactly("VendorId1111", "VendorId2222"); - } - } - - private Document buildXMLDocument(String xmlString) { - try { - return DocumentBuilderFactory.newInstance() - .newDocumentBuilder() - .parse(new InputSource(new StringReader(xmlString))); - } catch (ParserConfigurationException | IOException | SAXException e) { - throw new RuntimeException(e); - } - } - -} diff --git a/intelliform-adapter/src/test/java/de/ozgcloud/eingang/intelliform/DepositDataTestFactory.java b/intelliform-adapter/src/test/java/de/ozgcloud/eingang/intelliform/DepositDataTestFactory.java deleted file mode 100644 index e6382bf2009f146b5fa4c176a8caa8c0f632d338..0000000000000000000000000000000000000000 --- a/intelliform-adapter/src/test/java/de/ozgcloud/eingang/intelliform/DepositDataTestFactory.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.intelliform; - -import static de.ozgcloud.eingang.intelliform.AttachmentTestFactory.*; - -import java.time.Instant; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.UUID; - -import de.ozgcloud.common.test.TestUtils; - -public class DepositDataTestFactory { - - public static final List<Attachment> ATTACHMENTS = List.of( - AttachmentTestFactory.createXmlDaten(), - AttachmentTestFactory.createPdf(), - AttachmentTestFactory.createPng() - ); - - public static final List<Attachment> MANY_ATTACHMENTS = createManyAttachments( - TestUtils.loadTextFile("intelliform/XML-Daten-complex.template.xml"), - Map.of( - "oeid", ORGANISATIONSEINHEITEN_ID, - "uuid", UUID.randomUUID().toString(), - "transactionId", UUID.randomUUID().toString(), - "now", Instant.now().toString(), - "antragsteller_anrede", ANTRAGSTELLER_ANREDE, - "anrede_code", ANTRAGSTELLER_ANREDE_CODE, - "antragsteller_nachname", ANTRAGSTELLER_NACHNAME, - "antragsteller_vorname", "Max", - "antragsteller_email", "max.mustermann@example.com" - ), - DOCX1_ATTACHMENT_ID, "Document1.docx", DOCX_ATTACHMENT_CONTENT_TYPE, DOCX_ATTACHMENT_CONTENT, "fileid-docx1", - PDF_ATTACHMENT_ID, "Document2.pdf", PDF_ATTACHMENT_CONTENT_TYPE, PDF_ATTACHMENT_CONTENT, "fileid-pdf1", - DOCX2_ATTACHMENT_ID, "Document3.docx", DOCX_ATTACHMENT_CONTENT_TYPE, DOCX_ATTACHMENT_CONTENT, "fileid-docx2", - DOCX3_ATTACHMENT_ID, "Document4.docx", DOCX_ATTACHMENT_CONTENT_TYPE, DOCX_ATTACHMENT_CONTENT, "fileid-docx3", - DOCX4_ATTACHMENT_ID, "Document5.docx", DOCX_ATTACHMENT_CONTENT_TYPE, DOCX_ATTACHMENT_CONTENT, "fileid-docx4", - DOCX5_ATTACHMENT_ID, "Document6.docx", DOCX_ATTACHMENT_CONTENT_TYPE, DOCX_ATTACHMENT_CONTENT, "fileid-docx5", - DOCX6_ATTACHMENT_ID, "Document7.docx", DOCX_ATTACHMENT_CONTENT_TYPE, DOCX_ATTACHMENT_CONTENT, "fileid-docx6", - DOCX7_ATTACHMENT_ID, "Document8.docx", DOCX_ATTACHMENT_CONTENT_TYPE, DOCX_ATTACHMENT_CONTENT, "fileid-docx7", - DOCX8_ATTACHMENT_ID, "Document9.docx", DOCX_ATTACHMENT_CONTENT_TYPE, DOCX_ATTACHMENT_CONTENT, "fileid-docx8", - PDF2_ATTACHMENT_ID, "Document9.pdf", PDF_ATTACHMENT_CONTENT_TYPE, PDF_ATTACHMENT_CONTENT, "fileid-pdf2", - ODT_ATTACHMENT_ID, "Document10.odt", ODT_ATTACHMENT_CONTENT_TYPE, "TestContent5", "fileid-odt1", - JPG_ATTACHMENT_ID, "Document11.jpg", "image/jpeg", "TestContent6", "fileid-jpg1", - PNG_ATTACHMENT_ID, "Document12.png", "image/png", "TestContent7", "fileid-png1"); - - public static DepositData create(Collection<Attachment> attachments) { - var depositData = new DepositData(); - depositData.setPrimaryDataAttachmentId(AttachmentTestFactory.XML_ATTACHMENT_ID); - depositData.getAttachments().addAll(attachments); - return depositData; - } -} diff --git a/intelliform-adapter/src/test/java/de/ozgcloud/eingang/intelliform/FormDataEndpointITCase.java b/intelliform-adapter/src/test/java/de/ozgcloud/eingang/intelliform/FormDataEndpointITCase.java deleted file mode 100644 index 131accf21541b7a9a13beab5e54e8392db53a07d..0000000000000000000000000000000000000000 --- a/intelliform-adapter/src/test/java/de/ozgcloud/eingang/intelliform/FormDataEndpointITCase.java +++ /dev/null @@ -1,579 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.intelliform; - -import static de.ozgcloud.eingang.intelliform.AttachmentTestFactory.*; -import static de.ozgcloud.eingang.intelliform.DepositDataTestFactory.*; -import static de.ozgcloud.eingang.intelliform.FormDataEndpoint.*; -import static de.ozgcloud.eingang.intelliform.XmlDaten1Container.*; -import static org.assertj.core.api.Assertions.*; -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.*; - -import java.io.StringReader; -import java.io.StringWriter; -import java.util.Collection; -import java.util.List; -import java.util.UUID; - -import javax.xml.namespace.QName; -import javax.xml.transform.Source; -import javax.xml.transform.stream.StreamResult; -import javax.xml.transform.stream.StreamSource; - -import jakarta.xml.bind.JAXBElement; - -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.mockito.ArgumentCaptor; -import org.mockito.Captor; -import org.mockito.Mock; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.boot.test.mock.mockito.SpyBean; -import org.springframework.context.ApplicationContext; -import org.springframework.core.io.Resource; -import org.springframework.oxm.jaxb.Jaxb2Marshaller; -import org.springframework.ws.test.server.MockWebServiceClient; -import org.springframework.ws.test.server.RequestCreators; -import org.springframework.ws.test.server.ResponseActions; -import org.springframework.ws.test.server.ResponseMatchers; - -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.common.formdata.PostfachAddressTestFactory; -import de.ozgcloud.eingang.router.ManagableStub; -import de.ozgcloud.eingang.router.VorgangManagerServerResolver; -import de.ozgcloud.eingang.router.VorgangRemoteService; -import de.ozgcloud.vorgang.grpc.binaryFile.BinaryFileServiceGrpc.BinaryFileServiceStub; -import de.ozgcloud.vorgang.vorgang.GrpcAntragsteller; -import de.ozgcloud.vorgang.vorgang.GrpcEingang; -import de.ozgcloud.vorgang.vorgang.GrpcFormData; -import de.ozgcloud.vorgang.vorgang.GrpcIncomingFile; -import de.ozgcloud.vorgang.vorgang.GrpcIncomingFileGroup; -import de.ozgcloud.vorgang.vorgang.VorgangServiceGrpc.VorgangServiceBlockingStub; -import io.grpc.Channel; -import lombok.SneakyThrows; - -@SpringBootTest -class FormDataEndpointITCase { - - private final static String TEST_FILE_PATH = "classpath:itcase/"; - - private final static String REQUEST = "EinfachesFormularZweiAnhaengeSoapRequest.xml"; - private final static String RESPONSE = "EinfachesFormularZweiAnhaengeSoapResponse.xml"; - - private static final String SOAP_REQUEST_OTHER_NAME = "XML-Daten-1-other_name_SoapRequest.xml"; - private static Jaxb2Marshaller marshaller; - - @Autowired - private ApplicationContext applicationContext; - - @SpyBean - private VorgangRemoteService vorgangRemoteService; - @MockBean - private VorgangManagerServerResolver resolver; - - @Mock - private ManagableStub<VorgangServiceBlockingStub> vorgangManageableServiceStub; - @Mock - private VorgangServiceBlockingStub vorgangServiceStub; - @Mock - private ManagableStub<BinaryFileServiceStub> binaryFileManageableServiceStub; - @Mock - private BinaryFileServiceStub binaryFileServiceStub; - - @Mock - private Channel channel; - - @Captor - private ArgumentCaptor<FormData> formDataCaptor; - @Captor - private ArgumentCaptor<GrpcEingang> grpcEingangCaptor; - - private MockWebServiceClient mockClient; - - private DepositData depositData; - - private final String vorgangId = UUID.randomUUID().toString(); - - @BeforeAll - static void setupMarshaller() { - marshaller = new Jaxb2Marshaller(); - marshaller.setPackagesToScan("de.ozgcloud.eingang.intelliform"); - } - - @BeforeEach - void initTest() { - mockClient = MockWebServiceClient.createClient(applicationContext); - - when(resolver.resolveVorgangServiceBlockingStubByOrganisationseinheitenId(any())).thenReturn(vorgangManageableServiceStub); - when(vorgangManageableServiceStub.get()).thenReturn(vorgangServiceStub); - when(vorgangServiceStub.getChannel()).thenReturn(channel); - when(channel.authority()).thenReturn("authorityDummy"); - - when(resolver.resolveBinaryFileServiceStubByOrganisationsEinheitId(any())).thenReturn(binaryFileManageableServiceStub); - when(binaryFileManageableServiceStub.get()).thenReturn(binaryFileServiceStub); - - doReturn(vorgangId).when(vorgangRemoteService).createVorgang(any(), any(), any(), any()); - } - - @DisplayName("send antrag with many attachments") - @Nested - class TestSendAntragWithManyAttachments { - - @BeforeEach - void mock() { - depositData = DepositDataTestFactory.create(MANY_ATTACHMENTS); - } - - @DisplayName("should map antragsteller nachname") - @Test - void shouldMapAntragstellerNachname() { - sendDepositAndCaptureCreateVorgang(); - - var antragsteller = getCapturedAntragsteller(); - assertThat(antragsteller.getNachname()).isEqualTo(ANTRAGSTELLER_NACHNAME); - } - - @DisplayName("should map antragsteller anrede") - @Test - void shouldMapAntragstellerAnrede() { - sendDepositAndCaptureCreateVorgang(); - - var antragsteller = getCapturedAntragsteller(); - assertThat(antragsteller.getAnrede()).isEqualTo(ANTRAGSTELLER_ANREDE); - } - - private GrpcAntragsteller getCapturedAntragsteller() { - return grpcEingangCaptor.getValue().getAntragsteller(); - } - - @DisplayName("should have representations") - @Test - void shouldHaveRepresentations() { - sendDepositAndCaptureCreateVorgang(); - - var eingang = grpcEingangCaptor.getValue(); - var representationVendorIds = eingang.getRepresentationsList().stream() - .map(GrpcIncomingFile::getVendorId) - .toList(); - assertThat(representationVendorIds).containsExactly( - XML_ATTACHMENT_ID, - XML_ROHFORM_ATTACHMENT_ID, - XML_ORIGINALFORM_ATTACHMENT_ID); - } - - @DisplayName("should have attachments") - @Test - void shouldHaveAttachments() { - sendDepositAndCaptureCreateVorgang(); - - var eingang = grpcEingangCaptor.getValue(); - var attachmentVendorIds = eingang.getAttachmentsList().stream() - .map(GrpcIncomingFileGroup::getFilesList) - .flatMap(Collection::stream) - .map(GrpcIncomingFile::getVendorId) - .toList(); - assertThat(attachmentVendorIds).containsExactlyInAnyOrder( - DOCX1_ATTACHMENT_ID, - PDF_ATTACHMENT_ID, - DOCX2_ATTACHMENT_ID, - DOCX3_ATTACHMENT_ID, - DOCX4_ATTACHMENT_ID, - DOCX5_ATTACHMENT_ID, - DOCX6_ATTACHMENT_ID, - DOCX7_ATTACHMENT_ID, - DOCX8_ATTACHMENT_ID, - PDF2_ATTACHMENT_ID, - ODT_ATTACHMENT_ID, - JPG_ATTACHMENT_ID, - PNG_ATTACHMENT_ID); - } - - @DisplayName("should have organisationseinheitenID") - @Test - void shouldHaveOrganisationseinheitenId() { - sendDepositAndCaptureCreateVorgang(); - - var eingang = grpcEingangCaptor.getValue(); - assertThat(eingang.getZustaendigeStelle().getOrganisationseinheitenId()).isEqualTo(ORGANISATIONSEINHEITEN_ID); - } - - } - - @DisplayName("with duplicate keys") - @Nested - class TestWithDuplicateKeys { - @BeforeEach - void mock() { - depositData = DepositDataTestFactory.create(List.of( - withEmptyName(createXmlDaten()), - createXmlDaten(), - withEmptyName(createPdf()), - createPdf(), - withEmptyName(createPng()), - createPng())); - } - - private Attachment withEmptyName(Attachment attachment) { - attachment.setName(""); - return attachment; - } - - @DisplayName("should keep last entry for representations") - @Test - void shouldKeepLastEntryForRepresentations() { - sendDepositAndCaptureCreateVorgang(); - - var eingang = grpcEingangCaptor.getValue(); - var representationFiles = eingang.getRepresentationsList(); - assertThat(getAttachmentVendorIds(representationFiles)).containsExactly(XML_ATTACHMENT_ID, PDF_ATTACHMENT_ID); - assertThat(getAttachmentFileNames(representationFiles)).containsExactly(XML_NAME, PDF_ATTACHMENT_NAME); - } - - @DisplayName("should keep last entry for attachments") - @Test - void shouldKeepLastEntryForAttachments() { - sendDepositAndCaptureCreateVorgang(); - - var eingang = grpcEingangCaptor.getValue(); - var attachmentFiles = eingang.getAttachmentsList().stream() - .map(GrpcIncomingFileGroup::getFilesList) - .flatMap(List::stream) - .toList(); - assertThat(getAttachmentVendorIds(attachmentFiles)).containsExactly(PNG_ATTACHMENT_ID); - assertThat(getAttachmentFileNames(attachmentFiles)).containsExactly(PNG_ATTACHMENT_NAME); - } - - private List<String> getAttachmentFileNames(List<GrpcIncomingFile> incomingFileList) { - return incomingFileList.stream() - .map(GrpcIncomingFile::getName) - .toList(); - } - - private List<String> getAttachmentVendorIds(List<GrpcIncomingFile> incomingFileList) { - return incomingFileList.stream() - .map(GrpcIncomingFile::getVendorId) - .toList(); - } - } - - @SneakyThrows - private void sendDepositAndCaptureCreateVorgang() { - mockClient.sendRequest(RequestCreators.withPayload(createEnvelopeSourceFromDepositData(depositData))) - .andExpect(ResponseMatchers.noFault()) - .andExpect(ResponseMatchers.payload(getResource(RESPONSE))); - - verify(vorgangRemoteService).createVorgang(formDataCaptor.capture(), grpcEingangCaptor.capture(), any(), any()); - } - - @SneakyThrows - private Source createEnvelopeSourceFromDepositData(DepositData depositData) { - Deposit deposit = new Deposit(); - deposit.setData(depositData); - - JAXBElement<Deposit> depositJAXBElement = new JAXBElement<>( - new QName(NAMESPACE_URI, PAYLOAD_LOCAL_PART), - Deposit.class, - deposit); - - var stringWriter = new StringWriter(); - marshaller.marshal(depositJAXBElement, new StreamResult(stringWriter)); - return new StreamSource(new StringReader(stringWriter.toString())); - } - - @DisplayName("Send antrag with attachments") - @Nested - class TestAntragWithAttachments { - - @Test - void shouldSendRequest() { - sendRequest(); - - verify(vorgangRemoteService).createVorgang(any(FormData.class), any(GrpcEingang.class), any(), any()); - } - - @Nested - class checkAntragsteller { - - @Test - void validateAntragstellerEmail() { - sendRequest(); - - assertThat(grpcEingangCaptor.getValue().getAntragsteller().getEmail()).isEqualTo("noreply@ozg-sh.de"); - } - - @Test - void shouldMapAntragstellerPostfachId() { - sendRequest(); - - assertThat(grpcEingangCaptor.getValue().getAntragsteller().getPostfachId()).isEqualTo("nameIdAsOsiPostfachIdV1"); - } - } - - @Nested - class checkAttachments { - - @Test - void validateOrganisationsEinheitId() { - sendRequest(); - - assertThat(grpcEingangCaptor.getValue().getZustaendigeStelle().getOrganisationseinheitenId()).isEqualTo("10363455"); - } - - @Test - void checkAttachmentsCount() { - sendRequest(); - - assertThat(grpcEingangCaptor.getValue().getNumberOfAttachments()).isEqualTo(2); - } - - @Test - void checkAttachmentGroupCount() { - sendRequest(); - - assertThat(grpcEingangCaptor.getValue().getAttachmentsCount()).isEqualTo(2); - } - - @Test - void checkAttachmentGroup1Count() { - sendRequest(); - - GrpcIncomingFileGroup group = grpcEingangCaptor.getValue().getAttachments(0); - - assertThat(group.getFilesCount()).isEqualTo(1); - } - - @Test - void checkAttachmentGroup1Files() { - sendRequest(); - - GrpcIncomingFile file = grpcEingangCaptor.getValue().getAttachments(0).getFiles(0); - - assertThat(file.getId()).isNotNull(); - assertThat(file.getVendorId()).isEqualTo("assistants.E0FBA361C191F8B723949467AE302BEA24E4745E"); - assertThat(file.getName()).isEqualTo("Helge1.jpg"); - assertThat(file.getContentType()).isEqualTo("image/jpeg"); - assertThat(file.getContent().size()).isZero(); - } - - @Test - void checkAttachmentGroup2Count() { - sendRequest(); - - GrpcIncomingFileGroup group = grpcEingangCaptor.getValue().getAttachments(1); - - assertThat(group.getFilesCount()).isEqualTo(1); - } - - @Test - void checkAttachmentGroup2Files() { - sendRequest(); - - GrpcIncomingFile file = grpcEingangCaptor.getValue().getAttachments(1).getFiles(0); - - assertThat(file.getId()).isNotNull(); - assertThat(file.getVendorId()).isEqualTo("assistants.52D79E5B2118D1740045AB87151535DCAD24E9A7"); - assertThat(file.getName()).isEqualTo("Helgetext2.odt"); - assertThat(file.getContentType()).isEqualTo("application/vnd.oasis.opendocument.text"); - assertThat(file.getContent().size()).isZero(); - } - } - - @Nested - class validateRepresentations { - @Test - void checkRepresentationsCount() { - sendRequest(); - - assertThat(grpcEingangCaptor.getValue().getRepresentationsCount()).isEqualTo(1); - assertThat(grpcEingangCaptor.getValue().getNumberOfRepresentations()).isEqualTo(1); - } - - @Test - void checkRepresentation1() { - sendRequest(); - - GrpcIncomingFile file = grpcEingangCaptor.getValue().getRepresentations(0); - - assertThat(file.getId()).isNotNull(); - assertThat(file.getVendorId()).isEqualTo("myForm-xml"); - assertThat(file.getName()).isEqualTo("XML-Daten.xml"); - assertThat(file.getContentType()).isEqualTo("text/xml"); - assertThat(file.getContent().size()).isZero(); - } - - } - - @DisplayName("service konto") - @Nested - class TestServiceKonto { - - @Test - void shouldReturnMappedServiceKonto() { - var eingang = sendRequest(); - - assertThat(eingang.getHeader().getServiceKonto()).isNotNull(); - assertThat(eingang.getHeader().getServiceKonto().getType()).isEqualTo("OSI"); - } - - @Test - void shoulContainsPostfachAddresses() { - var eingang = sendRequest(); - - assertThat(eingang.getHeader().getServiceKonto().getPostfachAddressesList()).hasSize(1); - } - - @Test - void shoulReturnMappedPostfachAddress() { - var postfachAddress = sendRequest().getHeader().getServiceKonto().getPostfachAddressesList().get(0); - - assertThat(postfachAddress.getVersion()).isEqualTo(PostfachAddressTestFactory.VERSION); - assertThat(postfachAddress.getIdentifier().getPropertyList()).hasSize(1); - assertThat(postfachAddress.getIdentifier().getProperty(0).getName()).isEqualTo("postfachId"); - assertThat(postfachAddress.getIdentifier().getProperty(0).getValue(0)).isEqualTo("nameIdAsOsiPostfachIdV1"); - assertThat(postfachAddress.getType()).isEqualTo(1); - } - } - - @SneakyThrows - private GrpcEingang sendRequest() { - sendWebserviceRequest(REQUEST); - - return grpcEingangCaptor.getValue(); - } - } - - @Nested - class TestOtherNameForFormData { - - @Test - void shouldSucceed() { // NOSONAR contains andExpect of mockClient - sendWebserviceRequest(SOAP_REQUEST_OTHER_NAME).andExpect(ResponseMatchers.noFault()); - } - - @Test - void shouldHaveOrgaId() { - sendWebserviceRequest(SOAP_REQUEST_OTHER_NAME); - - verify(vorgangRemoteService).createVorgang(any(), grpcEingangCaptor.capture(), any(), any()); - - assertThat(grpcEingangCaptor.getValue().getZustaendigeStelle().getOrganisationseinheitenId()).isEqualTo("0815"); - } - - } - - @Nested - class TestKeepFormDataOrder { - - @Test - void shouldKeepEingangFieldsOrder() { - var grpcFormData = requestFormData(); - - assertThat(grpcFormData.getFieldList()).isEqualTo(XmlDaten1Container.EINGANG_FIELDS); - } - - @Test - void shouldKeepZustaendigestelleFieldsOrder() { - var formFields = requestFormData().getForm(0).getFieldList(); - - assertThat(formFields).isEqualTo(XmlDaten1Container.ZUSTAENDIGESTELLE_FIELDS); - } - - @Test - void shouldKeepEmpfangendestelleFieldsOrder() { - var formFields = requestFormData().getForm(1).getFieldList(); - - assertThat(formFields).isEqualTo(XmlDaten1Container.EMPFANGENDESTELLE_FIELDS); - } - - @Test - void shouldKeepErklaerungenFieldsOrder() { - var formFields = requestFormData().getForm(2).getFieldList(); - - assertThat(formFields).isEqualTo(XmlDaten1Container.ERKLAERUNGEN_FIELDS); - } - - @Test - void shouldKeepAnsprechpartnerFieldsOrder() { - var formFields = requestFormData().getForm(3).getSubForm(0).getFieldList(); - - assertThat(formFields).isEqualTo(XmlDaten1Container.ANSPRECHPARTNER_FIELDS); - } - - @Test - void shouldKeepAnschriftFieldsOrder() { - var formFields = requestFormData().getForm(3).getSubForm(0).getSubForm(0).getFieldList(); - - assertThat(formFields).isEqualTo(XmlDaten1Container.ANSCHRIFT_FIELDS); - } - - @Test - void shouldKeepKontaktFieldsOrder() { - var formFields = requestFormData().getForm(3).getSubForm(0).getSubForm(1).getFieldList(); - - assertThat(formFields).isEqualTo(XmlDaten1Container.KONTAKT_FIELDS); - } - - @Test - void shouldKeepVerwaltungsleistungFieldsOrder() { - var formFields = requestFormData().getForm(3).getSubForm(1).getSubForm(0).getFieldList(); - - assertThat(formFields).isEqualTo(XmlDaten1Container.VERWALTUNGSLEISTUNG_FIELDS); - } - - @Test - void shouldKeepAusgewaehlteZustaendigestelleFieldsOrder() { - var formFields = requestFormData().getForm(3).getSubForm(1).getSubForm(0).getSubForm(0).getFieldList(); - - assertThat(formFields).isEqualTo(XmlDaten1Container.AUSGEWAEHLTE_ZUSTAENDIGESTELLE_FIELDS); - } - - private GrpcFormData requestFormData() { - sendWebserviceRequest(REQUEST_XML_NAME); - - verify(vorgangRemoteService).createVorgang(any(), grpcEingangCaptor.capture(), any(), any()); - return grpcEingangCaptor.getValue().getFormData(); - } - } - - @SneakyThrows - private ResponseActions sendWebserviceRequest(String requestFileName) { - var response = mockClient.sendRequest(RequestCreators.withSoapEnvelope(getResource(requestFileName))) - .andExpect(ResponseMatchers.noFault()) - .andExpect(ResponseMatchers.payload(getResource(RESPONSE))); - - verify(vorgangRemoteService).createVorgang(formDataCaptor.capture(), grpcEingangCaptor.capture(), any(), any()); - - return response; - } - - private Resource getResource(String fileName) { - return applicationContext.getResource(TEST_FILE_PATH + fileName); - } -} diff --git a/intelliform-adapter/src/test/java/de/ozgcloud/eingang/intelliform/FormDataEndpointTest.java b/intelliform-adapter/src/test/java/de/ozgcloud/eingang/intelliform/FormDataEndpointTest.java deleted file mode 100644 index caa77acc9a6d0b07d8d084c96ea7251df1341d96..0000000000000000000000000000000000000000 --- a/intelliform-adapter/src/test/java/de/ozgcloud/eingang/intelliform/FormDataEndpointTest.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.intelliform; - -import static org.assertj.core.api.Assertions.*; -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.*; - -import java.io.IOException; -import java.net.URISyntaxException; - -import javax.xml.parsers.ParserConfigurationException; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.xml.sax.SAXException; - -import de.ozgcloud.common.test.TestUtils; -import de.ozgcloud.eingang.common.formdata.FormDataTestFactory; -import de.ozgcloud.eingang.semantik.SemantikAdapter; - -class FormDataEndpointTest { - - @InjectMocks - private FormDataEndpoint formdataEndpointIntelli; - @Mock - private DepositDataMapper depositDataMapper; - @Mock - private SemantikAdapter semantikAdapter; - - @BeforeEach - void init() throws SAXException, IOException, ParserConfigurationException { - when(depositDataMapper.mapToFormData(any())).thenReturn(FormDataTestFactory.create()); - } - - @Test - void testDepositFormData() throws SAXException, IOException, ParserConfigurationException, URISyntaxException { - var response = formdataEndpointIntelli.inputFormData(buildRequest("intelliform/XML-Daten-1.xml")); - - assertThat(response).isNotNull(); - } - - private Deposit buildRequest(String fileName) throws SAXException, IOException, ParserConfigurationException, URISyntaxException { - var depositData = new DepositData(); - - var attachment = new Attachment(); - attachment.setName("XML-Daten.xml"); - attachment.setContent(TestUtils.loadTextFile(fileName).getBytes()); - - depositData.getAttachments().add(attachment); - - var deposit = new Deposit(); - deposit.setData(depositData); - - return deposit; - } -} diff --git a/intelliform-adapter/src/test/java/de/ozgcloud/eingang/intelliform/GrpcFormFieldTestFactory.java b/intelliform-adapter/src/test/java/de/ozgcloud/eingang/intelliform/GrpcFormFieldTestFactory.java deleted file mode 100644 index 693bd320ce3bbdf42822767e0947f5125423051c..0000000000000000000000000000000000000000 --- a/intelliform-adapter/src/test/java/de/ozgcloud/eingang/intelliform/GrpcFormFieldTestFactory.java +++ /dev/null @@ -1,10 +0,0 @@ -package de.ozgcloud.eingang.intelliform; - -import de.ozgcloud.vorgang.vorgang.GrpcFormField; - -public class GrpcFormFieldTestFactory { - - public static GrpcFormField create(String fieldName, String fieldValue) { - return GrpcFormField.newBuilder().setName(fieldName).setValue(fieldValue).build(); - } -} diff --git a/intelliform-adapter/src/test/java/de/ozgcloud/eingang/intelliform/XmlDaten1Container.java b/intelliform-adapter/src/test/java/de/ozgcloud/eingang/intelliform/XmlDaten1Container.java deleted file mode 100644 index 7f56b618af0487d4d0fcdbed5046beb748a4e511..0000000000000000000000000000000000000000 --- a/intelliform-adapter/src/test/java/de/ozgcloud/eingang/intelliform/XmlDaten1Container.java +++ /dev/null @@ -1,139 +0,0 @@ -package de.ozgcloud.eingang.intelliform; - - -import static de.ozgcloud.eingang.intelliform.GrpcFormFieldTestFactory.*; - -import java.util.List; - -import de.ozgcloud.vorgang.vorgang.GrpcFormField; - -public class XmlDaten1Container { - - public final static String REQUEST_XML_NAME = "XML-Daten-1-SoapRequest.xml"; - - public static final List<GrpcFormField> EINGANG_FIELDS = List.of( - create("kontaktsystemtypid", "233034600"), - create("kontaktsystemtypidln", "233034601"), - create("AnliegenID", "8966671"), - create("mailboxguid", "f977368b-6991-46b9-af18-8a2a03d9ad1b"), - create("GebietID", "9007314"), - create("logourl", "http://wafmxpa002.dpaor.de/sh/logos/kopf_9068873.doc") - ); - - public static final List<GrpcFormField> EMPFANGENDESTELLE_FIELDS = List.of( - create("OrganisationseinheitenAuswahl", "9068873"), - create("OrganisationseinheitenID", "9068873"), - create("OrganisationseinheitenBEZEICHNUNG", "Einheitlicher Ansprechpartner\n\t\t\tSchleswig-Holstein"), - create("strasse", "Reventlouallee"), - create("hausnummer", "6"), - create("postleitzahl", "24105"), - create("ortID", "9006402"), - create("ort", "Kiel"), - create("telefonnummer", "+49 431 988-8650"), - create("telefaxnummer", "+49 431 988-6161111"), - create("emailadresse", "info@ea-sh.de"), - create("demailadresse", "ea-poststelle@ea-sh.de-mail.de"), - create("kontaktsystem_kennung", "afmsh:9068873_AusnahmeLKWFahrverbot"), - create("kontaktsystem_kennungzusatz", "alle") - ); - - public static final List<GrpcFormField> ERKLAERUNGEN_FIELDS = List.of( - create("check_gebuehren", "true"), - create("check_richtigkeit", "true"), - create("check_datenschutz", "true"), - create("check_missbrauch", "true"), - create("b_gebuehren_beschriftung", """ - * Mir ist bekannt, dass durch das Einreichen - des elektronischen Antrages von der zuständigen Stelle Gebühren - erhoben werden können."""), - create("b_gebuehren_intro", """ - Gebühr bei Ausstellung des kleinen Waffenscheins: - 60,00 Euro. Bearbeitungsgebühr bei Versagung: 45,00 Euro. - Sie sind gemäß § 39 WaffG verpflichtet, der zuständigen Behörde die zur - Durchführung des Gesetzes erforderlichen Auskünfte zu erteilen. Zur - Prüfung Ihrer waffenrechtlichen Zuverlässigkeit und Eignung holt die - Behörde eine unbeschränkte Auskunft aus dem Bundeszentralregister, - eine Auskunft aus dem zentralen staatsanwaltschaftlichen - Verfahrensregister, eine Stellungnahme der örtlichen - Polizeidienststelle und Ihrer Wohnsitzgemeinde ein."""), - create("b_richtigkeit", "* Ich bestätige die Richtigkeit meiner Angaben."), - create("b_datenschutz", """ - * Ich erkläre mich damit einverstanden, dass der - Einheitlicher Ansprechpartner Schleswig-Holstein zur Erfüllung seiner - Aufgaben meine Daten unter Einhaltung der Bestimmungen der - Datenschutz-Grundverordnung (DS-GVO) und des - Landesdatenschutzgesetzes Schleswig-Holstein (LDSG-SH) speichert, - verarbeitet und diese im Rahmen der gesetzlichen Bestimmungen an die - für die Entscheidung zuständige Stelle weiterleitet. Ebenso bin ich - mit der rechtskonformen Datenverarbeitung und Speicherung durch die - zuständige Stelle einverstanden. Mir ist bekannt, dass ich die - Einwilligung in die Verarbeitung und Übermittlung jederzeit gegenüber - dem Einheitlicher Ansprechpartner Schleswig-Holstein, Reventlouallee - 6, 24105 Kiel widerrufen kann. Ein Widerruf ist aber nur wirksam für - die Zukunft. Verarbeitungen, die vor dem Widerruf erfolgt sind, sind - davon nicht betroffen. Über die Verarbeitung meiner personenbezogenen - Daten und die mir nach den datenschutzrechtlichen Regelungen - zustehenden Ansprüche und Rechte habe ich unter Datenschutzerklärung - Kenntnis erlangt."""), - create("b_missbrauch", """ - * Mir ist bekannt, dass zur Verfolgung widerrechtlicher - Nutzung die Daten meines zur Dateneingabe genutzten Endgerätes - aufgezeichnet und verwendet werden können."""), - create("policyurl", "http://wafmxpa002.dpaor.de/sh/datenschutz/datenschutzerklaerungEA_de.doc") - ); - - public static final List<GrpcFormField> ANSPRECHPARTNER_FIELDS = List.of( - create("anrede", "Herr"), - create("vorname", "Max"), - create("familienname", "Testermann") - ); - - public static final List<GrpcFormField> ANSCHRIFT_FIELDS = List.of( - create("strasse", "Königsweg"), - create("hausnummer", "74"), - create("postleitzahl", "24837"), - create("ort", "Schleswig"), - create("staat", "Deutschland") - ); - - public static final List<GrpcFormField> KONTAKT_FIELDS = List.of( - create("telefonnummer", "+ 49 4621 9654"), - create("mobilnummer", "+49 123"), - create("telefaxnummer", "+ 49 4621 9654"), - create("emailadresse", "max.testermann@gmx.de"), - create("demailadresse", "max.testermann@gmx.de-mail.de") - ); - - public static final List<GrpcFormField> AUSGEWAEHLTE_ZUSTAENDIGESTELLE_FIELDS = List.of( - create("OrganisationseinheitenID", "9535669"), - create("OrganisationseinheitenBEZEICHNUNG", "Kreis\n\t\t\t\t\t\tSchleswig-Flensburg/Kreisverwaltung - Allgemeine\n\t\t\t\t\t\tOrdnungsangelegenheiten") - ); - - public static final List<GrpcFormField> VERWALTUNGSLEISTUNG_FIELDS = List.of( - create("GebietID", "9007314"), - create("GebietBEZEICHNUNG", "Schleswig"), - create("AnliegenID", "8966671"), - create("AnliegenBEZEICHNUNG", "Waffenschein / Kleiner Waffenschein"), - create("leikaKEYLIST", "99089008000000;99089008001000") - ); - - public static final List<GrpcFormField> ZUSTAENDIGESTELLE_FIELDS = List.of( - create("OrganisationseinheitenAuswahl", "9535669"), - create("OrganisationseinheitenID", "9535669"), - create("OrganisationseinheitenBEZEICHNUNG", "Kreis\n\t\t\tSchleswig-Flensburg/Kreisverwaltung - Allgemeine\n\t\t\tOrdnungsangelegenheiten"), - create("strasse", "Flensburger Straße"), - create("hausnummer", "7"), - create("postleitzahl", "24837"), - create("ortID", "9007314"), - create("ort", "Schleswig"), - create("telefonnummer", "04621 87-0"), - create("telefaxnummer", "04621 87-366"), - create("emailadresse", "Gefahrenabwehr@Kiel.de"), - create("kontaktsystem_kennung", "afmsh:9535669_kleinerWaffenschein"), - create("AnliegenBEZEICHNUNG", "Waffenschein / Kleiner Waffenschein"), - create("leikaKEYLIST", "99089008000000;99089008001000"), - create("auswahl_zustellung", "abholen"), - create("b_zustellung", "Ich hole den Kleinen Waffenschein selbst ab.") - ); - -} diff --git a/intelliform-adapter/src/test/resources/META-INF/services/org.junit.jupiter.api.extension.Extension b/intelliform-adapter/src/test/resources/META-INF/services/org.junit.jupiter.api.extension.Extension deleted file mode 100644 index 79b126e6cdb86bec1f4f08c205de8961bde1934a..0000000000000000000000000000000000000000 --- a/intelliform-adapter/src/test/resources/META-INF/services/org.junit.jupiter.api.extension.Extension +++ /dev/null @@ -1 +0,0 @@ -org.mockito.junit.jupiter.MockitoExtension \ No newline at end of file diff --git a/intelliform-adapter/src/test/resources/fileupload/testodt1.odt b/intelliform-adapter/src/test/resources/fileupload/testodt1.odt deleted file mode 100644 index 83ec2f3948d50a6e85beedfd12c0de07a0c9354f..0000000000000000000000000000000000000000 Binary files a/intelliform-adapter/src/test/resources/fileupload/testodt1.odt and /dev/null differ diff --git a/intelliform-adapter/src/test/resources/fileupload/testpdf1.pdf b/intelliform-adapter/src/test/resources/fileupload/testpdf1.pdf deleted file mode 100644 index 305081d4d33ff9cb610947f9352072b8209806e3..0000000000000000000000000000000000000000 Binary files a/intelliform-adapter/src/test/resources/fileupload/testpdf1.pdf and /dev/null differ diff --git a/intelliform-adapter/src/test/resources/intelliform/XML-Daten-1.xml b/intelliform-adapter/src/test/resources/intelliform/XML-Daten-1.xml deleted file mode 100644 index 225f1b841bc271ef7baefe66fef0182587cd406f..0000000000000000000000000000000000000000 --- a/intelliform-adapter/src/test/resources/intelliform/XML-Daten-1.xml +++ /dev/null @@ -1,173 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<myForm xmlns:pdf="http://xmlns.cit.de/assistants/pdf" - xmlns:t="http://xmlns.cit.de/intelliform/transaction" - t:id="20201118365670866101" t:timestamp="2020-11-18T09:09:27.627Z" - t:sender="afm.schleswig-holstein.de" - t:form="Kleiner Waffenschein gem. § 10 Abs. 4 Satz 4 Waffengesetz (WaffG)" - t:form-id="waffen/kleinerWaffenschein" - t:customer="Einheitlicher Ansprechpartner" t:customer-id="ea-sh" - t:client="Schleswig-Holstein" t:client-id="land"> - <kontaktsystemtypid>233034600</kontaktsystemtypid> - <kontaktsystemtypidln>233034601</kontaktsystemtypidln> - <AnliegenID>8966671</AnliegenID> - <mailboxguid>f977368b-6991-46b9-af18-8a2a03d9ad1b</mailboxguid> - <nameid>cbacb01a-2810-11ec-bb6f-c31939f8874e</nameid> - <antragsteller> - <pers_anrede>Herr$03</pers_anrede> - <pers_nachname>Testermann</pers_nachname> - <pers_vorname>Max</pers_vorname> - <pers_geburtsname>Max Testermann</pers_geburtsname> - <pers_geburtsdatum>1995-03-21</pers_geburtsdatum> - <pers_geburtsort>Flensburg</pers_geburtsort> - <pers_geburtsland>deutsch$Deutschland$000</pers_geburtsland> - <pers_staatsangehoerigkeit>deutsch$Deutschland$000</pers_staatsangehoerigkeit> - <b_anrede>Herr</b_anrede> - <b_anrede_schluesselnr>03</b_anrede_schluesselnr> - <b_geburtsland>Deutschland</b_geburtsland> - <b_geburtsland_signatur>000</b_geburtsland_signatur> - <b_staatsangehoerigkeit>deutsch</b_staatsangehoerigkeit> - <b_staatsangehoerigkeit_signatur>000</b_staatsangehoerigkeit_signatur> - <sh_strasse>Königsweg</sh_strasse> - <sh_hausnummer>74</sh_hausnummer> - <sh_plz>24837</sh_plz> - <ort_auswahl>9007314$01059075</ort_auswahl> - <ort>Schleswig</ort> - <GebietID>9007314</GebietID> - <GebietBEZEICHNUNG>Schleswig</GebietBEZEICHNUNG> - <GebietGNR94_GNR>01059075</GebietGNR94_GNR> - <staat>000</staat> - <iso3166numerisch>276</iso3166numerisch> - <kont_telefonnummer>+ 49 4621 9654</kont_telefonnummer> - <kont_mobilnummer>+49 123</kont_mobilnummer> - <kont_telefaxnummer>+ 49 4621 9654</kont_telefaxnummer> - <kont_email>max.testermann@gmx.de</kont_email> - <kont_demail>max.testermann@gmx.de-mail.de</kont_demail> - <persoenlicheEignung> - <maengelvorhanden>false</maengelvorhanden> - <ermittlungsverfahren>false</ermittlungsverfahren> - <MitgliedschaftInVerboternerVereinigung>false</MitgliedschaftInVerboternerVereinigung> - </persoenlicheEignung> - </antragsteller> - <GebietID>9007314</GebietID> - <zustaendigestelle> - <OrganisationseinheitenAuswahl>9535669</OrganisationseinheitenAuswahl> - <OrganisationseinheitenID>9535669</OrganisationseinheitenID> - <OrganisationseinheitenBEZEICHNUNG>Kreis - Schleswig-Flensburg/Kreisverwaltung - Allgemeine - Ordnungsangelegenheiten</OrganisationseinheitenBEZEICHNUNG> - <strasse>Flensburger Straße</strasse> - <hausnummer>7</hausnummer> - <postleitzahl>24837</postleitzahl> - <ortID>9007314</ortID> - <ort>Schleswig</ort> - <telefonnummer>04621 87-0</telefonnummer> - <telefaxnummer>04621 87-366</telefaxnummer> - <emailadresse>Gefahrenabwehr@Kiel.de</emailadresse> - <demailadresse /> - <kontaktsystem_kennung>afmsh:9535669_kleinerWaffenschein</kontaktsystem_kennung> - <kontaktsystem_kennungzusatz /> - <AnliegenBEZEICHNUNG>Waffenschein / Kleiner Waffenschein</AnliegenBEZEICHNUNG> - <leikaKEYLIST>99089008000000;99089008001000</leikaKEYLIST> - <auswahl_zustellung>abholen</auswahl_zustellung> - <b_zustellung>Ich hole den Kleinen Waffenschein selbst ab.</b_zustellung> - </zustaendigestelle> - <empfangendestelle> - <OrganisationseinheitenAuswahl>9068873</OrganisationseinheitenAuswahl> - <OrganisationseinheitenID>9068873</OrganisationseinheitenID> - <OrganisationseinheitenBEZEICHNUNG>Einheitlicher Ansprechpartner - Schleswig-Holstein</OrganisationseinheitenBEZEICHNUNG> - <strasse>Reventlouallee</strasse> - <hausnummer>6</hausnummer> - <postleitzahl>24105</postleitzahl> - <ortID>9006402</ortID> - <ort>Kiel</ort> - <telefonnummer>+49 431 988-8650</telefonnummer> - <telefaxnummer>+49 431 988-6161111</telefaxnummer> - <emailadresse>info@ea-sh.de</emailadresse> - <demailadresse>ea-poststelle@ea-sh.de-mail.de</demailadresse> - <kontaktsystem_kennung>afmsh:9068873_AusnahmeLKWFahrverbot</kontaktsystem_kennung> - <kontaktsystem_kennungzusatz>alle</kontaktsystem_kennungzusatz> - </empfangendestelle> - <erklaerungen> - <check_gebuehren>true</check_gebuehren> - <check_richtigkeit>true</check_richtigkeit> - <check_datenschutz>true</check_datenschutz> - <check_missbrauch>true</check_missbrauch> - <b_gebuehren_beschriftung>* Mir ist bekannt, dass durch das Einreichen - des elektronischen Antrages von der zuständigen Stelle Gebühren - erhoben werden können.</b_gebuehren_beschriftung> - <b_gebuehren_intro>Gebühr bei Ausstellung des kleinen Waffenscheins: - 60,00 Euro. Bearbeitungsgebühr bei Versagung: 45,00 Euro. - Sie sind gemäß § 39 WaffG verpflichtet, der zuständigen Behörde die zur - Durchführung des Gesetzes erforderlichen Auskünfte zu erteilen. Zur - Prüfung Ihrer waffenrechtlichen Zuverlässigkeit und Eignung holt die - Behörde eine unbeschränkte Auskunft aus dem Bundeszentralregister, - eine Auskunft aus dem zentralen staatsanwaltschaftlichen - Verfahrensregister, eine Stellungnahme der örtlichen - Polizeidienststelle und Ihrer Wohnsitzgemeinde ein.</b_gebuehren_intro> - <b_richtigkeit>* Ich bestätige die Richtigkeit meiner Angaben.</b_richtigkeit> - <b_datenschutz>* Ich erkläre mich damit einverstanden, dass der - Einheitlicher Ansprechpartner Schleswig-Holstein zur Erfüllung seiner - Aufgaben meine Daten unter Einhaltung der Bestimmungen der - Datenschutz-Grundverordnung (DS-GVO) und des - Landesdatenschutzgesetzes Schleswig-Holstein (LDSG-SH) speichert, - verarbeitet und diese im Rahmen der gesetzlichen Bestimmungen an die - für die Entscheidung zuständige Stelle weiterleitet. Ebenso bin ich - mit der rechtskonformen Datenverarbeitung und Speicherung durch die - zuständige Stelle einverstanden. Mir ist bekannt, dass ich die - Einwilligung in die Verarbeitung und Übermittlung jederzeit gegenüber - dem Einheitlicher Ansprechpartner Schleswig-Holstein, Reventlouallee - 6, 24105 Kiel widerrufen kann. Ein Widerruf ist aber nur wirksam für - die Zukunft. Verarbeitungen, die vor dem Widerruf erfolgt sind, sind - davon nicht betroffen. Über die Verarbeitung meiner personenbezogenen - Daten und die mir nach den datenschutzrechtlichen Regelungen - zustehenden Ansprüche und Rechte habe ich unter Datenschutzerklärung - Kenntnis erlangt.</b_datenschutz> - <b_missbrauch>* Mir ist bekannt, dass zur Verfolgung widerrechtlicher - Nutzung die Daten meines zur Dateneingabe genutzten Endgerätes - aufgezeichnet und verwendet werden können.</b_missbrauch> - <policyurl>http://wafmxpa002.dpaor.de/sh/datenschutz/datenschutzerklaerungEA_de.doc</policyurl> - </erklaerungen> - <logourl>http://wafmxpa002.dpaor.de/sh/logos/kopf_9068873.doc</logourl> - <fm> - <ansprechpartner> - <firmenname /> - <anrede>Herr</anrede> - <vorname>Max</vorname> - <familienname>Testermann</familienname> - <anschrift> - <strasse>Königsweg</strasse> - <hausnummer>74</hausnummer> - <postfach /> - <postleitzahl>24837</postleitzahl> - <ort>Schleswig</ort> - <ortsteil /> - <zusatz /> - <staat>Deutschland</staat> - </anschrift> - <kontakt> - <telefonnummer>+ 49 4621 9654</telefonnummer> - <mobilnummer>+49 123</mobilnummer> - <telefaxnummer>+ 49 4621 9654</telefaxnummer> - <emailadresse>max.testermann@gmx.de</emailadresse> - <demailadresse>max.testermann@gmx.de-mail.de</demailadresse> - </kontakt> - </ansprechpartner> - <verwaltungsleistungen> - <verwaltungsleistung> - <ausgewaehlte_zustaendigestelle> - <OrganisationseinheitenID>9535669</OrganisationseinheitenID> - <OrganisationseinheitenBEZEICHNUNG>Kreis - Schleswig-Flensburg/Kreisverwaltung - Allgemeine - Ordnungsangelegenheiten</OrganisationseinheitenBEZEICHNUNG> - </ausgewaehlte_zustaendigestelle> - <GebietID>9007314</GebietID> - <GebietBEZEICHNUNG>Schleswig</GebietBEZEICHNUNG> - <AnliegenID>8966671</AnliegenID> - <AnliegenBEZEICHNUNG>Waffenschein / Kleiner Waffenschein</AnliegenBEZEICHNUNG> - <leikaKEYLIST>99089008000000;99089008001000</leikaKEYLIST> - <leikaBEZEICHNUNG /> - </verwaltungsleistung> - </verwaltungsleistungen> - </fm> -</myForm> \ No newline at end of file diff --git a/intelliform-adapter/src/test/resources/intelliform/XML-Daten-complex.template.xml b/intelliform-adapter/src/test/resources/intelliform/XML-Daten-complex.template.xml deleted file mode 100644 index df72b46d6663a9dc61710d70e8a7135e9368bd67..0000000000000000000000000000000000000000 --- a/intelliform-adapter/src/test/resources/intelliform/XML-Daten-complex.template.xml +++ /dev/null @@ -1,316 +0,0 @@ -<myForm - xmlns:pdf="http://xmlns.cit.de/assistants/pdf" - xmlns:t="http://xmlns.cit.de/intelliform/transaction" - xmlns:u="http://xmlns.cit.de/intelliform/user" t:uuid="${uuid}" t:id="Gewerbeanmeldung-${transactionId}" t:timestamp="${now}" t:sender="stage.afm.schleswig-holstein.de" t:form="Gewerbeanmeldung" t:form-id="eGewerbe/eGewerbeAnmeldung" t:customer="Einheitlicher Ansprechpartner" t:customer-id="ea-sh" t:client="Schleswig-Holstein" t:client-id="land" u:FamilyNames="${antragsteller_nachname}" u:PrincipalType="Citizen" u:Username="${antragsteller_email}" u:CitizenProfileType="Standard" u:username="51522620-03d2-4507-b1f0-08d86920efed" u:GivenNames="${antragsteller_vorname}" u:AssuranceLevel="Low" u:displayName="${antragsteller_vorname} ${antragsteller_nachname}" u:mailAddress="${antragsteller_email}" u:EmailAddress="${antragsteller_email}" u:firstName="${antragsteller_vorname}" u:lastName="${antragsteller_nachname}" t:required-login-level="LOW" t:effective-login-level="LOW"> - <GueltigAb>2021-12-01</GueltigAb> - <GrundAnmeldungSchluessel>01</GrundAnmeldungSchluessel> - <antragsteller> - <pers_anrede>${antragsteller_anrede}$${anrede_code}</pers_anrede> - <pers_nachname>${antragsteller_nachname}</pers_nachname> - <pers_vorname>${antragsteller_vorname}</pers_vorname> - <pers_geburtsname>${antragsteller_nachname}</pers_geburtsname> - <pers_geburtsdatum>2000-01-01</pers_geburtsdatum> - <pers_geburtsort>Hamburg</pers_geburtsort> - <pers_geburtsland>deutsch$Deutschland$000</pers_geburtsland> - <pers_staatsangehoerigkeit>deutsch$Deutschland$000</pers_staatsangehoerigkeit> - <b_anrede>${antragsteller_anrede}</b_anrede> - <b_anrede_schluesselnr>03</b_anrede_schluesselnr> - <b_geburtsland>Deutschland</b_geburtsland> - <b_geburtsland_signatur>000</b_geburtsland_signatur> - <b_staatsangehoerigkeit>deutsch</b_staatsangehoerigkeit> - <b_staatsangehoerigkeit_signatur>000</b_staatsangehoerigkeit_signatur> - <sh_strasse>Teststrasse</sh_strasse> - <sh_hausnummer>1000</sh_hausnummer> - <sh_plz>23795</sh_plz> - <ort_auswahl>9007404$01060005</ort_auswahl> - <ort>Bad Segeberg</ort> - <GebietID>9007404</GebietID> - <GebietBEZEICHNUNG>Bad Segeberg</GebietBEZEICHNUNG> - <GebietGNR94_GNR>01060005</GebietGNR94_GNR> - <staat>000</staat> - <iso3166numerisch>276</iso3166numerisch> - <kont_telefonnummer/> - <kont_mobilnummer/> - <kont_telefaxnummer/> - <kont_email>${antragsteller_email}</kont_email> - <kont_demail/> - <persoenlicheEignung> - <maengelvorhanden>false</maengelvorhanden> - <ermittlungsverfahren>false</ermittlungsverfahren> - <MitgliedschaftInVerboternerVereinigung>false</MitgliedschaftInVerboternerVereinigung> - </persoenlicheEignung> - </antragsteller> - <AnliegenID>8938634</AnliegenID> - <nameid>51522620-03d2-4507-b1f0-08d86920efed</nameid> - <rest_response_name>[{"membercontext":"51522620-03d2-4507-b1f0-08d86920efed","memberscope":[{"tenant":"SH","mailboxguid":"6824d573-ff26-434d-81ae-2c36740e3cb4","mailboxname":"","mailboxdescription":"","mailboxtype":1,"guid":"00000000-0000-0000-0000-000000000000","id":8121155}]}]</rest_response_name> - <mailboxguid>6824d573-ff26-434d-81ae-2c36740e3cb4</mailboxguid> - <NiederlassungArt>1</NiederlassungArt> - <IstReisegewerbe>true</IstReisegewerbe> - <BetriebArtIndustrie>false</BetriebArtIndustrie> - <BetriebArtHandwerk>true</BetriebArtHandwerk> - <BetriebArtHandel>false</BetriebArtHandel> - <BetriebArtSonstiges>false</BetriebArtSonstiges> - <rechtsform>nicht eingetragenes Einzelunternehmen</rechtsform> - <rfm>180</rfm> - <registerart/> - <min2gesellschafter>false</min2gesellschafter> - <gesetzlichervertreter>Inhaber</gesetzlichervertreter> - <Betrieb> - <ID>577575</ID> - <geschaeftsbezeichnung>Test</geschaeftsbezeichnung> - <EintragungPLZ/> - <EintragungOrt/> - <GerichtSchluessel/> - </Betrieb> - <sh_strasse>Hauptstraße</sh_strasse> - <sh_zusatz>oben links</sh_zusatz> - <sh_hausnummer>10</sh_hausnummer> - <sh_plz>24534</sh_plz> - <ort_auswahl>9006404$01004000</ort_auswahl> - <sh_ortsteil>Einfeld</sh_ortsteil> - <ort>Neumünster</ort> - <GebietID>9006404</GebietID> - <GebietBEZEICHNUNG>Neumünster</GebietBEZEICHNUNG> - <GebietGNR94_GNR>01004000</GebietGNR94_GNR> - <staat>000</staat> - <iso3166numerisch>276</iso3166numerisch> - <kont_telefonnummer>01234/332211</kont_telefonnummer> - <kont_telefaxnummer>01234/112233</kont_telefaxnummer> - <kont_email>${antragsteller_email}</kont_email> - <kont_demail>ea-poststelle@ea-sh.de-mail.de</kont_demail> - <kont_homepage>www.meineHomepage.de</kont_homepage> - <b_kont_vorwahl_telefon>01234</b_kont_vorwahl_telefon> - <b_kont_telefon>332211</b_kont_telefon> - <b_kont_vorwahl_telefax>01234</b_kont_vorwahl_telefax> - <b_kont_telefax>112233</b_kont_telefax> - <TaetigkeitenGesamt> - <TaetigkeitenGesamt-item> - <auswahl_oberbegriff>C</auswahl_oberbegriff> - <auswahl_kategorie>10</auswahl_kategorie> - <check_taetigkeitsschwerpunkt>true</check_taetigkeitsschwerpunkt> - <a_taetigkeit>ausgewählte Tätigkeit</a_taetigkeit> - <b_oberbegriff>C Verarbeitendes Gewerbe</b_oberbegriff> - <b_kategorie>10 Herstellung von Nahrungs- und Futtermitteln</b_kategorie> - <b_unterklasse>10.12.0 Schlachten von Geflügel</b_unterklasse> - <b_unterklasse_schluessel>10.12.0</b_unterklasse_schluessel> - <b_inkl>- Betrieb von Schlachthäusern, in denen Geflügel geschlachtet, zugerichtet und verpackt wird - Herstellung von frischem oder gefrorenem Geflügelfleisch in Einzelportionen - Auslassen von Geflügelfetten - Gewinnung von Federn und Daunen</b_inkl> - </TaetigkeitenGesamt-item> - <TaetigkeitenGesamt-item> - <auswahl_oberbegriff>D</auswahl_oberbegriff> - <auswahl_kategorie>35</auswahl_kategorie> - <check_taetigkeitsschwerpunkt>false</check_taetigkeitsschwerpunkt> - <a_taetigkeit>ausgewählte Tätigkeit 2</a_taetigkeit> - <b_oberbegriff>D Energieversorgung</b_oberbegriff> - <b_kategorie>35 Energieversorgung</b_kategorie> - <b_unterklasse>35.11.1 Elektrizitätserzeugung ohne Verteilung</b_unterklasse> - <b_unterklasse_schluessel>35.11.1</b_unterklasse_schluessel> - <b_inkl/> - </TaetigkeitenGesamt-item> - </TaetigkeitenGesamt> - <IstNebenerwerb>true</IstNebenerwerb> - <AnzahlVollzeitBeschaeftigte>3</AnzahlVollzeitBeschaeftigte> - <AnzahlTeilzeitBeschaeftigte>3</AnzahlTeilzeitBeschaeftigte> - <BeteiligtePerson> - <BeteiligtePerson-item> - <personFunktion>1</personFunktion> - <personFunktionText>Einzelgewerbetreibender</personFunktionText> - <doktorgradSchluessel>01</doktorgradSchluessel> - <doktorgrad>Prof.</doktorgrad> - <familienname>${antragsteller_nachname}</familienname> - <vorname>Test</vorname> - <geschlechtText>weiblich</geschlechtText> - <geschlecht>2</geschlecht> - <geburtsname>Geburtsname</geburtsname> - <geburtsdatum>2000-01-01</geburtsdatum> - <geburtsort>Bremen</geburtsort> - <geburtsland>Deutschland</geburtsland> - <geburtslandSchluesel>000</geburtslandSchluesel> - <staatsangehoerigkeit>deutsch</staatsangehoerigkeit> - <staatsangehoerigkeitSchluessel>000</staatsangehoerigkeitSchluessel> - <adr_strasse>Hauptstraße</adr_strasse> - <adr_zusatz>oben links</adr_zusatz> - <adr_hausnummer>10</adr_hausnummer> - <adr_plz>24534</adr_plz> - <adr_ort>Neumünster</adr_ort> - <adr_ortsteil>Einfeld</adr_ortsteil> - <adr_land>Deutschland$DE$DEU$276$.de</adr_land> - <b_adr_numerisch>276</b_adr_numerisch> - <b_adr_land>Deutschland</b_adr_land> - <b_adr_alpha2>DE</b_adr_alpha2> - <b_adr_alpha3>DEU</b_adr_alpha3> - <b_adr_domain>.de</b_adr_domain> - <kont_telefonnummer>01234/332211</kont_telefonnummer> - <kont_telefaxnummer>01234/112233</kont_telefaxnummer> - <kont_email>${antragsteller_email}</kont_email> - <kont_demail>ea-poststelle@ea-sh.de-mail.de</kont_demail> - <kont_homepage>www.meineHomepage.de</kont_homepage> - <b_kont_vorwahl_telefon>01234</b_kont_vorwahl_telefon> - <b_kont_telefon>332211</b_kont_telefon> - <b_kont_vorwahl_telefax>01234</b_kont_vorwahl_telefax> - <b_kont_telefax>112233</b_kont_telefax> - <Status_Erlaubnis>1</Status_Erlaubnis> - <b_Erlaubnis>Liegt vor</b_Erlaubnis> - <Status_Handwerkskarte>1</Status_Handwerkskarte> - <b_Handwerkskarte>Liegt vor</b_Handwerkskarte> - <Erlaubnis> - <AusgestelltAm>2021-10-25</AusgestelltAm> - <AusgestelltVonName>Handwerkskammer</AusgestelltVonName> - <AusgestelltVonPLZ>12334</AusgestelltVonPLZ> - <AusgestelltVonOrt>Woklenkuckucksheim</AusgestelltVonOrt> - <datei_erlaubnisvorbehalt> - <datei_erlaubnisvorbehalt-item> - <file content-type="application/vnd.openxmlformats-officedocument.wordprocessingml.document" description="" id="${fileid-docx1}" length="16242">Erlaubnis.docx</file> - </datei_erlaubnisvorbehalt-item> - </datei_erlaubnisvorbehalt> - </Erlaubnis> - <handwerkskarte> - <ausgestelltAm>2000-06-06</ausgestelltAm> - <ausgestelltVonSchluessel>00033</ausgestelltVonSchluessel> - <ausgestelltVonName>Aachen</ausgestelltVonName> - <datei_handwerkskarte> - <datei_handwerkskarte-item> - <file content-type="application/pdf" description="" id="${fileid-pdf1}" length="185763">Handwerkskarte.pdf</file> - </datei_handwerkskarte-item> - <datei_handwerkskarte-item> - <file content-type="application/vnd.openxmlformats-officedocument.wordprocessingml.document" description="" id="${fileid-docx2}" length="16230">Handwerkskarte.docx</file> - </datei_handwerkskarte-item> - </datei_handwerkskarte> - </handwerkskarte> - </BeteiligtePerson-item> - </BeteiligtePerson> - <datei_ausweis> - <datei_ausweis-item> - <file content-type="application/vnd.openxmlformats-officedocument.wordprocessingml.document" description="" id="${fileid-docx3}" length="16280">Anlagen2.docx</file> - </datei_ausweis-item> - <datei_ausweis-item> - <file content-type="application/vnd.openxmlformats-officedocument.wordprocessingml.document" description="" id="${fileid-docx4}" length="16249">Anlagen.docx</file> - </datei_ausweis-item> - </datei_ausweis> - <datei_meldebestaetigung> - <datei_meldebestaetigung-item> - <file content-type="application/vnd.openxmlformats-officedocument.wordprocessingml.document" description="" id="${fileid-docx5}" length="16273">Meldebestätigung.docx</file> - </datei_meldebestaetigung-item> - <datei_meldebestaetigung-item> - <file content-type="application/vnd.openxmlformats-officedocument.wordprocessingml.document" description="" id="${fileid-docx6}" length="16296">Meldebestätigung2.docx</file> - </datei_meldebestaetigung-item> - </datei_meldebestaetigung> - <datei_sonstiges> - <datei_sonstiges-item> - <file content-type="application/vnd.openxmlformats-officedocument.wordprocessingml.document" description="" id="${fileid-docx7}" length="16268">Sonstiges.docx</file> - </datei_sonstiges-item> - <datei_sonstiges-item> - <file content-type="application/vnd.openxmlformats-officedocument.wordprocessingml.document" description="" id="${fileid-docx8}" length="16292">Sonstiges2.docx</file> - </datei_sonstiges-item> - <datei_sonstiges-item> - <file content-type="application/pdf" description="" id="${fileid-pdf2}" length="187585">Anlage Vollmacht.pdf</file> - </datei_sonstiges-item> - <datei_sonstiges-item> - <file content-type="application/vnd.oasis.opendocument.text" description="" id="${fileid-odt1}" length="4799">Anlagen1.odt</file> - </datei_sonstiges-item> - <datei_sonstiges-item> - <file content-type="image/jpeg" description="" id="${fileid-jpg1}" length="10129">win.jpg</file> - </datei_sonstiges-item> - <datei_sonstiges-item> - <file content-type="image/png" description="" id="${fileid-png1}" length="50959">win.png</file> - </datei_sonstiges-item> - </datei_sonstiges> - <KontaktsystemTypA>233034600</KontaktsystemTypA> - <KontaktsystemTypB>233034601</KontaktsystemTypB> - <zustaendigestelle> - <OrganisationseinheitenAuswahl>244406514</OrganisationseinheitenAuswahl> - <OrganisationseinheitenID>${oeid}</OrganisationseinheitenID> - <OrganisationseinheitenBEZEICHNUNG>Ordnungsaufgaben, Wahlen, Gewerbeangelegenheiten der Stadt Neumünster</OrganisationseinheitenBEZEICHNUNG> - <strasse>Großflecken</strasse> - <hausnummer>63</hausnummer> - <postleitzahl>24534</postleitzahl> - <ortID>9006404</ortID> - <ort>Neumünster</ort> - <telefonnummer>+49 4321 942-0</telefonnummer> - <telefaxnummer>+49 4321 942-2521</telefaxnummer> - <emailadresse>ordnungsangelegenheiten@neumuenster.de</emailadresse> - <demailadresse/> - <AnliegenBEZEICHNUNG>Gewerbeanmeldung, Elektronische Gewerbeanzeige</AnliegenBEZEICHNUNG> - <leikaKEYLIST>99050012104000</leikaKEYLIST> - <kontaktsystem_kennung/> - <kontaktsystem_kennungzusatz/> - </zustaendigestelle> - <empfangendestelle> - <OrganisationseinheitenAuswahl>9068873</OrganisationseinheitenAuswahl> - <OrganisationseinheitenID>9068873</OrganisationseinheitenID> - <OrganisationseinheitenBEZEICHNUNG>Einheitlicher Ansprechpartner Schleswig-Holstein</OrganisationseinheitenBEZEICHNUNG> - <strasse>Reventlouallee</strasse> - <hausnummer>6</hausnummer> - <postleitzahl>24105</postleitzahl> - <ortID>9006402</ortID> - <ort>Kiel</ort> - <telefonnummer>+49 431 988-8650</telefonnummer> - <telefaxnummer>+49 431 988-6161111</telefaxnummer> - <emailadresse>info@ea-sh.de</emailadresse> - <demailadresse>ea-poststelle@ea-sh.de-mail.de</demailadresse> - <od_vorhanden>true</od_vorhanden> - <od_typid>233034600</od_typid> - <od_kennung>afmsh:9068873_AusnahmeLKWFahrverbot</od_kennung> - <od_zustellung_mail/> - <od_zustellung_nb>afmsh:9068873_AusnahmeLKWFahrverbot</od_zustellung_nb> - <od_zustellung_webservice/> - <od_kennungzusatz/> - <kontaktsystem_kennung>afmsh:9068873_AusnahmeLKWFahrverbot</kontaktsystem_kennung> - <kontaktsystem_kennungzusatz>alle</kontaktsystem_kennungzusatz> - </empfangendestelle> - <erklaerungen> - <check_gebuehren>true</check_gebuehren> - <check_richtigkeit>true</check_richtigkeit> - <check_datenschutz>true</check_datenschutz> - <check_missbrauch>true</check_missbrauch> - <check_hinweis>true</check_hinweis> - <b_gebuehren_beschriftung>* Die Gewerbeanmeldung ist kostenpflichtig. Die Höhe der Gebühren bemisst sich nach der Landesverordnung über Verwaltungsgebühren (Allgemeiner Gebührentarif) Tarifstelle 11.1.1 - VwGebV. Genaue Auskünfte hierzu erteilt das zuständige Gewerbeamt.</b_gebuehren_beschriftung> - <b_gebuehren_intro/> - <b_richtigkeit>* Ich bestätige die Richtigkeit meiner Angaben.</b_richtigkeit> - <b_datenschutz>* Ich erkläre mich damit einverstanden, dass der Einheitlicher Ansprechpartner Schleswig-Holstein zur Erfüllung seiner Aufgaben meine Daten unter Einhaltung der Bestimmungen der Datenschutz-Grundverordnung (DS-GVO) und des Landesdatenschutzgesetzes Schleswig-Holstein (LDSG-SH) speichert, verarbeitet und diese im Rahmen der gesetzlichen Bestimmungen an die für die Entscheidung zuständige Stelle weiterleitet. Ebenso bin ich mit der rechtskonformen Datenverarbeitung und Speicherung durch die zuständige Stelle einverstanden. Mir ist bekannt, dass ich die Einwilligung in die Verarbeitung und Übermittlung jederzeit gegenüber dem Einheitlicher Ansprechpartner Schleswig-Holstein, Reventlouallee 6, 24105 Kiel widerrufen kann. Ein Widerruf ist aber nur wirksam für die Zukunft. Verarbeitungen, die vor dem Widerruf erfolgt sind, sind davon nicht betroffen. Über die Verarbeitung meiner personenbezogenen Daten und die mir nach den datenschutzrechtlichen Regelungen zustehenden Ansprüche und Rechte habe ich unter Datenschutzerklärung Kenntnis erlangt.</b_datenschutz> - <b_missbrauch>* Mir ist bekannt, dass zur Verfolgung widerrechtlicher Nutzung die Daten meines zur Dateneingabe genutzten Endgerätes aufgezeichnet und verwendet werden können.</b_missbrauch> - <b_hinweis_beschriftung>* Diese Anzeige berechtigt nicht zum Beginn des Gewerbebetriebes, wenn noch eine Erlaubnis oder eine Eintragung in die Handwerksrolle notwendig ist. Zuwiderhandlungen können mit Geldbuße oder Geldstrafe oder Freiheitsstrafe geahndet werden. Diese Anzeige ist keine Genehmigung zur Errichtung einer Betriebsstätte entsprechend dem Planungs- und Baurecht.</b_hinweis_beschriftung> - <b_hinweis_intro>Hinweis</b_hinweis_intro> - <policyurl>http://wafmxqa002.dpaor.de/sh/datenschutz/datenschutzerklaerungEA_de.doc</policyurl> - </erklaerungen> - <b_timestamp>20211206093513</b_timestamp> - <logourl>http://wafmxqa002.dpaor.de/sh/logos/kopf_9068873.doc</logourl> - <fm> - <ansprechpartner> - <firmenname/> - <anrede>${antragsteller_anrede}</anrede> - <vorname>${antragsteller_vorname}</vorname> - <familienname>${antragsteller_nachname}</familienname> - <anschrift> - <strasse>Hauptstraße</strasse> - <hausnummer>10</hausnummer> - <postfach/> - <postleitzahl>24534</postleitzahl> - <ort>Neumünster</ort> - <ortsteil>Einfeld</ortsteil> - <zusatz>oben links</zusatz> - <staat>Deutschland</staat> - </anschrift> - <kontakt> - <telefonnummer>01234/332211</telefonnummer> - <mobilnummer/> - <telefaxnummer>01234/112233</telefaxnummer> - <emailadresse>${antragsteller_email}</emailadresse> - <demailadresse>ea-poststelle@ea-sh.de-mail.de</demailadresse> - </kontakt> - </ansprechpartner> - <verwaltungsleistungen> - <verwaltungsleistung> - <ausgewaehlte_zustaendigestelle> - <OrganisationseinheitenID>10363455</OrganisationseinheitenID> - <OrganisationseinheitenBEZEICHNUNG>Ordnungsaufgaben, Wahlen, Gewerbeangelegenheiten der Stadt Neumünster</OrganisationseinheitenBEZEICHNUNG> - </ausgewaehlte_zustaendigestelle> - <GebietID>9006404</GebietID> - <GebietBEZEICHNUNG>Neumünster</GebietBEZEICHNUNG> - <AnliegenID>8938634</AnliegenID> - <AnliegenBEZEICHNUNG>Gewerbeanmeldung, Elektronische Gewerbeanzeige</AnliegenBEZEICHNUNG> - <leikaKEYLIST>99050012104000</leikaKEYLIST> - <leikaBEZEICHNUNG/> - </verwaltungsleistung> - </verwaltungsleistungen> - </fm> -</myForm> diff --git a/intelliform-adapter/src/test/resources/intelliform/soaprequest-deposit.xml b/intelliform-adapter/src/test/resources/intelliform/soaprequest-deposit.xml deleted file mode 100644 index ea2899502926008f36c977ed2c10c8be81f1aba1..0000000000000000000000000000000000000000 --- a/intelliform-adapter/src/test/resources/intelliform/soaprequest-deposit.xml +++ /dev/null @@ -1,210 +0,0 @@ -<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:bac="http://xmlns.cit.de/intelliform/2009/webservices/backend"> - <soapenv:Header/> - <soapenv:Body> - <bac:deposit> - <!--Optional:--> - <data> - <!--Zero or more repetitions:--> - <attachments> - <!--Zero or more repetitions:--> - <attributes> - <!--Optional:--> - <key>?</key> - <!--Optional:--> - <value>?</value> - </attributes> - <!--Optional:--> - <content> - PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjxteUZvcm0geG1sbnM6cGRm -PSJodHRwOi8veG1sbnMuY2l0LmRlL2Fzc2lzdGFudHMvcGRmIg0KCXhtbG5zOnQ9Imh0dHA6Ly94 -bWxucy5jaXQuZGUvaW50ZWxsaWZvcm0vdHJhbnNhY3Rpb24iDQoJdDppZD0iMjAyMDExMTgzNjU2 -NzA4NjYxMDEiIHQ6dGltZXN0YW1wPSIyMDIwLTExLTE4VDA5OjA5OjI3LjYyN1oiDQoJdDpzZW5k -ZXI9ImFmbS5zY2hsZXN3aWctaG9sc3RlaW4uZGUiDQoJdDpmb3JtPSJLbGVpbmVyIFdhZmZlbnNj -aGVpbiBnZW0uIMKnIDEwIEFicy4gNCBTYXR6IDQgV2FmZmVuZ2VzZXR6IChXYWZmRykiDQoJdDpm -b3JtLWlkPSJ3YWZmZW4va2xlaW5lcldhZmZlbnNjaGVpbiINCgl0OmN1c3RvbWVyPSJFaW5oZWl0 -bGljaGVyIEFuc3ByZWNocGFydG5lciIgdDpjdXN0b21lci1pZD0iZWEtc2giDQoJdDpjbGllbnQ9 -IlNjaGxlc3dpZy1Ib2xzdGVpbiIgdDpjbGllbnQtaWQ9ImxhbmQiPg0KCTxrb250YWt0c3lzdGVt -dHlwaWQ+MjMzMDM0NjAwPC9rb250YWt0c3lzdGVtdHlwaWQ+DQoJPGtvbnRha3RzeXN0ZW10eXBp -ZGxuPjIzMzAzNDYwMTwva29udGFrdHN5c3RlbXR5cGlkbG4+DQoJPEFubGllZ2VuSUQ+ODk2NjY3 -MTwvQW5saWVnZW5JRD4NCgk8YW50cmFnc3RlbGxlcj4NCgkJPHBlcnNfYW5yZWRlPkhlcnIkMDM8 -L3BlcnNfYW5yZWRlPg0KCQk8cGVyc19uYWNobmFtZT5UZXN0ZXJtYW5uPC9wZXJzX25hY2huYW1l -Pg0KCQk8cGVyc192b3JuYW1lPk1heDwvcGVyc192b3JuYW1lPg0KCQk8cGVyc19nZWJ1cnRzbmFt -ZT5NYXggVGVzdGVybWFubjwvcGVyc19nZWJ1cnRzbmFtZT4NCgkJPHBlcnNfZ2VidXJ0c2RhdHVt -PjE5OTUtMDMtMjE8L3BlcnNfZ2VidXJ0c2RhdHVtPg0KCQk8cGVyc19nZWJ1cnRzb3J0PkZsZW5z -YnVyZzwvcGVyc19nZWJ1cnRzb3J0Pg0KCQk8cGVyc19nZWJ1cnRzbGFuZD5kZXV0c2NoJERldXRz -Y2hsYW5kJDAwMDwvcGVyc19nZWJ1cnRzbGFuZD4NCgkJPHBlcnNfc3RhYXRzYW5nZWhvZXJpZ2tl -aXQ+ZGV1dHNjaCREZXV0c2NobGFuZCQwMDA8L3BlcnNfc3RhYXRzYW5nZWhvZXJpZ2tlaXQ+DQoJ -CTxiX2FucmVkZT5IZXJyPC9iX2FucmVkZT4NCgkJPGJfYW5yZWRlX3NjaGx1ZXNzZWxucj4wMzwv -Yl9hbnJlZGVfc2NobHVlc3NlbG5yPg0KCQk8Yl9nZWJ1cnRzbGFuZD5EZXV0c2NobGFuZDwvYl9n -ZWJ1cnRzbGFuZD4NCgkJPGJfZ2VidXJ0c2xhbmRfc2lnbmF0dXI+MDAwPC9iX2dlYnVydHNsYW5k -X3NpZ25hdHVyPg0KCQk8Yl9zdGFhdHNhbmdlaG9lcmlna2VpdD5kZXV0c2NoPC9iX3N0YWF0c2Fu -Z2Vob2VyaWdrZWl0Pg0KCQk8Yl9zdGFhdHNhbmdlaG9lcmlna2VpdF9zaWduYXR1cj4wMDA8L2Jf -c3RhYXRzYW5nZWhvZXJpZ2tlaXRfc2lnbmF0dXI+DQoJCTxzaF9zdHJhc3NlPkvDtm5pZ3N3ZWc8 -L3NoX3N0cmFzc2U+DQoJCTxzaF9oYXVzbnVtbWVyPjc0PC9zaF9oYXVzbnVtbWVyPg0KCQk8c2hf -cGx6PjI0ODM3PC9zaF9wbHo+DQoJCTxvcnRfYXVzd2FobD45MDA3MzE0JDAxMDU5MDc1PC9vcnRf -YXVzd2FobD4NCgkJPG9ydD5TY2hsZXN3aWc8L29ydD4NCgkJPEdlYmlldElEPjkwMDczMTQ8L0dl -YmlldElEPg0KCQk8R2ViaWV0QkVaRUlDSE5VTkc+U2NobGVzd2lnPC9HZWJpZXRCRVpFSUNITlVO -Rz4NCgkJPEdlYmlldEdOUjk0X0dOUj4wMTA1OTA3NTwvR2ViaWV0R05SOTRfR05SPg0KCQk8c3Rh -YXQ+MDAwPC9zdGFhdD4NCgkJPGlzbzMxNjZudW1lcmlzY2g+Mjc2PC9pc28zMTY2bnVtZXJpc2No -Pg0KCQk8a29udF90ZWxlZm9ubnVtbWVyPisgNDkgNDYyMSA5NjU0PC9rb250X3RlbGVmb25udW1t -ZXI+DQoJCTxrb250X21vYmlsbnVtbWVyPis0OSAxMjM8L2tvbnRfbW9iaWxudW1tZXI+DQoJCTxr -b250X3RlbGVmYXhudW1tZXI+KyA0OSA0NjIxIDk2NTQ8L2tvbnRfdGVsZWZheG51bW1lcj4NCgkJ -PGtvbnRfZW1haWw+bWF4LnRlc3Rlcm1hbm5AZ214LmRlPC9rb250X2VtYWlsPg0KCQk8a29udF9k -ZW1haWw+bWF4LnRlc3Rlcm1hbm5AZ214LmRlLW1haWwuZGU8L2tvbnRfZGVtYWlsPg0KCQk8cGVy -c29lbmxpY2hlRWlnbnVuZz4NCgkJCTxtYWVuZ2Vsdm9yaGFuZGVuPmZhbHNlPC9tYWVuZ2Vsdm9y -aGFuZGVuPg0KCQkJPGVybWl0dGx1bmdzdmVyZmFocmVuPmZhbHNlPC9lcm1pdHRsdW5nc3ZlcmZh -aHJlbj4NCgkJCTxNaXRnbGllZHNjaGFmdEluVmVyYm90ZXJuZXJWZXJlaW5pZ3VuZz5mYWxzZTwv -TWl0Z2xpZWRzY2hhZnRJblZlcmJvdGVybmVyVmVyZWluaWd1bmc+DQoJCTwvcGVyc29lbmxpY2hl -RWlnbnVuZz4NCgk8L2FudHJhZ3N0ZWxsZXI+DQoJPEdlYmlldElEPjkwMDczMTQ8L0dlYmlldElE -Pg0KCTx6dXN0YWVuZGlnZXN0ZWxsZT4NCgkJPE9yZ2FuaXNhdGlvbnNlaW5oZWl0ZW5BdXN3YWhs -Pjk1MzU2Njk8L09yZ2FuaXNhdGlvbnNlaW5oZWl0ZW5BdXN3YWhsPg0KCQk8T3JnYW5pc2F0aW9u -c2VpbmhlaXRlbklEPjk1MzU2Njk8L09yZ2FuaXNhdGlvbnNlaW5oZWl0ZW5JRD4NCgkJPE9yZ2Fu -aXNhdGlvbnNlaW5oZWl0ZW5CRVpFSUNITlVORz5LcmVpcw0KCQkJU2NobGVzd2lnLUZsZW5zYnVy -Zy9LcmVpc3ZlcndhbHR1bmcgLSBBbGxnZW1laW5lDQoJCQlPcmRudW5nc2FuZ2VsZWdlbmhlaXRl -bjwvT3JnYW5pc2F0aW9uc2VpbmhlaXRlbkJFWkVJQ0hOVU5HPg0KCQk8c3RyYXNzZT5GbGVuc2J1 -cmdlciBTdHJhw59lPC9zdHJhc3NlPg0KCQk8aGF1c251bW1lcj43PC9oYXVzbnVtbWVyPg0KCQk8 -cG9zdGxlaXR6YWhsPjI0ODM3PC9wb3N0bGVpdHphaGw+DQoJCTxvcnRJRD45MDA3MzE0PC9vcnRJ -RD4NCgkJPG9ydD5TY2hsZXN3aWc8L29ydD4NCgkJPHRlbGVmb25udW1tZXI+MDQ2MjEgODctMDwv -dGVsZWZvbm51bW1lcj4NCgkJPHRlbGVmYXhudW1tZXI+MDQ2MjEgODctMzY2PC90ZWxlZmF4bnVt -bWVyPg0KCQk8ZW1haWxhZHJlc3NlIC8+DQoJCTxkZW1haWxhZHJlc3NlIC8+DQoJCTxrb250YWt0 -c3lzdGVtX2tlbm51bmc+YWZtc2g6OTUzNTY2OV9rbGVpbmVyV2FmZmVuc2NoZWluPC9rb250YWt0 -c3lzdGVtX2tlbm51bmc+DQoJCTxrb250YWt0c3lzdGVtX2tlbm51bmd6dXNhdHogLz4NCgkJPEFu -bGllZ2VuQkVaRUlDSE5VTkc+V2FmZmVuc2NoZWluIC8gS2xlaW5lciBXYWZmZW5zY2hlaW48L0Fu -bGllZ2VuQkVaRUlDSE5VTkc+DQoJCTxsZWlrYUtFWUxJU1Q+OTkwODkwMDgwMDAwMDA7OTkwODkw -MDgwMDEwMDA8L2xlaWthS0VZTElTVD4NCgkJPGF1c3dhaGxfenVzdGVsbHVuZz5hYmhvbGVuPC9h -dXN3YWhsX3p1c3RlbGx1bmc+DQoJCTxiX3p1c3RlbGx1bmc+SWNoIGhvbGUgZGVuIEtsZWluZW4g -V2FmZmVuc2NoZWluIHNlbGJzdCBhYi48L2JfenVzdGVsbHVuZz4NCgk8L3p1c3RhZW5kaWdlc3Rl -bGxlPg0KCTxlbXBmYW5nZW5kZXN0ZWxsZT4NCgkJPE9yZ2FuaXNhdGlvbnNlaW5oZWl0ZW5BdXN3 -YWhsPjkwNjg4NzM8L09yZ2FuaXNhdGlvbnNlaW5oZWl0ZW5BdXN3YWhsPg0KCQk8T3JnYW5pc2F0 -aW9uc2VpbmhlaXRlbklEPjkwNjg4NzM8L09yZ2FuaXNhdGlvbnNlaW5oZWl0ZW5JRD4NCgkJPE9y -Z2FuaXNhdGlvbnNlaW5oZWl0ZW5CRVpFSUNITlVORz5FaW5oZWl0bGljaGVyIEFuc3ByZWNocGFy -dG5lcg0KCQkJU2NobGVzd2lnLUhvbHN0ZWluPC9PcmdhbmlzYXRpb25zZWluaGVpdGVuQkVaRUlD -SE5VTkc+DQoJCTxzdHJhc3NlPlJldmVudGxvdWFsbGVlPC9zdHJhc3NlPg0KCQk8aGF1c251bW1l -cj42PC9oYXVzbnVtbWVyPg0KCQk8cG9zdGxlaXR6YWhsPjI0MTA1PC9wb3N0bGVpdHphaGw+DQoJ -CTxvcnRJRD45MDA2NDAyPC9vcnRJRD4NCgkJPG9ydD5LaWVsPC9vcnQ+DQoJCTx0ZWxlZm9ubnVt -bWVyPis0OSA0MzEgOTg4LTg2NTA8L3RlbGVmb25udW1tZXI+DQoJCTx0ZWxlZmF4bnVtbWVyPis0 -OSA0MzEgOTg4LTYxNjExMTE8L3RlbGVmYXhudW1tZXI+DQoJCTxlbWFpbGFkcmVzc2U+aW5mb0Bl -YS1zaC5kZTwvZW1haWxhZHJlc3NlPg0KCQk8ZGVtYWlsYWRyZXNzZT5lYS1wb3N0c3RlbGxlQGVh -LXNoLmRlLW1haWwuZGU8L2RlbWFpbGFkcmVzc2U+DQoJCTxrb250YWt0c3lzdGVtX2tlbm51bmc+ -YWZtc2g6OTA2ODg3M19BdXNuYWhtZUxLV0ZhaHJ2ZXJib3Q8L2tvbnRha3RzeXN0ZW1fa2VubnVu -Zz4NCgkJPGtvbnRha3RzeXN0ZW1fa2VubnVuZ3p1c2F0ej5hbGxlPC9rb250YWt0c3lzdGVtX2tl -bm51bmd6dXNhdHo+DQoJPC9lbXBmYW5nZW5kZXN0ZWxsZT4NCgk8ZXJrbGFlcnVuZ2VuPg0KCQk8 -Y2hlY2tfZ2VidWVocmVuPnRydWU8L2NoZWNrX2dlYnVlaHJlbj4NCgkJPGNoZWNrX3JpY2h0aWdr -ZWl0PnRydWU8L2NoZWNrX3JpY2h0aWdrZWl0Pg0KCQk8Y2hlY2tfZGF0ZW5zY2h1dHo+dHJ1ZTwv -Y2hlY2tfZGF0ZW5zY2h1dHo+DQoJCTxjaGVja19taXNzYnJhdWNoPnRydWU8L2NoZWNrX21pc3Ni -cmF1Y2g+DQoJCTxiX2dlYnVlaHJlbl9iZXNjaHJpZnR1bmc+KiBNaXIgaXN0IGJla2FubnQsIGRh -c3MgZHVyY2ggZGFzIEVpbnJlaWNoZW4NCgkJCWRlcyBlbGVrdHJvbmlzY2hlbiBBbnRyYWdlcyB2 -b24gZGVyIHp1c3TDpG5kaWdlbiBTdGVsbGUgR2Viw7xocmVuDQoJCQllcmhvYmVuIHdlcmRlbiBr -w7ZubmVuLjwvYl9nZWJ1ZWhyZW5fYmVzY2hyaWZ0dW5nPg0KCQk8Yl9nZWJ1ZWhyZW5faW50cm8+ -R2Viw7xociBiZWkgQXVzc3RlbGx1bmcgZGVzIGtsZWluZW4gV2FmZmVuc2NoZWluczoNCgkJCTYw -LDAwIEV1cm8uIEJlYXJiZWl0dW5nc2dlYsO8aHIgYmVpIFZlcnNhZ3VuZzogNDUsMDAgRXVyby4N -CgkJCVNpZSBzaW5kIGdlbcOkw58gwqcgMzkgV2FmZkcgdmVycGZsaWNodGV0LCBkZXIgenVzdMOk -bmRpZ2VuIEJlaMO2cmRlIGRpZSB6dXINCgkJCUR1cmNoZsO8aHJ1bmcgZGVzIEdlc2V0emVzIGVy -Zm9yZGVybGljaGVuIEF1c2vDvG5mdGUgenUgZXJ0ZWlsZW4uIFp1cg0KCQkJUHLDvGZ1bmcgSWhy -ZXIgd2FmZmVucmVjaHRsaWNoZW4gWnV2ZXJsw6Rzc2lna2VpdCB1bmQgRWlnbnVuZyBob2x0IGRp -ZQ0KCQkJQmVow7ZyZGUgZWluZSB1bmJlc2NocsOkbmt0ZSBBdXNrdW5mdCBhdXMgZGVtIEJ1bmRl -c3plbnRyYWxyZWdpc3RlciwNCgkJCWVpbmUgQXVza3VuZnQgYXVzIGRlbSB6ZW50cmFsZW4gc3Rh -YXRzYW53YWx0c2NoYWZ0bGljaGVuDQoJCQlWZXJmYWhyZW5zcmVnaXN0ZXIsIGVpbmUgU3RlbGx1 -bmduYWhtZSBkZXIgw7ZydGxpY2hlbg0KCQkJUG9saXplaWRpZW5zdHN0ZWxsZSB1bmQgSWhyZXIg -V29obnNpdHpnZW1laW5kZSBlaW4uPC9iX2dlYnVlaHJlbl9pbnRybz4NCgkJPGJfcmljaHRpZ2tl -aXQ+KiBJY2ggYmVzdMOkdGlnZSBkaWUgUmljaHRpZ2tlaXQgbWVpbmVyIEFuZ2FiZW4uPC9iX3Jp -Y2h0aWdrZWl0Pg0KCQk8Yl9kYXRlbnNjaHV0ej4qIEljaCBlcmtsw6RyZSBtaWNoIGRhbWl0IGVp -bnZlcnN0YW5kZW4sIGRhc3MgZGVyDQoJCQlFaW5oZWl0bGljaGVyIEFuc3ByZWNocGFydG5lciBT -Y2hsZXN3aWctSG9sc3RlaW4genVyIEVyZsO8bGx1bmcgc2VpbmVyDQoJCQlBdWZnYWJlbiBtZWlu -ZSBEYXRlbiB1bnRlciBFaW5oYWx0dW5nIGRlciBCZXN0aW1tdW5nZW4gZGVyDQoJCQlEYXRlbnNj -aHV0ei1HcnVuZHZlcm9yZG51bmcgKERTLUdWTykgdW5kIGRlcw0KCQkJTGFuZGVzZGF0ZW5zY2h1 -dHpnZXNldHplcyBTY2hsZXN3aWctSG9sc3RlaW4gKExEU0ctU0gpIHNwZWljaGVydCwNCgkJCXZl -cmFyYmVpdGV0IHVuZCBkaWVzZSBpbSBSYWhtZW4gZGVyIGdlc2V0emxpY2hlbiBCZXN0aW1tdW5n -ZW4gYW4gZGllDQoJCQlmw7xyIGRpZSBFbnRzY2hlaWR1bmcgenVzdMOkbmRpZ2UgU3RlbGxlIHdl -aXRlcmxlaXRldC4gRWJlbnNvIGJpbiBpY2gNCgkJCW1pdCBkZXIgcmVjaHRza29uZm9ybWVuIERh -dGVudmVyYXJiZWl0dW5nIHVuZCBTcGVpY2hlcnVuZyBkdXJjaCBkaWUNCgkJCXp1c3TDpG5kaWdl -IFN0ZWxsZSBlaW52ZXJzdGFuZGVuLiBNaXIgaXN0IGJla2FubnQsIGRhc3MgaWNoIGRpZQ0KCQkJ -RWlud2lsbGlndW5nIGluIGRpZSBWZXJhcmJlaXR1bmcgdW5kIMOcYmVybWl0dGx1bmcgamVkZXJ6 -ZWl0IGdlZ2Vuw7xiZXINCgkJCWRlbSBFaW5oZWl0bGljaGVyIEFuc3ByZWNocGFydG5lciBTY2hs -ZXN3aWctSG9sc3RlaW4sIFJldmVudGxvdWFsbGVlDQoJCQk2LCAyNDEwNSBLaWVsIHdpZGVycnVm -ZW4ga2Fubi4gRWluIFdpZGVycnVmIGlzdCBhYmVyIG51ciB3aXJrc2FtIGbDvHINCgkJCWRpZSBa -dWt1bmZ0LiBWZXJhcmJlaXR1bmdlbiwgZGllIHZvciBkZW0gV2lkZXJydWYgZXJmb2xndCBzaW5k -LCBzaW5kDQoJCQlkYXZvbiBuaWNodCBiZXRyb2ZmZW4uIMOcYmVyIGRpZSBWZXJhcmJlaXR1bmcg -bWVpbmVyIHBlcnNvbmVuYmV6b2dlbmVuDQoJCQlEYXRlbiB1bmQgZGllIG1pciBuYWNoIGRlbiBk -YXRlbnNjaHV0enJlY2h0bGljaGVuIFJlZ2VsdW5nZW4NCgkJCXp1c3RlaGVuZGVuIEFuc3Byw7xj -aGUgdW5kIFJlY2h0ZSBoYWJlIGljaCB1bnRlciBEYXRlbnNjaHV0emVya2zDpHJ1bmcNCgkJCUtl -bm50bmlzIGVybGFuZ3QuPC9iX2RhdGVuc2NodXR6Pg0KCQk8Yl9taXNzYnJhdWNoPiogTWlyIGlz -dCBiZWthbm50LCBkYXNzIHp1ciBWZXJmb2xndW5nIHdpZGVycmVjaHRsaWNoZXINCgkJCU51dHp1 -bmcgZGllIERhdGVuIG1laW5lcyB6dXIgRGF0ZW5laW5nYWJlIGdlbnV0enRlbiBFbmRnZXLDpHRl -cw0KCQkJYXVmZ2V6ZWljaG5ldCB1bmQgdmVyd2VuZGV0IHdlcmRlbiBrw7ZubmVuLjwvYl9taXNz -YnJhdWNoPg0KCQk8cG9saWN5dXJsPmh0dHA6Ly93YWZteHBhMDAyLmRwYW9yLmRlL3NoL2RhdGVu -c2NodXR6L2RhdGVuc2NodXR6ZXJrbGFlcnVuZ0VBX2RlLmRvYzwvcG9saWN5dXJsPg0KCTwvZXJr -bGFlcnVuZ2VuPg0KCTxsb2dvdXJsPmh0dHA6Ly93YWZteHBhMDAyLmRwYW9yLmRlL3NoL2xvZ29z -L2tvcGZfOTA2ODg3My5kb2M8L2xvZ291cmw+DQoJPGZtPg0KCQk8YW5zcHJlY2hwYXJ0bmVyPg0K -CQkJPGZpcm1lbm5hbWUgLz4NCgkJCTxhbnJlZGU+SGVycjwvYW5yZWRlPg0KCQkJPHZvcm5hbWU+ -TWF4PC92b3JuYW1lPg0KCQkJPGZhbWlsaWVubmFtZT5UZXN0ZXJtYW5uPC9mYW1pbGllbm5hbWU+ -DQoJCQk8YW5zY2hyaWZ0Pg0KCQkJCTxzdHJhc3NlPkvDtm5pZ3N3ZWc8L3N0cmFzc2U+DQoJCQkJ -PGhhdXNudW1tZXI+NzQ8L2hhdXNudW1tZXI+DQoJCQkJPHBvc3RmYWNoIC8+DQoJCQkJPHBvc3Rs -ZWl0emFobD4yNDgzNzwvcG9zdGxlaXR6YWhsPg0KCQkJCTxvcnQ+U2NobGVzd2lnPC9vcnQ+DQoJ -CQkJPG9ydHN0ZWlsIC8+DQoJCQkJPHp1c2F0eiAvPg0KCQkJCTxzdGFhdD5EZXV0c2NobGFuZDwv -c3RhYXQ+DQoJCQk8L2Fuc2NocmlmdD4NCgkJCTxrb250YWt0Pg0KCQkJCTx0ZWxlZm9ubnVtbWVy -PisgNDkgNDYyMSA5NjU0PC90ZWxlZm9ubnVtbWVyPg0KCQkJCTxtb2JpbG51bW1lcj4rNDkgMTIz -PC9tb2JpbG51bW1lcj4NCgkJCQk8dGVsZWZheG51bW1lcj4rIDQ5IDQ2MjEgOTY1NDwvdGVsZWZh -eG51bW1lcj4NCgkJCQk8ZW1haWxhZHJlc3NlPm1heC50ZXN0ZXJtYW5uQGdteC5kZTwvZW1haWxh -ZHJlc3NlPg0KCQkJCTxkZW1haWxhZHJlc3NlPm1heC50ZXN0ZXJtYW5uQGdteC5kZS1tYWlsLmRl -PC9kZW1haWxhZHJlc3NlPg0KCQkJPC9rb250YWt0Pg0KCQk8L2Fuc3ByZWNocGFydG5lcj4NCgkJ -PHZlcndhbHR1bmdzbGVpc3R1bmdlbj4NCgkJCTx2ZXJ3YWx0dW5nc2xlaXN0dW5nPg0KCQkJCTxh -dXNnZXdhZWhsdGVfenVzdGFlbmRpZ2VzdGVsbGU+DQoJCQkJCTxPcmdhbmlzYXRpb25zZWluaGVp -dGVuSUQ+OTUzNTY2OTwvT3JnYW5pc2F0aW9uc2VpbmhlaXRlbklEPg0KCQkJCQk8T3JnYW5pc2F0 -aW9uc2VpbmhlaXRlbkJFWkVJQ0hOVU5HPktyZWlzDQoJCQkJCQlTY2hsZXN3aWctRmxlbnNidXJn -L0tyZWlzdmVyd2FsdHVuZyAtIEFsbGdlbWVpbmUNCgkJCQkJCU9yZG51bmdzYW5nZWxlZ2VuaGVp -dGVuPC9PcmdhbmlzYXRpb25zZWluaGVpdGVuQkVaRUlDSE5VTkc+DQoJCQkJPC9hdXNnZXdhZWhs -dGVfenVzdGFlbmRpZ2VzdGVsbGU+DQoJCQkJPEdlYmlldElEPjkwMDczMTQ8L0dlYmlldElEPg0K -CQkJCTxHZWJpZXRCRVpFSUNITlVORz5TY2hsZXN3aWc8L0dlYmlldEJFWkVJQ0hOVU5HPg0KCQkJ -CTxBbmxpZWdlbklEPjg5NjY2NzE8L0FubGllZ2VuSUQ+DQoJCQkJPEFubGllZ2VuQkVaRUlDSE5V -Tkc+V2FmZmVuc2NoZWluIC8gS2xlaW5lciBXYWZmZW5zY2hlaW48L0FubGllZ2VuQkVaRUlDSE5V -Tkc+DQoJCQkJPGxlaWthS0VZTElTVD45OTA4OTAwODAwMDAwMDs5OTA4OTAwODAwMTAwMDwvbGVp -a2FLRVlMSVNUPg0KCQkJCTxsZWlrYUJFWkVJQ0hOVU5HIC8+DQoJCQk8L3ZlcndhbHR1bmdzbGVp -c3R1bmc+DQoJCTwvdmVyd2FsdHVuZ3NsZWlzdHVuZ2VuPg0KCTwvZm0+DQo8L215Rm9ybT4= - </content> - <!--Optional:--> - <contentType>application/xml</contentType> - <!--Optional:--> - <description>?</description> - <!--Optional:--> - <id>1</id> - <!--Optional:--> - <name>XML-Daten.xml</name> - </attachments> - <!--Optional:--> - <caller>?</caller> - <!--Optional:--> - <client>?</client> - <!--Optional:--> - <clientId>?</clientId> - <!--Zero or more repetitions:--> - <customParameters> - <!--Optional:--> - <key>?</key> - <!--Optional:--> - <value>?</value> - </customParameters> - <!--Optional:--> - <customer>?</customer> - <!--Optional:--> - <customerId>?</customerId> - <!--Optional:--> - <form>?</form> - <!--Optional:--> - <formId>?</formId> - <!--Optional:--> - <id>?</id> - <!--Optional:--> - <primaryDataAttachmentId>?</primaryDataAttachmentId> - <!--Optional:--> - <primaryFormAttachmentId>?</primaryFormAttachmentId> - <!--Optional:--> - <sender>?</sender> - <!--Optional:--> - <timestamp>?</timestamp> - <!--Optional:--> - <username>?</username> - </data> - </bac:deposit> - </soapenv:Body> -</soapenv:Envelope> diff --git a/intelliform-adapter/src/test/resources/intelliform/soaprequest_other-name.xml b/intelliform-adapter/src/test/resources/intelliform/soaprequest_other-name.xml deleted file mode 100644 index f16ef1ffe5542c63f699c999cc24707c555f21de..0000000000000000000000000000000000000000 --- a/intelliform-adapter/src/test/resources/intelliform/soaprequest_other-name.xml +++ /dev/null @@ -1,35 +0,0 @@ -<soap:Envelope - xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> - <soap:Body> - <ns2:deposit - xmlns:ns2="http://xmlns.cit.de/intelliform/2009/webservices/backend"> - <data> - <attachments> - <attributes> - <key>X-IntelliForm-Signed</key> - <value>false</value> - </attributes> - <content> - PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPG15Rm9ybSB4bWxuczpwZGY9Imh0dHA6Ly94bWxucy5jaXQuZGUvYXNzaXN0YW50cy9wZGYiCgl4bWxuczp0PSJodHRwOi8veG1sbnMuY2l0LmRlL2ludGVsbGlmb3JtL3RyYW5zYWN0aW9uIgoJdDppZD0iMjAyMDExMTgzNjU2NzA4NjYxMDEiIHQ6dGltZXN0YW1wPSIyMDIwLTExLTE4VDA5OjA5OjI3LjYyN1oiCgl0OnNlbmRlcj0iYWZtLnNjaGxlc3dpZy1ob2xzdGVpbi5kZSIKCXQ6Zm9ybT0iS2xlaW5lciBXYWZmZW5zY2hlaW4gZ2VtLiDCpyAxMCBBYnMuIDQgU2F0eiA0IFdhZmZlbmdlc2V0eiAoV2FmZkcpIgoJdDpmb3JtLWlkPSJ3YWZmZW4va2xlaW5lcldhZmZlbnNjaGVpbiIKCXQ6Y3VzdG9tZXI9IkVpbmhlaXRsaWNoZXIgQW5zcHJlY2hwYXJ0bmVyIiB0OmN1c3RvbWVyLWlkPSJlYS1zaCIKCXQ6Y2xpZW50PSJTY2hsZXN3aWctSG9sc3RlaW4iIHQ6Y2xpZW50LWlkPSJsYW5kIj4KCQoJPHp1c3RhZW5kaWdlc3RlbGxlPgoJCTxPcmdhbmlzYXRpb25zZWluaGVpdGVuSUQ+MDgxNTwvT3JnYW5pc2F0aW9uc2VpbmhlaXRlbklEPgoJPC96dXN0YWVuZGlnZXN0ZWxsZT4KPC9teUZvcm0+ - </content> - <contentType>text/xml</contentType> - <id>myForm-xml</id> - <name>anderer-name-Daten.xml</name> - </attachments> - - <caller /> - <client>sh-dev</client> - <clientId>sh-dev</clientId> - <customer>Kiel</customer> - <customerId>Kiel</customerId> - <form>SimpleFormSendetAnHomeServer</form> - <formId>SimpleFormSendetAnHomeServer</formId> - <id>20210415307020414701</id> - <primaryDataAttachmentId>myForm-xml</primaryDataAttachmentId> - <sender>intelliform.by.kop-cloud.de</sender> - <timestamp>2021-04-15T08:33:39.443Z</timestamp> - <username /> - </data> - </ns2:deposit> - </soap:Body> -</soap:Envelope> \ No newline at end of file diff --git a/intelliform-adapter/src/test/resources/itcase/EinfachesFormularZweiAnhaengeSoapRequest.xml b/intelliform-adapter/src/test/resources/itcase/EinfachesFormularZweiAnhaengeSoapRequest.xml deleted file mode 100644 index 2f54eb6e17f5c95235b10fe7fae742697143c664..0000000000000000000000000000000000000000 --- a/intelliform-adapter/src/test/resources/itcase/EinfachesFormularZweiAnhaengeSoapRequest.xml +++ /dev/null @@ -1,158 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> - <soap:Body> - <ns2:deposit xmlns:ns2="http://xmlns.cit.de/intelliform/2009/webservices/backend"> - <data> - <attachments> - <attributes> - <key>X-IntelliForm-Signed</key> - <value>false</value> - </attributes> - <content>PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPG15Rm9ybQoJeG1sbnM6cGRm -PSJodHRwOi8veG1sbnMuY2l0LmRlL2Fzc2lzdGFudHMvcGRmIgoJeG1sbnM6dD0iaHR0cDovL3ht -bG5zLmNpdC5kZS9pbnRlbGxpZm9ybS90cmFuc2FjdGlvbiIgdDp1dWlkPSJlYWMyNDgwZS03MTY2 -LTRiMTYtYmRkZC04ODA1OTFlN2Q5M2IiIHQ6aWQ9IjIwMjEwNDE1MzA3MDIwNDE0NzAxIiB0OnRp -bWVzdGFtcD0iMjAyMS0wNC0xNVQwODozMTo0Mi4zOThaIiB0OnNlbmRlcj0iaW50ZWxsaWZvcm0u -b3pnLXNoLmRlIiB0OmZvcm09IlNpbXBsZUZvcm1TZW5kZXRBbkhvbWVTZXJ2ZXJWb25Ub3JzdGVu -IiB0OmZvcm0taWQ9IlNpbXBsZUZvcm1TZW5kZXRBbkhvbWVTZXJ2ZXJWb25Ub3JzdGVuIiB0OmN1 -c3RvbWVyPSJLaWVsIiB0OmN1c3RvbWVyLWlkPSJLaWVsIiB0OmNsaWVudD0ic2gtZGV2IiB0OmNs -aWVudC1pZD0ic2gtZGV2Ij4KCTxLb250YWt0c3lzdGVtVHlwQT4yMzMwMzQ2MDA8L0tvbnRha3Rz -eXN0ZW1UeXBBPgoJPEtvbnRha3RzeXN0ZW1UeXBCPjIzMzAzNDYwMTwvS29udGFrdHN5c3RlbVR5 -cEI+Cgk8QW5saWVnZW5JRD44OTY2NjcxPC9BbmxpZWdlbklEPgoJPG5hbWVpZD5uYW1lSWRBc09z -aVBvc3RmYWNoSWRWMTwvbmFtZWlkPgoJPHJlc3RfcmVzcG9uc2VfbmFtZT4KCQlbeyJtZW1iZXJj -b250ZXh0IjoiNTE1MjI2MjAtMDNkMi00NTA3LWIxZjAtMDhkODY5MjBlZmVkIiwibWVtYmVyc2Nv -cGUiOlt7InRlbmFudCI6IlNIIiwibWFpbGJveGd1aWQiOiI2ODI0ZDU3My1mZjI2LTQzNGQtODFh -ZS0yYzM2NzQwZTNjYjQiLCJtYWlsYm94bmFtZSI6IiIsIm1haWxib3hkZXNjcmlwdGlvbiI6IiIs -Im1haWxib3h0eXBlIjoxLCJndWlkIjoiMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAw -MDAwIiwiaWQiOjgxMjExNTV9XX1dCgk8L3Jlc3RfcmVzcG9uc2VfbmFtZT4KCTxhbnRyYWdzdGVs -bGVyPgoJCTxzaF9zdHJhc3NlPkFuIGRlciBTY2huZWlkZXJlaTwvc2hfc3RyYXNzZT4KCQk8c2hf -aGF1c251bW1lcj4xPC9zaF9oYXVzbnVtbWVyPgoJCTxzaF9wbHo+MjQxMDM8L3NoX3Bsej4KCQk8 -b3J0X2F1c3dhaGw+OTAwNjQwMiQwMTAwMjAwMDwvb3J0X2F1c3dhaGw+CgkJPG9ydD5LaWVsPC9v -cnQ+CgkJPEdlYmlldElEPjkwMDY0MDI8L0dlYmlldElEPgoJCTxHZWJpZXRCRVpFSUNITlVORz5L -aWVsPC9HZWJpZXRCRVpFSUNITlVORz4KCQk8R2ViaWV0R05SOTRfR05SPjAxMDAyMDAwPC9HZWJp -ZXRHTlI5NF9HTlI+CgkJPHN0YWF0PjAwMDwvc3RhYXQ+CgkJPGlzbzMxNjZudW1lcmlzY2g+Mjc2 -PC9pc28zMTY2bnVtZXJpc2NoPgoJCTxrb250X3RlbGVmb25udW1tZXIvPgoJCTxrb250X21vYmls -bnVtbWVyLz4KCQk8a29udF90ZWxlZmF4bnVtbWVyLz4KCQk8a29udF9lbWFpbD5zY2huZWlkZXJA -aGVsZ2VzY2huZWlkZXIubG9jYWw8L2tvbnRfZW1haWw+CgkJPGtvbnRfZGVtYWlsLz4KCTwvYW50 -cmFnc3RlbGxlcj4KCTxVcGxvYWQxPgoJCTxmaWxlIGNvbnRlbnQtdHlwZT0iaW1hZ2UvanBlZyIg -ZGVzY3JpcHRpb249IiIgaWQ9ImFzc2lzdGFudHMuRTBGQkEzNjFDMTkxRjhCNzIzOTQ5NDY3QUUz -MDJCRUEyNEU0NzQ1RSIgbGVuZ3RoPSIxNTUyNTEiPkhlbGdlMS5qcGc8L2ZpbGU+Cgk8L1VwbG9h -ZDE+Cgk8VXBsb2FkMj4KCQk8ZmlsZSBjb250ZW50LXR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vYXNp -cy5vcGVuZG9jdW1lbnQudGV4dCIgZGVzY3JpcHRpb249IiIgaWQ9ImFzc2lzdGFudHMuNTJENzlF -NUIyMTE4RDE3NDAwNDVBQjg3MTUxNTM1RENBRDI0RTlBNyIgbGVuZ3RoPSI3OTkzIj5IZWxnZXRl -eHQyLm9kdDwvZmlsZT4KCTwvVXBsb2FkMj4KCTxHZWJpZXRJRD45MDA2NDAyPC9HZWJpZXRJRD4K -CTx6dXN0YWVuZGlnZXN0ZWxsZT4KCQk8T3JnYW5pc2F0aW9uc2VpbmhlaXRlbkF1c3dhaGw+MTAz -NjM0NTU8L09yZ2FuaXNhdGlvbnNlaW5oZWl0ZW5BdXN3YWhsPgoJCTxPcmdhbmlzYXRpb25zZWlu -aGVpdGVuSUQ+MTAzNjM0NTU8L09yZ2FuaXNhdGlvbnNlaW5oZWl0ZW5JRD4KCQk8T3JnYW5pc2F0 -aW9uc2VpbmhlaXRlbkJFWkVJQ0hOVU5HPkxhbmRlc2hhdXB0c3RhZHQgS2llbCAtIELDvHJnZXIt -IHVuZCBPcmRudW5nc2FtdCwgU2FjaGJlcmVpY2ggR2VmYWhyZW5hYndlaHIsIFdhZmZlbmFuZ2Vs -ZWdlbmhlaXRlbiwgSmFnZGJlaMO2cmRlLCBCZXN0YXR0dW5nc2FuZ2VsZWdlbmhlaXRlbjwvT3Jn -YW5pc2F0aW9uc2VpbmhlaXRlbkJFWkVJQ0hOVU5HPgoJCTxzdHJhc3NlPlN0cmVzZW1hbm5wbGF0 -ejwvc3RyYXNzZT4KCQk8aGF1c251bW1lcj41PC9oYXVzbnVtbWVyPgoJCTxwb3N0bGVpdHphaGw+ -MjQxMDM8L3Bvc3RsZWl0emFobD4KCQk8b3J0SUQ+OTAwNjQwMjwvb3J0SUQ+CgkJPG9ydD5LaWVs -PC9vcnQ+CgkJPHRlbGVmb25udW1tZXIvPgoJCTx0ZWxlZmF4bnVtbWVyPis0OSA0MzEgOTAxLTYy -MTgxPC90ZWxlZmF4bnVtbWVyPgoJCTxlbWFpbGFkcmVzc2U+R2VmYWhyZW5hYndlaHJAS2llbC5k -ZTwvZW1haWxhZHJlc3NlPgoJCTxkZW1haWxhZHJlc3NlLz4KCQk8a29udGFrdHN5c3RlbV9rZW5u -dW5nLz4KCQk8a29udGFrdHN5c3RlbV9rZW5udW5nenVzYXR6Lz4KCQk8QW5saWVnZW5CRVpFSUNI -TlVORz5XYWZmZW5zY2hlaW4gLyBLbGVpbmVyIFdhZmZlbnNjaGVpbjwvQW5saWVnZW5CRVpFSUNI -TlVORz4KCQk8bGVpa2FLRVlMSVNUPjk5MDg5MDA4MDAwMDAwOzk5MDg5MDA4MDAxMDAwPC9sZWlr -YUtFWUxJU1Q+Cgk8L3p1c3RhZW5kaWdlc3RlbGxlPgoJPGVtcGZhbmdlbmRlc3RlbGxlPgoJCTxP -cmdhbmlzYXRpb25zZWluaGVpdGVuQXVzd2FobD45MDY4ODczPC9PcmdhbmlzYXRpb25zZWluaGVp -dGVuQXVzd2FobD4KCQk8T3JnYW5pc2F0aW9uc2VpbmhlaXRlbklEPjkwNjg4NzM8L09yZ2FuaXNh -dGlvbnNlaW5oZWl0ZW5JRD4KCQk8T3JnYW5pc2F0aW9uc2VpbmhlaXRlbkJFWkVJQ0hOVU5HPkVp -bmhlaXRsaWNoZXIgQW5zcHJlY2hwYXJ0bmVyIFNjaGxlc3dpZy1Ib2xzdGVpbjwvT3JnYW5pc2F0 -aW9uc2VpbmhlaXRlbkJFWkVJQ0hOVU5HPgoJCTxzdHJhc3NlPlJldmVudGxvdWFsbGVlPC9zdHJh -c3NlPgoJCTxoYXVzbnVtbWVyPjY8L2hhdXNudW1tZXI+CgkJPHBvc3RsZWl0emFobD4yNDEwNTwv -cG9zdGxlaXR6YWhsPgoJCTxvcnRJRD45MDA2NDAyPC9vcnRJRD4KCQk8b3J0PktpZWw8L29ydD4K -CQk8dGVsZWZvbm51bW1lcj4rNDkgNDMxIDk4OC04NjUwPC90ZWxlZm9ubnVtbWVyPgoJCTx0ZWxl -ZmF4bnVtbWVyPis0OSA0MzEgOTg4LTYxNjExMTE8L3RlbGVmYXhudW1tZXI+CgkJPGVtYWlsYWRy -ZXNzZT5pbmZvQGVhLXNoLmRlPC9lbWFpbGFkcmVzc2U+CgkJPGRlbWFpbGFkcmVzc2U+ZWEtcG9z -dHN0ZWxsZUBlYS1zaC5kZS1tYWlsLmRlPC9kZW1haWxhZHJlc3NlPgoJCTxrb250YWt0c3lzdGVt -X2tlbm51bmc+YWZtc2g6OTA2ODg3M19BdXNuYWhtZUxLV0ZhaHJ2ZXJib3Q8L2tvbnRha3RzeXN0 -ZW1fa2VubnVuZz4KCQk8a29udGFrdHN5c3RlbV9rZW5udW5nenVzYXR6PmFsbGU8L2tvbnRha3Rz -eXN0ZW1fa2VubnVuZ3p1c2F0ej4KCTwvZW1wZmFuZ2VuZGVzdGVsbGU+Cgk8ZXJrbGFlcnVuZ2Vu -PgoJCTxjaGVja19nZWJ1ZWhyZW4+dHJ1ZTwvY2hlY2tfZ2VidWVocmVuPgoJCTxjaGVja19yaWNo -dGlna2VpdD50cnVlPC9jaGVja19yaWNodGlna2VpdD4KCQk8Y2hlY2tfZGF0ZW5zY2h1dHo+dHJ1 -ZTwvY2hlY2tfZGF0ZW5zY2h1dHo+CgkJPGNoZWNrX21pc3NicmF1Y2g+dHJ1ZTwvY2hlY2tfbWlz -c2JyYXVjaD4KCQk8Yl9nZWJ1ZWhyZW5fYmVzY2hyaWZ0dW5nPiogTWlyIGlzdCBiZWthbm50LCBk -YXNzIGR1cmNoIGRhcyBFaW5yZWljaGVuIGRlcyBlbGVrdHJvbmlzY2hlbiBBbnRyYWdlcyB2b24g -ZGVyIHp1c3TDpG5kaWdlbiBTdGVsbGUgR2Viw7xocmVuIGVyaG9iZW4gd2VyZGVuIGvDtm5uZW4u -PC9iX2dlYnVlaHJlbl9iZXNjaHJpZnR1bmc+CgkJPGJfZ2VidWVocmVuX2ludHJvPkdlYsO8aHIg -YmVpIEF1c3N0ZWxsdW5nIGRlcyBrbGVpbmVuIFdhZmZlbnNjaGVpbnM6IDYwLDAwIEV1cm8uIEJl -YXJiZWl0dW5nc2dlYsO8aHIgYmVpIFZlcnNhZ3VuZzogNDUsMDAgRXVyby4gClNpZSBzaW5kIGdl -bcOkw58gwqcgMzkgV2FmZkcgdmVycGZsaWNodGV0LCBkZXIgenVzdMOkbmRpZ2VuIEJlaMO2cmRl -IGRpZSB6dXIgRHVyY2hmw7xocnVuZyBkZXMgR2VzZXR6ZXMgZXJmb3JkZXJsaWNoZW4gQXVza8O8 -bmZ0ZSB6dSBlcnRlaWxlbi4gWnVyIFByw7xmdW5nIElocmVyIHdhZmZlbnJlY2h0bGljaGVuIFp1 -dmVybMOkc3NpZ2tlaXQgdW5kIEVpZ251bmcgaG9sdCBkaWUgQmVow7ZyZGUgZWluZSB1bmJlc2No -csOkbmt0ZSBBdXNrdW5mdCBhdXMgZGVtIEJ1bmRlc3plbnRyYWxyZWdpc3RlciwgZWluZSBBdXNr -dW5mdCBhdXMgZGVtIHplbnRyYWxlbiBzdGFhdHNhbndhbHRzY2hhZnRsaWNoZW4gVmVyZmFocmVu -c3JlZ2lzdGVyLCBlaW5lIFN0ZWxsdW5nbmFobWUgZGVyIMO2cnRsaWNoZW4gUG9saXplaWRpZW5z -dHN0ZWxsZSB1bmQgSWhyZXIgV29obnNpdHpnZW1laW5kZSBlaW4uPC9iX2dlYnVlaHJlbl9pbnRy -bz4KCQk8Yl9yaWNodGlna2VpdD4qIEljaCBiZXN0w6R0aWdlIGRpZSBSaWNodGlna2VpdCBtZWlu -ZXIgQW5nYWJlbi48L2JfcmljaHRpZ2tlaXQ+CgkJPGJfZGF0ZW5zY2h1dHo+KiBJY2ggZXJrbMOk -cmUgbWljaCBkYW1pdCBlaW52ZXJzdGFuZGVuLCBkYXNzIGRlciBFaW5oZWl0bGljaGVyIEFuc3By -ZWNocGFydG5lciBTY2hsZXN3aWctSG9sc3RlaW4genVyIEVyZsO8bGx1bmcgc2VpbmVyIEF1Zmdh -YmVuIG1laW5lIERhdGVuIHVudGVyIEVpbmhhbHR1bmcgZGVyIEJlc3RpbW11bmdlbiBkZXIgRGF0 -ZW5zY2h1dHotR3J1bmR2ZXJvcmRudW5nIChEUy1HVk8pIHVuZCBkZXMgTGFuZGVzZGF0ZW5zY2h1 -dHpnZXNldHplcyBTY2hsZXN3aWctSG9sc3RlaW4gKExEU0ctU0gpIHNwZWljaGVydCwgdmVyYXJi -ZWl0ZXQgIHVuZCBkaWVzZSBpbSBSYWhtZW4gZGVyIGdlc2V0emxpY2hlbiBCZXN0aW1tdW5nZW4g -YW4gZGllIGbDvHIgZGllIEVudHNjaGVpZHVuZyB6dXN0w6RuZGlnZSBTdGVsbGUgd2VpdGVybGVp -dGV0LiBFYmVuc28gYmluIGljaCBtaXQgZGVyIHJlY2h0c2tvbmZvcm1lbiAgRGF0ZW52ZXJhcmJl -aXR1bmcgdW5kIFNwZWljaGVydW5nIGR1cmNoIGRpZSB6dXN0w6RuZGlnZSBTdGVsbGUgZWludmVy -c3RhbmRlbi4gTWlyIGlzdCBiZWthbm50LCBkYXNzIGljaCBkaWUgRWlud2lsbGlndW5nIGluIGRp -ZSBWZXJhcmJlaXR1bmcgdW5kIMOcYmVybWl0dGx1bmcgamVkZXJ6ZWl0IGdlZ2Vuw7xiZXIgZGVt -IEVpbmhlaXRsaWNoZXIgQW5zcHJlY2hwYXJ0bmVyIFNjaGxlc3dpZy1Ib2xzdGVpbiwgUmV2ZW50 -bG91YWxsZWUgNiwgMjQxMDUgS2llbCB3aWRlcnJ1ZmVuIGthbm4uIEVpbiBXaWRlcnJ1ZiBpc3Qg -YWJlciBudXIgd2lya3NhbSBmw7xyIGRpZSBadWt1bmZ0LiBWZXJhcmJlaXR1bmdlbiwgZGllIHZv -ciBkZW0gV2lkZXJydWYgZXJmb2xndCBzaW5kLCBzaW5kIGRhdm9uIG5pY2h0IGJldHJvZmZlbi4g -w5xiZXIgZGllIFZlcmFyYmVpdHVuZyBtZWluZXIgcGVyc29uZW5iZXpvZ2VuZW4gRGF0ZW4gdW5k -IGRpZSBtaXIgbmFjaCBkZW4gZGF0ZW5zY2h1dHpyZWNodGxpY2hlbiBSZWdlbHVuZ2VuIHp1c3Rl -aGVuZGVuIEFuc3Byw7xjaGUgdW5kIFJlY2h0ZSBoYWJlIGljaCB1bnRlciBEYXRlbnNjaHV0emVy -a2zDpHJ1bmcgS2VubnRuaXMgZXJsYW5ndC48L2JfZGF0ZW5zY2h1dHo+CgkJPGJfbWlzc2JyYXVj -aD4qIE1pciBpc3QgYmVrYW5udCwgZGFzcyB6dXIgVmVyZm9sZ3VuZyB3aWRlcnJlY2h0bGljaGVy -IE51dHp1bmcgZGllIERhdGVuIG1laW5lcyB6dXIgRGF0ZW5laW5nYWJlIGdlbnV0enRlbiBFbmRn -ZXLDpHRlcyBhdWZnZXplaWNobmV0IHVuZCB2ZXJ3ZW5kZXQgd2VyZGVuIGvDtm5uZW4uPC9iX21p -c3NicmF1Y2g+CgkJPHBvbGljeXVybD5odHRwOi8vd3d3LmVhLXNoLmluZm8vZGF0ZW5zY2h1dHov -ZGF0ZW5zY2h1dHplcmtsYWVydW5nRUFfZGUuZG9jPC9wb2xpY3l1cmw+Cgk8L2Vya2xhZXJ1bmdl -bj4KCTxsb2dvdXJsPmh0dHA6Ly93d3cuZWEtc2guaW5mby9sb2dvcy9rb3BmXzkwNjg4NzMuZG9j -PC9sb2dvdXJsPgo8L215Rm9ybT4=</content> - <contentType>text/xml</contentType> - <id>myForm-xml</id> - <name>XML-Daten.xml</name> - </attachments> - <attachments> - <attributes> - <key>X-IntelliForm-Signed</key> - <value>false</value> - </attributes> - <content>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</content> - <contentType>image/jpeg</contentType> - <id>assistants.E0FBA361C191F8B723949467AE302BEA24E4745E</id> - <name>Helge1.jpg</name> - </attachments> - <attachments> - <attributes> - <key>X-IntelliForm-Signed</key> - <value>false</value> - </attributes> - <content>UEsDBBQAAAgAACxEj1JexjIMJwAAACcAAAAIAAAAbWltZXR5cGVhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnRleHRQSwMEFAAACAAALESPUgYCUOZqAQAAagEAABgAAABUaHVtYm5haWxzL3RodW1ibmFpbC5wbmeJUE5HDQoaCgAAAA1JSERSAAAAtQAAAQAIAwAAAML9x+kAAAA8UExURYyQkJCTlZ6fo6qknrm2tri6vMW2qsrGv8rQ1d/Uytvm79vq9ezn5O/0+fDq5fT3+vj39////wAAAP///81aQL0AAADpSURBVHja7dK5DYAwEADB4zU2j6H/ZskpAOmk2Qom2HgyFtTU1NTU1NTU1NTU1J+us99Hz6ZexyGmPZu6LluZm6+pqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqan/6AXwWwUaPv4WoAAAAABJRU5ErkJgglBLAwQUAAgICAAsRI9SAAAAAAAAAAAAAAAACwAAAGNvbnRlbnQueG1spVddb9s2FH3vrxA0YG8M7bgDEi12H1oU2JoURZ0Be2UoSiYmiRpJWfa/3yVp0ZRjOVz8Ilu851zeb1IPn3Z1lWyZVFw0y3R+M0sT1lCR86Zcpn89f0V36afVhwdRFJyyLBe0q1mjERWNht8E2I3KnHSZdrLJBFFcZQ2pmco0zUTLmoGVhejM7uVWlN5X0XQLDtma7XQs2WBHXPISv7MFh+xckj6WbLAQ1JBeiFjyTlWoEBD1uiWan1ixq3jzzzLdaN1mGPd9f9MvboQs8fz+/h5bqTeYelzbycqicopZxcxmCs9v5njA1kyTWPsMNjSp6eoXJqNDQzR5lVW1LaMrYltOhIZuiIyuDQsep3eRx6d3kYfcmujNRE7u8BMI7ePp8VgLso7dy2BHoaKSt9FuOnTIF0J4Uw3BNag193Y2+4jde4DuL8J7yTWTAZxehFNSUR9xUZ8LGuDmGBCIbU2Z+sI3gVAThFvsxB6s8knV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</content> - <contentType>application/vnd.oasis.opendocument.text</contentType> - <id>assistants.52D79E5B2118D1740045AB87151535DCAD24E9A7</id> - <name>Helgetext2.odt</name> - </attachments> - <caller /> - <client>sh-dev</client> - <clientId>sh-dev</clientId> - <customer>Kiel</customer> - <customerId>Kiel</customerId> - <form>SimpleFormSendetAnHomeServer</form> - <formId>SimpleFormSendetAnHomeServer</formId> - <id>20210415307020414701</id> - <primaryDataAttachmentId>myForm-xml</primaryDataAttachmentId> - <sender>intelliform.by.kop-cloud.de</sender> - <timestamp>2021-04-15T08:33:39.443Z</timestamp> - <username /> - </data> - </ns2:deposit> - </soap:Body> -</soap:Envelope> \ No newline at end of file diff --git a/intelliform-adapter/src/test/resources/itcase/EinfachesFormularZweiAnhaengeSoapRequest_XML-Daten.xml b/intelliform-adapter/src/test/resources/itcase/EinfachesFormularZweiAnhaengeSoapRequest_XML-Daten.xml deleted file mode 100644 index 11382eb719293cd8ba73dea4cd99a3d926b63652..0000000000000000000000000000000000000000 --- a/intelliform-adapter/src/test/resources/itcase/EinfachesFormularZweiAnhaengeSoapRequest_XML-Daten.xml +++ /dev/null @@ -1,84 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<myForm - xmlns:pdf="http://xmlns.cit.de/assistants/pdf" - xmlns:t="http://xmlns.cit.de/intelliform/transaction" t:uuid="eac2480e-7166-4b16-bddd-880591e7d93b" t:id="20210415307020414701" t:timestamp="2021-04-15T08:31:42.398Z" t:sender="intelliform.ozg-sh.de" t:form="SimpleFormSendetAnHomeServer" t:form-id="SimpleFormSendetAnHomeServer" t:customer="Kiel" t:customer-id="Kiel" t:client="sh-dev" t:client-id="sh-dev"> - <KontaktsystemTypA>233034600</KontaktsystemTypA> - <KontaktsystemTypB>233034601</KontaktsystemTypB> - <AnliegenID>8966671</AnliegenID> - <nameid>nameIdAsOsiPostfachIdV1</nameid> - <rest_response_name> - [{"membercontext":"51522620-03d2-4507-b1f0-08d86920efed","memberscope":[{"tenant":"SH","mailboxguid":"6824d573-ff26-434d-81ae-2c36740e3cb4","mailboxname":"","mailboxdescription":"","mailboxtype":1,"guid":"00000000-0000-0000-0000-000000000000","id":8121155}]}] - </rest_response_name> - <antragsteller> - <sh_strasse>An der Schneiderei</sh_strasse> - <sh_hausnummer>1</sh_hausnummer> - <sh_plz>24103</sh_plz> - <ort_auswahl>9006402$01002000</ort_auswahl> - <ort>Kiel</ort> - <GebietID>9006402</GebietID> - <GebietBEZEICHNUNG>Kiel</GebietBEZEICHNUNG> - <GebietGNR94_GNR>01002000</GebietGNR94_GNR> - <staat>000</staat> - <iso3166numerisch>276</iso3166numerisch> - <kont_telefonnummer/> - <kont_mobilnummer/> - <kont_telefaxnummer/> - <kont_email>noreply@ozg-sh.de</kont_email> - <kont_demail/> - </antragsteller> - <Upload1> - <file content-type="image/jpeg" description="" id="assistants.E0FBA361C191F8B723949467AE302BEA24E4745E" length="155251">Helge1.jpg</file> - </Upload1> - <Upload2> - <file content-type="application/vnd.oasis.opendocument.text" description="" id="assistants.52D79E5B2118D1740045AB87151535DCAD24E9A7" length="7993">Helgetext2.odt</file> - </Upload2> - <GebietID>9006402</GebietID> - <zustaendigestelle> - <OrganisationseinheitenAuswahl>10363455</OrganisationseinheitenAuswahl> - <OrganisationseinheitenID>10363455</OrganisationseinheitenID> - <OrganisationseinheitenBEZEICHNUNG>Landeshauptstadt Kiel - Bürger- und Ordnungsamt, Sachbereich Gefahrenabwehr, Waffenangelegenheiten, Jagdbehörde, Bestattungsangelegenheiten</OrganisationseinheitenBEZEICHNUNG> - <strasse>Stresemannplatz</strasse> - <hausnummer>5</hausnummer> - <postleitzahl>24103</postleitzahl> - <ortID>9006402</ortID> - <ort>Kiel</ort> - <telefonnummer/> - <telefaxnummer>+49 431 901-62181</telefaxnummer> - <emailadresse>Gefahrenabwehr@Kiel.de</emailadresse> - <demailadresse/> - <kontaktsystem_kennung/> - <kontaktsystem_kennungzusatz/> - <AnliegenBEZEICHNUNG>Waffenschein / Kleiner Waffenschein</AnliegenBEZEICHNUNG> - <leikaKEYLIST>99089008000000;99089008001000</leikaKEYLIST> - </zustaendigestelle> - <empfangendestelle> - <OrganisationseinheitenAuswahl>9068873</OrganisationseinheitenAuswahl> - <OrganisationseinheitenID>9068873</OrganisationseinheitenID> - <OrganisationseinheitenBEZEICHNUNG>Einheitlicher Ansprechpartner Schleswig-Holstein</OrganisationseinheitenBEZEICHNUNG> - <strasse>Reventlouallee</strasse> - <hausnummer>6</hausnummer> - <postleitzahl>24105</postleitzahl> - <ortID>9006402</ortID> - <ort>Kiel</ort> - <telefonnummer>+49 431 988-8650</telefonnummer> - <telefaxnummer>+49 431 988-6161111</telefaxnummer> - <emailadresse>info@ea-sh.de</emailadresse> - <demailadresse>ea-poststelle@ea-sh.de-mail.de</demailadresse> - <kontaktsystem_kennung>afmsh:9068873_AusnahmeLKWFahrverbot</kontaktsystem_kennung> - <kontaktsystem_kennungzusatz>alle</kontaktsystem_kennungzusatz> - </empfangendestelle> - <erklaerungen> - <check_gebuehren>true</check_gebuehren> - <check_richtigkeit>true</check_richtigkeit> - <check_datenschutz>true</check_datenschutz> - <check_missbrauch>true</check_missbrauch> - <b_gebuehren_beschriftung>* Mir ist bekannt, dass durch das Einreichen des elektronischen Antrages von der zuständigen Stelle Gebühren erhoben werden können.</b_gebuehren_beschriftung> - <b_gebuehren_intro>Gebühr bei Ausstellung des kleinen Waffenscheins: 60,00 Euro. Bearbeitungsgebühr bei Versagung: 45,00 Euro. -Sie sind gemäß § 39 WaffG verpflichtet, der zuständigen Behörde die zur Durchführung des Gesetzes erforderlichen Auskünfte zu erteilen. Zur Prüfung Ihrer waffenrechtlichen Zuverlässigkeit und Eignung holt die Behörde eine unbeschränkte Auskunft aus dem Bundeszentralregister, eine Auskunft aus dem zentralen staatsanwaltschaftlichen Verfahrensregister, eine Stellungnahme der örtlichen Polizeidienststelle und Ihrer Wohnsitzgemeinde ein.</b_gebuehren_intro> - <b_richtigkeit>* Ich bestätige die Richtigkeit meiner Angaben.</b_richtigkeit> - <b_datenschutz>* Ich erkläre mich damit einverstanden, dass der Einheitlicher Ansprechpartner Schleswig-Holstein zur Erfüllung seiner Aufgaben meine Daten unter Einhaltung der Bestimmungen der Datenschutz-Grundverordnung (DS-GVO) und des Landesdatenschutzgesetzes Schleswig-Holstein (LDSG-SH) speichert, verarbeitet und diese im Rahmen der gesetzlichen Bestimmungen an die für die Entscheidung zuständige Stelle weiterleitet. Ebenso bin ich mit der rechtskonformen Datenverarbeitung und Speicherung durch die zuständige Stelle einverstanden. Mir ist bekannt, dass ich die Einwilligung in die Verarbeitung und Übermittlung jederzeit gegenüber dem Einheitlicher Ansprechpartner Schleswig-Holstein, Reventlouallee 6, 24105 Kiel widerrufen kann. Ein Widerruf ist aber nur wirksam für die Zukunft. Verarbeitungen, die vor dem Widerruf erfolgt sind, sind davon nicht betroffen. Über die Verarbeitung meiner personenbezogenen Daten und die mir nach den datenschutzrechtlichen Regelungen zustehenden Ansprüche und Rechte habe ich unter Datenschutzerklärung Kenntnis erlangt.</b_datenschutz> - <b_missbrauch>* Mir ist bekannt, dass zur Verfolgung widerrechtlicher Nutzung die Daten meines zur Dateneingabe genutzten Endgerätes aufgezeichnet und verwendet werden können.</b_missbrauch> - <policyurl>http://www.ea-sh.info/datenschutz/datenschutzerklaerungEA_de.doc</policyurl> - </erklaerungen> - <logourl>http://www.ea-sh.info/logos/kopf_9068873.doc</logourl> -</myForm> \ No newline at end of file diff --git a/intelliform-adapter/src/test/resources/itcase/EinfachesFormularZweiAnhaengeSoapResponse.xml b/intelliform-adapter/src/test/resources/itcase/EinfachesFormularZweiAnhaengeSoapResponse.xml deleted file mode 100644 index c9ad88904e07c60ea9484de78e9245a7bf8bbfad..0000000000000000000000000000000000000000 --- a/intelliform-adapter/src/test/resources/itcase/EinfachesFormularZweiAnhaengeSoapResponse.xml +++ /dev/null @@ -1 +0,0 @@ -<ns3:depositResponse xmlns:ns3="http://xmlns.cit.de/intelliform/2009/webservices/backend"/> diff --git a/intelliform-adapter/src/test/resources/itcase/XML-Daten-1-SoapRequest.xml b/intelliform-adapter/src/test/resources/itcase/XML-Daten-1-SoapRequest.xml deleted file mode 100644 index 373c0682344729257e9fcd9b8a0536c696f69822..0000000000000000000000000000000000000000 --- a/intelliform-adapter/src/test/resources/itcase/XML-Daten-1-SoapRequest.xml +++ /dev/null @@ -1,31 +0,0 @@ -<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> - <soap:Body> - <ns2:deposit xmlns:ns2="http://xmlns.cit.de/intelliform/2009/webservices/backend"> - <data> - <attachments> - <attributes> - <key>X-IntelliForm-Signed</key> - <value>false</value> - </attributes> - <content>PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPG15Rm9ybSB4bWxuczpwZGY9Imh0dHA6Ly94bWxucy5jaXQuZGUvYXNzaXN0YW50cy9wZGYiCgl4bWxuczp0PSJodHRwOi8veG1sbnMuY2l0LmRlL2ludGVsbGlmb3JtL3RyYW5zYWN0aW9uIgoJdDppZD0iMjAyMDExMTgzNjU2NzA4NjYxMDEiIHQ6dGltZXN0YW1wPSIyMDIwLTExLTE4VDA5OjA5OjI3LjYyN1oiCgl0OnNlbmRlcj0iYWZtLnNjaGxlc3dpZy1ob2xzdGVpbi5kZSIKCXQ6Zm9ybT0iS2xlaW5lciBXYWZmZW5zY2hlaW4gZ2VtLiDCpyAxMCBBYnMuIDQgU2F0eiA0IFdhZmZlbmdlc2V0eiAoV2FmZkcpIgoJdDpmb3JtLWlkPSJ3YWZmZW4va2xlaW5lcldhZmZlbnNjaGVpbiIKCXQ6Y3VzdG9tZXI9IkVpbmhlaXRsaWNoZXIgQW5zcHJlY2hwYXJ0bmVyIiB0OmN1c3RvbWVyLWlkPSJlYS1zaCIKCXQ6Y2xpZW50PSJTY2hsZXN3aWctSG9sc3RlaW4iIHQ6Y2xpZW50LWlkPSJsYW5kIj4KCTxrb250YWt0c3lzdGVtdHlwaWQ+MjMzMDM0NjAwPC9rb250YWt0c3lzdGVtdHlwaWQ+Cgk8a29udGFrdHN5c3RlbXR5cGlkbG4+MjMzMDM0NjAxPC9rb250YWt0c3lzdGVtdHlwaWRsbj4KCTxBbmxpZWdlbklEPjg5NjY2NzE8L0FubGllZ2VuSUQ+Cgk8bWFpbGJveGd1aWQ+Zjk3NzM2OGItNjk5MS00NmI5LWFmMTgtOGEyYTAzZDlhZDFiPC9tYWlsYm94Z3VpZD4KCTxuYW1laWQ+Y2JhY2IwMWEtMjgxMC0xMWVjLWJiNmYtYzMxOTM5Zjg4NzRlPC9uYW1laWQ+Cgk8YW50cmFnc3RlbGxlcj4KCQk8cGVyc19hbnJlZGU+SGVyciQwMzwvcGVyc19hbnJlZGU+CgkJPHBlcnNfbmFjaG5hbWU+VGVzdGVybWFubjwvcGVyc19uYWNobmFtZT4KCQk8cGVyc192b3JuYW1lPk1heDwvcGVyc192b3JuYW1lPgoJCTxwZXJzX2dlYnVydHNuYW1lPk1heCBUZXN0ZXJtYW5uPC9wZXJzX2dlYnVydHNuYW1lPgoJCTxwZXJzX2dlYnVydHNkYXR1bT4xOTk1LTAzLTIxPC9wZXJzX2dlYnVydHNkYXR1bT4KCQk8cGVyc19nZWJ1cnRzb3J0PkZsZW5zYnVyZzwvcGVyc19nZWJ1cnRzb3J0PgoJCTxwZXJzX2dlYnVydHNsYW5kPmRldXRzY2gkRGV1dHNjaGxhbmQkMDAwPC9wZXJzX2dlYnVydHNsYW5kPgoJCTxwZXJzX3N0YWF0c2FuZ2Vob2VyaWdrZWl0PmRldXRzY2gkRGV1dHNjaGxhbmQkMDAwPC9wZXJzX3N0YWF0c2FuZ2Vob2VyaWdrZWl0PgoJCTxiX2FucmVkZT5IZXJyPC9iX2FucmVkZT4KCQk8Yl9hbnJlZGVfc2NobHVlc3NlbG5yPjAzPC9iX2FucmVkZV9zY2hsdWVzc2VsbnI+CgkJPGJfZ2VidXJ0c2xhbmQ+RGV1dHNjaGxhbmQ8L2JfZ2VidXJ0c2xhbmQ+CgkJPGJfZ2VidXJ0c2xhbmRfc2lnbmF0dXI+MDAwPC9iX2dlYnVydHNsYW5kX3NpZ25hdHVyPgoJCTxiX3N0YWF0c2FuZ2Vob2VyaWdrZWl0PmRldXRzY2g8L2Jfc3RhYXRzYW5nZWhvZXJpZ2tlaXQ+CgkJPGJfc3RhYXRzYW5nZWhvZXJpZ2tlaXRfc2lnbmF0dXI+MDAwPC9iX3N0YWF0c2FuZ2Vob2VyaWdrZWl0X3NpZ25hdHVyPgoJCTxzaF9zdHJhc3NlPkvDtm5pZ3N3ZWc8L3NoX3N0cmFzc2U+CgkJPHNoX2hhdXNudW1tZXI+NzQ8L3NoX2hhdXNudW1tZXI+CgkJPHNoX3Bsej4yNDgzNzwvc2hfcGx6PgoJCTxvcnRfYXVzd2FobD45MDA3MzE0JDAxMDU5MDc1PC9vcnRfYXVzd2FobD4KCQk8b3J0PlNjaGxlc3dpZzwvb3J0PgoJCTxHZWJpZXRJRD45MDA3MzE0PC9HZWJpZXRJRD4KCQk8R2ViaWV0QkVaRUlDSE5VTkc+U2NobGVzd2lnPC9HZWJpZXRCRVpFSUNITlVORz4KCQk8R2ViaWV0R05SOTRfR05SPjAxMDU5MDc1PC9HZWJpZXRHTlI5NF9HTlI+CgkJPHN0YWF0PjAwMDwvc3RhYXQ+CgkJPGlzbzMxNjZudW1lcmlzY2g+Mjc2PC9pc28zMTY2bnVtZXJpc2NoPgoJCTxrb250X3RlbGVmb25udW1tZXI+KyA0OSA0NjIxIDk2NTQ8L2tvbnRfdGVsZWZvbm51bW1lcj4KCQk8a29udF9tb2JpbG51bW1lcj4rNDkgMTIzPC9rb250X21vYmlsbnVtbWVyPgoJCTxrb250X3RlbGVmYXhudW1tZXI+KyA0OSA0NjIxIDk2NTQ8L2tvbnRfdGVsZWZheG51bW1lcj4KCQk8a29udF9lbWFpbD5tYXgudGVzdGVybWFubkBnbXguZGU8L2tvbnRfZW1haWw+CgkJPGtvbnRfZGVtYWlsPm1heC50ZXN0ZXJtYW5uQGdteC5kZS1tYWlsLmRlPC9rb250X2RlbWFpbD4KCQk8cGVyc29lbmxpY2hlRWlnbnVuZz4KCQkJPG1hZW5nZWx2b3JoYW5kZW4+ZmFsc2U8L21hZW5nZWx2b3JoYW5kZW4+CgkJCTxlcm1pdHRsdW5nc3ZlcmZhaHJlbj5mYWxzZTwvZXJtaXR0bHVuZ3N2ZXJmYWhyZW4+CgkJCTxNaXRnbGllZHNjaGFmdEluVmVyYm90ZXJuZXJWZXJlaW5pZ3VuZz5mYWxzZTwvTWl0Z2xpZWRzY2hhZnRJblZlcmJvdGVybmVyVmVyZWluaWd1bmc+CgkJPC9wZXJzb2VubGljaGVFaWdudW5nPgoJPC9hbnRyYWdzdGVsbGVyPgoJPEdlYmlldElEPjkwMDczMTQ8L0dlYmlldElEPgoJPHp1c3RhZW5kaWdlc3RlbGxlPgoJCTxPcmdhbmlzYXRpb25zZWluaGVpdGVuQXVzd2FobD45NTM1NjY5PC9PcmdhbmlzYXRpb25zZWluaGVpdGVuQXVzd2FobD4KCQk8T3JnYW5pc2F0aW9uc2VpbmhlaXRlbklEPjk1MzU2Njk8L09yZ2FuaXNhdGlvbnNlaW5oZWl0ZW5JRD4KCQk8T3JnYW5pc2F0aW9uc2VpbmhlaXRlbkJFWkVJQ0hOVU5HPktyZWlzCgkJCVNjaGxlc3dpZy1GbGVuc2J1cmcvS3JlaXN2ZXJ3YWx0dW5nIC0gQWxsZ2VtZWluZQoJCQlPcmRudW5nc2FuZ2VsZWdlbmhlaXRlbjwvT3JnYW5pc2F0aW9uc2VpbmhlaXRlbkJFWkVJQ0hOVU5HPgoJCTxzdHJhc3NlPkZsZW5zYnVyZ2VyIFN0cmHDn2U8L3N0cmFzc2U+CgkJPGhhdXNudW1tZXI+NzwvaGF1c251bW1lcj4KCQk8cG9zdGxlaXR6YWhsPjI0ODM3PC9wb3N0bGVpdHphaGw+CgkJPG9ydElEPjkwMDczMTQ8L29ydElEPgoJCTxvcnQ+U2NobGVzd2lnPC9vcnQ+CgkJPHRlbGVmb25udW1tZXI+MDQ2MjEgODctMDwvdGVsZWZvbm51bW1lcj4KCQk8dGVsZWZheG51bW1lcj4wNDYyMSA4Ny0zNjY8L3RlbGVmYXhudW1tZXI+CgkJPGVtYWlsYWRyZXNzZT5HZWZhaHJlbmFid2VockBLaWVsLmRlPC9lbWFpbGFkcmVzc2U+CgkJPGRlbWFpbGFkcmVzc2UgLz4KCQk8a29udGFrdHN5c3RlbV9rZW5udW5nPmFmbXNoOjk1MzU2Njlfa2xlaW5lcldhZmZlbnNjaGVpbjwva29udGFrdHN5c3RlbV9rZW5udW5nPgoJCTxrb250YWt0c3lzdGVtX2tlbm51bmd6dXNhdHogLz4KCQk8QW5saWVnZW5CRVpFSUNITlVORz5XYWZmZW5zY2hlaW4gLyBLbGVpbmVyIFdhZmZlbnNjaGVpbjwvQW5saWVnZW5CRVpFSUNITlVORz4KCQk8bGVpa2FLRVlMSVNUPjk5MDg5MDA4MDAwMDAwOzk5MDg5MDA4MDAxMDAwPC9sZWlrYUtFWUxJU1Q+CgkJPGF1c3dhaGxfenVzdGVsbHVuZz5hYmhvbGVuPC9hdXN3YWhsX3p1c3RlbGx1bmc+CgkJPGJfenVzdGVsbHVuZz5JY2ggaG9sZSBkZW4gS2xlaW5lbiBXYWZmZW5zY2hlaW4gc2VsYnN0IGFiLjwvYl96dXN0ZWxsdW5nPgoJPC96dXN0YWVuZGlnZXN0ZWxsZT4KCTxlbXBmYW5nZW5kZXN0ZWxsZT4KCQk8T3JnYW5pc2F0aW9uc2VpbmhlaXRlbkF1c3dhaGw+OTA2ODg3MzwvT3JnYW5pc2F0aW9uc2VpbmhlaXRlbkF1c3dhaGw+CgkJPE9yZ2FuaXNhdGlvbnNlaW5oZWl0ZW5JRD45MDY4ODczPC9PcmdhbmlzYXRpb25zZWluaGVpdGVuSUQ+CgkJPE9yZ2FuaXNhdGlvbnNlaW5oZWl0ZW5CRVpFSUNITlVORz5FaW5oZWl0bGljaGVyIEFuc3ByZWNocGFydG5lcgoJCQlTY2hsZXN3aWctSG9sc3RlaW48L09yZ2FuaXNhdGlvbnNlaW5oZWl0ZW5CRVpFSUNITlVORz4KCQk8c3RyYXNzZT5SZXZlbnRsb3VhbGxlZTwvc3RyYXNzZT4KCQk8aGF1c251bW1lcj42PC9oYXVzbnVtbWVyPgoJCTxwb3N0bGVpdHphaGw+MjQxMDU8L3Bvc3RsZWl0emFobD4KCQk8b3J0SUQ+OTAwNjQwMjwvb3J0SUQ+CgkJPG9ydD5LaWVsPC9vcnQ+CgkJPHRlbGVmb25udW1tZXI+KzQ5IDQzMSA5ODgtODY1MDwvdGVsZWZvbm51bW1lcj4KCQk8dGVsZWZheG51bW1lcj4rNDkgNDMxIDk4OC02MTYxMTExPC90ZWxlZmF4bnVtbWVyPgoJCTxlbWFpbGFkcmVzc2U+aW5mb0BlYS1zaC5kZTwvZW1haWxhZHJlc3NlPgoJCTxkZW1haWxhZHJlc3NlPmVhLXBvc3RzdGVsbGVAZWEtc2guZGUtbWFpbC5kZTwvZGVtYWlsYWRyZXNzZT4KCQk8a29udGFrdHN5c3RlbV9rZW5udW5nPmFmbXNoOjkwNjg4NzNfQXVzbmFobWVMS1dGYWhydmVyYm90PC9rb250YWt0c3lzdGVtX2tlbm51bmc+CgkJPGtvbnRha3RzeXN0ZW1fa2VubnVuZ3p1c2F0ej5hbGxlPC9rb250YWt0c3lzdGVtX2tlbm51bmd6dXNhdHo+Cgk8L2VtcGZhbmdlbmRlc3RlbGxlPgoJPGVya2xhZXJ1bmdlbj4KCQk8Y2hlY2tfZ2VidWVocmVuPnRydWU8L2NoZWNrX2dlYnVlaHJlbj4KCQk8Y2hlY2tfcmljaHRpZ2tlaXQ+dHJ1ZTwvY2hlY2tfcmljaHRpZ2tlaXQ+CgkJPGNoZWNrX2RhdGVuc2NodXR6PnRydWU8L2NoZWNrX2RhdGVuc2NodXR6PgoJCTxjaGVja19taXNzYnJhdWNoPnRydWU8L2NoZWNrX21pc3NicmF1Y2g+CgkJPGJfZ2VidWVocmVuX2Jlc2NocmlmdHVuZz4qIE1pciBpc3QgYmVrYW5udCwgZGFzcyBkdXJjaCBkYXMgRWlucmVpY2hlbgoJCQlkZXMgZWxla3Ryb25pc2NoZW4gQW50cmFnZXMgdm9uIGRlciB6dXN0w6RuZGlnZW4gU3RlbGxlIEdlYsO8aHJlbgoJCQllcmhvYmVuIHdlcmRlbiBrw7ZubmVuLjwvYl9nZWJ1ZWhyZW5fYmVzY2hyaWZ0dW5nPgoJCTxiX2dlYnVlaHJlbl9pbnRybz5HZWLDvGhyIGJlaSBBdXNzdGVsbHVuZyBkZXMga2xlaW5lbiBXYWZmZW5zY2hlaW5zOgoJCQk2MCwwMCBFdXJvLiBCZWFyYmVpdHVuZ3NnZWLDvGhyIGJlaSBWZXJzYWd1bmc6IDQ1LDAwIEV1cm8uCgkJCVNpZSBzaW5kIGdlbcOkw58gwqcgMzkgV2FmZkcgdmVycGZsaWNodGV0LCBkZXIgenVzdMOkbmRpZ2VuIEJlaMO2cmRlIGRpZSB6dXIKCQkJRHVyY2hmw7xocnVuZyBkZXMgR2VzZXR6ZXMgZXJmb3JkZXJsaWNoZW4gQXVza8O8bmZ0ZSB6dSBlcnRlaWxlbi4gWnVyCgkJCVByw7xmdW5nIElocmVyIHdhZmZlbnJlY2h0bGljaGVuIFp1dmVybMOkc3NpZ2tlaXQgdW5kIEVpZ251bmcgaG9sdCBkaWUKCQkJQmVow7ZyZGUgZWluZSB1bmJlc2NocsOkbmt0ZSBBdXNrdW5mdCBhdXMgZGVtIEJ1bmRlc3plbnRyYWxyZWdpc3RlciwKCQkJZWluZSBBdXNrdW5mdCBhdXMgZGVtIHplbnRyYWxlbiBzdGFhdHNhbndhbHRzY2hhZnRsaWNoZW4KCQkJVmVyZmFocmVuc3JlZ2lzdGVyLCBlaW5lIFN0ZWxsdW5nbmFobWUgZGVyIMO2cnRsaWNoZW4KCQkJUG9saXplaWRpZW5zdHN0ZWxsZSB1bmQgSWhyZXIgV29obnNpdHpnZW1laW5kZSBlaW4uPC9iX2dlYnVlaHJlbl9pbnRybz4KCQk8Yl9yaWNodGlna2VpdD4qIEljaCBiZXN0w6R0aWdlIGRpZSBSaWNodGlna2VpdCBtZWluZXIgQW5nYWJlbi48L2JfcmljaHRpZ2tlaXQ+CgkJPGJfZGF0ZW5zY2h1dHo+KiBJY2ggZXJrbMOkcmUgbWljaCBkYW1pdCBlaW52ZXJzdGFuZGVuLCBkYXNzIGRlcgoJCQlFaW5oZWl0bGljaGVyIEFuc3ByZWNocGFydG5lciBTY2hsZXN3aWctSG9sc3RlaW4genVyIEVyZsO8bGx1bmcgc2VpbmVyCgkJCUF1ZmdhYmVuIG1laW5lIERhdGVuIHVudGVyIEVpbmhhbHR1bmcgZGVyIEJlc3RpbW11bmdlbiBkZXIKCQkJRGF0ZW5zY2h1dHotR3J1bmR2ZXJvcmRudW5nIChEUy1HVk8pIHVuZCBkZXMKCQkJTGFuZGVzZGF0ZW5zY2h1dHpnZXNldHplcyBTY2hsZXN3aWctSG9sc3RlaW4gKExEU0ctU0gpIHNwZWljaGVydCwKCQkJdmVyYXJiZWl0ZXQgdW5kIGRpZXNlIGltIFJhaG1lbiBkZXIgZ2VzZXR6bGljaGVuIEJlc3RpbW11bmdlbiBhbiBkaWUKCQkJZsO8ciBkaWUgRW50c2NoZWlkdW5nIHp1c3TDpG5kaWdlIFN0ZWxsZSB3ZWl0ZXJsZWl0ZXQuIEViZW5zbyBiaW4gaWNoCgkJCW1pdCBkZXIgcmVjaHRza29uZm9ybWVuIERhdGVudmVyYXJiZWl0dW5nIHVuZCBTcGVpY2hlcnVuZyBkdXJjaCBkaWUKCQkJenVzdMOkbmRpZ2UgU3RlbGxlIGVpbnZlcnN0YW5kZW4uIE1pciBpc3QgYmVrYW5udCwgZGFzcyBpY2ggZGllCgkJCUVpbndpbGxpZ3VuZyBpbiBkaWUgVmVyYXJiZWl0dW5nIHVuZCDDnGJlcm1pdHRsdW5nIGplZGVyemVpdCBnZWdlbsO8YmVyCgkJCWRlbSBFaW5oZWl0bGljaGVyIEFuc3ByZWNocGFydG5lciBTY2hsZXN3aWctSG9sc3RlaW4sIFJldmVudGxvdWFsbGVlCgkJCTYsIDI0MTA1IEtpZWwgd2lkZXJydWZlbiBrYW5uLiBFaW4gV2lkZXJydWYgaXN0IGFiZXIgbnVyIHdpcmtzYW0gZsO8cgoJCQlkaWUgWnVrdW5mdC4gVmVyYXJiZWl0dW5nZW4sIGRpZSB2b3IgZGVtIFdpZGVycnVmIGVyZm9sZ3Qgc2luZCwgc2luZAoJCQlkYXZvbiBuaWNodCBiZXRyb2ZmZW4uIMOcYmVyIGRpZSBWZXJhcmJlaXR1bmcgbWVpbmVyIHBlcnNvbmVuYmV6b2dlbmVuCgkJCURhdGVuIHVuZCBkaWUgbWlyIG5hY2ggZGVuIGRhdGVuc2NodXR6cmVjaHRsaWNoZW4gUmVnZWx1bmdlbgoJCQl6dXN0ZWhlbmRlbiBBbnNwcsO8Y2hlIHVuZCBSZWNodGUgaGFiZSBpY2ggdW50ZXIgRGF0ZW5zY2h1dHplcmtsw6RydW5nCgkJCUtlbm50bmlzIGVybGFuZ3QuPC9iX2RhdGVuc2NodXR6PgoJCTxiX21pc3NicmF1Y2g+KiBNaXIgaXN0IGJla2FubnQsIGRhc3MgenVyIFZlcmZvbGd1bmcgd2lkZXJyZWNodGxpY2hlcgoJCQlOdXR6dW5nIGRpZSBEYXRlbiBtZWluZXMgenVyIERhdGVuZWluZ2FiZSBnZW51dHp0ZW4gRW5kZ2Vyw6R0ZXMKCQkJYXVmZ2V6ZWljaG5ldCB1bmQgdmVyd2VuZGV0IHdlcmRlbiBrw7ZubmVuLjwvYl9taXNzYnJhdWNoPgoJCTxwb2xpY3l1cmw+aHR0cDovL3dhZm14cGEwMDIuZHBhb3IuZGUvc2gvZGF0ZW5zY2h1dHovZGF0ZW5zY2h1dHplcmtsYWVydW5nRUFfZGUuZG9jPC9wb2xpY3l1cmw+Cgk8L2Vya2xhZXJ1bmdlbj4KCTxsb2dvdXJsPmh0dHA6Ly93YWZteHBhMDAyLmRwYW9yLmRlL3NoL2xvZ29zL2tvcGZfOTA2ODg3My5kb2M8L2xvZ291cmw+Cgk8Zm0+CgkJPGFuc3ByZWNocGFydG5lcj4KCQkJPGZpcm1lbm5hbWUgLz4KCQkJPGFucmVkZT5IZXJyPC9hbnJlZGU+CgkJCTx2b3JuYW1lPk1heDwvdm9ybmFtZT4KCQkJPGZhbWlsaWVubmFtZT5UZXN0ZXJtYW5uPC9mYW1pbGllbm5hbWU+CgkJCTxhbnNjaHJpZnQ+CgkJCQk8c3RyYXNzZT5Lw7ZuaWdzd2VnPC9zdHJhc3NlPgoJCQkJPGhhdXNudW1tZXI+NzQ8L2hhdXNudW1tZXI+CgkJCQk8cG9zdGZhY2ggLz4KCQkJCTxwb3N0bGVpdHphaGw+MjQ4Mzc8L3Bvc3RsZWl0emFobD4KCQkJCTxvcnQ+U2NobGVzd2lnPC9vcnQ+CgkJCQk8b3J0c3RlaWwgLz4KCQkJCTx6dXNhdHogLz4KCQkJCTxzdGFhdD5EZXV0c2NobGFuZDwvc3RhYXQ+CgkJCTwvYW5zY2hyaWZ0PgoJCQk8a29udGFrdD4KCQkJCTx0ZWxlZm9ubnVtbWVyPisgNDkgNDYyMSA5NjU0PC90ZWxlZm9ubnVtbWVyPgoJCQkJPG1vYmlsbnVtbWVyPis0OSAxMjM8L21vYmlsbnVtbWVyPgoJCQkJPHRlbGVmYXhudW1tZXI+KyA0OSA0NjIxIDk2NTQ8L3RlbGVmYXhudW1tZXI+CgkJCQk8ZW1haWxhZHJlc3NlPm1heC50ZXN0ZXJtYW5uQGdteC5kZTwvZW1haWxhZHJlc3NlPgoJCQkJPGRlbWFpbGFkcmVzc2U+bWF4LnRlc3Rlcm1hbm5AZ214LmRlLW1haWwuZGU8L2RlbWFpbGFkcmVzc2U+CgkJCTwva29udGFrdD4KCQk8L2Fuc3ByZWNocGFydG5lcj4KCQk8dmVyd2FsdHVuZ3NsZWlzdHVuZ2VuPgoJCQk8dmVyd2FsdHVuZ3NsZWlzdHVuZz4KCQkJCTxhdXNnZXdhZWhsdGVfenVzdGFlbmRpZ2VzdGVsbGU+CgkJCQkJPE9yZ2FuaXNhdGlvbnNlaW5oZWl0ZW5JRD45NTM1NjY5PC9PcmdhbmlzYXRpb25zZWluaGVpdGVuSUQ+CgkJCQkJPE9yZ2FuaXNhdGlvbnNlaW5oZWl0ZW5CRVpFSUNITlVORz5LcmVpcwoJCQkJCQlTY2hsZXN3aWctRmxlbnNidXJnL0tyZWlzdmVyd2FsdHVuZyAtIEFsbGdlbWVpbmUKCQkJCQkJT3JkbnVuZ3NhbmdlbGVnZW5oZWl0ZW48L09yZ2FuaXNhdGlvbnNlaW5oZWl0ZW5CRVpFSUNITlVORz4KCQkJCTwvYXVzZ2V3YWVobHRlX3p1c3RhZW5kaWdlc3RlbGxlPgoJCQkJPEdlYmlldElEPjkwMDczMTQ8L0dlYmlldElEPgoJCQkJPEdlYmlldEJFWkVJQ0hOVU5HPlNjaGxlc3dpZzwvR2ViaWV0QkVaRUlDSE5VTkc+CgkJCQk8QW5saWVnZW5JRD44OTY2NjcxPC9BbmxpZWdlbklEPgoJCQkJPEFubGllZ2VuQkVaRUlDSE5VTkc+V2FmZmVuc2NoZWluIC8gS2xlaW5lciBXYWZmZW5zY2hlaW48L0FubGllZ2VuQkVaRUlDSE5VTkc+CgkJCQk8bGVpa2FLRVlMSVNUPjk5MDg5MDA4MDAwMDAwOzk5MDg5MDA4MDAxMDAwPC9sZWlrYUtFWUxJU1Q+CgkJCQk8bGVpa2FCRVpFSUNITlVORyAvPgoJCQk8L3ZlcndhbHR1bmdzbGVpc3R1bmc+CgkJPC92ZXJ3YWx0dW5nc2xlaXN0dW5nZW4+Cgk8L2ZtPgo8L215Rm9ybT4=</content> - <contentType>text/xml</contentType> - <id>myForm-xml</id> - <name>XML-Daten.xml</name> - </attachments> - <caller /> - <client>sh-dev</client> - <clientId>sh-dev</clientId> - <customer>Kiel</customer> - <customerId>Kiel</customerId> - <form>SimpleFormSendetAnTestServer</form> - <formId>SimpleFormSendetAnTestServer</formId> - <id>20221212092912345678</id> - <primaryDataAttachmentId>myForm-xml</primaryDataAttachmentId> - <sender>intelliform.ozg-sh.de</sender> - <timestamp>2022-12-12T09:30:29.443Z</timestamp> - <nameid>nameIdAsPostfachIdV1</nameid> - <username /> - </data> - </ns2:deposit> - </soap:Body> -</soap:Envelope> diff --git a/intelliform-adapter/src/test/resources/itcase/XML-Daten-1-other_name_SoapRequest.xml b/intelliform-adapter/src/test/resources/itcase/XML-Daten-1-other_name_SoapRequest.xml deleted file mode 100644 index 14458c0ac3d589c0b7d4c4e5109568fe3b29b389..0000000000000000000000000000000000000000 --- a/intelliform-adapter/src/test/resources/itcase/XML-Daten-1-other_name_SoapRequest.xml +++ /dev/null @@ -1,30 +0,0 @@ -<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> - <soap:Body> - <ns2:deposit xmlns:ns2="http://xmlns.cit.de/intelliform/2009/webservices/backend"> - <data> - <attachments> - <attributes> - <key>X-IntelliForm-Signed</key> - <value>false</value> - </attributes> - <content>PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPG15Rm9ybSB4bWxuczpwZGY9Imh0dHA6Ly94bWxucy5jaXQuZGUvYXNzaXN0YW50cy9wZGYiCgl4bWxuczp0PSJodHRwOi8veG1sbnMuY2l0LmRlL2ludGVsbGlmb3JtL3RyYW5zYWN0aW9uIgoJdDppZD0iMjAyMDExMTgzNjU2NzA4NjYxMDEiIHQ6dGltZXN0YW1wPSIyMDIwLTExLTE4VDA5OjA5OjI3LjYyN1oiCgl0OnNlbmRlcj0iYWZtLnNjaGxlc3dpZy1ob2xzdGVpbi5kZSIKCXQ6Zm9ybT0iS2xlaW5lciBXYWZmZW5zY2hlaW4gZ2VtLiDCpyAxMCBBYnMuIDQgU2F0eiA0IFdhZmZlbmdlc2V0eiAoV2FmZkcpIgoJdDpmb3JtLWlkPSJ3YWZmZW4va2xlaW5lcldhZmZlbnNjaGVpbiIKCXQ6Y3VzdG9tZXI9IkVpbmhlaXRsaWNoZXIgQW5zcHJlY2hwYXJ0bmVyIiB0OmN1c3RvbWVyLWlkPSJlYS1zaCIKCXQ6Y2xpZW50PSJTY2hsZXN3aWctSG9sc3RlaW4iIHQ6Y2xpZW50LWlkPSJsYW5kIj4KCQoJPHp1c3RhZW5kaWdlc3RlbGxlPgoJCTxPcmdhbmlzYXRpb25zZWluaGVpdGVuSUQ+MDgxNTwvT3JnYW5pc2F0aW9uc2VpbmhlaXRlbklEPgoJPC96dXN0YWVuZGlnZXN0ZWxsZT4KPC9teUZvcm0+</content> - <contentType>text/xml</contentType> - <id>myForm-xml</id> - <name>anderer-name-Daten.xml</name> - </attachments> - <caller /> - <client>sh-dev</client> - <clientId>sh-dev</clientId> - <customer>Kiel</customer> - <customerId>Kiel</customerId> - <form>SimpleFormSendetAnHomeServer</form> - <formId>SimpleFormSendetAnHomeServer</formId> - <id>20210415307020414701</id> - <primaryDataAttachmentId>myForm-xml</primaryDataAttachmentId> - <sender>intelliform.by.kop-cloud.de</sender> - <timestamp>2021-04-15T08:33:39.443Z</timestamp> - <username /> - </data> - </ns2:deposit> - </soap:Body> -</soap:Envelope> \ No newline at end of file diff --git a/intelliform-adapter/src/test/resources/junit-platform.properties b/intelliform-adapter/src/test/resources/junit-platform.properties deleted file mode 100644 index 1cebb76d5a58ac034b2627d12411d82d1e85821e..0000000000000000000000000000000000000000 --- a/intelliform-adapter/src/test/resources/junit-platform.properties +++ /dev/null @@ -1 +0,0 @@ -junit.jupiter.extensions.autodetection.enabled = true \ No newline at end of file diff --git a/intelliform-adapter/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker b/intelliform-adapter/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker deleted file mode 100644 index ca6ee9cea8ec189a088d50559325d4e84ff8ad09..0000000000000000000000000000000000000000 --- a/intelliform-adapter/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker +++ /dev/null @@ -1 +0,0 @@ -mock-maker-inline \ No newline at end of file diff --git a/pom.xml b/pom.xml index 065dc6a05b19957b9f766f2a823c33875e5df10e..68d57529fff4af6fb9b009b539e9d914a55bb259 100644 --- a/pom.xml +++ b/pom.xml @@ -1,211 +1,256 @@ -<?xml version="1.0"?> -<!-- - - Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - Ministerpräsidenten des Landes Schleswig-Holstein - Staatskanzlei - Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - - Lizenziert unter der EUPL, Version 1.2 oder - sobald - diese von der Europäischen Kommission genehmigt wurden - - Folgeversionen der EUPL ("Lizenz"); - Sie dürfen dieses Werk ausschließlich gemäß - dieser Lizenz nutzen. - Eine Kopie der Lizenz finden Sie hier: - - https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - - Sofern nicht durch anwendbare Rechtsvorschriften - gefordert oder in schriftlicher Form vereinbart, wird - die unter der Lizenz verbreitete Software "so wie sie - ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - ausdrücklich oder stillschweigend - verbreitet. - Die sprachspezifischen Genehmigungen und Beschränkungen - unter der Lizenz sind dem Lizenztext zu entnehmen. - ---> -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> - +<project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>de.ozgcloud.common</groupId> <artifactId>ozgcloud-common-parent</artifactId> - <version>4.7.0</version> - <relativePath/> <!-- lookup parent from repository --> + <version>4.6.0</version> </parent> <groupId>de.ozgcloud.eingang</groupId> - <artifactId>eingang-manager</artifactId> + <artifactId>formsolutions-adapter</artifactId> <version>2.16.0-SNAPSHOT</version> - <packaging>pom</packaging> - <name>OZG-Cloud Eingang Manager</name> - - <modules> - <module>common</module> - <module>formsolutions-adapter</module> - <module>intelliform-adapter</module> - <module>router</module> - <module>forwarder</module> - <module>semantik-adapter</module> - <module>formcycle-adapter</module> - <module>xta-adapter</module> - <module>enterprise-adapter</module> - <module>fim-adapter</module> - </modules> - <properties> - <vorgang-manager.version>2.10.0</vorgang-manager.version> - <zufi-manager.version>1.2.0</zufi-manager.version> + <name>FormSolutions-Adapter</name> + <description>Eingang-Adapter für FormSolutions</description> + <packaging>jar</packaging> - <jsoup.version>1.14.3</jsoup.version> - <xmlschema.version>2.3.0</xmlschema.version> + <properties> + <eingang-manager.version>2.15.0</eingang-manager.version> + <formsolutions-semantik.version>0.2.0-SNAPSHOT</formsolutions-semantik.version> - <!-- plugins --> - <jaxb2-plugin.version>0.15.2</jaxb2-plugin.version> <jaxb3-plugin.version>0.15.0</jaxb3-plugin.version> - <mojo-jaxb2-plugin.version>3.1.0</mojo-jaxb2-plugin.version> + <xmlschema.version>2.3.0</xmlschema.version> </properties> + <dependencies> + <!-- OZG-Cloud --> + <dependency> + <groupId>de.ozgcloud.eingang</groupId> + <artifactId>common</artifactId> + <version>${eingang-manager.version}</version> + </dependency> + <dependency> + <groupId>de.ozgcloud.eingang</groupId> + <artifactId>formsolutions-semantik</artifactId> + <version>${formsolutions-semantik.version}</version> + </dependency> + <dependency> + <groupId>de.ozgcloud.eingang</groupId> + <artifactId>semantik-adapter</artifactId> + <version>${eingang-manager.version}</version> + </dependency> - <dependencyManagement> - <dependencies> - - <!-- own projects --> - <dependency> - <groupId>de.ozgcloud.eingang</groupId> - <artifactId>common</artifactId> - <version>${project.version}</version> - </dependency> - <dependency> - <groupId>de.ozgcloud.eingang</groupId> - <artifactId>router</artifactId> - <version>${project.version}</version> - </dependency> - <dependency> - <groupId>de.ozgcloud.eingang</groupId> - <artifactId>semantik-adapter</artifactId> - <version>${project.version}</version> - </dependency> - <dependency> - <groupId>de.ozgcloud.eingang</groupId> - <artifactId>fim-adapter</artifactId> - <version>${project.version}</version> - </dependency> - <dependency> - <groupId>de.ozgcloud.vorgang</groupId> - <artifactId>vorgang-manager-interface</artifactId> - <version>${vorgang-manager.version}</version> - </dependency> - <dependency> - <groupId>de.ozgcloud.vorgang</groupId> - <artifactId>vorgang-manager-utils</artifactId> - <version>${vorgang-manager.version}</version> - </dependency> - <dependency> - <groupId>de.ozgcloud.zufi</groupId> - <artifactId>zufi-manager-interface</artifactId> - <version>${zufi-manager.version}</version> - </dependency> - - <dependency> - <groupId>org.jsoup</groupId> - <artifactId>jsoup</artifactId> - <version>${jsoup.version}</version> - </dependency> - - <dependency> - <groupId>org.apache.ws.xmlschema</groupId> - <artifactId>xmlschema-core</artifactId> - <version>${xmlschema.version}</version> - </dependency> - - <!-- Test --> - <dependency> - <groupId>de.ozgcloud.eingang</groupId> - <artifactId>common</artifactId> - <type>test-jar</type> - <scope>test</scope> - <version>${project.version}</version> - </dependency> - <dependency> - <groupId>de.ozgcloud.vorgang</groupId> - <artifactId>vorgang-manager-utils</artifactId> - <version>${vorgang-manager.version}</version> - <type>test-jar</type> - <scope>test</scope> - </dependency> - </dependencies> - </dependencyManagement> + <dependency> + <groupId>org.mapstruct</groupId> + <artifactId>mapstruct</artifactId> + </dependency> - <build> - <pluginManagement> - <plugins> - <plugin> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-maven-plugin</artifactId> - <configuration> - <mainClass>de.ozgcloud.eingang.Application</mainClass> - </configuration> - </plugin> - - <!-- tag::webservice[] --> - <plugin> - <groupId>org.codehaus.mojo</groupId> - <artifactId>jaxb2-maven-plugin</artifactId> - <version>${mojo-jaxb2-plugin.version} </version> - <executions> - <execution> - <id>xjc</id> - <goals> - <goal>xjc</goal> - </goals> - </execution> - </executions> - </plugin> - <plugin> - <groupId>com.evolvedbinary.maven.jvnet</groupId> - <artifactId>jaxb30-maven-plugin</artifactId> - <version>${jaxb3-plugin.version}</version> - <executions> - <execution> - <goals> - <goal>generate</goal> - </goals> - </execution> - </executions> - </plugin> - <plugin> - <groupId>org.jvnet.jaxb2.maven2</groupId> - <artifactId>maven-jaxb2-plugin</artifactId> - <version>${jaxb2-plugin.version}</version> - <executions> - <execution> - <goals> - <goal>generate</goal> - </goals> - </execution> - </executions> - </plugin> - <!-- end::webservice --> - </plugins> - </pluginManagement> + <!-- Spring --> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-web-services</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-actuator</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-json</artifactId> + </dependency> + + <!-- tag::springws[] --> + <dependency> + <groupId>wsdl4j</groupId> + <artifactId>wsdl4j</artifactId> + </dependency> + + <dependency> + <groupId>org.apache.ws.xmlschema</groupId> + <artifactId>xmlschema-core</artifactId> + <version>${xmlschema.version}</version> + </dependency> + <!-- end::springws[] --> + + <!-- Dev --> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-devtools</artifactId> + <scope>runtime</scope> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-configuration-processor</artifactId> + <optional>true</optional> + </dependency> + <dependency> + <groupId>org.projectlombok</groupId> + <artifactId>lombok</artifactId> + </dependency> + + <!-- test --> + <dependency> + <groupId>de.ozgcloud.common</groupId> + <artifactId>ozgcloud-common-test</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>de.ozgcloud.eingang</groupId> + <artifactId>common</artifactId> + <version>${eingang-manager.version}</version> + <type>test-jar</type> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-test</artifactId> + <scope>test</scope> + <exclusions> + <exclusion> + <groupId>org.junit.vintage</groupId> + <artifactId>junit-vintage-engine</artifactId> + </exclusion> + </exclusions> + </dependency> + + <!-- commons --> + <dependency> + <groupId>org.apache.commons</groupId> + <artifactId>commons-lang3</artifactId> + </dependency> + + <!-- used by generated code --> + <!-- @Nullable annotation --> + <dependency> + <groupId>com.google.code.findbugs</groupId> + <artifactId>jsr305</artifactId> + </dependency> + </dependencies> + + <build> + <finalName>${project.artifactId}</finalName> <plugins> + <!-- tag::wsdl/xsd[] --> + <plugin> + <groupId>com.evolvedbinary.maven.jvnet</groupId> + <artifactId>jaxb30-maven-plugin</artifactId> + <version>${jaxb3-plugin.version}</version> + <executions> + <execution> + <goals> + <goal>generate</goal> + </goals> + </execution> + </executions> + <configuration> + <schemaLanguage>WSDL</schemaLanguage> + <generatePackage>de.ozgcloud.eingang.formsolutions</generatePackage> + <schemas> + <schema> + <fileset> + <directory>${basedir}/src/main/resources/wsdl</directory> + <includes> + <include>*.wsdl</include> + </includes> + </fileset> + </schema> + </schemas> + <schemaLanguage>WSDL</schemaLanguage> + </configuration> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-failsafe-plugin</artifactId> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-surefire-plugin</artifactId> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-compiler-plugin</artifactId> + </plugin> + <plugin> + <groupId>org.jacoco</groupId> + <artifactId>jacoco-maven-plugin</artifactId> + </plugin> + <plugin> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-maven-plugin</artifactId> + <configuration> + <mainClass>de.ozgcloud.eingang.Application</mainClass> + </configuration> + <executions> + <execution> + <phase>install</phase> + <goals> + <goal>build-image-no-fork</goal> + </goals> + </execution> + </executions> + </plugin> </plugins> </build> - <distributionManagement> - <repository> - <id>ozg-nexus</id> - <name>ozg-releases</name> - <url>https://nexus.ozg-sh.de/repository/ozg-releases/</url> - </repository> - <snapshotRepository> - <id>ozg-snapshots-nexus</id> - <name>ozg-snapshots</name> - <url>https://nexus.ozg-sh.de/repository/ozg-snapshots/</url> - </snapshotRepository> - </distributionManagement> - + <profiles> + <!-- Deployment Profiles --> + <profile> + <id>gitlab-deploy</id> + <activation> + <activeByDefault>false</activeByDefault> + </activation> + <build> + <plugins> + <plugin> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-maven-plugin</artifactId> + <configuration> + <image> + <name>${CI_REGISTRY_IMAGE}/${project.artifactId}:${project.version}</name> + <publish>true</publish> + </image> + <docker> + <publishRegistry> + <url>${CI_REGISTRY}</url> + <username>${CI_REGISTRY_USER}</username> + <password>${CI_REGISTRY_PASSWORD}</password> + </publishRegistry> + </docker> + </configuration> + </plugin> + </plugins> + </build> + </profile> + <profile> + <id>nexus-deploy</id> + <activation> + <activeByDefault>false</activeByDefault> + </activation> + <build> + <plugins> + <plugin> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-maven-plugin</artifactId> + <configuration> + <image> + <name>docker.ozg-sh.de/${project.artifactId}:${project.version}</name> + <publish>true</publish> + </image> + <docker> + <publishRegistry> + <url>docker.ozg-sh.de</url> + <username>${NEXUS_USER}</username> + <password>${NEXUS_PASSWORD}</password> + </publishRegistry> + </docker> + </configuration> + </plugin> + </plugins> + </build> + </profile> + </profiles> </project> diff --git a/release-erstellen.sh b/release-erstellen.sh deleted file mode 100755 index dfe2a755312486a606fc94a2187bd1e52c2e3271..0000000000000000000000000000000000000000 --- a/release-erstellen.sh +++ /dev/null @@ -1,27 +0,0 @@ -#!/bin/sh - -if [ "$#" -ne 1 ]; then - echo "Aufruf: ozg-release-erstellen.sh JA" - echo "Als Parameter bitte 'JA' eintragen zur Sicherheit" - exit 1 -fi - - -## alle -SNAPSHOT in pom.xmls entfernen -SED_PARAMS="-i" -if [[ "$OSTYPE" =~ ^darwin ]]; then - SED_PARAMS="$SED_PARAMS '' -e" -fi -find . -name pom.xml -exec sed $SED_PARAMS 's/-SNAPSHOT//g' {} + - -## release version auslesen -NEWVERSION=$(xmlstarlet sel -N w="http://maven.apache.org/POM/4.0.0" -t -v '//w:project/w:version' -n pom.xml) - -echo -echo "NEXT STEPS:" -echo "***********" -echo "Änderungen prüfen" -echo "git commit -a -m 'release version "$NEWVERSION"'" -echo "git push" -echo "git tag "$NEWVERSION -echo "git push --tags" diff --git a/release-startdev.sh b/release-startdev.sh deleted file mode 100755 index 5d6a39e49a00b06e4e2caad823d3a04f4409bfe4..0000000000000000000000000000000000000000 --- a/release-startdev.sh +++ /dev/null @@ -1,63 +0,0 @@ -#!/bin/bash - -#set -x - -if [ "$#" -ne 1 ]; then - echo "Aufruf: ozg-release-startdev.sh NEWVERSION" - exit 1 -fi - -NEWVERSION=$1 - -echo - -# pom.xml:main -> project.version setzen -# projectname/pom.xml:parent -> project.parent.version setzen -# projectname/pom.xml:parent,main -> project.parent.version und project.version setzen -# -PROJECTS="pom.xml:main - common/pom.xml:parent - enterprise-adapter/pom.xml:parent - formcycle-adapter/formcycle-adapter-impl/pom.xml:parent - formcycle-adapter/formcycle-adapter-interface/pom.xml:main - formcycle-adapter/pom.xml:parent - formsolutions-adapter/pom.xml:parent - xta-adapter/pom.xml:parent - forwarder/pom.xml:parent - intelliform-adapter/pom.xml:parent - router/pom.xml:parent - semantik-adapter/pom.xml:parent - " - -for PROJECT in $PROJECTS; -do - POMFILE=$(echo $PROJECT | cut -d':' -f1) - ACTIONS=$(echo $PROJECT | cut -d':' -f2) - - ## Auf SNAPSHOT Versionen testen - if fgrep -q "SNAPSHOT" $POMFILE; then - RED='\033[0;31m' - NC='\033[0m' - echo "${RED}ERROR: Datei "$POMFILE" enthält noch SNAPSHOT Versionen, das sollte hier nicht passieren.${NC}" - exit 1 - fi - - ## Versionen setzen - if [[ $ACTIONS == *"main"* ]] ; then - xmlstarlet ed --pf -L -N w="http://maven.apache.org/POM/4.0.0" -u '//w:project/w:version' -v $NEWVERSION $POMFILE - fi - - if [[ $ACTIONS == *"parent"* ]]; then - xmlstarlet ed --pf -L -N w="http://maven.apache.org/POM/4.0.0" -u '//w:project/w:parent/w:version' -v $NEWVERSION $POMFILE - fi -done - - - -echo -echo "NEXT STEPS:" -echo "***********" -echo "Änderungen prüfen" -echo "git commit -a -m 'start development "$NEWVERSION"'" -echo "git push" - diff --git a/router/pom.xml b/router/pom.xml deleted file mode 100644 index 695c7e22b127043a630d6bcf8432d79d9038f15a..0000000000000000000000000000000000000000 --- a/router/pom.xml +++ /dev/null @@ -1,113 +0,0 @@ -<?xml version="1.0"?> -<!-- - - Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - Ministerpräsidenten des Landes Schleswig-Holstein - Staatskanzlei - Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - - Lizenziert unter der EUPL, Version 1.2 oder - sobald - diese von der Europäischen Kommission genehmigt wurden - - Folgeversionen der EUPL ("Lizenz"); - Sie dürfen dieses Werk ausschließlich gemäß - dieser Lizenz nutzen. - Eine Kopie der Lizenz finden Sie hier: - - https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - - Sofern nicht durch anwendbare Rechtsvorschriften - gefordert oder in schriftlicher Form vereinbart, wird - die unter der Lizenz verbreitete Software "so wie sie - ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - ausdrücklich oder stillschweigend - verbreitet. - Die sprachspezifischen Genehmigungen und Beschränkungen - unter der Lizenz sind dem Lizenztext zu entnehmen. - ---> -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> - <modelVersion>4.0.0</modelVersion> - <parent> - <groupId>de.ozgcloud.eingang</groupId> - <artifactId>eingang-manager</artifactId> - <version>2.16.0-SNAPSHOT</version> - <relativePath>../</relativePath> - </parent> - - <artifactId>router</artifactId> - <name>Eingangs Adapter - Router</name> - - <dependencies> - <!-- own Projects --> - <dependency> - <groupId>de.ozgcloud.eingang</groupId> - <artifactId>common</artifactId> - </dependency> - <dependency> - <groupId>de.ozgcloud.vorgang</groupId> - <artifactId>vorgang-manager-interface</artifactId> - </dependency> - <dependency> - <groupId>de.ozgcloud.vorgang</groupId> - <artifactId>vorgang-manager-utils</artifactId> - </dependency> - <dependency> - <groupId>de.ozgcloud.zufi</groupId> - <artifactId>zufi-manager-interface</artifactId> - </dependency> - - <!-- spring --> - <dependency> - <groupId>net.devh</groupId> - <artifactId>grpc-client-spring-boot-starter</artifactId> - </dependency> - <dependency> - <groupId>io.grpc</groupId> - <artifactId>grpc-inprocess</artifactId> - </dependency> - - <!-- Tools --> - <dependency> - <groupId>org.apache.commons</groupId> - <artifactId>commons-lang3</artifactId> - </dependency> - - <!-- Dev --> - <dependency> - <groupId>org.projectlombok</groupId> - <artifactId>lombok</artifactId> - </dependency> - - <!-- Test --> - <dependency> - <groupId>de.ozgcloud.eingang</groupId> - <artifactId>common</artifactId> - <type>test-jar</type> - <scope>test</scope> - </dependency> - <dependency> - <groupId>de.ozgcloud.vorgang</groupId> - <artifactId>vorgang-manager-utils</artifactId> - <type>test-jar</type> - <scope>test</scope> - </dependency> - </dependencies> - - <build> - <plugins> - <plugin> - <groupId>org.jacoco</groupId> - <artifactId>jacoco-maven-plugin</artifactId> - </plugin> - - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-surefire-plugin</artifactId> - </plugin> - - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-failsafe-plugin</artifactId> - </plugin> - </plugins> - </build> -</project> diff --git a/router/src/main/java/de/ozgcloud/eingang/common/zufi/OrganisationsEinheit.java b/router/src/main/java/de/ozgcloud/eingang/common/zufi/OrganisationsEinheit.java deleted file mode 100644 index 6b02d54577a0066a14537c931e37eefeecd36591..0000000000000000000000000000000000000000 --- a/router/src/main/java/de/ozgcloud/eingang/common/zufi/OrganisationsEinheit.java +++ /dev/null @@ -1,16 +0,0 @@ -package de.ozgcloud.eingang.common.zufi; - -import lombok.Builder; -import lombok.Getter; -import lombok.ToString; - -@ToString -@Getter -@Builder -class OrganisationsEinheit { - - private String id; - private String name; - private String synonyme; - private String vorgangManagerAddress; -} \ No newline at end of file diff --git a/router/src/main/java/de/ozgcloud/eingang/common/zufi/OrganisationsEinheitMapper.java b/router/src/main/java/de/ozgcloud/eingang/common/zufi/OrganisationsEinheitMapper.java deleted file mode 100644 index ad048c2cdbca5a22ab34c67a678abc50642b4764..0000000000000000000000000000000000000000 --- a/router/src/main/java/de/ozgcloud/eingang/common/zufi/OrganisationsEinheitMapper.java +++ /dev/null @@ -1,11 +0,0 @@ -package de.ozgcloud.eingang.common.zufi; - -import org.mapstruct.Mapper; - -import de.ozgcloud.zufi.grpc.organisationseinheit.GrpcOrganisationsEinheit; - -@Mapper -interface OrganisationsEinheitMapper { - - OrganisationsEinheit fromGrpc(GrpcOrganisationsEinheit organisationsEinheit); -} \ No newline at end of file diff --git a/router/src/main/java/de/ozgcloud/eingang/common/zufi/OrganisationsEinheitRemoteService.java b/router/src/main/java/de/ozgcloud/eingang/common/zufi/OrganisationsEinheitRemoteService.java deleted file mode 100644 index d7ec3990817a1649dd2e10c08fd5fd021daa24ea..0000000000000000000000000000000000000000 --- a/router/src/main/java/de/ozgcloud/eingang/common/zufi/OrganisationsEinheitRemoteService.java +++ /dev/null @@ -1,24 +0,0 @@ -package de.ozgcloud.eingang.common.zufi; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import de.ozgcloud.eingang.Application; -import de.ozgcloud.zufi.grpc.organisationseinheit.GrpcOrganisationsEinheitGetRequest; -import de.ozgcloud.zufi.grpc.organisationseinheit.OrganisationsEinheitServiceGrpc.OrganisationsEinheitServiceBlockingStub; -import net.devh.boot.grpc.client.inject.GrpcClient; - -@Service -class OrganisationsEinheitRemoteService { - - @GrpcClient(Application.ZUFI_MANAGER_GRPC_CLIENT) - private OrganisationsEinheitServiceBlockingStub serviceStub; - @Autowired - private OrganisationsEinheitMapper mapper; - - public OrganisationsEinheit getById(String id) { - var response = serviceStub.getById(GrpcOrganisationsEinheitGetRequest.newBuilder().setId(id).build()); - - return mapper.fromGrpc(response.getOrganisationsEinheit()); - } -} diff --git a/router/src/main/java/de/ozgcloud/eingang/common/zufi/ZufiService.java b/router/src/main/java/de/ozgcloud/eingang/common/zufi/ZufiService.java deleted file mode 100644 index 7992033c7b2a7bea338bc8e5a9a68014839cc66d..0000000000000000000000000000000000000000 --- a/router/src/main/java/de/ozgcloud/eingang/common/zufi/ZufiService.java +++ /dev/null @@ -1,16 +0,0 @@ -package de.ozgcloud.eingang.common.zufi; - -import org.springframework.stereotype.Service; - -import lombok.RequiredArgsConstructor; - -@RequiredArgsConstructor -@Service -public class ZufiService { - - private final OrganisationsEinheitRemoteService remoteService; - - public String getVorgangManagerUrl(String organisationsEinheitId) { - return remoteService.getById(organisationsEinheitId).getVorgangManagerAddress(); - } -} \ No newline at end of file diff --git a/router/src/main/java/de/ozgcloud/eingang/router/CallContext.java b/router/src/main/java/de/ozgcloud/eingang/router/CallContext.java deleted file mode 100644 index 9dc38d03d5398be0f0a3958d9ca06bd239912950..0000000000000000000000000000000000000000 --- a/router/src/main/java/de/ozgcloud/eingang/router/CallContext.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.router; - -import jakarta.validation.constraints.NotNull; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.ToString; - -@ToString -@Getter -@Builder -@AllArgsConstructor // https://mapstruct.org/documentation/stable/reference/html/#mapping-with-builders -public class CallContext { - - @NotNull - private String client; -} diff --git a/router/src/main/java/de/ozgcloud/eingang/router/ClosableStub.java b/router/src/main/java/de/ozgcloud/eingang/router/ClosableStub.java deleted file mode 100644 index ba15eaff4ce83299153a6a766d38c23f42deadc4..0000000000000000000000000000000000000000 --- a/router/src/main/java/de/ozgcloud/eingang/router/ClosableStub.java +++ /dev/null @@ -1,44 +0,0 @@ -package de.ozgcloud.eingang.router; - -import java.util.Objects; -import java.util.concurrent.TimeUnit; - -import de.ozgcloud.eingang.common.errorhandling.TechnicalException; -import io.grpc.ManagedChannel; -import io.grpc.stub.AbstractStub; -import lombok.Builder; - -@Builder -class ClosableStub<T extends AbstractStub<?>> implements ManagableStub<T> { - - private static final int SHUTDOWN_TIME_IN_SEC = 3; - - private T stub; - private ManagedChannel channel; - - @Override - public T get() { - return stub; - } - - public void close() { - if (Objects.nonNull(stub)) { - shutdownChannel(); - stub = null; - } - } - - private void shutdownChannel() { - try { - channel.shutdown().awaitTermination(ClosableStub.SHUTDOWN_TIME_IN_SEC, TimeUnit.SECONDS); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - throw new TechnicalException("Error shutting down grpc channel.", e); - } - } - - @Override - public boolean isShutdownable() { - return true; - } -} \ No newline at end of file diff --git a/router/src/main/java/de/ozgcloud/eingang/router/ConsistentStub.java b/router/src/main/java/de/ozgcloud/eingang/router/ConsistentStub.java deleted file mode 100644 index 25c543504781b57791c2877b016b09e1d688ad9e..0000000000000000000000000000000000000000 --- a/router/src/main/java/de/ozgcloud/eingang/router/ConsistentStub.java +++ /dev/null @@ -1,20 +0,0 @@ -package de.ozgcloud.eingang.router; - -import io.grpc.stub.AbstractStub; -import lombok.Builder; - -@Builder -class ConsistentStub<T extends AbstractStub<?>> implements ManagableStub<T> { - - private T stub; - - @Override - public T get() { - return stub; - } - - @Override - public boolean isShutdownable() { - return false; - } -} \ No newline at end of file diff --git a/router/src/main/java/de/ozgcloud/eingang/router/FileIdMapper.java b/router/src/main/java/de/ozgcloud/eingang/router/FileIdMapper.java deleted file mode 100644 index 1049ab850898fa920cf792e6d75ea474c8a79bf4..0000000000000000000000000000000000000000 --- a/router/src/main/java/de/ozgcloud/eingang/router/FileIdMapper.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.router; - -import org.mapstruct.Mapper; - -import de.ozgcloud.common.binaryfile.FileId; - -@Mapper -interface FileIdMapper { - - default FileId toFileId(String fileId) { - return FileId.from(fileId); - } - - default String toString(FileId fileId) { - return fileId.toString(); - } -} diff --git a/router/src/main/java/de/ozgcloud/eingang/router/GrpcClientsProperties.java b/router/src/main/java/de/ozgcloud/eingang/router/GrpcClientsProperties.java deleted file mode 100644 index 376bdc14c6f6a70064f78e64e860b3642404c3e7..0000000000000000000000000000000000000000 --- a/router/src/main/java/de/ozgcloud/eingang/router/GrpcClientsProperties.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.router; - -import java.util.Map; - -import jakarta.validation.constraints.NotEmpty; - -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.context.annotation.Configuration; -import org.springframework.validation.annotation.Validated; - -import lombok.Getter; -import lombok.Setter; - -@Getter -@Setter -@Configuration -@Validated -@ConfigurationProperties(prefix = "grpc") -public class GrpcClientsProperties { - - private Map<String, ClientProperty> client; - - @Getter - @Setter - static class ClientProperty { - @NotEmpty - private String address; - private String negotiationType = "TLS"; - } - -} diff --git a/router/src/main/java/de/ozgcloud/eingang/router/GrpcEingangMapper.java b/router/src/main/java/de/ozgcloud/eingang/router/GrpcEingangMapper.java deleted file mode 100644 index c69b8397708151fa0c71aec866f6c2a5aeaceb4f..0000000000000000000000000000000000000000 --- a/router/src/main/java/de/ozgcloud/eingang/router/GrpcEingangMapper.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.router; - -import java.util.Optional; -import java.util.UUID; - -import org.mapstruct.CollectionMappingStrategy; -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; -import org.mapstruct.NullValueCheckStrategy; -import org.mapstruct.NullValuePropertyMappingStrategy; -import org.mapstruct.ReportingPolicy; - -import de.ozgcloud.eingang.common.formdata.Antragsteller; -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.common.formdata.IncomingFileGroup; -import de.ozgcloud.eingang.common.formdata.ZustaendigeStelle; -import de.ozgcloud.vorgang.common.grpc.GrpcFormDataMapper; -import de.ozgcloud.vorgang.vorgang.GrpcAntragsteller; -import de.ozgcloud.vorgang.vorgang.GrpcEingang; -import de.ozgcloud.vorgang.vorgang.GrpcIncomingFileGroup; -import de.ozgcloud.vorgang.vorgang.GrpcZustaendigeStelle; - -@Mapper(unmappedTargetPolicy = ReportingPolicy.WARN, // - unmappedSourcePolicy = ReportingPolicy.WARN, // - nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE, // - nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS, // - collectionMappingStrategy = CollectionMappingStrategy.ADDER_PREFERRED, // - uses = { GrpcFormDataMapper.class, ServiceKontoMapper.class }) -public interface GrpcEingangMapper { - - @Mapping(target = "antragsteller.otherData", source = "formData.antragsteller.data") - @Mapping(target = "attachmentsList", source = "formData.attachments") - @Mapping(target = "representationsList", source = "formData.representations") - @Mapping(target = "zustaendigeStelle", expression = "java( toZustaendigeStelle(getZustaendigeStelle(formData, organisationsEinheitenId)) )") - GrpcEingang toEingang(FormData formData, Optional<String> organisationsEinheitenId); - - default ZustaendigeStelle getZustaendigeStelle(FormData formData, Optional<String> organisationsEinheitenId) { - return organisationsEinheitenId.flatMap(oeId -> formData.getZustaendigeStelles().stream() - .filter(zustaendigeStelle -> zustaendigeStelle.getOrganisationseinheitenId().equals(oeId)) - .findFirst()) - .orElseGet(() -> ZustaendigeStelle.builder().build()); - } - - @Mapping(source = "files", target = "filesList") - GrpcIncomingFileGroup map(IncomingFileGroup fileGroup); - - @Mapping(target = "mergeFrom", ignore = true) - @Mapping(target = "clearField", ignore = true) - @Mapping(target = "clearOneof", ignore = true) - @Mapping(target = "mergeUnknownFields", ignore = true) - @Mapping(target = "bezeichnungBytes", ignore = true) - @Mapping(target = "emailBytes", ignore = true) - @Mapping(target = "organisationseinheitenIdBytes", ignore = true) - @Mapping(target = "unknownFields", ignore = true) - @Mapping(target = "allFields", ignore = true) - GrpcZustaendigeStelle toZustaendigeStelle(ZustaendigeStelle zustaendigeStelle); - - GrpcAntragsteller toAntragsteller(Antragsteller antragsteller); - - default String uuidToString(UUID id) { - return id.toString(); - } - - // FIXME map representations and attachments - @Mapping(target = "attachment", ignore = true) - @Mapping(target = "attachments", ignore = true) - @Mapping(target = "representation", ignore = true) - @Mapping(target = "representations", ignore = true) - // TOASK: Wird aktuell nicht gebraucht, trotzdem implementiern? - @Mapping(target = "header.serviceKonto", ignore = true) - FormData toFormData(GrpcEingang eingang); - -} diff --git a/router/src/main/java/de/ozgcloud/eingang/router/ManagableStub.java b/router/src/main/java/de/ozgcloud/eingang/router/ManagableStub.java deleted file mode 100644 index bce38696c16e1ac7ccf385b21deb6e1e0c1548f0..0000000000000000000000000000000000000000 --- a/router/src/main/java/de/ozgcloud/eingang/router/ManagableStub.java +++ /dev/null @@ -1,8 +0,0 @@ -package de.ozgcloud.eingang.router; - -public interface ManagableStub<T> { - - T get(); - - boolean isShutdownable(); -} \ No newline at end of file diff --git a/router/src/main/java/de/ozgcloud/eingang/router/ServiceKontoMapper.java b/router/src/main/java/de/ozgcloud/eingang/router/ServiceKontoMapper.java deleted file mode 100644 index d822731a00d89a44c7e896c14f57ef13a12dc027..0000000000000000000000000000000000000000 --- a/router/src/main/java/de/ozgcloud/eingang/router/ServiceKontoMapper.java +++ /dev/null @@ -1,54 +0,0 @@ -package de.ozgcloud.eingang.router; - -import java.util.List; -import java.util.Map; -import java.util.Optional; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import de.ozgcloud.eingang.common.formdata.PostfachAddressIdentifier; -import de.ozgcloud.eingang.common.formdata.ServiceKonto; -import de.ozgcloud.eingang.common.formdata.StringBasedIdentifier; -import de.ozgcloud.eingang.common.formdata.ServiceKonto.PostfachAddress; -import de.ozgcloud.vorgang.common.GrpcObject; -import de.ozgcloud.vorgang.common.grpc.GrpcObjectMapper; -import de.ozgcloud.vorgang.vorgang.GrpcPostfachAddress; -import de.ozgcloud.vorgang.vorgang.GrpcServiceKonto; - -@Component -class ServiceKontoMapper { - - static final String DEFAULT_TRUST_LEVEL = "STORK-QAA-Level-1"; - - @Autowired - private GrpcObjectMapper grpcObjectMapper; - - public GrpcServiceKonto toServiceKonto(ServiceKonto serviceKonto) { - return GrpcServiceKonto.newBuilder() - .setType(serviceKonto.getType()) - .addAllPostfachAddresses(getPostfachAddresses(serviceKonto)) - .setTrustLevel(Optional.ofNullable(serviceKonto.getTrustLevel()).orElse(DEFAULT_TRUST_LEVEL)) - .build(); - } - - private List<GrpcPostfachAddress> getPostfachAddresses(ServiceKonto serviceKonto) { - return serviceKonto.getPostfachAddresses().stream().map(this::fromPostfachAddress).toList(); - } - - private GrpcPostfachAddress fromPostfachAddress(PostfachAddress postfachAddress) { - return GrpcPostfachAddress.newBuilder() - .setVersion(postfachAddress.getVersion()) - .setType(postfachAddress.getType()) - .setIdentifier(mapFromIdentifier(postfachAddress.getIdentifier())) - .build(); - } - - GrpcObject mapFromIdentifier(PostfachAddressIdentifier identifier) { - return grpcObjectMapper.fromMap(Map.of(StringBasedIdentifier.POSTFACH_ID_FIELD, getStringBasedValue(identifier))); - } - - private String getStringBasedValue(PostfachAddressIdentifier identifier) { - return ((StringBasedIdentifier) identifier).getPostfachId(); - } -} \ No newline at end of file diff --git a/router/src/main/java/de/ozgcloud/eingang/router/VorgangManagerListProperties.java b/router/src/main/java/de/ozgcloud/eingang/router/VorgangManagerListProperties.java deleted file mode 100644 index 7d615b5dfe7d4fba58e2bb6c1b1d8d38fe56f2f5..0000000000000000000000000000000000000000 --- a/router/src/main/java/de/ozgcloud/eingang/router/VorgangManagerListProperties.java +++ /dev/null @@ -1,147 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.router; - -import java.lang.annotation.Documented; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; -import java.util.Collections; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; -import java.util.function.Predicate; -import java.util.stream.Collectors; - -import jakarta.validation.Constraint; -import jakarta.validation.ConstraintValidator; -import jakarta.validation.ConstraintValidatorContext; -import jakarta.validation.Payload; -import jakarta.validation.constraints.NotNull; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.context.annotation.Configuration; -import org.springframework.validation.annotation.Validated; - -import de.ozgcloud.eingang.Application; -import de.ozgcloud.eingang.router.VorgangManagerListProperties.VorgangManagerListPropertiesConstraint; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.Setter; - -@Getter -@Setter -@Configuration -@ConfigurationProperties(prefix = "ozgcloud.adapter") -@Validated -@VorgangManagerListPropertiesConstraint -class VorgangManagerListProperties { - - enum FallbackStrategy { - DENY, FUNDSTELLE - } - - enum RoutingStrategy { - MULTI, SINGLE, ZUFI - } - - @Autowired(required = false) - private Optional<GrpcClientsProperties> clientProperties = Optional.empty(); - - @NotNull - private RoutingStrategy routingStrategy; - private Optional<FallbackStrategy> fallbackStrategy = Optional.empty(); - - private Optional<String> targetVorgangManagerName = Optional.empty(); - private Optional<String> fundstelleVorgangManagerName = Optional.empty(); - - private Map<String, String> organisationseinheiten = Collections.emptyMap(); - - @Documented - @Constraint(validatedBy = VorgangManagerListPropertiesValidator.class) - @Target({ ElementType.TYPE }) - @Retention(RetentionPolicy.RUNTIME) - static @interface VorgangManagerListPropertiesConstraint { - String message() default "Routing Configuration invalid"; - - Class<?>[] groups() default {}; - - Class<? extends Payload>[] payload() default {}; - } - - @AllArgsConstructor - public static class VorgangManagerListPropertiesValidator - implements ConstraintValidator<VorgangManagerListPropertiesConstraint, VorgangManagerListProperties> { - - private static final Predicate<VorgangManagerListProperties> IS_SINGLE_ROUTING = props -> props - .getRoutingStrategy() == RoutingStrategy.SINGLE; - private static final Predicate<VorgangManagerListProperties> HAS_TARGET_NAME = props -> props.getTargetVorgangManagerName().isPresent(); - - private static final Predicate<VorgangManagerListProperties> IS_MULTI_ROUTING = props -> props.getRoutingStrategy() == RoutingStrategy.MULTI; - private static final Predicate<VorgangManagerListProperties> HAS_FALLBACK_STRATEGY = props -> Objects.nonNull(props.getFallbackStrategy()); - - private static final Predicate<VorgangManagerListProperties> IS_ZUFI_ROUTING = props -> props.getRoutingStrategy() == RoutingStrategy.ZUFI; - - private static final Predicate<VorgangManagerListProperties> IS_FALLBACK_TO_FUNDSTELLE = props -> props.getFallbackStrategy() - .map(strategy -> strategy == FallbackStrategy.FUNDSTELLE).orElse(false); - private static final Predicate<VorgangManagerListProperties> HAS_FUNDSTELLE = props -> props.getFundstelleVorgangManagerName().isPresent(); - - @Override - public boolean isValid(VorgangManagerListProperties value, ConstraintValidatorContext context) { - return isVorgangManagerRoutingValid(value) || isZufiManagerRoutingValid(value); - } - - private boolean isVorgangManagerRoutingValid(VorgangManagerListProperties value) { - return IS_SINGLE_ROUTING.and(HAS_TARGET_NAME) - .or(IS_MULTI_ROUTING.and(HAS_FALLBACK_STRATEGY)) - .and(IS_FALLBACK_TO_FUNDSTELLE.negate().or(HAS_FUNDSTELLE)) - .and(this::hasAllVorgangManagersConfigured) - .test(value); - } - - private boolean isZufiManagerRoutingValid(VorgangManagerListProperties value) { - return IS_ZUFI_ROUTING.and(this::isZufiConfigured).test(value); - } - - private boolean hasAllVorgangManagersConfigured(VorgangManagerListProperties props) { - var clientNames = props.getClientProperties() - .map(ps -> ps.getClient()) - .map(Map::keySet) - .orElse(Collections.emptySet()); - - return props.getOrganisationseinheiten().values().stream() - .map(organisationseinheitName -> clientNames.contains("vorgang-manager-" + organisationseinheitName)) - .collect(Collectors.reducing(true, Boolean::logicalAnd)); - } - - private boolean isZufiConfigured(VorgangManagerListProperties props) { - return props.getClientProperties() - .map(ps -> ps.getClient()) - .map(client -> client.get(Application.ZUFI_MANAGER_GRPC_CLIENT)) - .isPresent(); - } - } -} diff --git a/router/src/main/java/de/ozgcloud/eingang/router/VorgangManagerServerResolver.java b/router/src/main/java/de/ozgcloud/eingang/router/VorgangManagerServerResolver.java deleted file mode 100644 index 6108c9ceb3d999e7349e1a7e588b69e1bb693abd..0000000000000000000000000000000000000000 --- a/router/src/main/java/de/ozgcloud/eingang/router/VorgangManagerServerResolver.java +++ /dev/null @@ -1,190 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.router; - -import java.util.Collection; -import java.util.Collections; -import java.util.Optional; - -import jakarta.annotation.PostConstruct; -import jakarta.validation.Valid; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import de.ozgcloud.common.errorhandling.TechnicalException; -import de.ozgcloud.eingang.common.zufi.ZufiService; -import de.ozgcloud.eingang.router.VorgangManagerListProperties.FallbackStrategy; -import de.ozgcloud.eingang.router.VorgangManagerListProperties.RoutingStrategy; -import de.ozgcloud.eingang.router.errorhandling.AdapterConfigurationException; -import de.ozgcloud.eingang.router.errorhandling.UnknownOrganisationseinheitException; -import de.ozgcloud.vorgang.grpc.binaryFile.BinaryFileServiceGrpc.BinaryFileServiceStub; -import de.ozgcloud.vorgang.vorgang.VorgangServiceGrpc.VorgangServiceBlockingStub; -import io.grpc.Channel; -import io.grpc.ManagedChannel; -import io.grpc.ManagedChannelBuilder; -import io.grpc.stub.AbstractStub; -import lombok.NonNull; -import lombok.extern.log4j.Log4j2; -import net.devh.boot.grpc.client.channelfactory.GrpcChannelFactory; -import net.devh.boot.grpc.client.inject.StubTransformer; -import net.devh.boot.grpc.client.stubfactory.StubFactory; - -@Log4j2 -@Component -public class VorgangManagerServerResolver { - - static final String CHANNEL_NAME_PREFIX = "vorgang-manager-"; - - @Autowired - private GrpcChannelFactory grpcChannelFactory; - @Autowired - @Valid - private VorgangManagerListProperties properties; - - @Autowired(required = false) - private Collection<StubFactory> stubFactories = Collections.emptyList(); - @Autowired(required = false) - private Collection<StubTransformer> stubTransformers = Collections.emptyList(); - - private StubFactory vorgangBlockingStubFactory; - private StubFactory binaryFileStubFactory; - - @Autowired - private ZufiService zufiService; - - @PostConstruct - void findApplicableStubFactories() { - vorgangBlockingStubFactory = findStubFactory(VorgangServiceBlockingStub.class); - binaryFileStubFactory = findStubFactory(BinaryFileServiceStub.class); - } - - StubFactory findStubFactory(Class<? extends AbstractStub<?>> stubClass) { - return stubFactories.stream() - .filter(factory -> factory.isApplicable(stubClass)) - .findFirst().orElseThrow(() -> new AdapterConfigurationException("Cannot find Stub-Factory for GRPC-" + stubClass)); - } - - public ManagableStub<VorgangServiceBlockingStub> resolveVorgangServiceBlockingStubByOrganisationseinheitenId( - Optional<String> organisationsEinheitId) { - return createStub(organisationsEinheitId, vorgangBlockingStubFactory, VorgangServiceBlockingStub.class); - } - - public ManagableStub<BinaryFileServiceStub> resolveBinaryFileServiceStubByOrganisationsEinheitId(Optional<String> organisationsEinheitId) { - return createStub(organisationsEinheitId, binaryFileStubFactory, BinaryFileServiceStub.class); - } - - <T extends AbstractStub<T>> ManagableStub<T> createStub(Optional<String> organisationsEinheitId, StubFactory stubFactory, Class<T> stubClass) { - if (isZufiStrategy()) { - return createCloseableStub(organisationsEinheitId, stubFactory, stubClass); - } - return createStubByConfiguredChannels(organisationsEinheitId, stubFactory, stubClass); - } - - private boolean isZufiStrategy() { - return properties.getRoutingStrategy() == RoutingStrategy.ZUFI; - } - - <T extends AbstractStub<T>> ManagableStub<T> createCloseableStub(Optional<String> organisationsEinheitId, StubFactory stubFactory, - Class<T> stubClass) { - var channelName = getVorgangManagerAddress(organisationsEinheitId); - var channel = createChannel(channelName); - var stub = stubFactory.createStub(stubClass, channel); - stub = applyStubTransformers(stub, channelName); - return buildClosableStub(stub, channel); - } - - @SuppressWarnings("unchecked") - private <T extends AbstractStub<?>> ClosableStub<T> buildClosableStub(AbstractStub<?> stub, ManagedChannel channel) { - return ClosableStub.<T>builder().stub((T) stub).channel(channel).build(); - } - - ManagedChannel createChannel(String channelName) { - return ManagedChannelBuilder.forTarget(channelName).usePlaintext().build(); - } - - String getVorgangManagerAddress(Optional<String> organisationsEinheitId) { - if (organisationsEinheitId.isEmpty()) { - throw new TechnicalException("No organisationsEinheitId exists, can not build connection to vorgang-manager."); - } - return zufiService.getVorgangManagerUrl(organisationsEinheitId.get()); - } - - <T extends AbstractStub<T>> ManagableStub<T> createStubByConfiguredChannels(Optional<String> organisationsEinheitId, StubFactory stubFactory, - Class<T> stubClass) { - var channelName = getChannelName(organisationsEinheitId); - var stub = stubFactory.createStub(stubClass, createChannelByName(channelName)); - stub = applyStubTransformers(stub, channelName); - return buildConsistentStub(stub); - } - - @SuppressWarnings("unchecked") - private <T extends AbstractStub<?>> ConsistentStub<T> buildConsistentStub(AbstractStub<?> stub) { - return ConsistentStub.<T>builder().stub((T) stub).build(); - } - - String getChannelName(Optional<String> organisationsEinheitId) { - return getChannelTarget(organisationsEinheitId).map(this::addChannelPrefix).orElseGet(this::getFundstelleChannelName); - } - - private Optional<String> getChannelTarget(Optional<String> organisationsEinheitId) { - return isSingleRoutingStrategy() - ? properties.getTargetVorgangManagerName() - : organisationsEinheitId.map(properties.getOrganisationseinheiten()::get); - - } - - private boolean isSingleRoutingStrategy() { - return properties.getRoutingStrategy() == RoutingStrategy.SINGLE; - } - - private String addChannelPrefix(@NonNull String name) { - return CHANNEL_NAME_PREFIX + name; - } - - String getFundstelleChannelName() { - return properties.getFallbackStrategy().map(fallbackStrategy -> { - if (fallbackStrategy == FallbackStrategy.DENY) { - throw new UnknownOrganisationseinheitException(); - } else { - return properties.getFundstelleVorgangManagerName().map(this::addChannelPrefix).orElseThrow(() -> new AdapterConfigurationException( - "Property 'fundstelleVorgangManagerName' is missing but required for fallbackStrategy 'FUNDSTELLE'")); - } - }).orElseThrow(() -> { - LOG.warn("Missing required routing fallback Strategy. Falling back to 'DENY'"); - return new UnknownOrganisationseinheitException(); - }); - } - - Channel createChannelByName(String name) { - return grpcChannelFactory.createChannel(name); - } - - AbstractStub<?> applyStubTransformers(AbstractStub<?> stub, String channelName) { // NOSONAR wildcard given by StubTransformer - for (var transformer : stubTransformers) { - stub = transformer.transform(channelName, stub); - } - return stub; - } -} \ No newline at end of file diff --git a/router/src/main/java/de/ozgcloud/eingang/router/VorgangRemoteService.java b/router/src/main/java/de/ozgcloud/eingang/router/VorgangRemoteService.java deleted file mode 100644 index 260cdc3818a4af61e2f93d632a66afb75a31062f..0000000000000000000000000000000000000000 --- a/router/src/main/java/de/ozgcloud/eingang/router/VorgangRemoteService.java +++ /dev/null @@ -1,243 +0,0 @@ -/* - * Copyright (C) 2023 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.router; - -import java.io.InputStream; -import java.util.List; -import java.util.Optional; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; - -import org.apache.commons.io.IOUtils; -import org.springframework.stereotype.Service; - -import com.google.protobuf.ByteString; - -import de.ozgcloud.common.binaryfile.GrpcFileUploadUtils; -import de.ozgcloud.common.binaryfile.GrpcFileUploadUtils.FileSender; -import de.ozgcloud.common.errorhandling.TechnicalException; -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.common.formdata.IncomingFile; -import de.ozgcloud.eingang.common.formdata.IncomingFileGroup; -import de.ozgcloud.vorgang.grpc.binaryFile.BinaryFileServiceGrpc.BinaryFileServiceStub; -import de.ozgcloud.vorgang.grpc.binaryFile.GrpcUploadBinaryFileMetaData; -import de.ozgcloud.vorgang.grpc.binaryFile.GrpcUploadBinaryFileRequest; -import de.ozgcloud.vorgang.grpc.binaryFile.GrpcUploadBinaryFileResponse; -import de.ozgcloud.vorgang.grpc.command.GrpcCallContext; -import de.ozgcloud.vorgang.vorgang.GrpcCreateVorgangRequest; -import de.ozgcloud.vorgang.vorgang.GrpcEingang; -import de.ozgcloud.vorgang.vorgang.GrpcFinishCreationRequest; -import de.ozgcloud.vorgang.vorgang.GrpcIncomingFile; -import de.ozgcloud.vorgang.vorgang.GrpcIncomingFileGroup; -import de.ozgcloud.vorgang.vorgang.VorgangServiceGrpc.VorgangServiceBlockingStub; -import io.grpc.stub.CallStreamObserver; -import io.grpc.stub.StreamObserver; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.RequiredArgsConstructor; -import lombok.extern.log4j.Log4j2; - -@Log4j2 -@AllArgsConstructor -@Service -public class VorgangRemoteService { - - private final VorgangManagerServerResolver vorgangManagerServerResolver; - - private final GrpcEingangMapper grpcEingangMapper; - - public String createVorgang(FormData formData, Optional<String> organisationsEinheitenId) { - var vorgangServiceStub = getVorgangServiceStub(organisationsEinheitenId); - var binaryFileServiceStub = getBinaryFileServiceStub(organisationsEinheitenId); - - logConnection(organisationsEinheitenId, vorgangServiceStub.get()); - - try { - return createVorgang(formData, grpcEingangMapper.toEingang(formData, organisationsEinheitenId), vorgangServiceStub.get(), binaryFileServiceStub.get()); - } finally { - finishStubConnections(List.of(vorgangServiceStub, binaryFileServiceStub)); - } - } - - void logConnection(Optional<String> organisationsEinheitenId, VorgangServiceBlockingStub vorgangStub) { - LOG.info("Connecting to vorgang-manager {}; OrganisationsEinheitId: {}.", vorgangStub.getChannel().authority(), - organisationsEinheitenId); - } - - private ManagableStub<VorgangServiceBlockingStub> getVorgangServiceStub(Optional<String> organisationsEinheitenId) { - return vorgangManagerServerResolver.resolveVorgangServiceBlockingStubByOrganisationseinheitenId(organisationsEinheitenId); - } - - private ManagableStub<BinaryFileServiceStub> getBinaryFileServiceStub(Optional<String> organisationsEinheitenId) { - return vorgangManagerServerResolver.resolveBinaryFileServiceStubByOrganisationsEinheitId(organisationsEinheitenId); - } - - public String createVorgang(FormData formData, GrpcEingang eingang, VorgangServiceBlockingStub vorgangStub, - BinaryFileServiceStub binaryFileStub) { - return new VorgangCreator(formData, eingang, vorgangStub, binaryFileStub).create(); - } - - void finishStubConnections(List<ManagableStub<?>> stubs) { - stubs.stream().filter(ManagableStub::isShutdownable).map(ClosableStub.class::cast).forEach(ClosableStub::close); - } - - @RequiredArgsConstructor - public class VorgangCreator { - - static final String VORGANG_ATTACHMENT_FIELD = "vorgangAttachment"; - static final String CALL_CONTEXT_CLIENT = "eingangAdpater"; - - private final FormData formData; - private final GrpcEingang eingang; - private final VorgangServiceBlockingStub vorgangRemoteStub; - private final BinaryFileServiceStub binaryFileRemoteStub; - - @Getter - private String vorgangId; - @Getter - private List<IncomingFileGroup> uploadedAttachments; - @Getter - private List<IncomingFile> uploadedRepresentations; - - String create() { - vorgangId = startCreation(); - - uploadedAttachments = uploadAttachments(); - uploadedRepresentations = uploadRepresentations(); - - finishCreation(); - return vorgangId; - } - - String startCreation() { - return vorgangRemoteStub.startCreation(buildStartCreationRequest(eingang)).getVorgangId(); - } - - private GrpcCreateVorgangRequest buildStartCreationRequest(GrpcEingang eingang) { - var eingangWithoutFiles = eingang.toBuilder().clearAttachments().clearRepresentations().build(); - return GrpcCreateVorgangRequest.newBuilder().setEingang(eingangWithoutFiles).build(); - } - - List<IncomingFileGroup> uploadAttachments() { - return formData.getAttachments().stream().map(this::uploadAttachment).toList(); - } - - private IncomingFileGroup uploadAttachment(IncomingFileGroup attachment) { - var filesWithId = attachment.getFiles().stream().map(this::addIncomingFileId).toList(); - - return IncomingFileGroup.builder().name(attachment.getName()).files(filesWithId).build(); - } - - List<IncomingFile> uploadRepresentations() { - return formData.getRepresentations().stream().map(this::addIncomingFileId).toList(); - } - - private IncomingFile addIncomingFileId(IncomingFile file) { - return file.toBuilder().id(uploadIncomingFile(file)).build(); - } - - String uploadIncomingFile(IncomingFile incomingFile) { - var fileContentStream = incomingFile.getContentStream(); - - var resultFuture = GrpcFileUploadUtils.createSender(this::buildChunkRequest, fileContentStream, - this::buildCallStreamObserver) - .withMetaData(buildMetaDataRequest(incomingFile)) - .send(); - - return waitUntilFutureToComplete(resultFuture, fileContentStream).getFileId(); - } - - GrpcUploadBinaryFileRequest buildChunkRequest(byte[] bytes, Integer length) { - return GrpcUploadBinaryFileRequest.newBuilder().setFileContent((ByteString.copyFrom(bytes, 0, length))).build(); - } - - private CallStreamObserver<GrpcUploadBinaryFileRequest> buildCallStreamObserver( - StreamObserver<GrpcUploadBinaryFileResponse> responseObserver) { - return (CallStreamObserver<GrpcUploadBinaryFileRequest>) binaryFileRemoteStub.uploadBinaryFileAsStream(responseObserver); - } - - GrpcUploadBinaryFileRequest buildMetaDataRequest(IncomingFile ingomingFile) { - return GrpcUploadBinaryFileRequest.newBuilder() - .setMetadata(GrpcUploadBinaryFileMetaData.newBuilder() - .setContext(GrpcCallContext.newBuilder().setClient(CALL_CONTEXT_CLIENT).build()) - .setVorgangId(getVorgangId()) - .setField(VORGANG_ATTACHMENT_FIELD) - .setContentType(ingomingFile.getContentType()) - .setSize(ingomingFile.getSize()) - .setFileName(ingomingFile.getName())) - .build(); - } - - GrpcUploadBinaryFileResponse waitUntilFutureToComplete(FileSender<GrpcUploadBinaryFileRequest, GrpcUploadBinaryFileResponse> fileSender, - InputStream fileContentStream) { - try { - return fileSender.getResultFuture().get(2, TimeUnit.MINUTES); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - fileSender.cancelOnError(e); - throw new TechnicalException("Waiting for finishing upload was interrupted.", e); - } catch (ExecutionException | TimeoutException e) { - fileSender.cancelOnTimeout(); - throw new TechnicalException("Error / Timeout on uploading data.", e); - } finally { - IOUtils.closeQuietly(fileContentStream); - } - } - - String finishCreation() { - return vorgangRemoteStub.finishCreation(buildFinishCreationRequest()).getMessage(); - } - - GrpcFinishCreationRequest buildFinishCreationRequest() { - return GrpcFinishCreationRequest.newBuilder() - .addAllAttachments(getAttachmentsWithoutContent()) - .addAllRepresentations(getRepresentationsWithoutContent()) - .setVorgangId(getVorgangId()) - .build(); - } - - private List<GrpcIncomingFileGroup> getAttachmentsWithoutContent() { - return getUploadedAttachments().stream().map(this::toIncomingFileGroup).toList(); - } - - private GrpcIncomingFileGroup toIncomingFileGroup(IncomingFileGroup incomingFileGroup) { - return GrpcIncomingFileGroup.newBuilder() - .setName(incomingFileGroup.getName()) - .addAllFiles(incomingFileGroup.getFiles().stream().map(this::toIncomingFile).toList()).build(); - } - - private List<GrpcIncomingFile> getRepresentationsWithoutContent() { - return getUploadedRepresentations().stream().map(this::toIncomingFile).toList(); - } - - private GrpcIncomingFile toIncomingFile(IncomingFile incomingFile) { - return GrpcIncomingFile.newBuilder().clearContent() - .setId(incomingFile.getId()) - .setContentType(incomingFile.getContentType()) - .setName(incomingFile.getName()) - .setSize(incomingFile.getSize()).build(); - } - } -} \ No newline at end of file diff --git a/router/src/main/java/de/ozgcloud/eingang/router/VorgangService.java b/router/src/main/java/de/ozgcloud/eingang/router/VorgangService.java deleted file mode 100644 index a5ae891ce8936a906686b30057301f893e3da193..0000000000000000000000000000000000000000 --- a/router/src/main/java/de/ozgcloud/eingang/router/VorgangService.java +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.router; - -import java.io.File; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.List; -import java.util.Optional; -import java.util.stream.Stream; - -import org.springframework.stereotype.Service; - -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.common.formdata.FormHeader; -import de.ozgcloud.eingang.common.formdata.IncomingFile; -import de.ozgcloud.eingang.common.formdata.IncomingFileGroup; -import de.ozgcloud.eingang.common.formdata.ServiceKonto; -import de.ozgcloud.eingang.common.formdata.ZustaendigeStelle; -import lombok.AllArgsConstructor; -import lombok.extern.log4j.Log4j2; - -@AllArgsConstructor -@Service -@Log4j2 -public class VorgangService { - - private final VorgangRemoteService remoteService; - - public String createVorgang(FormData formData) { - var vorgangId = createVorgangForOrganisationsEinheitIds(getOrganisationsEinheitIds(formData), preserveConsistency(formData)); - cleanupFormDataFiles(formData); - return vorgangId; - } - - void cleanupFormDataFiles(FormData formData) { - getFormDataFiles(formData) - .map(IncomingFile::getFile) - .map(File::toPath) - .forEach(this::deleteIncomingFile); - } - - void deleteIncomingFile(Path path) { - try { - Files.deleteIfExists(path); - } catch (IOException e) { - logErrorOnDeleteFailure(e); - } - } - - void logErrorOnDeleteFailure(Exception e) { - LOG.error("Failed to delete temp-file of incoming file!", e); - } - - Stream<IncomingFile> getFormDataFiles(FormData formData) { - return Stream.concat( - formData.getRepresentations().stream(), - formData.getAttachments().stream() - .map(IncomingFileGroup::getFiles) - .flatMap(List::stream) - ); - } - - String createVorgangForOrganisationsEinheitIds(List<String> organisationsEinheitIds, FormData preparedFormData) { - return organisationsEinheitIds.isEmpty() - ? createVorgangOnMissingZustaendigeStelle(preparedFormData) - : createMultipleVorgangs(preparedFormData, organisationsEinheitIds).getFirst(); - } - - String createVorgangOnMissingZustaendigeStelle(FormData formData) { - return remoteService.createVorgang(formData, Optional.empty()); - } - - List<String> createMultipleVorgangs(FormData formData, List<String> organisationseinheitIds) { - return organisationseinheitIds.stream() - .map(oeId -> remoteService.createVorgang(formData, Optional.of(oeId))) - .toList(); - } - - List<String> getOrganisationsEinheitIds(FormData formData) { - return formData.getZustaendigeStelles().stream() - .map(ZustaendigeStelle::getOrganisationseinheitenId) - .toList(); - } - - FormData preserveConsistency(FormData formData) { - if (hasNoPostfachAddress(formData)) { - return clearServiceKonto(formData); - } - return formData; - } - - private boolean hasNoPostfachAddress(FormData formData) { - return Optional.ofNullable(formData.getHeader()).map(FormHeader::getServiceKonto).map(ServiceKonto::getPostfachAddresses).map(List::isEmpty) - .orElse(true); - } - - private FormData clearServiceKonto(FormData formData) { - return formData.toBuilder().header(formData.getHeader().toBuilder().serviceKonto(null).build()).build(); - } -} \ No newline at end of file diff --git a/router/src/main/java/de/ozgcloud/eingang/router/errorhandling/AdapterConfigurationException.java b/router/src/main/java/de/ozgcloud/eingang/router/errorhandling/AdapterConfigurationException.java deleted file mode 100644 index 170b941b408402d0ed94786e3f6ae22d5b5b0900..0000000000000000000000000000000000000000 --- a/router/src/main/java/de/ozgcloud/eingang/router/errorhandling/AdapterConfigurationException.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.router.errorhandling; - -public class AdapterConfigurationException extends RuntimeException { - - private static final long serialVersionUID = 1L; - - public AdapterConfigurationException(String msg) { - super(msg); - } -} diff --git a/router/src/main/java/de/ozgcloud/eingang/router/errorhandling/UnknownOrganisationseinheitException.java b/router/src/main/java/de/ozgcloud/eingang/router/errorhandling/UnknownOrganisationseinheitException.java deleted file mode 100644 index ef130d523323bf1addea6ae26cf1fad68bea8733..0000000000000000000000000000000000000000 --- a/router/src/main/java/de/ozgcloud/eingang/router/errorhandling/UnknownOrganisationseinheitException.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.router.errorhandling; - -public class UnknownOrganisationseinheitException extends RuntimeException { - - private static final long serialVersionUID = 1L; - - public UnknownOrganisationseinheitException() { - super("Unkown or missing Organisationseinheit found. Request is Denied."); - } - -} diff --git a/router/src/main/resources/META-INF/spring/README.md b/router/src/main/resources/META-INF/spring/README.md deleted file mode 100644 index c744f13890773a0fba0f09de0dc276c374cd4fe9..0000000000000000000000000000000000000000 --- a/router/src/main/resources/META-INF/spring/README.md +++ /dev/null @@ -1,6 +0,0 @@ -# Autoconfiguration.imports - -Fix for using grpc starter with spring-boot 3. -Remove wenn PR ist released: - -https://github.com/yidongnan/grpc-spring-boot-starter/pull/775/commits/836fcabaa9327d75640c37dbb0bc7f45a20b563e \ No newline at end of file diff --git a/router/src/test/java/de/ozgcloud/eingang/common/zufi/GrpcOrganisationsEinheitGetResponseTestFactory.java b/router/src/test/java/de/ozgcloud/eingang/common/zufi/GrpcOrganisationsEinheitGetResponseTestFactory.java deleted file mode 100644 index 57f78b5d4db7f58699db379118409fce1d0e457c..0000000000000000000000000000000000000000 --- a/router/src/test/java/de/ozgcloud/eingang/common/zufi/GrpcOrganisationsEinheitGetResponseTestFactory.java +++ /dev/null @@ -1,15 +0,0 @@ -package de.ozgcloud.eingang.common.zufi; - -import de.ozgcloud.zufi.grpc.organisationseinheit.GrpcOrganisationsEinheitGetResponse; - -public class GrpcOrganisationsEinheitGetResponseTestFactory { - - public static GrpcOrganisationsEinheitGetResponse create() { - return createBuilder().build(); - } - - public static GrpcOrganisationsEinheitGetResponse.Builder createBuilder() { - return GrpcOrganisationsEinheitGetResponse.newBuilder() - .setOrganisationsEinheit(GrpcOrganisationsEinheitTestFactory.create()); - } -} \ No newline at end of file diff --git a/router/src/test/java/de/ozgcloud/eingang/common/zufi/GrpcOrganisationsEinheitTestFactory.java b/router/src/test/java/de/ozgcloud/eingang/common/zufi/GrpcOrganisationsEinheitTestFactory.java deleted file mode 100644 index 49c01b101aa0caf4a3e866f329730238d3603cd4..0000000000000000000000000000000000000000 --- a/router/src/test/java/de/ozgcloud/eingang/common/zufi/GrpcOrganisationsEinheitTestFactory.java +++ /dev/null @@ -1,18 +0,0 @@ -package de.ozgcloud.eingang.common.zufi; - -import de.ozgcloud.zufi.grpc.organisationseinheit.GrpcOrganisationsEinheit; - -public class GrpcOrganisationsEinheitTestFactory { - - public static GrpcOrganisationsEinheit create() { - return createBuilder().build(); - } - - public static GrpcOrganisationsEinheit.Builder createBuilder() { - return GrpcOrganisationsEinheit.newBuilder() - .setId(OrganisationsEinheitTestFactory.ID) - .setName(OrganisationsEinheitTestFactory.NAME) - .setSynonyme(OrganisationsEinheitTestFactory.SYNONYME) - .setVorgangManagerAddress(OrganisationsEinheitTestFactory.VORGANG_MANAGER_ADDRESS); - } -} \ No newline at end of file diff --git a/router/src/test/java/de/ozgcloud/eingang/common/zufi/OrganisationsEinheitMapperTest.java b/router/src/test/java/de/ozgcloud/eingang/common/zufi/OrganisationsEinheitMapperTest.java deleted file mode 100644 index 3086fd4fa410fc82cfae8a518c84c58c172b913e..0000000000000000000000000000000000000000 --- a/router/src/test/java/de/ozgcloud/eingang/common/zufi/OrganisationsEinheitMapperTest.java +++ /dev/null @@ -1,20 +0,0 @@ -package de.ozgcloud.eingang.common.zufi; - -import static org.assertj.core.api.Assertions.*; - -import org.junit.jupiter.api.Test; -import org.mapstruct.factory.Mappers; - -import de.ozgcloud.eingang.common.zufi.OrganisationsEinheitMapper; - -class OrganisationsEinheitMapperTest { - - private final OrganisationsEinheitMapper mapper = Mappers.getMapper(OrganisationsEinheitMapper.class); - - @Test - void shouldMapFromGrpc() { - var organisationsEinheit = mapper.fromGrpc(GrpcOrganisationsEinheitTestFactory.create()); - - assertThat(organisationsEinheit).usingRecursiveComparison().isEqualTo(OrganisationsEinheitTestFactory.create()); - } -} \ No newline at end of file diff --git a/router/src/test/java/de/ozgcloud/eingang/common/zufi/OrganisationsEinheitRemoteServiceTest.java b/router/src/test/java/de/ozgcloud/eingang/common/zufi/OrganisationsEinheitRemoteServiceTest.java deleted file mode 100644 index 320217632313129236581f6a5d61c46acf7801c9..0000000000000000000000000000000000000000 --- a/router/src/test/java/de/ozgcloud/eingang/common/zufi/OrganisationsEinheitRemoteServiceTest.java +++ /dev/null @@ -1,70 +0,0 @@ -package de.ozgcloud.eingang.common.zufi; - -import static org.assertj.core.api.Assertions.*; -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.*; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.mockito.ArgumentCaptor; -import org.mockito.Captor; -import org.mockito.InjectMocks; -import org.mockito.Mock; - -import de.ozgcloud.eingang.common.zufi.OrganisationsEinheit; -import de.ozgcloud.eingang.common.zufi.OrganisationsEinheitMapper; -import de.ozgcloud.eingang.common.zufi.OrganisationsEinheitRemoteService; -import de.ozgcloud.zufi.grpc.organisationseinheit.GrpcOrganisationsEinheitGetRequest; -import de.ozgcloud.zufi.grpc.organisationseinheit.GrpcOrganisationsEinheitGetResponse; -import de.ozgcloud.zufi.grpc.organisationseinheit.OrganisationsEinheitServiceGrpc.OrganisationsEinheitServiceBlockingStub; - -class OrganisationsEinheitRemoteServiceTest { - - @InjectMocks - private OrganisationsEinheitRemoteService service; - @Mock - private OrganisationsEinheitServiceBlockingStub stub; - @Mock - private OrganisationsEinheitMapper mapper; - - @DisplayName("Get by id") - @Nested - class TestGetById { - - private final GrpcOrganisationsEinheitGetResponse response = GrpcOrganisationsEinheitGetResponseTestFactory.create(); - private final OrganisationsEinheit mappedOrganisationsEinheit = OrganisationsEinheitTestFactory.create(); - - @BeforeEach - void mock() { - when(stub.getById(any())).thenReturn(response); - when(mapper.fromGrpc(any())).thenReturn(mappedOrganisationsEinheit); - } - - @Captor - private ArgumentCaptor<GrpcOrganisationsEinheitGetRequest> requestCaptor; - - @Test - void shouldCallRemoteService() { - service.getById(OrganisationsEinheitTestFactory.ID); - - verify(stub).getById(requestCaptor.capture()); - assertThat(requestCaptor.getValue().getId()).isEqualTo(OrganisationsEinheitTestFactory.ID); - } - - @Test - void shouldCallMapper() { - service.getById(OrganisationsEinheitTestFactory.ID); - - verify(mapper).fromGrpc(response.getOrganisationsEinheit()); - } - - @Test - void shouldReturnValue() { - var organisationsEinheit = service.getById(OrganisationsEinheitTestFactory.ID); - - assertThat(organisationsEinheit).isEqualTo(mappedOrganisationsEinheit); - } - } -} diff --git a/router/src/test/java/de/ozgcloud/eingang/common/zufi/OrganisationsEinheitTestFactory.java b/router/src/test/java/de/ozgcloud/eingang/common/zufi/OrganisationsEinheitTestFactory.java deleted file mode 100644 index 2be652a78b45cc8c7d75dfa16badab8c4825606f..0000000000000000000000000000000000000000 --- a/router/src/test/java/de/ozgcloud/eingang/common/zufi/OrganisationsEinheitTestFactory.java +++ /dev/null @@ -1,27 +0,0 @@ -package de.ozgcloud.eingang.common.zufi; - -import java.util.UUID; - -import com.thedeanda.lorem.LoremIpsum; - -import de.ozgcloud.eingang.common.zufi.OrganisationsEinheit; - -public class OrganisationsEinheitTestFactory { - - public final static String ID = UUID.randomUUID().toString(); - public final static String NAME = LoremIpsum.getInstance().getName(); - public final static String SYNONYME = LoremIpsum.getInstance().getName(); - public final static String VORGANG_MANAGER_ADDRESS = LoremIpsum.getInstance().getUrl(); - - public static OrganisationsEinheit create() { - return createBuilder().build(); - } - - public static OrganisationsEinheit.OrganisationsEinheitBuilder createBuilder() { - return OrganisationsEinheit.builder() - .id(ID) - .name(NAME) - .synonyme(SYNONYME) - .vorgangManagerAddress(VORGANG_MANAGER_ADDRESS); - } -} \ No newline at end of file diff --git a/router/src/test/java/de/ozgcloud/eingang/common/zufi/ZufiServiceTest.java b/router/src/test/java/de/ozgcloud/eingang/common/zufi/ZufiServiceTest.java deleted file mode 100644 index 04a03ee5e2a61c631f5f32c51c59df7cfd289f1b..0000000000000000000000000000000000000000 --- a/router/src/test/java/de/ozgcloud/eingang/common/zufi/ZufiServiceTest.java +++ /dev/null @@ -1,46 +0,0 @@ -package de.ozgcloud.eingang.common.zufi; - -import static org.assertj.core.api.Assertions.*; -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.*; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; - -class ZufiServiceTest { - - @InjectMocks - private ZufiService service; - @Mock - private OrganisationsEinheitRemoteService remoteService; - - @DisplayName("Get vorgangManager url") - @Nested - class TestGetVorgangManagerUrl { - - private final OrganisationsEinheit organisationsEinheit = OrganisationsEinheitTestFactory.create(); - - @BeforeEach - void mock() { - when(remoteService.getById(any())).thenReturn(organisationsEinheit); - } - - @Test - void shouldCallRemoteService() { - service.getVorgangManagerUrl(OrganisationsEinheitTestFactory.ID); - - verify(remoteService).getById(OrganisationsEinheitTestFactory.ID); - } - - @Test - void shouldReturnValue() { - var vorgangManagerAddress = service.getVorgangManagerUrl(OrganisationsEinheitTestFactory.ID); - - assertThat(vorgangManagerAddress).isEqualTo(OrganisationsEinheitTestFactory.VORGANG_MANAGER_ADDRESS); - } - } -} \ No newline at end of file diff --git a/router/src/test/java/de/ozgcloud/eingang/router/GrpcEingangHeaderTestFactory.java b/router/src/test/java/de/ozgcloud/eingang/router/GrpcEingangHeaderTestFactory.java deleted file mode 100644 index a19f2a9022216a84831f74551a98fda727e0f8e3..0000000000000000000000000000000000000000 --- a/router/src/test/java/de/ozgcloud/eingang/router/GrpcEingangHeaderTestFactory.java +++ /dev/null @@ -1,25 +0,0 @@ -package de.ozgcloud.eingang.router; - -import static de.ozgcloud.eingang.common.formdata.FormHeaderTestFactory.*; - -import de.ozgcloud.vorgang.vorgang.GrpcEingangHeader; -import de.ozgcloud.vorgang.vorgang.GrpcServiceKonto; - -public class GrpcEingangHeaderTestFactory { - - public static GrpcEingangHeader create() { - return createBuilder().build(); - } - - public static GrpcEingangHeader.Builder createBuilder() { - return GrpcEingangHeader.newBuilder() - .setRequestId(REQUEST_ID) - .setCreatedAt(CREATED_AT_STR) - .setFormId(FORM_ID) - .setFormEngineName(FORM_ENGINE_NAME) - .setFormName(FORM_NAME) - .setSender(SENDER) - .setServiceKonto(GrpcServiceKonto.newBuilder().build()) - .setVorgangNummer(VORGANG_NUMMER); - } -} diff --git a/router/src/test/java/de/ozgcloud/eingang/router/GrpcEingangMapperITCase.java b/router/src/test/java/de/ozgcloud/eingang/router/GrpcEingangMapperITCase.java deleted file mode 100644 index f3c15dea9839888f9895a6e440489ee6f09b9b8e..0000000000000000000000000000000000000000 --- a/router/src/test/java/de/ozgcloud/eingang/router/GrpcEingangMapperITCase.java +++ /dev/null @@ -1,207 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.router; - -import static org.assertj.core.api.Assertions.*; - -import java.util.List; -import java.util.Map; -import java.util.Optional; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; - -import de.ozgcloud.eingang.common.formdata.AntragstellerTestFactory; -import de.ozgcloud.eingang.common.formdata.FormDataTestFactory; -import de.ozgcloud.eingang.common.formdata.IncomingFileTestFactory; -import de.ozgcloud.eingang.common.formdata.ZustaendigeStelleTestFactory; -import de.ozgcloud.vorgang.vorgang.GrpcEingang; -import de.ozgcloud.vorgang.vorgang.GrpcIncomingFile; - -@SpringBootTest -class GrpcEingangMapperITCase { - - @Autowired - private GrpcEingangMapper grpcEingangMapper; - - @DisplayName("Mapped GrpcEingang") - @Nested - class TestToEingang { - - @Nested - @DisplayName("Mapped Antragsteller") - class TestMappingAntragsteller { - - @Test - void antragstellerShouldBeMapped() { - var antragSteller = grpcEingangMapper.toEingang(FormDataTestFactory.create(), Optional.of(ZustaendigeStelleTestFactory.ORGANISATIONSEINHEIT_ID)).getAntragsteller(); - - assertThat(antragSteller.getPostfachId()).isEqualTo(AntragstellerTestFactory.POSTFACH_ID); - assertThat(antragSteller.getVorname()).isEqualTo(AntragstellerTestFactory.VORNAME); - assertThat(antragSteller.getTelefon()).isEqualTo(AntragstellerTestFactory.TELEFON); - } - - @Test - void dataShouldBeMapped() { - var antragsteller = grpcEingangMapper.toEingang(FormDataTestFactory.create(), Optional.of(ZustaendigeStelleTestFactory.ORGANISATIONSEINHEIT_ID)).getAntragsteller(); - - assertThat(antragsteller.getOtherData().getFieldList()).hasSize(1); - assertThat(antragsteller.getOtherData().getField(0).getName()).isEqualTo(AntragstellerTestFactory.GEBIET_BEZEICHNUNG_KEY); - assertThat(antragsteller.getOtherData().getField(0).getValue()).isEqualTo(AntragstellerTestFactory.GEBIET_BEZEICHNUNG_VALUE); - } - } - - @Nested - @DisplayName("Mapped Zustaendinge Stelle") - class TestZustaendigeStelle { - @Test - void eingangShouldHaveZustaendigeStelle() { - var zustaendigeStelle = grpcEingangMapper.toEingang(FormDataTestFactory.create(), Optional.of(ZustaendigeStelleTestFactory.ORGANISATIONSEINHEIT_ID)).getZustaendigeStelle(); - - assertThat(zustaendigeStelle).isNotNull(); - assertThat(zustaendigeStelle.getOrganisationseinheitenId()).isEqualTo(ZustaendigeStelleTestFactory.ORGANISATIONSEINHEIT_ID); - assertThat(zustaendigeStelle.getEmail()).isEqualTo(ZustaendigeStelleTestFactory.EMAIL); - } - - @DisplayName("should map empty organisationeinheitId if missing") - @Test - void shouldMapEmptyOrganisationeinheitIdIfMissing() { - var zustaendigeStelle = grpcEingangMapper.toEingang(FormDataTestFactory.create(), Optional.empty()).getZustaendigeStelle(); - - assertThat(zustaendigeStelle).isNotNull(); - assertThat(zustaendigeStelle.getOrganisationseinheitenId()).isEmpty(); - } - } - - @Nested - @DisplayName("Test mapped Attachments") - class TestAttachments { - - private GrpcEingang eingang; - - @BeforeEach - void init() { - - eingang = grpcEingangMapper.toEingang(FormDataTestFactory.create(), Optional.empty()); - } - - @Test - void validateNumberOfAttachments() { - - assertThat(eingang.getNumberOfAttachments()).isEqualTo(2); - } - - @Test - void validateNumberOfAttachmentGroups() { - - assertThat(eingang.getAttachmentsCount()).isEqualTo(2); - } - - @Test - void validateGroup1AttachmentCount() { - - assertThat(eingang.getAttachmentsList().get(0).getFilesCount()).isEqualTo(1); - } - - @Test - void validateGroup1Attachment() { - - GrpcIncomingFile attachment = eingang.getAttachmentsList().get(0).getFilesList().get(0); - - assertThat(attachment.getId()).isEqualTo(IncomingFileTestFactory.ID); - assertThat(attachment.getVendorId()).isEqualTo(IncomingFileTestFactory.VENDOR_ID); - assertThat(attachment.getName()).isEqualTo(IncomingFileTestFactory.NAME); - assertThat(attachment.getContentType()).isEqualTo(IncomingFileTestFactory.CONTENT_TYPE); - assertThat(attachment.getContent()).isEmpty(); - } - - @Test - void validateGroup2AttachmentCount() { - - assertThat(eingang.getAttachmentsList().get(1).getFilesCount()).isEqualTo(1); - } - - @Test - void validateGroup2Attachment() { - - GrpcIncomingFile attachment = eingang.getAttachmentsList().get(1).getFilesList().get(0); - - assertThat(attachment.getId()).isEqualTo(IncomingFileTestFactory.ID); - assertThat(attachment.getVendorId()).isEqualTo(IncomingFileTestFactory.VENDOR_ID); - assertThat(attachment.getName()).isEqualTo(IncomingFileTestFactory.NAME); - assertThat(attachment.getContentType()).isEqualTo(IncomingFileTestFactory.CONTENT_TYPE); - assertThat(attachment.getContent()).isEmpty(); - } - } - - @Nested - @DisplayName("Test mapped Representations") - class TestRepresentations { - - @Test - void testRepresentations() { - - GrpcEingang eingang = grpcEingangMapper.toEingang(FormDataTestFactory.create(), Optional.empty()); - - assertThat(eingang.getRepresentationsCount()).isEqualTo(1); - - GrpcIncomingFile representation = eingang.getRepresentationsList().get(0); - assertThat(representation.getId()).isEqualTo(IncomingFileTestFactory.ID); - assertThat(representation.getVendorId()).isEqualTo(IncomingFileTestFactory.VENDOR_ID); - assertThat(representation.getName()).isEqualTo(IncomingFileTestFactory.NAME); - assertThat(representation.getContentType()).isEqualTo(IncomingFileTestFactory.CONTENT_TYPE); - assertThat(representation.getContent()).isEmpty(); - } - } - - @Nested - @DisplayName("Test mapping for formdata duplicate values") - class TestDuplicateFormData { - - @Test - void valueListShouldGenerateFields() { - - GrpcEingang eingang = grpcEingangMapper - .toEingang(FormDataTestFactory.createBuilder().formData(Map.of("key", List.of("value1", "value2"))).build(), Optional.empty()); - - assertThat(eingang.getFormData().getFieldCount()).isEqualTo(2); - } - - @Test - void objectListShouldGenerateSubForms() { - - GrpcEingang eingang = grpcEingangMapper - .toEingang(FormDataTestFactory.createBuilder() - .formData(Map.of("key-1", List.of(Map.of("sub_key", "value1"), Map.of("sub_key", "value2")))).build(), Optional.empty()); - - assertThat(eingang.getFormData().getFormCount()).isEqualTo(2); - assertThat(eingang.getFormData().getForm(0).getFieldCount()).isEqualTo(1); - } - } - } -} diff --git a/router/src/test/java/de/ozgcloud/eingang/router/GrpcEingangMapperTest.java b/router/src/test/java/de/ozgcloud/eingang/router/GrpcEingangMapperTest.java deleted file mode 100644 index df68e82b76e4175a69dde4153eceb108cde21872..0000000000000000000000000000000000000000 --- a/router/src/test/java/de/ozgcloud/eingang/router/GrpcEingangMapperTest.java +++ /dev/null @@ -1,220 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.router; - -import static org.assertj.core.api.Assertions.*; -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.*; - -import java.util.Optional; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.mapstruct.factory.Mappers; -import org.mockito.InjectMocks; -import org.mockito.Mock; - -import de.ozgcloud.eingang.common.formdata.AntragstellerTestFactory; -import de.ozgcloud.eingang.common.formdata.FormDataTestFactory; -import de.ozgcloud.eingang.common.formdata.IncomingFileTestFactory; -import de.ozgcloud.eingang.common.formdata.ZustaendigeStelleTestFactory; -import de.ozgcloud.vorgang.common.grpc.GrpcFormDataMapper; -import de.ozgcloud.vorgang.vorgang.GrpcAntragsteller; -import de.ozgcloud.vorgang.vorgang.GrpcEingang; -import de.ozgcloud.vorgang.vorgang.GrpcFormData; -import de.ozgcloud.vorgang.vorgang.GrpcServiceKonto; -import de.ozgcloud.vorgang.vorgang.GrpcZustaendigeStelle; - -class GrpcEingangMapperTest { - - @InjectMocks - private GrpcEingangMapper mapper = Mappers.getMapper(GrpcEingangMapper.class); - @Mock - private GrpcFormDataMapper grpcFormDataMapper; - @Mock - private ServiceKontoMapper serviceKontoMapper; - - @DisplayName("To antragsteller") - @Nested - class TestToAntragsteller { - - @Test - void antragstellerShouldBeMapped() { - var mapped = toAntragsteller(); - - assertThat(mapped.getPostfachId()).isEqualTo(AntragstellerTestFactory.POSTFACH_ID); - assertThat(mapped.getVorname()).isEqualTo(AntragstellerTestFactory.VORNAME); - assertThat(mapped.getTelefon()).isEqualTo(AntragstellerTestFactory.TELEFON); - - } - - @Test - void shouldMapFirmaName() { - var mapped = mapper.toAntragsteller(AntragstellerTestFactory.createFirm()); - - assertThat(mapped.getFirmaName()).isEqualTo(AntragstellerTestFactory.FIRMA_NAME); - } - - private GrpcAntragsteller toAntragsteller() { - return mapper.toAntragsteller(AntragstellerTestFactory.create()); - } - } - - @DisplayName("To zustaendigeStelle") - @Nested - class TestToZustaendigeStelle { - - @Test - void eingangShouldHaveZustaendigeStelle() { - var zustaendigeStelle = toZustaendigeStelle(); - - assertThat(zustaendigeStelle).isNotNull(); - assertThat(zustaendigeStelle.getOrganisationseinheitenId()).isEqualTo(ZustaendigeStelleTestFactory.ORGANISATIONSEINHEIT_ID); - assertThat(zustaendigeStelle.getEmail()).isEqualTo(ZustaendigeStelleTestFactory.EMAIL); - } - - private GrpcZustaendigeStelle toZustaendigeStelle() { - return mapper.toZustaendigeStelle(ZustaendigeStelleTestFactory.create()); - } - } - - @DisplayName("To eingang") - @Nested - class TestToEingang { - - @BeforeEach - void mockMapperReturnValues() { - when(grpcFormDataMapper.mapToFormData(anyMap())) - .thenReturn(GrpcFormData.newBuilder().addField(GrpcFormFieldTestFactory.create()).build()); - when(serviceKontoMapper.toServiceKonto(any())).thenReturn(GrpcServiceKonto.newBuilder().build()); - } - - @Nested - @DisplayName("Mapped Antragsteller") - class TestMappingAntragsteller { - - @Test - void dataShouldBeMapped() { - var antragsteller = toEingang().getAntragsteller(); - - assertThat(antragsteller.getOtherData().getFieldList()).hasSize(1); - assertThat(antragsteller.getOtherData().getField(0).getName()).isEqualTo(GrpcFormFieldTestFactory.TEST_NAME); - assertThat(antragsteller.getOtherData().getField(0).getValue()).isEqualTo(GrpcFormFieldTestFactory.TEST_VALUE); - } - } - - @Nested - @DisplayName("Test mapped Attachments") - class TestAttachments { - - @Test - void validateNumberOfAttachments() { - var eingang = toEingang(); - - assertThat(eingang.getNumberOfAttachments()).isEqualTo(2); - } - - @Test - void validateNumberOfAttachmentGroups() { - var eingang = toEingang(); - - assertThat(eingang.getAttachmentsCount()).isEqualTo(2); - } - - @Test - void validateGroup1AttachmentCount() { - var eingang = toEingang(); - - assertThat(eingang.getAttachmentsList().get(0).getFilesCount()).isEqualTo(1); - } - - @Test - void validateGroup1Attachment() { - var eingang = toEingang(); - - var attachment = eingang.getAttachmentsList().get(0).getFilesList().get(0); - assertThat(attachment.getId()).isEqualTo(IncomingFileTestFactory.ID); - assertThat(attachment.getVendorId()).isEqualTo(IncomingFileTestFactory.VENDOR_ID); - assertThat(attachment.getName()).isEqualTo(IncomingFileTestFactory.NAME); - assertThat(attachment.getContentType()).isEqualTo(IncomingFileTestFactory.CONTENT_TYPE); - assertThat(attachment.getContent()).isEmpty(); - } - - @Test - void validateGroup2AttachmentCount() { - var eingang = toEingang(); - - assertThat(eingang.getAttachmentsList().get(1).getFilesCount()).isEqualTo(1); - } - - @Test - void validateGroup2Attachment() { - var eingang = toEingang(); - - var attachment = eingang.getAttachmentsList().get(1).getFilesList().get(0); - assertThat(attachment.getId()).isEqualTo(IncomingFileTestFactory.ID); - assertThat(attachment.getVendorId()).isEqualTo(IncomingFileTestFactory.VENDOR_ID); - assertThat(attachment.getName()).isEqualTo(IncomingFileTestFactory.NAME); - assertThat(attachment.getContentType()).isEqualTo(IncomingFileTestFactory.CONTENT_TYPE); - assertThat(attachment.getContent()).isEmpty(); - } - } - - @Nested - @DisplayName("Test mapped Representations") - class TestRepresentations { - - @Test - void testRepresentations() { - var eingang = toEingang(); - - assertThat(eingang.getRepresentationsCount()).isEqualTo(1); - var representation = eingang.getRepresentationsList().get(0); - assertThat(representation.getId()).isEqualTo(IncomingFileTestFactory.ID); - assertThat(representation.getVendorId()).isEqualTo(IncomingFileTestFactory.VENDOR_ID); - assertThat(representation.getName()).isEqualTo(IncomingFileTestFactory.NAME); - assertThat(representation.getContentType()).isEqualTo(IncomingFileTestFactory.CONTENT_TYPE); - assertThat(representation.getContent()).isEmpty(); - } - } - - @Nested - @DisplayName("Test mapped Header") - class TestHeader { - @Test - void shouldMapAllFields() { - var header = toEingang().getHeader(); - - assertThat(header).usingRecursiveAssertion().isEqualTo(GrpcEingangHeaderTestFactory.create()); - - } - } - - private GrpcEingang toEingang() { - return mapper.toEingang(FormDataTestFactory.create(), Optional.of(ZustaendigeStelleTestFactory.ORGANISATIONSEINHEIT_ID)); - } - } -} \ No newline at end of file diff --git a/router/src/test/java/de/ozgcloud/eingang/router/GrpcFormFieldTestFactory.java b/router/src/test/java/de/ozgcloud/eingang/router/GrpcFormFieldTestFactory.java deleted file mode 100644 index 2471dac0387376bfe75213e1c8735d34d407ca1a..0000000000000000000000000000000000000000 --- a/router/src/test/java/de/ozgcloud/eingang/router/GrpcFormFieldTestFactory.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.router; - -import de.ozgcloud.vorgang.vorgang.GrpcFormField; - -public class GrpcFormFieldTestFactory { - - public static final String TEST_NAME = "name"; - public static final String TEST_VALUE = "value"; - - public static GrpcFormField create() { - return createBuilder().build(); - } - - private static GrpcFormField.Builder createBuilder() { - return GrpcFormField.newBuilder() - .setName(TEST_NAME) - .setValue(TEST_VALUE); - } -} diff --git a/router/src/test/java/de/ozgcloud/eingang/router/GrpcIncomingFileGroupTestFactory.java b/router/src/test/java/de/ozgcloud/eingang/router/GrpcIncomingFileGroupTestFactory.java deleted file mode 100644 index 3c700a36c3b151157aaac29d973f56f6a95ef58d..0000000000000000000000000000000000000000 --- a/router/src/test/java/de/ozgcloud/eingang/router/GrpcIncomingFileGroupTestFactory.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.router; - -import de.ozgcloud.vorgang.vorgang.GrpcIncomingFile; -import de.ozgcloud.vorgang.vorgang.GrpcIncomingFileGroup; - -public class GrpcIncomingFileGroupTestFactory { - - public static final String NAME = "FileGroup1"; - public static final GrpcIncomingFile FILE = GrpcIncomingFileTestFactory.create(); - - public static GrpcIncomingFileGroup create() { - return createBuilder().build(); - } - - public static GrpcIncomingFileGroup.Builder createBuilder() { - return GrpcIncomingFileGroup.newBuilder() - .setName(NAME) - .addFiles(FILE); - } -} \ No newline at end of file diff --git a/router/src/test/java/de/ozgcloud/eingang/router/GrpcIncomingFileTestFactory.java b/router/src/test/java/de/ozgcloud/eingang/router/GrpcIncomingFileTestFactory.java deleted file mode 100644 index 2700f212ce9ebe0e1d8fcfffe4ef092e15fc051c..0000000000000000000000000000000000000000 --- a/router/src/test/java/de/ozgcloud/eingang/router/GrpcIncomingFileTestFactory.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.router; - -import com.google.protobuf.ByteString; - -import de.ozgcloud.eingang.common.formdata.IncomingFileTestFactory; -import de.ozgcloud.vorgang.vorgang.GrpcIncomingFile; - -public class GrpcIncomingFileTestFactory { - - public static final String ID = IncomingFileTestFactory.ID.toString(); - public static final String VENDOR_ID = IncomingFileTestFactory.VENDOR_ID; - public static final String NAME = IncomingFileTestFactory.NAME; - public static final String CONTENT_TYPE = IncomingFileTestFactory.CONTENT_TYPE; - public static final long SIZE = IncomingFileTestFactory.SIZE; - public static final ByteString CONTENT = ByteString.copyFrom(IncomingFileTestFactory.CONTENT); - - public static GrpcIncomingFile create() { - return createBuilder().build(); - } - - public static GrpcIncomingFile.Builder createBuilder() { - return GrpcIncomingFile.newBuilder() - .setId(ID) - .setVendorId(VENDOR_ID) - .setName(NAME) - .setContentType(CONTENT_TYPE) - .setSize(SIZE) - .setContent(CONTENT); - } -} \ No newline at end of file diff --git a/router/src/test/java/de/ozgcloud/eingang/router/ServiceKontoMapperTest.java b/router/src/test/java/de/ozgcloud/eingang/router/ServiceKontoMapperTest.java deleted file mode 100644 index 3b521610b7c7070da0ec8b3db6fd8e8776f6efdf..0000000000000000000000000000000000000000 --- a/router/src/test/java/de/ozgcloud/eingang/router/ServiceKontoMapperTest.java +++ /dev/null @@ -1,122 +0,0 @@ -package de.ozgcloud.eingang.router; - -import static org.assertj.core.api.Assertions.*; -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.*; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; - -import de.ozgcloud.eingang.common.formdata.PostfachAddressTestFactory; -import de.ozgcloud.eingang.common.formdata.ServiceKontoTestFactory; -import de.ozgcloud.eingang.common.formdata.StringBasedIdentifier; -import de.ozgcloud.vorgang.common.GrpcObject; -import de.ozgcloud.vorgang.common.GrpcProperty; -import de.ozgcloud.vorgang.common.grpc.GrpcObjectMapper; -import de.ozgcloud.vorgang.vorgang.GrpcServiceKonto; - -class ServiceKontoMapperTest { - - @InjectMocks - private ServiceKontoMapper mapper; - @Mock - private GrpcObjectMapper grpcObjectMapper; - - @Nested - @DisplayName("To servicekonto") - class TestMapServiceKonto { - - private final GrpcProperty grpcProperty = GrpcProperty.newBuilder() - .setName(StringBasedIdentifier.POSTFACH_ID_FIELD) - .addValue(PostfachAddressTestFactory.POSTFACH_ID) - .build(); - private final GrpcObject grpcObject = GrpcObject.newBuilder() - .addProperty(grpcProperty) - .build(); - - @BeforeEach - void mockGrpcObjectMapper() { - when(grpcObjectMapper.fromMap(any())).thenReturn(grpcObject); - } - - @Test - void shouldCallGrpcMapper() { - getServiceKontoFromMappedEingang(); - - verify(grpcObjectMapper).fromMap(any()); - } - - @Test - void shouldBeExist() { - var serviceKonto = getServiceKontoFromMappedEingang(); - - assertThat(serviceKonto).isNotNull(); - } - - @Test - void shouldContainsType() { - var serviceKonto = getServiceKontoFromMappedEingang(); - - assertThat(serviceKonto.getType()).isEqualTo(ServiceKontoTestFactory.TYPE); - } - - @Test - void shouldContainsDefaultTrustLevel() { - var serviceKonto = mapper.toServiceKonto(ServiceKontoTestFactory.createBuilder().trustLevel(null).build()); - - assertThat(serviceKonto.getTrustLevel()).isEqualTo(ServiceKontoMapper.DEFAULT_TRUST_LEVEL); - } - - @Test - void shouldContainsTrustLevel() { - var serviceKonto = getServiceKontoFromMappedEingang(); - - assertThat(serviceKonto.getTrustLevel()).isEqualTo(ServiceKontoTestFactory.TRUST_LEVEL); - } - - @DisplayName("postfach address") - @Nested - class TestPostfachAddress { - - @Test - void shouldHasSize() { - var serviceKonto = getServiceKontoFromMappedEingang(); - - assertThat(serviceKonto.getPostfachAddressesList()).hasSize(1); - } - - @Test - void shouldContainsVersion() { - var serviceKonto = getServiceKontoFromMappedEingang(); - - assertThat(serviceKonto.getPostfachAddressesList().get(0).getVersion()).isEqualTo(PostfachAddressTestFactory.VERSION); - } - - @Test - void shouldContainsIdentifier() { - var serviceKonto = getServiceKontoFromMappedEingang(); - - assertThat(serviceKonto.getPostfachAddressesList().get(0).getIdentifier().getPropertyList()).hasSize(1); - - var property = serviceKonto.getPostfachAddressesList().get(0).getIdentifier().getPropertyList().get(0); - assertThat(property.getName()).isEqualTo(StringBasedIdentifier.POSTFACH_ID_FIELD); - assertThat(property.getValue(0)).isEqualTo(PostfachAddressTestFactory.POSTFACH_ID); - } - - @Test - void shouldContainsType() { - var serviceKonto = getServiceKontoFromMappedEingang(); - - assertThat(serviceKonto.getPostfachAddressesList().get(0).getType()).isEqualTo(PostfachAddressTestFactory.POSTFACH_ADDRESS_TYPE); - } - } - - private GrpcServiceKonto getServiceKontoFromMappedEingang() { - return mapper.toServiceKonto(ServiceKontoTestFactory.create()); - } - } -} \ No newline at end of file diff --git a/router/src/test/java/de/ozgcloud/eingang/router/VorgangManagerListPropertiesTest.java b/router/src/test/java/de/ozgcloud/eingang/router/VorgangManagerListPropertiesTest.java deleted file mode 100644 index b6295122f887a083f7af32445c503cfd2b80040b..0000000000000000000000000000000000000000 --- a/router/src/test/java/de/ozgcloud/eingang/router/VorgangManagerListPropertiesTest.java +++ /dev/null @@ -1,171 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.router; - -import static org.assertj.core.api.Assertions.*; - -import java.util.HashMap; -import java.util.Map; -import java.util.Optional; - -import jakarta.validation.Validation; -import jakarta.validation.Validator; -import jakarta.validation.ValidatorFactory; - -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; - -import com.thedeanda.lorem.LoremIpsum; - -import de.ozgcloud.eingang.Application; -import de.ozgcloud.eingang.router.GrpcClientsProperties.ClientProperty; - -class VorgangManagerListPropertiesTest { - - @Nested - class TestSingleRouting { - - private VorgangManagerListProperties props = VorgangManagerListPropertiesTestFactory.createForSingleRouting(); - - @Test - void shouldBeValid() { - var violations = getValidator().validate(props); - - assertThat(violations).isEmpty(); - } - - @Test - void shouldViolateMissingRoutingStrategy() { - props.setRoutingStrategy(null); - - var violations = getValidator().validate(props); - - assertThat(violations).isNotEmpty(); - } - - @Test - void shouldViolateMissingTargetVorgangManagerName() { - props.setTargetVorgangManagerName(Optional.empty()); - - var violations = getValidator().validate(props); - - assertThat(violations).isNotEmpty(); - } - } - - @Nested - class TestMultiRouting { - private VorgangManagerListProperties props = VorgangManagerListPropertiesTestFactory.createForMultiRouting(); - - @Test - void shouldBeValid() { - var violations = getValidator().validate(props); - - assertThat(violations).isEmpty(); - } - - @Test - void shouldViolateMissingFallbackStrategy() { - props.setFallbackStrategy(null); - - var violations = getValidator().validate(props); - - assertThat(violations).isNotEmpty(); - } - - } - - @Nested - class TestFallbackFundstelle { - private VorgangManagerListProperties props = VorgangManagerListPropertiesTestFactory.createWithFundstelle(); - - @Test - void shouldBeValid() { - var violations = getValidator().validate(props); - - assertThat(violations).isEmpty(); - } - - @Test - void shouldViolateMissingFundstelle() { - props.setFundstelleVorgangManagerName(Optional.empty()); - - var violations = getValidator().validate(props); - - assertThat(violations).isNotEmpty(); - } - } - - @Nested - class TestZufiRouting { - - @Test - void shouldBeValid() { - var props = VorgangManagerListPropertiesTestFactory.createForZufiRouting(); - props.setClientProperties(Optional.of(createZufiClientProperties())); - - var violations = getValidator().validate(props); - - assertThat(violations).isEmpty(); - } - - @Test - void shouldViolateMissingAddress() { - var props = VorgangManagerListPropertiesTestFactory.createForZufiRouting(); - - var violations = getValidator().validate(props); - - assertThat(violations).isNotEmpty(); - } - - static GrpcClientsProperties createZufiClientProperties() { - var property = new ClientProperty(); - property.setAddress(LoremIpsum.getInstance().getUrl()); - var properties = new GrpcClientsProperties(); - properties.setClient(Map.of(Application.ZUFI_MANAGER_GRPC_CLIENT, property)); - return properties; - } - } - - @Nested - class TestClientProperties { - private VorgangManagerListProperties props = VorgangManagerListPropertiesTestFactory.createForMultiRouting(); - - @Test - void shouldViolateMissingVorgangManager() { - Map<String, ClientProperty> clientMap = new HashMap<>(props.getClientProperties().get().getClient()); - clientMap.remove("vorgang-manager-kiel"); - props.getClientProperties().get().setClient(clientMap); - - var violations = getValidator().validate(props); - - assertThat(violations).isNotEmpty(); - } - } - - private Validator getValidator() { - ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - return factory.getValidator(); - } -} diff --git a/router/src/test/java/de/ozgcloud/eingang/router/VorgangManagerListPropertiesTestFactory.java b/router/src/test/java/de/ozgcloud/eingang/router/VorgangManagerListPropertiesTestFactory.java deleted file mode 100644 index 8425acf8fa316f549d61c7fbdf5971a92a2a48ef..0000000000000000000000000000000000000000 --- a/router/src/test/java/de/ozgcloud/eingang/router/VorgangManagerListPropertiesTestFactory.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.router; - -import java.util.Map; -import java.util.Optional; - -import de.ozgcloud.eingang.router.GrpcClientsProperties.ClientProperty; -import de.ozgcloud.eingang.router.VorgangManagerListProperties.FallbackStrategy; -import de.ozgcloud.eingang.router.VorgangManagerListProperties.RoutingStrategy; - -class VorgangManagerListPropertiesTestFactory { - - static final FallbackStrategy FALLBACK_STRATEGY = FallbackStrategy.DENY; - static final String FUNDSTELLE_VORGANG_MANAGER_NAME = "fundstelle"; - static final String FUNDSTELLE_CHANNEL_NAME = "vorgang-manager-" + FUNDSTELLE_VORGANG_MANAGER_NAME; - - static final String ORGANISATIONSEINHEIT_ID = "123"; - static final String VORGANG_MANAGER_NAME = "kiel"; - static final String CHANNEL_NAME = "vorgang-manager-" + VORGANG_MANAGER_NAME; - - static final String ADDRESS = "127.0.0.1"; - - static VorgangManagerListProperties createWithFundstelle() { - var props = createForMultiRouting(); - props.setFallbackStrategy(Optional.of(FallbackStrategy.FUNDSTELLE)); - props.setFundstelleVorgangManagerName(Optional.of(FUNDSTELLE_VORGANG_MANAGER_NAME)); - - return props; - } - - static VorgangManagerListProperties createForMultiRouting() { - var props = new VorgangManagerListProperties(); - props.setFallbackStrategy(Optional.of(FALLBACK_STRATEGY)); - props.setRoutingStrategy(RoutingStrategy.MULTI); - props.setOrganisationseinheiten(Map.of(ORGANISATIONSEINHEIT_ID, VORGANG_MANAGER_NAME)); - props.setClientProperties(Optional.of(createClientProperties())); - return props; - } - - static VorgangManagerListProperties createForSingleRouting() { - var props = new VorgangManagerListProperties(); - props.setRoutingStrategy(RoutingStrategy.SINGLE); - props.setTargetVorgangManagerName(Optional.of(VORGANG_MANAGER_NAME)); - props.setClientProperties(Optional.of(createClientProperties())); - - return props; - } - - static VorgangManagerListProperties createForZufiRouting() { - var props = new VorgangManagerListProperties(); - props.setRoutingStrategy(RoutingStrategy.ZUFI); - props.setFallbackStrategy(Optional.of(FallbackStrategy.DENY)); - - return props; - } - - static GrpcClientsProperties createClientProperties() { - var property = new ClientProperty(); - property.setAddress(ADDRESS); - var properties = new GrpcClientsProperties(); - properties.setClient(Map.of(CHANNEL_NAME, property)); - return properties; - } - -} diff --git a/router/src/test/java/de/ozgcloud/eingang/router/VorgangManagerServerResolverITCase.java b/router/src/test/java/de/ozgcloud/eingang/router/VorgangManagerServerResolverITCase.java deleted file mode 100644 index cf37814049f350dfe2173ba518af58e012050b97..0000000000000000000000000000000000000000 --- a/router/src/test/java/de/ozgcloud/eingang/router/VorgangManagerServerResolverITCase.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.router; - -import static org.assertj.core.api.Assertions.*; - -import java.util.Optional; - -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; - -import de.ozgcloud.vorgang.grpc.binaryFile.BinaryFileServiceGrpc.BinaryFileServiceStub; -import de.ozgcloud.vorgang.vorgang.VorgangServiceGrpc.VorgangServiceBlockingStub; - -@SpringBootTest(properties = { - "grpc.client.vorgang-manager-kiel.address=static://127.0.0.1:9090" -}) -class VorgangManagerServerResolverITCase { - - @Autowired - private VorgangManagerServerResolver resolver; - - @Test - void shouldReturnVorgangServiceBlockingStub() { - var created = resolver - .resolveVorgangServiceBlockingStubByOrganisationseinheitenId( - Optional.of(VorgangManagerListPropertiesTestFactory.ORGANISATIONSEINHEIT_ID)); - - assertThat(created.get()).isNotNull().isInstanceOf(VorgangServiceBlockingStub.class); - } - - @Test - void shouldReturnBinaryFileServiceStub() { - var created = resolver - .resolveBinaryFileServiceStubByOrganisationsEinheitId(Optional.of(VorgangManagerListPropertiesTestFactory.ORGANISATIONSEINHEIT_ID)); - - assertThat(created.get()).isNotNull().isInstanceOf(BinaryFileServiceStub.class); - } -} diff --git a/router/src/test/java/de/ozgcloud/eingang/router/VorgangManagerServerResolverTest.java b/router/src/test/java/de/ozgcloud/eingang/router/VorgangManagerServerResolverTest.java deleted file mode 100644 index 7bcc1d1f45488a6b5832662ce87f7e29bc6a79df..0000000000000000000000000000000000000000 --- a/router/src/test/java/de/ozgcloud/eingang/router/VorgangManagerServerResolverTest.java +++ /dev/null @@ -1,493 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.router; - -import static org.assertj.core.api.Assertions.*; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.*; - -import java.util.Arrays; -import java.util.Collections; -import java.util.Optional; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Spy; -import org.springframework.test.util.ReflectionTestUtils; - -import de.ozgcloud.common.errorhandling.TechnicalException; -import de.ozgcloud.eingang.common.formdata.ZustaendigeStelleTestFactory; -import de.ozgcloud.eingang.common.zufi.ZufiService; -import de.ozgcloud.eingang.router.errorhandling.AdapterConfigurationException; -import de.ozgcloud.eingang.router.errorhandling.UnknownOrganisationseinheitException; -import de.ozgcloud.vorgang.grpc.binaryFile.BinaryFileServiceGrpc.BinaryFileServiceStub; -import de.ozgcloud.vorgang.vorgang.VorgangServiceGrpc.VorgangServiceBlockingStub; -import io.grpc.Channel; -import io.grpc.ManagedChannel; -import io.grpc.stub.AbstractStub; -import net.devh.boot.grpc.client.channelfactory.GrpcChannelFactory; -import net.devh.boot.grpc.client.inject.StubTransformer; -import net.devh.boot.grpc.client.stubfactory.StubFactory; - -class VorgangManagerServerResolverTest { - - @Spy - @InjectMocks - private VorgangManagerServerResolver resolver; - - @Mock - private GrpcChannelFactory channelFactory; - @Mock - private StubFactory stubFactory; - - @Mock - private ZufiService zufiService; - - @Nested - class TestFindStubFactory { - - @Mock - private StubFactory stubFactory; - - @Test - void shouldSetApplicableFactory() { - when(stubFactory.isApplicable(any())).thenReturn(true); - setStubFactories(stubFactory, stubFactory); - - resolver.findApplicableStubFactories(); - - assertThat(ReflectionTestUtils.getField(resolver, "vorgangBlockingStubFactory")).isSameAs(stubFactory); - } - - @Test - void shouldThrowExceptionIfNotFound() { - setStubFactories(stubFactory); - - assertThrows(AdapterConfigurationException.class, () -> resolver.findApplicableStubFactories()); - } - - private void setStubFactories(StubFactory... factories) { - ReflectionTestUtils.setField(resolver, "stubFactories", Arrays.asList(factories)); - } - } - - @DisplayName("Resolve vorgangManager service by organisationsEinheitenId") - @Nested - class TestResolveVorgangManagerServiceStubByOrganisationsEinheitenId { - - @Mock - private ManagableStub<VorgangServiceBlockingStub> stub; - - private final Optional<String> organisationsEinheitenId = Optional.of(ZustaendigeStelleTestFactory.ORGANISATIONSEINHEIT_ID); - - @BeforeEach - void mock() { - ReflectionTestUtils.setField(resolver, "vorgangBlockingStubFactory", stubFactory); - - doReturn(stub).when(resolver).createStub(any(), any(), any()); - } - - @Test - void shouldCallCreateStub() { - resolveStub(); - - verify(resolver).createStub(organisationsEinheitenId, stubFactory, VorgangServiceBlockingStub.class); - } - - @Test - void shouldReturnStub() { - var createdStub = resolveStub(); - - assertThat(createdStub).isEqualTo(stub); - } - - private ManagableStub<VorgangServiceBlockingStub> resolveStub() { - return resolver.resolveVorgangServiceBlockingStubByOrganisationseinheitenId(organisationsEinheitenId); - } - } - - @DisplayName("Resolve binaryFile service by organisationsEinheitenId") - @Nested - class TestResolveBinaryFileServiceStubByOrganisationsEinheitenId { - - @Mock - private ManagableStub<BinaryFileServiceStub> stub; - - private final Optional<String> organisationsEinheitenId = Optional.of(ZustaendigeStelleTestFactory.ORGANISATIONSEINHEIT_ID); - - @BeforeEach - void mock() { - ReflectionTestUtils.setField(resolver, "binaryFileStubFactory", stubFactory); - - doReturn(stub).when(resolver).createStub(any(), any(), any()); - } - - @Test - void shouldCallCreateStub() { - resolveStub(); - - verify(resolver).createStub(organisationsEinheitenId, stubFactory, BinaryFileServiceStub.class); - } - - @Test - void shouldReturnStub() { - var createdStub = resolveStub(); - - assertThat(createdStub).isEqualTo(stub); - } - - private ManagableStub<BinaryFileServiceStub> resolveStub() { - return resolver.resolveBinaryFileServiceStubByOrganisationsEinheitId(organisationsEinheitenId); - } - } - - @DisplayName("Create stub") - @Nested - class TestCreateStub { - - @Mock - private ManagableStub<?> stub; - - private final Optional<String> organisationsEinheitenId = Optional.of(ZustaendigeStelleTestFactory.ORGANISATIONSEINHEIT_ID); - - @DisplayName("on zufi strategy") - @Nested - class TestOnZufiRoutingStrategy { - - @BeforeEach - void mock() { - doReturn(stub).when(resolver).createCloseableStub(any(), any(), any()); - setProperties(VorgangManagerListPropertiesTestFactory.createForZufiRouting()); - } - - @Test - void shouldCallCreateStub() { - createStub(); - - verify(resolver).createStub(organisationsEinheitenId, stubFactory, VorgangServiceBlockingStub.class); - } - - @Test - void shouldReturnStub() { - var createdStub = createStub(); - - assertThat(createdStub).isEqualTo(stub); - } - } - - @DisplayName("On other routing strategy") - @Nested - class TestOnOtherRoutingStrategy { - - @BeforeEach - void mock() { - doReturn(stub).when(resolver).createStubByConfiguredChannels(any(), any(), any()); - setProperties(VorgangManagerListPropertiesTestFactory.createForSingleRouting()); - } - - @Test - void shouldCallCreateStub() { - createStub(); - - verify(resolver).createStubByConfiguredChannels(organisationsEinheitenId, stubFactory, VorgangServiceBlockingStub.class); - } - - @Test - void shouldReturnStub() { - var createdStub = createStub(); - - assertThat(createdStub).isEqualTo(stub); - } - } - - private ManagableStub<VorgangServiceBlockingStub> createStub() { - return resolver.createStub(organisationsEinheitenId, stubFactory, VorgangServiceBlockingStub.class); - } - } - - @DisplayName("Create closeable stub") - @Nested - class TestCreateCloseableStub { - - @Mock - private ManagableStub<?> manageableStub; - @Mock - private AbstractStub<?> stub; - @Mock - private ManagedChannel managedChannel; - - private Optional<String> organisationsEinheitenId = Optional.of(VorgangManagerListPropertiesTestFactory.ORGANISATIONSEINHEIT_ID); - private final String vorgangManagerAddress = "dummyVorgangManagerAddress"; - - @BeforeEach - void mock() { - doReturn(vorgangManagerAddress).when(resolver).getVorgangManagerAddress(any()); - doReturn(managedChannel).when(resolver).createChannel(any()); - doReturn(stub).when(resolver).applyStubTransformers(any(), any()); - } - - @Test - void shouldGetVorgangManagerAddress() { - createCloseableStub(); - - verify(resolver).getVorgangManagerAddress(organisationsEinheitenId); - } - - @Test - void shouldCreateChannel() { - createCloseableStub(); - - verify(resolver).createChannel(vorgangManagerAddress); - } - - @Test - void shouldCreateStub() { - createCloseableStub(); - - verify(stubFactory).createStub(VorgangServiceBlockingStub.class, managedChannel); - } - - @Test - void shouldApplStubTransformers() { - createCloseableStub(); - - verify(resolver).applyStubTransformers(any(), eq(vorgangManagerAddress)); - } - - @Test - void shouldReturnStub() { - var createdStub = (ClosableStub) createCloseableStub(); - - assertThat(createdStub).isNotNull(); - assertThat(createdStub.get()).isEqualTo(stub); - } - - private ManagableStub<VorgangServiceBlockingStub> createCloseableStub() { - return resolver.createCloseableStub(organisationsEinheitenId, stubFactory, VorgangServiceBlockingStub.class); - } - } - - @DisplayName("Get vorgangManager address") - @Nested - class TestGetVorgangManagerAddress { - - private final Optional<String> organisationsEinheitenId = Optional.of(VorgangManagerListPropertiesTestFactory.ORGANISATIONSEINHEIT_ID); - private final String vorgangManagerAddress = "DummyVorgangManagerAddress"; - - @Test - void shouldCallZufiService() { - when(zufiService.getVorgangManagerUrl(any())).thenReturn(vorgangManagerAddress); - - getVorgangManagerAddress(); - - verify(zufiService).getVorgangManagerUrl(VorgangManagerListPropertiesTestFactory.ORGANISATIONSEINHEIT_ID); - } - - @Test - void shouldThrowExceptionIfOrganisationsEinheitIsNotPresent() { - var emptyOrganisationsEinheitId = Optional.<String>empty(); - - assertThatThrownBy(() -> resolver.getVorgangManagerAddress(emptyOrganisationsEinheitId)).isInstanceOf(TechnicalException.class); - } - - @Test - void shouldReturnAddress() { - when(zufiService.getVorgangManagerUrl(any())).thenReturn(vorgangManagerAddress); - - var address = getVorgangManagerAddress(); - - assertThat(address).isEqualTo(vorgangManagerAddress); - - } - - private String getVorgangManagerAddress() { - return resolver.getVorgangManagerAddress(organisationsEinheitenId); - } - } - - @DisplayName("Create stub by configured channels") - @Nested - class TestCreateStubByConfiguredChannels { - - @Mock - private Channel channel; - @Mock - private StubFactory stubFactory; - @Mock - private AbstractStub<?> createdStub; - - private Class<? extends AbstractStub<?>> stubClass = VorgangServiceBlockingStub.class; - - @BeforeEach - void initTest() { - doReturn(VorgangManagerListPropertiesTestFactory.CHANNEL_NAME).when(resolver).getChannelName(any()); - doReturn(channel).when(resolver).createChannelByName(any()); - setProperties(VorgangManagerListPropertiesTestFactory.createForSingleRouting()); - doReturn(createdStub).when(resolver).applyStubTransformers(any(), any()); - } - - @Test - void shouldGetChannel() { - createStubByConfiguredChannels(); - - verify(resolver).createChannelByName(VorgangManagerListPropertiesTestFactory.CHANNEL_NAME); - } - - @Test - void shouldApplyTransformers() { - createStubByConfiguredChannels(); - - verify(resolver).applyStubTransformers(any(), any()); - } - - @Test - void shouldCreateStubByFactory() { - createStubByConfiguredChannels(); - - verify(stubFactory).createStub(eq(stubClass), any()); - } - - @Test - void shouldReturnStub() { - var stub = createStubByConfiguredChannels(); - - assertThat(stub.get()).isEqualTo(createdStub); - } - - private ManagableStub<?> createStubByConfiguredChannels() { - return resolver.createStubByConfiguredChannels(Optional.of(VorgangManagerListPropertiesTestFactory.ORGANISATIONSEINHEIT_ID), stubFactory, - VorgangServiceBlockingStub.class); - } - } - - @Nested - class TestGetChannelName { - - @Test - void shouldUseSingleName() { - setProperties(VorgangManagerListPropertiesTestFactory.createForSingleRouting()); - - var name = resolver.getChannelName(Optional.empty()); - - assertThat(name).contains(VorgangManagerListPropertiesTestFactory.CHANNEL_NAME); - } - - @Test - void shouldUseNameFromMap() { - setProperties(VorgangManagerListPropertiesTestFactory.createForMultiRouting()); - - var name = resolver.getChannelName(Optional.of(VorgangManagerListPropertiesTestFactory.ORGANISATIONSEINHEIT_ID)); - - assertThat(name).contains(VorgangManagerListPropertiesTestFactory.CHANNEL_NAME); - } - - @Test - void shouldGetFundstellenName() { - setProperties(VorgangManagerListPropertiesTestFactory.createWithFundstelle()); - - var name = resolver.getChannelName(Optional.of("4711")); - - verify(resolver).getFundstelleChannelName(); - assertThat(name).isEqualTo(VorgangManagerListPropertiesTestFactory.FUNDSTELLE_CHANNEL_NAME); - } - } - - @Nested - class TestGetFundstellenChannelName { - - @Nested - class TestStrategyFundstelle { - - @Test - void shouldCreateChannel() { - setProperties(VorgangManagerListPropertiesTestFactory.createWithFundstelle()); - - var channel = resolver.getFundstelleChannelName(); - - assertThat(channel).isNotNull().isEqualTo(VorgangManagerListPropertiesTestFactory.FUNDSTELLE_CHANNEL_NAME); - } - - @Test - void shouldThrowExceptionIfFundstelleIsMissing() { - var props = VorgangManagerListPropertiesTestFactory.createWithFundstelle(); - props.setFundstelleVorgangManagerName(Optional.empty()); - setProperties(props); - - assertThrows(AdapterConfigurationException.class, () -> resolver.getFundstelleChannelName()); - } - } - - @Nested - class TestStrategyDeny { - - @Test - void shouldThrowException() { - setProperties(VorgangManagerListPropertiesTestFactory.createForMultiRouting()); - - assertThrows(UnknownOrganisationseinheitException.class, () -> resolver.getFundstelleChannelName()); - } - } - } - - @Nested - class TestCreateChannelByName { - - @Test - void shouldCallChannelFactory() { - resolver.createChannelByName(VorgangManagerListPropertiesTestFactory.VORGANG_MANAGER_NAME); - - verify(channelFactory).createChannel(VorgangManagerListPropertiesTestFactory.VORGANG_MANAGER_NAME); - } - } - - @Nested - class TestApplyStubTransformer { - - @Mock - private AbstractStub<?> stub; - @Mock - private StubTransformer transformer; - - @BeforeEach - void init() { - ReflectionTestUtils.setField(resolver, "stubTransformers", Collections.singleton(transformer)); - } - - @Test - void shouldCallTransform() { - resolver.applyStubTransformers(stub, VorgangManagerListPropertiesTestFactory.CHANNEL_NAME); - - verify(transformer).transform(VorgangManagerListPropertiesTestFactory.CHANNEL_NAME, stub); - } - } - - private void setProperties(VorgangManagerListProperties properties) { - ReflectionTestUtils.setField(resolver, "properties", properties); - } -} \ No newline at end of file diff --git a/router/src/test/java/de/ozgcloud/eingang/router/VorgangManagerServerResolverTestFactory.java b/router/src/test/java/de/ozgcloud/eingang/router/VorgangManagerServerResolverTestFactory.java deleted file mode 100644 index 45bfd38c92c9dbd73adb33bf5947c8d803804659..0000000000000000000000000000000000000000 --- a/router/src/test/java/de/ozgcloud/eingang/router/VorgangManagerServerResolverTestFactory.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.router; - -import de.ozgcloud.vorgang.grpc.binaryFile.BinaryFileServiceGrpc; -import de.ozgcloud.vorgang.grpc.binaryFile.BinaryFileServiceGrpc.BinaryFileServiceStub; -import de.ozgcloud.vorgang.vorgang.VorgangServiceGrpc; -import de.ozgcloud.vorgang.vorgang.VorgangServiceGrpc.VorgangServiceBlockingStub; -import io.grpc.CallOptions; -import io.grpc.Channel; -import io.grpc.ClientCall; -import io.grpc.MethodDescriptor; -import io.grpc.stub.AbstractStub; - -public class VorgangManagerServerResolverTestFactory { - - public static AbstractStub<?> createAbstractStub() { - return VorgangServiceGrpc.newBlockingStub(new TestChannel()); - } - - public static VorgangServiceBlockingStub createVorgangBlockingStub() { - return VorgangServiceGrpc.newBlockingStub(new TestChannel()); - } - - public static BinaryFileServiceStub createBinaryFileStub() { - return BinaryFileServiceGrpc.newStub(new TestChannel()); - } - - static class TestChannel extends Channel { - - @Override - public <RequestT, ResponseT> ClientCall<RequestT, ResponseT> newCall(MethodDescriptor<RequestT, ResponseT> methodDescriptor, - CallOptions callOptions) { - return null; - } - - @Override - public String authority() { - return null; - } - } -} \ No newline at end of file diff --git a/router/src/test/java/de/ozgcloud/eingang/router/VorgangRemoteServiceTest.java b/router/src/test/java/de/ozgcloud/eingang/router/VorgangRemoteServiceTest.java deleted file mode 100644 index 0fd01eaa035fb5ceeb124fffc5f32e5dc66a0c2b..0000000000000000000000000000000000000000 --- a/router/src/test/java/de/ozgcloud/eingang/router/VorgangRemoteServiceTest.java +++ /dev/null @@ -1,581 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.router; - -import static org.assertj.core.api.Assertions.*; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.*; - -import java.io.InputStream; -import java.util.List; -import java.util.Optional; -import java.util.UUID; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.ValueSource; -import org.mockito.ArgumentCaptor; -import org.mockito.Captor; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Spy; - -import de.ozgcloud.common.binaryfile.GrpcFileUploadUtils.FileSender; -import de.ozgcloud.common.errorhandling.TechnicalException; -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.common.formdata.FormDataTestFactory; -import de.ozgcloud.eingang.common.formdata.IncomingFile; -import de.ozgcloud.eingang.common.formdata.IncomingFileGroup; -import de.ozgcloud.eingang.common.formdata.IncomingFileGroupTestFactory; -import de.ozgcloud.eingang.common.formdata.IncomingFileTestFactory; -import de.ozgcloud.eingang.common.formdata.ZustaendigeStelleTestFactory; -import de.ozgcloud.eingang.router.VorgangRemoteService.VorgangCreator; -import de.ozgcloud.vorgang.grpc.binaryFile.BinaryFileServiceGrpc.BinaryFileServiceStub; -import de.ozgcloud.vorgang.grpc.binaryFile.GrpcUploadBinaryFileMetaData; -import de.ozgcloud.vorgang.grpc.binaryFile.GrpcUploadBinaryFileRequest; -import de.ozgcloud.vorgang.grpc.binaryFile.GrpcUploadBinaryFileResponse; -import de.ozgcloud.vorgang.vorgang.GrpcCreateVorgangRequest; -import de.ozgcloud.vorgang.vorgang.GrpcCreateVorgangResponse; -import de.ozgcloud.vorgang.vorgang.GrpcEingang; -import de.ozgcloud.vorgang.vorgang.GrpcFinishCreationRequest; -import de.ozgcloud.vorgang.vorgang.GrpcFinishCreationResponse; -import de.ozgcloud.vorgang.vorgang.VorgangServiceGrpc.VorgangServiceBlockingStub; -import io.grpc.stub.CallStreamObserver; -import lombok.SneakyThrows; - -class VorgangRemoteServiceTest { - - @Spy - @InjectMocks - private VorgangRemoteService remoteService; - @Mock - private VorgangManagerServerResolver resolver; - @Mock - private GrpcEingangMapper eingangMapper; - - private VorgangCreator vorgangCreator; - - private final FormData formData = FormDataTestFactory.create(); - private final GrpcEingang eingang = GrpcEingang.newBuilder() - .addAttachments(GrpcIncomingFileGroupTestFactory.create()) - .addRepresentations(GrpcIncomingFileTestFactory.create()) - .build(); - private final String vorgangId = UUID.randomUUID().toString(); - private final String fileId = "42"; - - @DisplayName("Create vorgang") - @Nested - class TestCreateVorgang { - - @Mock - private ManagableStub<VorgangServiceBlockingStub> managableVorgangServiceStub; - @Mock - private VorgangServiceBlockingStub vorgangServiceStub; - - @Mock - private ManagableStub<BinaryFileServiceStub> managableBinaryFileServiceStub; - @Mock - private BinaryFileServiceStub binaryFileServiceStub; - - private final Optional<String> organisationsEinheitId = Optional.of(ZustaendigeStelleTestFactory.ORGANISATIONSEINHEIT_ID); - - @SneakyThrows - @BeforeEach - void mock() { - when(resolver.resolveVorgangServiceBlockingStubByOrganisationseinheitenId(any())).thenReturn(managableVorgangServiceStub); - when(managableVorgangServiceStub.get()).thenReturn(vorgangServiceStub); - - when(resolver.resolveBinaryFileServiceStubByOrganisationsEinheitId(any())).thenReturn(managableBinaryFileServiceStub); - when(managableBinaryFileServiceStub.get()).thenReturn(binaryFileServiceStub); - - when(eingangMapper.toEingang(any(), any())).thenReturn(eingang); - - doNothing().when(remoteService).logConnection(any(), any()); - doNothing().when(remoteService).finishStubConnections(any()); - } - - @DisplayName("with no exception occuring") - @Nested - class TestWithNoException { - - @SneakyThrows - @BeforeEach - void mock() { - doReturn(vorgangId).when(remoteService).createVorgang(any(), any(), any(), any()); - } - - @Test - void shouldGetVorgangService() { - createVorgang(); - - verify(resolver).resolveVorgangServiceBlockingStubByOrganisationseinheitenId(organisationsEinheitId); - } - - @Test - void shouldGetBinaryFileService() { - createVorgang(); - - verify(resolver).resolveBinaryFileServiceStubByOrganisationsEinheitId(organisationsEinheitId); - } - - @SneakyThrows - @Test - void shouldCreateVorgang() { - createVorgang(); - - verify(remoteService).createVorgang(formData, eingang, vorgangServiceStub, binaryFileServiceStub); - } - - @Test - void shouldCallEingangMapper() { - createVorgang(); - - verify(eingangMapper).toEingang(formData, organisationsEinheitId); - } - - @Test - void shouldFinishStubConnection() { - createVorgang(); - - verify(remoteService).finishStubConnections(List.of(managableVorgangServiceStub, managableBinaryFileServiceStub)); - } - - @Test - void shouldReturnVorgangId() { - var created = createVorgang(); - - assertThat(created).isEqualTo(vorgangId); - - } - } - - @DisplayName("on exception") - @Nested - class TestOnException { - - @SneakyThrows - @BeforeEach - void mock() { - doThrow(RuntimeException.class).when(remoteService).createVorgang(any(), any(), any(), any()); - } - - @SneakyThrows - @Test - void shouldFinishStubConnections() { - try { - createVorgang(); - } catch (Exception e) { - // Do nothing - } - - verify(remoteService).finishStubConnections(List.of(managableVorgangServiceStub, managableBinaryFileServiceStub)); - } - } - - @SneakyThrows - private String createVorgang() { - return remoteService.createVorgang(formData, organisationsEinheitId); - } - } - - @DisplayName("Finish stub connections") - @Nested - class TestFinishStubConnections { - - @Mock - private ClosableStub<VorgangServiceBlockingStub> closableStub; - - @BeforeEach - void mock() { - when(closableStub.isShutdownable()).thenReturn(true); - doNothing().when(closableStub).close(); - } - - @Test - void shouldCheckIfSubIsShutdownable() { - remoteService.finishStubConnections(List.of(closableStub)); - - verify(closableStub).isShutdownable(); - } - - @Test - void shouldShutDownChannelForClosableStubs() { - remoteService.finishStubConnections(List.of(closableStub)); - - verify((ClosableStub) closableStub).close(); - } - } - - @DisplayName("VorgangCreator") - @Nested - class TestVorgangCreator { - - @Mock - private final VorgangServiceBlockingStub vorgangStub = VorgangManagerServerResolverTestFactory.createVorgangBlockingStub(); - @Mock - private final BinaryFileServiceStub binaryFileStub = VorgangManagerServerResolverTestFactory.createBinaryFileStub(); - @Mock - private GrpcEingangMapper eingangMapper; - - @BeforeEach - void init() { - vorgangCreator = spy(remoteService.new VorgangCreator(formData, eingang, vorgangStub, binaryFileStub)); - } - - @Nested - class TestCreateVorgang { - - @Mock - private CallStreamObserver<GrpcUploadBinaryFileRequest> requestObserver; - @Captor - private ArgumentCaptor<GrpcCreateVorgangRequest> requestCaptor; - @Captor - private ArgumentCaptor<GrpcFinishCreationRequest> finishRequestCaptor; - - private final GrpcCreateVorgangResponse createVorgangResponse = GrpcCreateVorgangResponse.newBuilder().setVorgangId(vorgangId).build(); - private final GrpcFinishCreationResponse finishResponse = GrpcFinishCreationResponse.newBuilder().setMessage("OK").build(); - - @BeforeEach - void init() { - when(vorgangStub.startCreation(any())).thenReturn(createVorgangResponse); - when(vorgangStub.finishCreation(any())).thenReturn(finishResponse); - doReturn(fileId).when(vorgangCreator).uploadIncomingFile(any()); - doReturn(GrpcFinishCreationRequest.newBuilder().build()).when(vorgangCreator).buildFinishCreationRequest(); - } - - @Test - void shouldStartCreation() { - createVorgang(); - - verify(vorgangStub).startCreation(any(GrpcCreateVorgangRequest.class)); - } - - @Test - void shouldStartCreationWithEmptyAttachmetns() { - createVorgang(); - - verify(vorgangStub).startCreation(requestCaptor.capture()); - assertThat(requestCaptor.getValue().getEingang().getAttachmentsList()).isEmpty(); - } - - @Test - void shouldStartCreationWithEmptyRepresentations() { - createVorgang(); - - verify(vorgangStub).startCreation(requestCaptor.capture()); - assertThat(requestCaptor.getValue().getEingang().getRepresentationsList()).isEmpty(); - } - - @Test - void shouldCallUploadAttachments() { - createVorgang(); - - verify(vorgangCreator).uploadAttachments(); - } - - @Test - void shouldCallUploadRepresentations() { - createVorgang(); - - verify(vorgangCreator).uploadRepresentations(); - } - - @Test - void shouldFinishCreation() { - createVorgang(); - - verify(vorgangStub).finishCreation(finishRequestCaptor.capture()); - assertThat(finishRequestCaptor.getValue()).isInstanceOf(GrpcFinishCreationRequest.class); - } - - @Test - void shouldReturnVorgangId() { - var result = createVorgang(); - - assertThat(result).isEqualTo(vorgangId); - } - - @SneakyThrows - private String createVorgang() { - return vorgangCreator.create(); - } - } - - @Nested - class TestUploadAttachments { - - @BeforeEach - void mockFileId() { - doReturn(fileId).when(vorgangCreator).uploadIncomingFile(any()); - } - - @Test - void shouldCallUploadIncomingFile() { - vorgangCreator.uploadAttachments(); - - verify(vorgangCreator, times(2)).uploadIncomingFile(any(IncomingFile.class)); - } - - @Test - void shouldSetFileId() { - var uploadedAttachments = vorgangCreator.uploadAttachments(); - - assertThat(uploadedAttachments.get(0).getFiles().get(0).getId()).isEqualTo(fileId); - } - } - - @Nested - class TestUploadRepresentations { - - @BeforeEach - void mockFileId() { - doReturn(fileId).when(vorgangCreator).uploadIncomingFile(any()); - } - - @Test - void shouldCallUploadIncomingFile() { - vorgangCreator.uploadRepresentations(); - - verify(vorgangCreator).uploadIncomingFile(any(IncomingFile.class)); - } - - @Test - void shouldSetFileId() { - var uploadedRepresentations = vorgangCreator.uploadRepresentations(); - - assertThat(uploadedRepresentations.get(0).getId()).isEqualTo(fileId); - } - } - - @Nested - class TestBuildMetaDataRequest { - - @BeforeEach - void mockMapper() { - doReturn(vorgangId).when(vorgangCreator).getVorgangId(); - } - - @Test - void shouldContainsContext() { - var metaData = buildMetaData(); - - assertThat(metaData.getContext().getClient()).isEqualTo(VorgangRemoteService.VorgangCreator.CALL_CONTEXT_CLIENT); - } - - @Test - void shouldContainsVorgangId() { - var metaData = buildMetaData(); - - assertThat(metaData.getVorgangId()).isEqualTo(vorgangId); - } - - @Test - void shouldContainsField() { - var metaData = buildMetaData(); - - assertThat(metaData.getField()).isEqualTo(VorgangRemoteService.VorgangCreator.VORGANG_ATTACHMENT_FIELD); - } - - @Test - void shouldContainsContentType() { - var metaData = buildMetaData(); - - assertThat(metaData.getContentType()).isEqualTo(IncomingFileTestFactory.CONTENT_TYPE); - } - - @Test - void shouldContainsSize() { - var metaData = buildMetaData(); - - assertThat(metaData.getSize()).isEqualTo(IncomingFileTestFactory.SIZE); - } - - @Test - void shouldContainsFileName() { - var metaData = buildMetaData(); - - assertThat(metaData.getFileName()).isEqualTo(IncomingFileTestFactory.NAME); - } - - private GrpcUploadBinaryFileMetaData buildMetaData() { - return vorgangCreator.buildMetaDataRequest(IncomingFileTestFactory.create()).getMetadata(); - } - } - - @DisplayName("update incoming file") - @Nested - class TestUpdateIncomingFile { - - @Mock - private IncomingFile incomingFile; - - @Mock - private InputStream inputStream; - - @Mock - private GrpcUploadBinaryFileResponse response; - - @Mock - private GrpcUploadBinaryFileRequest request; - - @BeforeEach - void mock() { - doReturn(response).when(vorgangCreator).waitUntilFutureToComplete(any(), any()); - when(incomingFile.getContentStream()).thenReturn(inputStream); - doReturn(request).when(vorgangCreator).buildMetaDataRequest(any()); - } - - @DisplayName("should call get content stream") - @Test - void shouldCallGetContentStream() { - vorgangCreator.uploadIncomingFile(incomingFile); - - verify(incomingFile).getContentStream(); - } - - @DisplayName("should call build request with incoming file") - @Test - void shouldCallBuildRequestWithIncomingFile() { - vorgangCreator.uploadIncomingFile(incomingFile); - - verify(vorgangCreator).buildMetaDataRequest(incomingFile); - } - - @DisplayName("should call wait until future complete") - @Test - void shouldCallWaitUntilFutureComplete() { - vorgangCreator.uploadIncomingFile(incomingFile); - - verify(vorgangCreator).waitUntilFutureToComplete(any(), eq(inputStream)); - } - - } - - @Nested - class TestWaitUntilFutureToComplete { - - @Mock - private FileSender<GrpcUploadBinaryFileRequest, GrpcUploadBinaryFileResponse> sender; - - @Mock - private CompletableFuture<GrpcUploadBinaryFileResponse> streamFuture; - - @Mock - private InputStream inputStream; - - @BeforeEach - void initSender() { - when(sender.getResultFuture()).thenReturn(streamFuture); - } - - @Test - void shouldNotThrowException() { - assertDoesNotThrow(() -> vorgangCreator.waitUntilFutureToComplete(sender, inputStream)); - } - - @ParameterizedTest - @ValueSource(classes = { InterruptedException.class, ExecutionException.class, TimeoutException.class }) - void shouldRethrowAsTechnicalException(Class<Exception> exception) - throws InterruptedException, ExecutionException, TimeoutException { - doThrow(exception).when(streamFuture).get(anyLong(), any(TimeUnit.class)); - - assertThrows(TechnicalException.class, () -> vorgangCreator.waitUntilFutureToComplete(sender, inputStream)); - } - - @ParameterizedTest - @ValueSource(classes = { InterruptedException.class, ExecutionException.class, TimeoutException.class }) - @SneakyThrows - void shouldCloseFileContentStreamOnException(Class<Exception> exception) { - doThrow(exception).when(streamFuture).get(anyLong(), any(TimeUnit.class)); - - waitUntilFutureToComplete(); - - verify(inputStream).close(); - } - - @Test - @SneakyThrows - void shouldCloseFileContent() { - waitUntilFutureToComplete(); - - verify(inputStream).close(); - } - - private void waitUntilFutureToComplete() { - try { - vorgangCreator.waitUntilFutureToComplete(sender, inputStream); - } catch (Exception e) { - // ignored - } - } - } - - @Nested - class TestBuildFinishCreationRequest { - - private final IncomingFileGroup attachment = IncomingFileGroupTestFactory.create(); - private final IncomingFile representation = IncomingFileTestFactory.create(); - - @BeforeEach - void mock() { - doReturn(vorgangId).when(vorgangCreator).getVorgangId(); - doReturn(List.of(attachment)).when(vorgangCreator).getUploadedAttachments(); - doReturn(List.of(representation)).when(vorgangCreator).getUploadedRepresentations(); - } - - @Test - void shouldContainsVorgangId() { - var request = buildFinishCreationRequest(); - - assertThat(request.getVorgangId()).isEqualTo(vorgangId); - } - - @Test - void shouldContainsAttachmentWithoutContent() { - var request = buildFinishCreationRequest(); - - assertThat(request.getAttachments(0).getFiles(0).getContent()).isEmpty(); - } - - @Test - void shouldContainsRepresentationsWithoutContent() { - var request = buildFinishCreationRequest(); - - assertThat(request.getRepresentations(0).getContent()).isEmpty(); - } - - private GrpcFinishCreationRequest buildFinishCreationRequest() { - return vorgangCreator.buildFinishCreationRequest(); - } - } - } -} \ No newline at end of file diff --git a/router/src/test/java/de/ozgcloud/eingang/router/VorgangServiceTest.java b/router/src/test/java/de/ozgcloud/eingang/router/VorgangServiceTest.java deleted file mode 100644 index 74cd1e901ea5260c9ab606fd0f7b00d00fd6fb23..0000000000000000000000000000000000000000 --- a/router/src/test/java/de/ozgcloud/eingang/router/VorgangServiceTest.java +++ /dev/null @@ -1,349 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.router; - -import static de.ozgcloud.eingang.common.formdata.FormDataTestFactory.*; -import static java.util.Collections.*; -import static org.assertj.core.api.Assertions.*; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.Mockito.*; - -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.List; -import java.util.Optional; -import java.util.stream.Stream; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Spy; - -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.common.formdata.FormDataTestFactory; -import de.ozgcloud.eingang.common.formdata.FormHeader; -import de.ozgcloud.eingang.common.formdata.FormHeaderTestFactory; -import de.ozgcloud.eingang.common.formdata.IncomingFile; -import de.ozgcloud.eingang.common.formdata.IncomingFileTestFactory; -import de.ozgcloud.eingang.common.formdata.ServiceKonto; -import de.ozgcloud.eingang.common.formdata.ServiceKontoTestFactory; -import de.ozgcloud.eingang.common.formdata.ZustaendigeStelleTestFactory; - -class VorgangServiceTest { - - @Spy - @InjectMocks - private VorgangService service; - @Mock - private VorgangRemoteService remoteService; - - private final FormData formData = FormDataTestFactory.create(); - - @DisplayName("Create vorgang") - @Nested - class TestCreateVorgang { - private final FormData preservedFormData = FormDataTestFactory.create(); - private final List<String> organisationseinheitIds = List.of(ZustaendigeStelleTestFactory.ORGANISATIONSEINHEIT_ID); - - @BeforeEach - void mockEingangMapper() { - doReturn(preservedFormData).when(service).preserveConsistency(any()); - doReturn(organisationseinheitIds).when(service).getOrganisationsEinheitIds(any()); - doReturn(VORGANG_ID).when(service).createVorgangForOrganisationsEinheitIds(any(), any()); - doNothing().when(service).cleanupFormDataFiles(any()); - } - - @Test - void shouldPreserverConsistency() { - callCreateVorgang(); - - verify(service).preserveConsistency(formData); - } - - @DisplayName("should call create vorgang for organisationseinheitIds") - @Test - void shouldCallCreateVorgangForOrganisationseinheitIds() { - callCreateVorgang(); - - verify(service).createVorgangForOrganisationsEinheitIds(organisationseinheitIds, preservedFormData); - } - - @DisplayName("should call get organisationseinheit ids") - @Test - void shouldCallGetOrganisationseinheitIds() { - callCreateVorgang(); - - verify(service).getOrganisationsEinheitIds(formData); - } - - @DisplayName("should return vorgang id") - @Test - void shouldReturn() { - var vorgangId = callCreateVorgang(); - - assertThat(vorgangId).isEqualTo(VORGANG_ID); - } - - @DisplayName("should call cleanup form data files") - @Test - void shouldCallCleanupFormDataFiles() { - callCreateVorgang(); - - verify(service).cleanupFormDataFiles(formData); - } - - private String callCreateVorgang() { - return service.createVorgang(formData); - } - } - - @DisplayName("cleanup form data files") - @Nested - class TestCleanupFormDataFiles { - private final IncomingFile incomingFile = IncomingFileTestFactory.create(); - - @BeforeEach - void mock() { - doReturn(Stream.of(incomingFile)).when(service).getFormDataFiles(formData); - } - - @DisplayName("should call delete incoming file") - @Test - void shouldCallDeleteIncomingFile() { - service.cleanupFormDataFiles(formData); - - verify(service).deleteIncomingFile(incomingFile.getFile().toPath()); - } - } - - @DisplayName("get form data files") - @Nested - class TestGetFormDataFiles { - - private final FormData formData = FormDataTestFactory.create(); - - @DisplayName("should return attachments and representations") - @Test - void shouldReturnAttachmentsAndRepresentations() { - var files = service.getFormDataFiles(formData).toList(); - - assertThat(files).hasSize(3); - } - } - - @DisplayName("delete incoming file") - @Nested - class TestDeleteIncomingFile { - - @Mock - private Path path; - - @DisplayName("should call deleteIfExists") - @Test - void shouldCallDeleteIfExists() { - try (var staticMock = mockStatic(Files.class)) { - service.deleteIncomingFile(path); - - staticMock.verify(() -> Files.deleteIfExists(path)); - } - } - - @DisplayName("should return") - @Test - void shouldReturn() { - try (var staticMock = mockStatic(Files.class)) { - staticMock.when(() -> Files.deleteIfExists(path)).thenReturn(true); - - service.deleteIncomingFile(path); - } - } - - @DisplayName("should log on error") - @Test - void shouldLogOnError() { - var exception = new IOException(); - try (var staticMock = mockStatic(Files.class)) { - staticMock.when(() -> Files.deleteIfExists(path)).thenThrow(exception); - - service.deleteIncomingFile(path); - - verify(service).logErrorOnDeleteFailure(exception); - } - } - - } - - @DisplayName("create vorgang for organisationsEinheitIds") - @Nested - class TestCreateVorgangForOrganisationsEinheitIds { - private final FormData preservedFormData = FormDataTestFactory.create(); - private final List<String> organisationseinheitIds = List.of(ZustaendigeStelleTestFactory.ORGANISATIONSEINHEIT_ID); - - @DisplayName("should call create multiple vorgangs") - @Test - void shouldCallCreateMultipleVorgangs() { - service.createVorgangForOrganisationsEinheitIds(organisationseinheitIds, preservedFormData); - - verify(service).createMultipleVorgangs(preservedFormData, organisationseinheitIds); - } - - @DisplayName("should return first vorgang id with multiple organisationseinheits") - @Test - void shouldReturnFirstVorgangIdWithMultipleOrganisationseinheits() { - doReturn(List.of(VORGANG_ID)).when(service).createMultipleVorgangs(any(), any()); - - var vorgangId = service.createVorgangForOrganisationsEinheitIds(organisationseinheitIds, preservedFormData); - - assertThat(vorgangId).isEqualTo(VORGANG_ID); - } - - @DisplayName("should call create vorgang on missing zustaendige stelle if organisationseinheit is missing") - @Test - void shouldCallCreateVorgangOnMissingZustaendigeStelleIfOrganisationseinheitIsMissing() { - service.createVorgangForOrganisationsEinheitIds(emptyList(), preservedFormData); - - verify(service).createVorgangOnMissingZustaendigeStelle(eq(preservedFormData)); - } - - @DisplayName("should return single vorgang id if organisationseinheit is missing") - @Test - void shouldReturnSingleVorgangIdIfOrganisationseinheitIsMissing() { - doReturn(VORGANG_ID).when(service).createVorgangOnMissingZustaendigeStelle(any()); - - var firstVorgangId = service.createVorgangForOrganisationsEinheitIds(emptyList(), preservedFormData); - - assertThat(firstVorgangId).isEqualTo(VORGANG_ID); - } - - } - - @DisplayName("create vorgang on missing zustaendige stelle") - @Nested - class TestVorgangOnMissingZustaendigeStelle { - @Mock - private FormData formData; - - @BeforeEach - void mock() { - when(remoteService.createVorgang(any(), any())).thenReturn(VORGANG_ID); - } - - @DisplayName("should call create vorgang") - @Test - void shouldCallCreateVorgang() { - service.createVorgangOnMissingZustaendigeStelle(formData); - - verify(remoteService).createVorgang(formData, Optional.empty()); - } - - @DisplayName("should return") - @Test - void shouldReturn() { - var vorgangId = service.createVorgangOnMissingZustaendigeStelle(formData); - - assertThat(vorgangId).isEqualTo(VORGANG_ID); - } - } - - @DisplayName("create multiple vorgangs") - @Nested - class TestCreateMultipleVorgangs { - - @Mock - private FormData formData; - - @BeforeEach - void mock() { - when(remoteService.createVorgang(any(), any())).thenReturn(VORGANG_ID); - } - - @DisplayName("should call create vorgang twice") - @Test - void shouldCallCreateVorgangTwice() { - service.createMultipleVorgangs(formData, List.of(ZustaendigeStelleTestFactory.ORGANISATIONSEINHEIT_ID)); - - verify(remoteService).createVorgang(formData, Optional.of(ZustaendigeStelleTestFactory.ORGANISATIONSEINHEIT_ID)); - } - - @DisplayName("should return") - @Test - void shouldReturn() { - var vorgangIds = service.createMultipleVorgangs(formData, List.of(ZustaendigeStelleTestFactory.ORGANISATIONSEINHEIT_ID)); - - assertThat(vorgangIds).containsExactly(VORGANG_ID); - } - } - - @DisplayName("get organisationseinheit ids") - @Nested - class TestGetOrganisationseinheitIds { - private final FormData preservedFormData = FormDataTestFactory.create(); - - @DisplayName("should return") - @Test - void shouldReturn() { - var organisationseinheitIds = service.getOrganisationsEinheitIds(preservedFormData); - - assertThat(organisationseinheitIds).containsExactly(ZustaendigeStelleTestFactory.ORGANISATIONSEINHEIT_ID); - } - } - - @DisplayName("Preserve consistency") - @Nested - class TestPreserveConsistency { - - private final ServiceKonto serviceKonto = ServiceKontoTestFactory.createBuilder().clearPostfachAddresses().build(); - private final FormHeader header = FormHeaderTestFactory.createBuilder().serviceKonto(serviceKonto).build(); - private final FormData formData = FormDataTestFactory.createBuilder().header(header).build(); - - @DisplayName("should set serviceKonto to null if no postfachAddress exists") - @Test - void shouldSetServiceKontoToNull() { - var consistentFormData = service.preserveConsistency(formData); - - assertThat(consistentFormData.getHeader().getServiceKonto()).isNull(); - } - - @DisplayName("should keep serviceKonto if postfachAddress exists") - @Test - void shouldKeepServiceKonto() { - var consistentFormData = service.preserveConsistency(FormDataTestFactory.create()); - - assertThat(consistentFormData.getHeader().getServiceKonto()).isEqualTo(FormHeaderTestFactory.SERVICE_KONTO); - } - - @DisplayName("should proceed without exception on missing serviceKonto") - @Test - void shouldProceedWithoutException() { - var formDataWithoutServiceKonto = FormDataTestFactory.createBuilder() - .header(FormHeaderTestFactory.createBuilder().serviceKonto(null).build()).build(); - - assertDoesNotThrow(() -> service.preserveConsistency(formDataWithoutServiceKonto)); - } - } -} \ No newline at end of file diff --git a/router/src/test/resources/META-INF/services/org.junit.jupiter.api.extension.Extension b/router/src/test/resources/META-INF/services/org.junit.jupiter.api.extension.Extension deleted file mode 100644 index 79b126e6cdb86bec1f4f08c205de8961bde1934a..0000000000000000000000000000000000000000 --- a/router/src/test/resources/META-INF/services/org.junit.jupiter.api.extension.Extension +++ /dev/null @@ -1 +0,0 @@ -org.mockito.junit.jupiter.MockitoExtension \ No newline at end of file diff --git a/router/src/test/resources/junit-platform.properties b/router/src/test/resources/junit-platform.properties deleted file mode 100644 index 1cebb76d5a58ac034b2627d12411d82d1e85821e..0000000000000000000000000000000000000000 --- a/router/src/test/resources/junit-platform.properties +++ /dev/null @@ -1 +0,0 @@ -junit.jupiter.extensions.autodetection.enabled = true \ No newline at end of file diff --git a/router/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker b/router/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker deleted file mode 100644 index ca6ee9cea8ec189a088d50559325d4e84ff8ad09..0000000000000000000000000000000000000000 --- a/router/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker +++ /dev/null @@ -1 +0,0 @@ -mock-maker-inline \ No newline at end of file diff --git a/run_filereader.sh b/run_filereader.sh deleted file mode 100755 index 765453ab03318d14631679d1d8555329dac42a53..0000000000000000000000000000000000000000 --- a/run_filereader.sh +++ /dev/null @@ -1,36 +0,0 @@ -#!/bin/bash -# -# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den -# Ministerpräsidenten des Landes Schleswig-Holstein -# Staatskanzlei -# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung -# -# Lizenziert unter der EUPL, Version 1.2 oder - sobald -# diese von der Europäischen Kommission genehmigt wurden - -# Folgeversionen der EUPL ("Lizenz"); -# Sie dürfen dieses Werk ausschließlich gemäß -# dieser Lizenz nutzen. -# Eine Kopie der Lizenz finden Sie hier: -# -# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 -# -# Sofern nicht durch anwendbare Rechtsvorschriften -# gefordert oder in schriftlicher Form vereinbart, wird -# die unter der Lizenz verbreitete Software "so wie sie -# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - -# ausdrücklich oder stillschweigend - verbreitet. -# Die sprachspezifischen Genehmigungen und Beschränkungen -# unter der Lizenz sind dem Lizenztext zu entnehmen. -# - - -set -x - -TEST_DIR=/tmp/kop-afm-filereader - -rm -R $TEST_DIR -mkdir -p $TEST_DIR -cp -a src/test/resources/intelliform/filereader/example/* $TEST_DIR - - -./mvnw spring-boot:run -Dspring-boot.run.arguments="--ozgcloud.adapter.intelliform.filereader.path=file:$TEST_DIR" diff --git a/run_helm_test.sh b/run_helm_test.sh deleted file mode 100755 index ccc03d0fb89a1d2eb4c637c7d5f68ffd283051e7..0000000000000000000000000000000000000000 --- a/run_helm_test.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/sh - -set -e - -helm template ./src/main/helm/ -f src/test/helm-linter-values.yaml -helm lint -f src/test/helm-linter-values.yaml ./src/main/helm/ -cd src/main/helm && helm unittest -f '../../test/helm/**/*.yaml' . \ No newline at end of file diff --git a/run_local.sh b/run_local.sh deleted file mode 100755 index 354eae7e61941418443e05dddf452be44f4d4430..0000000000000000000000000000000000000000 --- a/run_local.sh +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/bash -# -# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den -# Ministerpräsidenten des Landes Schleswig-Holstein -# Staatskanzlei -# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung -# -# Lizenziert unter der EUPL, Version 1.2 oder - sobald -# diese von der Europäischen Kommission genehmigt wurden - -# Folgeversionen der EUPL ("Lizenz"); -# Sie dürfen dieses Werk ausschließlich gemäß -# dieser Lizenz nutzen. -# Eine Kopie der Lizenz finden Sie hier: -# -# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 -# -# Sofern nicht durch anwendbare Rechtsvorschriften -# gefordert oder in schriftlicher Form vereinbart, wird -# die unter der Lizenz verbreitete Software "so wie sie -# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - -# ausdrücklich oder stillschweigend - verbreitet. -# Die sprachspezifischen Genehmigungen und Beschränkungen -# unter der Lizenz sind dem Lizenztext zu entnehmen. -# - - - -./mvnw spring-boot:run -Dspring-boot.run.profiles=local diff --git a/semantik-adapter/pom.xml b/semantik-adapter/pom.xml deleted file mode 100644 index 0dc445cd98dfaaa5e537aa2b5b895667afd85f98..0000000000000000000000000000000000000000 --- a/semantik-adapter/pom.xml +++ /dev/null @@ -1,96 +0,0 @@ -<?xml version="1.0"?> -<!-- - - Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - Ministerpräsidenten des Landes Schleswig-Holstein - Staatskanzlei - Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - - Lizenziert unter der EUPL, Version 1.2 oder - sobald - diese von der Europäischen Kommission genehmigt wurden - - Folgeversionen der EUPL ("Lizenz"); - Sie dürfen dieses Werk ausschließlich gemäß - dieser Lizenz nutzen. - Eine Kopie der Lizenz finden Sie hier: - - https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - - Sofern nicht durch anwendbare Rechtsvorschriften - gefordert oder in schriftlicher Form vereinbart, wird - die unter der Lizenz verbreitete Software "so wie sie - ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - ausdrücklich oder stillschweigend - verbreitet. - Die sprachspezifischen Genehmigungen und Beschränkungen - unter der Lizenz sind dem Lizenztext zu entnehmen. - ---> -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> - - <modelVersion>4.0.0</modelVersion> - <parent> - <groupId>de.ozgcloud.eingang</groupId> - <artifactId>eingang-manager</artifactId> - <version>2.16.0-SNAPSHOT</version> - </parent> - - <artifactId>semantik-adapter</artifactId> - <name>Eingangs Adapter - Semantik</name> - - <dependencies> - <!-- own projects --> - <dependency> - <groupId>de.ozgcloud.eingang</groupId> - <artifactId>router</artifactId> - </dependency> - - <!-- Tools --> - <dependency> - <groupId>com.fasterxml.jackson.dataformat</groupId> - <artifactId>jackson-dataformat-xml</artifactId> - </dependency> - - <dependency> - <groupId>org.apache.commons</groupId> - <artifactId>commons-collections4</artifactId> - </dependency> - - <!-- test --> - <dependency> - <groupId>de.ozgcloud.eingang</groupId> - <artifactId>common</artifactId> - <type>test-jar</type> - <scope>test</scope> - </dependency> - </dependencies> - - <build> - <plugins> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-jar-plugin</artifactId> - <executions> - <execution> - <goals> - <goal>test-jar</goal> - </goals> - </execution> - </executions> - </plugin> - - <plugin> - <groupId>org.jacoco</groupId> - <artifactId>jacoco-maven-plugin</artifactId> - </plugin> - - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-surefire-plugin</artifactId> - </plugin> - - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-failsafe-plugin</artifactId> - </plugin> - </plugins> - </build> -</project> diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/SemantikAdapter.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/SemantikAdapter.java deleted file mode 100644 index 65c69a87ebc51b3313b8b4ec84d24f7d10170cf0..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/SemantikAdapter.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.semantik; - -import java.util.List; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.router.VorgangService; -import de.ozgcloud.eingang.semantik.enginebased.EngineBasedSemantikAdapter; -import de.ozgcloud.eingang.semantik.formbased.FormBasedSemantikAdapter; -import lombok.extern.log4j.Log4j2; - -@Log4j2 -@Service -public class SemantikAdapter { - - @Autowired - private List<EngineBasedSemantikAdapter> engineBasedAdapters; - @Autowired - private FormBasedSemantikAdapter formBasedAdapter; - @Autowired - private VorgangService vorgangService; - - public String processFormData(FormData formData) { - formData = parseByEngineAdapter(formData); - formData = parseByFormAdapter(formData); - - return vorgangService.createVorgang(formData); - } - - private FormData parseByEngineAdapter(FormData formData) { - List<EngineBasedSemantikAdapter> responsibleEngineAdapters = getResponsibleEngineAdapters(formData); - for (var adapter : responsibleEngineAdapters) { - try { - formData = adapter.parseFormData(formData); - } catch (Exception e) { - LOG.error("beim Vorgang {} ist ein Fehler beim Parsing aufgetreten. Der Antrag wird trotzdem übernommen", formData.getId(), e); - } - } - return formData; - } - - List<EngineBasedSemantikAdapter> getResponsibleEngineAdapters(FormData formData) { - return engineBasedAdapters.stream() - .filter(adapter -> adapter.isResponsible(formData)) - .toList(); - } - - private FormData parseByFormAdapter(FormData formData) { - return formBasedAdapter.parseFormData(formData); - } -} diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/common/ReadZipException.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/common/ReadZipException.java deleted file mode 100644 index c3fcc85a910df48282884211d68617f4095248df..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/common/ReadZipException.java +++ /dev/null @@ -1,12 +0,0 @@ -package de.ozgcloud.eingang.semantik.common; - -public class ReadZipException extends RuntimeException { - - public ReadZipException(String message) { - super(message); - } - - public ReadZipException(String message, Throwable cause) { - super(message, cause); - } -} diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/common/ServiceKontoFactory.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/common/ServiceKontoFactory.java deleted file mode 100644 index c8eeb923582f97ede8c3b9bee2726810a2ead349..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/common/ServiceKontoFactory.java +++ /dev/null @@ -1,133 +0,0 @@ -package de.ozgcloud.eingang.semantik.common; - -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -import org.apache.commons.collections.MapUtils; -import org.springframework.stereotype.Component; - -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.common.formdata.PostfachAddressIdentifier; -import de.ozgcloud.eingang.common.formdata.ServiceKonto; -import de.ozgcloud.eingang.common.formdata.ServiceKonto.PostfachAddress; -import de.ozgcloud.eingang.common.formdata.ServiceKonto.TrustLevel; -import de.ozgcloud.eingang.common.formdata.StringBasedIdentifier; -import lombok.extern.log4j.Log4j2; - -@Component -@Log4j2 -public class ServiceKontoFactory { - - public static final int POSTFACH_ADDRESS_DEFAULT = 1; - public static final String POSTFACH_TYPE_OSI = "OSI"; - public static final String POSTFACH_TYPE_BAYERN_ID = "BAYERN_ID"; - public static final String POSTFACH_VERSION = "1.0"; - public static final String KEY_BAYERN_ID_POSTFACH_ID = "u:saml_legacypostkorbhandle"; - public static final String KEY_BAYERN_ID_TRUST_LEVEL = "u:saml_eid_citizen_qaa_level"; - - public static final String REST_RESPONSE_NAME = "rest_response_name"; - public static final String REST_RESPONSE_NAME_MEMBER_SCOPE = "memberscope"; - public static final String REST_RESPONSE_NAME_MEMBER_SCOPE_MAILBOX_TYPE = "mailboxtype"; - - public ServiceKonto buildOsiServiceKonto(String postfachId) { - return buildDefault(postfachId); - } - - public ServiceKonto buildOsiServiceKonto(String postfachId, FormData formData) { - return Optional.ofNullable(getRestResponseNames(formData)) - .filter(names -> !names.isEmpty()) - .map(restResponseNames -> buildWithRestResponseNames(postfachId, restResponseNames)) - .orElseGet(() -> buildDefault(postfachId)); - } - - ServiceKonto buildDefault(String postfachId) { - return ServiceKonto.builder().type(POSTFACH_TYPE_OSI).postfachAddress(buildPostfachAddress(postfachId)).build(); - } - - @SuppressWarnings("unchecked") - private List<Map<String, Object>> getRestResponseNames(FormData formData) { - return Optional.ofNullable(formData.getFormData().get(REST_RESPONSE_NAME)) - .filter(Objects::nonNull) - .map(List.class::cast) - .orElse(Collections.emptyList()); - } - - ServiceKonto buildWithRestResponseNames(String postfachId, List<Map<String, Object>> restResponseNames) { - return ServiceKonto.builder() - .type(POSTFACH_TYPE_OSI) - .postfachAddresses(buildPostfachAddresses(buildIdentifier(postfachId), restResponseNames)) - .build(); - } - - List<PostfachAddress> buildPostfachAddresses(PostfachAddressIdentifier identifier, List<Map<String, Object>> restResponseNames) { - return restResponseNames.stream().map(entry -> buildOsiPostfachV1Address(identifier, entry)).toList(); - } - - PostfachAddress buildOsiPostfachV1Address(PostfachAddressIdentifier identifier, Map<String, Object> restResponseName) { - return buildOsiPostfachV1Address(identifier, getPostfachAddressType(restResponseName)); - } - - PostfachAddress buildOsiPostfachV1Address(PostfachAddressIdentifier identifier, int postfachAddressType) { - return PostfachAddress.builder() - .type(postfachAddressType) - .version(POSTFACH_VERSION) - .identifier(identifier) - .build(); - } - - int getPostfachAddressType(Map<String, Object> restResponseName) { - return getMailboxType(restResponseName); - } - - private Integer getMailboxType(Map<String, Object> restResponseName) { - return (Integer) getMemberScope(restResponseName).get(REST_RESPONSE_NAME_MEMBER_SCOPE_MAILBOX_TYPE); - } - - @SuppressWarnings("unchecked") - private Map<String, Object> getMemberScope(Map<String, Object> restResponseName) { - return ((List<Map<String, Object>>) restResponseName.get(REST_RESPONSE_NAME_MEMBER_SCOPE)).get(0); - } - - public Optional<ServiceKonto> createBayernIdServiceKonto(Map<String, Object> formDataHeaders) { - if (Objects.isNull(formDataHeaders) || !formDataHeaders.containsKey(KEY_BAYERN_ID_POSTFACH_ID)) { - return Optional.empty(); - } - if (isValidTrustLevel(formDataHeaders)) { - return Optional.of(buildBayernIdServiceKonto(formDataHeaders)); - } - LOG.error("TrustLevel has an unexpected value '{}'. BayernID user account is not connected", getTrustLevel(formDataHeaders)); - return Optional.empty(); - } - - boolean isValidTrustLevel(Map<String, Object> formDataHeader) { - return TrustLevel.exists(getTrustLevel(formDataHeader)); - } - - ServiceKonto buildBayernIdServiceKonto(Map<String, Object> formDataHeaders) { - return ServiceKonto.builder() - .type(POSTFACH_TYPE_BAYERN_ID) - .postfachAddress(buildPostfachAddress(MapUtils.getString(formDataHeaders, KEY_BAYERN_ID_POSTFACH_ID))) - .trustLevel(getTrustLevel(formDataHeaders)) - .build(); - } - - PostfachAddress buildPostfachAddress(String postkorbHandle) { - return PostfachAddress.builder() - .type(POSTFACH_ADDRESS_DEFAULT) - .version(POSTFACH_VERSION) - .identifier(buildIdentifier(postkorbHandle)) - .build(); - } - - private PostfachAddressIdentifier buildIdentifier(String postfachId) { - return StringBasedIdentifier.builder().postfachId(postfachId).build(); - } - - String getTrustLevel(Map<String, Object> formDataHeaders) { - return MapUtils.getString(formDataHeaders, KEY_BAYERN_ID_TRUST_LEVEL); - } - -} \ No newline at end of file diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/common/ZipAttachmentReader.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/common/ZipAttachmentReader.java deleted file mode 100644 index 02b4e95012b0343aa44ebd79f6f0305135ad9234..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/common/ZipAttachmentReader.java +++ /dev/null @@ -1,242 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.semantik.common; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.net.URLConnection; -import java.nio.file.Files; -import java.nio.file.StandardCopyOption; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; -import java.util.Optional; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.zip.ZipEntry; -import java.util.zip.ZipInputStream; - -import org.springframework.util.MimeTypeUtils; - -import de.ozgcloud.eingang.common.errorhandling.TechnicalException; -import de.ozgcloud.eingang.common.formdata.DeleteOnCloseInputStream; -import de.ozgcloud.eingang.common.formdata.IncomingFile; -import lombok.Getter; -import lombok.extern.log4j.Log4j2; - -@Log4j2 -public class ZipAttachmentReader { - - public static final String TMP_FILE_SUFFIX = ".ozg-cloud.tmp"; - public static final String SOURCE_ZIP_PREFIX = "zip-attachment"; - static final String TARGET_ATTACHMENT_PREFIX = "ozg_fs_attachment_"; - - private static final double ZIP_MAX_THRESHOLD = 100; - private static final int ZIP_MAX_TOTAL_SIZE = 500 * 1024 * 1024; - private static final int ZIP_MAX_ENTRIES = 100; - - private final File sourceZipFile; - @Getter - private final String sourceFileName; - - ZipAttachmentReader() { - this.sourceZipFile = null; - this.sourceFileName = null; - } - - private ZipAttachmentReader(InputStream sourceZipInputStream, String originalFileName) { - try { - this.sourceZipFile = saveSourceZipToFile(sourceZipInputStream, SOURCE_ZIP_PREFIX); - sourceZipInputStream.close(); - } catch (IOException e) { - throw new TechnicalException("Can not save original ZIP.", e); - } - this.sourceFileName = originalFileName; - } - - private ZipAttachmentReader(File sourceZipInputFile, String originalFileName) { - this.sourceZipFile = sourceZipInputFile; - this.sourceFileName = originalFileName; - } - - public static ZipAttachmentReader from(InputStream sourceZipInputStream, String originalFileName) { - return new ZipAttachmentReader(sourceZipInputStream, originalFileName); - } - - public static ZipAttachmentReader from(File sourceZipInputFile, String originalFileName) { - return new ZipAttachmentReader(sourceZipInputFile, originalFileName); - } - - protected static File saveSourceZipToFile(InputStream inputStream, String namePrefix) { - try { - File tempFile = File.createTempFile(namePrefix, TMP_FILE_SUFFIX); - Files.copy(inputStream, tempFile.toPath(), StandardCopyOption.REPLACE_EXISTING); - tempFile.deleteOnExit(); - return tempFile; - } catch (IOException e) { - throw new ReadZipException("Cannot save source ZIP file to local storage. Processing interrupted.", e); - } - } - - public List<IncomingFile> readContent() throws ReadZipException { - try (ZipInputStream sourceZipInputStream = new ZipInputStream(new FileInputStream(sourceZipFile))) { - return readContent(sourceZipInputStream); - } catch (IOException e) { - throw new ReadZipException("Cannot save file contained in ZIP. Processing interrupted.", e); - } - } - - public void deleteSourceFile() { - try { - Files.delete(sourceZipFile.toPath()); - } catch (IOException e) { - LOG.error("Error deleting source ZIP file.", e); - } - } - - List<IncomingFile> readContent(ZipInputStream sourceZipInputStream) throws IOException, ReadZipException { - ZipEntry nextEntry = entryExists(sourceZipInputStream.getNextEntry()); - List<IncomingFile> extractedFiles = new ArrayList<>(); - - AtomicInteger totalExtractedSize = new AtomicInteger(); - int totalZipEntries = 0; - - while (Objects.nonNull(nextEntry)) { - - final ZipEntry currentEntry = nextEntry; - - Optional.of(currentEntry) - .filter(entry -> !entry.isDirectory()) - .map(entry -> createLocalTempFile()) - .map(localFile -> { - int size = saveZipFileToLocalFile(currentEntry, sourceZipInputStream, localFile); - extractedFiles.add(createContentEntry(localFile, currentEntry)); - return size; - }) - .ifPresent(totalExtractedSize::addAndGet); - - totalZipEntries++; - checkTotalExtractedSize(totalExtractedSize.get()); - checkTotalZipEntries(totalZipEntries); - - nextEntry = sourceZipInputStream.getNextEntry(); - } - - return extractedFiles; - } - - File createLocalTempFile() { - try { - File localFile = File.createTempFile(TARGET_ATTACHMENT_PREFIX, TMP_FILE_SUFFIX); - localFile.deleteOnExit(); - return localFile; - } catch (IOException e) { - throw new ReadZipException("Could not create tmp file", e); - } - } - - void checkTotalExtractedSize(Integer totalExtractedSize) { - if (totalExtractedSize > ZIP_MAX_TOTAL_SIZE) { - throw new ReadZipException("Total size of uncompressed zip file is to high (" + totalExtractedSize + "> " + ZIP_MAX_TOTAL_SIZE + ")"); - } - } - - private void checkTotalZipEntries(Integer totalZipEntries) { - if (totalZipEntries > ZIP_MAX_ENTRIES) { - throw new ReadZipException("Total entries in zip file exceeded (" + totalZipEntries + "> " + ZIP_MAX_ENTRIES + ")"); - } - } - - private ZipEntry entryExists(ZipEntry entry) { - if (Objects.isNull(entry)) { - throw new ReadZipException("Zip archive either invalid or empty."); - } - return entry; - } - - int saveZipFileToLocalFile(ZipEntry zipEntry, InputStream inputStream, File localFile) { - try { - - try (FileOutputStream out = new FileOutputStream(localFile)) { - int totalSizeEntry = 0; - - int readBytes = -1; - byte[] buffer = new byte[2048]; - while ((readBytes = inputStream.read(buffer)) > 0) { // Compliant - out.write(buffer, 0, readBytes); - totalSizeEntry += readBytes; - - double compressionRatio = (double) totalSizeEntry / zipEntry.getCompressedSize(); - if (compressionRatio > ZIP_MAX_THRESHOLD) { - throw new ReadZipException( - "Ratio between compressed and uncompressed data is highly suspicious (" + compressionRatio - + "), looks like a Zip Bomb Attack"); - } - } - - return totalSizeEntry; - } - } catch (IOException e) { - throw new ReadZipException("Cannot save file contained in ZIP. Processing interrupted.", e); - } - } - - IncomingFile createContentEntry(File file, ZipEntry zipEntry) { - return IncomingFile.builder() - .name(zipEntry.getName()) - .size(zipEntry.getSize()) - .contentType(getContentType(zipEntry.getName())) - .file(file) - .build(); - } - - @Deprecated - public InputStream getSourceZipAsStream() { - try { - return new DeleteOnCloseInputStream(sourceZipFile); - } catch (FileNotFoundException e) { - throw new TechnicalException("Original ZIP was deleted", e); - } - } - - public File getSourceZip() { - return sourceZipFile; - } - - public long getSourceFileSize() { - try { - return Files.size(sourceZipFile.toPath()); - } catch (IOException e) { - throw new TechnicalException("Cannot get size of source ZIP.", e); - } - } - - String getContentType(String name) { - Objects.requireNonNull(name); - return Objects.requireNonNullElse(URLConnection.guessContentTypeFromName(name), MimeTypeUtils.APPLICATION_OCTET_STREAM_VALUE); - } -} diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/EngineBasedMapper.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/EngineBasedMapper.java deleted file mode 100644 index 5b336e7592b7ecbc1e619d0ed40112f031fc0c90..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/EngineBasedMapper.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.semantik.enginebased; - -import de.ozgcloud.eingang.common.formdata.FormData; - -public interface EngineBasedMapper { - - FormData parseFormData(FormData formData); -} diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/EngineBasedSemantikAdapter.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/EngineBasedSemantikAdapter.java deleted file mode 100644 index 9679dc725335d8c95f9e7e1114c7c0a5d48f22ce..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/EngineBasedSemantikAdapter.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.semantik.enginebased; - -import de.ozgcloud.eingang.common.formdata.FormData; - -public interface EngineBasedSemantikAdapter { - - FormData parseFormData(FormData formData); - - // TODO Umbauen zu `public String[] getFormEngines();` - default boolean isResponsible(FormData formData) { - return true; - } -} diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/FilesMapperHelper.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/FilesMapperHelper.java deleted file mode 100644 index 3e0ccb8a863a59546dd91ba4749b399bc5cfd952..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/FilesMapperHelper.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.semantik.enginebased; - -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.common.formdata.FormDataUtils; -import de.ozgcloud.eingang.common.formdata.IncomingFile; -import de.ozgcloud.eingang.common.formdata.IncomingFileGroup; -import lombok.AccessLevel; -import lombok.NoArgsConstructor; - -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class FilesMapperHelper { - - public static final String REPRESENTATIONS = "parsedRepresentations"; - public static final String FIELD_NAME_MAPPED_FILES = "mappedFiles"; - public static final String ATTACHMENTS = "parsedAttachments"; - - public static Optional<Map<String, Object>> getMappedFiles(FormData formData) { - return Optional.ofNullable(formData).map(FormData::getFormData).map(map -> (Map<String, Object>) map.get(FIELD_NAME_MAPPED_FILES)); - } - - public static Optional<List<IncomingFileGroup>> getAttachedFileGroups(FormData formData) { - return getMappedFiles(formData).map(mappedFiles -> (List<IncomingFileGroup>) mappedFiles.get(ATTACHMENTS)); - } - - public static Optional<List<IncomingFile>> getRepresentations(FormData formData) { - return getMappedFiles(formData).map(mappedFiles -> (List<IncomingFile>) mappedFiles.get(REPRESENTATIONS)); - } - - public static int countAttachedFiles(Collection<IncomingFileGroup> fileGroups) { - return fileGroups.stream().filter(Objects::nonNull).mapToInt(group -> group.getFiles().size()).sum(); - } - - public static FormData removeProcessedData(FormData formData) { - return FormDataUtils.from(formData).remove(FIELD_NAME_MAPPED_FILES).build(); - } -} diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/a12/A12Eingang.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/a12/A12Eingang.java deleted file mode 100644 index c9f93b0c0196b2bf9d97ff98043b48b04943de94..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/a12/A12Eingang.java +++ /dev/null @@ -1,15 +0,0 @@ -package de.ozgcloud.eingang.semantik.enginebased.a12; - -import java.util.Map; - -import lombok.Builder; -import lombok.Getter; -import lombok.extern.jackson.Jacksonized; - -@Builder -@Getter -@Jacksonized -public class A12Eingang { - - private Map<String, Object> root; -} diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/a12/A12EngineBasedAdapter.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/a12/A12EngineBasedAdapter.java deleted file mode 100644 index ac42d7f7cfa1c7cdf7ded2fcac816cda943e42cc..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/a12/A12EngineBasedAdapter.java +++ /dev/null @@ -1,24 +0,0 @@ -package de.ozgcloud.eingang.semantik.enginebased.a12; - -import java.util.List; - -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.semantik.enginebased.EngineBasedSemantikAdapter; -import lombok.RequiredArgsConstructor; - -@RequiredArgsConstructor -public class A12EngineBasedAdapter implements EngineBasedSemantikAdapter { - - private final List<A12EngineBasedMapper> mappers; - - @Override - public FormData parseFormData(FormData formData) { - var processedFormData = formData; - - for (var mapper : mappers) { - processedFormData = mapper.parseFormData(processedFormData); - } - return processedFormData; - } - -} diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/a12/A12EngineBasedMapper.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/a12/A12EngineBasedMapper.java deleted file mode 100644 index 3f441525324679a29fc4adc0bec2574ef7b3df7a..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/a12/A12EngineBasedMapper.java +++ /dev/null @@ -1,7 +0,0 @@ -package de.ozgcloud.eingang.semantik.enginebased.a12; - -import de.ozgcloud.eingang.semantik.enginebased.EngineBasedMapper; - -public interface A12EngineBasedMapper extends EngineBasedMapper { - -} diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/a12/A12FormDataMapper.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/a12/A12FormDataMapper.java deleted file mode 100644 index 688726362cc93f2b271f683f28ad7a929f725432..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/a12/A12FormDataMapper.java +++ /dev/null @@ -1,79 +0,0 @@ -package de.ozgcloud.eingang.semantik.enginebased.a12; - -import java.io.File; -import java.io.IOException; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; - -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Component; - -import com.fasterxml.jackson.databind.ObjectMapper; - -import de.ozgcloud.common.errorhandling.TechnicalException; -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.common.formdata.FormData.FormDataControl; -import de.ozgcloud.eingang.common.formdata.FormData.Representations; -import de.ozgcloud.eingang.common.formdata.IncomingFile; -import lombok.RequiredArgsConstructor; -import lombok.extern.log4j.Log4j2; - -@Log4j2 -@Component -@RequiredArgsConstructor -public class A12FormDataMapper implements A12EngineBasedMapper { - - private final ObjectMapper objectMapper; - - @Override - public FormData parseFormData(FormData formData) { - return mergeReadFormData(formData, getFormDataFile(formData)); - } - - private FormData mergeReadFormData(FormData formData, Optional<IncomingFile> inFile) { - return inFile.map(in -> readEingang(in.getFile())) - .map(eingang -> eingang.getRoot()) - .map(formDataMap -> merge(formDataMap, formData.getFormData())) - .map(formDataMap -> formData.toBuilder().formData(formDataMap).build()) - .orElse(formData); - } - - Optional<IncomingFile> getFormDataFile(FormData formData) { - var inFile = Optional.ofNullable(formData.getControl()) - .flatMap(FormDataControl::getRepresentations) - .map(Representations::getPrimaryFormDataRepresentation) - .flatMap(fileName -> getByName(fileName, formData.getRepresentations())); - - logWarnIfEmpty(inFile); - return inFile; - } - - A12Eingang readEingang(File formDataJson) { - try { - return objectMapper.readValue(formDataJson, A12Eingang.class); - } catch (IOException e) { - throw new TechnicalException("Error parsing JSON from A12 FormDataFile", e); - } - } - - void logWarnIfEmpty(Optional<IncomingFile> inFile) { - if (inFile.isEmpty()) { - LOG.warn("No primary Form Data Representation found."); - } - } - - Optional<IncomingFile> getByName(String name, List<IncomingFile> inFiles) { - return inFiles.stream() - .filter(inFile -> StringUtils.equals(name, inFile.getName())) - .findFirst(); - } - - <A, B> Map<A, B> merge(Map<A, B> map1, Map<A, B> map2) { - var map = new HashMap<>(map1); - map.putAll(map2); - return Collections.unmodifiableMap(map); - } -} diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmAntragstellerHeaderMapper.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmAntragstellerHeaderMapper.java deleted file mode 100644 index df134be93dbf148d8cc9f2009d9f2ad6ec6d581d..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmAntragstellerHeaderMapper.java +++ /dev/null @@ -1,69 +0,0 @@ -package de.ozgcloud.eingang.semantik.enginebased.afm; - -import static java.util.Objects.*; -import static org.apache.commons.lang3.StringUtils.*; - -import java.util.Collections; -import java.util.Map; - -import org.apache.commons.collections.MapUtils; -import org.springframework.stereotype.Component; - -import de.ozgcloud.eingang.common.errorhandling.TechnicalException; -import de.ozgcloud.eingang.common.formdata.Antragsteller; -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.semantik.common.ServiceKontoFactory; - -@Component -public class AfmAntragstellerHeaderMapper { - - static final String KEY_VORNAME = "u:saml_givenname"; - static final String KEY_NACHNAME = "u:saml_surname"; - static final String KEY_GEBURTSORT = "u:saml_placeofbirth"; - public static final String KEY_GEBURTSNAME = "u:saml_birthname"; - static final String KEY_EMAIL = "u:saml_mail"; - static final String KEY_TELEFON = "u:saml_telephonenumber"; - static final String KEY_STRASSE = "u:saml_postaladdress"; - static final String KEY_PLZ = "u:saml_postalcode"; - static final String KEY_ORT = "u:saml_localityname"; - - public FormData parseAntragstellerData(FormData formData) { - return formData.toBuilder().antragsteller(buildAntragsteller(getHeaders(formData))).build(); - } - - Antragsteller buildAntragsteller(Map<String, Object> headers) { - return Antragsteller.builder() - .postfachId(MapUtils.getString(headers, ServiceKontoFactory.KEY_BAYERN_ID_POSTFACH_ID)) - .vorname(MapUtils.getString(headers, KEY_VORNAME)) - .nachname(MapUtils.getString(headers, KEY_NACHNAME)) - .geburtsname(MapUtils.getString(headers, KEY_GEBURTSNAME)) - .geburtsort(MapUtils.getString(headers, KEY_GEBURTSORT)) - .email(MapUtils.getString(headers, KEY_EMAIL)) - .telefon(MapUtils.getString(headers, KEY_TELEFON)) - .strasse(MapUtils.getString(headers, KEY_STRASSE)) - .plz(MapUtils.getString(headers, KEY_PLZ)) - .ort(MapUtils.getString(headers, KEY_ORT)) - .build(); - } - - public boolean isResponsible(FormData formData) { - var headers = getHeaders(formData); - return headers.containsKey(ServiceKontoFactory.KEY_BAYERN_ID_POSTFACH_ID) - && isPostfachIdNotBlank(headers.get(ServiceKontoFactory.KEY_BAYERN_ID_POSTFACH_ID)); - } - - @SuppressWarnings("unchecked") - Map<String, Object> getHeaders(FormData formData) { - return (Map<String, Object>) formData.getFormData().getOrDefault(AfmHeaderMapper.HEADER_FIELD, Collections.emptyMap()); - } - - boolean isPostfachIdNotBlank(Object postfachId) { - if (isNull(postfachId)) { - return false; - } - if (postfachId instanceof String id) { - return isNotBlank(id); - } - throw new TechnicalException("Unexpected type of postfach id: " + postfachId.getClass().getName()); - } -} diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmAntragstellerMapper.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmAntragstellerMapper.java deleted file mode 100644 index 52365312ec979e24d37560740ce9fca8c02db523..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmAntragstellerMapper.java +++ /dev/null @@ -1,166 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.semantik.enginebased.afm; - -import static java.util.Objects.*; - -import java.util.Collections; -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.Optional; -import java.util.Set; -import java.util.stream.Collectors; - -import org.apache.commons.collections.MapUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import de.ozgcloud.eingang.common.formdata.Antragsteller; -import de.ozgcloud.eingang.common.formdata.FormData; - -@Component -class AfmAntragstellerMapper implements AfmEngineBasedMapper { - - static final String POSTFACH_ID = "nameid"; - - static final String ANTRAGSTELLER = "antragsteller"; - static final String ANTRAGSTELLER_UPPERCASE = "Antragsteller"; - static final String ANREDE = "b_anrede"; - static final String VORNAME = "pers_vorname"; - static final String NACHNAME = "pers_nachname"; - static final String GEBURTSNAME = "pers_geburtsname"; - static final String GEBURTSDATUM = "pers_geburtsdatum"; - static final String GEBURTSORT = "pers_geburtsort"; - static final String EMAIL = "kont_email"; - static final String TELEFON = "kont_telefonnummer"; - static final String STRASSE = "sh_strasse"; - static final String HAUSNUMMER = "sh_hausnummer"; - static final String PLZ = "sh_plz"; - static final String ORT = "ort"; - - static final String FIELD_FIRMA_NAME = "firma_name"; - static final String FIELD_FIRMA_STRASSE = "firma_strasse"; - static final String FIELD_FIRMA_HAUSNUMMER = "firma_hausnummer"; - static final String FIELD_FIRMA_PLZ = "firma_plz"; - static final String FIELD_FIRMA_STADT = "firma_stadt"; - static final String FIELD_ANSPRECHPARTNER_ANREDE = "firma_ansprechpartner_anrede"; - static final String FIELD_ANSPRECHPARTNER_VORNAME = "firma_ansprechpartner_vorname"; - static final String FIELD_ANSPRECHPARTNER_NACHNAME = "firma_ansprechpartner_nachname"; - - @Autowired - private AfmAntragstellerHeaderMapper antragstellerHeaderMapper; - - @Override - public FormData parseFormData(FormData formData) { - if (antragstellerHeaderMapper.isResponsible(formData)) { - return antragstellerHeaderMapper.parseAntragstellerData(formData); - } - var formDataMap = formData.getFormData(); - var builder = Antragsteller.builder().postfachId(getPostfachId(formDataMap)); - - var antragsteller = getAntragstellerMap(formDataMap) - .map(antragstellerMap -> addAntragstellerData(builder, antragstellerMap)) - .orElse(builder) - .build(); - - var cleanedMap = removeMappedData(formDataMap); - return formData.toBuilder().antragsteller(antragsteller).formData(cleanedMap).build(); - } - - private String getPostfachId(Map<String, Object> formDataMap) { - return (String) formDataMap.get(POSTFACH_ID); - } - - private Optional<Map<String, Object>> getAntragstellerMap(Map<String, Object> formDataMap) { - return Optional.ofNullable(formDataMap.get(ANTRAGSTELLER)) - .or(() -> Optional.ofNullable(formDataMap.get(ANTRAGSTELLER_UPPERCASE))) - .map(Map.class::cast) - .map(LinkedHashMap<String, Object>::new); - } - - private Antragsteller.AntragstellerBuilder addAntragstellerData(Antragsteller.AntragstellerBuilder builder, - Map<String, Object> antragstellerMap) { - return isNull(antragstellerMap.get(FIELD_FIRMA_NAME)) - ? addPrivateAntragstellerData(builder, antragstellerMap) - : addFirmAntragstellerData(builder, antragstellerMap); - } - - private Antragsteller.AntragstellerBuilder addPrivateAntragstellerData(Antragsteller.AntragstellerBuilder builder, - Map<String, Object> antragstellerMap) { - return builder // - .anrede((String) antragstellerMap.get(ANREDE)) // - .vorname((String) antragstellerMap.get(VORNAME)) // - .nachname((String) antragstellerMap.get(NACHNAME)) // - .geburtsname((String) antragstellerMap.get(GEBURTSNAME)) // - .geburtsdatum((String) antragstellerMap.get(GEBURTSDATUM)) // - .geburtsort((String) antragstellerMap.get(GEBURTSORT)) // - .email((String) antragstellerMap.get(EMAIL)) // - .telefon((String) antragstellerMap.get(TELEFON)) // - .strasse((String) antragstellerMap.get(STRASSE)) // - .hausnummer((String) antragstellerMap.get(HAUSNUMMER)) // - .plz((String) antragstellerMap.get(PLZ)) // - .ort((String) antragstellerMap.get(ORT)) // - .data(getNotMappedData(antragstellerMap, getPrivateFields())); - } - - Antragsteller.AntragstellerBuilder addFirmAntragstellerData(Antragsteller.AntragstellerBuilder builder, - Map<String, Object> antragstellerMap) { - return builder - .firmaName(MapUtils.getString(antragstellerMap, FIELD_FIRMA_NAME)) - .strasse(MapUtils.getString(antragstellerMap, FIELD_FIRMA_STRASSE)) - .hausnummer(MapUtils.getString(antragstellerMap, FIELD_FIRMA_HAUSNUMMER)) - .plz(MapUtils.getString(antragstellerMap, FIELD_FIRMA_PLZ)) - .ort(MapUtils.getString(antragstellerMap, FIELD_FIRMA_STADT)) - .anrede(MapUtils.getString(antragstellerMap, FIELD_ANSPRECHPARTNER_ANREDE)) - .vorname(MapUtils.getString(antragstellerMap, FIELD_ANSPRECHPARTNER_VORNAME)) - .nachname(MapUtils.getString(antragstellerMap, FIELD_ANSPRECHPARTNER_NACHNAME)) - .telefon(MapUtils.getString(antragstellerMap, TELEFON)) - .email(MapUtils.getString(antragstellerMap, EMAIL)) - .data(getNotMappedData(antragstellerMap, getFirmaFields())); - } - - private Map<String, Object> getNotMappedData(Map<String, Object> antragstellerMap, Set<String> mappedFields) { - return antragstellerMap.entrySet().stream().filter(entry -> !mappedFields.contains(entry.getKey())) - .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (key1, key2) -> key1, LinkedHashMap::new)); - } - - private Set<String> getPrivateFields() { - return Set.of(ANREDE, VORNAME, NACHNAME, GEBURTSNAME, GEBURTSDATUM, GEBURTSORT, EMAIL, TELEFON, STRASSE, HAUSNUMMER, PLZ, ORT); - } - - private Set<String> getFirmaFields() { - return Set.of(FIELD_FIRMA_NAME, FIELD_FIRMA_STRASSE, FIELD_FIRMA_HAUSNUMMER, FIELD_FIRMA_PLZ, FIELD_FIRMA_STADT, - FIELD_ANSPRECHPARTNER_ANREDE, FIELD_ANSPRECHPARTNER_VORNAME, FIELD_ANSPRECHPARTNER_NACHNAME, TELEFON, EMAIL); - } - - private Map<String, Object> removeMappedData(Map<String, Object> formDataMap) { - var editableMap = new LinkedHashMap<>(formDataMap); - if (nonNull(editableMap.get(ANTRAGSTELLER))) { - editableMap.remove(ANTRAGSTELLER); - } else { - editableMap.remove(ANTRAGSTELLER_UPPERCASE); - } - return Collections.unmodifiableMap(editableMap); - } -} diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmEmpfangeneStelleMapper.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmEmpfangeneStelleMapper.java deleted file mode 100644 index 7442e7b40f6dc1a81a18f3cced8a059047a00623..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmEmpfangeneStelleMapper.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.semantik.enginebased.afm; - -import org.springframework.stereotype.Component; - -import de.ozgcloud.eingang.common.formdata.FormData; - -@Component -class AfmEmpfangeneStelleMapper implements AfmEngineBasedMapper { - - static final String EMPFANGENESTELLE = "empfangendestelle"; - - @Override - public FormData parseFormData(FormData formData) { - return addControlNode(formData, EMPFANGENESTELLE); - } - -} diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmEngineBasedAdapter.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmEngineBasedAdapter.java deleted file mode 100644 index 36a9a187a73b98daef840cd7784643867f4c7573..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmEngineBasedAdapter.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.semantik.enginebased.afm; - -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.common.formdata.FormDataUtils; -import de.ozgcloud.eingang.semantik.enginebased.EngineBasedSemantikAdapter; -import de.ozgcloud.eingang.semantik.enginebased.afm.intelliform.IntelliFormRepresentationAdapter; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import java.util.List; - -@Component -public class AfmEngineBasedAdapter implements EngineBasedSemantikAdapter { - - @Autowired - private IntelliFormRepresentationAdapter intelliFormRepresentationAdapter; - - @Autowired - private List<AfmEngineBasedMapper> mappers; - - @Override - public FormData parseFormData(FormData formData) { - var processedFormData = intelliFormRepresentationAdapter.adaptByRepresentations(formData); - - for (var mapper : mappers) { - processedFormData = mapper.parseFormData(processedFormData); - } - - return removeProcessedData(processedFormData); - } - - - private FormData removeProcessedData(FormData formData) { - return FormDataUtils.from(formData) - .remove(AfmAntragstellerMapper.POSTFACH_ID) - .build(); - } - - @Override - public boolean isResponsible(FormData formData) { - return intelliFormRepresentationAdapter.isResponsible(formData); - } -} diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmEngineBasedMapper.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmEngineBasedMapper.java deleted file mode 100644 index f9c67a198432302626fb210f1e87c1901feb9545..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmEngineBasedMapper.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.semantik.enginebased.afm; - -import java.util.Collections; -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.Optional; - -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.semantik.enginebased.EngineBasedMapper; - -interface AfmEngineBasedMapper extends EngineBasedMapper { - - String KOP_CONTROLDATA_NODENAME = "_kopControlData"; - String CONTROLDATA_METADATA_PROPERTYNAME = "metaData"; - - default FormData addControlNode(FormData formData, String nodeName) { - var editableFormMap = new LinkedHashMap<>(formData.getFormData()); - - return Optional.ofNullable(getFormNode(formData, nodeName)) - .map(LinkedHashMap::new) - .map(empfStelleMap -> { - empfStelleMap.put(KOP_CONTROLDATA_NODENAME, buildControlDataMap()); - editableFormMap.put(nodeName, empfStelleMap); - return editableFormMap; - }) - .map(formDataMap -> formData.toBuilder().formData(Collections.unmodifiableMap(formDataMap)).build()) - .orElse(formData); - - } - - @SuppressWarnings("unchecked") - default Map<String, Object> getFormNode(FormData formData, String nodeName) { - return (Map<String, Object>) formData.getFormData().get(nodeName); - } - - default Map<String, Object> buildControlDataMap() { - Map<String, Object> controlMap = new LinkedHashMap<>(); - controlMap.put(CONTROLDATA_METADATA_PROPERTYNAME, "true"); - return controlMap; - } -} diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmErklaerungenMapper.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmErklaerungenMapper.java deleted file mode 100644 index c263bcfaa34103035567c9e7a434feb1b32a50ba..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmErklaerungenMapper.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.semantik.enginebased.afm; - -import org.springframework.stereotype.Component; - -import de.ozgcloud.eingang.common.formdata.FormData; - -@Component -class AfmErklaerungenMapper implements AfmEngineBasedMapper { - - static final String ERKLAERUNGEN = "erklaerungen"; - - @Override - public FormData parseFormData(FormData formData) { - return addControlNode(formData, ERKLAERUNGEN); - } - -} diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmFileCountMapper.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmFileCountMapper.java deleted file mode 100644 index e706d63e31d8161b639826fe9f22b06beeda65d1..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmFileCountMapper.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.semantik.enginebased.afm; - -import org.springframework.stereotype.Component; - -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.semantik.enginebased.FilesMapperHelper; - -@Component -class AfmFileCountMapper implements AfmEngineBasedMapper { - - @Override - public FormData parseFormData(FormData formData) { - return formData.toBuilder() - .numberOfRepresentations(formData.getRepresentations().size()) - .numberOfAttachments(FilesMapperHelper.countAttachedFiles(formData.getAttachments())) - .build(); - } - -} diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmHeaderMapper.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmHeaderMapper.java deleted file mode 100644 index 42222ec8132a79c555967290dd1f2298ec930a18..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmHeaderMapper.java +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.semantik.enginebased.afm; - -import java.time.ZonedDateTime; -import java.time.format.DateTimeFormatter; -import java.util.Map; -import java.util.Optional; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.common.formdata.FormDataUtils; -import de.ozgcloud.eingang.common.formdata.FormHeader; -import de.ozgcloud.eingang.common.formdata.ServiceKonto; -import de.ozgcloud.eingang.semantik.common.ServiceKontoFactory; - -@Component -class AfmHeaderMapper implements AfmEngineBasedMapper { - - static final String AFM_FORMENGINE_NAME = "AFM"; - - static final String POSTFACH_NAME_ID = "nameid"; - - static final String HEADER_FIELD = "header"; - - static final String ID = "t:id"; - static final String TIMESTAMP = "t:timestamp"; - static final String FORM_ID = "t:form-id"; - static final String FORM = "t:form"; - static final String SENDER = "t:sender"; - - @Autowired - private ServiceKontoFactory serviceKontoFactory; - - @Override - public FormData parseFormData(FormData formData) { - var processed = formData.toBuilder().header(buildHeader(formData)).build(); - - return removeMappedData(processed); - } - - private FormHeader buildHeader(FormData formData) { - var headerDataMap = getHeaderMap(formData); - - var formHeaderBuilder = FormHeader.builder() - .requestId((String) headerDataMap.get(ID)) - .vorgangNummer((String) headerDataMap.get(ID)) - .createdAt(getCreatedAt(headerDataMap)) - .formId((String) headerDataMap.get(FORM_ID)) - .formName((String) headerDataMap.get(FORM)) - .sender((String) headerDataMap.get(SENDER)) - .formEngineName(AFM_FORMENGINE_NAME) - .build(); - - createBayernIdServiceKonto(formData).or(() -> createOsiServiceKonto(formData)).ifPresent(formHeaderBuilder::setServiceKonto); - - return formHeaderBuilder; - } - - private ZonedDateTime getCreatedAt(Map<String, Object> headerDataMap) { - return ZonedDateTime.parse((String) headerDataMap.get(TIMESTAMP), DateTimeFormatter.ISO_OFFSET_DATE_TIME); - } - - Optional<ServiceKonto> createBayernIdServiceKonto(FormData formData) { - return serviceKontoFactory.createBayernIdServiceKonto(getHeaderMap(formData)); - } - - @SuppressWarnings("unchecked") - Map<String, Object> getHeaderMap(FormData formData) { - return (Map<String, Object>) formData.getFormData().get(HEADER_FIELD); - } - - Optional<ServiceKonto> createOsiServiceKonto(FormData formData) { - return getNameId(formData).map(nameId -> serviceKontoFactory.buildOsiServiceKonto(nameId, formData)); - } - - private Optional<String> getNameId(FormData formData) { - return Optional.of(formData.getFormData()).map(formDataMap -> formDataMap.get(POSTFACH_NAME_ID)).map(String.class::cast); - } - - private FormData removeMappedData(FormData formData) { - return FormDataUtils.from(formData) - .remove(ServiceKontoFactory.REST_RESPONSE_NAME) - .build(); - } -} diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmZustaendigeStelleMapper.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmZustaendigeStelleMapper.java deleted file mode 100644 index 4fff0ea90b799476bac4f0b3b3c39e4e8378935f..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmZustaendigeStelleMapper.java +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.semantik.enginebased.afm; - -import java.util.Collections; -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.common.formdata.ZustaendigeStelle; - -@Component -class AfmZustaendigeStelleMapper implements AfmEngineBasedMapper { - - public static final String ZUSTAENDIGESTELLE = "zustaendigestelle"; - - public static final String EMAIL = "emailadresse"; - public static final String ORGANISATIONSEINHEITEN_ID = "OrganisationseinheitenID"; - public static final String TAG_BEZEICHNUNG = "OrganisationseinheitenBEZEICHNUNG"; - - @Autowired - private ZustaendigeStelleMetadataMapper zustaendigeStelleMetadataMapper; - - @Override - public FormData parseFormData(FormData formData) { - if (zustaendigeStelleMetadataMapper.isResponsible(formData)) { - return zustaendigeStelleMetadataMapper.parseZustaendigeStelleData(formData); - } - return parseZustaendigeStelleData(formData); - } - - FormData parseZustaendigeStelleData(FormData formData) { - var zustaendigeStelleMap = getZustaendigeStelle(formData); - var organisationseinheitenID = getOrganisationseinheitenId(formData); - var builder = ZustaendigeStelle.builder(); - - if (Objects.isNull(zustaendigeStelleMap) && Objects.isNull(organisationseinheitenID)) { - return formData; - } else if (zustaendigeStelleMap != null) { - organisationseinheitenID = (String) zustaendigeStelleMap.get(ORGANISATIONSEINHEITEN_ID); - builder - .email((String) zustaendigeStelleMap.get(EMAIL)) - .bezeichnung((String) zustaendigeStelleMap.get(TAG_BEZEICHNUNG)); - } - var zustaendigeStelle = builder - .organisationseinheitenId(organisationseinheitenID) - .build(); - - return formData.toBuilder() - .formData(addMetaDataFlag(formData)) - .zustaendigeStelle(zustaendigeStelle).build(); - } - - String getOrganisationseinheitenId(FormData formData) { - return (String) formData.getFormData().get(ORGANISATIONSEINHEITEN_ID); - } - - Map<String, Object> addMetaDataFlag(FormData formData) { - var editableFormData = new LinkedHashMap<>(formData.getFormData()); - - Optional.ofNullable(getZustaendigeStelle(formData)) - .map(LinkedHashMap::new) - .ifPresent(zustaendigeStelle -> { - zustaendigeStelle.put(KOP_CONTROLDATA_NODENAME, buildControlDataMap()); - editableFormData.put(ZUSTAENDIGESTELLE, zustaendigeStelle); - }); - - return Collections.unmodifiableMap(editableFormData); - } - - @SuppressWarnings("unchecked") - Map<String, Object> getZustaendigeStelle(FormData formData) { - return (Map<String, Object>) formData.getFormData().get(ZUSTAENDIGESTELLE); - } -} \ No newline at end of file diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/XmlMapperSupplier.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/XmlMapperSupplier.java deleted file mode 100644 index 8a4b166b5140b283b4e9fa1f8a433991d51c53ae..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/XmlMapperSupplier.java +++ /dev/null @@ -1,21 +0,0 @@ -package de.ozgcloud.eingang.semantik.enginebased.afm; - -import org.springframework.stereotype.Component; - -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.dataformat.xml.XmlMapper; - -@Component -public class XmlMapperSupplier { - - private final XmlMapper xmlMapper; - - public XmlMapperSupplier() { - xmlMapper = new XmlMapper(); - xmlMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); - } - - public XmlMapper getMapper() { - return xmlMapper; - } -} diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/ZustaendigeStelleData.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/ZustaendigeStelleData.java deleted file mode 100644 index 1f085ab99a1b6c7005799b5e91e0618541e4a2af..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/ZustaendigeStelleData.java +++ /dev/null @@ -1,43 +0,0 @@ -package de.ozgcloud.eingang.semantik.enginebased.afm; - -import java.util.List; - -import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper; -import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; -import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement; -import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlText; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import lombok.Singular; - -@JacksonXmlRootElement(localName = "data") -@Builder -@Getter -@NoArgsConstructor -@AllArgsConstructor -public class ZustaendigeStelleData { - - @JacksonXmlProperty(localName = "field") - @JacksonXmlElementWrapper(useWrapping = false) - @Singular - private List<Field> fields; - - @Getter - @Setter - @NoArgsConstructor - @AllArgsConstructor - @Builder - public static class Field { - - @JacksonXmlProperty(isAttribute = true) - private String name; - - @JacksonXmlText - private String value; - - } -} diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/ZustaendigeStelleMetadataMapper.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/ZustaendigeStelleMetadataMapper.java deleted file mode 100644 index a99ae318b214154314e9cf5752dcf13ce03d89fe..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/ZustaendigeStelleMetadataMapper.java +++ /dev/null @@ -1,87 +0,0 @@ -package de.ozgcloud.eingang.semantik.enginebased.afm; - -import static java.util.Objects.*; - -import java.io.IOException; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.function.Predicate; -import java.util.stream.Collectors; - -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import de.ozgcloud.common.errorhandling.TechnicalException; -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.common.formdata.IncomingFile; -import de.ozgcloud.eingang.common.formdata.ZustaendigeStelle; -import lombok.extern.log4j.Log4j2; - -@Log4j2 -@Component -public class ZustaendigeStelleMetadataMapper { - - static final String BEHOERDE_METADATA_FILE_NAME = "behoerde_metadata.xml"; - - private static final Predicate<IncomingFile> IS_BEHOERDE_METADATA = inFile -> StringUtils.endsWith(inFile.getName(), BEHOERDE_METADATA_FILE_NAME); - - static final String KEY_BEHOERDE_ANZEIGE_NAME = "behoerde_anzeige_name"; - static final String KEY_BEHOERDE_CALLER_ID = "behoerde_caller_id"; - static final String KEY_GEMEINDE_SCHLUESSEL_BP = "gemeinde_schluessel_bp"; - static final String KEY_BEHOERDE_EMAIL = "behoerde_email"; - static final String KEY_AMTLICHER_REGIONALSCHLUESSEL = "amtlicher_regionalschluessel"; - static final String KEY_BEHOERDE_HAUSANSCHRIFT_STRASSE = "behoerde_hausanschrift_strasse"; - static final String KEY_BEHOERDE_HAUSANSCHRIFT_ORT = "behoerde_hausanschrift_ort"; - static final String KEY_BEHOERDE_HAUSANSCHRIFT_PLZ = "behoerde_hausanschrift_plz"; - static final String KEY_BEHOERDE_TELEFON = "behoerde_telefon"; - - @Autowired - private XmlMapperSupplier xmlMapperSupplier; - - public FormData parseZustaendigeStelleData(FormData formData) { - return formData.getRepresentations().stream().filter(IS_BEHOERDE_METADATA).findAny() - .map(this::readZustaendigeStelleMetadata) - .map(this::mapZustaendigeStelle) - .map(zustaendigeStelle -> formData.toBuilder() - .zustaendigeStelle(zustaendigeStelle).build()) - .orElse(formData); - } - - Map<String, String> readZustaendigeStelleMetadata(IncomingFile metadata) { - return readXmlContent(metadata).map(ZustaendigeStelleData::getFields).map(this::collectToMap).orElse(Collections.emptyMap()); - } - - Optional<ZustaendigeStelleData> readXmlContent(IncomingFile metadata) { - try { - return Optional.of(xmlMapperSupplier.getMapper().readValue(metadata.getContentStream(), ZustaendigeStelleData.class)); - } catch (IOException | TechnicalException e) { - LOG.error("Error parsing {}", BEHOERDE_METADATA_FILE_NAME, e); - } - return Optional.empty(); - } - - Map<String, String> collectToMap(List<ZustaendigeStelleData.Field> fields) { - return fields.stream().filter(field -> nonNull(field.getValue())) - .collect(Collectors.toMap(ZustaendigeStelleData.Field::getName, ZustaendigeStelleData.Field::getValue)); - } - - ZustaendigeStelle mapZustaendigeStelle(Map<String, String> zustaendigeStelleMetadata) { - return ZustaendigeStelle.builder() - .bezeichnung(zustaendigeStelleMetadata.get(KEY_BEHOERDE_ANZEIGE_NAME)) - .organisationseinheitenId(zustaendigeStelleMetadata.get(KEY_BEHOERDE_CALLER_ID)) - .gemeindeSchluessel(zustaendigeStelleMetadata.get(KEY_GEMEINDE_SCHLUESSEL_BP)) - .email(zustaendigeStelleMetadata.get(KEY_BEHOERDE_EMAIL)) - .amtlicherRegionalSchluessel(zustaendigeStelleMetadata.get(KEY_AMTLICHER_REGIONALSCHLUESSEL)) - .hausanschriftStrasse(zustaendigeStelleMetadata.get(KEY_BEHOERDE_HAUSANSCHRIFT_STRASSE)) - .hausanschriftOrt(zustaendigeStelleMetadata.get(KEY_BEHOERDE_HAUSANSCHRIFT_ORT)) - .hausanschriftPlz(zustaendigeStelleMetadata.get(KEY_BEHOERDE_HAUSANSCHRIFT_PLZ)) - .telefon(zustaendigeStelleMetadata.get(KEY_BEHOERDE_TELEFON)).build(); - } - - public boolean isResponsible(FormData formData) { - return formData.getRepresentations().stream().anyMatch(IS_BEHOERDE_METADATA); - } -} diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/intelliform/IntelliFormRepresentationAdapter.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/intelliform/IntelliFormRepresentationAdapter.java deleted file mode 100644 index d96052447475590512a9ac5cd2280ebe22d0715f..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/intelliform/IntelliFormRepresentationAdapter.java +++ /dev/null @@ -1,145 +0,0 @@ -package de.ozgcloud.eingang.semantik.enginebased.afm.intelliform; - -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.Set; -import java.util.stream.Collector; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import org.apache.commons.collections.MapUtils; -import org.springframework.stereotype.Component; -import org.w3c.dom.Document; - -import de.ozgcloud.eingang.common.errorhandling.TechnicalException; -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.common.formdata.IncomingFile; -import de.ozgcloud.eingang.common.formdata.IncomingFileGroup; -import de.ozgcloud.eingang.semantik.common.ServiceKontoFactory; -import lombok.RequiredArgsConstructor; -import lombok.extern.log4j.Log4j2; - -@Component -@RequiredArgsConstructor -@Log4j2 -public class IntelliFormRepresentationAdapter { - - static final String INTELLIFORM_TYPENAME = "http://xmlns.cit.de/intelliform/transaction"; - - static final String FILE = "file"; - - static final String HEADER_FIELD = "header"; - - public static final List<String> HEADER_ATTRIBUTE_NAMES = List.of( - "t:id", - "t:timestamp", - "t:form-id", - "t:form", - "t:sender", - "t:customer", - "t:customer-id", - "t:client", - "t:client-id" - ); - public static final List<String> CUSTOM_HEADER_ATTRIBUTE_NAMES = List.of( - "u:saml_legacypostkorbhandle", - "u:saml_givenname", - "u:saml_surname", - "u:saml_placeofbirth", - "u:saml_birthname", - "u:saml_mail", - "u:saml_telephonenumber", - "u:saml_postaladdress", - "u:saml_postalcode", - "u:saml_localityname", - ServiceKontoFactory.KEY_BAYERN_ID_TRUST_LEVEL - ); - - private static final Collector<Map.Entry<String, ?>, ?, Map<String, Object>> ORDERED_MAP_ENTRY_COLLECTOR = Collectors.toMap( - Map.Entry::getKey, - Map.Entry::getValue, - (u, v) -> v, - LinkedHashMap::new - ); - - private final XmlToJavaMapsMapper xmlToJavaMapsMapper; - - public boolean isResponsible(FormData formData) { - return findIntelliFormXMLRepresentation(formData) - .isPresent(); - } - - Optional<Document> findIntelliFormXMLRepresentation(FormData formData) { - return streamXMLDocumentsFromRepresentations(formData) - .filter(document -> { - var element = document.getDocumentElement(); - var attribute = element.getAttribute("xmlns:t"); - return attribute.equals(INTELLIFORM_TYPENAME); - }) - .findFirst(); - } - - Stream<Document> streamXMLDocumentsFromRepresentations(FormData formData) { - return formData.getRepresentations().stream() - .filter(representation -> representation.getContentType().contains("xml")) - .flatMap(xmlRepresentation -> { - try { - return Stream.of(xmlToJavaMapsMapper.parseAsW3cDocument(xmlRepresentation.getContentStream())); - } catch (TechnicalException exception) { - return Stream.empty(); - } - }); - } - - public FormData adaptByRepresentations(FormData formData) { - var document = findIntelliFormXMLRepresentation(formData) - .orElseThrow(() -> new TechnicalException("Expect to find IntelliForm XML representation!")); - - return FormData.builder() - .representations(formData.getRepresentations()) - .attachments(formData.getAttachments()) - .formData(Stream.concat( - getFormDataEntriesFromDocument(document, formData.getAttachments()), - Map.of( - HEADER_FIELD, createHeaderMap(document) - ).entrySet().stream() - ).collect(ORDERED_MAP_ENTRY_COLLECTOR)) - .build(); - } - - Stream<Map.Entry<String, Object>> getFormDataEntriesFromDocument(Document document, List<IncomingFileGroup> attachments) { - Set<String> attachmentVendorIds = attachments.stream() - .flatMap(group -> group.getFiles().stream()) - .map(IncomingFile::getVendorId) - .collect(Collectors.toSet()); - - return xmlToJavaMapsMapper.mapXmlToJavaMaps(document).entrySet() - .stream() - .filter(entry -> !isUploadElementWhichRefersToAttachment(entry.getValue(), attachmentVendorIds)); - } - - private boolean isUploadElementWhichRefersToAttachment(Object element, Set<String> attachmentVendorIds) { - return findVendorIdInUploadElementCandidate(element) - .map(attachmentVendorIds::contains) - .orElse(false); - } - - @SuppressWarnings("rawtypes") - private Optional<String> findVendorIdInUploadElementCandidate(Object element) { - if (element instanceof Map uploadElement) { - return Optional.ofNullable(MapUtils.getMap(uploadElement, FILE)) - .flatMap(fileElement -> Optional.ofNullable(MapUtils.getString(fileElement, "id"))); - } else { - return Optional.empty(); - } - } - - Map<String, Object> createHeaderMap(Document document) { - var element = document.getDocumentElement(); - return Stream.concat(HEADER_ATTRIBUTE_NAMES.stream(), CUSTOM_HEADER_ATTRIBUTE_NAMES.stream().filter(element::hasAttribute)) - .collect(Collectors.toMap(name -> name, element::getAttribute)); - } - -} diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/intelliform/JsonService.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/intelliform/JsonService.java deleted file mode 100644 index 04d21f1a271da454917f3a580727e31bc3baac98..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/intelliform/JsonService.java +++ /dev/null @@ -1,35 +0,0 @@ -package de.ozgcloud.eingang.semantik.enginebased.afm.intelliform; - -import java.util.List; -import java.util.Map; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; - -import de.ozgcloud.common.errorhandling.TechnicalException; - -@Component -class JsonService { - - static final TypeReference<List<Map<String, Object>>> VALUE_TYPE_REF = new TypeReference<List<Map<String, Object>>>() { - }; - - @Autowired - private ObjectMapper objectMapper; - - public List<Map<String, Object>> readAsListMap(String json) { - return readValueSafety(json, VALUE_TYPE_REF); - } - - private <T> T readValueSafety(String json, TypeReference<T> typeRef) { - try { - return objectMapper.readValue(json, typeRef); - } catch (JsonProcessingException e) { - throw new TechnicalException("Error parsing JSON", e); - } - } -} diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/intelliform/XmlToJavaMapsMapper.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/intelliform/XmlToJavaMapsMapper.java deleted file mode 100644 index 75409a60e28a1966f85e4b1caa4ecdda90fa569e..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/intelliform/XmlToJavaMapsMapper.java +++ /dev/null @@ -1,187 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.semantik.enginebased.afm.intelliform; - -import java.io.IOException; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.w3c.dom.Document; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; -import org.xml.sax.SAXException; - -import de.ozgcloud.eingang.common.errorhandling.TechnicalException; -import lombok.extern.log4j.Log4j2; - -@Log4j2 -@Component -class XmlToJavaMapsMapper { - - static final String REST_RESPONSE_NAME = "rest_response_name"; - static final String FILE = "file"; - - @Autowired - private JsonService jsonService; - - public Document parseAsW3cDocument(InputStream xmlDatenInputStream) { - try { - DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance(); - - docBuilderFactory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); - - DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder(); - Document document = docBuilder.parse(xmlDatenInputStream); - - // optional, but recommended - // http://stackoverflow.com/questions/13786607/normalization-in-dom-parsing-with-java-how-does-it-work - document.getDocumentElement().normalize(); - - return document; - - } catch (IOException | ParserConfigurationException | SAXException e) { - throw new TechnicalException("Could not parse XML-Daten.xml file content", e); - } - } - - public Map<String, Object> mapXmlToJavaMaps(Node node) { - return mapChildNodes(node.getFirstChild()); - } - - private Map<String, Object> mapChildNodes(Node node) { - - Map<String, Object> childs = new LinkedHashMap<>(); - - NodeList nodeList = node.getChildNodes(); - - for (int i = 0; i < nodeList.getLength(); i++) { - - Node currentNode = nodeList.item(i); - - if (isElementNode(currentNode)) { - - if (isSimpleTextNode(currentNode)) { - - addChildElement(childs, currentNode, currentNode.getFirstChild().getTextContent()); - - } else { - - if (currentNode.getChildNodes().getLength() > 0) { - - addChildElement(childs, currentNode, mapChildNodes(currentNode)); - } - } - } - } - - return childs; - } - - private boolean isElementNode(Node node) { - return node.getNodeType() == Node.ELEMENT_NODE; - } - - private boolean isSimpleTextNode(Node node) { - return node.getChildNodes().getLength() == 1 && isTextNode(node.getFirstChild()); - } - - private boolean isTextNode(Node node) { - return node.getNodeType() == Node.TEXT_NODE; - } - - private void addChildElement(Map<String, Object> childs, Node currentNode, Object content) { - if (childs.containsKey(currentNode.getNodeName())) { - addToExistingChildElement(childs, currentNode, content); - } else { - childs.put(currentNode.getNodeName(), getContentValue(currentNode, content)); - } - } - - @SuppressWarnings({ "unchecked", "rawtypes" }) - private void addToExistingChildElement(Map<String, Object> childs, Node currentNode, Object content) { - var existingChild = childs.get(currentNode.getNodeName()); - if (existingChild instanceof List list) { - list.add(content); - } else { - var list = new ArrayList<Object>(); - list.add(existingChild); - list.add(content); - childs.put(currentNode.getNodeName(), list); - } - } - - Object getContentValue(Node currentNode, Object content) { - if (isFileNode(currentNode)) { - content = createFileContentMap(currentNode, content); - } else if (isJsonNode(currentNode)) { - content = getJsonValue(currentNode, ((String) content).trim()); - } - return content; - } - - private boolean isFileNode(Node currentNode) { - return currentNode.getNodeName().equals(FILE); - } - - private Map<String, Object> createFileContentMap(Node currentNode, Object content) { - var attributes = currentNode.getAttributes(); - - var contentMap = new HashMap<String, Object>(); - contentMap.put("text", content);// TOASK: text oder name? - - for (int i = 0; i < attributes.getLength(); i++) { - var attribute = attributes.item(i); - contentMap.put(attribute.getNodeName(), attribute.getNodeValue()); - } - return contentMap; - } - - private boolean isJsonNode(Node currentNode) { - return isRestResponseName(currentNode); - } - - private boolean isRestResponseName(Node currentNode) { - return currentNode.getNodeName().equals(REST_RESPONSE_NAME); - } - - private Object getJsonValue(Node currentNode, String content) { - try { - return jsonService.readAsListMap(content); - } catch (de.ozgcloud.common.errorhandling.TechnicalException e) { - LOG.error("Error parsing json content from <" + currentNode.getNodeName() + ">.", e); - return Collections.emptyList(); - } - } -} diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/dfoerdermittel/DFoerdermittelEngineBasedSemantikAdapter.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/dfoerdermittel/DFoerdermittelEngineBasedSemantikAdapter.java deleted file mode 100644 index 82d0967071bcfcabad3b9a7803d0e23c77e69a7a..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/dfoerdermittel/DFoerdermittelEngineBasedSemantikAdapter.java +++ /dev/null @@ -1,183 +0,0 @@ -package de.ozgcloud.eingang.semantik.enginebased.dfoerdermittel; - -import java.io.IOException; -import java.io.InputStream; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; -import java.util.function.Predicate; -import java.util.function.UnaryOperator; -import java.util.stream.Stream; - -import org.apache.commons.collections4.MapUtils; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import com.fasterxml.jackson.dataformat.xml.XmlMapper; - -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.common.formdata.FormHeader; -import de.ozgcloud.eingang.common.formdata.IncomingFile; -import de.ozgcloud.eingang.common.formdata.ServiceKonto; -import de.ozgcloud.eingang.common.formdata.ZustaendigeStelle; -import de.ozgcloud.eingang.semantik.common.ServiceKontoFactory; -import de.ozgcloud.eingang.semantik.enginebased.EngineBasedSemantikAdapter; -import lombok.NonNull; -import lombok.extern.log4j.Log4j2; - -@Log4j2 -@Component -public class DFoerdermittelEngineBasedSemantikAdapter implements EngineBasedSemantikAdapter { - - private static final String FACHNACHRICHT_SUFFIX = "Fachnachricht.xml"; - private static final Predicate<IncomingFile> IS_FACHNACHRICHT = inFile -> StringUtils.endsWith(inFile.getName(), FACHNACHRICHT_SUFFIX); - - private static final String KEY_FACHNACHRICHT = "Fachnachricht"; - private static final String KEY_POSTFACH_ID = "InboxReference"; - private static final String KEY_ORGANISATIONS_EINHEIT_ID = "MetaText1"; - private static final String KEY_FORM_NAME = "Title"; - private static final String KEY_FORM_ID = "ProjectTitle"; - - static final String DEFAULT_FORM_NAME = "dFördermittelantrag"; - static final String DEFAULT_FORM_ID = "dFördermittelantrag"; - - @Autowired - private ServiceKontoFactory serviceKontoFactory; - - @Override - public FormData parseFormData(FormData formData) { - return formData.getRepresentations().stream().filter(IS_FACHNACHRICHT).findAny() - .map(inFile -> parseFachnachricht(formData, inFile)) - .map(this::processFachnachricht) - .orElse(formData); - } - - FormData processFachnachricht(FormData formData) { - return pipe( - Stream.of( - this::addFormName, - this::addFormEngineName, - this::addServiceKonto, - this::addOrganisationsEinheitId, - this::addFormId - ) - ).apply(formData); - } - - private UnaryOperator<FormData> pipe(Stream<UnaryOperator<FormData>> functions) { - return (formData) -> functions - .reduce(formData, (acc, f) -> f.apply(acc), (a, b) -> a); - } - - FormData addFormId(FormData formData) { - return mapWithModifiedHeader(formData, headerBuilder -> headerBuilder.formId( - getNonEmptyFachnachrichtValueByKey(formData, KEY_FORM_ID) - .orElse(DEFAULT_FORM_ID) - )); - } - - private Optional<String> getNonEmptyFachnachrichtValueByKey(FormData formData, String key) { - return Optional.ofNullable((String) getFachnachricht(formData).get(key)) - .filter(StringUtils::isNotBlank); - } - - private FormData mapWithModifiedHeader(FormData formData, UnaryOperator<FormHeader.FormHeaderBuilder> headerBuilderOperator) { - return formData.toBuilder() - .header(headerBuilderOperator.apply(formData.getHeader().toBuilder()).build()) - .build(); - } - - FormData addServiceKonto(FormData formData) { - return Optional.ofNullable((String) getFachnachricht(formData).get(KEY_POSTFACH_ID)) - .map(this::extractPrefix) - .map(this::createServiceKonto) - .map(serviceKonto -> mapWithModifiedHeader(formData, headerBuilder -> headerBuilder.serviceKonto(serviceKonto))) - .orElse(formData); - } - - FormData addOrganisationsEinheitId(FormData formData) { - return Optional.ofNullable((String) getFachnachricht(formData).get(KEY_ORGANISATIONS_EINHEIT_ID)) - .map(orgaId -> addOrganisationsEinheitId(orgaId, formData.getZustaendigeStelles())) - .map(zustStelle -> formData.toBuilder() - .zustaendigeStelle(zustStelle) - .build()) - .orElse(formData); - } - - private ZustaendigeStelle addOrganisationsEinheitId(String orgaId, Collection<ZustaendigeStelle> zustaendigeStelles) { - ZustaendigeStelle.ZustaendigeStelleBuilder zustaendigeStelleBuilder; - if (Objects.isNull(zustaendigeStelles) || zustaendigeStelles.isEmpty()) { - zustaendigeStelleBuilder = ZustaendigeStelle.builder(); - } else { - var zustaendigeStellesIterator = zustaendigeStelles.iterator(); - var zustaendigeStelle = zustaendigeStellesIterator.next(); - logErrorForExistingZustaendigeStelle(); - zustaendigeStelleBuilder = zustaendigeStelle.toBuilder(); - } - - return zustaendigeStelleBuilder.organisationseinheitenId(orgaId).build(); - } - - void logErrorForExistingZustaendigeStelle() { - LOG.error( - "Expect no existing ZustaendigeStelle for DFoerdermittel! Continuing with two ZustaendigeStelles, the original(s) and a copy of the first with overridden OrganisationsEinheitId."); - } - - FormData addFormName(FormData formData) { - return mapWithModifiedHeader(formData, headerBuilder -> headerBuilder.formName( - getNonEmptyFachnachrichtValueByKey(formData, KEY_FORM_NAME) - .orElse(DEFAULT_FORM_NAME) - )); - } - - @SuppressWarnings("unchecked") - private Map<String, Object> getFachnachricht(FormData formData) { - return (Map<String, Object>) MapUtils.getMap(formData.getFormData(), KEY_FACHNACHRICHT, Collections.<String, Object>emptyMap()); - } - - FormData addFormEngineName(FormData formData) { - return mapWithModifiedHeader(formData, headerBuilder -> headerBuilder.formEngineName("dFördermittelantrag")); - } - - String extractPrefix(@NonNull String postfachId) { - return postfachId.substring(postfachId.lastIndexOf("/") + 1); - } - - private ServiceKonto createServiceKonto(String postfachId) { - return serviceKontoFactory.buildOsiServiceKonto(postfachId); - } - - FormData parseFachnachricht(FormData formData, IncomingFile fachnachrichtFile) { - var fachnachrichtData = extractFormDataFormXML(fachnachrichtFile.getContentStream()); - - if (MapUtils.isNotEmpty(fachnachrichtData)) { - var editable = new HashMap<>(formData.getFormData()); - editable.put(KEY_FACHNACHRICHT, fachnachrichtData); - return formData.toBuilder().formData(Collections.unmodifiableMap(editable)).build(); - } - - return formData; - } - - @SuppressWarnings("unchecked") - Map<String, Object> extractFormDataFormXML(InputStream xmlFileStream) { - - XmlMapper xmlMapper = new XmlMapper(); - try { - return xmlMapper.readValue(xmlFileStream, Map.class); - } catch (IOException e) { - LOG.error("Error reading xml fachnachricht.", e); - } - return Collections.emptyMap(); - } - - @Override - public boolean isResponsible(FormData formData) { - return formData.getRepresentations().stream().anyMatch(IS_FACHNACHRICHT); - } - -} diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/formcycle/FormCycleEngineBasedAdapter.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/formcycle/FormCycleEngineBasedAdapter.java deleted file mode 100644 index c56f0c00d098e2af63872caaf178f348bc3ca9b5..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/formcycle/FormCycleEngineBasedAdapter.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.semantik.enginebased.formcycle; - -import java.util.List; - -import org.springframework.beans.factory.annotation.Autowired; - -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.semantik.enginebased.EngineBasedSemantikAdapter; - -public class FormCycleEngineBasedAdapter implements EngineBasedSemantikAdapter { - - @Autowired - private List<FormcycleEngineBasedMapper> mappers; - - @Override - public FormData parseFormData(FormData formData) { - var processed = formData; - for (var mapper : mappers) { - processed = mapper.parseFormData(processed); - } - return processed; - } - -} diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/formcycle/FormcycleAntragstellerMapper.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/formcycle/FormcycleAntragstellerMapper.java deleted file mode 100644 index ab351eb8f849b811373de9c7e4f2b95e0d080086..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/formcycle/FormcycleAntragstellerMapper.java +++ /dev/null @@ -1,72 +0,0 @@ -package de.ozgcloud.eingang.semantik.enginebased.formcycle; - -import static org.apache.commons.lang3.StringUtils.*; - -import java.util.Map; -import java.util.Optional; - -import org.apache.commons.collections4.MapUtils; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Component; - -import de.ozgcloud.eingang.common.formdata.Antragsteller; -import de.ozgcloud.eingang.common.formdata.FormData; - -@Component -public class FormcycleAntragstellerMapper implements FormcycleEngineBasedMapper { - - static final String KEY_ANTRAGSTELLER = "fsBKAllDaten"; - static final String KEY_ANREDE = "tfAntragstellerAnrede"; - static final String KEY_VORNAME = "tfAntragstellerVorname"; - static final String KEY_NACHNAME = "tfAntragstellerName"; - static final String KEY_GEBURTSNAME = "tfAntragstellerGeburtsname"; - static final String KEY_GEBURTSDATUM = "tfAntragstellerGeburtsdatum"; - static final String KEY_GEBURTSORT = "tfAntragstellerGeburtsort"; - static final String KEY_EMAIL = "tfAntragstellerEmail"; - static final String KEY_TELEFON = "tfAntragstellerTelefon"; - static final String KEY_ADDRESS = "tfAntragstellerAdresse"; - static final String KEY_PLZ = "tfAntragstellerPLZ"; - static final String KEY_ORT = "tfAntragstellerOrt"; - static final String KEY_FIRMA_NAME = "tfOrgName"; - - @Override - public FormData parseFormData(final FormData formData) { - return getAntragstellerData(formData.getFormData()) - .map(this::buildAntragsteller) - .map(antragsteller -> formData.toBuilder().antragsteller(antragsteller).build()) - .orElse(formData); - } - - @SuppressWarnings("unchecked") - Optional<Map<String, Object>> getAntragstellerData(Map<String, Object> formDataMap) { - var antragstellerData = (Map<String, Object>) MapUtils.getMap(formDataMap, KEY_ANTRAGSTELLER); - return Optional.ofNullable(antragstellerData).map(map -> (Map<String, Object>) map.get("value")); - } - - Antragsteller buildAntragsteller(Map<String, Object> antragstellerData) { - var firmaName = getValue(antragstellerData, KEY_FIRMA_NAME); - var antragstellerBuilder = Antragsteller.builder() - .firmaName(firmaName) - .anrede(getValue(antragstellerData, KEY_ANREDE)) - .vorname(getValue(antragstellerData, KEY_VORNAME)) - .nachname(getValue(antragstellerData, KEY_NACHNAME)) - .email(getValue(antragstellerData, KEY_EMAIL)) - .telefon(getValue(antragstellerData, KEY_TELEFON)) - .strasse(getValue(antragstellerData, KEY_ADDRESS)) - .plz(getValue(antragstellerData, KEY_PLZ)) - .ort(getValue(antragstellerData, KEY_ORT)); - if (isBlank(firmaName)) { - antragstellerBuilder - .geburtsname(getValue(antragstellerData, KEY_GEBURTSNAME)) - .geburtsdatum(getValue(antragstellerData, KEY_GEBURTSDATUM)) - .geburtsort(getValue(antragstellerData, KEY_GEBURTSORT)); - }else { - antragstellerBuilder.firmaName(firmaName); - } - return antragstellerBuilder.build(); - } - - String getValue(Map<String, Object> formDataMap, String key) { - return Optional.ofNullable(MapUtils.getMap(formDataMap, key)).map(map -> map.get("value")).map(String::valueOf).orElse(StringUtils.EMPTY); - } -} diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/formcycle/FormcycleEngineBasedMapper.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/formcycle/FormcycleEngineBasedMapper.java deleted file mode 100644 index 2f1f20a85652afc550b7eaacd677b987c3080f5c..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/formcycle/FormcycleEngineBasedMapper.java +++ /dev/null @@ -1,6 +0,0 @@ -package de.ozgcloud.eingang.semantik.enginebased.formcycle; - -import de.ozgcloud.eingang.semantik.enginebased.EngineBasedMapper; - -interface FormcycleEngineBasedMapper extends EngineBasedMapper { -} diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/formsolutions/FormSolutionsAntragstellerMapper.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/formsolutions/FormSolutionsAntragstellerMapper.java deleted file mode 100644 index d7add2b20e0d8fcbe1e7982a5cad3496dd4db79d..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/formsolutions/FormSolutionsAntragstellerMapper.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.semantik.enginebased.formsolutions; - -import org.springframework.stereotype.Component; - -import de.ozgcloud.eingang.common.formdata.Antragsteller; -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.common.formdata.FormDataUtils; - -@Component -class FormSolutionsAntragstellerMapper implements FormSolutionsEngineBasedMapper { - - public static final String ANTRAGSTELLER_PANEL_IDENTIFIER = "Antragstellende Person"; - - public static final String POSTKORBHANDLE = "postkorbhandle"; - - public static final String VORNAME_KEY = "AS_Vorname"; - public static final String NACHNAME_KEY = "AS_Name"; - - @Override - public FormData parseFormData(FormData formData) { - return FormDataUtils.from(formData) - .builder() - .antragsteller(buildAntragsteller(formData)) - .build(); - } - - protected Antragsteller buildAntragsteller(FormData formData) { - var antragstellerData = IdentifierValueParser.parsePanelsData(formData); - - return Antragsteller.builder() - .postfachId(getPostkorbhandle(formData)) - .vorname(antragstellerData.get(VORNAME_KEY)) - .nachname(antragstellerData.get(NACHNAME_KEY)) - .build(); - } - - private String getPostkorbhandle(FormData formData) { - return (String) formData.getFormData().get(POSTKORBHANDLE); - } -} \ No newline at end of file diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/formsolutions/FormSolutionsEngineBasedAdapter.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/formsolutions/FormSolutionsEngineBasedAdapter.java deleted file mode 100644 index 9c23aeccbe6adb5b5c7957c2d47b8e8c34122d6b..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/formsolutions/FormSolutionsEngineBasedAdapter.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.semantik.enginebased.formsolutions; - -import java.util.List; - -import org.springframework.beans.factory.annotation.Autowired; - -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.common.formdata.FormDataUtils; -import de.ozgcloud.eingang.semantik.enginebased.EngineBasedSemantikAdapter; - -public class FormSolutionsEngineBasedAdapter implements EngineBasedSemantikAdapter { - - public static final String IDENTIFIER_KEY = "identifier"; - - public static final String ASSISTANT = "assistant"; - public static final String ANLIEGEN_ID = "anliegenId"; - public static final String KOMMUNALVERWALTUNG_ID = "kommunalverwaltungId"; - - @Autowired - private List<FormSolutionsEngineBasedMapper> mappers; - - @Override - public FormData parseFormData(FormData formData) { - var processedFormData = formData; - - for (var mapper : mappers) { - processedFormData = mapper.parseFormData(processedFormData); - } - - return removeProcessedData(processedFormData); - } - - protected FormData removeProcessedData(FormData formData) { - return FormDataUtils.from(formData) - .remove(ASSISTANT) - .remove(ANLIEGEN_ID) - .remove(KOMMUNALVERWALTUNG_ID) - .remove(FormSolutionsAntragstellerMapper.POSTKORBHANDLE) - .build(); - } -} diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/formsolutions/FormSolutionsEngineBasedMapper.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/formsolutions/FormSolutionsEngineBasedMapper.java deleted file mode 100644 index e024adb8460187914eb80bca14f8ea61e3e172d9..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/formsolutions/FormSolutionsEngineBasedMapper.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.semantik.enginebased.formsolutions; - -import de.ozgcloud.eingang.semantik.enginebased.EngineBasedMapper; - -interface FormSolutionsEngineBasedMapper extends EngineBasedMapper { -} diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/formsolutions/FormSolutionsFilesMapper.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/formsolutions/FormSolutionsFilesMapper.java deleted file mode 100644 index 6de90deb9ebc890fba588b4f4ea60c983804c300..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/formsolutions/FormSolutionsFilesMapper.java +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.semantik.enginebased.formsolutions; - -import java.util.List; -import java.util.function.Predicate; -import java.util.stream.Stream; - -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Component; - -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.common.formdata.IncomingFile; -import de.ozgcloud.eingang.common.formdata.IncomingFileGroup; -import de.ozgcloud.eingang.semantik.common.ZipAttachmentReader; -import de.ozgcloud.eingang.semantik.enginebased.FilesMapperHelper; -import lombok.RequiredArgsConstructor; -import lombok.extern.log4j.Log4j2; - -@Component -@Log4j2 -class FormSolutionsFilesMapper implements FormSolutionsEngineBasedMapper { - - public static final String FILE_GROUP_ZIP_NAME = "gezippte Anhänge"; - public static final String EXTRAHIERTE_ATTACHMENTS = "Extrahierte Attachments"; - public static final String ZIP_CONTENT_TYPE = "application/zip"; - - @Override - public FormData parseFormData(FormData srcFormData) { - var formDataBuilder = srcFormData.toBuilder().clearAttachments(); - - var attachments = readAttachments(srcFormData); - if (attachments.isEmpty()) { - return formDataBuilder.build(); - } - return formDataBuilder.attachments(attachments).numberOfAttachments(FilesMapperHelper.countAttachedFiles(attachments)).build(); - } - - List<IncomingFileGroup> readAttachments(FormData srcFormData) { - return new ZippedAttachmentsProcessor(srcFormData.getAttachments()).process().toList(); - } - - @RequiredArgsConstructor - class ZippedAttachmentsProcessor { - - private final List<IncomingFileGroup> originalAttachmentsList; - private static final Predicate<IncomingFileGroup> ZIP_FILE_GROUP = fileGroup -> StringUtils.equals(FILE_GROUP_ZIP_NAME, fileGroup.getName()); - - public Stream<IncomingFileGroup> process() { - return Stream.concat(processZipGroups(), nonZipFileGroups()); - } - - private Stream<IncomingFileGroup> processZipGroups() { - var groupBuilder = IncomingFileGroup.builder().name("Anhänge"); - extractAttachments().forEach(groupBuilder::file); - var group = groupBuilder.build(); - - return group.getFiles().isEmpty() ? Stream.empty() : Stream.of(group); - } - - Stream<IncomingFileGroup> nonZipFileGroups() { - return originalAttachmentsList.stream().filter(ZIP_FILE_GROUP.negate()); - } - - Stream<IncomingFile> extractAttachments() { - return originalAttachmentsList.stream() - .filter(ZIP_FILE_GROUP) - .flatMap(fileGroup -> fileGroup.getFiles().stream()) - .flatMap(this::unzip); - } - - Stream<IncomingFile> unzip(IncomingFile zipFile) { - try { - return readFromZip(zipFile); - } catch (RuntimeException e) { - LOG.error("Cannot read source ZIP. Attach it as is.", e); - return Stream.of(zipFile); - } - } - - Stream<IncomingFile> readFromZip(IncomingFile zipFile) { - var reader = buildReader(zipFile); - var readContent = reader.readContent(); - reader.deleteSourceFile(); - return readContent.stream(); - } - - ZipAttachmentReader buildReader(IncomingFile zipFile) { - return ZipAttachmentReader.from(zipFile.getFile(), zipFile.getName()); - } - } -} diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/formsolutions/FormSolutionsHeaderMapper.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/formsolutions/FormSolutionsHeaderMapper.java deleted file mode 100644 index c2b0de118717b7bb54f0af27ef37e123788f3368..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/formsolutions/FormSolutionsHeaderMapper.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.semantik.enginebased.formsolutions; - -import static de.ozgcloud.eingang.semantik.enginebased.formsolutions.FormSolutionsEngineBasedAdapter.*; - -import java.util.Map; -import java.util.Optional; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.common.formdata.FormDataUtils; -import de.ozgcloud.eingang.common.formdata.FormHeader; -import de.ozgcloud.eingang.semantik.common.ServiceKontoFactory; - -@Component -class FormSolutionsHeaderMapper implements FormSolutionsEngineBasedMapper { - - static final int POSTFACH_ADDRESS_DEFAULT = 1; - - static final String TRANSACTION_ID = "transactionId"; - - static final String FORM_ENGINE_NAME = "FormSolutions"; - - public static final String POSTKORBHANDLE = "postkorbhandle"; - - @Autowired - private ServiceKontoFactory serviceKontoFactory; - - @Override - public FormData parseFormData(FormData formData) { - return FormDataUtils.from(formData) - .remove(TRANSACTION_ID) - .builder() - .header(buildFormHeader(formData)) - .build(); - } - - protected FormHeader buildFormHeader(FormData formData) { - var formHeaderBuilder = FormHeader.builder() - .formName(getIdentifier(formData)) - .formId(getIdentifier(formData)) - .requestId(getRequestId(formData)) - .formEngineName(FORM_ENGINE_NAME); - - Optional.ofNullable(getPostkorbhandle(formData)).map(serviceKontoFactory::buildOsiServiceKonto).ifPresent(formHeaderBuilder::serviceKonto); - - return formHeaderBuilder.build(); - } - - private String getIdentifier(FormData formData) { - return (String) getAssistant(formData).get(IDENTIFIER_KEY); - } - - private Map<String, Object> getAssistant(FormData formData) { - return FormDataUtils.getSubMap(formData, ASSISTANT); - } - - private String getRequestId(FormData formData) { - return (String) formData.getFormData().get(TRANSACTION_ID); - } - - private String getPostkorbhandle(FormData formData) { - return (String) formData.getFormData().get(POSTKORBHANDLE); - } -} \ No newline at end of file diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/formsolutions/FormSolutionsPanelMapper.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/formsolutions/FormSolutionsPanelMapper.java deleted file mode 100644 index f8cd7b94f17a278d9cb18aef98941710ef4d9809..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/formsolutions/FormSolutionsPanelMapper.java +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.semantik.enginebased.formsolutions; - -import static de.ozgcloud.eingang.semantik.enginebased.formsolutions.FormSolutionsEngineBasedAdapter.*; -import static java.util.Objects.*; - -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; - -import org.springframework.stereotype.Component; - -import de.ozgcloud.eingang.common.formdata.FormData; - -@Component -class FormSolutionsPanelMapper implements FormSolutionsEngineBasedMapper { - public static final String COMPONENTS = "components"; - public static final String STRING_VALUE = "stringValue"; - public static final String PANELS = "panels"; - - @Override - public FormData parseFormData(FormData formData) { - var resultMap = mapPanels(getPanels(formData)).orElseGet(HashMap::new); - resultMap.putAll(formData.getFormData()); - - return formData.toBuilder().formData(resultMap).build(); - } - - private Optional<Map<String, Object>> mapPanels(List<Map<String, Object>> panels) { - if (panels.isEmpty()) { - return Optional.empty(); - } - var resultMap = new LinkedHashMap<String, Object>(); - for (Map<String, Object> panel : panels) { - var identifier = (String) panel.get(IDENTIFIER_KEY); - if (isNull(identifier)) { - continue; - } - getValue(panel).ifPresent(value -> resultMap.put(identifier, value)); - } - - return Optional.of(resultMap); - } - - private Optional<Object> getValue(Map<String, Object> panel) { - return mapPanels(getComponentList(panel)) - .map(Object.class::cast) - .or(() -> Optional.ofNullable(panel.get(STRING_VALUE))); - } - - @SuppressWarnings("unchecked") - public static List<Map<String, Object>> getPanels(FormData formData) { - if (isNull(formData)) { - return List.of(); - } - return Optional.ofNullable(formData.getFormData()) - .map(formDataMap -> (Map<String, Object>) formDataMap.get(ASSISTANT)) - .map(assistent -> (List<Map<String, Object>>) assistent.get(PANELS)) - .orElse(List.of()); - } - - @SuppressWarnings("unchecked") - public static List<Map<String, Object>> getComponentList(Map<String, Object> panel) { - if (isNull(panel)) { - return List.of(); - } - return Optional.ofNullable(panel.get(COMPONENTS)).map(c -> (List<Map<String, Object>>) c).orElse(List.of()); - } - -} diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/formsolutions/FormSolutionsZustaendigeStelleMapper.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/formsolutions/FormSolutionsZustaendigeStelleMapper.java deleted file mode 100644 index e58650aca3e1168d826bf4286be4b742873e5c5c..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/formsolutions/FormSolutionsZustaendigeStelleMapper.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.semantik.enginebased.formsolutions; - -import java.util.Collections; -import java.util.LinkedHashMap; -import java.util.Map; - -import org.springframework.stereotype.Component; - -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.common.formdata.ZustaendigeStelle; - -@Component -class FormSolutionsZustaendigeStelleMapper implements FormSolutionsEngineBasedMapper { - - public static final String ZUSTAENDIGE_STELLE = "zustaendigeStelle"; - - @Override - public FormData parseFormData(FormData formData) { - return formData.toBuilder() - .zustaendigeStelle(buildZustaendigeStelle(formData)) - .formData(removeProcessedData(formData)) - .build(); - } - - protected ZustaendigeStelle buildZustaendigeStelle(FormData formData) { - return ZustaendigeStelle.builder() - .organisationseinheitenId(getZustaenigeStelle(formData)) - .build(); - } - - private String getZustaenigeStelle(FormData formData) { - return (String) formData.getFormData().get(ZUSTAENDIGE_STELLE); - } - - protected Map<String, Object> removeProcessedData(FormData formData) { - var cleanedData = new LinkedHashMap<>(formData.getFormData()); - cleanedData.remove(ZUSTAENDIGE_STELLE); - - return Collections.unmodifiableMap(cleanedData); - } -} \ No newline at end of file diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/formsolutions/IdentifierValueParser.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/formsolutions/IdentifierValueParser.java deleted file mode 100644 index f6eb5a4c3dae73e3431a30335d635b3b3d99dda2..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/formsolutions/IdentifierValueParser.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.semantik.enginebased.formsolutions; - -import static java.util.Objects.*; - -import java.util.Collections; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - -import de.ozgcloud.eingang.common.formdata.FormData; -import lombok.AccessLevel; -import lombok.NoArgsConstructor; - -@NoArgsConstructor(access = AccessLevel.PRIVATE) -class IdentifierValueParser { - - static Map<String, String> parsePanelsData(FormData formData) { - return new IdentifierValueParser().parsePanels(formData); - } - - private final Map<String, String> resultMap = new LinkedHashMap<>(); - - Map<String, String> parsePanels(FormData formData) { - parse(FormSolutionsPanelMapper.getPanels(formData)); - return Collections.unmodifiableMap(resultMap); - } - - private void parse(List<Map<String, Object>> panels) { - if (isNull(panels)) { - return; - } - for (Map<String, Object> panel : panels) { - parse(FormSolutionsPanelMapper.getComponentList(panel)); - var identifier = (String) panel.get(FormSolutionsEngineBasedAdapter.IDENTIFIER_KEY); - var value = (String) panel.get(FormSolutionsPanelMapper.STRING_VALUE); - if (nonNull(identifier) && nonNull(value)) { - resultMap.put(identifier, value); - } - } - } -} diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/formbased/AnliegenId.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/formbased/AnliegenId.java deleted file mode 100644 index 7ae3363c94933a5ea0f5b1a73ddcdacf5ddc22b7..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/formbased/AnliegenId.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.semantik.formbased; - -import de.ozgcloud.common.datatype.StringBasedValue; - -class AnliegenId extends StringBasedValue { - - private static final long serialVersionUID = 1L; - - AnliegenId(String anliegenId) { - super(anliegenId); - } - - public static AnliegenId from(String anliegenId) { - return new AnliegenId(anliegenId); - } -} \ No newline at end of file diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/formbased/FormBasedMapper.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/formbased/FormBasedMapper.java deleted file mode 100644 index 47e053f919675dbbf0f1ab139117ceb65b210193..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/formbased/FormBasedMapper.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.semantik.formbased; - -import de.ozgcloud.eingang.common.formdata.FormData; - -public interface FormBasedMapper { - - FormData parseFormData(FormData formData); - - boolean isResponsible(FormData formData); -} diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/formbased/FormBasedSemantikAdapter.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/formbased/FormBasedSemantikAdapter.java deleted file mode 100644 index 9f2d644ab509c5cfce07cca94a33c1b8abefa2ed..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/formbased/FormBasedSemantikAdapter.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.semantik.formbased; - -import java.util.Collections; -import java.util.List; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import de.ozgcloud.eingang.common.formdata.FormData; - -@Service -public class FormBasedSemantikAdapter { - - @Autowired(required = false) - private List<FormBasedMapper> mappers = Collections.emptyList(); - - public FormData parseFormData(FormData formData) { - - return new FormDataProcessor().process(formData); - } - - class FormDataProcessor { - private FormData processedFormData; - - FormData process(FormData originalFormData) { - processedFormData = originalFormData; - mappers.stream() - .filter(mapper -> mapper.isResponsible(processedFormData)) - .forEach(this::parseWithMapper); - - return processedFormData; - } - - private void parseWithMapper(FormBasedMapper mapper) { - processedFormData = mapper.parseFormData(processedFormData); - } - - } - -} diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/formbased/mantelantrag/MantelantragZustaendigeStelleMapper.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/formbased/mantelantrag/MantelantragZustaendigeStelleMapper.java deleted file mode 100644 index d7fa85a1d87e3ac6776068e6a5a062a8b96de3d3..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/formbased/mantelantrag/MantelantragZustaendigeStelleMapper.java +++ /dev/null @@ -1,135 +0,0 @@ -package de.ozgcloud.eingang.semantik.formbased.mantelantrag; - -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.Set; -import java.util.function.UnaryOperator; -import java.util.stream.IntStream; - -import jakarta.annotation.PostConstruct; - -import org.apache.commons.collections.MapUtils; -import org.apache.logging.log4j.util.Strings; -import org.springframework.boot.context.properties.bind.Bindable; -import org.springframework.boot.context.properties.bind.Binder; -import org.springframework.core.env.Environment; -import org.springframework.stereotype.Component; - -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.common.formdata.FormHeader; -import de.ozgcloud.eingang.common.formdata.ZustaendigeStelle; -import de.ozgcloud.eingang.semantik.formbased.FormBasedMapper; -import lombok.RequiredArgsConstructor; -import lombok.extern.log4j.Log4j2; - -@Component -@RequiredArgsConstructor -@Log4j2 -public class MantelantragZustaendigeStelleMapper implements FormBasedMapper { - static final String MANTELANTRAG_FORM_ID = "maa_mantelantrag/maa_mantelantrag"; - static final String ZUSTELLUNG_NACHRICHTENBROKER_FIELD = "zustellung_nachrichtenbroker"; - static final String ORGANISATIONSEINHEIT_ID_FIELD = "kontaktsystem_oeid"; - static final String BEZEICHNUNG_FIELD = "OrganisationseinheitenBEZEICHNUNG"; - static final String EMAIL_FIELD = "zust_emailadresse"; - static final String HAUSANSCHRIFT_STRASSE_FIELD = "zust_strasse"; - static final String HAUSANSCHRIFT_PLZ_FIELD = "zust_postleitzahl"; - static final String HAUSANSCHRIFT_ORT_FIELD = "zust_ort"; - static final String TELEFON_FIELD = "telefon"; - - private final Environment environment; - private Set<String> xtaIdentifiers; - - @PostConstruct - void init() { - xtaIdentifiers = new HashSet<>(getIdentifierList()); - } - - List<String> getIdentifierList() { - return Binder.get(environment) - .bind("ozgcloud.xta.identifiers", Bindable.listOf(String.class)) - .orElseGet(Collections::emptyList) - .stream() - .map(String::toLowerCase) - .toList(); - } - - @Override - public boolean isResponsible(FormData formData) { - return Optional.ofNullable(formData.getHeader()) - .map(FormHeader::getFormId) - .map(v -> v.startsWith(MANTELANTRAG_FORM_ID)) - .orElse(false); - } - - @Override - public FormData parseFormData(FormData formData) { - return formData.toBuilder() - .clearZustaendigeStelles() - .zustaendigeStelles(getZustaendigeStelles(formData)) - .build(); - } - - List<ZustaendigeStelle> getZustaendigeStelles(FormData formData) { - var fieldMap = formData.getFormData(); - var matchingSlots = getMatchingSlots(fieldMap); - if (matchingSlots.isEmpty()) { - logErrorForNoMatchingIdentifiers(); - } - return matchingSlots.stream() - .map(slotIndex -> getZustaendigeStelle(fieldMap, slotIndex)) - .toList(); - } - - ZustaendigeStelle getZustaendigeStelle(Map<String, Object> fieldMap, int slotIndex) { - UnaryOperator<String> getValueOrEmpty = field -> getFieldByKeyOrEmpty( - fieldMap, - getNameForSlotIndex(field, slotIndex) - ); - var organisationseinheitId = getValueOrEmpty.apply(ORGANISATIONSEINHEIT_ID_FIELD); - if (organisationseinheitId.isBlank()) { - logWarningForEmptyOrganisationseinheitId(slotIndex); - } - return ZustaendigeStelle.builder() - .organisationseinheitenId(organisationseinheitId) - .bezeichnung(getValueOrEmpty.apply(BEZEICHNUNG_FIELD)) - .email(getValueOrEmpty.apply(EMAIL_FIELD)) - .hausanschriftStrasse(getValueOrEmpty.apply(HAUSANSCHRIFT_STRASSE_FIELD)) - .hausanschriftPlz(getValueOrEmpty.apply(HAUSANSCHRIFT_PLZ_FIELD)) - .hausanschriftOrt(getValueOrEmpty.apply(HAUSANSCHRIFT_ORT_FIELD)) - .telefon(getValueOrEmpty.apply(TELEFON_FIELD)) - .build(); - } - - void logWarningForEmptyOrganisationseinheitId(int slotIndex) { - LOG.warn("[Mantelantrag] OrganisationseinheitId for slot {} is empty!", slotIndex); - } - - void logErrorForNoMatchingIdentifiers() { - LOG.error("[Mantelantrag] No matching Zustaendigestelle found! For identifiers: '{}'.", Strings.join(xtaIdentifiers, ',')); - } - - List<Integer> getMatchingSlots(Map<String, Object> fieldMap) { - return IntStream.range(0, 3) - .filter(slotIndex -> xtaIdentifiers.contains(getXtaIdentifierOfSlot(fieldMap, slotIndex))) - .boxed() - .toList(); - } - - private String getXtaIdentifierOfSlot(Map<String, Object> fieldMap, int slotIndex) { - return getFieldByKeyOrEmpty(fieldMap, getNameForSlotIndex(ZUSTELLUNG_NACHRICHTENBROKER_FIELD, slotIndex)).toLowerCase(); - } - - String getNameForSlotIndex(String name, int slotIndex) { - return slotIndex > 0 ? "%s%d".formatted(name, slotIndex + 1) : name; - } - - private String getFieldByKeyOrEmpty(Map<String, Object> fieldMap, String key) { - return Optional.ofNullable(MapUtils.getString(fieldMap, key)) - .map(String::trim) - .orElse(""); - } - -} diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/SemantikAdapterTest.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/SemantikAdapterTest.java deleted file mode 100644 index ea63f2379a7391af25178495e00d3af611cb04e4..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/SemantikAdapterTest.java +++ /dev/null @@ -1,141 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.semantik; - -import static de.ozgcloud.eingang.common.formdata.FormDataTestFactory.*; -import static org.assertj.core.api.Assertions.*; -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.*; - -import java.util.List; -import java.util.stream.Stream; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Spy; - -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.router.VorgangService; -import de.ozgcloud.eingang.semantik.enginebased.EngineBasedSemantikAdapter; -import de.ozgcloud.eingang.semantik.formbased.FormBasedSemantikAdapter; - -class SemantikAdapterTest { - - @Spy - @InjectMocks - private SemantikAdapter adapter; - - @Mock - private List<EngineBasedSemantikAdapter> engineAdapters; - - @Mock - private EngineBasedSemantikAdapter engineAdapter; - @Mock - private FormBasedSemantikAdapter formAdapter; - @Mock - private VorgangService vorgangService; - - @DisplayName("get responsible engine adapters") - @Nested - class TestGetResponsibleEngineAdapters { - @Mock - private EngineBasedSemantikAdapter unresponsibleEngineAdapter; - @Mock - private FormData formData; - - @BeforeEach - void mock() { - when(unresponsibleEngineAdapter.isResponsible(formData)).thenReturn(false); - when(engineAdapter.isResponsible(formData)).thenReturn(true); - when(engineAdapters.stream()).thenReturn(Stream.of(engineAdapter, unresponsibleEngineAdapter)); - } - - @DisplayName("should return responsible") - @Test - void shouldReturnResponsible() { - var foundAdapters = adapter.getResponsibleEngineAdapters(formData); - - assertThat(foundAdapters).isEqualTo(List.of(engineAdapter)); - } - } - - @Nested - class TestProcessFormData { - - @Mock - private FormData formData; - @Mock - private FormData engineAdapterResponse; - @Mock - private FormData formAdapterResponse; - - @BeforeEach - void mockEngineAdapter() { - doReturn(List.of(engineAdapter)).when(adapter).getResponsibleEngineAdapters(formData); - when(engineAdapter.parseFormData(any())).thenReturn(engineAdapterResponse); - when(formAdapter.parseFormData(any())).thenReturn(formAdapterResponse); - when(vorgangService.createVorgang(any())).thenReturn(VORGANG_ID); - } - - @Test - void shouldCallFindEngineAdapter() { - adapter.processFormData(formData); - - verify(adapter).getResponsibleEngineAdapters(formData); - } - - @Test - void shouldCallEngineAdapter() { - adapter.processFormData(formData); - - verify(engineAdapter).parseFormData(formData); - } - - @Test - void shouldCallFormAdapter() { - adapter.processFormData(formData); - - verify(formAdapter).parseFormData(engineAdapterResponse); - } - - @Test - void shouldCallVorgangRemoteService() { - adapter.processFormData(formData); - - verify(vorgangService).createVorgang(formAdapterResponse); - } - - @DisplayName("should return first vorgang id") - @Test - void shouldReturnFirstVorgangId() { - var vorgangId = adapter.processFormData(formData); - - assertThat(vorgangId).isEqualTo(VORGANG_ID); - } - } -} diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/common/ServiceKontoFactoryTest.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/common/ServiceKontoFactoryTest.java deleted file mode 100644 index 66d9d3e302806e9b4aab54e4bba79627488e92fe..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/common/ServiceKontoFactoryTest.java +++ /dev/null @@ -1,303 +0,0 @@ -package de.ozgcloud.eingang.semantik.common; - -import static org.assertj.core.api.Assertions.*; -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.*; - -import java.util.List; -import java.util.Map; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Spy; - -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.common.formdata.FormDataUtils; -import de.ozgcloud.eingang.common.formdata.PostfachAddressTestFactory; -import de.ozgcloud.eingang.common.formdata.ServiceKonto; -import de.ozgcloud.eingang.common.formdata.ServiceKonto.TrustLevel; -import de.ozgcloud.eingang.common.formdata.ServiceKontoTestFactory; -import de.ozgcloud.eingang.common.formdata.StringBasedIdentifier; -import de.ozgcloud.eingang.common.formdata.ServiceKonto.PostfachAddress; -import de.ozgcloud.eingang.semantik.enginebased.afm.AfmHeaderTestFactory; - -class ServiceKontoFactoryTest { - - @Spy - @InjectMocks - private ServiceKontoFactory factory; - - @DisplayName("OSI service konto") - @Nested - class TestOsiServiceKonto { - - private static final FormData FORM_DATA = FormData.builder().formData(AfmHeaderTestFactory.createFormDataMap()).build(); - - @DisplayName("with configured postfach") - @Nested - class TestWithConfiguredPostfach { - - private static final PostfachAddress POSTFACH_ADDRESS = PostfachAddressTestFactory.create(); - - @BeforeEach - void mockBuildPostfachAddresses() { - doReturn(List.of(POSTFACH_ADDRESS)).when(factory).buildPostfachAddresses(any(), any()); - } - - @Test - void shouldContainsType() { - var serviceKonto = getServiceKonto(FORM_DATA); - - assertThat(serviceKonto.getType()).isEqualTo(ServiceKontoFactory.POSTFACH_TYPE_OSI); - } - - @Test - void shouldContainsPostfachAddresses() { - var serviceKonto = getServiceKonto(FORM_DATA); - - assertThat(serviceKonto.getPostfachAddresses()).hasSize(1); - assertThat(serviceKonto.getPostfachAddresses().get(0)).isEqualTo(POSTFACH_ADDRESS); - } - - @Test - void shouldBuildPostfachAddresses() { - getServiceKonto(FORM_DATA); - - verify(factory).buildPostfachAddresses(any(), any()); - } - } - - private ServiceKonto getServiceKonto(FormData formData) { - return factory.buildOsiServiceKonto(AfmHeaderTestFactory.POSTFACH_NAME_ID, formData); - } - - @DisplayName("postfach addresses") - @Nested - class TestBuildPostfachAddresses { - - @DisplayName("with rest_response_name") - @Nested - class TestWithRestResponseName { - - @Test - void shouldCallBuildAddresses() { - getPostfachAddresses(); - - verify(factory).buildOsiPostfachV1Address(any(), anyInt()); - } - - @Test - void shouldReturnPostfachAddresses() { - var addresses = getPostfachAddresses(); - - assertThat(addresses).hasSize(1); - assertThat(addresses.get(0).getIdentifier()).isInstanceOf(StringBasedIdentifier.class); - assertThat(((StringBasedIdentifier) addresses.get(0).getIdentifier()).getPostfachId()) - .isEqualTo(AfmHeaderTestFactory.POSTFACH_NAME_ID); - assertThat(addresses.get(0).getVersion()).isEqualTo(ServiceKontoFactory.POSTFACH_VERSION); - assertThat(addresses.get(0).getType()).isEqualTo(PostfachAddressTestFactory.POSTFACH_ADDRESS_TYPE); - } - - private List<PostfachAddress> getPostfachAddresses() { - return buildServiceKonto(FORM_DATA).getPostfachAddresses(); - } - } - - @DisplayName("without rest_response_name") - @Nested - class TestWithoutRestResponseName { - - private static final FormData FORM_DATA_WITHOUT_REST_RESPONSE_NAME = FormDataUtils.from(FORM_DATA) - .remove(ServiceKontoFactory.REST_RESPONSE_NAME).build(); - - @Test - void shouldBuildDefault() { - getPostfachAddresses(); - - verify(factory).buildDefault(AfmHeaderTestFactory.POSTFACH_NAME_ID); - } - - @Test - void shouldReturnPostfachAddresses() { - var addresses = getPostfachAddresses(); - - assertThat(addresses).hasSize(1); - - assertThat(addresses.get(0).getIdentifier()).isInstanceOf(StringBasedIdentifier.class); - - assertThat(((StringBasedIdentifier) addresses.get(0).getIdentifier()).getPostfachId()) - .isEqualTo(AfmHeaderTestFactory.POSTFACH_NAME_ID); - assertThat(addresses.get(0).getVersion()).isEqualTo(ServiceKontoFactory.POSTFACH_VERSION); - assertThat(addresses.get(0).getType()).isEqualTo(1); - } - - private List<PostfachAddress> getPostfachAddresses() { - return buildServiceKonto(FORM_DATA_WITHOUT_REST_RESPONSE_NAME).getPostfachAddresses(); - } - } - - private ServiceKonto buildServiceKonto(FormData formData) { - return factory.buildOsiServiceKonto(AfmHeaderTestFactory.POSTFACH_NAME_ID, formData); - } - } - } - - @Nested - class TestCreateBayernIdServicekonto { - - private final Map<String, Object> formDataHeaders = Map.of( - ServiceKontoFactory.KEY_BAYERN_ID_POSTFACH_ID, PostfachAddressTestFactory.POSTFACH_ID, - ServiceKontoFactory.KEY_BAYERN_ID_TRUST_LEVEL, ServiceKontoTestFactory.TRUST_LEVEL - ); - - @DisplayName("should return empty when headers map is null") - @Test - void shouldReturnEmptyWhenNull() { - var serviceKonto = factory.createBayernIdServiceKonto(null); - - assertThat(serviceKonto).isEmpty(); - } - - @DisplayName("should return empty when postfach id is missing") - @Test - void shouldReturnEmptyWhenPostfachIdIsMissing() { - var serviceKonto = factory.createBayernIdServiceKonto(Map.of()); - - assertThat(serviceKonto).isEmpty(); - } - - @Test - void shouldCallIsValidTrustLevel() { - factory.createBayernIdServiceKonto(formDataHeaders); - - verify(factory).isValidTrustLevel(formDataHeaders); - } - - @Test - void shouldCallBuildBayernIdServiceKonto() { - factory.createBayernIdServiceKonto(formDataHeaders); - - verify(factory).buildBayernIdServiceKonto(formDataHeaders); - } - - @Test - void shouldReturnServiceKonto() { - var serviceKonto = ServiceKonto.builder().build(); - doReturn(serviceKonto).when(factory).buildBayernIdServiceKonto(any()); - - var result = factory.createBayernIdServiceKonto(formDataHeaders); - - assertThat(result).contains(serviceKonto); - } - - @DisplayName("should return empty when trust level has unexpected value") - @Test - void shouldReturnEmptyWhenTrustLevelCorrupted() { - doReturn(false).when(factory).isValidTrustLevel(any()); - - var serviceKonto = factory.createBayernIdServiceKonto(formDataHeaders); - - assertThat(serviceKonto).isEmpty(); - } - } - - @Nested - class TestIsValidTrustLevel { - - @Test - void shouldCallExists() { - try (var trustLevelMock = mockStatic(TrustLevel.class)) { - isValidTrustLevel(); - - trustLevelMock.verify(() -> TrustLevel.exists(ServiceKontoTestFactory.TRUST_LEVEL)); - } - } - - @Test - void shouldReturnValue() { - try (var trustLevelMock = mockStatic(TrustLevel.class)) { - trustLevelMock.when(() -> TrustLevel.exists(any())).thenReturn(true); - - var result = isValidTrustLevel(); - - assertThat(result).isTrue(); - } - } - - private boolean isValidTrustLevel() { - return factory.isValidTrustLevel(Map.of(ServiceKontoFactory.KEY_BAYERN_ID_TRUST_LEVEL, ServiceKontoTestFactory.TRUST_LEVEL)); - } - } - - @Nested - class TestBuildBayernIdServiceKonto { - - private static final String POSTFACH_ID = "postfach-id"; - private static final PostfachAddress POSTFACH_ADDRESS = PostfachAddressTestFactory.create(); - private static final String TRUST_LEVEL = "STORK-QAA-Level-2"; - - private final Map<String, Object> formDataHeaders = Map.of( - ServiceKontoFactory.KEY_BAYERN_ID_POSTFACH_ID, POSTFACH_ID, - ServiceKontoFactory.KEY_BAYERN_ID_TRUST_LEVEL, TRUST_LEVEL); - - @Test - void shouldSetType() { - var serviceKonto = buildBayernIdServiceKonto(); - - assertThat(serviceKonto.getType()).isEqualTo(ServiceKontoFactory.POSTFACH_TYPE_BAYERN_ID); - } - - @Test - void shouldCallBuildPostfachAddress() { - buildBayernIdServiceKonto(); - - verify(factory).buildPostfachAddress(POSTFACH_ID); - } - - @Test - void shouldSetPostfachAddress() { - doReturn(POSTFACH_ADDRESS).when(factory).buildPostfachAddress(any()); - - var serviceKonto = buildBayernIdServiceKonto(); - - assertThat(serviceKonto.getPostfachAddresses()).containsOnly(POSTFACH_ADDRESS); - } - - @Test - void shouldCallGetTrustLevel() { - buildBayernIdServiceKonto(); - - verify(factory).getTrustLevel(formDataHeaders); - } - - @Test - void shouldSetTrustLevel() { - var serviceKonto = buildBayernIdServiceKonto(); - - assertThat(serviceKonto.getTrustLevel()).isEqualTo(TRUST_LEVEL); - } - - private ServiceKonto buildBayernIdServiceKonto() { - return factory.buildBayernIdServiceKonto(formDataHeaders); - } - } - - @Nested - class TestGetTrustLevel { - - private final Map<String, Object> formDataHeaders = Map.of(ServiceKontoFactory.KEY_BAYERN_ID_TRUST_LEVEL, - ServiceKontoTestFactory.TRUST_LEVEL); - - @Test - void shouldReturnTrustLevel() { - var trustLevel = factory.getTrustLevel(formDataHeaders); - - assertThat(trustLevel).isEqualTo(ServiceKontoTestFactory.TRUST_LEVEL); - } - - } - -} \ No newline at end of file diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/common/ZipAttachmentReaderTest.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/common/ZipAttachmentReaderTest.java deleted file mode 100644 index 3f36987c5cfe0ff4b4bb6777c7d4a595c7c43dc4..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/common/ZipAttachmentReaderTest.java +++ /dev/null @@ -1,320 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.semantik.common; - -import static org.assertj.core.api.Assertions.*; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.Mockito.*; - -import java.io.ByteArrayInputStream; -import java.io.File; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.List; -import java.util.function.Predicate; -import java.util.zip.ZipException; -import java.util.zip.ZipInputStream; - -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.tuple.Pair; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.mockito.Spy; -import org.springframework.util.MimeTypeUtils; - -import de.ozgcloud.common.test.TestUtils; -import de.ozgcloud.eingang.common.formdata.IncomingFile; -import lombok.SneakyThrows; - -class ZipAttachmentReaderTest { - private static final String TMP_DIRECTORY_PATH = System.getProperty("java.io.tmpdir"); - private static final String ZIP_1_FILE_NAME = "attachment-1file.zip"; - private static final String ZIP_ENCRYPTED = "attachment-encrypted.zip"; - - @Spy - private ZipAttachmentReader reader; - - @Nested - class TestReadZipAttachment { - - @Test - @SneakyThrows - @DisplayName("should save original zip to file system") - void shouldSaveOriginalZip() { - cleanupTempFiles(); - - createZipAttachment(ZIP_1_FILE_NAME); - - verifySourceFileSavedInTmpDirectory(); - } - - @SneakyThrows - private void verifySourceFileSavedInTmpDirectory() { - List<Path> foundFiles = Files.find(Path.of(getTmpDirectoryPath()), 1, - ((path, basicFileAttributes) -> path.getFileName().toString().startsWith(ZipAttachmentReader.SOURCE_ZIP_PREFIX))) - .toList(); - assertThat(foundFiles).hasSize(1).first(); - } - - @Test - @DisplayName("should return readable input stream for source zip file") - void shouldReturnSourceStream() { - var expectedContent = TestUtils.loadFile(ZIP_1_FILE_NAME); - - var sourceZipAsStream = createZipAttachment(ZIP_1_FILE_NAME).getSourceZipAsStream(); - - assertThat(sourceZipAsStream).hasSameContentAs(expectedContent); - } - - @Test - @DisplayName("should throw exception when reading encrypted ZIP") - void shouldFailSilentByEncryptedZip() { - var zipAttachment = createZipAttachment(ZIP_ENCRYPTED); - - assertThrows(ReadZipException.class, zipAttachment::readContent); - } - - private static ZipAttachmentReader createZipAttachment(String fileName) { - return ZipAttachmentReader.from(TestUtils.loadFile(fileName), fileName); - } - } - - @Nested - class TestReadZip { - - private static final String ZIP_2_FILE_NAME = "attachment-2files.zip"; - private static final String content_file_0_name = "zip-file-0.txt"; - private static final long content_file_0_size = getFileSize("zip-file-0.txt"); - private static final String content_file_1_name = "zip-file-1.txt"; - private static final long content_file_1_size = getFileSize("zip-file-1.txt"); - - private static Pair<String, Long> createContentPair(String fileName) { - var size = switch (fileName) { - case content_file_0_name -> content_file_0_size; - case content_file_1_name -> content_file_1_size; - default -> getFileSize(fileName); - }; - return Pair.of(fileName, size); - } - - @Test - @SneakyThrows - void shouldReadAllZipEntries() { - var zipContent = new ZipAttachmentReader().readContent(loadZip(ZIP_2_FILE_NAME)).stream() - .map(e -> Pair.of(e.getName(), e.getSize())).toList(); - - assertThat(zipContent).containsExactlyInAnyOrder(createContentPair(content_file_0_name), createContentPair(content_file_1_name)); - } - - @Test - @SneakyThrows - void shouldReadZipContent() { - var attachmentContentList = new ZipAttachmentReader().readContent(loadZip(ZIP_1_FILE_NAME)); - - assertThat(attachmentContentList).hasSize(1); - var contentEntry = attachmentContentList.get(0); - assertThat(contentEntry.getName()).isEqualTo(content_file_0_name); - assertThat(contentEntry.getSize()).isEqualTo(content_file_0_size); - assertThat(contentEntry.getContentStream()).hasSameContentAs(TestUtils.loadFile(content_file_0_name)); - } - - @Test - @SneakyThrows - void shouldSkipFolders() { - cleanupTempFiles(); - - var zipContent = new ZipAttachmentReader().readContent(loadZip("attachment-empty.zip")); - - assertThat(zipContent).isEmpty(); - assertTrue(noFilesWithSuffixInTempDirectory()); - } - - @Test - @DisplayName("should delete all temporary files after last reading of inputstream") - @SneakyThrows - void shouldDeleteContentFilesOnFinalRead() { - cleanupTempFiles(); - var contentEntries = new ZipAttachmentReader().readContent(loadZip(ZIP_2_FILE_NAME)); - - contentEntries.forEach(this::closeInputStreamFinalRead); - - assertTrue(noFilesWithSuffixInTempDirectory()); - } - - @SneakyThrows - private void closeInputStreamFinalRead(IncomingFile entry) { - entry.getContentStreamForFinalRead().close(); - } - - @Test - @DisplayName("should return readable input stream for source zip if cannot extract content") - void shouldReturnSourceStreamByError() { - var attachmentContent = new byte[] { 0, 1, 2, 3 }; - var attachment = ZipAttachmentReader.from(new ByteArrayInputStream(attachmentContent), "invalid"); - - assertThrows(ReadZipException.class, attachment::readContent); - - assertThat(attachment.getSourceZipAsStream()).hasSameContentAs(new ByteArrayInputStream(attachmentContent)); - } - - @Test - @DisplayName("should throw exception if ZIP is invalid.") - void shouldFailSilentByError() { - var invalidZip = new ByteArrayInputStream(new byte[] { 0, 1, 2, 3 }); - - var zipAttachment = ZipAttachmentReader.from(invalidZip, "invalid"); - - assertThrows(ReadZipException.class, zipAttachment::readContent); - } - - @Test - @SneakyThrows - void shouldFailByEncryptedZip() { - Assertions.assertThrows(ZipException.class, () -> new ZipAttachmentReader().readContent(loadZip(ZIP_ENCRYPTED))); - } - - } - - @SneakyThrows - private static ZipInputStream loadZip(String name) { - return new ZipInputStream(TestUtils.loadFile(name)); - } - - @Nested - class TestZipBombs { - - private static final String ZIP_BOMB_WITH_BIG_NULL_FILE_CONTENT = "zipbombs/filewithnulls.dat.zip"; - private static final String ZIP_BOMB_WITH_MANY_FILES = "zipbombs/filewithmanyfiles.dat.zip"; - - @Test - void shouldFailOnExtremCompressionRatio() { - var zip = loadZip(ZIP_BOMB_WITH_BIG_NULL_FILE_CONTENT); - - ReadZipException exception = assertThrows(ReadZipException.class, () -> reader.readContent(zip)); - - assertThat(exception.getMessage()).contains("Ratio between compressed and uncompressed data is highly suspicious"); - } - - @Test - @SneakyThrows - void shouldFailOnTotalExtractedSize() { - var zip = loadZip(ZIP_1_FILE_NAME); - reader.readContent(zip); - - verify(reader).checkTotalExtractedSize(157); - } - - @Test - void shouldFailOnTotalZipEntries() { - var zip = loadZip(ZIP_BOMB_WITH_MANY_FILES); - - ReadZipException exception = assertThrows(ReadZipException.class, () -> reader.readContent(zip)); - - assertThat(exception.getMessage()).contains("Total entries in zip file exceeded"); - } - } - - @Nested - class TestSaveFiles { - - @Test - @SneakyThrows - @DisplayName("should save file in temporary folder") - void shouldSaveFile() { - var systemTmpPathWithoutLastSlash = getTmpDirectoryPath(); - - var resultFile = reader.createLocalTempFile(); - - assertThat(resultFile).hasParent(systemTmpPathWithoutLastSlash); - } - - @Test - @SneakyThrows - @DisplayName("should save file with specific prefix and suffix") - void shouldSaveFileByName() { - var resultFileName = new ZipAttachmentReader() - .createLocalTempFile().getName(); - - assertThat(resultFileName) - .startsWith(ZipAttachmentReader.TARGET_ATTACHMENT_PREFIX) - .endsWith(ZipAttachmentReader.TMP_FILE_SUFFIX); - } - } - - @Nested - class TestContentType { - - @Test - void shouldReturnDefaultWhenNullString() { - assertThrows(NullPointerException.class, () -> reader.getContentType(null)); - } - - @Test - void shouldReturnDefaultWhenEmptyString() { - var contentType = new ZipAttachmentReader().getContentType(StringUtils.EMPTY); - - assertThat(contentType).isEqualTo(MimeTypeUtils.APPLICATION_OCTET_STREAM_VALUE); - } - - @Test - void shouldReturnDefaultWhenSpaceString() { - var contentType = new ZipAttachmentReader().getContentType(StringUtils.SPACE); - - assertThat(contentType).isEqualTo(MimeTypeUtils.APPLICATION_OCTET_STREAM_VALUE); - } - - @Test - void shouldGetContentType() { - var fileNames = List.of("1.xml", "2.txt"); - - var contentTypes = fileNames.stream().map(new ZipAttachmentReader()::getContentType).toList(); - - assertThat(contentTypes).containsExactlyInAnyOrder(MimeTypeUtils.APPLICATION_XML_VALUE, MimeTypeUtils.TEXT_PLAIN_VALUE); - } - } - - private static final Predicate<Path> hasNameSuffix = p -> p.getFileName().toString().endsWith(ZipAttachmentReader.TMP_FILE_SUFFIX); - - @SneakyThrows - private static void cleanupTempFiles() { - Files.walk(Path.of(TMP_DIRECTORY_PATH), 1).filter(hasNameSuffix).map(Path::toFile).forEach(File::delete); - } - - @SneakyThrows - private static boolean noFilesWithSuffixInTempDirectory() { - return Files.walk(Path.of(TMP_DIRECTORY_PATH), 1).noneMatch(hasNameSuffix); - } - - @SneakyThrows - private static long getFileSize(String fileName) { - Path filePath = Path.of(ZipAttachmentReaderTest.class.getClassLoader().getResource(fileName).toURI()); - return Files.size(filePath); - } - - private static String getTmpDirectoryPath() { - return TMP_DIRECTORY_PATH.endsWith("/") ? TMP_DIRECTORY_PATH.substring(0, TMP_DIRECTORY_PATH.length() - 1) : TMP_DIRECTORY_PATH; - } -} diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/FilesMapperHelperTest.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/FilesMapperHelperTest.java deleted file mode 100644 index 0375100ea49c6ac7f0c68bdff8a41d8d988bd3ad..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/FilesMapperHelperTest.java +++ /dev/null @@ -1,183 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.semantik.enginebased; - -import static de.ozgcloud.eingang.common.formdata.FormDataTestFactory.*; -import static org.assertj.core.api.Assertions.*; - -import java.util.List; -import java.util.Map; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; - -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.common.formdata.FormDataTestFactory; -import de.ozgcloud.eingang.common.formdata.IncomingFileGroup; -import de.ozgcloud.eingang.common.formdata.IncomingFileGroupTestFactory; -import de.ozgcloud.eingang.common.formdata.IncomingFileTestFactory; - -class FilesMapperHelperTest { - - @Nested - class TestExtractData { - - @Test - void shouldReturnMappedFiles() { - Map<String, String> expectedResult = Map.of(SIMPLE_VALUE_KEY, SIMPLE_VALUE); - var mappedFilesMap = Map.of(FilesMapperHelper.FIELD_NAME_MAPPED_FILES, (Object) expectedResult); - - var extractedMappedFiles = FilesMapperHelper.getMappedFiles(FormDataTestFactory.withFormDataMaps(mappedFilesMap)); - - assertThat(extractedMappedFiles.get()).isEqualTo(expectedResult); - } - - @Test - void shouldHandleMissingFiles() { - var extractedMappedFiles = FilesMapperHelper.getMappedFiles(FormDataTestFactory.withFormDataMaps(Map.of(SIMPLE_VALUE_KEY, SIMPLE_VALUE))); - - assertThat(extractedMappedFiles).isEmpty(); - } - - @Test - void shouldReturnAttachedFileGroups() { - var incomingFileGroups = List.of(IncomingFileGroupTestFactory.create()); - Map<String, Object> mappedFilesMap = Map.of(FilesMapperHelper.FIELD_NAME_MAPPED_FILES, - Map.of(FilesMapperHelper.ATTACHMENTS, incomingFileGroups)); - - var extractedAttachments = FilesMapperHelper.getAttachedFileGroups(FormDataTestFactory.withFormDataMaps(mappedFilesMap)); - - assertThat(extractedAttachments.get()).isEqualTo(incomingFileGroups); - } - - @Nested - class getAttachedFiledGroups { - @Test - void shouldHandleMissingFileGroups() { - Map<String, Object> mappedFilesMap = Map.of(FilesMapperHelper.FIELD_NAME_MAPPED_FILES, Map.of(SIMPLE_VALUE_KEY, SIMPLE_VALUE)); - - var extractedFileGroups = FilesMapperHelper.getAttachedFileGroups(FormDataTestFactory.withFormDataMaps(mappedFilesMap)); - - assertThat(extractedFileGroups).isEmpty(); - } - } - - @Test - void souldReturnRepresentations() { - var incomingFileGroups = List.of(IncomingFileTestFactory.create()); - Map<String, Object> mappedFilesMap = Map.of(FilesMapperHelper.FIELD_NAME_MAPPED_FILES, - Map.of(FilesMapperHelper.REPRESENTATIONS, incomingFileGroups)); - - var extractedRepresentations = FilesMapperHelper.getRepresentations(FormDataTestFactory.withFormDataMaps(mappedFilesMap)); - - assertThat(extractedRepresentations.get()).isEqualTo(incomingFileGroups); - } - - @Test - void shouldHandleMissingFileRepresentations() { - Map<String, Object> mappedFilesMap = Map.of(FilesMapperHelper.FIELD_NAME_MAPPED_FILES, Map.of(SIMPLE_VALUE_KEY, SIMPLE_VALUE)); - - var extractedRepresentations = FilesMapperHelper.getRepresentations(FormDataTestFactory.withFormDataMaps(mappedFilesMap)); - - assertThat(extractedRepresentations).isEmpty(); - } - } - - @Nested - class TestAttachmentCount { - - @Test - void shouldCountEmptyList() { - var counter = FilesMapperHelper.countAttachedFiles(List.of()); - - assertThat(counter).isZero(); - } - - @Test - void shouldCountNoAttachedFiles() { - var counter = FilesMapperHelper.countAttachedFiles(List.of(IncomingFileGroupTestFactory.createBuilder().clearFiles().build())); - - assertThat(counter).isZero(); - } - - @Test - void shouldCountOneAttachment() { - var fileGroup = List.of(IncomingFileGroupTestFactory.createBuilder().file(IncomingFileTestFactory.create()).build()); - - var counter = FilesMapperHelper.countAttachedFiles(fileGroup); - - assertThat(counter).isEqualTo(2); - } - - @Test - void shouldCountAllAttachments() { - var counter = FilesMapperHelper.countAttachedFiles(createFileGroupsWith4Files()); - - assertThat(counter).isEqualTo(4); - } - - private static List<IncomingFileGroup> createFileGroupsWith4Files() { - return List.of(IncomingFileGroupTestFactory.createBuilder() - .clearFiles() - .files(List.of(IncomingFileTestFactory.create(), IncomingFileTestFactory.create(), IncomingFileTestFactory.create())).build(), - IncomingFileGroupTestFactory.create()); - - } - } - - @Nested - class TestRemoveProcessedData { - - @Test - @DisplayName("should remove processed mapped files from raw form data") - void shouldRemoveProcessedDataOnly() { - var rawFormData = Map.of(SIMPLE_VALUE_KEY, SIMPLE_VALUE, FilesMapperHelper.FIELD_NAME_MAPPED_FILES, new Object()); - - var cleanedFormData = FilesMapperHelper.removeProcessedData(withFormDataMaps(rawFormData)).getFormData(); - - assertThat(cleanedFormData) - .doesNotContainKey(FilesMapperHelper.FIELD_NAME_MAPPED_FILES) - .containsEntry(SIMPLE_VALUE_KEY, SIMPLE_VALUE); - } - - @Test - @DisplayName("should not change any other data") - void shouldNotChangeOtherFields() { - FormData formData = create(); - - var cleanedFormData = FilesMapperHelper.removeProcessedData(formData); - - assertThat(cleanedFormData.getId()).isEqualTo(formData.getId()); - assertThat(cleanedFormData.getHeader()).isEqualTo(formData.getHeader()); - assertThat(cleanedFormData.getZustaendigeStelles()).isEqualTo(formData.getZustaendigeStelles()); - assertThat(cleanedFormData.getAntragsteller()).isEqualTo(formData.getAntragsteller()); - assertThat(cleanedFormData.getNumberOfAttachments()).isEqualTo(formData.getNumberOfAttachments()); - assertThat(cleanedFormData.getAttachments()).isEqualTo(formData.getAttachments()); - assertThat(cleanedFormData.getNumberOfRepresentations()).isEqualTo(formData.getNumberOfRepresentations()); - assertThat(cleanedFormData.getRepresentations()).isEqualTo(formData.getRepresentations()); - assertThat(cleanedFormData.getFormData()).containsAllEntriesOf(formData.getFormData()); - } - } -} \ No newline at end of file diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/a12/A12FormDataMapperTest.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/a12/A12FormDataMapperTest.java deleted file mode 100644 index aa4ee4fda33b39b15dfac04de58939b1dfcc18d1..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/a12/A12FormDataMapperTest.java +++ /dev/null @@ -1,93 +0,0 @@ -package de.ozgcloud.eingang.semantik.enginebased.a12; - -import static org.assertj.core.api.Assertions.*; -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.*; - -import java.util.Optional; - -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Spy; - -import com.fasterxml.jackson.databind.ObjectMapper; - -import de.ozgcloud.common.binaryfile.TempFileUtils; -import de.ozgcloud.common.test.TestUtils; -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.common.formdata.FormData.FormDataControl; -import de.ozgcloud.eingang.common.formdata.FormData.Representations; -import de.ozgcloud.eingang.common.formdata.FormDataTestFactory; -import de.ozgcloud.eingang.common.formdata.IncomingFile; -import de.ozgcloud.eingang.common.formdata.IncomingFileTestFactory; - -class A12FormDataMapperTest { - - @Spy - @InjectMocks - private A12FormDataMapper mapper; - - @Spy - private ObjectMapper objectMapper = new ObjectMapper(); - - @Nested - class TestParseFormData { - - @Test - void shouldGetFormDataFile() { - var formData = buildInputFormData(); - - mapper.parseFormData(formData); - - verify(mapper).getFormDataFile(same(formData)); - } - } - - @Nested - class TestGetFormDataFile { - @Test - void shouldReturnFile() { - var inFile = mapper.getFormDataFile(buildInputFormData()); - - assertThat(inFile).get().usingRecursiveComparison().ignoringFields("file").isEqualTo(buildFormDataInFile()); - } - - @Test - void shouldCheckIfFound() { - mapper.getFormDataFile(FormDataTestFactory.create()); - - verify(mapper).logWarnIfEmpty(Optional.empty()); - } - } - - private FormData buildInputFormData() { - return FormDataTestFactory.createBuilder() - .control(FormDataControl.builder() - .representations(Optional.of(Representations.builder().primaryFormDataRepresentation("A12FormData.json").build())).build()) - .representation(buildFormDataInFile()) - .build(); - } - - private IncomingFile buildFormDataInFile() { - return IncomingFileTestFactory.createBuilder() - .contentType("application/json") - .name("A12FormData.json") - .file(TempFileUtils.writeTmpFile(TestUtils.loadFile("A12/a12FormData.json"))) - .build(); - } - - @Nested - class TestReadEingang { - - @Test - void shouldReadJson() { - var file = TempFileUtils.writeTmpFile(TestUtils.loadFile("A12/a12FormData.json")); - - var result = mapper.readEingang(file); - - assertThat(result).isNotNull(); - } - } - -} diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmAntragstellerHeaderMapperTest.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmAntragstellerHeaderMapperTest.java deleted file mode 100644 index c5c99d30268b7e40f00ef05af208d0a346052bd0..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmAntragstellerHeaderMapperTest.java +++ /dev/null @@ -1,243 +0,0 @@ -package de.ozgcloud.eingang.semantik.enginebased.afm; - -import static org.assertj.core.api.Assertions.*; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.*; - -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; - -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.NullAndEmptySource; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Spy; - -import de.ozgcloud.eingang.common.errorhandling.TechnicalException; -import de.ozgcloud.eingang.common.formdata.AntragstellerTestFactory; -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.semantik.common.ServiceKontoFactory; - -class AfmAntragstellerHeaderMapperTest { - - @Spy - @InjectMocks - private AfmAntragstellerHeaderMapper mapper; - - @Nested - class TestParseAntragstellerData { - - @Test - void shouldCallGetHeaders() { - var formData = FormData.builder().build(); - doReturn(Collections.emptyMap()).when(mapper).getHeaders(any()); - - mapper.parseAntragstellerData(formData); - - verify(mapper).getHeaders(formData); - } - - @Test - void shouldCallBuildAntragsteller() { - var headerMap = AfmHeaderTestFactory.createCustomHeaderMap(); - doReturn(headerMap).when(mapper).getHeaders(any()); - - mapper.parseAntragstellerData(FormData.builder().build()); - - verify(mapper).buildAntragsteller(headerMap); - } - - @Test - void shouldSetAntragsteller() { - var antragsteller = AntragstellerTestFactory.create(); - doReturn(antragsteller).when(mapper).buildAntragsteller(any()); - - var result = mapper.parseAntragstellerData(FormData.builder().build()); - - assertThat(result.getAntragsteller()).isEqualTo(antragsteller); - } - - @Nested - class TestBuildAntragsteller { - - private Map<String, Object> headers = AfmHeaderTestFactory.createCustomHeaderMap(); - @Test - void shouldSetPostfachId() { - var result = mapper.buildAntragsteller(headers); - - assertThat(result.getPostfachId()).isEqualTo(AfmHeaderTestFactory.CUSTOM_POSTFACH_ID); - } - - @Test - void shouldSetVorname() { - var result = mapper.buildAntragsteller(headers); - - assertThat(result.getVorname()).isEqualTo(AfmHeaderTestFactory.CUSTOM_VORNAME); - } - - @Test - void shouldSetNachname() { - var result = mapper.buildAntragsteller(headers); - - assertThat(result.getNachname()).isEqualTo(AfmHeaderTestFactory.CUSTOM_NACHNAME); - } - - @Test - void shouldSetGeburtsname() { - var result = mapper.buildAntragsteller(headers); - - assertThat(result.getGeburtsname()).isEqualTo(AfmHeaderTestFactory.CUSTOM_GEBURTSNAME); - } - - @Test - void shouldSetGeburtsort() { - var result = mapper.buildAntragsteller(headers); - - assertThat(result.getGeburtsort()).isEqualTo(AfmHeaderTestFactory.CUSTOM_GEBURTSORT); - } - - @Test - void shoudlSetEmail() { - var result = mapper.buildAntragsteller(headers); - - assertThat(result.getEmail()).isEqualTo(AfmHeaderTestFactory.CUSTOM_EMAIL); - } - - @Test - void shouldSetTelefon() { - var result = mapper.buildAntragsteller(headers); - - assertThat(result.getTelefon()).isEqualTo(AfmHeaderTestFactory.CUSTOM_TELEFON); - } - - @Test - void shouldSetStrasse() { - var result = mapper.buildAntragsteller(headers); - - assertThat(result.getStrasse()).isEqualTo(AfmHeaderTestFactory.CUSTOM_STRASSE); - } - - @Test - void shouldSetPlz() { - var result = mapper.buildAntragsteller(headers); - - assertThat(result.getPlz()).isEqualTo(AfmHeaderTestFactory.CUSTOM_PLZ); - } - - @Test - void shouldSetOrt() { - var result = mapper.buildAntragsteller(headers); - - assertThat(result.getOrt()).isEqualTo(AfmHeaderTestFactory.CUSTOM_ORT); - } - } - } - - @Nested - class TestIsResponsible { - - @Mock - private FormData formData; - - @Test - void shouldApproveResponsibility() { - doReturn(true).when(mapper).isPostfachIdNotBlank(any()); - doReturn(createHeaders(ServiceKontoFactory.KEY_BAYERN_ID_POSTFACH_ID, "123")).when(mapper).getHeaders(any()); - - var isResponsible = mapper.isResponsible(formData); - - assertTrue(isResponsible); - } - - @Nested - class TestDenyResponsibility { - - @Test - void shouldDenyWhenNoHeader() { - doReturn(Collections.emptyMap()).when(mapper).getHeaders(any()); - - var isResponsible = mapper.isResponsible(FormData.builder().build()); - - assertFalse(isResponsible); - } - - @Test - void shouldDenyWhenNoPostfachId() { - doReturn(createHeaders(AfmAntragstellerHeaderMapper.KEY_VORNAME, "name")).when(mapper).getHeaders(any()); - - var isResponsible = mapper.isResponsible(formData); - - assertFalse(isResponsible); - } - - @Test - void shouldDenyWhenPostfachIdIsBlank() { - doReturn(createHeaders(ServiceKontoFactory.KEY_BAYERN_ID_POSTFACH_ID, null)).when(mapper).getHeaders(any()); - doReturn(false).when(mapper).isPostfachIdNotBlank(any()); - - var isResponsible = mapper.isResponsible(formData); - - assertFalse(isResponsible); - } - - @Nested - class TestIsPostfachIdNotBlank { - - @ParameterizedTest - @NullAndEmptySource - void shouldReturnFalseWhenPostfachIdIsBlank(String postfachId) { - var isNotBlank = mapper.isPostfachIdNotBlank(postfachId); - - assertFalse(isNotBlank); - } - - @Test - void shouldApprove() { - var isNotBlank = mapper.isPostfachIdNotBlank("123"); - - assertTrue(isNotBlank); - } - - @Test - void shouldFailOnUnexpectedType() { - var postfachId = new Object(); - - assertThrows(TechnicalException.class, () -> mapper.isPostfachIdNotBlank(postfachId)); - } - } - } - } - - @Nested - class TestGetHeaders { - - @Test - void shouldReturnHeaders() { - var headers = createHeaders(ServiceKontoFactory.KEY_BAYERN_ID_POSTFACH_ID, "123"); - var formData = FormData.builder().formData(createHeaders(AfmHeaderMapper.HEADER_FIELD, headers)).build(); - - var result = mapper.getHeaders(formData); - - assertThat(result).isEqualTo(headers); - } - - @Test - void shouldReturnEmptyMapWhenNoHeaders() { - var formData = FormData.builder().build(); - - var result = mapper.getHeaders(formData); - - assertThat(result).isEmpty(); - } - } - - private Map<String, Object> createHeaders(String key, Object value) { - var map = new HashMap<String, Object>(); - map.put(key, value); - return map; - } -} \ No newline at end of file diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmAntragstellerMapperTest.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmAntragstellerMapperTest.java deleted file mode 100644 index f68df9df3da7a3905ef9a4dc0fdd9a96c112c890..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmAntragstellerMapperTest.java +++ /dev/null @@ -1,240 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.semantik.enginebased.afm; - -import static org.assertj.core.api.Assertions.*; -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.*; - -import java.util.HashMap; -import java.util.UUID; - -import org.assertj.core.data.MapEntry; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; - -import de.ozgcloud.eingang.common.formdata.Antragsteller; -import de.ozgcloud.eingang.common.formdata.FormData; - -class AfmAntragstellerMapperTest { - - @InjectMocks - private AfmAntragstellerMapper mapper; - - @Mock - private AfmAntragstellerHeaderMapper antragstellerHeaderMapper; - - private FormData formData = FormData.builder().formData(AfmAntragstellerTestFactory.createFormDataMap()).build(); - - @DisplayName("Parse form data") - @Nested - class TestParseFormData { - - @Test - void shouldCallHeaderMapper() { - FormData expectedFormData = mock(FormData.class); - when(antragstellerHeaderMapper.isResponsible(any())).thenReturn(true); - when(antragstellerHeaderMapper.parseAntragstellerData(any())).thenReturn(expectedFormData); - - var processedFormData = parseFormData(formData); - - assertThat(processedFormData).isEqualTo(expectedFormData); - } - - @Test - void shouldDoNothingOnNullAntragstaller() { - var formData = FormData.builder().formData(new HashMap<>()).build(); - - var parsedFormData = parseFormData(formData); - - assertThat(parsedFormData).usingRecursiveComparison().ignoringFields(AfmAntragstellerMapper.ANTRAGSTELLER).isEqualTo(formData); - } - - @Test - void shouldMapAntragsteller() { - var parsedFormData = parseFormData(formData); - - assertThat(parsedFormData.getAntragsteller()).usingRecursiveComparison().ignoringFields("data") - .isEqualTo(AfmAntragstellerTestFactory.create()); - } - - @Test - @DisplayName("should map antragsteller when key starts with an uppercase letter") - void shouldMapAntragstellerUppercase() { - formData = FormData.builder().formData(AfmAntragstellerTestFactory.createFormDataMap(AfmAntragstellerMapper.ANTRAGSTELLER_UPPERCASE)) - .build(); - - var parsedFormData = parseFormData(formData); - - assertThat(parsedFormData.getAntragsteller()).usingRecursiveComparison().ignoringFields("data") - .isEqualTo(AfmAntragstellerTestFactory.create()); - } - - @Test - @DisplayName("should map only antragsteller key when both present") - void shouldMapOnlyOneKey() { - var expectedAntragsteller = AfmAntragstellerTestFactory.createBuilder().anrede("anrede").vorname("firstName").nachname("lastName") - .build(); - - var parsedFormData = parseFormData(createFormData(expectedAntragsteller)); - - assertThat(parsedFormData.getAntragsteller()).usingRecursiveComparison().ignoringFields("data") - .isEqualTo(expectedAntragsteller); - } - - private FormData createFormData(Antragsteller antragsteller) { - var formDataMap = AfmAntragstellerTestFactory.createMutableFormDataMap(AfmAntragstellerMapper.ANTRAGSTELLER_UPPERCASE); - var antragstelleMap = AfmAntragstellerTestFactory.createPrivateAntragstelleMap( - MapEntry.entry(AfmAntragstellerMapper.ANREDE, antragsteller.getAnrede()), - MapEntry.entry(AfmAntragstellerMapper.VORNAME, antragsteller.getVorname()), - MapEntry.entry(AfmAntragstellerMapper.NACHNAME, antragsteller.getNachname()) - ); - formDataMap.put(AfmAntragstellerMapper.ANTRAGSTELLER, antragstelleMap); - return FormData.builder().formData(formDataMap).build(); - } - - @DisplayName("map private antragsteller data") - @Nested - class TestMapPrivateAntragstellerData { - - @Test - void shouldMapPostfachId() { - var parsedFormData = parseFormData(formData); - - assertThat(parsedFormData.getAntragsteller().getPostfachId()).isEqualTo(AfmAntragstellerTestFactory.POSTFACH_ID); - } - - @DisplayName("with mapped and not mapped value") - @Nested - class TestWithMappedAndNotMappedValue { - - private static final String NOT_MAPPED_FIELD = "not_mapped_value"; - private static final String NOT_MAPPED_VALUE = UUID.randomUUID().toString(); - - private FormData formData; - - @BeforeEach - void buildFormData() { - var antragstellerMap = AfmAntragstellerTestFactory.createPrivateAntragstelleMap( - MapEntry.entry(NOT_MAPPED_FIELD, NOT_MAPPED_VALUE)); - - var formDataMap = new HashMap<String, Object>(); - formDataMap.put(AfmAntragstellerMapper.ANTRAGSTELLER, antragstellerMap); - - formData = FormData.builder().formData(formDataMap).build(); - } - - @Test - void shouldNotContainDuplicateValues() { - var parsedFormData = parseFormData(formData); - - assertThat(parsedFormData.getAntragsteller().getData()).doesNotContainKeys( - AfmAntragstellerMapper.ANREDE, - AfmAntragstellerMapper.EMAIL, - AfmAntragstellerMapper.GEBURTSDATUM, - AfmAntragstellerMapper.GEBURTSNAME, - AfmAntragstellerMapper.GEBURTSORT, - AfmAntragstellerMapper.NACHNAME, - AfmAntragstellerMapper.VORNAME, - AfmAntragstellerMapper.TELEFON, - AfmAntragstellerMapper.STRASSE, - AfmAntragstellerMapper.HAUSNUMMER, - AfmAntragstellerMapper.ORT, - AfmAntragstellerMapper.PLZ); - } - - @Test - void shouldMoveNotMappedFieldsToDataMap() { - var parsedFormData = parseFormData(formData); - - assertThat(parsedFormData.getAntragsteller().getData()).containsEntry(NOT_MAPPED_FIELD, NOT_MAPPED_VALUE); - } - } - } - - @DisplayName("remove private fields") - @Nested - class TestRemovePrivateFields { - - @Test - void shouldRemoveAntragsteller() { - var parsedFormData = parseFormData(formData); - - assertThat(parsedFormData.getFormData().get(AfmAntragstellerMapper.ANTRAGSTELLER)).isNull(); - } - - @Test - @DisplayName("should remove Antragsteller when key starts with an uppercase latter") - void shouldRemoveAntragstellerUppercase() { - formData = FormData.builder().formData(AfmAntragstellerTestFactory.createFormDataMap(AfmAntragstellerMapper.ANTRAGSTELLER_UPPERCASE)) - .build(); - - var parsedFormData = parseFormData(formData); - - assertThat(parsedFormData.getFormData().get(AfmAntragstellerMapper.ANTRAGSTELLER_UPPERCASE)).isNull(); - } - - @Test - @DisplayName("should remove only 'antragsteller' key when both present") - void shouldRemoveOnlyOneKey() { - var parsedFormData = parseFormData(createFormData()); - - assertThat(parsedFormData.getFormData().get(AfmAntragstellerMapper.ANTRAGSTELLER_UPPERCASE)).isNotNull(); - } - - private FormData createFormData() { - var formDataMap = AfmAntragstellerTestFactory.createMutableFormDataMap(AfmAntragstellerMapper.ANTRAGSTELLER_UPPERCASE); - formDataMap.put(AfmAntragstellerMapper.ANTRAGSTELLER, AfmAntragstellerTestFactory.createPrivateAntragstelleMap()); - return FormData.builder().formData(formDataMap).build(); - } - } - } - - @Nested - class TestMapFirmAntragstellerData { - - @Test - void shouldMapFirmAntragstellerData() { - var parsedFormData = parseFormData(createFormData()); - - assertThat(parsedFormData.getAntragsteller()).usingRecursiveComparison() - .ignoringFields("data") - .isEqualTo(AfmAntragstellerTestFactory.createFirm()); - } - - private FormData createFormData() { - var formDataMap = AfmAntragstellerTestFactory.createFormDataMap(); - formDataMap.put(AfmAntragstellerMapper.ANTRAGSTELLER, AfmAntragstellerTestFactory.createFirmAntragstelleMap()); - return FormData.builder().formData(formDataMap).build(); - } - } - - private FormData parseFormData(FormData formData) { - return mapper.parseFormData(formData); - } -} diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmAntragstellerTestFactory.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmAntragstellerTestFactory.java deleted file mode 100644 index bcdf3985f30f88c7fe5d1a0d47f669aca86942b6..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmAntragstellerTestFactory.java +++ /dev/null @@ -1,138 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.semantik.enginebased.afm; - -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; - -import org.assertj.core.data.MapEntry; - -import de.ozgcloud.eingang.common.formdata.Antragsteller; - -public class AfmAntragstellerTestFactory { - - public static final String ANREDE = "Herr"; - public static final String FIRMA_NAME = "Firma X"; - public static final String VORNAME = "Max"; - public static final String NACHNAME = "Mustermann"; - public static final String GEBURTSNAME = "Maxi"; - public static final String GEBURTSDATUM = "01.01.1970"; - public static final String GEBURTSORT = "Sandhausen"; - public static final String EMAIL = "alsob@ne.ver"; - public static final String TELEFON = "+ 49 4621 9654"; - public static final String STRASSE = "Lachstrasse"; - public static final String HAUSNUMMER = "8484"; - public static final String PLZ = "12345"; - public static final String ORT = "Wohlfuehlhausen"; - - public static final String POSTFACH_ID = UUID.randomUUID().toString(); - - public static Antragsteller create() { - return createBuilder().build(); - } - - public static Antragsteller createFirm() { - return createBuilder() - .firmaName(FIRMA_NAME) - .geburtsname(null) - .geburtsdatum(null) - .geburtsort(null) - .build(); - } - - public static Antragsteller.AntragstellerBuilder createBuilder() { - return Antragsteller.builder() - .anrede(ANREDE) - .vorname(VORNAME) - .nachname(NACHNAME) - .geburtsname(GEBURTSNAME) - .geburtsdatum(GEBURTSDATUM) - .geburtsort(GEBURTSORT) - .email(EMAIL) - .telefon(TELEFON) - .strasse(STRASSE) - .hausnummer(HAUSNUMMER) - .plz(PLZ) - .ort(ORT) - .postfachId(POSTFACH_ID); - } - - public static Map<String, Object> createFormDataMap() { - return createFormDataMap(AfmAntragstellerMapper.ANTRAGSTELLER); - } - - public static Map<String, Object> createFormDataMap(String antragstellerKey) { - return createMutableFormDataMap(antragstellerKey); - } - - public static Map<String, Object> createMutableFormDataMap(String antragstellerKey) { - var map = new HashMap<String, Object>(); - map.put(antragstellerKey, createPrivateAntragstelleMap()); - map.put(AfmAntragstellerMapper.POSTFACH_ID, POSTFACH_ID); - return map; - } - - @SafeVarargs - public static Map<String, Object> createPrivateAntragstelleMap(MapEntry<String, Object>... additionalEntries) { - var map = new HashMap<String, Object>(); - map.put(AfmAntragstellerMapper.ANREDE, ANREDE); - map.put(AfmAntragstellerMapper.VORNAME, VORNAME); - map.put(AfmAntragstellerMapper.NACHNAME, NACHNAME); - map.put(AfmAntragstellerMapper.GEBURTSNAME, GEBURTSNAME); - map.put(AfmAntragstellerMapper.GEBURTSDATUM, GEBURTSDATUM); - map.put(AfmAntragstellerMapper.GEBURTSORT, GEBURTSORT); - map.put(AfmAntragstellerMapper.EMAIL, EMAIL); - map.put(AfmAntragstellerMapper.TELEFON, TELEFON); - map.put(AfmAntragstellerMapper.STRASSE, STRASSE); - map.put(AfmAntragstellerMapper.HAUSNUMMER, HAUSNUMMER); - map.put(AfmAntragstellerMapper.PLZ, PLZ); - map.put(AfmAntragstellerMapper.ORT, ORT); - - Arrays.stream(additionalEntries).forEach(entry -> map.put(entry.getKey(), entry.getValue())); - - return Collections.unmodifiableMap(map); - } - - @SafeVarargs - public static Map<String, Object> createFirmAntragstelleMap(MapEntry<String, Object>... additionalEntries) { - var map = new HashMap<String, Object>(); - map.put(AfmAntragstellerMapper.FIELD_FIRMA_NAME, FIRMA_NAME); - map.put(AfmAntragstellerMapper.FIELD_ANSPRECHPARTNER_ANREDE, ANREDE); - map.put(AfmAntragstellerMapper.FIELD_ANSPRECHPARTNER_VORNAME, VORNAME); - map.put(AfmAntragstellerMapper.FIELD_ANSPRECHPARTNER_NACHNAME, NACHNAME); - map.put(AfmAntragstellerMapper.EMAIL, EMAIL); - map.put(AfmAntragstellerMapper.TELEFON, TELEFON); - map.put(AfmAntragstellerMapper.FIELD_FIRMA_STRASSE, STRASSE); - map.put(AfmAntragstellerMapper.FIELD_FIRMA_HAUSNUMMER, HAUSNUMMER); - map.put(AfmAntragstellerMapper.FIELD_FIRMA_PLZ, PLZ); - map.put(AfmAntragstellerMapper.FIELD_FIRMA_STADT, ORT); - - Arrays.stream(additionalEntries).forEach(entry -> map.put(entry.getKey(), entry.getValue())); - - return Collections.unmodifiableMap(map); - } -} \ No newline at end of file diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmEmpfangeneStelleMapperTest.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmEmpfangeneStelleMapperTest.java deleted file mode 100644 index e2debc76be2b32a90625033502b005db9feeadcc..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmEmpfangeneStelleMapperTest.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.semantik.enginebased.afm; - -import static org.assertj.core.api.Assertions.*; - -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; - -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; - -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.common.formdata.FormDataTestFactory; -import de.ozgcloud.eingang.semantik.enginebased.afm.AfmEmpfangeneStelleMapper; -import de.ozgcloud.eingang.semantik.enginebased.afm.AfmEngineBasedMapper; - -class AfmEmpfangeneStelleMapperTest { - - @InjectMocks - private AfmEmpfangeneStelleMapper mapper; - - @Test - void shouldDoNothingIfNoEmpfangeneStelle() { - var formData = FormDataTestFactory.createBuilder().formData(Collections.emptyMap()).build(); - - var mapped = mapper.parseFormData(formData); - - assertThat(mapped).isEqualTo(formData); - } - - @Nested - class TestAddControlNode { - private FormData formData = FormDataTestFactory - .withFormDataMaps(Map.of(AfmEmpfangeneStelleMapper.EMPFANGENESTELLE, new HashMap<String, Object>())); - - @Test - void shouldAddControlNode() { - var mapped = mapper.parseFormData(formData); - - assertThat(getEmpfangeneStelle(mapped.getFormData())).containsKey(AfmEngineBasedMapper.KOP_CONTROLDATA_NODENAME); - } - - @SuppressWarnings("unchecked") - @Test - void shouldSetFlagToTrue() { - var mapped = mapper.parseFormData(formData); - - assertThat((Map<String, Object>) getEmpfangeneStelle(mapped.getFormData()) - .get(AfmEngineBasedMapper.KOP_CONTROLDATA_NODENAME)) - .containsEntry(AfmEngineBasedMapper.CONTROLDATA_METADATA_PROPERTYNAME, "true"); - } - - @SuppressWarnings("unchecked") - private Map<String, Object> getEmpfangeneStelle(Map<String, Object> formMap) { - return (Map<String, Object>) formMap.get(AfmEmpfangeneStelleMapper.EMPFANGENESTELLE); - } - } - -} diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmEngineBasedAdapterTest.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmEngineBasedAdapterTest.java deleted file mode 100644 index a99b67392b0c0cf2ce97c3230fc123280dc27857..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmEngineBasedAdapterTest.java +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.semantik.enginebased.afm; - -import static org.assertj.core.api.Assertions.*; -import static org.mockito.Mockito.*; - -import java.util.Collections; -import java.util.Map; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Spy; -import org.springframework.test.util.ReflectionTestUtils; - -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.common.formdata.FormHeader; -import de.ozgcloud.eingang.semantik.enginebased.afm.intelliform.IntelliFormRepresentationAdapter; - -class AfmEngineBasedAdapterTest { - - @Spy - @InjectMocks - private AfmEngineBasedAdapter adapter; - @Mock - private AfmEngineBasedMapper mapper; - - @Mock - private IntelliFormRepresentationAdapter intelliFormRepresentationAdapters; - - @DisplayName("Parse form data") - @Nested - class TestParseFromData { - private final String VORGANG_NUMMER = "AAAA-1234"; - - private final Map<String, Object> formDataMap = Map.of(AfmAntragstellerMapper.POSTFACH_ID, "postfachIdValue"); - private final FormData formData = FormData.builder() - .header(FormHeader.builder() - .vorgangNummer(VORGANG_NUMMER) - .build() - ) - .formData(formDataMap) - .build(); - - private final FormData processedFormData = FormData.builder() - .formData(formDataMap) - .build(); - - @BeforeEach - void mock() { - ReflectionTestUtils.setField(adapter, "mappers", Collections.singletonList(mapper)); - - when(mapper.parseFormData(processedFormData)).thenReturn(processedFormData); - when(intelliFormRepresentationAdapters.adaptByRepresentations(formData)).thenReturn(processedFormData); - } - - @Test - void shouldCallRepresentationAdapter() { - adapter.parseFormData(formData); - - verify(intelliFormRepresentationAdapters).adaptByRepresentations(formData); - } - - @Test - void shouldCallMappers() { - adapter.parseFormData(formData); - - verify(mapper).parseFormData(processedFormData); - } - - @Test - void shouldRemovePostfachId() { - var mappedFormData = adapter.parseFormData(formData); - - assertThat(mappedFormData.getFormData()).doesNotContainKey(AfmAntragstellerMapper.POSTFACH_ID); - } - - } - -} diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmErklaerungenMapperTest.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmErklaerungenMapperTest.java deleted file mode 100644 index 88f90c2fd91a616b5db930fd461d7ab04f3f71e5..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmErklaerungenMapperTest.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.semantik.enginebased.afm; - -import static org.assertj.core.api.Assertions.*; - -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; - -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; - -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.common.formdata.FormDataTestFactory; -import de.ozgcloud.eingang.semantik.enginebased.afm.AfmEngineBasedMapper; -import de.ozgcloud.eingang.semantik.enginebased.afm.AfmErklaerungenMapper; - -class AfmErklaerungenMapperTest { - - @InjectMocks - private AfmErklaerungenMapper mapper; - - @Test - void shouldDoNothingIfNoEmpfangeneStelle() { - var formData = FormDataTestFactory.createBuilder().formData(Collections.emptyMap()).build(); - - var mapped = mapper.parseFormData(formData); - - assertThat(mapped).isEqualTo(formData); - } - - @Nested - class TestAddControlNode { - private FormData formData = FormDataTestFactory - .withFormDataMaps(Map.of(AfmErklaerungenMapper.ERKLAERUNGEN, new HashMap<String, Object>())); - - @Test - void shouldAddControlNode() { - var mapped = mapper.parseFormData(formData); - - assertThat(getErklaerungenStelle(mapped.getFormData())).containsKey(AfmEngineBasedMapper.KOP_CONTROLDATA_NODENAME); - } - - @SuppressWarnings("unchecked") - @Test - void shouldSetFlagToTrue() { - var mapped = mapper.parseFormData(formData); - - assertThat((Map<String, Object>) getErklaerungenStelle(mapped.getFormData()) - .get(AfmEngineBasedMapper.KOP_CONTROLDATA_NODENAME)) - .containsEntry(AfmEngineBasedMapper.CONTROLDATA_METADATA_PROPERTYNAME, "true"); - } - - @SuppressWarnings("unchecked") - private Map<String, Object> getErklaerungenStelle(Map<String, Object> formMap) { - return (Map<String, Object>) formMap.get(AfmErklaerungenMapper.ERKLAERUNGEN); - } - } - -} diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmFileCountMapperTest.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmFileCountMapperTest.java deleted file mode 100644 index 7c63ef8ed048579653880f4ef7904f0b97d9554a..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmFileCountMapperTest.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.semantik.enginebased.afm; - -import static org.assertj.core.api.Assertions.*; - -import java.util.List; - -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.common.formdata.FormDataTestFactory; -import de.ozgcloud.eingang.common.formdata.IncomingFileGroup; -import de.ozgcloud.eingang.common.formdata.IncomingFileGroupTestFactory; -import de.ozgcloud.eingang.common.formdata.IncomingFileTestFactory; - -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Spy; - -class AfmFileCountMapperTest { - - @Spy - @InjectMocks - private AfmFileCountMapper mapper; - - private final IncomingFileGroup attachmentWithMultipleFiles = IncomingFileGroupTestFactory.createBuilder() - .name("anotherAttachment") - .clearFiles() - .files(List.of(IncomingFileTestFactory.create(), IncomingFileTestFactory.create())) - .build(); - - private final FormData formData = FormDataTestFactory.createBuilder() - .clearAttachments() - .attachments(List.of(IncomingFileGroupTestFactory.create(), attachmentWithMultipleFiles)) - .build(); - - @Nested - class TestParseFormData { - - @Test - void shouldKeepAttachments() { - var parsedFormData = parseFormData(); - - assertThat(parsedFormData.getAttachments()).hasSize(2); - assertThat(parsedFormData.getAttachments().get(0).getFiles()).hasSize(1); - assertThat(parsedFormData.getAttachments().get(1).getFiles()).hasSize(2); - } - - @Test - void shouldSetNumberOfAttachments() { - var parsedFormData = parseFormData(); - - assertThat(parsedFormData.getNumberOfAttachments()).isEqualTo(3); - } - - @Test - void shouldKeepRepresentations() { - var parsedFormData = parseFormData(); - - assertThat(parsedFormData.getRepresentations()).hasSize(1); - } - - @Test - void shouldSetNumberOfRepresentations() { - var parsedFormData = parseFormData(); - - assertThat(parsedFormData.getNumberOfRepresentations()).isEqualTo(1); - } - - private FormData parseFormData() { - return mapper.parseFormData(formData); - } - } -} diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmHeaderMapperTest.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmHeaderMapperTest.java deleted file mode 100644 index 80a0e966be30d910f62596d02d669cc36d5062a8..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmHeaderMapperTest.java +++ /dev/null @@ -1,199 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.semantik.enginebased.afm; - -import static org.assertj.core.api.Assertions.*; -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.*; - -import java.util.Optional; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Spy; - -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.common.formdata.FormDataUtils; -import de.ozgcloud.eingang.common.formdata.ServiceKonto; -import de.ozgcloud.eingang.semantik.common.ServiceKontoFactory; - -class AfmHeaderMapperTest { - - @Spy - @InjectMocks - private AfmHeaderMapper mapper; - @Mock - private ServiceKontoFactory serviceKontoFactory; - - @DisplayName("Parse form data") - @Nested - class TestParseFormData { - - @DisplayName("map form header") - @Nested - class TestMapFormHeader { - - private static final FormData FORM_DATA = FormData.builder().formData(AfmHeaderTestFactory.createFormDataMap()).build(); - - @Test - void shouldKeepHeader() { - var parsedFormData = parseFormData(); - - assertThat(parsedFormData.getFormData().get(AfmHeaderMapper.HEADER_FIELD)).isNotNull(); - } - - @DisplayName("fields") - @Nested - class TestFields { - - @Test - void shouldMapRequestId() { - var parsedFormData = parseFormData(); - - assertThat(parsedFormData.getHeader().getRequestId()).isEqualTo(AfmHeaderTestFactory.ID); - } - - @Test - void shouldMapVorgangNummer() { - var parsedFormData = parseFormData(); - - assertThat(parsedFormData.getHeader().getVorgangNummer()).isEqualTo(AfmHeaderTestFactory.ID); - } - - @Test - void shouldMapCreatedAt() { - var parsedFormData = parseFormData(); - - assertThat(parsedFormData.getHeader().getCreatedAt()).isEqualTo(AfmHeaderTestFactory.TIMESTAMP); - } - - @Test - void shouldMapFormId() { - var parsedFormData = parseFormData(); - - assertThat(parsedFormData.getHeader().getFormId()).isEqualTo(AfmHeaderTestFactory.FORM_ID); - } - - @Test - void shouldMapFormName() { - var parsedFormData = parseFormData(); - - assertThat(parsedFormData.getHeader().getFormName()).isEqualTo(AfmHeaderTestFactory.FORM); - } - - @Test - void shouldMapSender() { - var parsedFormData = parseFormData(); - - assertThat(parsedFormData.getHeader().getSender()).isEqualTo(AfmHeaderTestFactory.SENDER); - } - - @Test - void shouldSetFormEngineName() { - var parsedFormData = parseFormData(); - - assertThat(parsedFormData.getHeader().getFormEngineName()).isEqualTo(AfmHeaderMapper.AFM_FORMENGINE_NAME); - } - - @DisplayName("service konto") - @Nested - class TestServiceKonto { - - @DisplayName("OSI") - @Nested - class TestOsiServiceKonto { - @Test - void shouldCallBuildServiceKontoIfPresent() { - parseFormData(); - - verify(serviceKontoFactory).buildOsiServiceKonto(any(), eq(FORM_DATA)); - } - - @Test - void shouldNotCallBuildServiceKontoIfNotExists() { - mapper.parseFormData(FormDataUtils.from(FORM_DATA).remove(AfmHeaderMapper.POSTFACH_NAME_ID).build()); - - verify(serviceKontoFactory, never()).buildOsiServiceKonto(any(), any()); - } - } - - @DisplayName("BayernID") - @Nested - class TestBayernId { - - @Mock - private FormData formData; - @Mock - private ServiceKonto serviceKonto; - - @Test - void shouldCallCreateBayernIdServiceKonto() { - var formData = FormData.builder().formData(AfmHeaderTestFactory.createFormDataMapWithExtendedHeaders()).build(); - - mapper.parseFormData(formData); - - verify(mapper).createBayernIdServiceKonto(formData); - } - - @Test - void shouldReturnServiceKonto() { - when(serviceKontoFactory.createBayernIdServiceKonto(any())).thenReturn(Optional.of(serviceKonto)); - - var parsedFormData = mapper.createBayernIdServiceKonto(formData); - - assertThat(parsedFormData).contains(serviceKonto); - } - - } - } - } - - private FormData parseFormData() { - return mapper.parseFormData(FORM_DATA); - } - } - - @DisplayName("remove mapped data") - @Nested - class TestRemoveMappedData { - - private final FormData formData = FormData.builder().formData(AfmHeaderTestFactory.createFormDataMap()).build(); - - @Test - void shouldRemoveRestResponseName() { - var parsedFormData = parseFormData(); - - assertThat(parsedFormData.getFormData().get(ServiceKontoFactory.REST_RESPONSE_NAME)).isNull(); - } - - private FormData parseFormData() { - return mapper.parseFormData(formData); - } - } - } - -} diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmHeaderTestFactory.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmHeaderTestFactory.java deleted file mode 100644 index ff8b85d511d22fd84c3a3302d29c2fe58b31eb78..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmHeaderTestFactory.java +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.semantik.enginebased.afm; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; - -import de.ozgcloud.eingang.semantik.common.ServiceKontoFactory; - -public class AfmHeaderTestFactory { - - public static final String ID = UUID.randomUUID().toString(); - public static final String TIMESTAMP = "2020-11-18T09:09:27.627Z"; - public static final String FORM_ID = "waffen/kleinerWaffenschein"; - public static final String FORM = "Kleiner Waffenschein gem. § 10 Abs. 4 Satz 4 Waffengesetz (WaffG)"; - public static final String SENDER = "afm.schleswig-holstein.de"; - - public static final String CUSTOM_POSTFACH_ID = "postfach_id"; - public static final String CUSTOM_VORNAME = "vorname"; - public static final String CUSTOM_NACHNAME = "nachname"; - public static final String CUSTOM_GEBURTSNAME = "Geburtsname"; - public static final String CUSTOM_GEBURTSORT = "geburtsort"; - public static final String CUSTOM_EMAIL = "email"; - public static final String CUSTOM_TELEFON = "telefon"; - public static final String CUSTOM_STRASSE = "strasse"; - public static final String CUSTOM_PLZ = "plz"; - public static final String CUSTOM_ORT = "ort"; - - public static final String POSTFACH_NAME_ID = "name-id-value"; - - public static final int REST_RESPONSE_NAME_MEMBER_SCOPE_MAILBOX_TYPE_VALUE = 1; - - public static Map<String, Object> createFormDataMap() { - var map = new HashMap<String, Object>(); - map.put(AfmHeaderMapper.HEADER_FIELD, createHeaderMap()); - map.put(AfmHeaderMapper.POSTFACH_NAME_ID, POSTFACH_NAME_ID); - map.put(ServiceKontoFactory.REST_RESPONSE_NAME, List.of(createRestResponseNameMap())); - - return map; - } - - @SuppressWarnings("unchecked") - public static Map<String, Object> createFormDataMapWithExtendedHeaders() { - var map = new HashMap<>(createFormDataMap()); - ((Map<String, Object>) map.get(AfmHeaderMapper.HEADER_FIELD)).putAll(createCustomHeaderMap()); - return map; - } - - public static Map<String, Object> createHeaderMap() { - var map = new HashMap<String, Object>(); - map.put(AfmHeaderMapper.ID, ID); - map.put(AfmHeaderMapper.TIMESTAMP, TIMESTAMP); - map.put(AfmHeaderMapper.FORM_ID, FORM_ID); - map.put(AfmHeaderMapper.FORM, FORM); - map.put(AfmHeaderMapper.SENDER, SENDER); - return map; - } - - public static Map<String, Object> createCustomHeaderMap() { - var map = new HashMap<String, Object>(); - map.put(ServiceKontoFactory.KEY_BAYERN_ID_POSTFACH_ID, CUSTOM_POSTFACH_ID); - map.put(AfmAntragstellerHeaderMapper.KEY_VORNAME, CUSTOM_VORNAME); - map.put(AfmAntragstellerHeaderMapper.KEY_NACHNAME, CUSTOM_NACHNAME); - map.put(AfmAntragstellerHeaderMapper.KEY_GEBURTSNAME, CUSTOM_GEBURTSNAME); - map.put(AfmAntragstellerHeaderMapper.KEY_GEBURTSORT, CUSTOM_GEBURTSORT); - map.put(AfmAntragstellerHeaderMapper.KEY_EMAIL, CUSTOM_EMAIL); - map.put(AfmAntragstellerHeaderMapper.KEY_TELEFON, CUSTOM_TELEFON); - map.put(AfmAntragstellerHeaderMapper.KEY_STRASSE, CUSTOM_STRASSE); - map.put(AfmAntragstellerHeaderMapper.KEY_PLZ, CUSTOM_PLZ); - map.put(AfmAntragstellerHeaderMapper.KEY_ORT, CUSTOM_ORT); - return map; - } - - public static Map<String, Object> createRestResponseNameMap() { - return Map.of(ServiceKontoFactory.REST_RESPONSE_NAME_MEMBER_SCOPE, List.of(createRestResponseNameMemberScopeMap())); - } - - private static Map<String, Object> createRestResponseNameMemberScopeMap() { - return Map.of(ServiceKontoFactory.REST_RESPONSE_NAME_MEMBER_SCOPE_MAILBOX_TYPE, REST_RESPONSE_NAME_MEMBER_SCOPE_MAILBOX_TYPE_VALUE); - } -} \ No newline at end of file diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmZustaendigeStelleMapperTest.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmZustaendigeStelleMapperTest.java deleted file mode 100644 index e9abbeff9c2dc8b2af9f03c35006fe667cc3acbc..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmZustaendigeStelleMapperTest.java +++ /dev/null @@ -1,194 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.semantik.enginebased.afm; - -import static org.assertj.core.api.Assertions.*; -import static org.mockito.Mockito.*; - -import java.util.HashMap; -import java.util.Map; - -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Spy; - -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.common.formdata.FormDataTestFactory; -import de.ozgcloud.eingang.common.formdata.ZustaendigeStelle; - -class AfmZustaendigeStelleMapperTest { - - @InjectMocks - @Spy - private AfmZustaendigeStelleMapper mapper; - - @Mock - private ZustaendigeStelleMetadataMapper zustaendigeStelleMetadataMapper; - - @Nested - class TestParseFormData { - - @Test - void shouldDoNothingOnNullZustaendigeStelle() { - var formData = FormData.builder().formData(new HashMap<>()).build(); - - var parsedFormData = parseFormData(formData); - - assertThat(parsedFormData).isEqualTo(formData); - } - - @Nested - class TestMapZustaendigeStelle { - - private FormData formData = FormData.builder().formData(AfmZustaendigeStelleTestFactory.createFormDataMap()).build(); - private static final String BEZEICHNUNG = "Amt für Kleintier und Viezeug"; - - @Test - void shouldReturnFormDataOnNonExistingZustaendigeStelleAndOrganisationseinheitenId() { - var emptyFormData = FormData.builder().formData(new HashMap<String, Object>()).build(); - - var parsedFormData = parseZustaendigeStelleData(emptyFormData); - - assertThat(parsedFormData).isEqualTo(emptyFormData); - } - - @Test - void shouldMapOrganisationseinheitenId() { - var parsedFormData = parseZustaendigeStelleData(formData); - - assertThat(parsedFormData.getZustaendigeStelles()) - .extracting(ZustaendigeStelle::getOrganisationseinheitenId) - .containsExactly(AfmZustaendigeStelleTestFactory.ORGANISATIONSEINHEITEN_ID); - } - - @Test - void shouldMapBezeichnung() { - var parsedFormData = parseZustaendigeStelleData(formData); - - assertThat(parsedFormData.getZustaendigeStelles()) - .extracting(ZustaendigeStelle::getBezeichnung) - .containsExactly(BEZEICHNUNG); - } - - @Test - void shouldMapEmail() { - var parsedFormData = parseZustaendigeStelleData(formData); - - assertThat(parsedFormData.getZustaendigeStelles()) - .extracting(ZustaendigeStelle::getEmail) - .containsExactly(AfmZustaendigeStelleTestFactory.EMAIL); - } - - @Test - void shouldCallparseZustaendigeStelleData() { - parseFormData(formData); - - verify(mapper).parseZustaendigeStelleData(formData); - } - - @Test - void shouldCallParseBayernMetadata() { - when(zustaendigeStelleMetadataMapper.isResponsible(any())).thenReturn(true); - var expectedFormData = FormDataTestFactory.create(); - when(zustaendigeStelleMetadataMapper.parseZustaendigeStelleData(any())).thenReturn(expectedFormData); - - var resultFormData = parseFormData(formData); - - assertThat(resultFormData).isEqualTo(expectedFormData); - } - - private FormData parseZustaendigeStelleData(FormData formData) { - return mapper.parseZustaendigeStelleData(formData); - } - } - - @Nested - class TestAddMetaDataFlag { - - private FormData formData = FormDataTestFactory - .withFormDataMaps( - Map.of(FormDataTestFactory.NESTED_LIST_WITH_OBJECTS_KEY, FormDataTestFactory.NESTED_LIST_OBJECTS_ELEMENT_1), - AfmZustaendigeStelleTestFactory.createFormDataMap()); - - @Test - void shouldCallAddFlag() { - parseFormData(formData); - - verify(mapper).addMetaDataFlag(formData); - } - - @Test - void shouldHaveControlNode() { - var edited = mapper.addMetaDataFlag(formData); - - assertThat(getZustaendigeStelle(edited)).containsKey(AfmEngineBasedMapper.KOP_CONTROLDATA_NODENAME); - } - - @SuppressWarnings("unchecked") - @Test - void shouldSetFlagToTrue() { - var edited = mapper.addMetaDataFlag(formData); - - assertThat((Map<String, Object>) getZustaendigeStelle(edited).get(AfmEngineBasedMapper.KOP_CONTROLDATA_NODENAME)) - .containsEntry(AfmEngineBasedMapper.CONTROLDATA_METADATA_PROPERTYNAME, "true"); - } - - @Test - void shouldDoNothingIfNoZustaendigeStelle() { - var formDataMap = AfmZustaendigeStelleTestFactory.createFormDataMap(); - formDataMap.remove(AfmZustaendigeStelleMapper.ZUSTAENDIGESTELLE); - var formData = FormDataTestFactory.createBuilder().formData(formDataMap).build(); - - var edited = mapper.addMetaDataFlag(formData); - - assertThat(edited).doesNotContainKey(AfmZustaendigeStelleMapper.ZUSTAENDIGESTELLE); - } - - @SuppressWarnings("unchecked") - @Test - void shouldAddNoControlDataMapToOtherNodes() { - var edited = mapper.addMetaDataFlag(formData); - - edited.entrySet().stream() - .filter(entry -> entry.getKey() != AfmZustaendigeStelleMapper.ZUSTAENDIGESTELLE) - .filter(entry -> entry.getValue() instanceof Map) - .forEach(entry -> assertThat((Map<String, ?>) entry.getValue()) - .doesNotContainKey(AfmEngineBasedMapper.KOP_CONTROLDATA_NODENAME)); - } - - private Map<String, Object> getZustaendigeStelle(Map<String, Object> formDataMap) { - @SuppressWarnings("unchecked") - var zustaendigeStelle = (Map<String, Object>) formDataMap.get(AfmZustaendigeStelleMapper.ZUSTAENDIGESTELLE); - assertThat(zustaendigeStelle).isNotNull(); - return zustaendigeStelle; - } - } - - private FormData parseFormData(FormData formData) { - return mapper.parseFormData(formData); - } - } -} \ No newline at end of file diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmZustaendigeStelleTestFactory.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmZustaendigeStelleTestFactory.java deleted file mode 100644 index f629a1f224e1f59bb056debf70872297745d1a87..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmZustaendigeStelleTestFactory.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.semantik.enginebased.afm; - -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; - -import de.ozgcloud.eingang.semantik.enginebased.afm.AfmZustaendigeStelleMapper; - -public class AfmZustaendigeStelleTestFactory { - - public static final String ORGANISATIONSEINHEITEN_ID = UUID.randomUUID().toString(); - public static final String EMAIL = UUID.randomUUID().toString(); - private static final String BEZEICHNUNG = "Amt für Kleintier und Viezeug"; - - public static Map<String, Object> createFormDataMap() { - Map<String, Object> map = new HashMap<>(); - map.put(AfmZustaendigeStelleMapper.ZUSTAENDIGESTELLE, createZustaendigeStelleMap()); - return map; - } - - public static Map<String, Object> createZustaendigeStelleMap() { - Map<String, Object> map = new HashMap<>(); - map.put(AfmZustaendigeStelleMapper.ORGANISATIONSEINHEITEN_ID, ORGANISATIONSEINHEITEN_ID); - map.put(AfmZustaendigeStelleMapper.TAG_BEZEICHNUNG, BEZEICHNUNG); - map.put(AfmZustaendigeStelleMapper.EMAIL, EMAIL); - return map; - } -} diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/ZustaendigeStelleDataTestFactory.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/ZustaendigeStelleDataTestFactory.java deleted file mode 100644 index b7d82d624f06de55c99069480ce537b66edab2a3..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/ZustaendigeStelleDataTestFactory.java +++ /dev/null @@ -1,62 +0,0 @@ -package de.ozgcloud.eingang.semantik.enginebased.afm; - -import static de.ozgcloud.eingang.semantik.enginebased.afm.ZustaendigeStelleMetadataMapper.*; - -import java.util.List; -import java.util.Map; - -import de.ozgcloud.eingang.semantik.enginebased.afm.ZustaendigeStelleData.ZustaendigeStelleDataBuilder; - -public class ZustaendigeStelleDataTestFactory { - public static final String BEHOERDE_ANZEIGE_NAME = "Landratsamt XYZ (Testbehörde für BDA)"; - public static final String BEHOERDE_CALLER_ID = "87331322433"; - public static final String GEMEINDE_SCHLUESSEL_BP = "09189155"; - public static final String BEHOERDE_EMAIL = "poststelle@testbehoerde.bayern"; - public static final String AMTLICHER_REGIONALSCHLUESSEL = "091890000000"; - public static final String BEHOERDE_HAUSANSCHRIFT_STRASSE = "Teststraße 1"; - public static final String BEHOERDE_HAUSANSCHRIFT_ORT = "Musterstadt"; - public static final String BEHOERDE_HAUSANSCHRIFT_PLZ = "12345"; - public static final String BEHOERDE_TELEFON = "+49 123 45-0"; - - public static final Map<String, String> BEHOERDE_METADATA = Map.of( - KEY_BEHOERDE_ANZEIGE_NAME, BEHOERDE_ANZEIGE_NAME, - KEY_BEHOERDE_CALLER_ID, BEHOERDE_CALLER_ID, - KEY_GEMEINDE_SCHLUESSEL_BP, GEMEINDE_SCHLUESSEL_BP, - KEY_BEHOERDE_EMAIL, BEHOERDE_EMAIL, - KEY_AMTLICHER_REGIONALSCHLUESSEL, AMTLICHER_REGIONALSCHLUESSEL, - KEY_BEHOERDE_HAUSANSCHRIFT_STRASSE, BEHOERDE_HAUSANSCHRIFT_STRASSE, - KEY_BEHOERDE_HAUSANSCHRIFT_ORT, BEHOERDE_HAUSANSCHRIFT_ORT, - KEY_BEHOERDE_HAUSANSCHRIFT_PLZ, BEHOERDE_HAUSANSCHRIFT_PLZ, - KEY_BEHOERDE_TELEFON, BEHOERDE_TELEFON - ); - - public static final List<ZustaendigeStelleData.Field> ZUSTAENDIGE_STELLE_DATA_FIELDS = List.of( - ZustaendigeStelleMetadataFieldTestFactory.createBuilder().name(KEY_BEHOERDE_ANZEIGE_NAME) - .value(ZustaendigeStelleDataTestFactory.BEHOERDE_ANZEIGE_NAME).build(), - ZustaendigeStelleMetadataFieldTestFactory.createBuilder().name(KEY_BEHOERDE_CALLER_ID) - .value(ZustaendigeStelleDataTestFactory.BEHOERDE_CALLER_ID).build(), - ZustaendigeStelleMetadataFieldTestFactory.createBuilder().name(KEY_GEMEINDE_SCHLUESSEL_BP) - .value(ZustaendigeStelleDataTestFactory.GEMEINDE_SCHLUESSEL_BP).build(), - ZustaendigeStelleMetadataFieldTestFactory.createBuilder().name(KEY_BEHOERDE_EMAIL).value(ZustaendigeStelleDataTestFactory.BEHOERDE_EMAIL) - .build(), - ZustaendigeStelleMetadataFieldTestFactory.createBuilder().name(KEY_AMTLICHER_REGIONALSCHLUESSEL) - .value(ZustaendigeStelleDataTestFactory.AMTLICHER_REGIONALSCHLUESSEL).build(), - ZustaendigeStelleMetadataFieldTestFactory.createBuilder().name(KEY_BEHOERDE_HAUSANSCHRIFT_STRASSE) - .value(ZustaendigeStelleDataTestFactory.BEHOERDE_HAUSANSCHRIFT_STRASSE).build(), - ZustaendigeStelleMetadataFieldTestFactory.createBuilder().name(KEY_BEHOERDE_HAUSANSCHRIFT_ORT) - .value(ZustaendigeStelleDataTestFactory.BEHOERDE_HAUSANSCHRIFT_ORT).build(), - ZustaendigeStelleMetadataFieldTestFactory.createBuilder().name(KEY_BEHOERDE_HAUSANSCHRIFT_PLZ) - .value(ZustaendigeStelleDataTestFactory.BEHOERDE_HAUSANSCHRIFT_PLZ).build(), - ZustaendigeStelleMetadataFieldTestFactory.createBuilder().name(KEY_BEHOERDE_TELEFON).value(ZustaendigeStelleDataTestFactory.BEHOERDE_TELEFON) - .build() - ); - - public static ZustaendigeStelleData create() { - return createBuilder().build(); - } - - public static ZustaendigeStelleDataBuilder createBuilder() { - return ZustaendigeStelleData.builder() - .fields(ZUSTAENDIGE_STELLE_DATA_FIELDS); - } -} diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/ZustaendigeStelleMetadataFieldTestFactory.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/ZustaendigeStelleMetadataFieldTestFactory.java deleted file mode 100644 index 2508c76dde41ccc174ed79a3a97c23b08a883a50..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/ZustaendigeStelleMetadataFieldTestFactory.java +++ /dev/null @@ -1,20 +0,0 @@ -package de.ozgcloud.eingang.semantik.enginebased.afm; - -import de.ozgcloud.eingang.semantik.enginebased.afm.ZustaendigeStelleData.Field; -import de.ozgcloud.eingang.semantik.enginebased.afm.ZustaendigeStelleData.Field.FieldBuilder; - -public class ZustaendigeStelleMetadataFieldTestFactory { - - public static final String FIELD_NAME = "name"; - public static final String FIELD_VALUE = "value"; - - public static Field create() { - return createBuilder().build(); - } - - public static FieldBuilder createBuilder() { - return Field.builder() - .name(FIELD_NAME) - .value(FIELD_VALUE); - } -} diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/ZustaendigeStelleMetadataMapperITCase.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/ZustaendigeStelleMetadataMapperITCase.java deleted file mode 100644 index 7de876ff2d2493fc16c4bbc4e98ba9bfe60b36c7..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/ZustaendigeStelleMetadataMapperITCase.java +++ /dev/null @@ -1,50 +0,0 @@ -package de.ozgcloud.eingang.semantik.enginebased.afm; - -import static de.ozgcloud.eingang.semantik.enginebased.afm.ZustaendigeStelleMetadataMapper.*; -import static org.assertj.core.api.Assertions.*; - -import java.io.File; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; - -import de.ozgcloud.common.test.ITCase; -import de.ozgcloud.common.test.TestUtils; -import de.ozgcloud.eingang.common.formdata.IncomingFile; -import de.ozgcloud.eingang.common.formdata.IncomingFileTestFactory; -import lombok.SneakyThrows; - -@ITCase -class ZustaendigeStelleMetadataMapperITCase { - - @Autowired - private ZustaendigeStelleMetadataMapper mapper; - - private IncomingFile behoerdeMetadataXml; - - @SneakyThrows - @BeforeEach - void setUp() { - behoerdeMetadataXml = IncomingFileTestFactory.createBuilder() - .name(ZustaendigeStelleMetadataMapper.BEHOERDE_METADATA_FILE_NAME) - .file(new File(TestUtils.class.getClassLoader().getResource(BEHOERDE_METADATA_FILE_NAME).toURI())).build(); - - } - - @Test - void shouldReadXmlNodes() { - var metadata = mapper.readXmlContent(behoerdeMetadataXml); - - assertThat(metadata).get().extracting("fields").asList().usingRecursiveFieldByFieldElementComparator() - .containsAll(ZustaendigeStelleDataTestFactory.ZUSTAENDIGE_STELLE_DATA_FIELDS); - } - - @SneakyThrows - @Test - void shouldCatchException() { - var zustaendigeStelleData = mapper.readXmlContent(IncomingFileTestFactory.createBuilder().file(new File("broken-file")).build()); - - assertThat(zustaendigeStelleData).isEmpty(); - } -} \ No newline at end of file diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/ZustaendigeStelleMetadataMapperTest.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/ZustaendigeStelleMetadataMapperTest.java deleted file mode 100644 index 56058ec127401eeff1744df316e1aa60ef62449e..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/ZustaendigeStelleMetadataMapperTest.java +++ /dev/null @@ -1,171 +0,0 @@ -package de.ozgcloud.eingang.semantik.enginebased.afm; - -import static org.assertj.core.api.Assertions.*; -import static org.mockito.Mockito.*; - -import java.io.File; -import java.util.Map; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Spy; - -import com.fasterxml.jackson.dataformat.xml.XmlMapper; - -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.common.formdata.FormDataTestFactory; -import de.ozgcloud.eingang.common.formdata.IncomingFile; -import de.ozgcloud.eingang.common.formdata.IncomingFileTestFactory; -import de.ozgcloud.eingang.common.formdata.ZustaendigeStelle; -import de.ozgcloud.eingang.common.formdata.ZustaendigeStelleTestFactory; -import lombok.SneakyThrows; - -class ZustaendigeStelleMetadataMapperTest { - - @Spy - @InjectMocks - private ZustaendigeStelleMetadataMapper mapper; - - @Mock - private XmlMapper xmlMapper; - - @Nested - class TestParseBehoerdeMetadata { - - private IncomingFile behoerdeMetadataFile; - - private FormData formData; - - @BeforeEach - void setUp() { - behoerdeMetadataFile = IncomingFileTestFactory.createBuilder().name(ZustaendigeStelleMetadataMapper.BEHOERDE_METADATA_FILE_NAME) - .build(); - formData = FormDataTestFactory.createBuilder() - .clearZustaendigeStelles() - .representation(behoerdeMetadataFile).build(); - } - - @SneakyThrows - @Test - void shouldCallReadBehoerdeMetadata() { - doReturn(ZustaendigeStelleDataTestFactory.BEHOERDE_METADATA).when(mapper).readZustaendigeStelleMetadata(behoerdeMetadataFile); - - mapper.parseZustaendigeStelleData(formData); - - verify(mapper).readZustaendigeStelleMetadata(behoerdeMetadataFile); - } - - @Test - void shouldCallMapZustaendigeStelle() { - var behoerdeMetadata = Map.of("key", "value"); - doReturn(behoerdeMetadata).when(mapper).readZustaendigeStelleMetadata(behoerdeMetadataFile); - - mapper.parseZustaendigeStelleData(formData); - - verify(mapper).mapZustaendigeStelle(behoerdeMetadata); - } - - @Test - void shouldSetParsedZustaendigeStelle() { - doReturn(Map.of("key", "value")).when(mapper).readZustaendigeStelleMetadata(any()); - var zustaendigeStelle = ZustaendigeStelleTestFactory.create(); - doReturn(zustaendigeStelle).when(mapper).mapZustaendigeStelle(any()); - - var result = mapper.parseZustaendigeStelleData(formData); - - assertThat(result.getZustaendigeStelles()).containsExactly(zustaendigeStelle); - } - } - - @Nested - class TestReadBehoerdeMetadata { - - private File brokenFile; - - } - - @Nested - class TestMapZuestaendigeStelle { - - @Test - void shouldSetBezeichnung() { - var zustaendigeStelle = mapZustaendigeStelle(); - - assertThat(zustaendigeStelle.getBezeichnung()).isEqualTo(ZustaendigeStelleDataTestFactory.BEHOERDE_ANZEIGE_NAME); - } - - @Test - void shouldSetOrganisationEinheitId() { - var zustaendigeStelle = mapZustaendigeStelle(); - - assertThat(zustaendigeStelle.getOrganisationseinheitenId()).isEqualTo(ZustaendigeStelleDataTestFactory.BEHOERDE_CALLER_ID); - } - - @Test - void shouldSetGemeindeSchluessel() { - var zustaendigeStelle = mapZustaendigeStelle(); - - assertThat(zustaendigeStelle.getGemeindeSchluessel()).isEqualTo(ZustaendigeStelleDataTestFactory.GEMEINDE_SCHLUESSEL_BP); - } - - @Test - void shouldSetEmail() { - var zustaendigeStelle = mapZustaendigeStelle(); - - assertThat(zustaendigeStelle.getEmail()).isEqualTo(ZustaendigeStelleDataTestFactory.BEHOERDE_EMAIL); - } - - @Test - void shouldSetAmtlicherRegionalSchluessel() { - var zustaendigeStelle = mapZustaendigeStelle(); - - assertThat(zustaendigeStelle.getAmtlicherRegionalSchluessel()).isEqualTo(ZustaendigeStelleDataTestFactory.AMTLICHER_REGIONALSCHLUESSEL); - } - - @Test - void shouldSetHausanschriftStrasse() { - var zustaendigeStelle = mapZustaendigeStelle(); - - assertThat(zustaendigeStelle.getHausanschriftStrasse()).isEqualTo(ZustaendigeStelleDataTestFactory.BEHOERDE_HAUSANSCHRIFT_STRASSE); - } - - @Test - void shouldSetHausanschriftOrt() { - var zusatendigeStelle = mapZustaendigeStelle(); - - assertThat(zusatendigeStelle.getHausanschriftOrt()).isEqualTo(ZustaendigeStelleDataTestFactory.BEHOERDE_HAUSANSCHRIFT_ORT); - } - - @Test - void shouldSetHausanschriftPlz() { - var zustaendigeStelle = mapZustaendigeStelle(); - - assertThat(zustaendigeStelle.getHausanschriftPlz()).isEqualTo(ZustaendigeStelleDataTestFactory.BEHOERDE_HAUSANSCHRIFT_PLZ); - } - - @Test - void shouldSetTelefon() { - var zusatendigeStelle = mapZustaendigeStelle(); - - assertThat(zusatendigeStelle.getTelefon()).isEqualTo(ZustaendigeStelleDataTestFactory.BEHOERDE_TELEFON); - } - - private ZustaendigeStelle mapZustaendigeStelle() { - return mapper.mapZustaendigeStelle(ZustaendigeStelleDataTestFactory.BEHOERDE_METADATA); - } - } - - @Test - void shouldApproveResponsibility() { - var formData = FormDataTestFactory.createBuilder() - .representation(IncomingFileTestFactory.createBuilder().name(ZustaendigeStelleMetadataMapper.BEHOERDE_METADATA_FILE_NAME) - .build()).build(); - - var isResponsible = mapper.isResponsible(formData); - - assertThat(isResponsible).isTrue(); - } -} \ No newline at end of file diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/intelliform/IntelliFormRepresentationAdapterTest.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/intelliform/IntelliFormRepresentationAdapterTest.java deleted file mode 100644 index 27be6b86a22cc6658bb7421265e3b914fb990817..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/intelliform/IntelliFormRepresentationAdapterTest.java +++ /dev/null @@ -1,456 +0,0 @@ -package de.ozgcloud.eingang.semantik.enginebased.afm.intelliform; - -import static de.ozgcloud.eingang.semantik.enginebased.afm.intelliform.IntelliFormRepresentationAdapter.*; -import static org.assertj.core.api.Assertions.*; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.Mockito.*; - -import java.io.IOException; -import java.io.InputStream; -import java.io.StringReader; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.MethodSource; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Spy; -import org.w3c.dom.Document; -import org.xml.sax.InputSource; -import org.xml.sax.SAXException; - -import com.thedeanda.lorem.LoremIpsum; - -import de.ozgcloud.eingang.common.errorhandling.TechnicalException; -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.common.formdata.IncomingFile; -import de.ozgcloud.eingang.common.formdata.IncomingFileGroup; -import de.ozgcloud.eingang.common.formdata.IncomingFileGroupTestFactory; -import de.ozgcloud.eingang.common.formdata.IncomingFileTestFactory; - -class IntelliFormRepresentationAdapterTest { - - private static final String DOCUMENT_TEST_KEY = "doc-test-key"; - private static final String DOCUMENT_TEST_VALUE = "doc-test-value"; - - @Spy - @InjectMocks - IntelliFormRepresentationAdapter adapter; - - @Mock - private XmlToJavaMapsMapper xmlToJavaMapsMapper; - - @DisplayName("find IntelliForm XML representation") - @Nested - class TestFindIntelliFormXmlRepresentation { - - @Mock - private FormData formData; - - @DisplayName("should find first with IntelliForm schema") - @Test - void shouldFindFirstWithIntelliFormSchema() { - var schemas = Stream.of( - "<root xmlns=\"%s\" />".formatted(INTELLIFORM_TYPENAME), - "<root xmlns:t=\"unknown\">first</root>", - "<root>second</root>", - "<root xmlns:t=\"%s\">third</root>".formatted(INTELLIFORM_TYPENAME), - "<root xmlns:t=\"%s\">fourth</root>".formatted(INTELLIFORM_TYPENAME) - ).map(IntelliFormRepresentationAdapterTest.this::buildXMLDocument); - doReturn(schemas).when(adapter).streamXMLDocumentsFromRepresentations(formData); - - var firstWithSchema = adapter.findIntelliFormXMLRepresentation(formData); - - assertThat(firstWithSchema).isPresent(); - var rootElement = firstWithSchema.get().getDocumentElement(); - assertThat(rootElement.getTextContent()).isEqualTo("third"); - } - } - - @DisplayName("stream XML documents from representations") - @Nested - class TestStreamXmlDocumentsFromRepresentations { - - @Mock - private Document document; - - @Mock - private FormData formData; - - @Mock - private InputStream inputStream; - - @DisplayName("with no representations") - @Nested - class TestWithNoRepresentations { - @BeforeEach - void mock() { - when(formData.getRepresentations()).thenReturn(Collections.emptyList()); - } - - @DisplayName("should return empty") - @Test - void shouldReturnEmpty() { - var documents = doExtract(); - - assertThat(documents).isEmpty(); - } - } - - @DisplayName("with a xml representation") - @Nested - class TestWithAXMLRepresentations { - @Mock - private IncomingFile otherRepresentation; - - @Mock - private IncomingFile xmlRepresentation; - - @Mock - private IncomingFile otherXMLRepresentation; - - @Mock - private Document otherDocument; - - @Mock - private InputStream otherInputStream; - - @BeforeEach - void mock() { - when(otherRepresentation.getContentType()).thenReturn("pdf"); - when(xmlRepresentation.getContentType()).thenReturn("xml"); - when(otherXMLRepresentation.getContentType()).thenReturn("xml"); - when(formData.getRepresentations()).thenReturn(List.of(otherRepresentation, xmlRepresentation, otherXMLRepresentation)); - - when(xmlRepresentation.getContentStream()).thenReturn(inputStream); - when(xmlToJavaMapsMapper.parseAsW3cDocument(inputStream)).thenReturn(document); - - when(otherXMLRepresentation.getContentStream()).thenReturn(otherInputStream); - - } - - @DisplayName("should include all successfully parsed documents") - @Test - void shouldIncludeAllSuccessfullyParsedDocuments() { - when(xmlToJavaMapsMapper.parseAsW3cDocument(otherInputStream)).thenReturn(otherDocument); - - var documents = doExtract(); - - assertThat(documents).isEqualTo(List.of(document, otherDocument)); - } - - @DisplayName("should skip documents with parse error") - @Test - void shouldSkipDocumentsWithParseError() { - when(xmlToJavaMapsMapper.parseAsW3cDocument(otherInputStream)).thenThrow(new TechnicalException("some error")); - - var documents = doExtract(); - - assertThat(documents).isEqualTo(List.of(document)); - } - } - - private List<Document> doExtract() { - return adapter.streamXMLDocumentsFromRepresentations(formData).toList(); - } - } - - @DisplayName("is responsible") - @Nested - class TestIsResponsible { - - @Mock - private FormData formData; - - @DisplayName("should be true with namespace attribute match") - @Test - void shouldBeTrueWithNamespaceAttributeMatch() { - - doReturn(Optional.of(buildXMLDocument(""" - <myForm xmlns:t="%s"> - </myForm>""".formatted(INTELLIFORM_TYPENAME)))) - .when(adapter).findIntelliFormXMLRepresentation(formData); - - var isResponsible = adapter.isResponsible(formData); - - assertThat(isResponsible).isTrue(); - } - - @DisplayName("should be false without xml document") - @Test - void shouldBeFalseWithoutXmlDocument() { - doReturn(Optional.empty()) - .when(adapter).findIntelliFormXMLRepresentation(formData); - - var isResponsible = adapter.isResponsible(formData); - - assertThat(isResponsible).isFalse(); - } - - } - - @DisplayName("get form data entries from document") - @Nested - class TestGetFormDataEntriesFromDocument { - - private static final String OTHER_VENDOR_ID = "vendorId:other"; - private static final String MISSING_VENDOR_ID = "vendorId:missing"; - - @Mock - private Document document; - - private List<IncomingFileGroup> attachments; - - @BeforeEach - void mock() { - when(xmlToJavaMapsMapper.mapXmlToJavaMaps(document)).thenReturn(Map.of( - DOCUMENT_TEST_KEY, DOCUMENT_TEST_VALUE, - "Upload1", Map.of( - "file", Map.of("id", IncomingFileGroupTestFactory.VENDOR_ID_XXX) - ), - "Upload2", Map.of( - "file", Map.of("id", OTHER_VENDOR_ID) - ), - "Upload3", Map.of( - "file", Map.of("id", "representationId") - ), - "NoUpload1", Map.of( - "file", "" - ), - "NoUpload2", Map.of() - )); - attachments = List.of( - IncomingFileGroupTestFactory.create(), - IncomingFileGroupTestFactory.createBuilder() - .name("other") - .files(List.of( - IncomingFileTestFactory.createBuilder() - .vendorId(MISSING_VENDOR_ID) - .build(), - IncomingFileTestFactory.createBuilder() - .vendorId(OTHER_VENDOR_ID) - .build())) - .build()); - - } - - @DisplayName("should prune upload element if is an attachment") - @Test - void shouldPruneUploadElementIfIsAnAttachment() { - var entryKeys = obtainResidualEntryKeys(); - - assertThat(entryKeys).containsExactlyInAnyOrder(DOCUMENT_TEST_KEY, "Upload3", "NoUpload1", "NoUpload2"); - } - - private List<String> obtainResidualEntryKeys() { - return adapter.getFormDataEntriesFromDocument(document, attachments).map(Map.Entry::getKey).toList(); - } - } - - @DisplayName("create header map") - @Nested - class TestCreateHeaderMap { - - private Document document; - - @DisplayName("with full fields") - @Nested - class TestWithFullFields { - - private Map<String, Object> headerMap; - - @BeforeEach - void mock() { - headerMap = Stream.concat(HEADER_ATTRIBUTE_NAMES.stream(), CUSTOM_HEADER_ATTRIBUTE_NAMES.stream()) - .collect(Collectors.toMap(name -> name, name -> LoremIpsum.getInstance().getName())); - document = buildXMLDocument("<root %s/>".formatted( - headerMap.entrySet().stream() - .map(entry -> "%s=\"%s\"".formatted(entry.getKey(), entry.getValue())) - .collect(Collectors.joining(" ")) - ) - ); - } - - @DisplayName("should include header field") - @ParameterizedTest - @MethodSource("headerNames") - void shouldIncludeAllHeaderField(String headerName) { - var resultHeaderMap = adapter.createHeaderMap(document); - - assertThat(resultHeaderMap).containsEntry(headerName, headerMap.get(headerName)); - } - - private static Stream<Arguments> headerNames() { - return HEADER_ATTRIBUTE_NAMES.stream().map(Arguments::of); - } - - @DisplayName("should include custom header field") - @ParameterizedTest - @MethodSource("customHeaderNames") - void shouldIncludeAllCustomHeaderField(String headerName) { - var resultHeaderMap = adapter.createHeaderMap(document); - - assertThat(resultHeaderMap).containsEntry(headerName, headerMap.get(headerName)); - } - - private static Stream<Arguments> customHeaderNames() { - return CUSTOM_HEADER_ATTRIBUTE_NAMES.stream().map(Arguments::of); - } - } - - @DisplayName("with empty fields") - @Nested - class TestWithEmptyFields { - @BeforeEach - void mock() { - document = buildXMLDocument("<root />"); - } - - @DisplayName("should include empty header field") - @ParameterizedTest - @MethodSource("headerNames") - void shouldIncludeAllHeaderField(String headerName) { - var resultHeaderMap = adapter.createHeaderMap(document); - - assertThat(resultHeaderMap).containsEntry(headerName, ""); - } - - private static Stream<Arguments> headerNames() { - return HEADER_ATTRIBUTE_NAMES.stream().map(Arguments::of); - } - - @DisplayName("should not include custom header field") - @ParameterizedTest - @MethodSource("customHeaderNames") - void shouldNotIncludeAllCustomHeaderField(String headerName) { - var resultHeaderMap = adapter.createHeaderMap(document); - - assertThat(resultHeaderMap).doesNotContainKey(headerName); - } - - private static Stream<Arguments> customHeaderNames() { - return CUSTOM_HEADER_ATTRIBUTE_NAMES.stream().map(Arguments::of); - } - } - } - - @DisplayName("adapt by representation") - @Nested - class TestAdaptByRepresentation { - - @Mock - private FormData formData; - - @DisplayName("should throw exception without xml document") - @Test - void shouldThrowExceptionWithoutXmlDocument() { - doReturn(Optional.empty()) - .when(adapter).findIntelliFormXMLRepresentation(formData); - - assertThrows(TechnicalException.class, () -> - adapter.adaptByRepresentations(formData) - ); - } - - @DisplayName("with xml document") - @Nested - class TestWithXmlDocument { - - @Mock - private IncomingFileGroup attachmentGroup; - - @Mock - private IncomingFile xmlRepresentation; - - @Mock - private IncomingFile otherRepresentation; - - @Mock - private Document document; - - @Mock - private Map<String, Object> headerFields; - - private List<IncomingFileGroup> attachments; - private List<IncomingFile> representations; - - @BeforeEach - void mock() { - attachments = List.of(attachmentGroup); - representations = List.of(xmlRepresentation, otherRepresentation); - - when(formData.getRepresentations()).thenReturn(representations); - when(formData.getAttachments()).thenReturn(attachments); - doReturn(Optional.of(document)).when(adapter).findIntelliFormXMLRepresentation(formData); - - doReturn(Map.of(DOCUMENT_TEST_KEY, DOCUMENT_TEST_VALUE).entrySet().stream()) - .when(adapter).getFormDataEntriesFromDocument(document, attachments); - - doReturn(headerFields) - .when(adapter).createHeaderMap(document); - } - - @DisplayName("should have document field") - @Test - void shouldHaveDocumentField() { - var documentValue = obtainMappingByKey(DOCUMENT_TEST_KEY); - - assertThat(documentValue).isEqualTo(DOCUMENT_TEST_VALUE); - } - - @DisplayName("should have header field") - @Test - void shouldHaveHeaderField() { - var headerValue = obtainMappingByKey(HEADER_FIELD); - - assertThat(headerValue).isEqualTo(headerFields); - } - - private Object obtainMappingByKey(String key) { - var formDataResult = adapter.adaptByRepresentations(formData); - - return formDataResult.getFormData().get(key); - } - - @DisplayName("should have attachments") - @Test - void shouldHaveAttachments() { - var formDataResult = adapter.adaptByRepresentations(formData); - - assertThat(formDataResult.getAttachments()).isEqualTo(attachments); - } - - @DisplayName("should have representations") - @Test - void shouldHaveRepresentations() { - var formDataResult = adapter.adaptByRepresentations(formData); - - assertThat(formDataResult.getRepresentations()).isEqualTo(representations); - } - } - } - - private Document buildXMLDocument(String xmlString) { - try { - return DocumentBuilderFactory.newInstance() - .newDocumentBuilder() - .parse(new InputSource(new StringReader(xmlString))); - } catch (ParserConfigurationException | IOException | SAXException e) { - throw new RuntimeException(e); - } - } - -} diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/intelliform/JsonServiceTest.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/intelliform/JsonServiceTest.java deleted file mode 100644 index c9212b4dc604a48ae5a085da63b7ac3d62720087..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/intelliform/JsonServiceTest.java +++ /dev/null @@ -1,99 +0,0 @@ -package de.ozgcloud.eingang.semantik.enginebased.afm.intelliform; - -import static org.assertj.core.api.Assertions.*; -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.*; - -import java.util.Collections; -import java.util.List; -import java.util.Map; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Mockito; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; - -import de.ozgcloud.common.errorhandling.TechnicalException; -import de.ozgcloud.eingang.semantik.enginebased.afm.intelliform.JsonService; -import lombok.SneakyThrows; - -class JsonServiceTest { - - @InjectMocks - private JsonService service; - @Mock - private ObjectMapper objectMapper; - - @DisplayName("Map form data") - @Nested - class TestMapFormData { - - @DisplayName("with invalid json") - @Nested - class TestWithInvalidJson { - - @SneakyThrows - @BeforeEach - void mockNode() { - when(objectMapper.readValue(anyString(), Mockito.<TypeReference<List<Map<String, Object>>>>any())) - .thenThrow(JsonProcessingException.class); - } - - @SneakyThrows - @Test - void shouldCallObjectMapper() { - try { - mapFormData(); - } catch (TechnicalException e) { - verify(objectMapper).readValue(anyString(), Mockito.<TypeReference<List<Map<String, Object>>>>any()); - } - } - - @Test - void shouldThrowTechnicalException() { - assertThatThrownBy(() -> mapFormData()) - .isInstanceOf(TechnicalException.class) - .hasMessageStartingWith("Error parsing JSON") - .hasMessageContaining("ExceptionId"); - } - } - - @DisplayName("with valid json") - @Nested - class TestWithValidJson { - - @SneakyThrows - @BeforeEach - void mockNode() { - when(objectMapper.readValue(anyString(), Mockito.<TypeReference<List<Map<String, Object>>>>any())) - .thenReturn(Collections.emptyList()); - } - - @SneakyThrows - @Test - void shouldCallObjectMapper() { - mapFormData(); - - verify(objectMapper).readValue(anyString(), Mockito.<TypeReference<List<Map<String, Object>>>>any()); - } - - @Test - void shouldReturnValue() { - var list = mapFormData(); - - assertThat(list).isEmpty(); - } - } - - private List<Map<String, Object>> mapFormData() { - return service.readAsListMap("{}"); - } - } -} diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/intelliform/XmlToJavaMapsMapperTest.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/intelliform/XmlToJavaMapsMapperTest.java deleted file mode 100644 index 37df5097b555ee8308b53570108c02024fc2745f..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/intelliform/XmlToJavaMapsMapperTest.java +++ /dev/null @@ -1,329 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.semantik.enginebased.afm.intelliform; - -import static org.assertj.core.api.Assertions.*; -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.*; - -import java.util.Collections; -import java.util.List; -import java.util.Map; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.w3c.dom.Document; -import org.w3c.dom.Node; - -import de.ozgcloud.common.errorhandling.TechnicalException; - -class XmlToJavaMapsMapperTest { - - @InjectMocks - private XmlToJavaMapsMapper mapper = new XmlToJavaMapsMapper(); - @Mock - private JsonService jsonService; - - private final Document document = mapper.parseAsW3cDocument( - XmlToJavaMapsMapperTest.class.getResourceAsStream("/intelliform/SimpleFormDataMapperTestFile.xml")); - - @Test - void testSimpleNode() { - - Map<String, Object> formData = mapXmlToJavaMaps(); - - assertThat(formData).containsKey("simplenode"); - assertThat(formData.get("simplenode")).isInstanceOf(String.class).isEqualTo("simplenodevalue"); - } - - @Test - void testEmptyNodeNotMapped() { - - Map<String, Object> formData = mapXmlToJavaMaps(); - - assertThat(formData).doesNotContainKey("emptynode"); - } - - @Nested - class TestNestedMapNode { - - private static final String MAIN_NODE_NAME = "nestedmapnode"; - - @Test - void nestedMapNodeShouldBeMap() { - - Map<String, Object> formData = mapXmlToJavaMaps(); - - assertThat(formData).containsKey(MAIN_NODE_NAME); - assertThat(formData.get(MAIN_NODE_NAME)).isInstanceOf(Map.class); - } - - @Test - @SuppressWarnings("unchecked") - void nestedMapNodeShouldContainValues() { - - Map<String, Object> nestedMapNode = (Map<String, Object>) mapXmlToJavaMaps().get(MAIN_NODE_NAME); - - assertThat(nestedMapNode).hasSize(2) - .containsEntry("nestedmapnode1", "nestedmapnodevalue1") - .containsEntry("nestedmapnode2", "nestedmapnodevalue2"); - } - } - - @Nested - @SuppressWarnings("unchecked") - class TestNestedListNodeWithStrings { - - private static final String MAIN_NODE_NAME = "nestedlistnodewithstrings"; - private static final String NESTED_NODE_NAME = "nestednode"; - - @Test - void shouldContainNestedListWithStringsNode() { - - Map<String, Object> formData = mapXmlToJavaMaps(); - - assertThat(formData).containsKey(MAIN_NODE_NAME); - } - - @Test - void valuesShouldBeJavaList() { - - Map<String, Object> formData = mapXmlToJavaMaps(); - - Map<String, Object> mainNode = (Map<String, Object>) formData.get(MAIN_NODE_NAME); - - assertThat(mainNode).containsKey(NESTED_NODE_NAME).isInstanceOf(Map.class); - assertThat(mainNode.get(NESTED_NODE_NAME)).isInstanceOf(List.class); - } - - @Test - void shouldContainValues() { - - Map<String, Object> formData = mapXmlToJavaMaps(); - Map<String, Object> mainNode = (Map<String, Object>) formData.get(MAIN_NODE_NAME); - List<String> nestedList = (List<String>) mainNode.get(NESTED_NODE_NAME); - - assertThat(nestedList).hasSize(3).contains("nestedlistnodevalue1", "nestedlistnodevalue2", "nestedlistnodevalue3"); - } - } - - @Nested - @SuppressWarnings("unchecked") - class TestNestedListNodeWithObjects { - - private static final String MAIN_NODE_NAME = "nestedlistnodewithmap"; - private static final String NESTED_NODE_NAME = "nestednode"; - - @Test - void shouldContainNestedListWithObjectsNode() { - - Map<String, Object> formData = mapXmlToJavaMaps(); - - assertThat(formData).containsKey(MAIN_NODE_NAME); - } - - @Test - void valuesShouldBeJavaList() { - - Map<String, Object> formData = mapXmlToJavaMaps(); - - Map<String, Object> mainNode = (Map<String, Object>) formData.get(MAIN_NODE_NAME); - - assertThat(mainNode).containsKey(NESTED_NODE_NAME).isInstanceOf(Map.class); - assertThat(mainNode.get(NESTED_NODE_NAME)).isInstanceOf(List.class); - } - - @Test - void shouldContainTwoElements() { - - Map<String, Object> formData = mapXmlToJavaMaps(); - List<Object> nestedList = getNestedList(formData); - - assertThat(nestedList).hasSize(2); - } - - @Test - void validateLevel2ValuesOfMap1() { - - Map<String, Object> formData = mapXmlToJavaMaps(); - List<Object> nestedList = getNestedList(formData); - - Map<String, Object> map1 = (Map<String, Object>) nestedList.get(0); - - assertThat(map1).hasSize(1) - .containsEntry("level2", "nestedlistnodevalue1"); - } - - @Test - void validateLevel2ValuesOfMap2() { - - Map<String, Object> formData = mapXmlToJavaMaps(); - List<Object> nestedList = getNestedList(formData); - - Map<String, Object> map2 = (Map<String, Object>) nestedList.get(1); - - assertThat(map2).hasSize(1); - assertThat(map2.get("level2")).isInstanceOf(List.class); - - List<String> map21 = (List<String>) map2.get("level2"); - assertThat(map21).contains("nestedlistnodevalue1", "nestedlistnodevalue2", "nestedlistnodevalue3"); - } - - private List<Object> getNestedList(Map<String, Object> formData) { - Map<String, Object> mainNode = (Map<String, Object>) formData.get(MAIN_NODE_NAME); - List<Object> nestedList = (List<Object>) mainNode.get(NESTED_NODE_NAME); - return nestedList; - } - } - - @Nested - class TestParseFile { - - private static final String FILE = "file"; - - @Nested - class TestParseFileList { - - private static final String LIST_FILE_PARENT = "list_file_parent"; - private static final String LIST_FILE_PARENT_ITEM = "list_file_parent-item"; - - @Test - void shouldMapAttributesOnListFirstElement() { - var javaMap = mapXmlToJavaMaps(); - - assertThat(getListItemFile(javaMap, 0)) - .containsEntry("id", "assistants.21B483DAA2DC7900C1D1135E566D0F672CB42832") - .containsEntry("content-type", "image/jpeg") - .containsEntry("description", "file description for first list file") - .containsEntry("length", "1184319") - .containsEntry("text", "20210326_133516[1].jpg"); - } - - @Test - void shouldMapAttributesOnListSecondElement() { - var javaMap = mapXmlToJavaMaps(); - - assertThat(getListItemFile(javaMap, 1)) - .containsEntry("id", "assistants.2F1FF737CF4F23191C1952091CB342254EE22A37") - .containsEntry("content-type", "image/jpeg") - .containsEntry("description", "file description for second list file") - .containsEntry("length", "1384037") - .containsEntry("text", "20210326_133526[1].jpg"); - } - - @SuppressWarnings("unchecked") - private Map<String, Object> getListItemFile(Map<String, Object> map, int index) { - var listFileParent = (Map<String, Object>) map.get(LIST_FILE_PARENT); - var listFileParentItem = (List<?>) listFileParent.get(LIST_FILE_PARENT_ITEM); - var firstFileItem = (Map<String, Object>) listFileParentItem.get(index); - return (Map<String, Object>) firstFileItem.get(FILE); - } - } - - @Nested - class TestParseSingleFile { - - private static final String SINGLE_FILE_PARENT = "single_file_parent"; - private static final String SINGLE_FILE_PARENT_ITEM = "single_file_parent-item"; - - @Test - void shouldMapAttributesOnSingleElement() { - var javaMap = mapXmlToJavaMaps(); - - assertThat(getSingleItemFile(javaMap)) - .containsEntry("id", "assistants.B20451156C677116B91A4EF2D1E859837B6CE510") - .containsEntry("content-type", "image/jpeg") - .containsEntry("description", "file description for single file") - .containsEntry("length", "3066416") - .containsEntry("text", "20210324_103054[1].jpg"); - } - - @SuppressWarnings("unchecked") - private Map<String, Object> getSingleItemFile(Map<String, Object> map) { - var singleFileParent = (Map<String, Object>) map.get(SINGLE_FILE_PARENT); - var singleFileParentItem = (Map<String, Object>) singleFileParent.get(SINGLE_FILE_PARENT_ITEM); - return (Map<String, Object>) singleFileParentItem.get(FILE); - } - } - } - - @DisplayName("Get content value") - @Nested - class TestGetContentValue { - - @DisplayName("from json node") - @Nested - class TestJsonNode { - - private static final String VALID_EMPTY_JSON = "{}"; - - @Mock - private Node node; - - @BeforeEach - void mockNode() { - when(node.getNodeName()).thenReturn(XmlToJavaMapsMapper.REST_RESPONSE_NAME); - } - - @Test - void shouldCallJSONService() { - getContentValue(); - - verify(jsonService).readAsListMap(any()); - } - - @Test - void shouldReturnValueOnValidJson() { - var expectedValue = Collections.<Map<String, Object>>emptyList(); - when(jsonService.readAsListMap(anyString())).thenReturn(expectedValue); - - var value = getContentValue(); - - assertThat(value).isEqualTo(expectedValue); - } - - @Test - void shouldReturnEmptyListOnException() { - when(jsonService.readAsListMap(anyString())).thenThrow(TechnicalException.class); - - var value = getContentValue(); - - assertThat(value).isEmpty(); - } - - @SuppressWarnings("unchecked") - private List<Object> getContentValue() { - return (List<Object>) mapper.getContentValue(node, VALID_EMPTY_JSON); - } - } - } - - private Map<String, Object> mapXmlToJavaMaps() { - return mapper.mapXmlToJavaMaps(document); - } -} diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/dfoerdermittel/DFoerdermittelEngineBasedSemantikAdapterTest.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/dfoerdermittel/DFoerdermittelEngineBasedSemantikAdapterTest.java deleted file mode 100644 index 512d0a840d9c9018c5eb0b3c81495b470636f8e1..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/dfoerdermittel/DFoerdermittelEngineBasedSemantikAdapterTest.java +++ /dev/null @@ -1,340 +0,0 @@ -package de.ozgcloud.eingang.semantik.enginebased.dfoerdermittel; - -import static de.ozgcloud.eingang.semantik.enginebased.dfoerdermittel.DFoerdermittelEngineBasedSemantikAdapter.*; -import static de.ozgcloud.eingang.semantik.enginebased.dfoerdermittel.DFoerdermittelFormDataTestFactory.*; -import static org.assertj.core.api.Assertions.*; -import static org.assertj.core.api.InstanceOfAssertFactories.*; -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.*; - -import java.util.Collections; -import java.util.Map; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Spy; - -import de.ozgcloud.common.binaryfile.TempFileUtils; -import de.ozgcloud.common.test.TestUtils; -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.common.formdata.FormDataTestFactory; -import de.ozgcloud.eingang.common.formdata.IncomingFile; -import de.ozgcloud.eingang.common.formdata.PostfachAddressTestFactory; -import de.ozgcloud.eingang.common.formdata.ServiceKontoTestFactory; -import de.ozgcloud.eingang.common.formdata.StringBasedIdentifier; -import de.ozgcloud.eingang.common.formdata.ZustaendigeStelle; -import de.ozgcloud.eingang.common.formdata.ZustaendigeStelleTestFactory; -import de.ozgcloud.eingang.semantik.common.ServiceKontoFactory; - -class DFoerdermittelEngineBasedSemantikAdapterTest { - - @Spy - @InjectMocks - private DFoerdermittelEngineBasedSemantikAdapter adapter; - - @Mock - private ServiceKontoFactory serviceKontoFactory; - - @Nested - class TestIsResponsible { - - @Test - void shouldBeTrueWithFachnachricht() { - var responsible = adapter.isResponsible(createWithFachnachricht()); - - assertThat(responsible).isTrue(); - } - - @Test - void shouldBeFalseForOuther() { - var responsible = adapter.isResponsible(FormDataTestFactory.create()); - - assertThat(responsible).isFalse(); - } - } - - @Nested - class TestParseFachnachricht { - - @Nested - class ExtractData { - @Test - void shouldHaveFormData() { - var result = adapter.extractFormDataFormXML(TestUtils.loadFile("xta/Beispieldatensatz_Fachnachricht.xml")); - - assertThat(result).isNotNull(); - } - - @Test - void shouldHavePages() { - var result = adapter.extractFormDataFormXML(TestUtils.loadFile("xta/Beispieldatensatz_Fachnachricht.xml")); - - assertThat(result).containsKey("Pages"); - } - - @Test - void shouldHaveInboxRef() { - var result = adapter.extractFormDataFormXML(TestUtils.loadFile("xta/Beispieldatensatz_Fachnachricht.xml")); - - assertThat(result).containsEntry("InboxReference", "sh/sh/4dd01647-b9d9-4775-1b50-08da3d83800a"); - } - } - - @Nested - class HandleFachnachrichtData { - - private final Map<String, Object> extracted = Map.of("name", "Theo"); - - @Test - void shouldCallExtractData() { - doReturn(extracted).when(adapter).extractFormDataFormXML(any()); - - adapter.parseFachnachricht(createWithFachnachricht(), createFachnachrichtFile()); - - verify(adapter).extractFormDataFormXML(notNull()); - } - - @Test - void shouldAddMap() { - doReturn(extracted).when(adapter).extractFormDataFormXML(any()); - - var result = adapter.parseFachnachricht(createWithFachnachricht(), createFachnachrichtFile()); - - assertThat(result.getFormData()).containsEntry("Fachnachricht", extracted); - } - - @Test - void shouldIgnoreEmptyData() { - doReturn(Collections.emptyMap()).when(adapter).extractFormDataFormXML(any()); - - var result = adapter.parseFachnachricht(createWithFachnachricht(), createFachnachrichtFile()); - - assertThat(result.getFormData()).doesNotContainKey("Fachnachricht"); - } - } - } - - FormData createWithFachnachricht() { - - return FormData.builder() - .formData(Collections.emptyMap()) - .representation(createFachnachrichtFile()).build(); - } - - IncomingFile createFachnachrichtFile() { - var tmpFile = TempFileUtils.writeTmpFile(TestUtils.loadFile("xta/Beispieldatensatz_Fachnachricht.xml")); - - return IncomingFile.builder() - .file(tmpFile) - .contentType("application/xml") - .size(1283) - .name("Beispieldatensatz_Fachnachricht.xml") - .build(); - } - - @Nested - class TestProcessFachnachricht { - - @Mock - FormData formData0; - - @Mock - FormData formData1; - - @Mock - FormData formData2; - - @Mock - FormData formData3; - - @Mock - FormData formData4; - - @Mock - FormData formData5; - - @BeforeEach - void mock() { - doReturn(formData1).when(adapter).addFormName(formData0); - doReturn(formData2).when(adapter).addFormEngineName(formData1); - doReturn(formData3).when(adapter).addServiceKonto(formData2); - doReturn(formData4).when(adapter).addOrganisationsEinheitId(formData3); - doReturn(formData5).when(adapter).addFormId(formData4); - } - - @Test - void shouldReturn() { - var processedFormData = adapter.processFachnachricht(formData0); - - assertThat(processedFormData).isEqualTo(formData5); - } - } - - @Nested - class TestAddServiceKonto { - - @BeforeEach - void init() { - when(serviceKontoFactory.buildOsiServiceKonto(any())).thenReturn(ServiceKontoTestFactory.create()); - } - - @Test - void shouldHaveServiceKonto() { - var formData = adapter.addServiceKonto(DFoerdermittelFormDataTestFactory.create()); - - assertThat(formData.getHeader().getServiceKonto().getPostfachAddresses().getFirst().getIdentifier()) - .asInstanceOf(type(StringBasedIdentifier.class)).extracting(StringBasedIdentifier::getPostfachId) - .isEqualTo(PostfachAddressTestFactory.POSTFACH_ID); - } - - @Test - void shouldRemovePrefix() { - adapter.addServiceKonto(DFoerdermittelFormDataTestFactory.create()); - - verify(serviceKontoFactory).buildOsiServiceKonto(DFoerdermittelFormDataTestFactory.POSTFACH_ID); - } - } - - @Nested - class TestExtractPrefix { - @Test - void shouldRemoveAllBeforeLastSlash() { - var result = adapter.extractPrefix("bla/bla/bla/12345"); - - assertThat(result).isEqualTo("12345"); - } - - @Test - void shouldBeFineWithoutSlash() { - var result = adapter.extractPrefix("12345"); - - assertThat(result).isEqualTo("12345"); - } - } - - @Nested - class TestAddOrganisationsEinheitId { - - @DisplayName("with no existing zustaendige stelles") - @Nested - class TestWithNoExistingZustaendigeStelles { - @Test - void shouldHaveOrganisationsEinheitId() { - var inputFormData = DFoerdermittelFormDataTestFactory.createBuilder() - .clearZustaendigeStelles() - .build(); - - var formData = adapter.addOrganisationsEinheitId(inputFormData); - - assertThat(formData.getZustaendigeStelles()) - .extracting(ZustaendigeStelle::getOrganisationseinheitenId) - .containsExactly(ORGANISATIONS_EINHEIT_ID); - } - } - - @DisplayName("with one existing zustaendige stelle") - @Nested - class TestWithOneExistingZustaendigeStelle { - - @Test - void shouldHaveOrganisationsEinheitId() { - var formData = adapter.addOrganisationsEinheitId(DFoerdermittelFormDataTestFactory.create()); - - assertThat(formData.getZustaendigeStelles()) - .extracting(ZustaendigeStelle::getOrganisationseinheitenId) - .containsExactly(ZustaendigeStelleTestFactory.ORGANISATIONSEINHEIT_ID, ORGANISATIONS_EINHEIT_ID); - } - - @DisplayName("should log error for existing zustaendige stelle") - @Test - void shouldLogErrorForExistingZustaendigeStelle() { - adapter.addOrganisationsEinheitId(DFoerdermittelFormDataTestFactory.create()); - - verify(adapter).logErrorForExistingZustaendigeStelle(); - } - } - } - - @Nested - class TestAddFormName { - - @DisplayName("should have form name from title") - @Test - void shouldHaveFormNameFromTitle() { - var formData = adapter.addFormName(createFormDataWithTitle(FORM_NAME)); - - assertThat(formData.getHeader().getFormName()).isEqualTo(FORM_NAME); - } - - @DisplayName("should have default form name for empty title") - @Test - void shouldHaveDefaultFormNameForEmptyTitle() { - var formData = adapter.addFormName(createFormDataWithTitle("")); - - assertThat(formData.getHeader().getFormName()).isEqualTo(DEFAULT_FORM_NAME); - } - - @DisplayName("should have default form name for missing title") - @Test - void shouldHaveDefaultFormNameForMissingTitle() { - var formData = adapter.addFormName(createFormDataWithTitle(null)); - - assertThat(formData.getHeader().getFormName()).isEqualTo(DEFAULT_FORM_NAME); - } - - FormData createFormDataWithTitle(String title) { - return createFachnachrichtBuilder().title(title).build().createFormData(); - } - - } - - @DisplayName("add form id") - @Nested - class TestAddFormId { - - @DisplayName("should get form id from project title") - @Test - void shouldGetFormIdFromProjectTitle() { - var formData = adapter.addFormId(createFormDataWithProjectTitle(FORM_ID)); - - assertThat(formData.getHeader().getFormId()).isEqualTo(FORM_ID); - } - - @DisplayName("should keep form id if project title is empty") - @Test - void shouldKeepFormIdIfProjectTitleIsEmpty() { - var formData = adapter.addFormId(createFormDataWithProjectTitle("")); - - assertThat(formData.getHeader().getFormId()).isEqualTo(DEFAULT_FORM_ID); - } - - @DisplayName("should keep form id if project title is null") - @Test - void shouldKeepFormIdIfProjectTitleIsNull() { - var formData = adapter.addFormId(createFormDataWithProjectTitle(null)); - - assertThat(formData.getHeader().getFormId()).isEqualTo(DEFAULT_FORM_ID); - } - - FormData createFormDataWithProjectTitle(String projectTitle) { - return createFachnachrichtBuilder().projectTitle(projectTitle).build().createFormData(); - } - - } - - @Nested - class TestAddFormEngineName { - - @Test - void shouldHaveFormEngineName() { - var formData = adapter.addFormEngineName(DFoerdermittelFormDataTestFactory.create()); - - assertThat(formData.getHeader().getFormEngineName()).isEqualTo("dFördermittelantrag"); - } - - } -} diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/dfoerdermittel/DFoerdermittelFormDataTestFactory.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/dfoerdermittel/DFoerdermittelFormDataTestFactory.java deleted file mode 100644 index 7bd4cc6a52d36405595a47500be02c2919066c6f..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/dfoerdermittel/DFoerdermittelFormDataTestFactory.java +++ /dev/null @@ -1,75 +0,0 @@ -package de.ozgcloud.eingang.semantik.enginebased.dfoerdermittel; - -import static java.util.stream.Collectors.*; - -import java.util.Map; -import java.util.Objects; -import java.util.function.Predicate; -import java.util.stream.IntStream; - -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.common.formdata.FormDataTestFactory; -import de.ozgcloud.eingang.common.formdata.FormHeaderTestFactory; -import lombok.Builder; - -class DFoerdermittelFormDataTestFactory { - - static final String FORM_NAME = "Name of form"; - static final String FORM_ID = "Wert von ProjectTitle"; - static final String POSTFACH_ID = "4dd01647-b9d9-4775-1b50-08da3d83800a"; - static final String ORGANISATIONS_EINHEIT_ID = "9795669"; - - static Fachnachricht.FachnachrichtBuilder createFachnachrichtBuilder() { - return Fachnachricht.builder() - .title(FORM_NAME) - .projectTitle(FORM_ID) - .postfachId(POSTFACH_ID) - .organisationsEinheitId(ORGANISATIONS_EINHEIT_ID); - } - - static FormData create() { - return createBuilder().build(); - } - - static FormData.FormDataBuilder createBuilder() { - return createBuilderWithFachnachricht(createFachnachrichtBuilder().build()); - } - - static FormData.FormDataBuilder createBuilderWithFachnachricht(Fachnachricht fachnachricht) { - return FormDataTestFactory.createBuilder() - .header(FormHeaderTestFactory.create()) - .formData(Map.of("Fachnachricht", createFachnachrichtMapWithFachnachricht(fachnachricht))); - } - - static Map<String, Object> createFachnachrichtMap() { - return createFachnachrichtMapWithFachnachricht(createFachnachrichtBuilder().build()); - } - - static Map<String, Object> createFachnachrichtMapWithFachnachricht(Fachnachricht fachnachricht) { - return createMapWithValueFilter( - Objects::nonNull, - "Title", fachnachricht.title(), - "ProjectTitle", fachnachricht.projectTitle(), - "InboxReference", "sh/sh/" + fachnachricht.postfachId(), - "MetaText1", fachnachricht.organisationsEinheitId() - ); - } - - private static Map<String, Object> createMapWithValueFilter(Predicate<String> valuePredicate, String... keyValuePairs) { - if (keyValuePairs.length % 2 != 0) { - throw new IllegalArgumentException("Array length must be even to form key-value pairs."); - } - - return IntStream.range(0, keyValuePairs.length / 2) - .boxed() - .filter(i -> valuePredicate.test(keyValuePairs[2 * i + 1])) - .collect(toMap(i -> keyValuePairs[2 * i], i -> keyValuePairs[2 * i + 1])); - } - - @Builder - record Fachnachricht(String title, String projectTitle, String postfachId, String organisationsEinheitId) { - FormData createFormData() { - return createBuilderWithFachnachricht(this).build(); - } - } -} diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/formcycle/FormCycleEngineBasedAdapterTest.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/formcycle/FormCycleEngineBasedAdapterTest.java deleted file mode 100644 index e0641a50fbb1a2ba63194226c9f83465db9d2076..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/formcycle/FormCycleEngineBasedAdapterTest.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.semantik.enginebased.formcycle; - -import static org.assertj.core.api.Assertions.*; -import static org.mockito.Mockito.*; - -import java.util.List; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.springframework.test.util.ReflectionTestUtils; - -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.common.formdata.FormDataTestFactory; - -class FormCycleEngineBasedAdapterTest { - - @InjectMocks - private FormCycleEngineBasedAdapter adapter; - - @Mock - private FormcycleEngineBasedMapper mapper; - @Mock - private FormData formData; - - @BeforeEach - void setup() { - ReflectionTestUtils.setField(adapter, "mappers", List.of(mapper)); - } - - @Test - void shouldParseFormData() { - adapter.parseFormData(formData); - - verify(mapper).parseFormData(formData); - } - - @Test - void shouldNotRemoveParsedFormData() { - when(mapper.parseFormData(any())).thenReturn(formData); - - var result = adapter.parseFormData(FormDataTestFactory.create()); - - assertThat(result).isSameAs(formData); - } -} diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/formcycle/FormcycleAntragstellerMapperTest.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/formcycle/FormcycleAntragstellerMapperTest.java deleted file mode 100644 index 4bcbc1cba5239aeffb34b319eb5d0d81b54bc5a7..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/formcycle/FormcycleAntragstellerMapperTest.java +++ /dev/null @@ -1,239 +0,0 @@ -package de.ozgcloud.eingang.semantik.enginebased.formcycle; - -import static org.assertj.core.api.Assertions.*; -import static org.mockito.Mockito.*; - -import java.util.HashMap; -import java.util.Map; -import java.util.Optional; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Spy; - -import de.ozgcloud.eingang.common.formdata.Antragsteller; -import de.ozgcloud.eingang.common.formdata.AntragstellerTestFactory; -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.common.formdata.FormDataTestFactory; - -class FormcycleAntragstellerMapperTest { - - @Spy - @InjectMocks - private FormcycleAntragstellerMapper mapper; - - private static final String VALUE_KEY = "value"; - private static final String LABEL_KEY = "label"; - - private Map<String, Object> antragstellerData = new HashMap<>(); - private Map<String, Object> antragstellerMap = Map.of("fsBKAllDaten", Map.of(VALUE_KEY, antragstellerData)); - - @Nested - class TestParseFormData { - - @Mock - private Antragsteller antragsteller; - - @Test - void shouldCallGetAntragsteller() { - mapper.parseFormData(buildFormData()); - - verify(mapper).getAntragstellerData(antragstellerMap); - } - - @Test - void shouldCallBuildAntragsteller() { - doReturn(Optional.of(antragstellerData)).when(mapper).getAntragstellerData(anyMap()); - - mapper.parseFormData(buildFormData()); - - verify(mapper).buildAntragsteller(antragstellerData); - } - - @Test - void shouldSetAntragsteller() { - doReturn(antragsteller).when(mapper).buildAntragsteller(anyMap()); - - var formData = mapper.parseFormData(buildFormData()); - - assertThat(formData.getAntragsteller()).isSameAs(antragsteller); - } - - @Test - void shouldReturnSameFormData() { - var formData = FormDataTestFactory.create(); - - var result = mapper.parseFormData(formData); - - assertThat(result).isSameAs(formData); - } - - FormData buildFormData() { - return FormData.builder().formData(antragstellerMap).build(); - } - } - - @Nested - class TestGetAntragstellerData { - - @Test - void shouldReturnEmpty() { - Map<String, Object> formDataMap = Map.of("key", "value"); - - var result = mapper.getAntragstellerData(formDataMap); - - assertThat(result).isEmpty(); - } - - @Test - void shouldReturnAntragstellerData() { - var result = mapper.getAntragstellerData(antragstellerMap); - - assertThat(result).contains(antragstellerData); - } - } - - @Nested - class TestBuildAntragsteller { - - @Test - void shouldSetAnrede() { - antragstellerData.put("tfAntragstellerAnrede", Map.of(VALUE_KEY, AntragstellerTestFactory.ANREDE, LABEL_KEY, "Anrede")); - - var result = buildAntragsteller(); - - assertThat(result.getAnrede()).isEqualTo(AntragstellerTestFactory.ANREDE); - } - - @Test - void shouldSetVorname() { - antragstellerData.put("tfAntragstellerVorname", Map.of(LABEL_KEY, "Vorname", VALUE_KEY, AntragstellerTestFactory.VORNAME)); - - var result = buildAntragsteller(); - - assertThat(result.getVorname()).isEqualTo(AntragstellerTestFactory.VORNAME); - } - - @Test - void shouldSetNachname() { - antragstellerData.put("tfAntragstellerName", Map.of(VALUE_KEY, AntragstellerTestFactory.NACHNAME, LABEL_KEY, "Nachname")); - - var result = buildAntragsteller(); - - assertThat(result.getNachname()).isEqualTo(AntragstellerTestFactory.NACHNAME); - } - - @Test - void shouldSetGeburtsname() { - antragstellerData.put("tfAntragstellerGeburtsname", Map.of(VALUE_KEY, AntragstellerTestFactory.GEBURTSNAME, LABEL_KEY, "Geburtsname")); - - var result = buildAntragsteller(); - - assertThat(result.getGeburtsname()).isEqualTo(AntragstellerTestFactory.GEBURTSNAME); - } - - @Test - void shouldSetGeburtsdatum() { - antragstellerData.put("tfAntragstellerGeburtsdatum", Map.of(VALUE_KEY, AntragstellerTestFactory.GEBURTSDATUM, LABEL_KEY, "Geburtsdatum")); - - var result = buildAntragsteller(); - - assertThat(result.getGeburtsdatum()).isEqualTo(AntragstellerTestFactory.GEBURTSDATUM); - } - - @Test - void shouldSetGeburtsort() { - antragstellerData.put("tfAntragstellerGeburtsort", Map.of(VALUE_KEY, AntragstellerTestFactory.GEBURTSORT, LABEL_KEY, "Geburtsort")); - - var result = buildAntragsteller(); - - assertThat(result.getGeburtsort()).isEqualTo(AntragstellerTestFactory.GEBURTSORT); - } - - @Test - void shouldSetEmail() { - antragstellerData.put("tfAntragstellerEmail", Map.of(VALUE_KEY, AntragstellerTestFactory.EMAIL, LABEL_KEY, "E-Mail")); - - var result = buildAntragsteller(); - - assertThat(result.getEmail()).isEqualTo(AntragstellerTestFactory.EMAIL); - } - - @Test - void shouldSetTelefon() { - antragstellerData.put("tfAntragstellerTelefon", Map.of(VALUE_KEY, AntragstellerTestFactory.TELEFON, LABEL_KEY, "Telefon")); - - var result = buildAntragsteller(); - - assertThat(result.getTelefon()).isEqualTo(AntragstellerTestFactory.TELEFON); - } - - @Test - void shouldSetAdresse() { - antragstellerData.put("tfAntragstellerAdresse", - Map.of(LABEL_KEY, "Adresse", VALUE_KEY, AntragstellerTestFactory.STRASSE + " " + AntragstellerTestFactory.HAUSNUMMER)); - - var result = buildAntragsteller(); - - assertThat(result.getStrasse()).isEqualTo(AntragstellerTestFactory.STRASSE + " " + AntragstellerTestFactory.HAUSNUMMER); - } - - @Test - void shouldSetPlz() { - antragstellerData.put("tfAntragstellerPLZ", Map.of(LABEL_KEY, "PLZ", VALUE_KEY, AntragstellerTestFactory.PLZ)); - - var result = buildAntragsteller(); - - assertThat(result.getPlz()).isEqualTo(AntragstellerTestFactory.PLZ); - } - - @Test - void shouldSetOrt() { - antragstellerData.put("tfAntragstellerOrt", Map.of(LABEL_KEY, "Ort", VALUE_KEY, AntragstellerTestFactory.ORT)); - - var result = buildAntragsteller(); - - assertThat(result.getOrt()).isEqualTo(AntragstellerTestFactory.ORT); - } - - Antragsteller buildAntragsteller() { - return mapper.buildAntragsteller(antragstellerData); - } - } - - @Nested - class TestBuildFirmaAntragsteller { - - @BeforeEach - void fillAntragstellerData() { - antragstellerData.put("tfOrgName", Map.of(VALUE_KEY, AntragstellerTestFactory.FIRMA_NAME, LABEL_KEY, "Firmenname")); - antragstellerData.put("tfAntragstellerAnrede", Map.of(VALUE_KEY, AntragstellerTestFactory.ANREDE, LABEL_KEY, "Anrede")); - antragstellerData.put("tfAntragstellerVorname", Map.of(LABEL_KEY, "Vorname", VALUE_KEY, AntragstellerTestFactory.VORNAME)); - antragstellerData.put("tfAntragstellerName", Map.of(VALUE_KEY, AntragstellerTestFactory.NACHNAME, LABEL_KEY, "Nachname")); - antragstellerData.put("tfAntragstellerGeburtsname", Map.of(VALUE_KEY, AntragstellerTestFactory.GEBURTSNAME, LABEL_KEY, "Geburtsname")); - antragstellerData.put("tfAntragstellerGeburtsdatum", Map.of(VALUE_KEY, AntragstellerTestFactory.GEBURTSDATUM, LABEL_KEY, "Geburtsdatum")); - antragstellerData.put("tfAntragstellerGeburtsort", Map.of(VALUE_KEY, AntragstellerTestFactory.GEBURTSORT, LABEL_KEY, "Geburtsort")); - antragstellerData.put("tfAntragstellerEmail", Map.of(VALUE_KEY, AntragstellerTestFactory.EMAIL, LABEL_KEY, "E-Mail")); - antragstellerData.put("tfAntragstellerTelefon", Map.of(VALUE_KEY, AntragstellerTestFactory.TELEFON, LABEL_KEY, "Telefon")); - antragstellerData.put("tfAntragstellerAdresse", - Map.of(LABEL_KEY, "Adresse", VALUE_KEY, AntragstellerTestFactory.STRASSE + " " + AntragstellerTestFactory.HAUSNUMMER)); - antragstellerData.put("tfAntragstellerPLZ", Map.of(LABEL_KEY, "PLZ", VALUE_KEY, AntragstellerTestFactory.PLZ)); - antragstellerData.put("tfAntragstellerOrt", Map.of(LABEL_KEY, "Ort", VALUE_KEY, AntragstellerTestFactory.ORT)); - } - - @Test - void shouldMapFirmaData() { - var expectedAntragsteller = AntragstellerTestFactory.createFirmBuilder() - .strasse("%s %s".formatted(AntragstellerTestFactory.STRASSE, AntragstellerTestFactory.HAUSNUMMER)) - .hausnummer(null).postfachId(null).data(null).build(); - - var result = mapper.buildAntragsteller(antragstellerData); - - assertThat(result).usingRecursiveComparison().isEqualTo(expectedAntragsteller); - } - - } -} \ No newline at end of file diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/formsolutions/FormSolutionsAntragstellerMapperTest.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/formsolutions/FormSolutionsAntragstellerMapperTest.java deleted file mode 100644 index 768bb91077b604222bec7b092009fb365cc1e1c3..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/formsolutions/FormSolutionsAntragstellerMapperTest.java +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.semantik.enginebased.formsolutions; - -import static de.ozgcloud.eingang.common.formdata.AntragstellerTestFactory.*; -import static de.ozgcloud.eingang.common.formdata.FormDataTestFactory.*; -import static de.ozgcloud.eingang.semantik.enginebased.formsolutions.FormSolutionsAntragstellerMapper.*; -import static de.ozgcloud.eingang.semantik.enginebased.formsolutions.FormSolutionsEngineBasedAdapter.*; -import static de.ozgcloud.eingang.semantik.enginebased.formsolutions.FormSolutionsPanelMapper.*; -import static org.assertj.core.api.Assertions.*; -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.*; - -import java.util.List; -import java.util.Map; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.mockito.Spy; - -import de.ozgcloud.eingang.common.formdata.Antragsteller; -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.common.formdata.FormDataTestFactory; -import de.ozgcloud.eingang.semantik.enginebased.formsolutions.FormSolutionsAntragstellerMapper; -import de.ozgcloud.eingang.semantik.enginebased.formsolutions.IdentifierValueParser; - -class FormSolutionsAntragstellerMapperTest { - - @Spy - private final FormSolutionsAntragstellerMapper mapper = new FormSolutionsAntragstellerMapper(); - - @DisplayName("Parse formData") - @Nested - class TestParseFormData { - private static final String ANTRAGSTELLER_NAME_PANEL_IDENTIFIER = "AS_Name1"; - private static final List<Map<String, Object>> ANTRAGSTELLER_PANEL_CONTENT_LIST = List.of( - Map.of(IDENTIFIER_KEY, ANTRAGSTELLER_NAME_PANEL_IDENTIFIER), - Map.of(COMPONENTS, List.of( - Map.of(IDENTIFIER_KEY, VORNAME_KEY, STRING_VALUE, VORNAME), - Map.of(IDENTIFIER_KEY, NACHNAME_KEY, STRING_VALUE, NACHNAME)))); - - private static final Map<String, Object> ASSISTANT_MAP = Map.of(PANELS, List.of( - Map.of(IDENTIFIER_KEY, ANTRAGSTELLER_PANEL_IDENTIFIER), - Map.of(COMPONENTS, ANTRAGSTELLER_PANEL_CONTENT_LIST))); - - private final FormData formData = FormDataTestFactory.createBuilder().antragsteller(null) - .formData(Map.of( - SIMPLE_VALUE_KEY, SIMPLE_VALUE, - FormSolutionsAntragstellerMapper.POSTKORBHANDLE, POSTFACH_ID, - ASSISTANT, ASSISTANT_MAP)) - .build(); - - @Test - void shouldParseAntragsteller() { - var expectedAntragsteller = Antragsteller.builder().vorname(VORNAME).nachname(NACHNAME).postfachId(POSTFACH_ID).build(); - var identifierValueMap = Map.of(VORNAME_KEY, VORNAME, NACHNAME_KEY, NACHNAME); - try (var valuesParser = mockStatic(IdentifierValueParser.class)) { - valuesParser.when(() -> IdentifierValueParser.parsePanelsData(any())).thenReturn(identifierValueMap); - - var resultFormData = parseFormData(); - - assertThat(resultFormData.getAntragsteller()).usingRecursiveComparison().isEqualTo(expectedAntragsteller); - } - } - - @Test - @DisplayName("should process Antragsteller data only") - void shouldNotChangeAnother() { - var resultFormData = parseFormData(); - - assertThat(resultFormData).usingRecursiveComparison().ignoringFields("antragsteller", "formData").isEqualTo(formData); - assertThat(resultFormData.getFormData()).containsAllEntriesOf( - Map.of(SIMPLE_VALUE_KEY, FormDataTestFactory.SIMPLE_VALUE, ASSISTANT, ASSISTANT_MAP)); - } - - private FormData parseFormData() { - return mapper.parseFormData(formData); - } - - @DisplayName("build antragsteller") - @Nested - class TestBuildAntragsteller { - - @Test - void shouldHaveVorname() { - var antragsteller = buildAntragsteller(); - - assertThat(antragsteller.getVorname()).isEqualTo(VORNAME); - } - - @Test - void shouldHaveNachname() { - var antragsteller = buildAntragsteller(); - - assertThat(antragsteller.getNachname()).isEqualTo(NACHNAME); - } - - @Test - void shouldHavePostfachId() { - var antragsteller = buildAntragsteller(); - - assertThat(antragsteller.getPostfachId()).isEqualTo(POSTFACH_ID); - } - - private Antragsteller buildAntragsteller() { - return mapper.buildAntragsteller(formData); - } - } - } -} \ No newline at end of file diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/formsolutions/FormSolutionsEngineBasedAdapterITCase.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/formsolutions/FormSolutionsEngineBasedAdapterITCase.java deleted file mode 100644 index 974eb2a59be5dea1e0097b5f810566965332f3fe..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/formsolutions/FormSolutionsEngineBasedAdapterITCase.java +++ /dev/null @@ -1,289 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.semantik.enginebased.formsolutions; - -import static de.ozgcloud.eingang.semantik.enginebased.formsolutions.FormSolutionsEngineBasedAdapter.*; -import static org.assertj.core.api.Assertions.*; - -import java.io.File; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.Map; -import java.util.Optional; - -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.boot.test.mock.mockito.SpyBean; -import org.springframework.test.context.ActiveProfiles; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; - -import de.ozgcloud.common.binaryfile.TempFileUtils; -import de.ozgcloud.common.test.TestUtils; -import de.ozgcloud.eingang.common.errorhandling.TechnicalException; -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.common.formdata.FormDataTestFactory; -import de.ozgcloud.eingang.common.formdata.IncomingFileGroupTestFactory; -import de.ozgcloud.eingang.common.formdata.IncomingFileTestFactory; -import de.ozgcloud.eingang.common.formdata.ZustaendigeStelle; -import de.ozgcloud.eingang.semantik.SemantikAdapter; -import lombok.SneakyThrows; - -@SpringBootTest -@ActiveProfiles({ "local", "itcase" }) -public class FormSolutionsEngineBasedAdapterITCase { - - private static final String ZIP_CONTENT_TYPE = "application/zip"; - private static final String FILE_NAME_ZIP_ATTACHMENT = "formsolutions/attachment-2files.zip"; - - @MockBean - private SemantikAdapter semantikAdapter; - - @SpyBean - private FormSolutionsEngineBasedAdapter engineAdapter; - - private ObjectMapper objectMapper = new ObjectMapper(); - - @Nested - class TestEngineBasedAdapter { - - private FormData formData = prepareTestData(); - - @Test - void shouldMap() { - var data = engineAdapter.parseFormData(formData); - - assertThat(data).isNotNull(); - } - - @Test - void shouldRemoveRawData() { - var data = engineAdapter.parseFormData(formData); - - assertThat(data.getFormData().get(ASSISTANT)).isNull(); - } - - @Nested - class TestAntragsteller { - @Test - void shouldMap() { - var data = engineAdapter.parseFormData(formData); - - assertThat(data.getAntragsteller()).isNotNull(); - } - - @Test - void shouldMapVorname() { - var data = engineAdapter.parseFormData(formData); - - assertThat(data.getAntragsteller().getVorname()).isEqualTo("OZG-Cloud"); - } - - @Test - void shouldMapNachname() { - var data = engineAdapter.parseFormData(formData); - - assertThat(data.getAntragsteller().getNachname()).isEqualTo("Team"); - } - } - - @Nested - class TestAttachments { - @Test - void shouldBeEmptyForNoAttachments() { - var data = engineAdapter.parseFormData(FormDataTestFactory.createBuilder().clearAttachments().build()); - - assertThat(data.getAttachments()).isEmpty(); - } - - @Test - void shouldMap() { - var data = engineAdapter.parseFormData(formData); - - assertThat(data.getAttachments()).isNotEmpty(); - } - - @Test - void shouldMapAttachment() { - var data = engineAdapter.parseFormData(formData); - - assertThat(data.getAttachments().get(0)).isNotNull(); - assertThat(data.getNumberOfAttachments()).isEqualTo(2); - } - } - - @Nested - class TestHeader { - @Test - void shouldMap() { - var data = engineAdapter.parseFormData(formData); - - assertThat(data.getHeader()).isNotNull(); - } - - @Test - void shouldMapRequestId() { - var data = engineAdapter.parseFormData(formData); - - assertThat(data.getHeader().getRequestId()).isEqualTo("KFAS_KOP_TEST-yCkgCdqG"); - } - - @Test - void shouldMapFormName() { - var data = engineAdapter.parseFormData(formData); - - assertThat(data.getHeader().getFormName()).isEqualTo("KFAS_KOP_TEST"); - } - - @Test - void shouldMapFormId() { - var data = engineAdapter.parseFormData(formData); - - assertThat(data.getHeader().getFormId()).isEqualTo("KFAS_KOP_TEST"); - } - } - - @Nested - class TestPanels { - - @Test - void shouldMap() { - var data = engineAdapter.parseFormData(formData).getFormData(); - - assertThat(data).isNotNull(); - } - - @Test - void shouldMapIdentifier() { - var data = engineAdapter.parseFormData(formData).getFormData(); - - assertThat(data).containsKey("Panel_0"); - } - - @Test - void shouldMapComponents() { - var data = engineAdapter.parseFormData(formData).getFormData(); - - assertThat(getPanel0(data)).isNotNull(); - } - - @Test - void shouldMapComponentIdentifier() { - var data = engineAdapter.parseFormData(formData).getFormData(); - - assertThat(getPanel0(data)).containsKey("1208_Hund Grunddaten"); - } - - @Test - @SuppressWarnings("unchecked") - void shouldMapNestedComponents() { - var data = engineAdapter.parseFormData(formData).getFormData(); - - assertThat((Map<String, Object>) getPanel0(data).get("1208_Hund Grunddaten")).isNotNull(); - } - - @Test - @SuppressWarnings("unchecked") - void shouldMapNestedSubComponentIdentifier() { - var data = engineAdapter.parseFormData(formData).getFormData(); - - assertThat((Map<String, Object>) getPanel0(data).get("1208_Hund Grunddaten")) - .containsKey("1208_Hund Grunddaten"); - } - - @Test - @SuppressWarnings("unchecked") - void shouldMapNestedSubComponents() { - var data = engineAdapter.parseFormData(formData).getFormData(); - - assertThat((Map<String, Object>) ((Map<String, Object>) (getPanel0(data)).get("1208_Hund Grunddaten")) - .get("1208_Hund Grunddaten")).containsKey("Hund_Name"); - } - - @SuppressWarnings("unchecked") - private Map<String, Object> getPanel0(Map<String, Object> data) { - return ((Map<String, Object>) data.get("Panel_0")); - } - } - - @Nested - class TestZutaendigeStelle { - @Test - void shouldMap() { - var data = engineAdapter.parseFormData(formData); - - assertThat(data.getZustaendigeStelles()).isNotNull().isNotEmpty(); - } - - @Test - void shouldMapOrganistaionseinheitenId() { - var data = engineAdapter.parseFormData(formData); - - assertThat(data.getZustaendigeStelles()) - .extracting(ZustaendigeStelle::getOrganisationseinheitenId) - .containsExactly("test"); - } - } - } - - private FormData prepareTestData() { - var fileGroup = IncomingFileGroupTestFactory.createBuilder() - .name(FormSolutionsFilesMapper.FILE_GROUP_ZIP_NAME) - .clearFiles() - .file(IncomingFileTestFactory.createBuilder() - .name(FILE_NAME_ZIP_ATTACHMENT) - .file(asFile(FILE_NAME_ZIP_ATTACHMENT)) - .size(getFileSize(FILE_NAME_ZIP_ATTACHMENT)) - .contentType(ZIP_CONTENT_TYPE) - .build()) - .build(); - - return FormData.builder().formData(getTestDataFromFile()).attachment(fileGroup).build(); - } - - @SneakyThrows - private long getFileSize(String fileName) { - Path filePath = Path.of(FormSolutionsEngineBasedAdapterITCase.class.getClassLoader().getResource(fileName).toURI()); - return Files.size(filePath); - } - - private Map<String, Object> getTestDataFromFile() { - try { - var testData = TestUtils.loadTextFile("formsolutions001.json"); - return objectMapper.readValue(testData, new TypeReference<>() { - }); - } catch (JsonProcessingException e) { - var msg = Optional.ofNullable(e.getCause()).map(Throwable::getMessage).orElseGet(e::getMessage); - throw new TechnicalException("Error parsing test JSON " + msg, e); - } - } - - private File asFile(String path) { - return TempFileUtils.writeTmpFile(TestUtils.loadFile(path)); - } -} diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/formsolutions/FormSolutionsEngineBasedAdapterTest.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/formsolutions/FormSolutionsEngineBasedAdapterTest.java deleted file mode 100644 index c7fbb383b75aff80587715d6c4874b8ebc052c51..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/formsolutions/FormSolutionsEngineBasedAdapterTest.java +++ /dev/null @@ -1,124 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.semantik.enginebased.formsolutions; - -import static de.ozgcloud.eingang.semantik.enginebased.formsolutions.FormSolutionsEngineBasedAdapter.*; -import static org.assertj.core.api.Assertions.*; -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.*; - -import java.util.Collections; -import java.util.Map; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Spy; -import org.springframework.test.util.ReflectionTestUtils; - -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.common.formdata.FormDataTestFactory; -import de.ozgcloud.eingang.semantik.enginebased.formsolutions.FormSolutionsAntragstellerMapper; -import de.ozgcloud.eingang.semantik.enginebased.formsolutions.FormSolutionsEngineBasedAdapter; -import de.ozgcloud.eingang.semantik.enginebased.formsolutions.FormSolutionsEngineBasedMapper; - -class FormSolutionsEngineBasedAdapterTest { - - @Spy - @InjectMocks - private FormSolutionsEngineBasedAdapter adapter; - @Mock - private FormSolutionsEngineBasedMapper mapper; - - @DisplayName("Parse formData") - @Nested - class TestParseFormData { - - private final FormData formData = FormDataTestFactory.create(); - - @BeforeEach - void mockMappers() { - ReflectionTestUtils.setField(adapter, "mappers", Collections.singletonList(mapper)); - } - - @Test - void shouldCallMappers() { - when(mapper.parseFormData(any())).thenReturn(formData); - - adapter.parseFormData(formData); - - verify(mapper).parseFormData(formData); - } - - @Test - void shouldCallRemoveProcessedRawData() { - when(mapper.parseFormData(any())).thenReturn(formData); - - adapter.parseFormData(formData); - - verify(adapter).removeProcessedData(formData); - } - - @DisplayName("remove processed data") - @Nested - class TestRemoveProcessedData { - - private final Map<String, Object> formDataMap = Map.of(ASSISTANT, "testValue", - ANLIEGEN_ID, "testValue2", KOMMUNALVERWALTUNG_ID, "testValue3", - FormSolutionsAntragstellerMapper.POSTKORBHANDLE, "testValue4"); - private final FormData formData = FormData.builder().formData(formDataMap).build(); - - @Test - void shouldRemoveAssistant() { - var cleanedFormData = adapter.removeProcessedData(formData); - - assertThat(cleanedFormData.getFormData()).doesNotContainKey(ASSISTANT); - } - - @Test - void shouldRemoveAnliegenId() { - var cleanedFormData = adapter.removeProcessedData(formData); - - assertThat(cleanedFormData.getFormData()).doesNotContainKey(ANLIEGEN_ID); - } - - @Test - void shouldRemoveKommunalVerwaltungId() { - var cleanedFormData = adapter.removeProcessedData(formData); - - assertThat(cleanedFormData.getFormData()).doesNotContainKey(KOMMUNALVERWALTUNG_ID); - } - - @Test - void shouldRemovePostkorbhandle() { - var cleanedFormData = adapter.removeProcessedData(formData); - - assertThat(cleanedFormData.getFormData()).doesNotContainKey(FormSolutionsAntragstellerMapper.POSTKORBHANDLE); - } - } - } -} \ No newline at end of file diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/formsolutions/FormSolutionsFilesMapperTest.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/formsolutions/FormSolutionsFilesMapperTest.java deleted file mode 100644 index b5f3510a2f575c6a738390028160a63ae96225d4..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/formsolutions/FormSolutionsFilesMapperTest.java +++ /dev/null @@ -1,204 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.semantik.enginebased.formsolutions; - -import static org.assertj.core.api.Assertions.*; -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.*; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.stream.Stream; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.mockito.ArgumentCaptor; -import org.mockito.Captor; -import org.mockito.InjectMocks; -import org.mockito.Spy; - -import de.ozgcloud.eingang.common.formdata.FormDataTestFactory; -import de.ozgcloud.eingang.common.formdata.IncomingFile; -import de.ozgcloud.eingang.common.formdata.IncomingFileGroup; -import de.ozgcloud.eingang.common.formdata.IncomingFileGroupTestFactory; -import de.ozgcloud.eingang.common.formdata.IncomingFileTestFactory; -import de.ozgcloud.eingang.semantik.enginebased.formsolutions.FormSolutionsFilesMapper.ZippedAttachmentsProcessor; - -class FormSolutionsFilesMapperTest { - - private static final String ATTACHMENT_ZIP_FILE_NAME = "attachments.zip"; - private static final String ZIP_CONTENT_TYPE = "application/zip"; - - @Spy - @InjectMocks - private final FormSolutionsFilesMapper mapper = new FormSolutionsFilesMapper(); - - @Nested - class TestParseFormData { - @Test - void shouldCallReadAttachments() { - mapper.parseFormData(FormDataTestFactory.create()); - - verify(mapper).readAttachments(any()); - } - - @Test - void shouldAddGroup() { - var attachmentGroup = IncomingFileGroupTestFactory.create(); - doReturn(List.of(attachmentGroup)).when(mapper).readAttachments(any()); - - var result = mapper.parseFormData(FormDataTestFactory.create()); - - assertThat(result.getAttachments()).containsOnly(attachmentGroup); - } - - @Test - void shouldHaveNoAttachmentIfMissing() { - doReturn(Collections.emptyList()).when(mapper).readAttachments(any()); - - var result = mapper.parseFormData(FormDataTestFactory.create()); - - assertThat(result.getAttachments()).isEmpty(); - } - - } - - @Nested - class TestZippedAttachmentsProcessor { - - private final List<IncomingFileGroup> attachments = new ArrayList<>(); - - private final ZippedAttachmentsProcessor processor = spy(mapper.new ZippedAttachmentsProcessor(attachments)); - - @Nested - class Process { - - @BeforeEach - void fillAttachmentList() { - attachments.add(IncomingFileGroupTestFactory.create()); - when(processor.nonZipFileGroups()).thenReturn(Stream.empty()); - } - - @Test - void shouldCallExtractAttachments() { - processor.process(); - - verify(processor).extractAttachments(); - } - - @Test - void shouldReturnExtractedGroups() { - var expected = IncomingFileTestFactory.create(); - doReturn(Stream.of(expected)).when(processor).extractAttachments(); - - var result = processor.process(); - - assertThat(result).flatMap(IncomingFileGroup::getFiles).containsOnly(expected); - } - - @Test - void shouldReturnEmptyIfNoAttachments() { - attachments.clear(); - - var result = processor.process(); - - assertThat(result).isEmpty(); - } - } - - @Nested - class ExtractAttachments { - - @Captor - private ArgumentCaptor<IncomingFile> fileCaptor; - - @Test - void shouldCallUnzip() { - attachments.add(buildZipFileGroup()); - - processor.extractAttachments().toList(); - - verify(processor).unzip(fileCaptor.capture()); - } - - @Test - void shouldNotCallUnzipForOtherGroup() { - attachments.add(IncomingFileGroupTestFactory.create()); - - processor.extractAttachments().toList(); - - verify(processor, never()).unzip(any()); - } - - private IncomingFileGroup buildZipFileGroup() { - return IncomingFileGroupTestFactory.createBuilder().clearFiles() - .name(FormSolutionsFilesMapper.FILE_GROUP_ZIP_NAME) - .file(buildZipFile()) - .build(); - } - - } - - @Nested - class Unzip { - - @Test - void shouldCallReadFromZip() { - IncomingFile zipFile = buildZipFile(); - - processor.unzip(zipFile); - - verify(processor).readFromZip(zipFile); - } - - @Test - void resultShouldContainUnzippedContent() { - var resultFile = IncomingFileTestFactory.create(); - doReturn(Stream.of(resultFile)).when(processor).readFromZip(any()); - - var result = processor.unzip(buildZipFile()); - - assertThat(result).containsOnly(resultFile); - } - - @Test - void shouldReturnZipFileOnException() { - doThrow(new RuntimeException()).when(processor).readFromZip(any()); - IncomingFile zipFile = buildZipFile(); - - var result = processor.unzip(zipFile); - - assertThat(result).hasSize(1).contains(zipFile); - } - } - - private IncomingFile buildZipFile() { - return IncomingFileTestFactory.createBuilder() - .name(ATTACHMENT_ZIP_FILE_NAME).contentType(ZIP_CONTENT_TYPE) - .build(); - } - } -} \ No newline at end of file diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/formsolutions/FormSolutionsHeaderMapperTest.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/formsolutions/FormSolutionsHeaderMapperTest.java deleted file mode 100644 index 56df1f639ff2bac7f59b24ba6d36bf387227ee59..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/formsolutions/FormSolutionsHeaderMapperTest.java +++ /dev/null @@ -1,141 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.semantik.enginebased.formsolutions; - -import static de.ozgcloud.eingang.semantik.enginebased.formsolutions.FormSolutionsHeaderTestFactory.*; -import static org.assertj.core.api.Assertions.*; -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.*; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Spy; - -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.common.formdata.FormDataUtils; -import de.ozgcloud.eingang.common.formdata.FormHeader; -import de.ozgcloud.eingang.semantik.common.ServiceKontoFactory; - -class FormSolutionsHeaderMapperTest { - - @Spy - @InjectMocks - private final FormSolutionsHeaderMapper mapper = new FormSolutionsHeaderMapper(); - @Mock - private ServiceKontoFactory serviceKontoFactory; - - @DisplayName("Parse formData") - @Nested - class TestParseFormData { - - private final FormData formData = FormSolutionsHeaderTestFactory.create(); - - @Test - void shouldCallBuildFormHeader() { - parseFormData(); - - verify(mapper).buildFormHeader(formData); - } - - @Test - void shouldReturnValue() { - var result = parseFormData(); - - assertThat(result).usingRecursiveComparison().ignoringFields("header", "formData").isEqualTo(formData); - } - - @Test - void shouldRemoveTransactionId() { - var result = parseFormData(); - - assertThat(result.getFormData()).doesNotContainKey(FormSolutionsHeaderMapper.TRANSACTION_ID); - } - - private FormData parseFormData() { - return mapper.parseFormData(formData); - } - - @DisplayName("build form header") - @Nested - class TestBuildFormHeader { - - @Test - void shouldHaveFormName() { - var formHeader = buildFormHeader(); - - assertThat(formHeader.getFormName()).isEqualTo(FORM_NAME); - } - - @Test - void shouldHaveFormId() { - var formHeader = buildFormHeader(); - - assertThat(formHeader.getFormId()).isEqualTo(FORM_NAME); - } - - @Test - void shouldHaveTransactionId() { - var formHeader = buildFormHeader(); - - assertThat(formHeader.getRequestId()).isEqualTo(REQUEST_ID); - } - - @Test - void shouldHaveFormEngineName() { - var formHeader = buildFormHeader(); - - assertThat(formHeader.getFormEngineName()).isEqualTo(FormSolutionsHeaderMapper.FORM_ENGINE_NAME); - } - - @DisplayName("service konto") - @Nested - class TestGetServiceKonto { - - @Test - void shouldCallServiceKontoBuildHelper() { - buildFormHeader(); - - verify(serviceKontoFactory).buildOsiServiceKonto(any()); - } - - @Test - void shouldNotCallServiceKontoBuildHelper() { - var formDataWithoutPostkorbHandle = FormDataUtils.from(formData).remove(FormSolutionsHeaderMapper.POSTKORBHANDLE).build(); - - mapper.buildFormHeader(formDataWithoutPostkorbHandle); - - verify(serviceKontoFactory, never()).buildOsiServiceKonto(any()); - } - - } - - private FormHeader buildFormHeader() { - return mapper.buildFormHeader(formData); - } - } - } -} \ No newline at end of file diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/formsolutions/FormSolutionsHeaderTestFactory.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/formsolutions/FormSolutionsHeaderTestFactory.java deleted file mode 100644 index a57d91793be0901aa0415655c68b59892d99547e..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/formsolutions/FormSolutionsHeaderTestFactory.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.semantik.enginebased.formsolutions; - -import static de.ozgcloud.eingang.semantik.enginebased.formsolutions.FormSolutionsEngineBasedAdapter.*; -import static de.ozgcloud.eingang.semantik.enginebased.formsolutions.FormSolutionsHeaderMapper.*; - -import java.util.Map; -import java.util.UUID; - -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.semantik.enginebased.formsolutions.FormSolutionsHeaderMapper; - -public class FormSolutionsHeaderTestFactory { - - public static final String FORM_NAME = "form name"; - public static final Object REQUEST_ID = "transaction id"; - public static final String POSTKORBHANDLE_VALUE = UUID.randomUUID().toString(); - - public static FormData create() { - return createBuilder().build(); - } - - public static FormData.FormDataBuilder createBuilder() { - return FormData.builder() - .formData(Map.of( - ASSISTANT, Map.of(IDENTIFIER_KEY, FORM_NAME), - TRANSACTION_ID, REQUEST_ID, - FormSolutionsHeaderMapper.POSTKORBHANDLE, POSTKORBHANDLE_VALUE)); - } -} diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/formsolutions/FormSolutionsPanelMapperTest.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/formsolutions/FormSolutionsPanelMapperTest.java deleted file mode 100644 index eea209cdc117413996cc7e72e824f83f4a39b7f1..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/formsolutions/FormSolutionsPanelMapperTest.java +++ /dev/null @@ -1,187 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.semantik.enginebased.formsolutions; - -import static de.ozgcloud.eingang.semantik.enginebased.formsolutions.FormSolutionsEngineBasedAdapter.*; -import static de.ozgcloud.eingang.semantik.enginebased.formsolutions.FormSolutionsPanelTestFactory.*; -import static org.assertj.core.api.Assertions.*; - -import java.util.Map; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; - -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.semantik.enginebased.formsolutions.FormSolutionsPanelMapper; - -class FormSolutionsPanelMapperTest { - - private FormSolutionsPanelMapper mapper = new FormSolutionsPanelMapper(); - - @Nested - class TestMapping { - - @Test - void shouldMap() { - var formData = mapper.parseFormData(FormSolutionsPanelTestFactory.create()); - - assertThat(formData.getFormData()).isNotEmpty(); - } - } - - @Nested - class TestMapPanel { - @Test - void shouldContainIdentifier() { - var formData = mapper.parseFormData(FormSolutionsPanelTestFactory.create()); - - assertThat(formData.getFormData()).containsKey(PANEL_0); - } - - @Test - @SuppressWarnings("unchecked") - void shouldContainComponents() { - var formData = mapper.parseFormData(FormSolutionsPanelTestFactory.create()); - - var panelContent = (Map<String, Object>) formData.getFormData().get(PANEL_0); - - assertThat(panelContent).containsEntry(DATE_FIELD, DATE_VALUE_CONTENT).containsEntry(TEXT_FIELD, STRING_VALUE_CONTENT); - } - - @Test - void shouldContainNestedComponents() { - var formData = mapper.parseFormData(FormSolutionsPanelTestFactory.createBuilder().formData(NESTED_PANEL_FORM).build()); - - assertThat(formData.getFormData()).containsKey(PANEL_0); - } - } - - @Nested - class TestMapComponents { - @Nested - class TestMapNestedComponents { - - @Test - @SuppressWarnings("unchecked") - void shouldHaveGroup() { - var formData = mapper.parseFormData(FormSolutionsPanelTestFactory.createBuilder().formData(NESTED_PANEL_FORM).build()); - - var group = (Map<String, Object>) formData.getFormData().get(PANEL_0); - - assertThat(group).containsKey(GROUP_IDENTIFIER); - } - - @Test - @SuppressWarnings("unchecked") - void shouldHaveComponent() { - var formData = mapper.parseFormData(FormSolutionsPanelTestFactory.createBuilder().formData(NESTED_PANEL_FORM).build()); - - var group = (Map<String, Object>) ((Map<String, Object>) formData.getFormData().get(PANEL_0)).get(GROUP_IDENTIFIER); - - assertThat(group).containsEntry(DATE_FIELD, DATE_VALUE_CONTENT); - } - - @Test - @SuppressWarnings("unchecked") - void shouldNotHaveEmptyComponent() { - var formData = mapper.parseFormData(FormSolutionsPanelTestFactory.createBuilder().formData(PANEL_FORM_EMPTY).build()); - - var group = (Map<String, Object>) ((Map<String, Object>) formData.getFormData().get(PANEL_0)).get(TEXT_FIELD); - - assertThat(group).isNull(); - } - } - } - - @Nested - class TestGetPanels { - - @Test - void shoudReturnPanels() { - var panels = FormSolutionsPanelMapper.getPanels(FormSolutionsPanelTestFactory.create()); - - assertThat(panels).isEqualTo(PANEL_LIST); - } - - @Test - @DisplayName("should return empty list when ASSISTANT map is missing") - void shouldHandleMissingAssistant() { - var formData = FormSolutionsPanelTestFactory.createBuilder().formData(Map.of()).build(); - - var panels = FormSolutionsPanelMapper.getPanels(formData); - - assertThat(panels).isEmpty(); - } - - @Test - @DisplayName("should return empty list when PANELS map is missing") - void shouldHandleMissingPanels() { - var formData = FormSolutionsPanelTestFactory.createBuilder().formData(Map.of(ASSISTANT, Map.of())).build(); - - var panels = FormSolutionsPanelMapper.getPanels(formData); - - assertThat(panels).isEmpty(); - } - - @Test - void shouldHandleNullFormDataMap() { - var panels = FormSolutionsPanelMapper.getPanels(FormData.builder().build()); - - assertThat(panels).isEmpty(); - } - - @Test - void shouldHandleNullFormData() { - var panels = FormSolutionsPanelMapper.getPanels(null); - - assertThat(panels).isEmpty(); - } - } - - @Nested - class TestGetComponents{ - - @Test - void shouldReturnComponentList() { - var components = FormSolutionsPanelMapper.getComponentList(PANEL_LIST.get(0)); - - assertThat(components).isEqualTo(COMPONENT_LIST); - } - - @Test - void shouldHandleNull() { - var components = FormSolutionsPanelMapper.getComponentList(null); - - assertThat(components).isEmpty(); - } - - @Test - void shouldHandleEmptyMap() { - var components = FormSolutionsPanelMapper.getComponentList(Map.of()); - - assertThat(components).isEmpty(); - } - } -} diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/formsolutions/FormSolutionsPanelTestFactory.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/formsolutions/FormSolutionsPanelTestFactory.java deleted file mode 100644 index ce6ea22f465552337cf2770d53d849fbff3ed5ed..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/formsolutions/FormSolutionsPanelTestFactory.java +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.semantik.enginebased.formsolutions; - -import static de.ozgcloud.eingang.semantik.enginebased.formsolutions.FormSolutionsEngineBasedAdapter.*; -import static de.ozgcloud.eingang.semantik.enginebased.formsolutions.FormSolutionsPanelMapper.*; - -import java.util.List; -import java.util.Map; - -import de.ozgcloud.eingang.common.formdata.FormData; - -public class FormSolutionsPanelTestFactory { - public static final String PANEL_0 = "Panel_0_1"; - public static final String TEXT_FIELD = "Textfeld (einzeilig)"; - public static final String DATE_FIELD = "Datums- / Uhrzeitfeld"; - public static final String STRING_VALUE_CONTENT = "kfjhkfjhk"; - public static final String DATE_VALUE_CONTENT = "22.05.1996"; - public static final String GROUP_IDENTIFIER = "Objektgruppe[0]"; - public static final String FORM = "AS_123"; - public static final List<Map<String, Object>> COMPONENT_LIST = List.of( - Map.of( - IDENTIFIER_KEY, TEXT_FIELD, - STRING_VALUE, STRING_VALUE_CONTENT), - Map.of( - IDENTIFIER_KEY, DATE_FIELD, - STRING_VALUE, DATE_VALUE_CONTENT)); - - public static final List<Map<String, Object>> EMPTY_COMPONENT_LIST = List.of( - Map.of(IDENTIFIER_KEY, TEXT_FIELD, "needed", false)); - - public static final List<Map<String, Object>> NESTED_COMPONENT_LIST = List.of( - Map.of( - IDENTIFIER_KEY, GROUP_IDENTIFIER, - COMPONENTS, List.of(Map.of( - IDENTIFIER_KEY, DATE_FIELD, - STRING_VALUE, DATE_VALUE_CONTENT)))); - - public static final List<Map<String, Object>> PANEL_LIST = List.of(Map.of( - IDENTIFIER_KEY, PANEL_0, - COMPONENTS, COMPONENT_LIST)); - - public static final List<Map<String, Object>> PANEL_LIST_EMPTY = List.of(Map.of( - IDENTIFIER_KEY, PANEL_0, - COMPONENTS, EMPTY_COMPONENT_LIST)); - - public static final List<Map<String, Object>> NESTED_PANEL_LIST = List.of(Map.of( - IDENTIFIER_KEY, PANEL_0, - COMPONENTS, NESTED_COMPONENT_LIST)); - - public static final Map<String, Object> PANEL_FORM = Map.of( - ASSISTANT, Map.of( - IDENTIFIER_KEY, FORM, - PANELS, PANEL_LIST)); - - public static final Map<String, Object> NESTED_PANEL_FORM = Map.of( - ASSISTANT, Map.of( - IDENTIFIER_KEY, FORM, - PANELS, NESTED_PANEL_LIST)); - - public static final Map<String, Object> PANEL_FORM_EMPTY = Map.of( - ASSISTANT, Map.of( - IDENTIFIER_KEY, FORM, - PANELS, PANEL_LIST_EMPTY)); - - public static FormData create() { - return FormSolutionsPanelTestFactory.createBuilder().build(); - } - - public static FormData.FormDataBuilder createBuilder() { - return FormData.builder().formData(PANEL_FORM); - } -} diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/formsolutions/FormSolutionsZustaendigeStelleMapperTest.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/formsolutions/FormSolutionsZustaendigeStelleMapperTest.java deleted file mode 100644 index bd31c4218074b8bc343d3327e10455885df7371a..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/formsolutions/FormSolutionsZustaendigeStelleMapperTest.java +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.semantik.enginebased.formsolutions; - -import static de.ozgcloud.eingang.common.formdata.ZustaendigeStelleTestFactory.*; -import static de.ozgcloud.eingang.semantik.enginebased.formsolutions.FormSolutionsZustaendigeStelleMapper.*; -import static org.assertj.core.api.Assertions.*; - -import java.util.Map; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.mockito.Spy; - -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.common.formdata.FormDataTestFactory; - -class FormSolutionsZustaendigeStelleMapperTest { - - @Spy - private final FormSolutionsZustaendigeStelleMapper mapper = new FormSolutionsZustaendigeStelleMapper(); - - @DisplayName("Parse formData") - @Nested - class TestParseFormData { - - private FormData formData; - - @BeforeEach - void setup() { - formData = FormDataTestFactory.createBuilder() - .formData(Map.of( - FormDataTestFactory.SIMPLE_VALUE_KEY, FormDataTestFactory.SIMPLE_VALUE, - FormSolutionsZustaendigeStelleMapper.ZUSTAENDIGE_STELLE, ORGANISATIONSEINHEIT_ID)) - .build(); - } - - @Test - void shouldParseFormData() { - var resultFormData = mapper.parseFormData(formData); - - assertThat(resultFormData.getZustaendigeStelles().getFirst().getOrganisationseinheitenId()).isEqualTo(ORGANISATIONSEINHEIT_ID); - assertThat(resultFormData.getFormData()).doesNotContainKey(ZUSTAENDIGE_STELLE); - } - - @Test - @DisplayName("should process ZustaendigeStelle data only") - void shouldNotChangeAnother() { - var resultFormData = mapper.parseFormData(formData); - - assertThat(resultFormData).usingRecursiveComparison().ignoringFields("zustaendigeStelles", "formData").isEqualTo(formData); - assertThat(resultFormData.getFormData()) - .containsAllEntriesOf(Map.of(FormDataTestFactory.SIMPLE_VALUE_KEY, FormDataTestFactory.SIMPLE_VALUE)); - } - - @DisplayName("build zustaendigeStelle") - @Nested - class TestBuildZustaendigeStelle { - - @Test - void shouldHaveOrganisationseinheitenId() { - var zustaendigeStelle = mapper.buildZustaendigeStelle(formData); - - assertThat(zustaendigeStelle.getOrganisationseinheitenId()).isEqualTo(ORGANISATIONSEINHEIT_ID); - } - } - - @DisplayName("remove processed data") - @Nested - class TestRemoveProcessedData { - - @Test - void shouldRemoveZustaendigeStelle() { - var cleanedFormData = mapper.removeProcessedData(formData); - - assertThat(cleanedFormData).doesNotContainKey(ZUSTAENDIGE_STELLE); - } - } - } -} \ No newline at end of file diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/formsolutions/IdentifierValueParserTest.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/formsolutions/IdentifierValueParserTest.java deleted file mode 100644 index 5c47f25070a7e7768cd40ac297a0f43cb5fdcef3..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/formsolutions/IdentifierValueParserTest.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.semantik.enginebased.formsolutions; - -import static de.ozgcloud.eingang.common.formdata.AntragstellerTestFactory.*; -import static de.ozgcloud.eingang.common.formdata.FormDataTestFactory.*; -import static de.ozgcloud.eingang.semantik.enginebased.formsolutions.FormSolutionsAntragstellerMapper.*; -import static de.ozgcloud.eingang.semantik.enginebased.formsolutions.FormSolutionsEngineBasedAdapter.*; -import static de.ozgcloud.eingang.semantik.enginebased.formsolutions.FormSolutionsPanelMapper.*; -import static org.assertj.core.api.Assertions.*; - -import java.util.List; -import java.util.Map; - -import org.junit.jupiter.api.Test; - -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.common.formdata.FormDataTestFactory; -import de.ozgcloud.eingang.semantik.enginebased.formsolutions.FormSolutionsHeaderMapper; -import de.ozgcloud.eingang.semantik.enginebased.formsolutions.IdentifierValueParser; - -class IdentifierValueParserTest { - - private static final String ANTRAGSTELLER_NAME_PANEL_IDENTIFIER = "AS_Name1"; - private static final List<Map<String, Object>> ANTRAGSTELLER_PANEL_CONTENT_LIST = List.of( - Map.of(IDENTIFIER_KEY, ANTRAGSTELLER_NAME_PANEL_IDENTIFIER), - Map.of(COMPONENTS, List.of( - Map.of(IDENTIFIER_KEY, VORNAME_KEY, STRING_VALUE, VORNAME), - Map.of(IDENTIFIER_KEY, NACHNAME_KEY, STRING_VALUE, NACHNAME)))); - - private static final Map<String, Object> ASSISTANT_MAP = Map.of(PANELS, List.of( - Map.of(IDENTIFIER_KEY, ANTRAGSTELLER_PANEL_IDENTIFIER), Map.of(COMPONENTS, ANTRAGSTELLER_PANEL_CONTENT_LIST))); - - private FormData formData = FormDataTestFactory.createBuilder() - .formData(Map.of(SIMPLE_VALUE_KEY, SIMPLE_VALUE, - FormSolutionsHeaderMapper.POSTKORBHANDLE, POSTFACH_ID, ASSISTANT, ASSISTANT_MAP)) - .build(); - - @Test - void shoudParseData() { - var expectedMap = Map.of(VORNAME_KEY, VORNAME, NACHNAME_KEY, NACHNAME); - - var stringValueMap = IdentifierValueParser.parsePanelsData(formData); - - assertThat(stringValueMap).isEqualTo(expectedMap); - } - - @Test - void shouldHandleNullPanels() { - formData = FormDataTestFactory.createBuilder().formData(null).build(); - - var stringValueMap = IdentifierValueParser.parsePanelsData(formData); - - assertThat(stringValueMap).isEmpty(); - } - -} \ No newline at end of file diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/formbased/FormBasedSemantikAdapterTest.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/formbased/FormBasedSemantikAdapterTest.java deleted file mode 100644 index 7cb39b39ea3e1a7be01f3e256eb8a607724118f6..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/formbased/FormBasedSemantikAdapterTest.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.semantik.formbased; - -import static org.assertj.core.api.Assertions.*; -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.*; - -import java.util.ArrayList; -import java.util.List; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Spy; - -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.common.formdata.FormDataTestFactory; - -class FormBasedSemantikAdapterTest { - - @Spy - @InjectMocks - private FormBasedSemantikAdapter adapter; - @Spy - private List<FormBasedMapper> mappers = new ArrayList<>(); - @Mock - private FormBasedMapper mapper; - - @Nested - class TestParseFromData { - - private FormData formData = FormDataTestFactory.create(); - - @BeforeEach - void mockEngineBasedMapper() { - when(mapper.isResponsible(any())).thenReturn(true); - mappers.add(mapper); - } - - @Test - void shouldCallMapperIfResponsible() { - adapter.parseFormData(formData); - - verify(mapper).parseFormData(formData); - } - - @Test - void shouldNotCallMapperIfNotResponsible() { - when(mapper.isResponsible(any())).thenReturn(false); - - adapter.parseFormData(formData); - - verifyNoMoreInteractions(mapper); - } - - @Test - void shouldReturnMappingResult() { - var expected = FormDataTestFactory.create(); - when(mapper.parseFormData(any())).thenReturn(expected); - - var result = adapter.parseFormData(formData); - - assertThat(result).isSameAs(expected); - } - } -} diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/formbased/mantelantrag/MantelantragITCase.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/formbased/mantelantrag/MantelantragITCase.java deleted file mode 100644 index e80eeca2598ef00dc45d827401744d80eb10ba4c..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/formbased/mantelantrag/MantelantragITCase.java +++ /dev/null @@ -1,187 +0,0 @@ -package de.ozgcloud.eingang.semantik.formbased.mantelantrag; - -import static de.ozgcloud.eingang.common.formdata.FormDataTestFactory.*; -import static org.assertj.core.api.Assertions.*; -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.*; - -import java.io.File; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.Collections; -import java.util.List; -import java.util.Optional; - -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.mockito.ArgumentCaptor; -import org.mockito.Captor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.boot.test.mock.mockito.SpyBean; -import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.context.DynamicPropertyRegistry; -import org.springframework.test.context.DynamicPropertySource; - -import de.ozgcloud.common.binaryfile.TempFileUtils; -import de.ozgcloud.common.test.TestUtils; -import de.ozgcloud.eingang.Application; -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.common.formdata.IncomingFileTestFactory; -import de.ozgcloud.eingang.router.VorgangRemoteService; -import de.ozgcloud.eingang.semantik.SemantikAdapter; -import de.ozgcloud.eingang.semantik.enginebased.formsolutions.FormSolutionsEngineBasedAdapterITCase; -import lombok.SneakyThrows; - -@ActiveProfiles({ "local", "itcase" }) -@SpringBootTest(classes = Application.class) -public class MantelantragITCase { - - private static final String FILE_NAME_XDOMEA = "mantelantrag/4620-EH6C_b3c9168a-6ae9-4361-8b2f-6837bb341021_Geschaeftsgang.Geschaeftsgang.0201.xml"; - private static final String FILE_NAME_MANTELANTRAG = "mantelantrag/4620-EH6C_7d703670-15b6-42b2-8cd1-88a7e4c494b9_Antrag_Max_Mustermann_SGBXII.xml"; - - @MockBean - VorgangRemoteService vorgangRemoteService; - - @SpyBean - SemantikAdapter semantikAdapter; - - @Captor - ArgumentCaptor<FormData> formDataCaptor; - private FormData formData; - - @Captor - ArgumentCaptor<Optional<String>> oeIdCaptor; - - @Autowired - MantelantragZustaendigeStelleMapper mantelantragZustaendigeStelleMapper; - - static List<String> xtaIdentifiers = Collections.emptyList(); - - @BeforeEach - void mock() { - clearInvocations(vorgangRemoteService); - doReturn(VORGANG_ID).when(vorgangRemoteService).createVorgang(any(FormData.class), any()); - formData = prepareTestData(); - mantelantragZustaendigeStelleMapper.init(); - } - - @DynamicPropertySource - static void dynamicProperties(DynamicPropertyRegistry registry) { - registry.add("ozgcloud.xta.identifiers", () -> xtaIdentifiers); - } - - @DisplayName("without matching zustaendige stelle") - @Nested - class TestWithoutMatchingZustaendigeStelle { - - @BeforeAll - static void setup() { - xtaIdentifiers = List.of("afmsh:unknown"); - } - - @DisplayName("should create one vorgang") - @Test - void shouldCreateOneVorgang() { - semantikAdapter.processFormData(formData); - - verify(vorgangRemoteService, times(1)).createVorgang(formDataCaptor.capture(), oeIdCaptor.capture()); - assertThat(oeIdCaptor.getValue()).isEmpty(); - } - } - - @DisplayName("with one matching zustaendige stelle") - @Nested - class TestWithOneMatchingZustaendigeStelle { - @BeforeAll - static void setup() { - xtaIdentifiers = List.of("afmsh:ozg-cloud-utopia-test"); - } - - @DisplayName("should create one vorgang") - @Test - void shouldCreateOneVorgang() { - semantikAdapter.processFormData(formData); - - verify(vorgangRemoteService, times(1)).createVorgang(formDataCaptor.capture(), oeIdCaptor.capture()); - assertThat(oeIdCaptor.getValue()).contains("123"); - } - } - - @DisplayName("with two matching zustaendige stelle") - @Nested - class TestWithTwoMatchingZustaendigeStelle { - - @BeforeAll - static void setup() { - xtaIdentifiers = List.of("afmsh:ozg-cloud-utopia-test", "gae:ozg-cloud-itcase-test"); - } - - @DisplayName("should create two vorangs with partially matching zustaendigeStelle") - @Test - void shouldCreateTwoVorangsWithPartiallyMatchingZustaendigeStelle() { - semantikAdapter.processFormData(formData); - - verify(vorgangRemoteService, times(2)).createVorgang(formDataCaptor.capture(), oeIdCaptor.capture()); - assertThat(oeIdCaptor.getAllValues()).contains(Optional.of("123"), Optional.of("444")); - } - } - - @DisplayName("with three matching zustaendige stelles") - @Nested - class TestWithThreeMatchingZustaendigeStelles { - - @BeforeAll - static void setup() { - xtaIdentifiers = List.of("afmsh:ozg-cloud-utopia-test", "gae:ozg-cloud-itcase-test", "afmsh:ozg-cloud-bad-segeberg-kreis"); - } - - @DisplayName("should create three vorgangs") - @Test - void shouldCreateThreeVorgangs() { - semantikAdapter.processFormData(formData); - - verify(vorgangRemoteService, times(3)).createVorgang(formDataCaptor.capture(), oeIdCaptor.capture()); - assertThat(oeIdCaptor.getAllValues()).contains(Optional.of("123"), Optional.of("321"), Optional.of("444")); - } - } - - @DisplayName("should return first vorgangId") - @Test - void shouldReturnFirstVorgangId() { - var result = semantikAdapter.processFormData(formData); - - assertThat(result).isEqualTo(VORGANG_ID); - } - - private FormData prepareTestData() { - var xdomeaFile = IncomingFileTestFactory.createBuilder() - .name(FILE_NAME_XDOMEA) - .file(asFile(FILE_NAME_XDOMEA)) - .size(getFileSize(FILE_NAME_XDOMEA)) - .contentType("application/xml") - .build(); - var mantelantragFile = IncomingFileTestFactory.createBuilder() - .name(FILE_NAME_MANTELANTRAG) - .file(asFile(FILE_NAME_MANTELANTRAG)) - .size(getFileSize(FILE_NAME_MANTELANTRAG)) - .contentType("application/xml") - .build(); - - return FormData.builder().representations(List.of(xdomeaFile, mantelantragFile)).build(); - } - - @SneakyThrows - private long getFileSize(String fileName) { - Path filePath = Path.of(FormSolutionsEngineBasedAdapterITCase.class.getClassLoader().getResource(fileName).toURI()); - return Files.size(filePath); - } - - private File asFile(String path) { - return TempFileUtils.writeTmpFile(TestUtils.loadFile(path)); - } -} diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/formbased/mantelantrag/MantelantragZustaendigeStelleMapperTest.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/formbased/mantelantrag/MantelantragZustaendigeStelleMapperTest.java deleted file mode 100644 index 782209dff8ebd6174a29942c0812b90f8b5753ca..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/formbased/mantelantrag/MantelantragZustaendigeStelleMapperTest.java +++ /dev/null @@ -1,381 +0,0 @@ -package de.ozgcloud.eingang.semantik.formbased.mantelantrag; - -import static de.ozgcloud.eingang.semantik.formbased.mantelantrag.MantelantragZustaendigeStelleMapper.*; -import static java.util.Collections.*; -import static org.assertj.core.api.Assertions.*; -import static org.mockito.Mockito.*; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.function.Function; -import java.util.stream.Stream; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.MethodSource; -import org.junit.jupiter.params.provider.ValueSource; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Spy; - -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.common.formdata.FormDataTestFactory; -import de.ozgcloud.eingang.common.formdata.FormHeaderTestFactory; -import de.ozgcloud.eingang.common.formdata.ZustaendigeStelle; - -class MantelantragZustaendigeStelleMapperTest { - private static final String TARGET_OEID = "123456"; - private static final String IDENTIFIER = "gea:test"; - private static final String IDENTIFIER2 = "dfad:test"; - private static final String IDENTIFIER2UPPERCASE = "dfad:Test"; - private static final List<String> IDENTIFIERS = List.of(IDENTIFIER, IDENTIFIER2, "aa:other"); - - @Spy - @InjectMocks - private MantelantragZustaendigeStelleMapper mapper; - - @BeforeEach - void mock() { - doReturn(IDENTIFIERS).when(mapper).getIdentifierList(); - mapper.init(); - } - - @DisplayName("is responsible") - @Nested - class TestIsResponsible { - - @DisplayName("should be true if mantelantrag starts with form id") - @ParameterizedTest - @ValueSource(strings = { MANTELANTRAG_FORM_ID, MANTELANTRAG_FORM_ID + "_pvog" }) - void shouldBeTrueIfMantelantragStartsWithFormId(String formId) { - var formData = createWithFormId(formId); - - var isResponsibleResult = mapper.isResponsible(formData); - - assertThat(isResponsibleResult).isTrue(); - } - - @DisplayName("should be false if not mantelantrag form id") - @Test - void shouldBeFalseIfNotMantelantragFormId() { - var formData = createWithFormId("any other id"); - - var isResponsibleResult = mapper.isResponsible(formData); - - assertThat(isResponsibleResult).isFalse(); - } - - @DisplayName("should be false if header null") - @Test - void shouldBeFalseIfHeaderNull() { - var formData = FormDataTestFactory.createBuilder() - .header(null) - .build(); - - var isResponsibleResult = mapper.isResponsible(formData); - - assertThat(isResponsibleResult).isFalse(); - } - - @DisplayName("should be false if form id null") - @Test - void shouldBeFalseIfFormIdNull() { - var formData = FormDataTestFactory.createBuilder() - .header(FormHeaderTestFactory.createBuilder() - .formId(null) - .build()) - .build(); - - var isResponsibleResult = mapper.isResponsible(formData); - - assertThat(isResponsibleResult).isFalse(); - } - - private FormData createWithFormId(String formId) { - return FormDataTestFactory.createBuilder() - .header(FormHeaderTestFactory.createBuilder() - .formId(formId) - .build()) - .build(); - } - } - - @DisplayName("parse form data") - @Nested - class TestParseFormData { - - private FormData formData; - - @Mock - private ZustaendigeStelle zustaendigeStelle; - - @BeforeEach - void mock() { - formData = FormDataTestFactory.create(); - } - - @DisplayName("should override zustaendige stelles") - @Test - void shouldOverrideZustaendigeStelles() { - doReturn(List.of(zustaendigeStelle)).when(mapper).getZustaendigeStelles(formData); - - var result = mapper.parseFormData(formData); - - assertThat(result.getZustaendigeStelles()).containsExactly(zustaendigeStelle); - } - - @DisplayName("should keep other formdata fields") - @Test - void shouldKeepOtherFormdataFields() { - doReturn(formData.getZustaendigeStelles()).when(mapper).getZustaendigeStelles(formData); - - var result = mapper.parseFormData(formData); - - assertThat(result).usingRecursiveComparison().isEqualTo(formData); - } - } - - @DisplayName("get zustaendige stelles") - @Nested - class TestGetZustaendigeStelles { - - private FormData formData; - - @Mock - private Map<String, Object> fieldMap; - - @Mock - private ZustaendigeStelle stelle1; - - @Mock - private ZustaendigeStelle stelle2; - - @Mock - private ZustaendigeStelle stelle3; - - @BeforeEach - void mock() { - formData = FormDataTestFactory.createBuilder() - .formData(fieldMap) - .build(); - } - - @DisplayName("should return") - @Test - void shouldReturn() { - doReturn(emptyList()).when(mapper).getMatchingSlots(fieldMap); - - var result = mapper.getZustaendigeStelles(formData); - - assertThat(result).isEmpty(); - } - - @DisplayName("should log error for no matching identifiers") - @Test - void shouldLogErrorForNoMatchingIdentifiers() { - doReturn(emptyList()).when(mapper).getMatchingSlots(fieldMap); - - mapper.getZustaendigeStelles(formData); - - verify(mapper).logErrorForNoMatchingIdentifiers(); - } - - @DisplayName("should return with three zustaendige stelle") - @Test - void shouldReturnWithThreeZustaendigeStelle() { - doReturn(List.of(0, 1, 2)).when(mapper).getMatchingSlots(fieldMap); - doReturn(stelle1).when(mapper).getZustaendigeStelle(fieldMap, 0); - doReturn(stelle2).when(mapper).getZustaendigeStelle(fieldMap, 1); - doReturn(stelle3).when(mapper).getZustaendigeStelle(fieldMap, 2); - - var result = mapper.getZustaendigeStelles(formData); - - assertThat(result).containsExactly(stelle1, stelle2, stelle3); - } - } - - @DisplayName("get zustaendige stelle") - @Nested - class TestGetZustaendigeStelle { - - static final Map<String, Function<ZustaendigeStelle, String>> FIELD_NAME_TO_EXPECTED_VALUE_EXTRACTOR = Map.of( - BEZEICHNUNG_FIELD, ZustaendigeStelle::getBezeichnung, - EMAIL_FIELD, ZustaendigeStelle::getEmail, - HAUSANSCHRIFT_STRASSE_FIELD, ZustaendigeStelle::getHausanschriftStrasse, - HAUSANSCHRIFT_PLZ_FIELD, ZustaendigeStelle::getHausanschriftPlz, - HAUSANSCHRIFT_ORT_FIELD, ZustaendigeStelle::getHausanschriftOrt, - TELEFON_FIELD, ZustaendigeStelle::getTelefon - ); - private Map<String, Object> fieldMap; - - @BeforeEach - void mock() { - fieldMap = new HashMap<>(Map.of( - getOrganisationseinheitIDFieldName(1), " ", - getOrganisationseinheitIDFieldName(2), "", - getOrganisationseinheitIDFieldName(10), "1111111" - )); - } - - @DisplayName("should map organisationseinheitId") - @ParameterizedTest - @ValueSource(ints = { 0, 1, 2 }) - void shouldMapOrganisationseinheitId(int slotIndex) { - mockWithOEID(slotIndex, TARGET_OEID); - - var zustaendigeStelle = getZustaendigeStelle(slotIndex); - - assertThat(zustaendigeStelle.getOrganisationseinheitenId()).isEqualTo(TARGET_OEID); - } - - private String getOrganisationseinheitIDFieldName(int slotIndex) { - return mapper.getNameForSlotIndex(ORGANISATIONSEINHEIT_ID_FIELD, slotIndex); - } - - @DisplayName("should log warning if organistaionseinheitId is missing") - @ParameterizedTest - @ValueSource(ints = { 0, 1, 2 }) - void shouldLogWarningIfOrganistaionseinheitIdIsMissing(int slotIndex) { - getZustaendigeStelle(slotIndex); - - verify(mapper).logWarningForEmptyOrganisationseinheitId(slotIndex); - } - - @DisplayName("should map optional field") - @ParameterizedTest - @MethodSource("generateFieldNameAndSlotIndex") - void shouldMapOptionalField(int slotIndex, String fieldName) { - mockWithSomeOEID(slotIndex); - var optionalFieldValue = "value of '%s'".formatted(fieldName); - fieldMap.put(mapper.getNameForSlotIndex(fieldName, slotIndex), optionalFieldValue); - - var zustaendigeStelle = getZustaendigeStelle(slotIndex); - - assertThat(getExpectedValueByFieldName(zustaendigeStelle, fieldName)).isEqualTo(optionalFieldValue); - } - - @DisplayName("should map missing optional fields to empty") - @ParameterizedTest - @MethodSource("generateFieldNameAndSlotIndex") - void shouldMapMissingOptionalFieldsToEmpty(int slotIndex, String fieldName) { - mockWithSomeOEID(slotIndex); - - var zustaendigeStelle = getZustaendigeStelle(slotIndex); - - assertThat(getExpectedValueByFieldName(zustaendigeStelle, fieldName)).isEmpty(); - } - - @DisplayName("should map empty optional fields to empty") - @ParameterizedTest - @MethodSource("generateFieldNameAndSlotIndex") - void shouldMapEmptyOptionalFieldsToEmpty(int slotIndex, String fieldName) { - mockWithSomeOEID(slotIndex); - fieldMap.put(mapper.getNameForSlotIndex(fieldName, slotIndex), ""); - - var zustaendigeStelle = getZustaendigeStelle(slotIndex); - - assertThat(getExpectedValueByFieldName(zustaendigeStelle, fieldName)).isEmpty(); - } - - private static Stream<Arguments> generateFieldNameAndSlotIndex() { - return Stream.of(0, 1, 2) - .flatMap(slotIndex -> FIELD_NAME_TO_EXPECTED_VALUE_EXTRACTOR - .keySet().stream() - .map(fieldName -> Arguments.of(slotIndex, fieldName)) - ); - } - - private String getExpectedValueByFieldName(ZustaendigeStelle zustaendigeStelle, String fieldName) { - var valueExtractor = FIELD_NAME_TO_EXPECTED_VALUE_EXTRACTOR.get(fieldName); - return valueExtractor.apply(zustaendigeStelle); - } - - private void mockWithSomeOEID(int slotIndex) { - mockWithOEID(slotIndex, "some"); - } - - private void mockWithOEID(int slotIndex, String targetOeid) { - fieldMap.put(getOrganisationseinheitIDFieldName(slotIndex), targetOeid); - } - - private ZustaendigeStelle getZustaendigeStelle(int slotIndex) { - return mapper.getZustaendigeStelle(fieldMap, slotIndex); - } - - } - - @DisplayName("get matching slots") - @Nested - class TestGetMatchingSlots { - - private Map<String, Object> fieldMap; - - @BeforeEach - void mock() { - fieldMap = new HashMap<>(Map.of( - getZustaendigeStelleName(1), "unknown", - getZustaendigeStelleName(2), "" - )); - } - - @DisplayName("should return empty") - @Test - void shouldReturnEmpty() { - var resultSlotIndices = mapper.getMatchingSlots(fieldMap); - - assertThat(resultSlotIndices).isEmpty(); - } - - @DisplayName("should return matching slots") - @ParameterizedTest - @ValueSource(ints = { 0, 1, 2 }) - void shouldReturnMatchingSlot(int slotIndex) { - fieldMap.put(getZustaendigeStelleName(slotIndex), IDENTIFIER); - - var resultSlotIndices = mapper.getMatchingSlots(fieldMap); - - assertThat(resultSlotIndices).containsExactly(slotIndex); - } - - @DisplayName("should return matching slot with upper-/lowercase difference in identifiers") - @ParameterizedTest - @ValueSource(ints = { 0, 1, 2 }) - void shouldReturnMatchingSlotWithUppercaseIdentifier(int slotIndex) { - fieldMap.put(getZustaendigeStelleName(slotIndex), IDENTIFIER2UPPERCASE); - - var resultSlotIndex = mapper.getMatchingSlots(fieldMap); - - assertThat(resultSlotIndex).containsExactly(slotIndex); - } - - private String getZustaendigeStelleName(int slotIndex) { - return mapper.getNameForSlotIndex(ZUSTELLUNG_NACHRICHTENBROKER_FIELD, slotIndex); - } - } - - @DisplayName("get name for slot index") - @Nested - class TestGetNameForSlotIndex { - private static Stream<Arguments> nameAndSlotIndexAndExpected() { - return Stream.of( - Arguments.of("name", 0, "name"), - Arguments.of("name", 1, "name2"), - Arguments.of("name", 2, "name3") - ); - } - - @DisplayName("should return name") - @ParameterizedTest - @MethodSource("nameAndSlotIndexAndExpected") - void shouldReturnName(String name, int slotIndex, String expected) { - var resultName = mapper.getNameForSlotIndex(name, slotIndex); - - assertThat(resultName).isEqualTo(expected); - } - } -} diff --git a/semantik-adapter/src/test/resources/A12/a12FormData.json b/semantik-adapter/src/test/resources/A12/a12FormData.json deleted file mode 100644 index 5b93978371da34f8de9145c444e0c9225e2debce..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/test/resources/A12/a12FormData.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "root": { - "Haushaltsjahr": "2024", - "Anlage_2": { - "Finanzierungsplan": { - "Insgesamt_Finanzierungsplan": 117450, - "Eigenmittel_von_Hundert": 1.5, - "Erlaeuterungen_Finanzierungsplan": "Das passt doch schon so.", - "Zuwendung_kommunale": { - "Gemeinden": "Eselstadt", - "Zuwendung_Gemeinden": 100000 - } - } - } - } -} \ No newline at end of file diff --git a/semantik-adapter/src/test/resources/META-INF/services/org.junit.jupiter.api.extension.Extension b/semantik-adapter/src/test/resources/META-INF/services/org.junit.jupiter.api.extension.Extension deleted file mode 100644 index 79b126e6cdb86bec1f4f08c205de8961bde1934a..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/test/resources/META-INF/services/org.junit.jupiter.api.extension.Extension +++ /dev/null @@ -1 +0,0 @@ -org.mockito.junit.jupiter.MockitoExtension \ No newline at end of file diff --git a/semantik-adapter/src/test/resources/attachment-1file.zip b/semantik-adapter/src/test/resources/attachment-1file.zip deleted file mode 100644 index 1bde2108dcd8ce6edf4d1afe2c221ededc9915a1..0000000000000000000000000000000000000000 Binary files a/semantik-adapter/src/test/resources/attachment-1file.zip and /dev/null differ diff --git a/semantik-adapter/src/test/resources/attachment-2files.zip b/semantik-adapter/src/test/resources/attachment-2files.zip deleted file mode 100644 index 1cd6370639e85040002e6b17df7dc2c36b877673..0000000000000000000000000000000000000000 Binary files a/semantik-adapter/src/test/resources/attachment-2files.zip and /dev/null differ diff --git a/semantik-adapter/src/test/resources/attachment-empty.zip b/semantik-adapter/src/test/resources/attachment-empty.zip deleted file mode 100644 index c429aa655987d9210d6fb3c7aa5bfd36e60552ba..0000000000000000000000000000000000000000 Binary files a/semantik-adapter/src/test/resources/attachment-empty.zip and /dev/null differ diff --git a/semantik-adapter/src/test/resources/attachment-encrypted.zip b/semantik-adapter/src/test/resources/attachment-encrypted.zip deleted file mode 100644 index b144825f7836af85657e3abd26fa87da9ec92747..0000000000000000000000000000000000000000 Binary files a/semantik-adapter/src/test/resources/attachment-encrypted.zip and /dev/null differ diff --git a/semantik-adapter/src/test/resources/behoerde_metadata.xml b/semantik-adapter/src/test/resources/behoerde_metadata.xml deleted file mode 100644 index 66b1f000dd1af9e077657cab9f67bf0d3710b32f..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/test/resources/behoerde_metadata.xml +++ /dev/null @@ -1,22 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<data xmlns="http://xmlns.cit.de/assistants/store" name="myForm" class="de.cit.assistants.DataBean"> - <field type="string" readonly="true" name="behoerde_anzeige_name">Landratsamt XYZ (Testbehörde für BDA)</field> - <field type="string" readonly="true" name="behoerde_caller_id">87331322433</field> - <field type="string" readonly="true" name="behoerde_pki_email"></field> - <field type="string" readonly="true" name="behoerde_link"> - https://redesign.bayernportal.bayern.de/dokumente/behoerde/87331322433</field> - <field type="string" readonly="true" name="behoerde_sicherer_kontakt_link"></field> - <field type="string" readonly="true" name="behoerde_postkorb_eakte"></field> - <field type="string" readonly="true" name="behoerde_organisationseinheit_eakte"></field> - <field type="string" readonly="true" name="gemeinde_schluessel_bp">09189155</field> - <field type="string" readonly="true" name="amtlicher_regionalschluessel">091890000000</field> - <field type="string" readonly="true" name="behoerde_email">poststelle@testbehoerde.bayern</field> - <field type="string" readonly="true" name="behoerde_telefon">+49 123 45-0</field> - <field type="string" readonly="true" name="behoerde_telefax">+49 12 45-7</field> - <field type="string" readonly="true" name="behoerde_hausanschrift_strasse">Teststraße 1</field> - <field type="string" readonly="true" name="behoerde_hausanschrift_plz">12345</field> - <field type="string" readonly="true" name="behoerde_hausanschrift_ort">Musterstadt</field> - <field type="string" readonly="true" name="behoerde_safeId"></field> - <field type="string" readonly="true" name="dvdv_praefix">bab</field> - <field type="string" readonly="true" name="dvdv_kennung">09189</field> -</data> \ No newline at end of file diff --git a/semantik-adapter/src/test/resources/eingang.pdf b/semantik-adapter/src/test/resources/eingang.pdf deleted file mode 100644 index 1107550f6d33553de96634c3765aaf787e21e07c..0000000000000000000000000000000000000000 Binary files a/semantik-adapter/src/test/resources/eingang.pdf and /dev/null differ diff --git a/semantik-adapter/src/test/resources/formsolutions/attachment-2files.zip b/semantik-adapter/src/test/resources/formsolutions/attachment-2files.zip deleted file mode 100644 index 1cd6370639e85040002e6b17df7dc2c36b877673..0000000000000000000000000000000000000000 Binary files a/semantik-adapter/src/test/resources/formsolutions/attachment-2files.zip and /dev/null differ diff --git a/semantik-adapter/src/test/resources/formsolutions001.json b/semantik-adapter/src/test/resources/formsolutions001.json deleted file mode 100644 index c3587b8ecf84e5b0433850503c85db4ce7e0837c..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/test/resources/formsolutions001.json +++ /dev/null @@ -1,211 +0,0 @@ -{ - "assistant": { - "i18n": { - "i18nItems": { - "de": "KFAS_KOP_TEST" - } - }, - "identifier": "KFAS_KOP_TEST", - "panels": [ - { - "identifier": "Antragstellende Person", - "components": [ - { - "identifier": "AS_Name1", - "needed": true, - "components": [ - { - "identifier": "AS_Name1", - "needed": true, - "components": [ - { - "identifier": "AS_Vorname", - "needed": true, - "stringValue": "OZG-Cloud" - }, - { - "identifier": "AS_Name", - "needed": true, - "stringValue": "Team" - }, - { - "identifier": "AS_Rufname", - "needed": true - }, - { - "identifier": "AS_Ordensname_Kuenstlername", - "needed": true - } - ] - } - ] - }, - { - "identifier": "AS_Adresse", - "needed": true, - "components": [ - { - "identifier": "AS_Adresse", - "needed": true, - "components": [ - { - "identifier": "Adresse", - "needed": true, - "components": [ - { - "identifier": "staat", - "needed": true, - "components": [ - { - "identifier": "staat", - "needed": true, - "stringValue": "DE" - } - ] - }, - { - "identifier": "AS_PLZ", - "needed": true, - "stringValue": "12345" - }, - { - "identifier": "AS_Ort", - "needed": true, - "stringValue": "Kiel" - }, - { - "identifier": "Bundesland", - "needed": true - }, - { - "identifier": "AS_Strasse", - "needed": true, - "stringValue": "Hauptstra?e" - }, - { - "identifier": "AS_Hausnummer", - "needed": true - } - ] - } - ] - } - ] - }, - { - "identifier": "AS_Kontaktdaten", - "needed": true, - "components": [ - { - "identifier": "AS_Kontaktdaten", - "needed": true, - "components": [ - { - "identifier": "AS_Telefon", - "needed": true - }, - { - "identifier": "AS_E-Mail", - "needed": true, - "stringValue": "noreply@ozg-sh.de" - }, - { - "identifier": "AS_Fax", - "needed": true - }, - { - "identifier": "ofsXX1_from_smail3", - "needed": true, - "stringValue": "noreply@ozg-sh.de" - } - ] - } - ] - } - ], - "needed": true - }, - { - "identifier": "Panel_0", - "components": [ - { - "identifier": "1208_Hund Grunddaten", - "needed": true, - "components": [ - { - "identifier": "1208_Hund Grunddaten", - "needed": true, - "components": [ - { - "identifier": "Hund_Name", - "needed": true, - "stringValue": "Hasso" - }, - { - "identifier": "Hund_Rasse", - "needed": true, - "stringValue": "Sch?ferhund" - }, - { - "identifier": "Hund_Geschlecht", - "needed": true, - "stringValue": "weiblich" - }, - { - "identifier": "Kastration", - "needed": true, - "stringValue": "nein" - }, - { - "identifier": "Hund_Geburtdatum", - "needed": true - }, - { - "identifier": "Hund_Alter", - "needed": true, - "stringValue": "5" - }, - { - "identifier": "Hund_ChipNr", - "needed": true, - "stringValue": "123456789123456" - }, - { - "identifier": "Hund_Taetowierungsnr", - "needed": false - }, - { - "needed": true - }, - { - "identifier": "Hund_Fellfarbe", - "needed": true, - "stringValue": "hell" - }, - { - "identifier": "Hund_Groesse", - "needed": true, - "stringValue": "40" - }, - { - "identifier": "Hund_Gewicht", - "needed": true, - "stringValue": "15" - } - ] - } - ] - } - ], - "needed": true - } - ] - }, - "transactionId": "KFAS_KOP_TEST-yCkgCdqG", - "pdf": "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ZW5kb2JqCjI5IDAgb2JqCjw8L0NvbG9yU3BhY2UvRGV2aWNlR3JheS9TdWJ0eXBlL0ltYWdlL0hlaWdodCAxOS9GaWx0ZXIvRmxhdGVEZWNvZGUvVHlwZS9YT2JqZWN0L1dpZHRoIDE5L0xlbmd0aCAxMzIvQml0c1BlckNvbXBvbmVudCA4Pj5zdHJlYW0KeJxl0AENwCAMBMCXUAmTgAQkTMIkTEIdIGESkDAJSJgEJHQtDEKzTyDhUlqCyD83+9wijCVEYE+HSPQUtA97KiJ1c5S06HS9oo3HSvTYtU6Uc1DKWrSjk64asKtkfGSHulXdaFCbZImYhKtJwkLNCjmycQGeqMwX8/ivtP7XPy90XasiCmVuZHN0cmVhbQplbmRvYmoKMzAgMCBvYmoKPDwvQ29sb3JTcGFjZS9EZXZpY2VSR0IvU3VidHlwZS9JbWFnZS9IZWlnaHQgMTkvRmlsdGVyL0ZsYXRlRGVjb2RlL1R5cGUvWE9iamVjdC9XaWR0aCAxOS9TTWFzayAyOSAwIFIvTGVuZ3RoIDE4L0JpdHNQZXJDb21wb25lbnQgOD4+c3RyZWFtCnicY2AYBaNgFIwCkgEABDsAAQplbmRzdHJlYW0KZW5kb2JqCjMxIDAgb2JqCjw8L0NvbG9yU3BhY2UvRGV2aWNlR3JheS9TdWJ0eXBlL0ltYWdlL0hlaWdodCAxOS9GaWx0ZXIvRmxhdGVEZWNvZGUvVHlwZS9YT2JqZWN0L1dpZHRoIDE5L0xlbmd0aCAzMS9CaXRzUGVyQ29tcG9uZW50IDg+PnN0cmVhbQp4nPv/HxPsb0AF+///b2BABQ2jQgghLOGFCQANA2i1CmVuZHN0cmVhbQplbmRvYmoKMzIgMCBvYmoKPDwvQ29sb3JTcGFjZS9EZXZpY2VSR0IvU3VidHlwZS9JbWFnZS9IZWlnaHQgMTkvRmlsdGVyL0ZsYXRlRGVjb2RlL1R5cGUvWE9iamVjdC9XaWR0aCAxOS9TTWFzayAzMSAwIFIvTGVuZ3RoIDE4L0JpdHNQZXJDb21wb25lbnQgOD4+c3RyZWFtCnicY2AYBaNgFIwCkgEABDsAAQplbmRzdHJlYW0KZW5kb2JqCjMzIDAgb2JqCjw8L0NvbG9yU3BhY2UvRGV2aWNlR3JheS9TdWJ0eXBlL0ltYWdlL0hlaWdodCAxOS9GaWx0ZXIvRmxhdGVEZWNvZGUvVHlwZS9YT2JqZWN0L1dpZHRoIDE5L0xlbmd0aCAzMS9CaXRzUGVyQ29tcG9uZW50IDg+PnN0cmVhbQp4nPv/HxPsb0AF+///b2BABQ2jQgghLOGFCQANA2i1CmVuZHN0cmVhbQplbmRvYmoKMzQgMCBvYmoKPDwvQ29sb3JTcGFjZS9EZXZpY2VSR0IvU3VidHlwZS9JbWFnZS9IZWlnaHQgMTkvRmlsdGVyL0ZsYXRlRGVjb2RlL1R5cGUvWE9iamVjdC9XaWR0aCAxOS9TTWFzayAzMyAwIFIvTGVuZ3RoIDE4L0JpdHNQZXJDb21wb25lbnQgOD4+c3RyZWFtCnicY2AYBaNgFIwCkgEABDsAAQplbmRzdHJlYW0KZW5kb2JqCjM1IDAgb2JqCjw8L0NvbG9yU3BhY2UvRGV2aWNlR3JheS9TdWJ0eXBlL0ltYWdlL0hlaWdodCAxOS9GaWx0ZXIvRmxhdGVEZWNvZGUvVHlwZS9YT2JqZWN0L1dpZHRoIDE5L0xlbmd0aCAxMzIvQml0c1BlckNvbXBvbmVudCA4Pj5zdHJlYW0KeJxl0AENwCAMBMCXUAmTgAQkTMIkTEIdIGESkDAJSJgEJHQtDEKzTyDhUlqCyD83+9wijCVEYE+HSPQUtA97KiJ1c5S06HS9oo3HSvTYtU6Uc1DKWrSjk64asKtkfGSHulXdaFCbZImYhKtJwkLNCjmycQGeqMwX8/ivtP7XPy90XasiCmVuZHN0cmVhbQplbmRvYmoKMzYgMCBvYmoKPDwvQ29sb3JTcGFjZS9EZXZpY2VSR0IvU3VidHlwZS9JbWFnZS9IZWlnaHQgMTkvRmlsdGVyL0ZsYXRlRGVjb2RlL1R5cGUvWE9iamVjdC9XaWR0aCAxOS9TTWFzayAzNSAwIFIvTGVuZ3RoIDE4L0JpdHNQZXJDb21wb25lbnQgOD4+c3RyZWFtCnicY2AYBaNgFIwCkgEABDsAAQplbmRzdHJlYW0KZW5kb2JqCjM3IDAgb2JqCjw8L1N1YnR5cGUvRm9ybS9GaWx0ZXIvRmxhdGVEZWNvZGUvVHlwZS9YT2JqZWN0L01hdHJpeFsxIDAgMCAxIDAgMF0vRm9ybVR5cGUgMS9SZXNvdXJjZXM8PC9Gb250PDwvSGVsdiAx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bHYgMTAgMCBSPj4+Pi9SZWN0WzAgMCAwIDBdL0FQPDwvTiAxMSAwIFI+Pi9GZiAwPj4KZW5kb2JqCjQ5IDAgb2JqCjw8L0JTPDwvUy9TL1cgMT4+L1N1YnR5cGUvV2lkZ2V0L1QoZmlsZVVybCkvVHlwZS9Bbm5vdC9WKGh0dHBzJTNBJTJGJTJGa3VuZGVudGVzdC5mb3JtLXNvbHV0aW9ucy5kZSUyRm1ldGFmb3JtJTJGRm9ybS1Tb2x1dGlvbnMlMkZzaWQlMkZhc3Npc3RhbnQlMkY2MWIyMDhlODY2ZGExMjM2NDRjOTdlNTYlM0ZhbmxpZWdlbklkJTNEMTIzNCUyNm9yZ2FuaXNhdGlvbnNlaW5oZWl0ZW5JRCUzRDkwMzAyMjklMjZrb21tdW5hbHZlcndhbHR1bmdJZCUzRDEwMDAwMDAwMCUyNmNvbnNlbnRDb21wbGV0ZSUzRHRydWUlMjZjYWNoZUlEJTNENGZiNmI2ZTAtMGYxYy00OTcwLWI5ZWQtZGJmMjQyZDMzM2Y5JTI2Y2l0aXplblBvcnRhbExvZ2luU3VjY2VzcyUzRHRydWUpL0YgNi9EQSgvSGVsdiAwIFRmIDAgZyApL0ZUL1R4L0RSPDwvRm9udDw8L0hlbHYgMTAgMCBSPj4+Pi9SZWN0WzAgMCAwIDBdL0FQPDwvTiAxMiAwIFI+Pi9GZiAwPj4KZW5kb2JqCjUwIDAgb2JqCjw8L0JTPDwvUy9TL1cgMT4+L1N1YnR5cGUvV2lkZ2V0L1QoQVNfVm9ybmFtZSkvVHlwZS9Bbm5vdC9WKFN1c2FubmUpL0YgNi9EQSgvSGVsdiAwIFRmIDAgZyApL0ZUL1R4L0RSPDwvRm9udDw8L0hlbHYgMTAgMCBSPj4+Pi9SZWN0WzAgMCAwIDBdL0FQPDwvTiAxNSAwIFI+Pi9GZiAwPj4KZW5kb2JqCjUxIDAgb2JqCjw8L0JTPDwvUy9TL1cgMT4+L1N1YnR5cGUvV2lkZ2V0L1QoQVNfTmFtZSkvVHlwZS9Bbm5vdC9WKEZpc2NoZXIpL0YgNi9EQSgvSGVsdiAwIFRmIDAgZyApL0ZUL1R4L0RSPDwvRm9udDw8L0hlbHYgMTAgMCBSPj4+Pi9SZWN0WzAgMCAwIDBdL0FQPDwvTiAxNiAwIFI+Pi9GZiAwPj4KZW5kb2JqCjUyIDAgb2JqCjw8L0JTPDwvUy9TL1cgMT4+L1N1YnR5cGUvV2lkZ2V0L1QoQVNfUnVmbmFtZSkvVHlwZS9Bbm5vdC9GIDYvREEoL0hlbHYgMCBUZiAwIGcgKS9GVC9UeC9EUjw8L0ZvbnQ8PC9IZWx2IDEwIDAgUj4+Pj4vUmVjdFswIDAgMCAwXS9BUDw8L04gMTcgMCBSPj4vRmYgMD4+CmVuZG9iago1MyAwIG9iago8PC9CUzw8L1MvUy9XIDE+Pi9TdWJ0eXBlL1dpZGdldC9UKEFTX09yZGVuc25hbWVfS3VlbnN0bGVybmFtZSkvVHlwZS9Bbm5vdC9GIDYvREEoL0hlbHYgMCBUZiAwIGcgKS9GVC9UeC9EUjw8L0ZvbnQ8PC9IZWx2IDEwIDAgUj4+Pj4vUmVjdFswIDAgMCAwXS9BUDw8L04gMTggMCBSPj4vRmYgMD4+CmVuZG9iago1NCAwIG9iago8PC9CUzw8L1MvUy9XIDE+Pi9TdWJ0eXBlL1dpZGdldC9UKHN0YWF0KS9UeXBlL0Fubm90L1YoREUpL0YgNi9EQSgvSGVsdiAwIFRmIDAgZyApL0ZUL1R4L0RSPDwvRm9udDw8L0hlbHYgMTAgMCBSPj4+Pi9SZWN0WzAgMCAwIDBdL0FQPDwvTiAxOSAwIFI+Pi9GZiAwPj4KZW5kb2JqCjU1IDAgb2JqCjw8L0JTPDwvUy9TL1cgMT4+L1N1YnR5cGUvV2lkZ2V0L1QoQVNfUExaKS9UeXBlL0Fubm90L1YoMTIzNDUpL0YgNi9EQSgvSGVsdiAwIFRmIDAgZyApL0ZUL1R4L0RSPDwvRm9udDw8L0hlbHYgMTAgMCBSPj4+Pi9SZWN0WzAgMCAwIDBdL0FQPDwvTiAyMCAwIFI+Pi9GZiAwPj4KZW5kb2JqCjU2IDAgb2JqCjw8L0JTPDwvUy9TL1cgMT4+L1N1YnR5cGUvV2lkZ2V0L1QoQVNfT3J0KS9UeXBlL0Fubm90L1YoS2llbCkvRiA2L0RBKC9IZWx2IDAgVGYgMCBnICkvRlQvVHgvRFI8PC9Gb250PDwvSGVsdiAxMCAwIFI+Pj4+L1JlY3RbMCAwIDAgMF0vQVA8PC9OIDIxIDAgUj4+L0ZmIDA+PgplbmRvYmoKNTcgMCBvYmoKPDwvQlM8PC9TL1MvVyAxPj4vU3VidHlwZS9XaWRnZXQvVChCdW5kZXNsYW5kKS9UeXBlL0Fubm90L0YgNi9EQSgvSGVsdiAwIFRmIDAgZyApL0ZUL1R4L0RSPDwvRm9udDw8L0hlbHYgMTAgMCBSPj4+Pi9SZWN0WzAgMCAwIDBdL0FQPDwvTiAyMiAwIFI+Pi9GZiAwPj4KZW5kb2JqCjU4IDAgb2JqCjw8L0JTPDwvUy9TL1cgMT4+L1N1YnR5cGUvV2lkZ2V0L1QoQVNfU3RyYXNzZSkvVHlwZS9Bbm5vdC9WKEhhdXB0c3RyYd9lKS9GIDYvREEoL0hlbHYgMCBUZiAwIGcgKS9GVC9UeC9EUjw8L0ZvbnQ8PC9IZWx2IDEwIDAgUj4+Pj4vUmVjdFswIDAgMCAwXS9BUDw8L04gMjMgMCBSPj4vRmYgMD4+CmVuZG9iago1OSAwIG9iago8PC9CUzw8L1MvUy9XIDE+Pi9TdWJ0eXBlL1dpZGdldC9UKEFTX0hhdXNudW1tZXIpL1R5cGUvQW5ub3QvRiA2L0RBKC9IZWx2IDAgVGYgMCBnICkvRlQvVHgvRFI8PC9Gb250PDwvSGVsdiAxMCAwIFI+Pj4+L1JlY3RbMCAwIDAgMF0vQVA8PC9OIDI0IDAgUj4+L0ZmIDA+PgplbmRvYmoKNjAgMCBvYmoKPDwvQlM8PC9TL1MvVyAxPj4vU3VidHlwZS9XaWRnZXQvVChBU19UZWxlZm9uKS9UeXBlL0Fubm90L0YgNi9EQSgvSGVsdiAwIFRmIDAgZyApL0ZUL1R4L0RSPDwvRm9udDw8L0hlbHYgMTAgMCBSPj4+Pi9SZWN0WzAgMCAwIDBdL0FQPDwvTiAyNSAwIFI+Pi9GZiAwPj4KZW5kb2JqCjYxIDAgb2JqCjw8L0JTPDwvUy9TL1cgMT4+L1N1YnR5cGUvV2lkZ2V0L1QoQVNfRS1NYWlsKS9UeXBlL0Fubm90L1Yobm9yZXBseUBvemctc2guZGU=KS9GIDYvREEoL0hlbHYgMCBUZiAwIGcgKS9GVC9UeC9EUjw8L0ZvbnQ8PC9IZWx2IDEwIDAgUj4+Pj4vUmVjdFswIDAgMCAwXS9BUDw8L04gMjYgMCBSPj4vRmYgMD4+CmVuZG9iago2MiAwIG9iago8PC9CUzw8L1MvUy9XIDE+Pi9TdWJ0eXBlL1dpZGdldC9UKEFTX0ZheCkvVHlwZS9Bbm5vdC9GIDYvREEoL0hlbHYgMCBUZiAwIGcgKS9GVC9UeC9EUjw8L0ZvbnQ8PC9IZWx2IDEwIDAgUj4+Pj4vUmVjdFswIDAgMCAwXS9BUDw8L04gMjcgMCBSPj4vRmYgMD4+CmVuZG9iago2MyAwIG9iago8PC9CUzw8L1MvUy9XIDE+Pi9TdWJ0eXBlL1dpZGdldC9UKG9mc1hYMV9mcm9tX3NtYWlsMykvVHlwZS9Bbm5vdC9WKHN1c2FubmUuZmlzY2hlckBkYXRhcG9ydC5kZSkvRiA2L0RBKC9IZWx2IDAgVGYgMCBnICkvRlQvVHgvRFI8PC9Gb250PDwvSGVsdiAxMCAwIFI+Pj4+L1JlY3RbMCAwIDAgMF0vQVA8PC9OIDI4IDAgUj4+L0ZmIDA+PgplbmRvYmoKNjQgMCBvYmoKPDwvQlM8PC9TL1MvVyAxPj4vU3VidHlwZS9XaWRnZXQvVChIdW5kX05hbWUpL1R5cGUvQW5ub3QvVihIYXNzbykvRiA2L0RBKC9IZWx2IDAgVGYgMCBnICkvRlQvVHgvRFI8PC9Gb250PDwvSGVsdiAxMCAwIFI+Pj4+L1JlY3RbMCAwIDAgMF0vQVA8PC9OIDM3IDAgUj4+L0ZmIDA+PgplbmRvYmoKNjUgMCBvYmoKPDwvQlM8PC9TL1MvVyAxPj4vU3VidHlwZS9XaWRnZXQvVChIdW5kX1Jhc3NlKS9UeXBlL0Fubm90L1YoU2No5GZlcmh1bmQpL0YgNi9EQSgvSGVsdiAwIFRmIDAgZyApL0ZUL1R4L0RSPDwvRm9udDw8L0hlbHYgMTAgMCBSPj4+Pi9SZWN0WzAgMCAwIDBdL0FQPDwvTiAzOCAwIFI+Pi9GZiAwPj4KZW5kb2JqCjY2IDAgb2JqCjw8L0JTPDwvUy9TL1cgMT4+L1N1YnR5cGUvV2lkZ2V0L1QoSHVuZF9HZXNjaGxlY2h0KS9UeXBlL0Fubm90L1Yod2VpYmxpY2gpL0YgNi9EQSgvSGVsdiAwIFRmIDAgZyApL0ZUL1R4L0RSPDwvRm9udDw8L0hlbHYgMTAgMCBSPj4+Pi9SZWN0WzAgMCAwIDBdL0FQPDwvTiAzOSAwIFI+Pi9GZiAwPj4KZW5kb2JqCjY3IDAgb2JqCjw8L0JTPDwvUy9TL1cgMT4+L1N1YnR5cGUvV2lkZ2V0L1QoS2FzdHJhdGlvbikvVHlwZS9Bbm5vdC9WKG5laW4pL0YgNi9EQSgvSGVsdiAwIFRmIDAgZyApL0ZUL1R4L0RSPDwvRm9udDw8L0hlbHYgMTAgMCBSPj4+Pi9SZWN0WzAgMCAwIDBdL0FQPDwvTiA0MCAwIFI+Pi9GZiAwPj4KZW5kb2JqCjY4IDAgb2JqCjw8L0JTPDwvUy9TL1cgMT4+L1N1YnR5cGUvV2lkZ2V0L1QoSHVuZF9HZWJ1cnRkYXR1bSkvVHlwZS9Bbm5vdC9GIDYvREEoL0hlbHYgMCBUZiAwIGcgKS9GVC9UeC9EUjw8L0ZvbnQ8PC9IZWx2IDEwIDAgUj4+Pj4vUmVjdFswIDAgMCAwXS9BUDw8L04gNDEgMCBSPj4vRmYgMD4+CmVuZG9iago2OSAwIG9iago8PC9CUzw8L1MvUy9XIDE+Pi9TdWJ0eXBlL1dpZGdldC9UKEh1bmRfQWx0ZXIpL1R5cGUvQW5ub3QvVig1KS9GIDYvREEoL0hlbHYgMCBUZiAwIGcgKS9GVC9UeC9EUjw8L0ZvbnQ8PC9IZWx2IDEwIDAgUj4+Pj4vUmVjdFswIDAgMCAwXS9BUDw8L04gNDIgMCBSPj4vRmYgMD4+CmVuZG9iago3MCAwIG9iago8PC9CUzw8L1MvUy9XIDE+Pi9TdWJ0eXBlL1dpZGdldC9UKEh1bmRfQ2hpcE5yKS9UeXBlL0Fubm90L1YoMTIzNDU2Nzg5MTIzNDU2KS9GIDYvREEoL0hlbHYgMCBUZiAwIGcgKS9GVC9UeC9EUjw8L0ZvbnQ8PC9IZWx2IDEwIDAgUj4+Pj4vUmVjdFswIDAgMCAwXS9BUDw8L04gNDMgMCBSPj4vRmYgMD4+CmVuZG9iago3MSAwIG9iago8PC9CUzw8L1MvUy9XIDE+Pi9TdWJ0eXBlL1dpZGdldC9UKEh1bmRfRmVsbGZhcmJlKS9U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ZWxkc1s0NyAwIFIgNDggMCBSIDQ5IDAgUiA1MCAwIFIgNTEgMCBSIDUyIDAgUiA1MyAwIFIgNTQgMCBSIDU1IDAgUiA1NiAwIFIgNTcgMCBSIDU4IDAgUiA1OSAwIFIgNjAgMCBSIDYxIDAgUiA2MiAwIFIgNjMgMCBSIDY0IDAgUiA2NSAwIFIgNjYgMCBSIDY3IDAgUiA2OCAwIFIgNjkgMCBSIDcwIDAgUiA3MSAwIFIgNzIgMCBSIDczIDAgUl0vREEoL0hlbHYgMCBUZiAwIGcgKS9EUjw8L0ZvbnQ8PC9IZWx2IDEwIDAgUj4+Pj4+PgplbmRvYmoKODMgMCBvYmoKPDwvVHlwZS9DYXRhbG9nL0Fjcm9Gb3JtIDgyIDAgUi9QYWdlcyA3NSAwIFI+PgplbmRvYmoKeHJlZgowIDg0CjAwMDAwMDAwMDAgNjU1MzUgZiAKMDAwMDAwMDAxNSAwMDAwMCBuIAowMDAwMDAyODA5IDAwMDAwIG4gCjAwMDAwMDQyMDYgMDAwMDAgbiAKMDAwMDAwNTYwNCAwMDAwMCBuIAowMDAwMDA1OTA5IDAwMDAwIG4gCjAwMDAwMDU5ODUgMDAwMDAgbiAKMDAwMDAwNjEyNSAwMDAwMCBuIAowMDAwMDA3NDA2IDAwMDAwIG4gCjAwMDAwMDYzNDEgMDAwMDAgbiAKMDAwMDAwNjU5NSAwMDAwMCBuIAowMDAwMDA2Njg0IDAwMDAwIG4gCjAwMDAwMDY5MzkgMDAwMDAgbiAKMDAwMDAzODI3NyAwMDAwMCBuIAowMDAwMDM4ODA0IDAwMDAwIG4gCjAwMDAwMDc1MzYgMDAwMDAgbiAKMDAwMDAwNzc5NCAwMDAwMCBuIAowMDAwMDA4MDUyIDAwMDAwIG4gCjAwMDAwMDgyNDcgMDAwMDAgbiAKMDAwMDAwODQ0MiAwMDAwMCBuIAowMDAwMDA4Njk1IDAwMDAwIG4gCjAwMDAwMDg5NTEgMDAwMDAgbiAKMDAwMDAwOTIwNiAwMDAwMCBuIAowMDAwMDA5NDAxIDAwMDAwIG4gCjAwMDAwMDk2NjQgMDAwMDAgbiAKMDAwMDAwOTg1OSAwMDAwMCBuIAowMDAwMDEwMDU0IDAwMDAwIG4gCjAwMDAwMTAzMzMgMDAwMDAgbiAKMDAwMDAxMDUyOCAwMDAwMCBuIAowMDAwMDEwODA3IDAwMDAwIG4gCjAwMDAwMTEwOTQgMDAwMDAgbiAKMDAwMDAxMTI3OCAwMDAwMCBuIAowMDAwMDExNDYzIDAwMDAwIG4gCjAwMDAwMTE2NDcgMDAwMDAgbiAKMDAwMDAxMTgzMiAwMDAwMCBuIAowMDAwMDEyMDE2IDAwMDAwIG4gCjAwMDAwMTIzMDMgMDAwMDAgbiAKMDAwMDAxMjQ4NyAwMDAwMCBuIAowMDAwMDEyNzQzIDAwMDAwIG4gCjAwMDAwMTMwMDYgMDAwMDAgbiAKMDAwMDAxMzI2NSAwMDAwMCBuIAowMDAwMDEzNTIwIDAwMDAwIG4gCjAwMDAwMTM3MTUgMDAwMDAgbiAKMDAwMDAxMzk2NyAwMDAwMCBuIAowMDAwMDE0MjI5IDAwMDAwIG4gCjAwMDAwMTQ0ODQgMDAwMDAgbiAKMDAwMDAxNDczNyAwMDAwMCBuIAowMDAwMDE0OTkwIDAwMDAwIG4gCjAwMDAwMTUxNjYgMDAwMDAgbiAKMDAwMDAxNTM1OCAwMDAwMCBuIAowMDAwMDE1ODQ0IDAwMDAwIG4gCjAwMDAwMTYwMjQgMDAwMDAgbiAKMDAwMDAxNjIwMSAwMDAwMCBuIAowMDAwMDE2MzcwIDAwMDAwIG4gCjAwMDAwMTY1NTYgMDAwMDAgbiAKMDAwMDAxNjcyNiAwMDAwMCBuIAowMDAwMDE2OTAwIDAwMDAwIG4gCjAwMDAwMTcwNzMgMDAwMDAgbiAKMDAwMDAxNzI0MiAwMDAwMCBuIAowMDAwMDE3NDI2IDAwMDAwIG4gCjAwMDAwMTc1OTggMDAwMDAgbiAKMDAwMDAxNzc2NyAwMDAwMCBuIAowMDAwMDE3OTY2IDAwMDAwIG4gCjAwMDAwMTgxMzEgMDAwMDAgbiAKMDAwMDAxODMzOSAwMDAwMCBuIAowMDAwMDE4NTE2IDAwMDAwIG4gCjAwMDAwMTg3MDAgMDAwMDAgbiAKMDAwMDAxODg4NiAwMDAwMCBuIAowMDAwMDE5MDYzIDAwMDAwIG4gCjAwMDAwMTkyMzggMDAwMDAgbiAKMDAwMDAxOTQxMiAwMDAwMCBuIAowMDAwMDE5NjAxIDAwMDAwIG4gCjAwMDAwMTk3ODIgMDAwMDAgbiAKMDAwMDAxOTk1OSAwMDAwMCBuIAowMDAwMDIwMTM2IDAwMDAwIG4gCjAwMDAwMjE0MTUgMDAwMDAgbiAKMDAwMDAyMTQ3NSAwMDAwMCBuIAowMDAwMDIzNjMzIDAwMDAwIG4gCjAwMDAwMjE5NTggMDAwMDAgbiAKMDAwMDAyMjA1MiAwMDAwMCBuIAowMDAwMDIzNzkwIDAwMDAwIG4gCjAwMDAwMzgwOTMgMDAwMDAgbiAKMDAwMDAzOTQ0OCAwMDAwMCBuIAowMDAwMDM5NzE0IDAwMDAwIG4gCnRyYWlsZXIKPDwvSW5mbyA0IDAgUi9JRCBbPGVlZWQ2YmEzM2YwZDY5ZjkzZWEyYzZjNWFhM2U0ZWJjPjw4ZGIwNDk0YjcxMmY5ZTE5NTJmZGMwMjI2Mjg3NzdhZj5dL1Jvb3QgODMgMCBSL1NpemUgODQ+PgolaVRleHQtNS41LjUKc3RhcnR4cmVmCjM5Nzc3CiUlRU9GCg==", - "zip": "JVBERi0xLjQKJeLjz9MKMSAwIG9iago8PC9Db2xvclNwYWNlL0RldmljZUdyYXkvU3VidHlwZS9JbWFnZS9IZWlnaHQgOTAvRmlsdGVyL0ZsYXRlRGVjb2RlL1R5cGUvWE9iamVjdC9XaWR0aCAyMjgvTGVuZ3RoIDI2MzgvQml0c1BlckNvbXBvbmVudCA4Pj5zdHJlYW0KeJztm3lcFEcWx2tmYAYFh1MOEQUEB4iIgheIiiGrrFeieCDBqLvRjQdGs0pUNAJGiAQ3HhgxS1RcWW/x45mICSII6qogETWAgKKEwQG55Bhleruqerp7wAHBa/uz/fuDefW6qud9p7vreNUAwIsXL168ePHixYsXL168ePHi9X8hnSVphRkhXd51GG9UiwioEO0VRAakunURvL2QXkmt4hQCaQFiLOiptZF7fn5e3oP9xm80stejqJiYmE3rLXFBPHdVSEjIl6EOwLoGMdbItDYcgSpkdn9Lcb6KUKRKV1z4ApWIn7oDowfIut9ba8PhqMJFs7cU56voCYxU7ozs0dUo7qtk3IIIZEbram3IIcYqGGk5Yux5G4VdNhAWukYp6hQx3bQ35CSj+CiKujGAOmIxsEdbDTnJuBY/jBtecjTgIuOkehR0kr62mhILKzMhU+Qgo1M+ijnHivJ7LwsODl4+RF3NMPDArZKH96/FfaBDebjG+NhB5xQKuWqY2r8JlSOo0uQbhFpHqXGGa4zy3mtwfzOb9m9Ejq+QLVj9jGBUOBo5ucZYuLYWRRzDPG9sxhBCQ6Vu0Mk1xoYm+FeVpMf4WYw+T5H988ejZpxG1q9wZsA1RqymWSw/w6iTjMxo2NmINqMfYxrgKiORw1plMIyjUZVU3J9Kb8HCcdAeo9DhPTs9DY+BTAAs5jiRlsy03ajMnR3g0lXoaNgpqBZCAI9SmlHE+7rSfoYRzw0WA10osBMW8szaYZx+rrisOD3WluWKLPoT8G5cBIBz0dZ2YnLZliMvufS1PRhW8I0IiJxt26n/Uowlg/D92LzoBYwJyLp7+SpU5kP0m7i1zRhUf2ac38xvbwxm+RaluQOvynkA9EoLbTukCWUVUZOnRSsOAOfUpQJglLb3dTCW28rKUciVHq0YBUlEK8kHtckozM0Uw08J6qZ1JfQBT8WnrGq6dC8uZrd2q7reB37aueBZpV7eMfbhTiQeMKMTmNWIYs4wasV4rDWjYkCbjOI/9qhNo1lbjp3dCGP2WNIDM+ovGwmEM73Nwk4k+KOAfXec2WjjO5FqIUysdVC3NlkwTOj/neLO+qj+9l/aQ4/XaovOMjoDUQwOP7YlI/gBWfFz5tH67GOTtu/Vw0+CqClfv4yj4WGFd3rBQXYkZuxBbAai9JunrsZlE1+QVdaqcrcnZ5Qcotr2ub+TPo9LQ6RwVXrd418u+toSMaRDN7myE70QPSfXP4+Cfj6zJeNyZO1o2VCD0dijL/uYzUVl9vfjDUhLYg5DrYgCYEmVJ2a0rI8EwmPERmNgdqrRBnxIJJoDvTX0F4xs+Ct9HlnpV0DXMCepi74I7L5HLvWG1C/tOCKoVjMCpxIUdYFLC0bPSmjVjtPOKFxQWF971J51sGvAydKaoknQNHDo2zMric34lGQ8mwtTSLNV3iCxCaaEpGU/Uk1HNXyiwQjEOUegPUIVCEBEg/Ykmnax8gCTGlDYJ8SajIITyCyegBuYTJmA+gpvhjEAmclSjRObBt1oGgVEs67czLhQv7cl47k0OEwFNHqLzmXBPkk/dzfVbkjVMk1G/d9Qn2OQkgyM8uKEoON6xDACPDEnUNe+kmYEAyuQXbd7rt9H82MuEGUoP+DxjGY8h44/Hd/i1LYPYkFgc7SHvUfewVaMl2AaJbBxuPCn25DRgGY0zLr0QkYwT2XrS4zuBCJIZTGKcRda/wFp+zGMYLYSw6uq6tDn59BpfVfNKPgPPhrU4tTSrJ3iMynQyqYYvRRzWzCOAD8oYTdqVB2vbhZC0A8kZrx1GBUs8iMTUsSgE1rCYgT22Sja38gLZXKeYQSBjzSGjiI4wAjW0ddxD/JWDFWfU7h0krVUYhzWNFYQX2QPDEKIQyKwtM4LDK1fpye0VG4Ewl8uQ8ag56OBT3W6g57ZVuJ7IJq/wY506iY1h5rrdbFauQLIysPIX/7mTakeXAVENz0lpxBemyeCDkr6I3mRGvpRJffLKNxD5NjgcZ00vqb8Lnvu04QlZxejfIjJ3ucEcQ12GAOKoP87+pxd9j8ozjyeWRxM3uf38refPnFCFSsJrvECRjdUqWMMnn1LMmbAp/cTJXnvzXnYmJJ9Rh4PTGsINEWQblFU/Zr2uHgVcJKTjGCx8k4q7IecagvMgWAXkdlRRiCZFp+SSo+65n9PkddVFowkTevlh68toKu5Lfjn6fSM5P3RczzUMw1JwK60BBNoDUnIPPd5V9ZJZdNDIj5zRNb6uCWG+qER0j4zyEvuHBnnCaaTMwjfsfDK2M6EI3r/lds/Nbm/C4imr6B6zaFr4rcvJEcjqT9KOkzducOH/NAvhj+je7hvhxlJmVqyUsWm/Tzc+uK8qsRao6vsZm5hrKPREJh3x/2cwNIIvJJciRXt1vF/4vpqX/LOZLHsfUtTz7zcXm1XE1u8dzu5899iM8iTSTjq9p8yL+jPaI9HIhvB2u6wGjjSZ3g/zW2qXkPdO9XRsSVLlj+4V31tWDvVBj2sYJ6ojspha3bdYxd1yevAYzjUjSBNv8NFRJjaP3zzlapm1bM/zq+2o1v22Xaz4XqbufSXksQjYP4Eg/Zqmc/+sNMbvo5wcKtUM/qXoa5zHfl8BsIZUDh260fL6W71DjWhBX1hy2yrF530f0zR7PHRB6OcJnsW2yJmfJQeZI+OjYuRU7gNFq5bvqvAO6AsFqMVnrA8hGuIQGaeI8JjPFGWX4o+lWgQtrnHGcZyhlEnESE0+cNCGMM4B5m1kZ52g9ejZcrvsOfp38gZRmZtpU4VxyB/NM1ojCZ49XORe2GTesLqoeQMI7O2Gocn3Klo5sJaW01BFyyRqn8BFlLIqY57E/cY7X5HVIrh2M8wRiJrpaMMyhFl6QptOMmofxLfqcGUn2H8N7Iq5eVQcnSxS905yCgD4Rhxn4jyM3m540QrlXGR0c4PL4Nv0SEz1/EwsupYasjvxz3Gool4F7lhLO1nGGORFdVbRsvJQcI9RsU9fA+GM36GcSHaC7kkadGQa4yUjrOWiwyjDG1xENH0IbxG5iaj8sX7j9TN+jzOmoQTSIbGb0GXlGuMT/BENItZN7EZe9zFv0Hpwch/HMlVEk1oOc41xsIZxYji5Iv2H8lFZbHm0LEDJji4xlhu89FzFP03tB8zrsOFAT9rMJbAjWDOMfYFeNvqGb3XEKlSKpWqNVTJ8C/pVB6ZaLwSOhAmODjH6AxMcEK/wpPyW7m5uroOYDb7JAP+tulf+2JDpzlRgwgHGYEb3rbKednkBRcZwVR8Nx5p451VtjjJCDYQ7H5G/P6CSW3hcpOxK95obIZvGIHuxxqam1IdtTfkECN6/1+Bc48OeNoK39rAWTfigJ7WhhxiRJHWUPnViXg3NccWdMfvssi1p6Y5xDjBf/Jk//HqB2/wuDFjxvhN7Al64hchq7X/f8cQVOGW9dsJ801IgvaXiava/0XFdtfehITEiNfyQts7kg/cOlZMfddhvFkNS0xLGtt+NV68ePHixYsXB/Vf2tCAfAplbmRzdHJlYW0KZW5kb2JqCjIgMCBvYmoKPDwvQ29sb3JTcGFjZS9EZXZpY2VSR0IvU3VidHlwZS9JbWFnZS9IZWlnaHQgOTAvRmlsdGVyL0ZsYXRlRGVjb2RlL1R5cGUvWE9iamVjdC9XaWR0aCAyMjgvU01hc2sgMSAwIFIvTGVuZ3RoIDEyMzAvQml0c1BlckNvbXBvbmVudCA4Pj5zdHJlYW0KeJztnN9PlXUcx7/WXNh0FWiISyk5aXOCmoqUFEpdOCRzE7lNbOKmVybKdCmcjuA5nFZzzPUPtIxR68K1LkoqHakoekCGSKBWKF7QDAWGIDx9HyA8fATWheP94fB+7XXBj+95zvY5rz37Puc84DiEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBBCCCGETBBmYRqlo4puUwIfCFUruk0JfCBUreg2JfCBULWi25TAB0LVim5TAh8IVSu6TQl8IFSt6DYl8IFQtaLblMAHQtWKblMCHwhVK7pNCXwgVK3oNiXwgVC1otuUwAdC1YpuUwIfCFUruk0JfCBUreg2JfCBULWi25TAB0LVim5TAh8IVSu6TQl8IFSt6DYl8IFQtaLblMAHQtWKblMCHwhVK7pNCXwgVK3oNiXwgVC1otuUwAdC1YpuUwIfCFUruk0JfCBUreg2JfCBULWi25TAB0LVim5TgpzGK28PiX5R6Kii25SY+FSYC9aa+W+YBW+Ot2bhQNLxa//X0Zh9RLe699T1IX9q3vfLHwcrWw9U3g43r+LGozUDy/b/+ufwMvuFfZT9oVjz2KFa836+OWLNf8sOuMta88+0uN9W3Mwtr0764HBmoGzW4ndnvv6+iV05be6qzZ99e/C3O+M8ha+mLS3/+NPzUphrBLf6Sc39IUP3j1zp9Df0HL36IFxfbcejNQPLiuq6hpfZL+yj7A/FGnmohh6fXVbz+LIu+ytrUX23OIhd/3FVW8KGnRuPngg29Y/22BFPceyWE/dOjoldBX+JI0Z0m5LCS/+EW1B9t1A4coFYVjDGglEONcaycX7rvdxe0tRfXN891rOEP4XNflOwfLpnPU+tU6TVyavttqSxLypxo3n5LfirHBmi25TAG3uC2u3KhyfO2S2uSVgHf6EjQHSbEnhgT1C7j7XXWdHJW5grW9Wv3dzmn26Zk5xlXmSubFW1dtfqv9Zrc42xZ9e4ZHfvGi4vu9iqJm2uxVcf5J9piU7JjlqyISoxY9AZSZnTPOvdjwx4vmWrmrTXWYPdDutv6M0qPTkjIY1vFLBV5dpcj7U4ni17TMxyeAaTQnSbEnhCE+mRK507ys4/uzRj6E4Dyla1ak+twSYnNn2be8MMugT9otuUwPuZYL2he3tP3TBzV/MKi60q13u5/VBV2+LsfWY+T61sVbv+hp5d34XMc0t5amWryvWG2n21HSm7gyZmGbwHzaLblMDLgVjS1J/9xQ9R8al8r5WtKreg+u7nfzmL7K41mqdWtqrdorqunC8rp3vS3U9d0VXoFN2mBN4MSntqDTQ+zP2m+il7hRXPXNmqdv3XeneWX3zGs87MW8O3BdiqcgONfTvKqp5PzOBmgK0q172n5ZaTlFNoXkiC56FKdJsSeCoa9NV2fPRjc/SaLPNSCm9rYauatafWorquwxf+zrV711fTzewV7v8ZmPJ/RIBuUwLvRI/e0L1A48PtX5197b3d7g0DcavhtbDVcOCFqLLA/Z8YncHrzqfNTmpe6RS/vwXdpgSeh07tliCvYuDWQXQwbHUYeBVqLa7vzvR/7e5d0c2w1UHgSag18Hvf1uPfT+U/zkK3KYEnoVZ7nZVVepKtEkIIIYQQQgghhBBCCJmk/AvtiBAjCmVuZHN0cmVhbQplbmRvYmoKMyAwIG9iago8PC9Db2xvclNwYWNlWy9JbmRleGVkWy9DYWxSR0I8PC9HYW1tYVsyLjIgMi4yIDIuMl0vV2hpdGVQb2ludFswLjk1MDQzIDEgMS4wOV0vTWF0cml4WzAuNDEyMzkgMC4yMTI2NCAwLjAxOTMzIDAuMzU3NTggMC43MTUxNyAwLjExOTE5IDAuMTgwNDUgMC4wNzIxOCAwLjk1MDRdPj5dIDI1NSgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApXS9NYXNrIFsyNTUgMjU1XS9TdWJ0eXBlL0ltYWdlL0hlaWdodCA5MC9GaWx0ZXIvRmxhdGVEZWNvZGUvVHlwZS9YT2JqZWN0L0RlY29kZVBhcm1zPDwvQ29sdW1ucyA3NTAvQ29sb3JzIDEvUHJlZGljdG9yIDE1L0JpdHNQZXJDb21wb25lbnQgOD4+L1dpZHRoIDc1MC9MZW5ndGggMjQ4L0JpdHNQZXJDb21wb25lbnQgOD4+c3RyZWFtCnhe7dIBAQAACMMg+5e+QQYZuEGG7oToTojuhOhOiO6E6E6I7oToTojuhOhOiO6E6E6I7oToTojuhOhOiO6E6E6I7oToTojuhOhOiO6E6E6I7oToTojuhOhOiO6E6E6I7oToTojuhOhOiO6E6E6I7oToTojuhOhOiO6E6E6I7oToTojuhOhOiO6E6E6I7oToTojuhOhOiO6E6E6I7oToTojuhOhOiO6E6E6I7oToTojuhOhOiO6E6E6I7oToTojuhOhOiO6E6E6I7oToTojuhOhOiO6E6E6I7oToTojuhOhOiO6E6E6I7oToTojuhOhOiO5kbA9JQrOvCmVuZHN0cmVhbQplbmRvYmoKNCAwIG9iago8PC9Nb2REYXRlKEQ6MjAyMjAzMTYxNDAzMTIrMDEnMDAnKS9DcmVhdG9yKDAxMDAyMDAwLTAwMDEtMDAwMCkvQ3JlYXRpb25EYXRlKEQ6MjAyMjAzMTYxNDAzMTIrMDEnMDAnKS9Qcm9kdWNlcihpVGV4dK4gNS41LjUgqTIwMDAtMjAxNCBpVGV4dCBHcm91cCBOViBcKEFHUEwtdmVyc2lvblwpOyBtb2RpZmllZCB1c2luZyBpVGV4dK4gNS41LjUgqTIwMDAtMjAxNCBpVGV4dCBHcm91cCBOViBcKEFHUEwtdmVyc2lvblwpKS9BdXRob3IoMDEwMDIwMDAtMDAwMS0wMDAwKS9UaXRsZShLRkFTX0tPUF9URVNUKT4+CmVuZG9iago1IDAgb2JqCjw8L0ZpbHRlci9GbGF0ZURlY29kZS9MZW5ndGggMTA+PnN0cmVhbQp4nCvkAgAA7gB8CmVuZHN0cmVhbQplbmRvYmoKNiAwIG9iago8PC9GaWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoIDc0Pj5zdHJlYW0KeJxTCOQq5CpUMDQ01jM1VjAAQhMTPQsjBVMTBXMTYz1DC4XkXAX9iExDBZd8BaBaBWNzYz0TcySVhmbmIK0oqo0gqgO5AKdpE9sKZW5kc3RyZWFtCmVuZG9iago3IDAgb2JqCjw8L1N1YnR5cGUvRm9ybS9GaWx0ZXIvRmxhdGVEZWNvZGUvVHlwZS9YT2JqZWN0L01hdHJpeFsxIDAgMCAxIDAgMF0vRm9ybVR5cGUgMS9SZXNvdXJjZXM8PC9Gb250PDwvRjIgOCAwIFI+Pj4+L0JCb3hbMCAwIDMwIDEyXS9MZW5ndGggNDU+PnN0cmVhbQp4nCvkcgrhMlQwAEIQaaQQksul72akYKkQksalwSCqGZLF5RrCFcgFAKWTB9sKZW5kc3RyZWFtCmVuZG9iago5IDAgb2JqCjw8L1N1YnR5cGUvRm9ybS9GaWx0ZXIvRmxhdGVEZWNvZGUvVHlwZS9YT2JqZWN0L01hdHJpeFsxIDAgMCAxIDAgMF0vRm9ybVR5cGUgMS9SZXNvdXJjZXM8PC9Gb250PDwvSGVsdiAxMCAwIFI+Pj4+L0JCb3hbMCAwIDAgMF0vTGVuZ3RoIDgyPj5zdHJlYW0KeJwrVAhU0A+pUHDydVYoVDAEQl0jECpKVQhXyAMKOYUAxQyA0FDBCIhDchX0PVJzyhRMFELSgKLpChqGRsYmmiFZYI5rCNC8QAVXoGkArDEUjQplbmRzdHJlYW0KZW5kb2JqCjEwIDAgb2JqCjw8L1N1YnR5cGUvVHlwZTEvVHlwZS9Gb250L0Jhc2VGb250L0hlbHZldGljYS9FbmNvZGluZy9XaW5BbnNpRW5jb2Rpbmc+PgplbmRvYmoKMTEgMCBvYmoKPDwvU3VidHlwZS9Gb3JtL0ZpbHRlci9GbGF0ZURlY29kZS9UeXBlL1hPYmplY3QvTWF0cml4WzEgMCAwIDEgMCAwXS9Gb3JtVHlwZSAxL1Jlc291cmNlczw8L0ZvbnQ8PC9IZWx2IDEwIDAgUj4+Pj4vQkJveFswIDAgMCAwXS9MZW5ndGggODI+PnN0cmVhbQp4nCtUCFTQD6lQcPJ1VihUMARCXSMQKkpVCFfIAwo5hQDFDIDQUMEIiENyFfQ9UnPKFEwUQtKAoukKGoYGUKAZkgUWcQ0BGhqo4Ao0EgAQkxV0CmVuZHN0cmVhbQplbmRvYmoKMTIgMCBvYmoKPDwvU3VidHlwZS9Gb3JtL0ZpbHRlci9GbGF0ZURlY29kZS9UeXBlL1hPYmplY3QvTWF0cml4WzEgMCAwIDEgMCAwXS9Gb3JtVHlwZSAxL1Jlc291cmNlczw8L0ZvbnQ8PC9IZWx2IDEwIDAgUj4+Pj4vQkJveFswIDAgMCAwXS9MZW5ndGggMjkzPj5zdHJlYW0KeJw1UU1PwzAM/Su5VIJDR5qEbD2yL4EEEtMqcU4Ttwtrk61xB+LX444RO5b13suzFJ/Zjj1U32z5tmJnVlDkYsoB2AcLBC0rwjhFwQTdqmcPz9BdmGJVQ2jL7g6Ip5TJp0xsKY9jcBAQEs6aOPR5it2IPoY0c0B0D2gmnNrtRO//aQKSd1RNSj6hCUi9LmrBF7DQ2plCSK2ULefwqDO5NaHz0EJ4cZlcE6cyoePQmuCTuRqCDwfwSIo1KUouuRAliY6x78dgugsMX6bDMbR/Fvx2SGKn5wFXsT91gEAsDiNMhLEHuPqppta1Bp7zprC5Kuc8r0twuasboYSTUjbTMOvR/0B4jwOa7jW2PuxHayGlm+d99Xn9xE1Fe9ixDW3hF9b+e2gKZW5kc3RyZWFtCmVuZG9iago4IDAgb2JqCjw8L1N1YnR5cGUvVHlwZTAvVHlwZS9Gb250L0Jhc2VGb250L1JIVEVVWitOb3RvU2Fucy9FbmNvZGluZy9JZGVudGl0eS1IL0Rlc2NlbmRhbnRGb250c1sxMyAwIFJdL1RvVW5pY29kZSAxNCAwIFI+PgplbmRvYmoKMTUgMCBvYmoKPDwvU3VidHlwZS9Gb3JtL0ZpbHRlci9GbGF0ZURlY29kZS9UeXBlL1hPYmplY3QvTWF0cml4WzEgMCAwIDEgMCAwXS9Gb3JtVHlwZSAxL1Jlc291cmNlczw8L0ZvbnQ8PC9IZWx2IDEwIDAgUj4+Pj4vQkJveFswIDAgMCAwXS9MZW5ndGggODU+PnN0cmVhbQp4nCtUCFTQD6lQcPJ1VihUMARCXSMQKkpVCFfIAwo5hQDFDIDQUMEIiENyFfQ9UnPKFEwUQtKAoukKGsGlxYl5eamaIVlgvmsI0MhABVeggQALBRagCmVuZHN0cmVhbQplbmRvYmoKMTYgMCBvYmoKPDwvU3VidHlwZS9Gb3JtL0ZpbHRlci9GbGF0ZURlY29kZS9UeXBlL1hPYmplY3QvTWF0cml4WzEgMCAwIDEgMCAwXS9Gb3JtVHlwZSAxL1Jlc291cmNlczw8L0ZvbnQ8PC9IZWx2IDEwIDAgUj4+Pj4vQkJveFswIDAgMCAwXS9MZW5ndGggODU+PnN0cmVhbQp4nCtUCFTQD6lQcPJ1VihUMARCXSMQKkpVCFfIAwo5hQDFDIDQUMEIiENyFfQ9UnPKFEwUQtKAoukKGm6ZxckZqUWaIVlgvmsI0MhABVeggQAIeBaHCmVuZHN0cmVhbQplbmRvYmoKMTcgMCBvYmoKPDwvU3VidHlwZS9Gb3JtL0ZpbHRlci9GbGF0ZURlY29kZS9UeXBlL1hPYmplY3QvTWF0cml4WzEgMCAwIDEgMCAwXS9Gb3JtVHlwZSAxL1Jlc291cmNlczw8L0ZvbnQ8PC9IZWx2IDEwIDAgUj4+Pj4vQkJveFswIDAgMCAwXS9MZW5ndGggMjI+PnN0cmVhbQp4nCtUCFTQD6lQcPJ1VnAFYgAjrAQFCmVuZHN0cmVhbQplbmRvYmoKMTggMCBvYmoKPDwvU3VidHlwZS9Gb3JtL0ZpbHRlci9GbGF0ZURlY29kZS9UeXBlL1hPYmplY3QvTWF0cml4WzEgMCAwIDEgMCAwXS9Gb3JtVHlwZSAxL1Jlc291cmNlczw8L0ZvbnQ8PC9IZWx2IDEwIDAgUj4+Pj4vQkJveFswIDAgMCAwXS9MZW5ndGggMjI+PnN0cmVhbQp4nCtUCFTQD6lQcPJ1VnAFYgAjrAQFCmVuZHN0cmVhbQplbmRvYmoKMTkgMCBvYmoKPDwvU3VidHlwZS9Gb3JtL0ZpbHRlci9GbGF0ZURlY29kZS9UeXBlL1hPYmplY3QvTWF0cml4WzEgMCAwIDEgMCAwXS9Gb3JtVHlwZSAxL1Jlc291cmNlczw8L0ZvbnQ8PC9IZWx2IDEwIDAgUj4+Pj4vQkJveFswIDAgMCAwXS9MZW5ndGggODA+PnN0cmVhbQp4nCtUCFTQD6lQcPJ1VihUMARCXSMQKkpVCFfIAwo5hQDFDIDQUMEIiENyFfQ9UnPKFEwUQtKAoukKGi6umiFZYKZrCNC0QAVXoFkAh40UTAplbmRzdHJlYW0KZW5kb2JqCjIwIDAgb2JqCjw8L1N1YnR5cGUvRm9ybS9GaWx0ZXIvRmxhdGVEZWNvZGUvVHlwZS9YT2JqZWN0L01hdHJpeFsxIDAgMCAxIDAgMF0vRm9ybVR5cGUgMS9SZXNvdXJjZXM8PC9Gb250PDwvSGVsdiAxMCAwIFI+Pj4+L0JCb3hbMCAwIDAgMF0vTGVuZ3RoIDgzPj5zdHJlYW0KeJwrVAhU0A+pUHDydVYoVDAEQl0jECpKVQhXyAMKOYUAxQyA0FDBCIhDchX0PVJzyhRMFELSgKLpChqGRsYmppohWWCeawjQwEAFV6BxAMB0FMIKZW5kc3RyZWFtCmVuZG9iagoyMSAwIG9iago8PC9TdWJ0eXBlL0Zvcm0vRmlsdGVyL0ZsYXRlRGVjb2RlL1R5cGUvWE9iamVjdC9NYXRyaXhbMSAwIDAgMSAwIDBdL0Zvcm1UeXBlIDEvUmVzb3VyY2VzPDwvRm9udDw8L0hlbHYgMTAgMCBSPj4+Pi9CQm94WzAgMCAwIDBdL0xlbmd0aCA4Mj4+c3RyZWFtCnicK1QIVNAPqVBw8nVWKFQwBEJdIxAqSlUIV8gDCjmFAMUMgNBQwQiIQ3IV9D1Sc8oUTBRC0oCi6Qoa3pmpOZohWWCOawjQvEAFV6BpALu7FUgKZW5kc3RyZWFtCmVuZG9iagoyMiAwIG9iago8PC9TdWJ0eXBlL0Zvcm0vRmlsdGVyL0ZsYXRlRGVjb2RlL1R5cGUvWE9iamVjdC9NYXRyaXhbMSAwIDAgMSAwIDBdL0Zvcm1UeXBlIDEvUmVzb3VyY2VzPDwvRm9udDw8L0hlbHYgMTAgMCBSPj4+Pi9CQm94WzAgMCAwIDBdL0xlbmd0aCAyMj4+c3RyZWFtCnicK1QIVNAPqVBw8nVWcAViACOsBAUKZW5kc3RyZWFtCmVuZG9iagoyMyAwIG9iago8PC9TdWJ0eXBlL0Zvcm0vRmlsdGVyL0ZsYXRlRGVjb2RlL1R5cGUvWE9iamVjdC9NYXRyaXhbMSAwIDAgMSAwIDBdL0Zvcm1UeXBlIDEvUmVzb3VyY2VzPDwvRm9udDw8L0hlbHYgMTAgMCBSPj4+Pi9CQm94WzAgMCAwIDBdL0xlbmd0aCA5MD4+c3RyZWFtCnicK1QIVNAPqVBw8nVWKFQwBEJdIxAqSlUIV8gDCjmFAMUMgNBQwQiIQ3IV9D1Sc8oUTBRC0oCi6QoaHomlBSXFJUWJ91M1Q7LAYq4hQGMDFVyBhgIAgVAYwwplbmRzdHJlYW0KZW5kb2JqCjI0IDAgb2JqCjw8L1N1YnR5cGUvRm9ybS9GaWx0ZXIvRmxhdGVEZWNvZGUvVHlwZS9YT2JqZWN0L01hdHJpeFsxIDAgMCAxIDAgMF0vRm9ybVR5cGUgMS9SZXNvdXJjZXM8PC9Gb250PDwvSGVsdiAxMCAwIFI+Pj4+L0JCb3hbMCAwIDAgMF0vTGVuZ3RoIDIyPj5zdHJlYW0KeJwrVAhU0A+pUHDydVZwBWIAI6wEBQplbmRzdHJlYW0KZW5kb2JqCjI1IDAgb2JqCjw8L1N1YnR5cGUvRm9ybS9GaWx0ZXIvRmxhdGVEZWNvZGUvVHlwZS9YT2JqZWN0L01hdHJpeFsxIDAgMCAxIDAgMF0vRm9ybVR5cGUgMS9SZXNvdXJjZXM8PC9Gb250PDwvSGVsdiAxMCAwIFI+Pj4+L0JCb3hbMCAwIDAgMF0vTGVuZ3RoIDIyPj5zdHJlYW0KeJwrVAhU0A+pUHDydVZwBWIAI6wEBQplbmRzdHJlYW0KZW5kb2JqCjI2IDAgb2JqCjw8L1N1YnR5cGUvRm9ybS9GaWx0ZXIvRmxhdGVEZWNvZGUvVHlwZS9YT2JqZWN0L01hdHJpeFsxIDAgMCAxIDAgMF0vRm9ybVR5cGUgMS9SZXNvdXJjZXM8PC9Gb250PDwvSGVsdiAxMCAwIFI+Pj4+L0JCb3hbMCAwIDAgMF0vTGVuZ3RoIDEwNT4+c3RyZWFtCnicHY3NCkBQFIRfZZYs/OYBRMrGQp2yvnH8xcW9yOM7NDObr6nvQI2AHmRVjgORxIu/GkYDLSgjYaEkQiyjFUHJy40E1Asd4NjLKq3Z7yfbjmzSTp1q38zpd+zS/H8KEk2NQiQvXaceaAplbmRzdHJlYW0KZW5kb2JqCjI3IDAgb2JqCjw8L1N1YnR5cGUvRm9ybS9GaWx0ZXIvRmxhdGVEZWNvZGUvVHlwZS9YT2JqZWN0L01hdHJpeFsxIDAgMCAxIDAgMF0vRm9ybVR5cGUgMS9SZXNvdXJjZXM8PC9Gb250PDwvSGVsdiAxMCAwIFI+Pj4+L0JCb3hbMCAwIDAgMF0vTGVuZ3RoIDIyPj5zdHJlYW0KeJwrVAhU0A+pUHDydVZwBWIAI6wEBQplbmRzdHJlYW0KZW5kb2JqCjI4IDAgb2JqCjw8L1N1YnR5cGUvRm9ybS9GaWx0ZXIvRmxhdGVEZWNvZGUvVHlwZS9YT2JqZWN0L01hdHJpeFsxIDAgMCAxIDAgMF0vRm9ybVR5cGUgMS9SZXNvdXJjZXM8PC9Gb250PDwvSGVsdiAxMCAwIFI+Pj4+L0JCb3hbMCAwIDAgMF0vTGVuZ3RoIDEwNT4+c3RyZWFtCnicHY3NCkBQFIRfZZYs/OYBRMrGQp2yvnH8xcW9yOM7NDObr6nvQI2AHmRVjgORxIu/GkYDLSgjYaEkQiyjFUHJy40E1Asd4NjLKq3Z7yfbjmzSTp1q38zpd+zS/H8KEk2NQiQvXaceaAplbmRzdHJlYW0KZW5kb2JqCjI5IDAgb2JqCjw8L0NvbG9yU3BhY2UvRGV2aWNlR3JheS9TdWJ0eXBlL0ltYWdlL0hlaWdodCAxOS9GaWx0ZXIvRmxhdGVEZWNvZGUvVHlwZS9YT2JqZWN0L1dpZHRoIDE5L0xlbmd0aCAxMzIvQml0c1BlckNvbXBvbmVudCA4Pj5zdHJlYW0KeJxl0AENwCAMBMCXUAmTgAQkTMIkTEIdIGESkDAJSJgEJHQtDEKzTyDhUlqCyD83+9wijCVEYE+HSPQUtA97KiJ1c5S06HS9oo3HSvTYtU6Uc1DKWrSjk64asKtkfGSHulXdaFCbZImYhKtJwkLNCjmycQGeqMwX8/ivtP7XPy90XasiCmVuZHN0cmVhbQplbmRvYmoKMzAgMCBvYmoKPDwvQ29sb3JTcGFjZS9EZXZpY2VSR0IvU3VidHlwZS9JbWFnZS9IZWlnaHQgMTkvRmlsdGVyL0ZsYXRlRGVjb2RlL1R5cGUvWE9iamVjdC9XaWR0aCAxOS9TTWFzayAyOSAwIFIvTGVuZ3RoIDE4L0JpdHNQZXJDb21wb25lbnQgOD4+c3RyZWFtCnicY2AYBaNgFIwCkgEABDsAAQplbmRzdHJlYW0KZW5kb2JqCjMxIDAgb2JqCjw8L0NvbG9yU3BhY2UvRGV2aWNlR3JheS9TdWJ0eXBlL0ltYWdlL0hlaWdodCAxOS9GaWx0ZXIvRmxhdGVEZWNvZGUvVHlwZS9YT2JqZWN0L1dpZHRoIDE5L0xlbmd0aCAzMS9CaXRzUGVyQ29tcG9uZW50IDg+PnN0cmVhbQp4nPv/HxPsb0AF+///b2BABQ2jQgghLOGFCQANA2i1CmVuZHN0cmVhbQplbmRvYmoKMzIgMCBvYmoKPDwvQ29sb3JTcGFjZS9EZXZpY2VSR0IvU3VidHlwZS9JbWFnZS9IZWlnaHQgMTkvRmlsdGVyL0ZsYXRlRGVjb2RlL1R5cGUvWE9iamVjdC9XaWR0aCAxOS9TTWFzayAzMSAwIFIvTGVuZ3RoIDE4L0JpdHNQZXJDb21wb25lbnQgOD4+c3RyZWFtCnicY2AYBaNgFIwCkgEABDsAAQplbmRzdHJlYW0KZW5kb2JqCjMzIDAgb2JqCjw8L0NvbG9yU3BhY2UvRGV2aWNlR3JheS9TdWJ0eXBlL0ltYWdlL0hlaWdodCAxOS9GaWx0ZXIvRmxhdGVEZWNvZGUvVHlwZS9YT2JqZWN0L1dpZHRoIDE5L0xlbmd0aCAzMS9CaXRzUGVyQ29tcG9uZW50IDg+PnN0cmVhbQp4nPv/HxPsb0AF+///b2BABQ2jQgghLOGFCQANA2i1CmVuZHN0cmVhbQplbmRvYmoKMzQgMCBvYmoKPDwvQ29sb3JTcGFjZS9EZXZpY2VSR0IvU3VidHlwZS9JbWFnZS9IZWlnaHQgMTkvRmlsdGVyL0ZsYXRlRGVjb2RlL1R5cGUvWE9iamVjdC9XaWR0aCAxOS9TTWFzayAzMyAwIFIvTGVuZ3RoIDE4L0JpdHNQZXJDb21wb25lbnQgOD4+c3RyZWFtCnicY2AYBaNgFIwCkgEABDsAAQplbmRzdHJlYW0KZW5kb2JqCjM1IDAgb2JqCjw8L0NvbG9yU3BhY2UvRGV2aWNlR3JheS9TdWJ0eXBlL0ltYWdlL0hlaWdodCAxOS9GaWx0ZXIvRmxhdGVEZWNvZGUvVHlwZS9YT2JqZWN0L1dpZHRoIDE5L0xlbmd0aCAxMzIvQml0c1BlckNvbXBvbmVudCA4Pj5zdHJlYW0KeJxl0AENwCAMBMCXUAmTgAQkTMIkTEIdIGESkDAJSJgEJHQtDEKzTyDhUlqCyD83+9wijCVEYE+HSPQUtA97KiJ1c5S06HS9oo3HSvTYtU6Uc1DKWrSjk64asKtkfGSHulXdaFCbZImYhKtJwkLNCjmycQGeqMwX8/ivtP7XPy90XasiCmVuZHN0cmVhbQplbmRvYmoKMzYgMCBvYmoKPDwvQ29sb3JTcGFjZS9EZXZpY2VSR0IvU3VidHlwZS9JbWFnZS9IZWlnaHQgMTkvRmlsdGVyL0ZsYXRlRGVjb2RlL1R5cGUvWE9iamVjdC9XaWR0aCAxOS9TTWFzayAzNSAwIFIvTGVuZ3RoIDE4L0JpdHNQZXJDb21wb25lbnQgOD4+c3RyZWFtCnicY2AYBaNgFIwCkgEABDsAAQplbmRzdHJlYW0KZW5kb2JqCjM3IDAgb2JqCjw8L1N1YnR5cGUvRm9ybS9GaWx0ZXIvRmxhdGVEZWNvZGUvVHlwZS9YT2JqZWN0L01hdHJpeFsxIDAgMCAxIDAgMF0vRm9ybVR5cGUgMS9SZXNvdXJjZXM8PC9Gb250PDwvSGVsdiAx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bHYgMTAgMCBSPj4+Pi9SZWN0WzAgMCAwIDBdL0FQPDwvTiAxMSAwIFI+Pi9GZiAwPj4KZW5kb2JqCjQ5IDAgb2JqCjw8L0JTPDwvUy9TL1cgMT4+L1N1YnR5cGUvV2lkZ2V0L1QoZmlsZVVybCkvVHlwZS9Bbm5vdC9WKGh0dHBzJTNBJTJGJTJGa3VuZGVudGVzdC5mb3JtLXNvbHV0aW9ucy5kZSUyRm1ldGFmb3JtJTJGRm9ybS1Tb2x1dGlvbnMlMkZzaWQlMkZhc3Npc3RhbnQlMkY2MWIyMDhlODY2ZGExMjM2NDRjOTdlNTYlM0ZhbmxpZWdlbklkJTNEMTIzNCUyNm9yZ2FuaXNhdGlvbnNlaW5oZWl0ZW5JRCUzRDkwMzAyMjklMjZrb21tdW5hbHZlcndhbHR1bmdJZCUzRDEwMDAwMDAwMCUyNmNvbnNlbnRDb21wbGV0ZSUzRHRydWUlMjZjYWNoZUlEJTNENGZiNmI2ZTAtMGYxYy00OTcwLWI5ZWQtZGJmMjQyZDMzM2Y5JTI2Y2l0aXplblBvcnRhbExvZ2luU3VjY2VzcyUzRHRydWUpL0YgNi9EQSgvSGVsdiAwIFRmIDAgZyApL0ZUL1R4L0RSPDwvRm9udDw8L0hlbHYgMTAgMCBSPj4+Pi9SZWN0WzAgMCAwIDBdL0FQPDwvTiAxMiAwIFI+Pi9GZiAwPj4KZW5kb2JqCjUwIDAgb2JqCjw8L0JTPDwvUy9TL1cgMT4+L1N1YnR5cGUvV2lkZ2V0L1QoQVNfVm9ybmFtZSkvVHlwZS9Bbm5vdC9WKFN1c2FubmUpL0YgNi9EQSgvSGVsdiAwIFRmIDAgZyApL0ZUL1R4L0RSPDwvRm9udDw8L0hlbHYgMTAgMCBSPj4+Pi9SZWN0WzAgMCAwIDBdL0FQPDwvTiAxNSAwIFI+Pi9GZiAwPj4KZW5kb2JqCjUxIDAgb2JqCjw8L0JTPDwvUy9TL1cgMT4+L1N1YnR5cGUvV2lkZ2V0L1QoQVNfTmFtZSkvVHlwZS9Bbm5vdC9WKEZpc2NoZXIpL0YgNi9EQSgvSGVsdiAwIFRmIDAgZyApL0ZUL1R4L0RSPDwvRm9udDw8L0hlbHYgMTAgMCBSPj4+Pi9SZWN0WzAgMCAwIDBdL0FQPDwvTiAxNiAwIFI+Pi9GZiAwPj4KZW5kb2JqCjUyIDAgb2JqCjw8L0JTPDwvUy9TL1cgMT4+L1N1YnR5cGUvV2lkZ2V0L1QoQVNfUnVmbmFtZSkvVHlwZS9Bbm5vdC9GIDYvREEoL0hlbHYgMCBUZiAwIGcgKS9GVC9UeC9EUjw8L0ZvbnQ8PC9IZWx2IDEwIDAgUj4+Pj4vUmVjdFswIDAgMCAwXS9BUDw8L04gMTcgMCBSPj4vRmYgMD4+CmVuZG9iago1MyAwIG9iago8PC9CUzw8L1MvUy9XIDE+Pi9TdWJ0eXBlL1dpZGdldC9UKEFTX09yZGVuc25hbWVfS3VlbnN0bGVybmFtZSkvVHlwZS9Bbm5vdC9GIDYvREEoL0hlbHYgMCBUZiAwIGcgKS9GVC9UeC9EUjw8L0ZvbnQ8PC9IZWx2IDEwIDAgUj4+Pj4vUmVjdFswIDAgMCAwXS9BUDw8L04gMTggMCBSPj4vRmYgMD4+CmVuZG9iago1NCAwIG9iago8PC9CUzw8L1MvUy9XIDE+Pi9TdWJ0eXBlL1dpZGdldC9UKHN0YWF0KS9UeXBlL0Fubm90L1YoREUpL0YgNi9EQSgvSGVsdiAwIFRmIDAgZyApL0ZUL1R4L0RSPDwvRm9udDw8L0hlbHYgMTAgMCBSPj4+Pi9SZWN0WzAgMCAwIDBdL0FQPDwvTiAxOSAwIFI+Pi9GZiAwPj4KZW5kb2JqCjU1IDAgb2JqCjw8L0JTPDwvUy9TL1cgMT4+L1N1YnR5cGUvV2lkZ2V0L1QoQVNfUExaKS9UeXBlL0Fubm90L1YoMTIzNDUpL0YgNi9EQSgvSGVsdiAwIFRmIDAgZyApL0ZUL1R4L0RSPDwvRm9udDw8L0hlbHYgMTAgMCBSPj4+Pi9SZWN0WzAgMCAwIDBdL0FQPDwvTiAyMCAwIFI+Pi9GZiAwPj4KZW5kb2JqCjU2IDAgb2JqCjw8L0JTPDwvUy9TL1cgMT4+L1N1YnR5cGUvV2lkZ2V0L1QoQVNfT3J0KS9UeXBlL0Fubm90L1YoS2llbCkvRiA2L0RBKC9IZWx2IDAgVGYgMCBnICkvRlQvVHgvRFI8PC9Gb250PDwvSGVsdiAxMCAwIFI+Pj4+L1JlY3RbMCAwIDAgMF0vQVA8PC9OIDIxIDAgUj4+L0ZmIDA+PgplbmRvYmoKNTcgMCBvYmoKPDwvQlM8PC9TL1MvVyAxPj4vU3VidHlwZS9XaWRnZXQvVChCdW5kZXNsYW5kKS9UeXBlL0Fubm90L0YgNi9EQSgvSGVsdiAwIFRmIDAgZyApL0ZUL1R4L0RSPDwvRm9udDw8L0hlbHYgMTAgMCBSPj4+Pi9SZWN0WzAgMCAwIDBdL0FQPDwvTiAyMiAwIFI+Pi9GZiAwPj4KZW5kb2JqCjU4IDAgb2JqCjw8L0JTPDwvUy9TL1cgMT4+L1N1YnR5cGUvV2lkZ2V0L1QoQVNfU3RyYXNzZSkvVHlwZS9Bbm5vdC9WKEhhdXB0c3RyYd9lKS9GIDYvREEoL0hlbHYgMCBUZiAwIGcgKS9GVC9UeC9EUjw8L0ZvbnQ8PC9IZWx2IDEwIDAgUj4+Pj4vUmVjdFswIDAgMCAwXS9BUDw8L04gMjMgMCBSPj4vRmYgMD4+CmVuZG9iago1OSAwIG9iago8PC9CUzw8L1MvUy9XIDE+Pi9TdWJ0eXBlL1dpZGdldC9UKEFTX0hhdXNudW1tZXIpL1R5cGUvQW5ub3QvRiA2L0RBKC9IZWx2IDAgVGYgMCBnICkvRlQvVHgvRFI8PC9Gb250PDwvSGVsdiAxMCAwIFI+Pj4+L1JlY3RbMCAwIDAgMF0vQVA8PC9OIDI0IDAgUj4+L0ZmIDA+PgplbmRvYmoKNjAgMCBvYmoKPDwvQlM8PC9TL1MvVyAxPj4vU3VidHlwZS9XaWRnZXQvVChBU19UZWxlZm9uKS9UeXBlL0Fubm90L0YgNi9EQSgvSGVsdiAwIFRmIDAgZyApL0ZUL1R4L0RSPDwvRm9udDw8L0hlbHYgMTAgMCBSPj4+Pi9SZWN0WzAgMCAwIDBdL0FQPDwvTiAyNSAwIFI+Pi9GZiAwPj4KZW5kb2JqCjYxIDAgb2JqCjw8L0JTPDwvUy9TL1cgMT4+L1N1YnR5cGUvV2lkZ2V0L1QoQVNfRS1NYWlsKS9UeXBlL0Fubm90L1Yobm9yZXBseUBvemctc2guZGU=KS9GIDYvREEoL0hlbHYgMCBUZiAwIGcgKS9GVC9UeC9EUjw8L0ZvbnQ8PC9IZWx2IDEwIDAgUj4+Pj4vUmVjdFswIDAgMCAwXS9BUDw8L04gMjYgMCBSPj4vRmYgMD4+CmVuZG9iago2MiAwIG9iago8PC9CUzw8L1MvUy9XIDE+Pi9TdWJ0eXBlL1dpZGdldC9UKEFTX0ZheCkvVHlwZS9Bbm5vdC9GIDYvREEoL0hlbHYgMCBUZiAwIGcgKS9GVC9UeC9EUjw8L0ZvbnQ8PC9IZWx2IDEwIDAgUj4+Pj4vUmVjdFswIDAgMCAwXS9BUDw8L04gMjcgMCBSPj4vRmYgMD4+CmVuZG9iago2MyAwIG9iago8PC9CUzw8L1MvUy9XIDE+Pi9TdWJ0eXBlL1dpZGdldC9UKG9mc1hYMV9mcm9tX3NtYWlsMykvVHlwZS9Bbm5vdC9WKHN1c2FubmUuZmlzY2hlckBkYXRhcG9ydC5kZSkvRiA2L0RBKC9IZWx2IDAgVGYgMCBnICkvRlQvVHgvRFI8PC9Gb250PDwvSGVsdiAxMCAwIFI+Pj4+L1JlY3RbMCAwIDAgMF0vQVA8PC9OIDI4IDAgUj4+L0ZmIDA+PgplbmRvYmoKNjQgMCBvYmoKPDwvQlM8PC9TL1MvVyAxPj4vU3VidHlwZS9XaWRnZXQvVChIdW5kX05hbWUpL1R5cGUvQW5ub3QvVihIYXNzbykvRiA2L0RBKC9IZWx2IDAgVGYgMCBnICkvRlQvVHgvRFI8PC9Gb250PDwvSGVsdiAxMCAwIFI+Pj4+L1JlY3RbMCAwIDAgMF0vQVA8PC9OIDM3IDAgUj4+L0ZmIDA+PgplbmRvYmoKNjUgMCBvYmoKPDwvQlM8PC9TL1MvVyAxPj4vU3VidHlwZS9XaWRnZXQvVChIdW5kX1Jhc3NlKS9UeXBlL0Fubm90L1YoU2No5GZlcmh1bmQpL0YgNi9EQSgvSGVsdiAwIFRmIDAgZyApL0ZUL1R4L0RSPDwvRm9udDw8L0hlbHYgMTAgMCBSPj4+Pi9SZWN0WzAgMCAwIDBdL0FQPDwvTiAzOCAwIFI+Pi9GZiAwPj4KZW5kb2JqCjY2IDAgb2JqCjw8L0JTPDwvUy9TL1cgMT4+L1N1YnR5cGUvV2lkZ2V0L1QoSHVuZF9HZXNjaGxlY2h0KS9UeXBlL0Fubm90L1Yod2VpYmxpY2gpL0YgNi9EQSgvSGVsdiAwIFRmIDAgZyApL0ZUL1R4L0RSPDwvRm9udDw8L0hlbHYgMTAgMCBSPj4+Pi9SZWN0WzAgMCAwIDBdL0FQPDwvTiAzOSAwIFI+Pi9GZiAwPj4KZW5kb2JqCjY3IDAgb2JqCjw8L0JTPDwvUy9TL1cgMT4+L1N1YnR5cGUvV2lkZ2V0L1QoS2FzdHJhdGlvbikvVHlwZS9Bbm5vdC9WKG5laW4pL0YgNi9EQSgvSGVsdiAwIFRmIDAgZyApL0ZUL1R4L0RSPDwvRm9udDw8L0hlbHYgMTAgMCBSPj4+Pi9SZWN0WzAgMCAwIDBdL0FQPDwvTiA0MCAwIFI+Pi9GZiAwPj4KZW5kb2JqCjY4IDAgb2JqCjw8L0JTPDwvUy9TL1cgMT4+L1N1YnR5cGUvV2lkZ2V0L1QoSHVuZF9HZWJ1cnRkYXR1bSkvVHlwZS9Bbm5vdC9GIDYvREEoL0hlbHYgMCBUZiAwIGcgKS9GVC9UeC9EUjw8L0ZvbnQ8PC9IZWx2IDEwIDAgUj4+Pj4vUmVjdFswIDAgMCAwXS9BUDw8L04gNDEgMCBSPj4vRmYgMD4+CmVuZG9iago2OSAwIG9iago8PC9CUzw8L1MvUy9XIDE+Pi9TdWJ0eXBlL1dpZGdldC9UKEh1bmRfQWx0ZXIpL1R5cGUvQW5ub3QvVig1KS9GIDYvREEoL0hlbHYgMCBUZiAwIGcgKS9GVC9UeC9EUjw8L0ZvbnQ8PC9IZWx2IDEwIDAgUj4+Pj4vUmVjdFswIDAgMCAwXS9BUDw8L04gNDIgMCBSPj4vRmYgMD4+CmVuZG9iago3MCAwIG9iago8PC9CUzw8L1MvUy9XIDE+Pi9TdWJ0eXBlL1dpZGdldC9UKEh1bmRfQ2hpcE5yKS9UeXBlL0Fubm90L1YoMTIzNDU2Nzg5MTIzNDU2KS9GIDYvREEoL0hlbHYgMCBUZiAwIGcgKS9GVC9UeC9EUjw8L0ZvbnQ8PC9IZWx2IDEwIDAgUj4+Pj4vUmVjdFswIDAgMCAwXS9BUDw8L04gNDMgMCBSPj4vRmYgMD4+CmVuZG9iago3MSAwIG9iago8PC9CUzw8L1MvUy9XIDE+Pi9TdWJ0eXBlL1dpZGdldC9UKEh1bmRfRmVsbGZhcmJlKS9UeXBlL0Fubm90L1YoaGVsbCkvRiA2L0RBKC9IZWx2IDAgVGYgMCBnICkvRlQvVHgvRFI8PC9Gb250PDwvSGVsdiAxMCAwIFI+Pj4+L1JlY3RbMCAwIDAgMF0vQVA8PC9OIDQ0IDAgUj4+L0ZmIDA+PgplbmRvYmoKNzIgMCBvYmoKPDwvQlM8PC9TL1MvVyAxPj4vU3VidHlwZS9XaWRnZXQvVChIdW5kX0dyb2Vzc2UpL1R5cGUvQW5ub3QvVig0MCkvRiA2L0RBKC9IZWx2IDAgVGYgMCBnICkvRlQvVHgvRFI8PC9Gb250PDwvSGVsdiAxMCAwIFI+Pj4+L1JlY3RbMCAwIDAgMF0vQVA8PC9OIDQ1IDAgUj4+L0ZmIDA+PgplbmRvYmoKNzMgMCBvYmoKPDwvQlM8PC9TL1MvVyAxPj4vU3VidHlwZS9XaWRnZXQvVChIdW5kX0dld2ljaHQpL1R5cGUvQW5ub3QvVigxNSkvRiA2L0RBKC9IZWx2IDAgVGYgMCBnICkvRlQvVHgvRFI8PC9Gb250PDwvSGVsdiAxMCAwIFI+Pj4+L1JlY3RbMCAwIDAgMF0vQVA8PC9OIDQ2IDAgUj4+L0ZmIDA+PgplbmRvYmoKNzQgMCBvYmoKPDwvRmlsdGVyL0ZsYXRlRGVjb2RlL0xlbmd0aCAxMjEwPj5zdHJlYW0KeJyNV9luHEUUvdK8DQ842CQsidQSBhwjt2vpFYmXaOKxPQ12x7OYMHkCjECykPPC9/DCN+TzOPdW97h7qtqJrHHXVN3l9K1zl7kbv5iPMxXlRRHNfxur6EgrxavjExNprG7GBzR6Pv8LR7KvWSTl1QEd04RqmtIpLWmG9TVd0QrrFdZT/B9RTBVOL1gfhn0L6+d0AYFTCM/oHS1gbkRPB8U/pSe0R7v0eMA0RLN79AmjN9H87VjFSZZlefTP/ctgV+P7vaLRvPDEY8a4Txm9wNKQxTOn9QE28iFDKmhoyK/WaZwn7Rej41KAvJyP6/GdfEx0jrMprKXQxAsmZRGbNDIJ75gkevv7+Ko5tYqfDwiwep7EJou0UU6oe6wL2XxIpHHhJIZcpIpPk0IHzky2fVYzC3XEQdERRFKI4Mpv5R7LzjVaCeU+aLICWSZ0LmwDDYRGjosjXNIpTpf0iupe0BHTrh8dJyZKdRIXtvWVO8KXUGUuTuiSzbKRLS1lO1ql08qQAEtJiZpOWafvzyrc7YBDcIx9VXiNSl6k8d313OqHXEO/gu8TZBFe3fftUCeljm2y5TqTdJ3QalArz+Mi2XL4LfxcS7KzzwtXCHwLutAx+J+UqmOicWwRZL49vrkKzzcwMnMJva2elz6CPVSDx6gHnw1GOujV4GJXgbAGfXRqTDAyWeY7yBpq/tu/vUYjTX0v3/VKZ0c36DMxvk/Uox1SUKz68WtUrPadLrtkpUd01iUQfYVMmggxriQVVpCYbkANlSVlhkpCUzOGBaBu84zZqTOkuY1MyrfSkTBG9t8jZVG/wJj3SLG31MQ2DVcoa4rhM5Xw2fBLBgXqwEXqwr9I7ad9I60CScjEWXKdG06BkJO0UeNS+Qk+X0sD56tfSCq+BDVqlNZR09pHoFa1yfRKzpip6zXYsQzlUghsJvr/gWhMsJn4CFQM97q2TDmIfdyHG5xcMvjZ1qy7SCYAxY/GAIoWDPx6Gx3/efuHjiZ/R3VPTFvry1kn14WTOamygdNOGgyrcLBeN0Hj0AAUQzo+Qe0yfPwL+rs2b+bnvEqV4lVuPBuXCAxnYsfGUdGI9eNjMCHkaThAsVysKyErWHol4xSH+wzrC1xbKGCtxV4kUj9iJs19udyLmEHvFrEHQvYjTbwwAYW1/UDZzNOsJdjSkY+SLBQgW5hYlQgQ2ux2gPYRhFXbIbcVCttRaEgbaC4Nv7IiLre7+DegZIWcqEHuSxkdFn4mW4Sx3O7fm2ZGn9MX9CU97e4MYkgSHwMmATcOnYEEC9CyzfIfJHKcNbXL7wA05IQHbebsDYJAWfZAfA9PUyHeQiqHm+5nGyyH2H/HXQ7rSkh6gnCN6CPphEsQ9RRpNRG0S5mH1jcBuKr04T6h3cFqGMR6KL5cZFYbPD9J/ftQPK39EKA9XOHH+M2yuwHWb5+95Ek1uGgiNMnt4ulmJA7YHj4/t7Oty+VWG/0JHYdT8/pGe5nZHMOybVLyqF0IKpY5YmEe+TnDu8oi2MNkMQSCbaNm2G7HcI7hpYB9htVr+XskBWiB/R0Zyy9kdnQFatkbLeouDvtBOPZlPqlwZQxgBz10AZPP5Cfig7/dxN3/vvq5UQplbmRzdHJlYW0KZW5kb2JqCjc1IDAgb2JqCjw8L0tpZHNbNzYgMCBSIDc3IDAgUl0vVHlwZS9QYWdlcy9Db3VudCAyPj4KZW5kb2JqCjc2IDAgb2JqCjw8L0NvbnRlbnRzWzUgMCBSIDc0IDAgUiA2IDAgUl0vVHlwZS9QYWdlL1Jlc291cmNlczw8L0ZvbnQ8PC9GMSAxMCAwIFIvRjIgOCAwIFI+Pi9YT2JqZWN0PDwvWGYxIDcgMCBSL2ltZzcgMzYgMCBSL1hpMiAzIDAgUi9pbWc2IDM1IDAgUi9pbWc1IDM0IDAgUi9YaTAgMSAwIFIvaW1nNCAzMyAwIFIvWGkxIDIgMCBSL2ltZzMgMzIgMCBSL2ltZzIgMzEgMCBSL2ltZzEgMzAgMCBSL2ltZzAgMjkgMCBSPj4+Pi9Bbm5vdHNbNDcgMCBSIDQ4IDAgUiA0OSAwIFIgNTAgMCBSIDUxIDAgUiA1MiAwIFIgNTMgMCBSIDU0IDAgUiA1NSAwIFIgNTYgMCBSIDU3IDAgUiA1OCAwIFIgNTkgMCBSIDYwIDAgUiA2MSAwIFIgNjIgMCBSIDYzIDAgUiA2NCAwIFIgNjUgMCBSIDY2IDAgUiA2NyAwIFIgNjggMCBSIDY5IDAgUiA3MCAwIFIgNzEgMCBSIDcyIDAgUiA3MyAwIFJdL1BhcmVudCA3NSAwIFIvTWVkaWFCb3hbMCAwIDU5NSA4NDJdPj4KZW5kb2JqCjc4IDAgb2JqCjw8L1N1YnR5cGUvVHlwZTEvVHlwZS9Gb250L0Jhc2VGb250L0hlbHZldGljYS1Cb2xkL0VuY29kaW5nL1dpbkFuc2lFbmNvZGluZz4+CmVuZG9iago3OSAwIG9iago8PC9GaWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoIDE1MTI+PnN0cmVhbQp4nI1WTW/bRhAl0JtPyaHHAnMIUAewGZGSSCk3C/5Imo86sRKnQS4rcSVuSC2d5dJq9VsL5OLfkJMPfbOkbIm220L+IFfcfW9m3rzht53ReCfqUDwY0DjZ6dB+txf4Ucw3R+Oddzvf3G9Iv+G7E1zj8YA6+AQUhRTHPb9L48XOs+MuDWk829k9mKa20vPndKhkKelI6aXKczXHWilNll8ZXJEqLenKkFRaUqUvpZkoneRqmkr6WJhczKVPI2WtpAtRllLTmZJPx1+3wKPQjxh8N3FQQtPL1Eg6kXM5kTqVymKf0D7vQzAt6r2h3+nV3IOGO8iCSWmvdKLVBtvZtSFg0JFJ5YQXKp3QR2mEmQCEFy4LTYeC8bSYppRI0ybbjf2ug9t1z5XTtLKrOY5PAFmYROOY+4mGXT+Ot4l+RupG8hae4y7pQOcKseuSpJkV+dySqGZ0whicUJojS3blkszbS6sWC+wG6XZwbfJB6Hcchd2tqEWe4yRd2KXUieKDLpC+Qks9kasC97LJio9/2ESp0InMLYFsCRqkdDmR2IB8QQaLNmyn43dr2LdiIfcQINJm1Mzu0atCW5HZxOW8LJYIAOcgJMR5Swg75gBmfCeRukRLaRJWBpKTyDZoNBg4/QP0TBrUhotJq8qpwsV4ZiXi5mxeSJdL6/SQ/dAcL6ua1TBBSGgFNWfE0yYtrHeuQip1GzaO/GENW9O7X7VR1PV7wbYYjlmdzMtJymnBPFQIVGDCGVDGFY8sOELqiEK7IAozF7gXtjD1aptmP/Bjh7/7RnzXIl1g41xaU8xmUu+hhhwipUWKEteEtLqUokIGCQcKfsync+CnIrcOtaTEiaO0RmWW2zi50+tRr+N3gjvt4wQtHfNkQwE44fYhI3N5KTRjwVkaATEJZxabimhjhgO/W2OKqsRGdNd37h66RnGdgFm2rwruIpUJqwC/RAM2IWyIZq0Z3ujM6YHqBj0/7m9X91AYB5cqDRbOONmOvspEgjYsbh2EXPcvQ3+u1t0NaZT0FnmAIJwvIFLDUfjszXfy3On6nX4Tsy0WCIplQK9/cDJx2tpZnM0Fgw6N4SwoPDq5mEkDhWtbXrD00YHr9GrA2YYtGkP/4LZoIfeHgd/tbzYAvdR0fIW0aVoo60aFgdYm16ibvphxDHWxtzwpE1qzv1wWJkNlmFuCCYJitC25Hw/9qEY8mCzVNMvrdLE3rkSar40VjPl2Q0d1VFxlbulT8Rdg7P6pKS4Vb+d6LXh25XeCjGJ/2P/PLu/3MVYH2zp4z24iHb3Jut9unOU5HVRlVml2xpE0dWbAf++2cNwjZ3AF45bPmSjqVE3T0vnU/TzQdYNwmwfmcGMiSCs5Vnt1mjZHvdOnWaEmVKR67cPOGE/MtU6amsIHso0B285WOPQDB4+B56IjMVlVVzwuNBWcivmVdgON7WXJMZnKGcxhZdwY1nWkxlm92aYIE0zuQw1iv1ejuugWV9/VPONI+AQMDTe07x43USyyxS1g0yptgdbNAIlAx/aB+qMLB9HdvDcjZissKG/JuaaLorQi53bdY/eno/03QuV1mvj+WPzJkmW/vRUoUnVUthLQG4Z+UL9YcTNbnlaosEN2Rp25tzbhpraG/5WuG/LSOc9pYWyR1WuT1dJ3i383gNxTZfMlO0gbedDxe80rHW+XNThfj0QJ6xPw7oeaphdhgm7n7Nw5DpxznTncFJDu2pc4mJFMhJlRVhij5grDfA8ek3PX2Dp3dZQ3b0f1BMcUudJZu717/b4f3tPd//IS3edXq5DCptphw9yLvBfea+8cf3/yfsbvH9577936OLrZjVf3sEfTBT37NAvosKDtw+uvcXKXF/BOv7++cKz4mX1+OOzzz3Sxudk9uMWp6/3qfXkKMi+8D95HR+53fM6xcurI/oKrz+7z2HsJwh+w/ghPvsdTn/D9aw4C94+9E+9FE8y7TR7d/8XjCQ7mw946Ao+8APePHbjP/J4geSNchiA88mLvC2czvoH7B8/R+6gKZW5kc3RyZWFtCmVuZG9iago3NyAwIG9iago8PC9Db250ZW50cyA3OSAwIFIvVHlwZS9QYWdlL1Jlc291cmNlczw8L0ZvbnQ8PC9GMSAxMCAwIFIvRjIgOCAwIFIvRjMgNzggMCBSPj4vWE9iamVjdDw8L1hmMSA3IDAgUj4+Pj4vUGFyZW50IDc1IDAgUi9NZWRpYUJveFswIDAgNTk1IDg0Ml0+PgplbmRvYmoKODAgMCBvYmoKPDwvTGVuZ3RoMSAzMjY2NC9GaWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoIDE0MjE5Pj5zdHJlYW0KeJztvX1cVFX+B37OuQ/zAMwMw8CACDPDOKChoY74jEwE5FOGCsaYKCq6aGvqopm5pmWmoaZIWVmZGWvm13B0WZbM3MzMzMyszFxzfcqs1spcc0vhzu997txBJN32+339/vi9fi99+eZz77nnnofP8+dcMkIJIUYynwjEOX7K2GknN+jvQssmQuTy8ffPcCZsbrObEJ0NbcrEab+b0j0iLpIQPe51db/7/eyJMZ/ueI8QM+DaWj5hbNkv9J4HCOnyR/TvXo4G0+ZIjNelDvftyqfMeCDr/Qeexf3nhHh2/H7q+LG0+/3zCbn7Gdy/M2XsA9MiLkhxhMwdhf7OaX+YMG1i3atncY/xWBu0UayTrziSiDL60FLc6EgpWqLIQ3QsHU/n0Sq6kr5IX6K1NEB/oOfpLzTI7CyRdWc92BtsO9vN9rLD7Bi7wP7FgoIgmASzkCK4hanCTOEhoVJYKrwkfCh8JgRFIkaKUeJdYoE4ShwjPiZWSTFSkpSW9H4yTc5Kzk6el7ww+bnkNck/Jv8r+RdHrCPJkee403G3w++4x1HimOuoc7zj+MRx1PGD46JDcUY4zc4UZ6ozw9nZ2c3Z29nX2c+Z6xztnOac7ZznfNL5qnOT8y/Obc7zLskV47K7UlyprltdQ1yFrtGuR11PuTaksBQ5xZxiTYlNaZPiSOmQkp7SP2VsygQ3c1vcLg/xME+kx+KxeeI9bT3tPB093Tx9Pb/3zPc86lnsWeqp9rzk2eTZ6tnm2e55x/OB54DniOer1L6pvtSc1NLU8akTU+9Nndrhp45TOs661f6K65WlV0TFrQSDTcEgISqHnWQtHUfL6HxwuJqupevoZroFHP6RXmaExbO24HBPcPhN9i57n33O/gEOXxSIIILDFnC4nTBDeFB4FBx+QnhZ+Eg4DA5TcNgEDg8VS8RScZG4UrJJyUkkSUlmyf2Sfcnzkx8Dh9cmX0i+6CCOeIfT0d9RoHF4jGO+o97xruMzxzHHBcclJ3FGOq3g8C3gcFdnr2YOT3bOAIdXONc6/8f5mvN1jcNxGofvdA133QMOr2jmcDQ4nJCSrHG4NKVM5bDzBhwuaObwCs9az8ZmDr8PDn8ODvdu5vCE1Mkqh0s7TgeH7a8svkIVJzjcCA7T4E/B08G3WVuABAM0SLbTJrKZXiGj6eXgAHoR2n4e+CFYTb8H/adyPz0TnEC/xPVJUkZPBG+jx+lRerjpo6YDTR827Uf7AmVC03OKv2m1Ym+C1SkGQCZE9H29mJCvh38Z+/XQ0w9+PejrAV8+eNr05QNnvz771dkvz546e+Ls8bP/OHvs7Bdn/372yNnPz3529tDZT85+fCr7LHzByW/P1p48CXr05N/PvnTyk7OPnJ2Fu2fPjuRKcnYAYDkZfzKCkBPKiSsnLn71l6+2nHjvq0e+mvXVhBOeEykn2pxIOPML73vm6xPCcVj38f1nos+IX/502n467nTUaeNp3WnxND11+dS/Tp07debUx6f+dmr7qddP1Z/686lXTr14avWp6lMrTy0h5NSCU3NOTT3V9lTCqfiTV07+cvLnkz+dvPD5uC/Y0eDfS8eOLb0C13avMJgVqD7jN/7Qfi2ue7e47n6D/qmt7tuF2mhP9S7/t2e87qhxGu18TWt79eet1IefPq2t738cJ4WvR71y/t9WQs79F30+bJ5vAB1I21EPHUQHi3X0TlbKxopfsnHSCFbAhkp3S8WSnw1j5fQS/be0gK1gVWwlq2ZPsqfYKvY0/Zn+Yig2+A0jDfcYRhlKpEelhdJj0iJ5uFzIitgI3SHGmMBE3WdMYjLTMT0zMCOLYJG6wyyKmZiZWVmM7h+sD+ur+5plsX66b3Q/6M7rfmQJrI3ugu5fLFF3UfeT8AfWVhc0TGIOPdWbWUfWSW9hnfVW5tUX6IeybiyTjWT3yDYSQQqkemInM9Wf1/wR+xMeDUnw3LU/FVvwEiHoH9P4ZPA7ZZ4yWdkeHKj8H5mPGBviq5fAasklYsLIUUpdoxK8GCwNXhQYiaSLghcEHzGxzOC/2Eb4Z0KeIsvJIjKXPE9qyBmypHmwdWQ9WY1nC8jk5rZnyRr0qiILr85JY8lzhPjuuGekv7iocPiwoQV3Dblz8KCBA/rfkZ+Xe3vObb7sfll9+/Tu1bNH98wunTNu7dSxfVqqp507xeWIt0VbzKaoCKNBr5MlUWCUdHQGaGleQPA4o/PHuvPcY/t36ujMiy/P7dQxz51fGnCOdQZAxFR3//5qk3tswFnqDKSCjG3RXBrwoefEVj19oZ6+5p7U4uxL+vIp3M7A/ly3s4GOHFqM62W5br8z8J16fad6LaaqN1G4cbnwhroqvlpnXiD//vLKvFKskW6JMN7uvn2CsVNHssUYgcsIXAXau6dtoe37UfWCtc/rvYURfRSfFjvNG1sWKBhanJeb6HL5O3UcEDC5c9VH5HZ1yIB8e0CnDumcxJdOlji3dHyrcmmDhYwrTY8sc5eNHVUcEMbi3Uohr7JyUSA6PdDBnRvo8OCX8dj5hEBHd25eIJ2POmhY8zyDrk5JA5IHwaryJ4LtuL87d23LWK1F9lh+IvwywG4P0GHFLv4nMR+8rqzMdzvzK0srxzYE549zOy3uyi2RkZXT8sBuUlCMIRqC25YkBvKX+gOW0nLa269tPX/YoEDM0HuKA8yT7ywfixb8zXa7eia6opv7FNzoMQFbwBxw2MnZWFBc6cyrXJLrSnTl5eKxKzB/aDFnz5IGJxmXuJX4MtL9AVbKn7wVfhJbxJ/MDz8JNfrAWDdkPGh4cWVA9Awoc+eB80vGBuaPg5ZN5gJyWwKmS4kud6U12tkrw6/25asYUDbJGZBSwSy81fIF6A9/pdKi3pguhch3iZggNdrq7OXGMHycPHdeqfb3/vJ4DOAEw/unhxSisDjgy8WFb6wmubwtnTPwxthSCG5SrirUQIZ7WsDmzmmWssqcScOL1Ve01wK22wOkdLz2ViAjT7UvsK80N7QEPpZ7aPHrxBs8saWbM/HPXtKN+HN557jboW2peZXFZRMDjtLEMtjfRGdxoivg80PSfnfxBD9XP3Cow4lEVUn8qs4UFg8a7h40dGRxT20hoQd8ONGT12oYd3FiaBgoYkDv0TuLWaLgR0cLGpz5uHDn9MXPgM6jByxguNrKFTinr7OYJpJwbywj0MGZNyFX68fvrxlU4mp1e//waDK/xTi39090+V2hP506Mjx2ahPjDT1nav/wI7grPNBDT2/vrzZxXsZz5XcWuye4/e5yZ8BXUMz3xtmjclljhspzTVaF19y1YBbYRFx4HL7hzAzkpye2ZG7gDvWem02AFbqhLLCr+XhUEKC8wz2qwSZCl/yJ17ajKTTSf343MTDg168OCE3K36zUuwcNr+RrdmvrJGBINDBgMlgxHLpber0HUFnfWO2Bs9I9oKzSPby4b6LKg2HFcxMf5Du0kkF0UGFOp45bGM3Z4qaLh27x0cXDRxbDk+a8bkHpt7iweCuj7PbSHP+Wdnhe/LoTcUltZbyVN/IbJ7/how3DjV7tn/i6j5D56lNRbVDvxzdQorbpw22UjG9goTZLaKJUdSIfYXgihp74wr1FtOlDbfPVNvXPFsKFxXfB7TC+HEJGWMlzlnEF+aO/vLLUz42MxIE9+IuC1N0P7HL320KZHBkwuifkBCLcObw9m7dnh9pl3q6DatI4itevlR1M0dlmb2Kl5TvOSj+cSaXlTCcseidyEyOyBAEVcbIvEhFYEiS9QRR0hGR0zfBGW2mvXtHeaG+XzjGuaFcPYKcwoPGv5Wx20yKp/vLAcvErXmEPU7azDjzbIG19kTqMSYwmsyBEtCPZ2S3HsFh7eGUWa7Pa3als2HMrN66oenLJhurVrAs10A9rdypdL55Xur+5kb7LR83CqLbwqEaR6ESdyWwUxFajUgvTubtbM7uxNG+cldmeW7lhyZNVKzbyYZVflN4bttN95y/SD3duVrpg1ELlZ/o4+Z7I2HG0SHV6MUPOljfLf5MPyJJMMkreVcfu0tljlwV39x50jqnH7IW3eb63f6b8+3Ij3y09xHLYTHCtvS8BpapE/kJpJaUZdAz9Gz1Af6BBKlOMVFLi1caKyXTFDkPZe2jtWr6z6uBpWkV+Rs4Y5zMSOTLKIMz1G2JIdrrWv0e37t6ucbE22Z2SWn1b36zc3Kw+OVNz7rgj57ZBA/kIyCfZGVVyMX9lRJQEgVnDbOnS2UDdlJ1pOrGFubiU0I+RsuA5MUPajzntWLctUiZW2RqfYIit8Bt0grnCLyRgfhKvraGZt+4UFm2xertaqfozWm0RM3689P2l7/79/S+N31atWVtVtXbtcnZMWaAspfPoH+hD9A/KfGWF8rbyFXXRHrQbTVG+xKrrserDWE0EaeezoJA30Mgo0ajXU6NM47F8a68May9teszuckd36yHrZF0a9bLDAX1b58TZo+nSpwRl8YzkNkXjZyPVxajjoMUdpH2kDenmSyQxJhqj0yVQIbGtxVjht+gYTaAJM/18AmyN9Art0K7ukO+xA82k/Vhmt1R3CmYK8d1EdTTWJXZo7EXnvTatR+UDI1+aULr/Xx/8kL/0T8oBdnoVXbB51dKhMx7pe9fsTQfrSv/8+kvKJ3qsZRS47MBa0sgYXzdBFBNTokiiLiYmMS5KbN9BiLPb48BvO+1tp4LZTs2y3W70eJIr/B6dMbrCb7wqAyw0Y8zokjEl09WbFkvWRGOTdbHJNNYmulJS0zKTqdcZbXG5M71du4f30o9iM8KFF1Zufk35h/LjjF33lHw6HqL53RMrNr29bO7YP907cuQ/H/3sB7F0aV2yPq5uxcHTKZ023NoVMmPPVj8y6f7M/Dl3DN0FoZF08HiytIMYSQzx+ZwxkoGxCJNABEmwxZoFHZVipJl+2RATI+hkQZOl15seTWAC4cV7w0t3R7ujXZkUNy5I2M25LU7+dHNTLgu88akyN8IQ0SNOGUgHK3V08LPCkcbO9IPH32hTnty0gsv7YZXH9ZB3ls9hN+sTbILZZk5sS8BAQuTY2PiZ/lhZjqzwy9ey86pmh5bRVYy1EVeKyjxwzeJK0aXFuGJdQnfmPUN14Fnwp8cGfjR+03Zl5f2PjuzBjjW96a4QHv7qvS+Vprs2duxW8wxtn9yLba1Riu2cS9OxMi+kH0fakWG+jlIbo8tFLG1IG0+qMSYqKul+vznKETUmSrAIUVExjOnu9zNdjL3CH/MruYeF3qvXVZHHWFxd7bGQLRO8IT2FLaYyqkncBGVIptPZCzNuGzzhm39HRd537t1Tlw+vOvkg/WHJqpWP3111d8ETbLowMubZeOVL5YNN5z84rfz8DPUof9+6buUL/efnlm0uA39HQtYZ4K9M0nwxEqWECTo9iZcYnMxMvyA325EmVhgqdcHBUWpnxY3/FA411UrWmiWXD8E7ca/TSeVICskgg31pcqfoVLs51SZ0MiQldbKZxc5domWn85ZbIglx3+8nusg29/sjW7Ij2mvt1Vr9Q+LjDlKnmoA7pV1mN8+tNLNbd8EWFzKBNBOlKTJnib0fHqSy/u99v3DllqcU5di3QUIzFj/ww31/qlpe83xD1aO06/1Lu0+c9njFE9K+bTX31Q4a8caD9Uc+ePPysiF1019888qGGY8umlW66vZ+zwgl08Znlw7O6LXYXzaVy3widsi9j514SIEvXUxMjCYpEdERqWmRNpMpGVsyWUwFJojcZGI2W3yF36ZTBf8fRR7eo4WrJzbUj/Zw82CQ2Q1OOM6qbkxtzux2KxU7NJXOyL3zdy9/OlUfNe3cztPKoVUnZyuWxc8sf3zkk4V3PSHkN663rU5ccOWjjf88cIpGPqscpamQ+XMD/phXVjsBu1AjkjixOTogOBA5PsEcO9dvtjRHp1bRoWWUir5exMrul53TMnIJtTkD+t/uQwhjZFZwoLwNWtad+Mggn+cWe2y7jB6m2L6kbdu+pgzxthy9t5/V6k3oJfaKiOjo9AppHT0k25vtVR0LFgAS3VovVL9oolhDmlslmd1UJ2gXYm2qVrB27hSRxVqIq2uPWNntJIht7VxdRSvF80TK/aa8zb92UtEMkzFtVdkztfe+Nz9vy+32ef77qpUfa79QXq+l/WjGp1++d155Uvn9YbqU0sN06F+vXNq53xo5YMjDT7KjS889Ov6u4WP2bV34ycyEeKVjXODj1/5MTVV/VV47qXysvFG8pJAup2VUoE8fr1e2KusvIwKR2K1cm/BHSpS2Ix+LIh19caJOHyUg6RGlKDbJHxWFQE9EK2cDuHA1LnSFCQouwU29BiqkyTpBHBVo2l67jfVZz3orI2vyk13r6W6lj7T9ci4rp28cfWC8kgfr3ANL3w0ZmEk8cZFxvkydXm+ztGljFm0Ryck2s5Di1iVYLAn3+j+30N4WhCwLNUsWi5mQ+Hv9RDC3uddvtv46ZJVcL2SFskinGNscuNyuGJdqqukI0aEr9x76Ek2l0hOLX31RuXi+SWmgpk3P/8/rF2haYGNdnVS/+Y1HXk0wJgWq3vlC6H/fww9Mbnqq6fvFlQvm8sgwF7Z4QLXFVB+CQqzBLMQnxJBJ/hgxUp7kj2yhwyHHRVOgAMQLXYC2QBm6Wdt5u9p1qUKvc8oFKl94flfJpmnKm8rLr9Dsz7/eNHCz1EF5R/leOaPs7702JYE+TstP0cKGEc8XQHbgpjQS3NQTC7chk0gMoiHaKkXd65cE0XSvX7ReL8MiHWi0y0kE6KQ72uuURiozleXKJPo2LaJ/fFv5Tvn2/B42jH2jrFIeluqVx5UaaqeOKwuxX8wo/KzmU0W+LrLRSEVC9FSIjJINk/yfy7S3TA0yNRN5rcysgixTxqRJfiZQ4yQ//ZXcRpeogrsmNYpGOAxB+LnxgNClaRErbNrEZkv165Sea5sukRarMJB8X7qMFhFrMEbwNQzA7Miux8hT5eXyi7IcgUUwag2tIjQ/FBlzt5hYzfu0aem8BnXOYQgp9euaLr+kSVnqAyknIv474VP1LCEhUS+0TSKJk5AASJGR0ZC1KNkn+aWYXyUAV3dHXdHXSl11B9wzYLc59JcZ59fAOlfW07u/+fb9/J0NyhXl77QNjapeqvxNEJu8nlRY//gzdMRfRqwtVNXiH8rHbrpV44nkUSWT50vTi6gRDFRCtqsXJvl76ulqPZ2kp531dIWe6vWSURaoZA17t5LpJWrS1zIQcJYgafLip1fyNDRZGxrY9w1sY9MIqb5pFZuszSlexJyRpKcvMYIQE583kkksysQi9YIgXDtPtN17TX4Rmobq1Gl6UC8VLx5p+uWphoaHmOFw05ts24KmvZgsYwnLb1oQlruC+STi8CEVJJKso8gIIQNNtbThu3Tmo7ti9zSweShHvq8JvSvP4SffpLPPziRJjoo2ySZbLLMaBTlCJxCTzNfJF2pvFRNd1B0XyxNILJHzBAkkFQYryXrzRmqhu/R0HzXVm/QKEpa1/2x8XKq/MkysvTxQWLDq7BUSls0Qde6O8BI65DbRJj3mFkx6q0Gg+jCDWs/rpm67OrPXTmO8qSwTohhyuPFHvRS58VAneiKoZ5GbxB1D6x9rPCDV39HURqmIp2k5Qi/4Bq6zu65XfU3yo9w2T/IL14mv8A2ukEo6ScvqS9qlvKDshFt6ERXnHYhH46788dK5f1688M/vL6EKe0m5jy6h5XQCfVyZrrwIrfyIdoRT9dAOyichPyVOVe3VSrr6EozgPthtirGJRvgoUSdbddZ7/bqr9pneQk94gBVdagLvpF7Ne4tTlQ+Vbzc00AXM02Sp/vs79Tu3ifoTPzTtgcK4lj2/bCnR5j2q+sdYchtqCItVJEZjhEWMEOPsVgMxIKSQSFuENVIP+9Wm96rzk1+ravPkCZSvRYy1SKh66byjW2vWbzvYQKuhDBLynKrDyhr289LKynlNeU01Uv2Bj5RjE5qms1HQhHLECxGexEN6+5LjiZQcQyJjIlPTYpIjiSjExcGfxImC4RrpEHuvVmUEApkzXEMgG0vjaajmULT8M5mJonLuktL4RMmx0pr1fZct31dL6cdHG3ptX/dIda95i19eO5gu+tsXeYH2tz5034DRw7oN3Pvi/7w/bM2QaRP6jxnSte/06lDNL44C/3TE47MSKlNB0BuoFdEeNidyfoFPLbNyXmTBibJVrys9xP5Kb8m2bl3ou6a4H+MYSRtfhD6SRIhGHRGM/PygKzIqqu4q2kvj7N25G3DvpAOykxJy6R27mi69LtU3jti67KHdwvrLAzFWAiE6uCDkDyk+iyE+oU2UTRT0dstVO2o2YNWCUpGdQEzeGG1wTmK80sFtyunsCEt35dw2Ze5bp2+Nj+tJ2Q4a1a2tpcept4Qdnw2qqGvsj7kXbH6tZpfwh8ZFr/258lNhDlYwBLvJVbW5py9JpDo4JT0VjRE6UZJERACB6SnVa/Guuf5vkZ2ETgDUAsYl5jYaBdYUJ+xtVAT7EnFRzZIrs+Ezgo3KbqEq2B85U/RfiERFygjST6rFkUyXUNV4r/CUsnsB9Hx08JxwWByF+tSDuJwR43brI5LbUJqsF1LTGImLcJT6zRGOiHkRQpIQERFHYuPMo/1xFilxtF+K0xStOTL+OpUCI8PZrcXT45piPzba07V7FtXxUjBOKHTrh738x3UNzLzt97Pufi63x/B3Sve8rRiffm3dm69Nev53AzY+R4dYdLfNndXNuahj18BbTba5L68ar9NN/sOIUdxia2Efc2QbNM9F+vqSrUZjlOCIcqS4DSgPTCQqlsSW+IlFblvil1ssHCrYq9e1PkNzXUjLZR2PLzadt7s9RU6i4WqN1R85d/7Q1NoeJof8cJ3ROHXP+hXVrzxZtVIcpRxSLirnlcMFdz0QI9uUx6ZPr3lq+wn9yZ1H9n/0ETQAVbdQLY5GjQnPahYMsUKsPV6OHOuXLcQ61k/ifu1ZJS3viwsbaRzPAWU28TvlZxrx74IXvD2WjFu/Zs1zVUv/YIO+WqiNprvarOp28MCeT3xr+2i1fhZ4E0OcxOdzJQuRdrMhOtouCK4Uq57IUcQSKyeW8EXYSq4uogV77Fdji6Qdstm9cB5ocoNPaVyS3bTlMe9n5747fGxWlGCsq0rUV7xb8/SzNUueedpG21MzjaK3rrPNjqX1v5yrfuWpP3/gOrPr2P4PPtZWmQje2JAtDfK1txrjIwRjgpDQNik+YrQ/IR4pfTy1yPHxRJZj1cWaruFYc0rf6uwkzEBrEnWpno9n0AL00HUrZQ//WzlL5eMHLjVZpLo/Fa+ZfM/a1Q+vMrEMVgk2wnHpaS/lpy+nvPG2o9OaNKdwfP2Tq9VzUQeMN0F2ID708SVH2W2M6dQjJl6/RVhK/BGUSjppNCpoM3xLyN1piUYLZqpZgTsTltE97IWxSrZB+WfdW29trp/0+84l+fcU01hhR2OOsKOwX/Z773mWJT/wyB2cX4pNzAK/Ikl7MsCXmmK0Ce2T2phM7W1Ch1vMCdH2RLNdV+K3W6JJiT86zukp8TsTr4o2tJhrpYsVeVqKUlIr+bC8e8AWcKsW+d0zWcH6p595tfLparpf1k89c+iHHw8enx0Rv/yHxvPPrf1p6cvz/vxu+hfvHd33wWczF/2JdqAmaqBd16+8UnPu+/z1I2qqwMNa+MPB0Ms40s2XYIrU6w1x8I32eJPBaiTEEGsVS/xWixZcs6OtLQ2Vu5bo0DqjNSvV3Iqweta8V56rqzNGdqmb/t77bMdjC7Z91rQX5thzpK9g5N8+bsoE97gQK6Qz8JJm0sFnJxQViWCJ1kWN96/Q0Wwd1TEzjUWceedqwq/GKa/Q4viAjqurezur0y3Z2bd0yhIH0g59u3fv26dnT3ik4HLFps4QhcjT3ZfMIvQ2vUlokxhtH+8vjabmaBopRBvMRILJaXJ5p2V5gUo5JsxsvkG55cSdRvvybh8yoO4FT3h2xZZQZSu6W7x4xVpToxsTXkiIy15w2cyjjtmENEbSy6I+QrREm/WSYDBECJGoj3URsTwIqmxW0237VU7TbMrr9XDGraOlWfl0zMdKLj16RFkwd+tWPcscUkgrlPSmJYxMUabItsZPtobmpuMwt0DifAZCqSgxonKVSzLMUM5E9FF7y4eg0Skkx+eyWSANfQqqxGjB3a5NbHS81YzrWCEyPrLEnxxvaTYrr7elIjcHnmiLphxXtcTOdcRpD2uK7D7+7Io/T5nxzDI4KmPG/0ymbIgx868ztr3OdlFx61+b1rFdjzyy7dOmPeLAVQUjG4pL3/oEyhPWXNVXdfXFc8W1QXFj4yINFqMZimuB4lpuoLjX6q29pda++ixfh7dh6vvvcK194xN14qH+dw7wWUMesly1eDUzj9KRGF1MfIIxrsRvtAhwOsJ14gcyc37ymsldIGmOYW6nWK6cP//UV3+kkRe+ptGNu15+8YWaP72o7GRpyr+Uj5dQcRONpOnKAeXygcOHDxw4yGMsPM4cddcuHkcSIgReklgdeoRZFknMBrM+0QzXbLaQttePIxoT7KpbTmuuUVQm8LDL3XLs1Th7bFakqK97Ml7v23DfZ999/9PLVezJ9ZXPPWd7scOQLCVL7r5qZIFyWLnAVywcbdjtPr7nxHt7D2kSEjKw1mhUTrFc6SOYNcYUQSLN0HNpHFIB0ryyltwKeWEkJeGFsdoBPeOyet/9VGHdkzZ99iZxdOR6U+mrv2uqFwfunTKNhHJzYTbmcvPc3E6kJCuJsEa081iTIpCbx8a2Ge2PtQj60S3lc53c/Kpv7ZaaditrERPAEiTmwuyvPjoy/y8bFv9x1jPPPdTni7feeDnrlcemzSj76+ML+tGM1a/m1RQXD7xtZO++RZMHL3p+4PL8O/r1vSvfW3wf1ugKnmP1Uj6E4vM5IgwWm81gFQ0inK3FZ4yJslhiyvwWsw6hQte8SJQy3jbxlv2tzvY9oRDqdqKcycym3lh+AoK4n+QeHZ8wqbuy47kX+t9Ls5Rd98wzGSojYulwNm9E/28blzY9NmYi59c66HGuOBB6dKsvjsYYdahkYuOiLHobhKPajrYEtfZvrmzBo2hb2B26w3llNC2eNffV1X95so2hS92sd/eKA5uyFj68/SDre6W+6q4ROw6yA0SrJCyYM4rE+4yRZmqSIqiZcFfkDdcRLjXX9/ZjSPMpXauU7vwmL0YvGCJzv31LGYNxZ+8qjXKlfcgWXanHiHZ4Ky9GdKj1RLLTFSUkCPokK1y6PvZX9YSg5pP83LMNRSjlpURMsmD38gsqZmxv01V/i3P3B8on28qnGPUmR9Kud9402m0W0WDwrW5QDrDJd362a1zTM+JA5V5l5N39lo9k9zY95b7rzgFJgy+zgeqKGOzThhXZuc4bE4jFYo9PEIk91kDMppgSvykx7JKu0fmY0LYpXwnnaUgJsynb+d2gaL3BF3f8bSUtb8fSQQO75o94ILUXOLH8gzGefVls6pXk+jXRyyPHjF/JeVwAm6vA/Gp9Q3Q6FH1ic31T5pfMan1T5ucR4DfrG6Gi8Rgb0nSI/dj0BiucJdyxdFHje/CCtIsUKUyXDqvnE519bWRijSSR8QlmQYg9YKDE4DSwzob5BmYg/HhKTWxa2HeLGOppGci79Gyf1rt3Wvue9OGeqfwqtadUkZmRkZnZtWumRlW/At0NIO/L4F9QLG3bd5DakpSIuLiUth3Ezl2YpBciiKNtghCX0iG2E1KuTtRkG+03tfCF0apW2K/3mTRUDNn5ibPqDHi6qjoD/rWoh/ppyO1UQxpfudhp+V23+WY+Xra74Y37fC/mfjJ02v2TcvsPvG3hPOWHui9Pfvy1eH7JtH4DUtrnDB71QtlLm/LWtb81cEf5HYPm3p09KbPHKO+QEceuFIqb/rJjbTAYqgWlw9ZUkktItEwmf0WIZYvAGoIn6lJ7xiR4aHpmJvqpUUjtNyzULyHcT6mLvwUVP+9HQjZHzaPWPGt/ZYy5708kIvQ7nztXd7vA6cft9/18ZVnTQeNK/TjcGhBfQr/HjJ/6ZU0bCDHWX1l2+WHjyta/32yYKu7nvw8Ci+a/W8CRRqqFXLJQSidesZrMk9eTMukomUL3k4VsIhkGZInlpBDPJjIPKWTVaPOQanaZ2NBWBtQD44BRQDrwMDAdGKk9n6j295Bsfg1UcCrMJgm6LmSWlESI5CV7JBOZC83cI1YAabj/BPffkz2sHvNlBEvFi2jvQvbocsgeZDx75GwyVzys0ct4VkbK8a5NOkIasEeim04SxADRi4uw12oyhK0jNXzNoHyfQ4RlwUaxhi4Q55LR4jlSKxzGms8BC8h0tpM41OsLpJZZyFpmCS4X89XrWt0cUsvbxVD/Wt5PGIL3D5Fydpq48GydaIF/gy8R+xAP+MyEXaRAMJJeYjn9BjRH5YnGe1xvA3jbbCCJ9xETcV1Du8gbSBk7imdWMkx9B7znbSIJXhamkDlq237SBXCre2kktVIW1g9+Q35JaB8sMPX9AnkYuQO4FXCC916V79eBLjKocFmocmgByKGvKov6YBO/hqyywnJoDaxrAadcFi2hygIykyLBN87360D+hoxWZbHgWkAGn4L/r4BuBr5V+R+WQ2twPQs9X3cNIAtVZqB8r3y+X1Hsnc9/Q8p19JxKs8TzmIPzZ8FvU67P6ns3otB1vh9QAmoFn7/EPleC1x1BvwBNBn1flQESUo3WimegG0nQUdiIqqfcTqCrKmAv6PMnjY7SaKh9tUoT8c73XI587tZUWkSE5raQvU1vTXVTyFxdFZnKbZDbgUbHafQhbpfcNm5IYbOq3bSiqr5AZv8t5fau2twi1bexsN1z22tN2fNYZzXZITlCMuc6z/UuvKfmte2goop6mg7q4L5AXEOn0FWwtx2UiWvJcdz/DFi4/nC7E88HP5IfDn4k1AT/IS8InpKqgx9yynYHvwr7Os5/cT3poOoG1sRlj7nncJmq8jsGO9T8nDid9NdsaQ+3HXE5Gch5xPcnT8Ua4eNAp8g58HGwS3Xf3CcdI8Wq/9pNNohnoftcx7jdeYhRPESm8ufCcc2GdsG+eD+uMyOCF7kfEUuRkRyEXLnO58OXHibr1P7QefDGxseU9uO+PPiNbCfrMH8F9vitOhfn4dlQG98j9mfje5Y84C94G/Ij8CfQWd1cwnQbtT4XsD+F2PleVXs8B6rxC7oYyceSD0G2dWSI7CF7Ofg70kaMkaOOsaclrzQ/ZuNjhnnF+0irSI1+MNmjL8T148QiHwN1AxaSpZ+szt1J9Uf7yEwRuiLMAj/WkzRuxzLELJwjudhLLQd8fC30wCT9jPsEzR8palxQY4pwAHLm/mY/eIl4gDXVgjfP6DIQS7LxThXxyL3QthP9L5I+cgDXs2EHC1TZWPncwiWV5+VaLDrH7VzeTkw6uxqLrOoa+ByoM0XwQZiLsTV7aE2b7YOQYXoNwsBgI51IEjgYIdkqPR6CUEgSxQSyEJiDWLJGLiTVhsmkjOcHPG9gcyDLOYhvCmKOUZktdCJTtFwgV84kz4NmyFV4vwOZqu9AdskZxM11FXo+EbEoD3BrsWkieDyO24X0DdkNXe2v+vEy8KyGzBISoLfVpFTLIULYSCaLBxGrOdaQA6r/I3QhMBWYg/hnA7KAXoBX1P7rmTBlG0O/jEFHoG22ar+ErkbD/mv+a5tCDj425wt0JBJzE/kIeApe83wgHDuw/wcxZgX28DB8ooNDzocOfg+9yUIMLCPrCGm8k5AmHWgMKJbS1EXVa67LPE5Ap/RpiJ/Pw1dMJFbJRqy6UujkecwzS/Vpet1U9M/C/SHYioNE6o7jfh9kv5VkQTcTVH8QsknVn0n8m5IL42nUsIvM1S/DmqpgK/lkut5C5siLIJ/wvB7Imse247CZmVjXGsJ93DHguO4b0kEHGcn9saZ8VZczoLtW0D1qbM0iGcgvLFIm7nOhh30Ik0eHbFa1m1Fon4l+3M8NU2kG/I5VWkJM8Dse2YhxcxBvFoKeBS9WYW/Yu9wHa3VfjcPgmVXYD9vi+ox8K0yhN3pxMsY5gzH3QZfWkhrxZ/IMt3nxiEr3iDsw3j7SQxpGOoUp90nct3D7hk3uEblcd2LdW2Hb3J/AvuVIrGkw2vlY3IZHYG1G+Fi82zqPCMeU5vj/DXK6BaQ8TMNzhfkibiL9hUaSxPWA60AzDcfbnGsp91XcX3DfptpzKxpeI+Sxh/sQ7uNUPxOWjwl8moj8NEBkNU89R+bxGKHrQeYhL5+qy0LcmY3YZIEdDiZDdKeh88eJSe+Azo9Qc4SQPBrA52zIoZ5M4TFF2oo1BMCzG+VXIer5jee/Sf+LvGsIaPaNnmv50xyNPnej/EajhTd8Hrbv36Ct85WwP/gtek0+05LCPgm5chR+ZDLoshBtnAhMb4GJtIZ0ovWI3+H86hzkdRgx8VzIXuETGpBDboA+ZKvxUg7ltvIctU+5WgchX8D7c1TdrcN1WvAbNW9djjxlNvR/L2kAH/PDuSf46eB5hB57kG3Bb9T8EXqrX436ALmGFBq7VqvbShHbRvG8hs0OLlPX+PzVXBDvDeb1nLrvEdh3OJeDvQDTYTP5QC+8P061IdiSUIccaSvGd9Gd8HfbgIW81jLCXg2rEfdrIRf4VIy9B89q9blo80Cv2VVfjv0IvNYIy/m/zUNVG7+BL2id84f51Vqnwr6g5XrD7+gehg8aqOWGF66ut4VdrL1Wz4MLsY8u2E8S6N5fzXWZrEee7g7n77/aD/dPjairr9YnofpnNJml1VqqPFrb5W/Y0/SwHguR8BWXkOMkkiTdHuwPUPPksJ/vAl2BHvD8R62jVxER+U0C8kIH1mjjuXLzXrUaSHZr/EW9jz3Zmm1mLlmvtp8jm7X8LFfMht6ca679y1XfnIi5eH7M45UXffar9edy9Jmq9nsG4DHHErwMnqxXc+jQWYGN59EMuizIxMj2I1dDvsfjGfKE9RrQN7hb5aUplC9CN7hfr+A5ItbraIFaDnXM3fDRs9XcMHTWYAnu1nAacMBeOmnnDzaR16Znsa7wOQTivrAP4HYzAjyEbgmNwcNCOfK7cpKp0p2abHhttB/2iD3yfBZjZ/H4LMzRzjq0d3TQSd0R5A45eM+KeQHEXA4Hj5HiJ4AVPGrAPsXgYQ7kkGs46PngHnaMrAG6cAjbyRopkaQJkHM49wznozSTpHOwAmIBXKw/at8Q0oA25DKe78Z7AL9mVXhHu6e1xKVCG4PycVuAEGUvqEOYir7nyRohh0wWlmOMC/AhxWTtjcBrQp4zqzkyaiEN5Rx0K3SOhcB+BvhZzFyM3wLCadJBxUXSAWt4BfgYQBaqvE1I8GnQE6HcMOjE9YpQn2AtYMT1zhCCZcDEFtSrYXAICrLUYCeA0w5Xoc61KpTd8nn4HMGHgF6APzQPf1eZq63tldC61HkXa+9nAuirbAr1bUIlrRwGJofmU+fODI0RzAD4WHcDf8X15tA4fE51H1tAc0LP+f6C/HqRhg0AMvJgPuZAdh4sBFZo72Vp94WhvrydIqUKpuF+1rXP+ZgqClu8A8+hHND2Ww8cBH4GdgOfAEaNXwe1ddRCpzpoWMN9h1rfgapnmw1kolQT/JDXBtyOJW/wEvzIXK0Wnos6fjrsaI+wiQSES8FL8FnjxB3Bc2J6cCKPk9w3IN5XqLkCz51Hw34QG0Uv6aKeFRTCtsLjVUB3FNgZ5hBDa1D9E4+xaq3I88LDWnyHH1Vr4wOqr9GH4zynnG+qzfO4Eq4Pe8DXb0JN/A184UD4kk6I+btJABgoNGDt35ARzEsCTA7WwJYDwiKSjtgUgN8JSFb07YS4fAS1VggyaqDJYjmZyZ+pz0X07YE9ARgvHeNy/zlERo7JqRprfsb+DpIRaiyvJWWikbgwT4A/U9eCMcCjKeI6+LEzav5pEn4mNYAVc9UI01VMBf+mw1/WsD6kkB4PboQPrEHNWiONQ25cDawBAuhjQ+5aj2cH1PfSMMZqaSHxIE8eCSwTdiOmp5FxoFX8GvGHY5ygR4ywIVbvJhPpPvK4MIxUoY6pwjxVGK9cEJGbcMqBd9ko7HkfWQIUo98S1MpWdgRrP4r+feBX61DTjkPfcsL4eGy9Opbar7lPPVkS7gOZIZ4Ft3P5sZ3BC7o5wZOILSfRVi8MCTaw3cEG4VDwIjsdPATfn49+AdGj7nmE7hB8aSheGdHO+crjhi18ps3PwJGDTtXyuWHN597n1Jg0TI3HZYhjPA6iflBjS+gsvfkcXbigxdAuobML1VYsauxbp8qW81PEOEPAZ84j8JLlkgy6L7iP8xR7XwY+cD+/jLnIEA48q6J7CRDcibWr/FZ5uS94QeX7sRDvwaOJ8MHj0P+Cxvc0tOcKe9B3l8b7n5H7A8JowEE6CRtIOWxinea3Fmo+iNv/3hY0J4TgyLDvUc+ouK21pr8+M/6P9L89S+bfR7h8rnN23JqOBO0XvtfOlFcgF+wAeqn5rLg1DZ0TrxG7BH9Cv7+H7oOfa3Rz+NwjTG90fvxbZ8fNuaDmq5rptWfJa66lwS9+80z5N86W/7dnzGr9wfVco786U+PfmfqotXSIhvPNG5w/q7LA/FpuxtR6A3kX/G5Ds/3cAM3fas6pwY5KuzTsC37Ioeat14HkQZ8EvDMCGAy4QwjnrjeCvBb9qgnVHQT2AFs1HAl+qNsd/BA2+CLwFHyNAlzBdU/AjOvNQLWwnlBhNeZpAGqBcxouIlZyXO/7DdeNOszL57sMnL86r3q+/B8gbQ+9Jx9Ff3vwQ55X/0fUo+8n6HtBww5gL58L+wPCfA/zsTnX3w1fthu5YHjN2vzhcX9LjrqT0CNAHyBUvxtYpGF58EOO35KLoYxQQzGhxlXAEmCWhjXBD42P//a+DXPw/jPoX69hAbCMj4H3Z13d93/UwfA3Q+wD/qJKXEPPqnQH+VqsIReut27JFdwvWYP75eeBZcH9+q2w+TU0GyjHexegM58CJ4C3gHeB54A/qd+/6klHYUFwv7AhuB/908Pv/EoPDmsI3y8KnR9IAcy9CQCfEfsbQ6DV1+XRAawPc8kHgYXB/QYZ+cka+g33i/D7hwAXwHPewbDrYWI5NTC1plDbhoBaw+BnyuI2spB/t+X1QItnlhawsv2Idfvhm/cTt5p7zNVyh8GIXXPVb+wDtW/qFWo8riY2eSPZKI1Sv8U7gDTdLuRW1SSBP1PjA6+Py3BtUr/L8tiWwr8hS8eJUZhHsrRvwl2Qt+XrCV0nEmppTTn42T5fu+4QfUbaSe3iRqzjEHxyNfK7Q8wtHqKitDF4SSL0sLSRLVOvf0Vbgx4JPeOUo+Wz/237fwPowDVgh0AnqteQKPYzB5BRx03h4N8IdOfoGqAqTPF8g7gTsjhEtgIdONC3Qp9OA/rJ9KBuBM2XCT0CDBOzSR/kpn3QfyL8fA4Kut0y52c57rsgBln4d7HgZTXv4mdhPA7wuMDPwI2wlR5om63KWY0b6rkGqiDd8+oZv13k7+ciJtajLz+jqCMurd7jNdhx4DzqzOUc/PwrDN4eAvmFy1Tgv0eQRtZzaO99IkXyfw2g8QzGugSq/mtm4gj4u2sxBBimUY58wYI8cwTJ1MDPGzoB/dHOqacF0oAMtPPrJMDe4j3e3kF7f3ALjEb74OusI9wvP9xX65cB9AKyw0B7dot5moH2zFZzhccpbz12i/Fbr2OEhuLwtcC/u48gPVoD7Zz218Zthsa/hzX0CgPtnFa1xg3W0XofBehXoPEjvGfO7ySNzxmaPJrlo8mlvya/ghZ86qStNSxzVf7auq9dx2/EQPj1U63wWUv8Vqxv/d6vcoHdZC/PQaVaso1/+xa8ZHJLQM8vAuu13L5aLAu+pNX6BzWsD50RqG2cHsB7ozWExxndEqh3iTybmGT+TW8JcuRc0klnVM/l9vDvtHorYcinTPptyJ0J7PaS+l2cf8vj36BrEZMCsPcO8LMzhQTVr4e+ecK/MnfzZ8n+/wsgXpGLV8H/3Ur6ALANgF2zacC7hKB6JeItQD28YQF2EQeMg7fJRZZiBP54fRhW8n8oGPiIkAjEvYi3CInMBzBOFGqkqA+vwtQPeBCATzGD/2ZQy30hRGOM6FrgUghW1FjWd64i5pbrYEQINieAPcT2BU4REreCEDviq/1TQuKxl/ithCT0BrCmhC8JafMEIYlwx4mPEtK2s4bnCUnyAR8QkgyajH052mmoIcRp/D9g8f9/4Rp3HVT+v4StN3ETN3ETN3ETN3ETN3ETN3ETN3ETN3ETN3ETN3ETN3ETN3ETN3ETN3ETN3ETN3ETN3ET/58FJcQwjQ4jhaSUSOq/0WUn/P9avlcYxP8/5r6gweV1FhEn/cFJVzjpPCd10uQih1cociRTc3J28uZk4Z6CkUXZI+8ayUbS4iJ/QXFR52JfcUFxoFi8u2BEkXMEPT+CjqCFRUUFhUXTCqmjkHYu9BXOL/yo8ESh1PlOeicbUnRHWX5Rdv7mfJZPBxUNLBhQNAD0roIhRd4hdAguBxcMKnIMouZB2YM2DxKGFwwr6jOMDqMFRUMLCop6tKMPjS1zFM+lsyqSHfdX3OaYWdHVMQN4uoI2VNDPK2iCN75Ih1XLQtAxZVKC4/eTUh33TspyTJ7U3/HKJDoylepT+6ey/qmLU99LFea5l7sPuIUYr9U3pUiiQpHINyxQs5AtbBaEspJujgfG03ElbsfYEq+jtOQWxxhgNK4bSt4rYZ+XfF3C2pYlFsV5Y4ssXnOR2XyXmTnMB8zMbA6amcwoKaJlpGgqmUc2kx/4f8pB58dRiTbQFVsKh6enD2rQBYcNChgK7gnQxQHPcP7TN3RkQF4cIEUj7yneQukT/oXLlpGcpEGBrsOLA6VJ/kGBMv7/POQX83FhSdoSR3L8FRXp6aMrZsxMT0+vmJHO/1SELioqZswINfAnM7Un4ccVoXu1l/rm1SdoSo8fTcj/A8rnzSoKZW5kc3RyZWFtCmVuZG9iago4MSAwIG9iago8PC9EZXNjZW50IC0yOTIvQ2FwSGVpZ2h0IDcxMy9TdGVtViA4MC9UeXBlL0ZvbnREZXNjcmlwdG9yL0ZvbnRGaWxlMiA4MCAwIFIvRmxhZ3MgMzIvRm9udEJCb3hbLTU1NiAtMjcyIDEzMjEgMTA0N10vRm9udE5hbWUvUkhURVVaK05vdG9TYW5zL0l0YWxpY0FuZ2xlIDAvQXNjZW50IDEwNjg+PgplbmRvYmoKMTMgMCBvYmoKPDwvRFcgMTAwMC9TdWJ0eXBlL0NJREZvbnRUeXBlMi9DSURTeXN0ZW1JbmZvPDwvU3VwcGxlbWVudCAwL1JlZ2lzdHJ5KEFkb2JlKS9PcmRlcmluZyhJZGVudGl0eSk+Pi9UeXBlL0ZvbnQvQmFzZUZvbnQvUkhURVVaK05vdG9TYW5zL0ZvbnREZXNjcmlwdG9yIDgxIDAgUi9XWzNbMjU5XSAxMVsyOTkgMjk5XSAxNVsyNjggMzIxIDI2OCAzNzIgNTcxIDU3MSA1NzEgNTcxIDU3MSA1NzEgNTcxIDU3MSA1NzEgNTcxIDI2OF0gMzVbODk4IDYzOSA2NDkgNjMxIDcyOSA1NTYgNTE5IDcyOCA3NDFdIDQ2WzYxOSA1MjMgOTA3IDc1OSA3ODAgNjA0XSA1M1s2MjIgNTQ4IDU1Nl0gNTdbNjAwIDkzMF0gNjFbNTcxXSA2Nls0NDNdIDY4WzU2MSA2MTUgNDc5IDYxNSA1NjMgMzQ0IDYxNSA2MTggMjU3IDI1NyA1MzQgMjU3IDkzNSA2MTggNjA0IDYxNV0gODVbNDEzIDQ3OSAzNjAgNjE4IDUwNyA3ODZdIDkyWzUwOSA0NzBdIDE2MVs2MzBdIDE2Nls1NjFdIDE4NFs2MDRdXS9DSURUb0dJRE1hcC9JZGVudGl0eT4+CmVuZG9iagoxNCAwIG9iago8PC9GaWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoIDU3Nj4+c3RyZWFtCnicXZXNittAEITvegodE3KwNN0zY4OpS0JgD/khuwm5ytLIGGJZyN7Dvn3krk0vxOAPVPJYXVWmvfn48OlhOt3qzffl0j+WWz2epmEp18vz0pf6UI6nqWpDPZz62+uVsT93c7VZDz++XG/l/DCNl2q/rzc/1pvX2/JSv3t6+v2heV9tvi1DWU7TcVU0/Py1Ko/P8/ynnMt0q5sKqIcyrl/1pZu/dudSb+zgm/j0Mpc62HXLCfrLUK5z15elm46l2jfrC/vP6wtVmYb/bqfMU4fx7eMCZ2hg0gHOsKXUwxl2lEY4Q29S28AZBkotnKFQCnCGkZI9nhQO0Sqc0lKKcEqglOAUoZThFKW0hVMipR2ckih1cEqmZBmQwiRay4AUJtEOcEpnUmCeRqWhYFZIpaFgVkiloWBWSKWhYFZIpaGwhVNpKOzgVBoKZoVUGgos1ag0tLbi1AOlEU5ltdLAqaxWWjiV1UqAU1mtCJyRSUiEM9K2JDgjbUuGM9K27OCM9CgdnJEehUUYI+vQAGfkXKpwJtahEc7EuTTBmTiXZjgT59ItnIl1KIswJo6qLMKYOKoe4EysQ3s4E39fOsCZXg0VOBNL0xHOxNJiA2diadHqIhNLiwHOxHCiwJlZWmRdxsxwYoIzM5yY4cwMJ1osZGY4kQ0aM8OJHZyZ4UTLgMxMIrJUY2YSnVkhB07f2URk4RAHezw5JluN/3bgfUveF7gv3f55WdZ9bFvetu59356m4n8E82W+n6rXd/UXALd1ZAplbmRzdHJlYW0KZW5kb2JqCjgyIDAgb2JqCjw8L0ZpZWxkc1s0NyAwIFIgNDggMCBSIDQ5IDAgUiA1MCAwIFIgNTEgMCBSIDUyIDAgUiA1MyAwIFIgNTQgMCBSIDU1IDAgUiA1NiAwIFIgNTcgMCBSIDU4IDAgUiA1OSAwIFIgNjAgMCBSIDYxIDAgUiA2MiAwIFIgNjMgMCBSIDY0IDAgUiA2NSAwIFIgNjYgMCBSIDY3IDAgUiA2OCAwIFIgNjkgMCBSIDcwIDAgUiA3MSAwIFIgNzIgMCBSIDczIDAgUl0vREEoL0hlbHYgMCBUZiAwIGcgKS9EUjw8L0ZvbnQ8PC9IZWx2IDEwIDAgUj4+Pj4+PgplbmRvYmoKODMgMCBvYmoKPDwvVHlwZS9DYXRhbG9nL0Fjcm9Gb3JtIDgyIDAgUi9QYWdlcyA3NSAwIFI+PgplbmRvYmoKeHJlZgowIDg0CjAwMDAwMDAwMDAgNjU1MzUgZiAKMDAwMDAwMDAxNSAwMDAwMCBuIAowMDAwMDAyODA5IDAwMDAwIG4gCjAwMDAwMDQyMDYgMDAwMDAgbiAKMDAwMDAwNTYwNCAwMDAwMCBuIAowMDAwMDA1OTA5IDAwMDAwIG4gCjAwMDAwMDU5ODUgMDAwMDAgbiAKMDAwMDAwNjEyNSAwMDAwMCBuIAowMDAwMDA3NDA2IDAwMDAwIG4gCjAwMDAwMDYzNDEgMDAwMDAgbiAKMDAwMDAwNjU5NSAwMDAwMCBuIAowMDAwMDA2Njg0IDAwMDAwIG4gCjAwMDAwMDY5MzkgMDAwMDAgbiAKMDAwMDAzODI3NyAwMDAwMCBuIAowMDAwMDM4ODA0IDAwMDAwIG4gCjAwMDAwMDc1MzYgMDAwMDAgbiAKMDAwMDAwNzc5NCAwMDAwMCBuIAowMDAwMDA4MDUyIDAwMDAwIG4gCjAwMDAwMDgyNDcgMDAwMDAgbiAKMDAwMDAwODQ0MiAwMDAwMCBuIAowMDAwMDA4Njk1IDAwMDAwIG4gCjAwMDAwMDg5NTEgMDAwMDAgbiAKMDAwMDAwOTIwNiAwMDAwMCBuIAowMDAwMDA5NDAxIDAwMDAwIG4gCjAwMDAwMDk2NjQgMDAwMDAgbiAKMDAwMDAwOTg1OSAwMDAwMCBuIAowMDAwMDEwMDU0IDAwMDAwIG4gCjAwMDAwMTAzMzMgMDAwMDAgbiAKMDAwMDAxMDUyOCAwMDAwMCBuIAowMDAwMDEwODA3IDAwMDAwIG4gCjAwMDAwMTEwOTQgMDAwMDAgbiAKMDAwMDAxMTI3OCAwMDAwMCBuIAowMDAwMDExNDYzIDAwMDAwIG4gCjAwMDAwMTE2NDcgMDAwMDAgbiAKMDAwMDAxMTgzMiAwMDAwMCBuIAowMDAwMDEyMDE2IDAwMDAwIG4gCjAwMDAwMTIzMDMgMDAwMDAgbiAKMDAwMDAxMjQ4NyAwMDAwMCBuIAowMDAwMDEyNzQzIDAwMDAwIG4gCjAwMDAwMTMwMDYgMDAwMDAgbiAKMDAwMDAxMzI2NSAwMDAwMCBuIAowMDAwMDEzNTIwIDAwMDAwIG4gCjAwMDAwMTM3MTUgMDAwMDAgbiAKMDAwMDAxMzk2NyAwMDAwMCBuIAowMDAwMDE0MjI5IDAwMDAwIG4gCjAwMDAwMTQ0ODQgMDAwMDAgbiAKMDAwMDAxNDczNyAwMDAwMCBuIAowMDAwMDE0OTkwIDAwMDAwIG4gCjAwMDAwMTUxNjYgMDAwMDAgbiAKMDAwMDAxNTM1OCAwMDAwMCBuIAowMDAwMDE1ODQ0IDAwMDAwIG4gCjAwMDAwMTYwMjQgMDAwMDAgbiAKMDAwMDAxNjIwMSAwMDAwMCBuIAowMDAwMDE2MzcwIDAwMDAwIG4gCjAwMDAwMTY1NTYgMDAwMDAgbiAKMDAwMDAxNjcyNiAwMDAwMCBuIAowMDAwMDE2OTAwIDAwMDAwIG4gCjAwMDAwMTcwNzMgMDAwMDAgbiAKMDAwMDAxNzI0MiAwMDAwMCBuIAowMDAwMDE3NDI2IDAwMDAwIG4gCjAwMDAwMTc1OTggMDAwMDAgbiAKMDAwMDAxNzc2NyAwMDAwMCBuIAowMDAwMDE3OTY2IDAwMDAwIG4gCjAwMDAwMTgxMzEgMDAwMDAgbiAKMDAwMDAxODMzOSAwMDAwMCBuIAowMDAwMDE4NTE2IDAwMDAwIG4gCjAwMDAwMTg3MDAgMDAwMDAgbiAKMDAwMDAxODg4NiAwMDAwMCBuIAowMDAwMDE5MDYzIDAwMDAwIG4gCjAwMDAwMTkyMzggMDAwMDAgbiAKMDAwMDAxOTQxMiAwMDAwMCBuIAowMDAwMDE5NjAxIDAwMDAwIG4gCjAwMDAwMTk3ODIgMDAwMDAgbiAKMDAwMDAxOTk1OSAwMDAwMCBuIAowMDAwMDIwMTM2IDAwMDAwIG4gCjAwMDAwMjE0MTUgMDAwMDAgbiAKMDAwMDAyMTQ3NSAwMDAwMCBuIAowMDAwMDIzNjMzIDAwMDAwIG4gCjAwMDAwMjE5NTggMDAwMDAgbiAKMDAwMDAyMjA1MiAwMDAwMCBuIAowMDAwMDIzNzkwIDAwMDAwIG4gCjAwMDAwMzgwOTMgMDAwMDAgbiAKMDAwMDAzOTQ0OCAwMDAwMCBuIAowMDAwMDM5NzE0IDAwMDAwIG4gCnRyYWlsZXIKPDwvSW5mbyA0IDAgUi9JRCBbPGVlZWQ2YmEzM2YwZDY5ZjkzZWEyYzZjNWFhM2U0ZWJjPjw4ZGIwNDk0YjcxMmY5ZTE5NTJmZGMwMjI2Mjg3NzdhZj5dL1Jvb3QgODMgMCBSL1NpemUgODQ+PgolaVRleHQtNS41LjUKc3RhcnR4cmVmCjM5Nzc3CiUlRU9GCg==", - "kommunalverwaltungId": "100000000", - "postkorbhandle": "51522620-03d2-4507-b1f0-08d86920efed", - "anliegenId": "1234", - "zustaendigeStelle": "test" -} \ No newline at end of file diff --git a/semantik-adapter/src/test/resources/intelliform/EinfachesFormularZweiAnhaengeXmlDaten1.xml b/semantik-adapter/src/test/resources/intelliform/EinfachesFormularZweiAnhaengeXmlDaten1.xml deleted file mode 100644 index 0b0515d0ffbca41617c62b8821c9de1d00bd5cd2..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/test/resources/intelliform/EinfachesFormularZweiAnhaengeXmlDaten1.xml +++ /dev/null @@ -1,79 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<myForm xmlns:pdf="http://xmlns.cit.de/assistants/pdf" xmlns:t="http://xmlns.cit.de/intelliform/transaction" t:uuid="eac2480e-7166-4b16-bddd-880591e7d93b" t:id="20210415307020414701" t:timestamp="2021-04-15T08:31:42.398Z" t:sender="intelliform.by.kop-cloud.de" t:form="SimpleFormSendetAnHomeServer" t:form-id="SimpleFormSendetAnHomeServer" t:customer="Kiel" t:customer-id="Kiel" t:client="sh-dev" t:client-id="sh-dev"> - <KontaktsystemTypA>233034600</KontaktsystemTypA> - <KontaktsystemTypB>233034601</KontaktsystemTypB> - <AnliegenID>8966671</AnliegenID> - <antragsteller> - <sh_strasse>An der Schneiderei</sh_strasse> - <sh_hausnummer>1</sh_hausnummer> - <sh_plz>24103</sh_plz> - <ort_auswahl>9006402$01002000</ort_auswahl> - <ort>Kiel</ort> - <GebietID>9006402</GebietID> - <GebietBEZEICHNUNG>Kiel</GebietBEZEICHNUNG> - <GebietGNR94_GNR>01002000</GebietGNR94_GNR> - <staat>000</staat> - <iso3166numerisch>276</iso3166numerisch> - <kont_telefonnummer /> - <kont_mobilnummer /> - <kont_telefaxnummer /> - <kont_email>noreply@ozg-sh.de</kont_email> - <kont_demail /> - </antragsteller> - <Upload1> - <file content-type="image/jpeg" description="" id="assistants.E0FBA361C191F8B723949467AE302BEA24E4745E" length="155251">Helge1.jpg</file> - </Upload1> - <Upload2> - <file content-type="application/vnd.oasis.opendocument.text" description="" id="assistants.52D79E5B2118D1740045AB87151535DCAD24E9A7" length="7993">Helgetext2.odt</file> - </Upload2> - <GebietID>9006402</GebietID> - <zustaendigestelle> - <OrganisationseinheitenAuswahl>10363455</OrganisationseinheitenAuswahl> - <OrganisationseinheitenID>10363455</OrganisationseinheitenID> - <OrganisationseinheitenBEZEICHNUNG>Landeshauptstadt Kiel - Bürger- und Ordnungsamt, Sachbereich Gefahrenabwehr, Waffenangelegenheiten, Jagdbehörde, Bestattungsangelegenheiten</OrganisationseinheitenBEZEICHNUNG> - <strasse>Stresemannplatz</strasse> - <hausnummer>5</hausnummer> - <postleitzahl>24103</postleitzahl> - <ortID>9006402</ortID> - <ort>Kiel</ort> - <telefonnummer /> - <telefaxnummer>+49 431 901-62181</telefaxnummer> - <emailadresse>Gefahrenabwehr@Kiel.de</emailadresse> - <demailadresse /> - <kontaktsystem_kennung /> - <kontaktsystem_kennungzusatz /> - <AnliegenBEZEICHNUNG>Waffenschein / Kleiner Waffenschein</AnliegenBEZEICHNUNG> - <leikaKEYLIST>99089008000000;99089008001000</leikaKEYLIST> - </zustaendigestelle> - <empfangendestelle> - <OrganisationseinheitenAuswahl>9068873</OrganisationseinheitenAuswahl> - <OrganisationseinheitenID>9068873</OrganisationseinheitenID> - <OrganisationseinheitenBEZEICHNUNG>Einheitlicher Ansprechpartner Schleswig-Holstein</OrganisationseinheitenBEZEICHNUNG> - <strasse>Reventlouallee</strasse> - <hausnummer>6</hausnummer> - <postleitzahl>24105</postleitzahl> - <ortID>9006402</ortID> - <ort>Kiel</ort> - <telefonnummer>+49 431 988-8650</telefonnummer> - <telefaxnummer>+49 431 988-6161111</telefaxnummer> - <emailadresse>info@ea-sh.de</emailadresse> - <demailadresse>ea-poststelle@ea-sh.de-mail.de</demailadresse> - <kontaktsystem_kennung>afmsh:9068873_AusnahmeLKWFahrverbot</kontaktsystem_kennung> - <kontaktsystem_kennungzusatz>alle</kontaktsystem_kennungzusatz> - </empfangendestelle> - <erklaerungen> - <check_gebuehren>true</check_gebuehren> - <check_richtigkeit>true</check_richtigkeit> - <check_datenschutz>true</check_datenschutz> - <check_missbrauch>true</check_missbrauch> - <b_gebuehren_beschriftung>* Mir ist bekannt, dass durch das Einreichen des elektronischen Antrages von der zuständigen Stelle Gebühren erhoben werden können.</b_gebuehren_beschriftung> - <b_gebuehren_intro>Gebühr bei Ausstellung des kleinen Waffenscheins: 60,00 Euro. Bearbeitungsgebühr bei Versagung: 45,00 Euro. -Sie sind gemäß § 39 WaffG verpflichtet, der zuständigen Behörde die zur Durchführung des Gesetzes erforderlichen Auskünfte zu erteilen. Zur Prüfung Ihrer waffenrechtlichen Zuverlässigkeit und Eignung holt die Behörde eine unbeschränkte Auskunft aus dem Bundeszentralregister, eine Auskunft aus dem zentralen staatsanwaltschaftlichen Verfahrensregister, eine Stellungnahme der örtlichen Polizeidienststelle und Ihrer Wohnsitzgemeinde ein.</b_gebuehren_intro> - <b_richtigkeit>* Ich bestätige die Richtigkeit meiner Angaben.</b_richtigkeit> - <b_datenschutz>* Ich erkläre mich damit einverstanden, dass der Einheitlicher Ansprechpartner Schleswig-Holstein zur Erfüllung seiner Aufgaben meine Daten unter Einhaltung der Bestimmungen der Datenschutz-Grundverordnung (DS-GVO) und des Landesdatenschutzgesetzes Schleswig-Holstein (LDSG-SH) speichert, verarbeitet und diese im Rahmen der gesetzlichen Bestimmungen an die für die Entscheidung zuständige Stelle weiterleitet. Ebenso bin ich mit der rechtskonformen Datenverarbeitung und Speicherung durch die zuständige Stelle einverstanden. Mir ist bekannt, dass ich die Einwilligung in die Verarbeitung und Übermittlung jederzeit gegenüber dem Einheitlicher Ansprechpartner Schleswig-Holstein, Reventlouallee 6, 24105 Kiel widerrufen kann. Ein Widerruf ist aber nur wirksam für die Zukunft. Verarbeitungen, die vor dem Widerruf erfolgt sind, sind davon nicht betroffen. Über die Verarbeitung meiner personenbezogenen Daten und die mir nach den datenschutzrechtlichen Regelungen zustehenden Ansprüche und Rechte habe ich unter Datenschutzerklärung Kenntnis erlangt.</b_datenschutz> - <b_missbrauch>* Mir ist bekannt, dass zur Verfolgung widerrechtlicher Nutzung die Daten meines zur Dateneingabe genutzten Endgerätes aufgezeichnet und verwendet werden können.</b_missbrauch> - <policyurl>http://www.ea-sh.info/datenschutz/datenschutzerklaerungEA_de.doc</policyurl> - </erklaerungen> - <logourl>http://www.ea-sh.info/logos/kopf_9068873.doc</logourl> -</myForm> - diff --git a/semantik-adapter/src/test/resources/intelliform/EinfachesFormularZweiAnhaengeXmlDatenVerschachtelt.xml b/semantik-adapter/src/test/resources/intelliform/EinfachesFormularZweiAnhaengeXmlDatenVerschachtelt.xml deleted file mode 100644 index f39136eec6402c722dfb56544bbef748e5f9c581..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/test/resources/intelliform/EinfachesFormularZweiAnhaengeXmlDatenVerschachtelt.xml +++ /dev/null @@ -1,85 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<myForm xmlns:pdf="http://xmlns.cit.de/assistants/pdf" xmlns:t="http://xmlns.cit.de/intelliform/transaction" t:uuid="eac2480e-7166-4b16-bddd-880591e7d93b" t:id="20210415307020414701" t:timestamp="2021-04-15T08:31:42.398Z" t:sender="intelliform.by.kop-cloud.de" t:form="SimpleFormSendetAnHomeServer" t:form-id="SimpleFormSendetAnHomeServer" t:customer="Kiel" t:customer-id="Kiel" t:client="sh-dev" t:client-id="sh-dev"> - <KontaktsystemTypA>233034600</KontaktsystemTypA> - <KontaktsystemTypB>233034601</KontaktsystemTypB> - <AnliegenID>8966671</AnliegenID> - <antragsteller> - <sh_strasse>An der Schneiderei</sh_strasse> - <sh_hausnummer>1</sh_hausnummer> - <sh_plz>24103</sh_plz> - <ort_auswahl>9006402$01002000</ort_auswahl> - <ort>Kiel</ort> - <GebietID>9006402</GebietID> - <GebietBEZEICHNUNG>Kiel</GebietBEZEICHNUNG> - <GebietGNR94_GNR>01002000</GebietGNR94_GNR> - <staat>000</staat> - <iso3166numerisch>276</iso3166numerisch> - <kont_telefonnummer /> - <kont_mobilnummer /> - <kont_telefaxnummer /> - <kont_email /> - <kont_demail /> - </antragsteller> - <datei_ausweis> - <datei_ausweis-item> - <file content-type="image/jpeg" description="" id="assistants.21B483DAA2DC7900C1D1135E566D0F672CB42832" length="1184319">20210326_133516[1].jpg</file> - </datei_ausweis-item> - <datei_ausweis-item> - <file content-type="image/jpeg" description="" id="assistants.2F1FF737CF4F23191C1952091CB342254EE22A37" length="1384037">20210326_133526[1].jpg</file> - </datei_ausweis-item> - </datei_ausweis> - <datei_meldebestaetigung> - <datei_meldebestaetigung-item> - <file content-type="image/jpeg" description="" id="assistants.B20451156C677116B91A4EF2D1E859837B6CE510" length="3066416">20210324_103054[1].jpg</file> - </datei_meldebestaetigung-item> - </datei_meldebestaetigung> - <GebietID>9006402</GebietID> - <zustaendigestelle> - <OrganisationseinheitenAuswahl>10363455</OrganisationseinheitenAuswahl> - <OrganisationseinheitenID>10363455</OrganisationseinheitenID> - <OrganisationseinheitenBEZEICHNUNG>Landeshauptstadt Kiel - Bürger- und Ordnungsamt, Sachbereich Gefahrenabwehr, Waffenangelegenheiten, Jagdbehörde, Bestattungsangelegenheiten</OrganisationseinheitenBEZEICHNUNG> - <strasse>Stresemannplatz</strasse> - <hausnummer>5</hausnummer> - <postleitzahl>24103</postleitzahl> - <ortID>9006402</ortID> - <ort>Kiel</ort> - <telefonnummer /> - <telefaxnummer>+49 431 901-62181</telefaxnummer> - <emailadresse>Gefahrenabwehr@Kiel.de</emailadresse> - <demailadresse /> - <kontaktsystem_kennung /> - <kontaktsystem_kennungzusatz /> - <AnliegenBEZEICHNUNG>Waffenschein / Kleiner Waffenschein</AnliegenBEZEICHNUNG> - <leikaKEYLIST>99089008000000;99089008001000</leikaKEYLIST> - </zustaendigestelle> - <empfangendestelle> - <OrganisationseinheitenAuswahl>9068873</OrganisationseinheitenAuswahl> - <OrganisationseinheitenID>9068873</OrganisationseinheitenID> - <OrganisationseinheitenBEZEICHNUNG>Einheitlicher Ansprechpartner Schleswig-Holstein</OrganisationseinheitenBEZEICHNUNG> - <strasse>Reventlouallee</strasse> - <hausnummer>6</hausnummer> - <postleitzahl>24105</postleitzahl> - <ortID>9006402</ortID> - <ort>Kiel</ort> - <telefonnummer>+49 431 988-8650</telefonnummer> - <telefaxnummer>+49 431 988-6161111</telefaxnummer> - <emailadresse>info@ea-sh.de</emailadresse> - <demailadresse>ea-poststelle@ea-sh.de-mail.de</demailadresse> - <kontaktsystem_kennung>afmsh:9068873_AusnahmeLKWFahrverbot</kontaktsystem_kennung> - <kontaktsystem_kennungzusatz>alle</kontaktsystem_kennungzusatz> - </empfangendestelle> - <erklaerungen> - <check_gebuehren>true</check_gebuehren> - <check_richtigkeit>true</check_richtigkeit> - <check_datenschutz>true</check_datenschutz> - <check_missbrauch>true</check_missbrauch> - <b_gebuehren_beschriftung>* Mir ist bekannt, dass durch das Einreichen des elektronischen Antrages von der zuständigen Stelle Gebühren erhoben werden können.</b_gebuehren_beschriftung> - <b_gebuehren_intro>Gebühr bei Ausstellung des kleinen Waffenscheins: 60,00 Euro. Bearbeitungsgebühr bei Versagung: 45,00 Euro. -Sie sind gemäß § 39 WaffG verpflichtet, der zuständigen Behörde die zur Durchführung des Gesetzes erforderlichen Auskünfte zu erteilen. Zur Prüfung Ihrer waffenrechtlichen Zuverlässigkeit und Eignung holt die Behörde eine unbeschränkte Auskunft aus dem Bundeszentralregister, eine Auskunft aus dem zentralen staatsanwaltschaftlichen Verfahrensregister, eine Stellungnahme der örtlichen Polizeidienststelle und Ihrer Wohnsitzgemeinde ein.</b_gebuehren_intro> - <b_richtigkeit>* Ich bestätige die Richtigkeit meiner Angaben.</b_richtigkeit> - <b_datenschutz>* Ich erkläre mich damit einverstanden, dass der Einheitlicher Ansprechpartner Schleswig-Holstein zur Erfüllung seiner Aufgaben meine Daten unter Einhaltung der Bestimmungen der Datenschutz-Grundverordnung (DS-GVO) und des Landesdatenschutzgesetzes Schleswig-Holstein (LDSG-SH) speichert, verarbeitet und diese im Rahmen der gesetzlichen Bestimmungen an die für die Entscheidung zuständige Stelle weiterleitet. Ebenso bin ich mit der rechtskonformen Datenverarbeitung und Speicherung durch die zuständige Stelle einverstanden. Mir ist bekannt, dass ich die Einwilligung in die Verarbeitung und Übermittlung jederzeit gegenüber dem Einheitlicher Ansprechpartner Schleswig-Holstein, Reventlouallee 6, 24105 Kiel widerrufen kann. Ein Widerruf ist aber nur wirksam für die Zukunft. Verarbeitungen, die vor dem Widerruf erfolgt sind, sind davon nicht betroffen. Über die Verarbeitung meiner personenbezogenen Daten und die mir nach den datenschutzrechtlichen Regelungen zustehenden Ansprüche und Rechte habe ich unter Datenschutzerklärung Kenntnis erlangt.</b_datenschutz> - <b_missbrauch>* Mir ist bekannt, dass zur Verfolgung widerrechtlicher Nutzung die Daten meines zur Dateneingabe genutzten Endgerätes aufgezeichnet und verwendet werden können.</b_missbrauch> - <policyurl>http://www.ea-sh.info/datenschutz/datenschutzerklaerungEA_de.doc</policyurl> - </erklaerungen> - <logourl>http://www.ea-sh.info/logos/kopf_9068873.doc</logourl> -</myForm> \ No newline at end of file diff --git a/semantik-adapter/src/test/resources/intelliform/FormularSoapRequest_WithContent_XML-Daten-1.xml b/semantik-adapter/src/test/resources/intelliform/FormularSoapRequest_WithContent_XML-Daten-1.xml deleted file mode 100644 index 7abb99daa06cee808a93870ea4c80b98917c8708..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/test/resources/intelliform/FormularSoapRequest_WithContent_XML-Daten-1.xml +++ /dev/null @@ -1,194 +0,0 @@ -<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> - <soap:Body> - <ns2:deposit xmlns:ns2="http://xmlns.cit.de/intelliform/2009/webservices/backend"> - <data> - <attachments> - <attributes> - <key>X-IntelliForm-Signed</key> - <value>false</value> - </attributes> - <content>PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPG15Rm9ybSB4bWxuczpwZGY9 -Imh0dHA6Ly94bWxucy5jaXQuZGUvYXNzaXN0YW50cy9wZGYiCgl4bWxuczp0PSJodHRwOi8veG1s -bnMuY2l0LmRlL2ludGVsbGlmb3JtL3RyYW5zYWN0aW9uIgoJdDppZD0iMjAyMDExMTgzNjU2NzA4 -NjYxMDEiIHQ6dGltZXN0YW1wPSIyMDIwLTExLTE4VDA5OjA5OjI3LjYyN1oiCgl0OnNlbmRlcj0i -YWZtLnNjaGxlc3dpZy1ob2xzdGVpbi5kZSIKCXQ6Zm9ybT0iS2xlaW5lciBXYWZmZW5zY2hlaW4g -Z2VtLiDCpyAxMCBBYnMuIDQgU2F0eiA0IFdhZmZlbmdlc2V0eiAoV2FmZkcpIgoJdDpmb3JtLWlk -PSJ3YWZmZW4va2xlaW5lcldhZmZlbnNjaGVpbiIKCXQ6Y3VzdG9tZXI9IkVpbmhlaXRsaWNoZXIg -QW5zcHJlY2hwYXJ0bmVyIiB0OmN1c3RvbWVyLWlkPSJlYS1zaCIKCXQ6Y2xpZW50PSJTY2hsZXN3 -aWctSG9sc3RlaW4iIHQ6Y2xpZW50LWlkPSJsYW5kIj4KCTxrb250YWt0c3lzdGVtdHlwaWQ+MjMz -MDM0NjAwPC9rb250YWt0c3lzdGVtdHlwaWQ+Cgk8a29udGFrdHN5c3RlbXR5cGlkbG4+MjMzMDM0 -NjAxPC9rb250YWt0c3lzdGVtdHlwaWRsbj4KCTxBbmxpZWdlbklEPjg5NjY2NzE8L0FubGllZ2Vu -SUQ+Cgk8bWFpbGJveGd1aWQ+Zjk3NzM2OGItNjk5MS00NmI5LWFmMTgtOGEyYTAzZDlhZDFiPC9t -YWlsYm94Z3VpZD4KCTxhbnRyYWdzdGVsbGVyPgoJCTxwZXJzX2FucmVkZT5IZXJyJDAzPC9wZXJz -X2FucmVkZT4KCQk8cGVyc19uYWNobmFtZT5UZXN0ZXJtYW5uPC9wZXJzX25hY2huYW1lPgoJCTxw -ZXJzX3Zvcm5hbWU+TWF4PC9wZXJzX3Zvcm5hbWU+CgkJPHBlcnNfZ2VidXJ0c25hbWU+TWF4IFRl -c3Rlcm1hbm48L3BlcnNfZ2VidXJ0c25hbWU+CgkJPHBlcnNfZ2VidXJ0c2RhdHVtPjE5OTUtMDMt -MjE8L3BlcnNfZ2VidXJ0c2RhdHVtPgoJCTxwZXJzX2dlYnVydHNvcnQ+RmxlbnNidXJnPC9wZXJz -X2dlYnVydHNvcnQ+CgkJPHBlcnNfZ2VidXJ0c2xhbmQ+ZGV1dHNjaCREZXV0c2NobGFuZCQwMDA8 -L3BlcnNfZ2VidXJ0c2xhbmQ+CgkJPHBlcnNfc3RhYXRzYW5nZWhvZXJpZ2tlaXQ+ZGV1dHNjaCRE -ZXV0c2NobGFuZCQwMDA8L3BlcnNfc3RhYXRzYW5nZWhvZXJpZ2tlaXQ+CgkJPGJfYW5yZWRlPkhl -cnI8L2JfYW5yZWRlPgoJCTxiX2FucmVkZV9zY2hsdWVzc2VsbnI+MDM8L2JfYW5yZWRlX3NjaGx1 -ZXNzZWxucj4KCQk8Yl9nZWJ1cnRzbGFuZD5EZXV0c2NobGFuZDwvYl9nZWJ1cnRzbGFuZD4KCQk8 -Yl9nZWJ1cnRzbGFuZF9zaWduYXR1cj4wMDA8L2JfZ2VidXJ0c2xhbmRfc2lnbmF0dXI+CgkJPGJf -c3RhYXRzYW5nZWhvZXJpZ2tlaXQ+ZGV1dHNjaDwvYl9zdGFhdHNhbmdlaG9lcmlna2VpdD4KCQk8 -Yl9zdGFhdHNhbmdlaG9lcmlna2VpdF9zaWduYXR1cj4wMDA8L2Jfc3RhYXRzYW5nZWhvZXJpZ2tl -aXRfc2lnbmF0dXI+CgkJPHNoX3N0cmFzc2U+S8O2bmlnc3dlZzwvc2hfc3RyYXNzZT4KCQk8c2hf -aGF1c251bW1lcj43NDwvc2hfaGF1c251bW1lcj4KCQk8c2hfcGx6PjI0ODM3PC9zaF9wbHo+CgkJ -PG9ydF9hdXN3YWhsPjkwMDczMTQkMDEwNTkwNzU8L29ydF9hdXN3YWhsPgoJCTxvcnQ+U2NobGVz -d2lnPC9vcnQ+CgkJPEdlYmlldElEPjkwMDczMTQ8L0dlYmlldElEPgoJCTxHZWJpZXRCRVpFSUNI -TlVORz5TY2hsZXN3aWc8L0dlYmlldEJFWkVJQ0hOVU5HPgoJCTxHZWJpZXRHTlI5NF9HTlI+MDEw -NTkwNzU8L0dlYmlldEdOUjk0X0dOUj4KCQk8c3RhYXQ+MDAwPC9zdGFhdD4KCQk8aXNvMzE2Nm51 -bWVyaXNjaD4yNzY8L2lzbzMxNjZudW1lcmlzY2g+CgkJPGtvbnRfdGVsZWZvbm51bW1lcj4rIDQ5 -IDQ2MjEgOTY1NDwva29udF90ZWxlZm9ubnVtbWVyPgoJCTxrb250X21vYmlsbnVtbWVyPis0OSAx -MjM8L2tvbnRfbW9iaWxudW1tZXI+CgkJPGtvbnRfdGVsZWZheG51bW1lcj4rIDQ5IDQ2MjEgOTY1 -NDwva29udF90ZWxlZmF4bnVtbWVyPgoJCTxrb250X2VtYWlsPm1heC50ZXN0ZXJtYW5uQGdteC5k -ZTwva29udF9lbWFpbD4KCQk8a29udF9kZW1haWw+bWF4LnRlc3Rlcm1hbm5AZ214LmRlLW1haWwu -ZGU8L2tvbnRfZGVtYWlsPgoJCTxwZXJzb2VubGljaGVFaWdudW5nPgoJCQk8bWFlbmdlbHZvcmhh -bmRlbj5mYWxzZTwvbWFlbmdlbHZvcmhhbmRlbj4KCQkJPGVybWl0dGx1bmdzdmVyZmFocmVuPmZh -bHNlPC9lcm1pdHRsdW5nc3ZlcmZhaHJlbj4KCQkJPE1pdGdsaWVkc2NoYWZ0SW5WZXJib3Rlcm5l -clZlcmVpbmlndW5nPmZhbHNlPC9NaXRnbGllZHNjaGFmdEluVmVyYm90ZXJuZXJWZXJlaW5pZ3Vu -Zz4KCQk8L3BlcnNvZW5saWNoZUVpZ251bmc+Cgk8L2FudHJhZ3N0ZWxsZXI+Cgk8R2ViaWV0SUQ+ -OTAwNzMxNDwvR2ViaWV0SUQ+Cgk8enVzdGFlbmRpZ2VzdGVsbGU+CgkJPE9yZ2FuaXNhdGlvbnNl -aW5oZWl0ZW5BdXN3YWhsPjk1MzU2Njk8L09yZ2FuaXNhdGlvbnNlaW5oZWl0ZW5BdXN3YWhsPgoJ -CTxPcmdhbmlzYXRpb25zZWluaGVpdGVuSUQ+OTUzNTY2OTwvT3JnYW5pc2F0aW9uc2VpbmhlaXRl -bklEPgoJCTxPcmdhbmlzYXRpb25zZWluaGVpdGVuQkVaRUlDSE5VTkc+S3JlaXMKCQkJU2NobGVz -d2lnLUZsZW5zYnVyZy9LcmVpc3ZlcndhbHR1bmcgLSBBbGxnZW1laW5lCgkJCU9yZG51bmdzYW5n -ZWxlZ2VuaGVpdGVuPC9PcmdhbmlzYXRpb25zZWluaGVpdGVuQkVaRUlDSE5VTkc+CgkJPHN0cmFz -c2U+RmxlbnNidXJnZXIgU3RyYcOfZTwvc3RyYXNzZT4KCQk8aGF1c251bW1lcj43PC9oYXVzbnVt -bWVyPgoJCTxwb3N0bGVpdHphaGw+MjQ4Mzc8L3Bvc3RsZWl0emFobD4KCQk8b3J0SUQ+OTAwNzMx -NDwvb3J0SUQ+CgkJPG9ydD5TY2hsZXN3aWc8L29ydD4KCQk8dGVsZWZvbm51bW1lcj4wNDYyMSA4 -Ny0wPC90ZWxlZm9ubnVtbWVyPgoJCTx0ZWxlZmF4bnVtbWVyPjA0NjIxIDg3LTM2NjwvdGVsZWZh -eG51bW1lcj4KCQk8ZW1haWxhZHJlc3NlPkdlZmFocmVuYWJ3ZWhyQEtpZWwuZGU8L2VtYWlsYWRy -ZXNzZT4KCQk8ZGVtYWlsYWRyZXNzZSAvPgoJCTxrb250YWt0c3lzdGVtX2tlbm51bmc+YWZtc2g6 -OTUzNTY2OV9rbGVpbmVyV2FmZmVuc2NoZWluPC9rb250YWt0c3lzdGVtX2tlbm51bmc+CgkJPGtv -bnRha3RzeXN0ZW1fa2VubnVuZ3p1c2F0eiAvPgoJCTxBbmxpZWdlbkJFWkVJQ0hOVU5HPldhZmZl -bnNjaGVpbiAvIEtsZWluZXIgV2FmZmVuc2NoZWluPC9BbmxpZWdlbkJFWkVJQ0hOVU5HPgoJCTxs -ZWlrYUtFWUxJU1Q+OTkwODkwMDgwMDAwMDA7OTkwODkwMDgwMDEwMDA8L2xlaWthS0VZTElTVD4K -CQk8YXVzd2FobF96dXN0ZWxsdW5nPmFiaG9sZW48L2F1c3dhaGxfenVzdGVsbHVuZz4KCQk8Yl96 -dXN0ZWxsdW5nPkljaCBob2xlIGRlbiBLbGVpbmVuIFdhZmZlbnNjaGVpbiBzZWxic3QgYWIuPC9i -X3p1c3RlbGx1bmc+Cgk8L3p1c3RhZW5kaWdlc3RlbGxlPgoJPGVtcGZhbmdlbmRlc3RlbGxlPgoJ -CTxPcmdhbmlzYXRpb25zZWluaGVpdGVuQXVzd2FobD45MDY4ODczPC9PcmdhbmlzYXRpb25zZWlu -aGVpdGVuQXVzd2FobD4KCQk8T3JnYW5pc2F0aW9uc2VpbmhlaXRlbklEPjkwNjg4NzM8L09yZ2Fu -aXNhdGlvbnNlaW5oZWl0ZW5JRD4KCQk8T3JnYW5pc2F0aW9uc2VpbmhlaXRlbkJFWkVJQ0hOVU5H -PkVpbmhlaXRsaWNoZXIgQW5zcHJlY2hwYXJ0bmVyCgkJCVNjaGxlc3dpZy1Ib2xzdGVpbjwvT3Jn -YW5pc2F0aW9uc2VpbmhlaXRlbkJFWkVJQ0hOVU5HPgoJCTxzdHJhc3NlPlJldmVudGxvdWFsbGVl -PC9zdHJhc3NlPgoJCTxoYXVzbnVtbWVyPjY8L2hhdXNudW1tZXI+CgkJPHBvc3RsZWl0emFobD4y -NDEwNTwvcG9zdGxlaXR6YWhsPgoJCTxvcnRJRD45MDA2NDAyPC9vcnRJRD4KCQk8b3J0PktpZWw8 -L29ydD4KCQk8dGVsZWZvbm51bW1lcj4rNDkgNDMxIDk4OC04NjUwPC90ZWxlZm9ubnVtbWVyPgoJ -CTx0ZWxlZmF4bnVtbWVyPis0OSA0MzEgOTg4LTYxNjExMTE8L3RlbGVmYXhudW1tZXI+CgkJPGVt -YWlsYWRyZXNzZT5pbmZvQGVhLXNoLmRlPC9lbWFpbGFkcmVzc2U+CgkJPGRlbWFpbGFkcmVzc2U+ -ZWEtcG9zdHN0ZWxsZUBlYS1zaC5kZS1tYWlsLmRlPC9kZW1haWxhZHJlc3NlPgoJCTxrb250YWt0 -c3lzdGVtX2tlbm51bmc+YWZtc2g6OTA2ODg3M19BdXNuYWhtZUxLV0ZhaHJ2ZXJib3Q8L2tvbnRh -a3RzeXN0ZW1fa2VubnVuZz4KCQk8a29udGFrdHN5c3RlbV9rZW5udW5nenVzYXR6PmFsbGU8L2tv -bnRha3RzeXN0ZW1fa2VubnVuZ3p1c2F0ej4KCTwvZW1wZmFuZ2VuZGVzdGVsbGU+Cgk8ZXJrbGFl -cnVuZ2VuPgoJCTxjaGVja19nZWJ1ZWhyZW4+dHJ1ZTwvY2hlY2tfZ2VidWVocmVuPgoJCTxjaGVj -a19yaWNodGlna2VpdD50cnVlPC9jaGVja19yaWNodGlna2VpdD4KCQk8Y2hlY2tfZGF0ZW5zY2h1 -dHo+dHJ1ZTwvY2hlY2tfZGF0ZW5zY2h1dHo+CgkJPGNoZWNrX21pc3NicmF1Y2g+dHJ1ZTwvY2hl -Y2tfbWlzc2JyYXVjaD4KCQk8Yl9nZWJ1ZWhyZW5fYmVzY2hyaWZ0dW5nPiogTWlyIGlzdCBiZWth -bm50LCBkYXNzIGR1cmNoIGRhcyBFaW5yZWljaGVuCgkJCWRlcyBlbGVrdHJvbmlzY2hlbiBBbnRy -YWdlcyB2b24gZGVyIHp1c3TDpG5kaWdlbiBTdGVsbGUgR2Viw7xocmVuCgkJCWVyaG9iZW4gd2Vy -ZGVuIGvDtm5uZW4uPC9iX2dlYnVlaHJlbl9iZXNjaHJpZnR1bmc+CgkJPGJfZ2VidWVocmVuX2lu -dHJvPkdlYsO8aHIgYmVpIEF1c3N0ZWxsdW5nIGRlcyBrbGVpbmVuIFdhZmZlbnNjaGVpbnM6CgkJ -CTYwLDAwIEV1cm8uIEJlYXJiZWl0dW5nc2dlYsO8aHIgYmVpIFZlcnNhZ3VuZzogNDUsMDAgRXVy -by4KCQkJU2llIHNpbmQgZ2Vtw6TDnyDCpyAzOSBXYWZmRyB2ZXJwZmxpY2h0ZXQsIGRlciB6dXN0 -w6RuZGlnZW4gQmVow7ZyZGUgZGllIHp1cgoJCQlEdXJjaGbDvGhydW5nIGRlcyBHZXNldHplcyBl -cmZvcmRlcmxpY2hlbiBBdXNrw7xuZnRlIHp1IGVydGVpbGVuLiBadXIKCQkJUHLDvGZ1bmcgSWhy -ZXIgd2FmZmVucmVjaHRsaWNoZW4gWnV2ZXJsw6Rzc2lna2VpdCB1bmQgRWlnbnVuZyBob2x0IGRp -ZQoJCQlCZWjDtnJkZSBlaW5lIHVuYmVzY2hyw6Rua3RlIEF1c2t1bmZ0IGF1cyBkZW0gQnVuZGVz -emVudHJhbHJlZ2lzdGVyLAoJCQllaW5lIEF1c2t1bmZ0IGF1cyBkZW0gemVudHJhbGVuIHN0YWF0 -c2Fud2FsdHNjaGFmdGxpY2hlbgoJCQlWZXJmYWhyZW5zcmVnaXN0ZXIsIGVpbmUgU3RlbGx1bmdu -YWhtZSBkZXIgw7ZydGxpY2hlbgoJCQlQb2xpemVpZGllbnN0c3RlbGxlIHVuZCBJaHJlciBXb2hu -c2l0emdlbWVpbmRlIGVpbi48L2JfZ2VidWVocmVuX2ludHJvPgoJCTxiX3JpY2h0aWdrZWl0Piog -SWNoIGJlc3TDpHRpZ2UgZGllIFJpY2h0aWdrZWl0IG1laW5lciBBbmdhYmVuLjwvYl9yaWNodGln -a2VpdD4KCQk8Yl9kYXRlbnNjaHV0ej4qIEljaCBlcmtsw6RyZSBtaWNoIGRhbWl0IGVpbnZlcnN0 -YW5kZW4sIGRhc3MgZGVyCgkJCUVpbmhlaXRsaWNoZXIgQW5zcHJlY2hwYXJ0bmVyIFNjaGxlc3dp -Zy1Ib2xzdGVpbiB6dXIgRXJmw7xsbHVuZyBzZWluZXIKCQkJQXVmZ2FiZW4gbWVpbmUgRGF0ZW4g -dW50ZXIgRWluaGFsdHVuZyBkZXIgQmVzdGltbXVuZ2VuIGRlcgoJCQlEYXRlbnNjaHV0ei1HcnVu -ZHZlcm9yZG51bmcgKERTLUdWTykgdW5kIGRlcwoJCQlMYW5kZXNkYXRlbnNjaHV0emdlc2V0emVz -IFNjaGxlc3dpZy1Ib2xzdGVpbiAoTERTRy1TSCkgc3BlaWNoZXJ0LAoJCQl2ZXJhcmJlaXRldCB1 -bmQgZGllc2UgaW0gUmFobWVuIGRlciBnZXNldHpsaWNoZW4gQmVzdGltbXVuZ2VuIGFuIGRpZQoJ -CQlmw7xyIGRpZSBFbnRzY2hlaWR1bmcgenVzdMOkbmRpZ2UgU3RlbGxlIHdlaXRlcmxlaXRldC4g -RWJlbnNvIGJpbiBpY2gKCQkJbWl0IGRlciByZWNodHNrb25mb3JtZW4gRGF0ZW52ZXJhcmJlaXR1 -bmcgdW5kIFNwZWljaGVydW5nIGR1cmNoIGRpZQoJCQl6dXN0w6RuZGlnZSBTdGVsbGUgZWludmVy -c3RhbmRlbi4gTWlyIGlzdCBiZWthbm50LCBkYXNzIGljaCBkaWUKCQkJRWlud2lsbGlndW5nIGlu -IGRpZSBWZXJhcmJlaXR1bmcgdW5kIMOcYmVybWl0dGx1bmcgamVkZXJ6ZWl0IGdlZ2Vuw7xiZXIK -CQkJZGVtIEVpbmhlaXRsaWNoZXIgQW5zcHJlY2hwYXJ0bmVyIFNjaGxlc3dpZy1Ib2xzdGVpbiwg -UmV2ZW50bG91YWxsZWUKCQkJNiwgMjQxMDUgS2llbCB3aWRlcnJ1ZmVuIGthbm4uIEVpbiBXaWRl -cnJ1ZiBpc3QgYWJlciBudXIgd2lya3NhbSBmw7xyCgkJCWRpZSBadWt1bmZ0LiBWZXJhcmJlaXR1 -bmdlbiwgZGllIHZvciBkZW0gV2lkZXJydWYgZXJmb2xndCBzaW5kLCBzaW5kCgkJCWRhdm9uIG5p -Y2h0IGJldHJvZmZlbi4gw5xiZXIgZGllIFZlcmFyYmVpdHVuZyBtZWluZXIgcGVyc29uZW5iZXpv -Z2VuZW4KCQkJRGF0ZW4gdW5kIGRpZSBtaXIgbmFjaCBkZW4gZGF0ZW5zY2h1dHpyZWNodGxpY2hl -biBSZWdlbHVuZ2VuCgkJCXp1c3RlaGVuZGVuIEFuc3Byw7xjaGUgdW5kIFJlY2h0ZSBoYWJlIGlj -aCB1bnRlciBEYXRlbnNjaHV0emVya2zDpHJ1bmcKCQkJS2VubnRuaXMgZXJsYW5ndC48L2JfZGF0 -ZW5zY2h1dHo+CgkJPGJfbWlzc2JyYXVjaD4qIE1pciBpc3QgYmVrYW5udCwgZGFzcyB6dXIgVmVy -Zm9sZ3VuZyB3aWRlcnJlY2h0bGljaGVyCgkJCU51dHp1bmcgZGllIERhdGVuIG1laW5lcyB6dXIg -RGF0ZW5laW5nYWJlIGdlbnV0enRlbiBFbmRnZXLDpHRlcwoJCQlhdWZnZXplaWNobmV0IHVuZCB2 -ZXJ3ZW5kZXQgd2VyZGVuIGvDtm5uZW4uPC9iX21pc3NicmF1Y2g+CgkJPHBvbGljeXVybD5odHRw -Oi8vd2FmbXhwYTAwMi5kcGFvci5kZS9zaC9kYXRlbnNjaHV0ei9kYXRlbnNjaHV0emVya2xhZXJ1 -bmdFQV9kZS5kb2M8L3BvbGljeXVybD4KCTwvZXJrbGFlcnVuZ2VuPgoJPGxvZ291cmw+aHR0cDov -L3dhZm14cGEwMDIuZHBhb3IuZGUvc2gvbG9nb3Mva29wZl85MDY4ODczLmRvYzwvbG9nb3VybD4K -CTxmbT4KCQk8YW5zcHJlY2hwYXJ0bmVyPgoJCQk8ZmlybWVubmFtZSAvPgoJCQk8YW5yZWRlPkhl -cnI8L2FucmVkZT4KCQkJPHZvcm5hbWU+TWF4PC92b3JuYW1lPgoJCQk8ZmFtaWxpZW5uYW1lPlRl -c3Rlcm1hbm48L2ZhbWlsaWVubmFtZT4KCQkJPGFuc2NocmlmdD4KCQkJCTxzdHJhc3NlPkvDtm5p -Z3N3ZWc8L3N0cmFzc2U+CgkJCQk8aGF1c251bW1lcj43NDwvaGF1c251bW1lcj4KCQkJCTxwb3N0 -ZmFjaCAvPgoJCQkJPHBvc3RsZWl0emFobD4yNDgzNzwvcG9zdGxlaXR6YWhsPgoJCQkJPG9ydD5T -Y2hsZXN3aWc8L29ydD4KCQkJCTxvcnRzdGVpbCAvPgoJCQkJPHp1c2F0eiAvPgoJCQkJPHN0YWF0 -PkRldXRzY2hsYW5kPC9zdGFhdD4KCQkJPC9hbnNjaHJpZnQ+CgkJCTxrb250YWt0PgoJCQkJPHRl -bGVmb25udW1tZXI+KyA0OSA0NjIxIDk2NTQ8L3RlbGVmb25udW1tZXI+CgkJCQk8bW9iaWxudW1t -ZXI+KzQ5IDEyMzwvbW9iaWxudW1tZXI+CgkJCQk8dGVsZWZheG51bW1lcj4rIDQ5IDQ2MjEgOTY1 -NDwvdGVsZWZheG51bW1lcj4KCQkJCTxlbWFpbGFkcmVzc2U+bWF4LnRlc3Rlcm1hbm5AZ214LmRl -PC9lbWFpbGFkcmVzc2U+CgkJCQk8ZGVtYWlsYWRyZXNzZT5tYXgudGVzdGVybWFubkBnbXguZGUt -bWFpbC5kZTwvZGVtYWlsYWRyZXNzZT4KCQkJPC9rb250YWt0PgoJCTwvYW5zcHJlY2hwYXJ0bmVy -PgoJCTx2ZXJ3YWx0dW5nc2xlaXN0dW5nZW4+CgkJCTx2ZXJ3YWx0dW5nc2xlaXN0dW5nPgoJCQkJ -PGF1c2dld2FlaGx0ZV96dXN0YWVuZGlnZXN0ZWxsZT4KCQkJCQk8T3JnYW5pc2F0aW9uc2Vpbmhl -aXRlbklEPjk1MzU2Njk8L09yZ2FuaXNhdGlvbnNlaW5oZWl0ZW5JRD4KCQkJCQk8T3JnYW5pc2F0 -aW9uc2VpbmhlaXRlbkJFWkVJQ0hOVU5HPktyZWlzCgkJCQkJCVNjaGxlc3dpZy1GbGVuc2J1cmcv -S3JlaXN2ZXJ3YWx0dW5nIC0gQWxsZ2VtZWluZQoJCQkJCQlPcmRudW5nc2FuZ2VsZWdlbmhlaXRl -bjwvT3JnYW5pc2F0aW9uc2VpbmhlaXRlbkJFWkVJQ0hOVU5HPgoJCQkJPC9hdXNnZXdhZWhsdGVf -enVzdGFlbmRpZ2VzdGVsbGU+CgkJCQk8R2ViaWV0SUQ+OTAwNzMxNDwvR2ViaWV0SUQ+CgkJCQk8 -R2ViaWV0QkVaRUlDSE5VTkc+U2NobGVzd2lnPC9HZWJpZXRCRVpFSUNITlVORz4KCQkJCTxBbmxp -ZWdlbklEPjg5NjY2NzE8L0FubGllZ2VuSUQ+CgkJCQk8QW5saWVnZW5CRVpFSUNITlVORz5XYWZm -ZW5zY2hlaW4gLyBLbGVpbmVyIFdhZmZlbnNjaGVpbjwvQW5saWVnZW5CRVpFSUNITlVORz4KCQkJ -CTxsZWlrYUtFWUxJU1Q+OTkwODkwMDgwMDAwMDA7OTkwODkwMDgwMDEwMDA8L2xlaWthS0VZTElT -VD4KCQkJCTxsZWlrYUJFWkVJQ0hOVU5HIC8+CgkJCTwvdmVyd2FsdHVuZ3NsZWlzdHVuZz4KCQk8 -L3ZlcndhbHR1bmdzbGVpc3R1bmdlbj4KCTwvZm0+CjwvbXlGb3JtPg==</content> - <contentType>text/xml</contentType> - <id>myForm-xml</id> - <name>XML-Daten.xml</name> - </attachments> - <attachments> - <attributes> - <key>X-IntelliForm-Signed</key> - <value>false</value> - </attributes> - <content>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</content> - <contentType>image/jpeg</contentType> - <id>assistants.E0FBA361C191F8B723949467AE302BEA24E4745E</id> - <name>Helge1.jpg</name> - </attachments> - <attachments> - <attributes> - <key>X-IntelliForm-Signed</key> - <value>false</value> - </attributes> - <content>UEsDBBQAAAgAACxEj1JexjIMJwAAACcAAAAIAAAAbWltZXR5cGVhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnRleHRQSwMEFAAACAAALESPUgYCUOZqAQAAagEAABgAAABUaHVtYm5haWxzL3RodW1ibmFpbC5wbmeJUE5HDQoaCgAAAA1JSERSAAAAtQAAAQAIAwAAAML9x+kAAAA8UExURYyQkJCTlZ6fo6qknrm2tri6vMW2qsrGv8rQ1d/Uytvm79vq9ezn5O/0+fDq5fT3+vj39////wAAAP///81aQL0AAADpSURBVHja7dK5DYAwEADB4zU2j6H/ZskpAOmk2Qom2HgyFtTU1NTU1NTU1NTU1J+us99Hz6ZexyGmPZu6LluZm6+pqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqan/6AXwWwUaPv4WoAAAAABJRU5ErkJgglBLAwQUAAgICAAsRI9SAAAAAAAAAAAAAAAACwAAAGNvbnRlbnQueG1spVddb9s2FH3vrxA0YG8M7bgDEi12H1oU2JoURZ0Be2UoSiYmiRpJWfa/3yVp0ZRjOVz8Ilu851zeb1IPn3Z1lWyZVFw0y3R+M0sT1lCR86Zcpn89f0V36afVhwdRFJyyLBe0q1mjERWNht8E2I3KnHSZdrLJBFFcZQ2pmco0zUTLmoGVhejM7uVWlN5X0XQLDtma7XQs2WBHXPISv7MFh+xckj6WbLAQ1JBeiFjyTlWoEBD1uiWan1ixq3jzzzLdaN1mGPd9f9MvboQs8fz+/h5bqTeYelzbycqicopZxcxmCs9v5njA1kyTWPsMNjSp6eoXJqNDQzR5lVW1LaMrYltOhIZuiIyuDQsep3eRx6d3kYfcmujNRE7u8BMI7ePp8VgLso7dy2BHoaKSt9FuOnTIF0J4Uw3BNag193Y2+4jde4DuL8J7yTWTAZxehFNSUR9xUZ8LGuDmGBCIbU2Z+sI3gVAThFvsxB6s8knV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</content> - <contentType>application/vnd.oasis.opendocument.text</contentType> - <id>assistants.52D79E5B2118D1740045AB87151535DCAD24E9A7</id> - <name>Helgetext2.odt</name> - </attachments> - <caller /> - <client>sh-dev</client> - <clientId>sh-dev</clientId> - <customer>Kiel</customer> - <customerId>Kiel</customerId> - <form>SimpleFormSendetAnHomeServer</form> - <formId>SimpleFormSendetAnHomeServer</formId> - <id>20210415307020414701</id> - <primaryDataAttachmentId>myForm-xml</primaryDataAttachmentId> - <sender>intelliform.by.kop-cloud.de</sender> - <timestamp>2021-04-15T08:33:39.443Z</timestamp> - <username /> - </data> - </ns2:deposit> - </soap:Body> -</soap:Envelope> \ No newline at end of file diff --git a/semantik-adapter/src/test/resources/intelliform/SimpleFormDataMapperTestFile.xml b/semantik-adapter/src/test/resources/intelliform/SimpleFormDataMapperTestFile.xml deleted file mode 100644 index 9a02da3fb9263d0c1f897eda15ee224e2d0b0762..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/test/resources/intelliform/SimpleFormDataMapperTestFile.xml +++ /dev/null @@ -1,60 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<myForm> - <simplenode>simplenodevalue</simplenode> - - <emptynode /> - - <nestedmapnode> - <nestedmapnode1>nestedmapnodevalue1</nestedmapnode1> - <nestedmapnode2>nestedmapnodevalue2</nestedmapnode2> - </nestedmapnode> - - <nestedlistnodewithstrings> - <nestednode>nestedlistnodevalue1</nestednode> - <nestednode>nestedlistnodevalue2</nestednode> - <nestednode>nestedlistnodevalue3</nestednode> - </nestedlistnodewithstrings> - - <nestedlistnodewithmap> - <nestednode> - <level2>nestedlistnodevalue1</level2> - </nestednode> - <nestednode> - <level2>nestedlistnodevalue1</level2> - <level2>nestedlistnodevalue2</level2> - <level2>nestedlistnodevalue3</level2> - </nestednode> - </nestedlistnodewithmap> - - <upload_anlagen> - <fs> - <fs-item> - <bez_flurstueck>12</bez_flurstueck> - </fs-item> - <fs-item> - <bez_flurstueck>14</bez_flurstueck> - </fs-item> - <fs-item> - <bez_flurstueck>4711</bez_flurstueck> - </fs-item> - </fs> - </upload_anlagen> - - <list_file_parent> - <list_file_parent-item> - <file content-type="image/jpeg" description="file description for first list file" id="assistants.21B483DAA2DC7900C1D1135E566D0F672CB42832" length="1184319">20210326_133516[1].jpg</file> - </list_file_parent-item> - <list_file_parent-item> - <file content-type="image/jpeg" description="file description for second list file" id="assistants.2F1FF737CF4F23191C1952091CB342254EE22A37" length="1384037">20210326_133526[1].jpg</file> - </list_file_parent-item> - </list_file_parent> - <single_file_parent> - <single_file_parent-item> - <file content-type="image/jpeg" description="file description for single file" id="assistants.B20451156C677116B91A4EF2D1E859837B6CE510" length="3066416">20210324_103054[1].jpg</file> - </single_file_parent-item> - </single_file_parent> - - <rest_response_name> - [{"strName":"strNameValue","objectName":[{"objectStrName":"objectStrNameValue","objectNumberName": 1 }]}] - </rest_response_name> -</myForm> \ No newline at end of file diff --git a/semantik-adapter/src/test/resources/intelliform/XML-Daten-1-SoapRequest.xml b/semantik-adapter/src/test/resources/intelliform/XML-Daten-1-SoapRequest.xml deleted file mode 100644 index ea9ad422542f33511886964cfb34d68c375a1c19..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/test/resources/intelliform/XML-Daten-1-SoapRequest.xml +++ /dev/null @@ -1,30 +0,0 @@ -<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> - <soap:Body> - <ns2:deposit xmlns:ns2="http://xmlns.cit.de/intelliform/2009/webservices/backend"> - <data> - <attachments> - <attributes> - <key>X-IntelliForm-Signed</key> - <value>false</value> - </attributes> - <content>PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPG15Rm9ybSB4bWxuczpwZGY9Imh0dHA6Ly94bWxucy5jaXQuZGUvYXNzaXN0YW50cy9wZGYiCgl4bWxuczp0PSJodHRwOi8veG1sbnMuY2l0LmRlL2ludGVsbGlmb3JtL3RyYW5zYWN0aW9uIgoJdDppZD0iMjAyMDExMTgzNjU2NzA4NjYxMDEiIHQ6dGltZXN0YW1wPSIyMDIwLTExLTE4VDA5OjA5OjI3LjYyN1oiCgl0OnNlbmRlcj0iYWZtLnNjaGxlc3dpZy1ob2xzdGVpbi5kZSIKCXQ6Zm9ybT0iS2xlaW5lciBXYWZmZW5zY2hlaW4gZ2VtLiDCpyAxMCBBYnMuIDQgU2F0eiA0IFdhZmZlbmdlc2V0eiAoV2FmZkcpIgoJdDpmb3JtLWlkPSJ3YWZmZW4va2xlaW5lcldhZmZlbnNjaGVpbiIKCXQ6Y3VzdG9tZXI9IkVpbmhlaXRsaWNoZXIgQW5zcHJlY2hwYXJ0bmVyIiB0OmN1c3RvbWVyLWlkPSJlYS1zaCIKCXQ6Y2xpZW50PSJTY2hsZXN3aWctSG9sc3RlaW4iIHQ6Y2xpZW50LWlkPSJsYW5kIj4KCTxrb250YWt0c3lzdGVtdHlwaWQ+MjMzMDM0NjAwPC9rb250YWt0c3lzdGVtdHlwaWQ+Cgk8a29udGFrdHN5c3RlbXR5cGlkbG4+MjMzMDM0NjAxPC9rb250YWt0c3lzdGVtdHlwaWRsbj4KCTxBbmxpZWdlbklEPjg5NjY2NzE8L0FubGllZ2VuSUQ+Cgk8bWFpbGJveGd1aWQ+Zjk3NzM2OGItNjk5MS00NmI5LWFmMTgtOGEyYTAzZDlhZDFiPC9tYWlsYm94Z3VpZD4KCTxuYW1laWQ+Y2JhY2IwMWEtMjgxMC0xMWVjLWJiNmYtYzMxOTM5Zjg4NzRlPC9uYW1laWQ+Cgk8YW50cmFnc3RlbGxlcj4KCQk8cGVyc19hbnJlZGU+SGVyciQwMzwvcGVyc19hbnJlZGU+CgkJPHBlcnNfbmFjaG5hbWU+VGVzdGVybWFubjwvcGVyc19uYWNobmFtZT4KCQk8cGVyc192b3JuYW1lPk1heDwvcGVyc192b3JuYW1lPgoJCTxwZXJzX2dlYnVydHNuYW1lPk1heCBUZXN0ZXJtYW5uPC9wZXJzX2dlYnVydHNuYW1lPgoJCTxwZXJzX2dlYnVydHNkYXR1bT4xOTk1LTAzLTIxPC9wZXJzX2dlYnVydHNkYXR1bT4KCQk8cGVyc19nZWJ1cnRzb3J0PkZsZW5zYnVyZzwvcGVyc19nZWJ1cnRzb3J0PgoJCTxwZXJzX2dlYnVydHNsYW5kPmRldXRzY2gkRGV1dHNjaGxhbmQkMDAwPC9wZXJzX2dlYnVydHNsYW5kPgoJCTxwZXJzX3N0YWF0c2FuZ2Vob2VyaWdrZWl0PmRldXRzY2gkRGV1dHNjaGxhbmQkMDAwPC9wZXJzX3N0YWF0c2FuZ2Vob2VyaWdrZWl0PgoJCTxiX2FucmVkZT5IZXJyPC9iX2FucmVkZT4KCQk8Yl9hbnJlZGVfc2NobHVlc3NlbG5yPjAzPC9iX2FucmVkZV9zY2hsdWVzc2VsbnI+CgkJPGJfZ2VidXJ0c2xhbmQ+RGV1dHNjaGxhbmQ8L2JfZ2VidXJ0c2xhbmQ+CgkJPGJfZ2VidXJ0c2xhbmRfc2lnbmF0dXI+MDAwPC9iX2dlYnVydHNsYW5kX3NpZ25hdHVyPgoJCTxiX3N0YWF0c2FuZ2Vob2VyaWdrZWl0PmRldXRzY2g8L2Jfc3RhYXRzYW5nZWhvZXJpZ2tlaXQ+CgkJPGJfc3RhYXRzYW5nZWhvZXJpZ2tlaXRfc2lnbmF0dXI+MDAwPC9iX3N0YWF0c2FuZ2Vob2VyaWdrZWl0X3NpZ25hdHVyPgoJCTxzaF9zdHJhc3NlPkvDtm5pZ3N3ZWc8L3NoX3N0cmFzc2U+CgkJPHNoX2hhdXNudW1tZXI+NzQ8L3NoX2hhdXNudW1tZXI+CgkJPHNoX3Bsej4yNDgzNzwvc2hfcGx6PgoJCTxvcnRfYXVzd2FobD45MDA3MzE0JDAxMDU5MDc1PC9vcnRfYXVzd2FobD4KCQk8b3J0PlNjaGxlc3dpZzwvb3J0PgoJCTxHZWJpZXRJRD45MDA3MzE0PC9HZWJpZXRJRD4KCQk8R2ViaWV0QkVaRUlDSE5VTkc+U2NobGVzd2lnPC9HZWJpZXRCRVpFSUNITlVORz4KCQk8R2ViaWV0R05SOTRfR05SPjAxMDU5MDc1PC9HZWJpZXRHTlI5NF9HTlI+CgkJPHN0YWF0PjAwMDwvc3RhYXQ+CgkJPGlzbzMxNjZudW1lcmlzY2g+Mjc2PC9pc28zMTY2bnVtZXJpc2NoPgoJCTxrb250X3RlbGVmb25udW1tZXI+KyA0OSA0NjIxIDk2NTQ8L2tvbnRfdGVsZWZvbm51bW1lcj4KCQk8a29udF9tb2JpbG51bW1lcj4rNDkgMTIzPC9rb250X21vYmlsbnVtbWVyPgoJCTxrb250X3RlbGVmYXhudW1tZXI+KyA0OSA0NjIxIDk2NTQ8L2tvbnRfdGVsZWZheG51bW1lcj4KCQk8a29udF9lbWFpbD5tYXgudGVzdGVybWFubkBnbXguZGU8L2tvbnRfZW1haWw+CgkJPGtvbnRfZGVtYWlsPm1heC50ZXN0ZXJtYW5uQGdteC5kZS1tYWlsLmRlPC9rb250X2RlbWFpbD4KCQk8cGVyc29lbmxpY2hlRWlnbnVuZz4KCQkJPG1hZW5nZWx2b3JoYW5kZW4+ZmFsc2U8L21hZW5nZWx2b3JoYW5kZW4+CgkJCTxlcm1pdHRsdW5nc3ZlcmZhaHJlbj5mYWxzZTwvZXJtaXR0bHVuZ3N2ZXJmYWhyZW4+CgkJCTxNaXRnbGllZHNjaGFmdEluVmVyYm90ZXJuZXJWZXJlaW5pZ3VuZz5mYWxzZTwvTWl0Z2xpZWRzY2hhZnRJblZlcmJvdGVybmVyVmVyZWluaWd1bmc+CgkJPC9wZXJzb2VubGljaGVFaWdudW5nPgoJPC9hbnRyYWdzdGVsbGVyPgoJPEdlYmlldElEPjkwMDczMTQ8L0dlYmlldElEPgoJPHp1c3RhZW5kaWdlc3RlbGxlPgoJCTxPcmdhbmlzYXRpb25zZWluaGVpdGVuQXVzd2FobD45NTM1NjY5PC9PcmdhbmlzYXRpb25zZWluaGVpdGVuQXVzd2FobD4KCQk8T3JnYW5pc2F0aW9uc2VpbmhlaXRlbklEPjk1MzU2Njk8L09yZ2FuaXNhdGlvbnNlaW5oZWl0ZW5JRD4KCQk8T3JnYW5pc2F0aW9uc2VpbmhlaXRlbkJFWkVJQ0hOVU5HPktyZWlzCgkJCVNjaGxlc3dpZy1GbGVuc2J1cmcvS3JlaXN2ZXJ3YWx0dW5nIC0gQWxsZ2VtZWluZQoJCQlPcmRudW5nc2FuZ2VsZWdlbmhlaXRlbjwvT3JnYW5pc2F0aW9uc2VpbmhlaXRlbkJFWkVJQ0hOVU5HPgoJCTxzdHJhc3NlPkZsZW5zYnVyZ2VyIFN0cmHDn2U8L3N0cmFzc2U+CgkJPGhhdXNudW1tZXI+NzwvaGF1c251bW1lcj4KCQk8cG9zdGxlaXR6YWhsPjI0ODM3PC9wb3N0bGVpdHphaGw+CgkJPG9ydElEPjkwMDczMTQ8L29ydElEPgoJCTxvcnQ+U2NobGVzd2lnPC9vcnQ+CgkJPHRlbGVmb25udW1tZXI+MDQ2MjEgODctMDwvdGVsZWZvbm51bW1lcj4KCQk8dGVsZWZheG51bW1lcj4wNDYyMSA4Ny0zNjY8L3RlbGVmYXhudW1tZXI+CgkJPGVtYWlsYWRyZXNzZT5HZWZhaHJlbmFid2VockBLaWVsLmRlPC9lbWFpbGFkcmVzc2U+CgkJPGRlbWFpbGFkcmVzc2UgLz4KCQk8a29udGFrdHN5c3RlbV9rZW5udW5nPmFmbXNoOjk1MzU2Njlfa2xlaW5lcldhZmZlbnNjaGVpbjwva29udGFrdHN5c3RlbV9rZW5udW5nPgoJCTxrb250YWt0c3lzdGVtX2tlbm51bmd6dXNhdHogLz4KCQk8QW5saWVnZW5CRVpFSUNITlVORz5XYWZmZW5zY2hlaW4gLyBLbGVpbmVyIFdhZmZlbnNjaGVpbjwvQW5saWVnZW5CRVpFSUNITlVORz4KCQk8bGVpa2FLRVlMSVNUPjk5MDg5MDA4MDAwMDAwOzk5MDg5MDA4MDAxMDAwPC9sZWlrYUtFWUxJU1Q+CgkJPGF1c3dhaGxfenVzdGVsbHVuZz5hYmhvbGVuPC9hdXN3YWhsX3p1c3RlbGx1bmc+CgkJPGJfenVzdGVsbHVuZz5JY2ggaG9sZSBkZW4gS2xlaW5lbiBXYWZmZW5zY2hlaW4gc2VsYnN0IGFiLjwvYl96dXN0ZWxsdW5nPgoJPC96dXN0YWVuZGlnZXN0ZWxsZT4KCTxlbXBmYW5nZW5kZXN0ZWxsZT4KCQk8T3JnYW5pc2F0aW9uc2VpbmhlaXRlbkF1c3dhaGw+OTA2ODg3MzwvT3JnYW5pc2F0aW9uc2VpbmhlaXRlbkF1c3dhaGw+CgkJPE9yZ2FuaXNhdGlvbnNlaW5oZWl0ZW5JRD45MDY4ODczPC9PcmdhbmlzYXRpb25zZWluaGVpdGVuSUQ+CgkJPE9yZ2FuaXNhdGlvbnNlaW5oZWl0ZW5CRVpFSUNITlVORz5FaW5oZWl0bGljaGVyIEFuc3ByZWNocGFydG5lcgoJCQlTY2hsZXN3aWctSG9sc3RlaW48L09yZ2FuaXNhdGlvbnNlaW5oZWl0ZW5CRVpFSUNITlVORz4KCQk8c3RyYXNzZT5SZXZlbnRsb3VhbGxlZTwvc3RyYXNzZT4KCQk8aGF1c251bW1lcj42PC9oYXVzbnVtbWVyPgoJCTxwb3N0bGVpdHphaGw+MjQxMDU8L3Bvc3RsZWl0emFobD4KCQk8b3J0SUQ+OTAwNjQwMjwvb3J0SUQ+CgkJPG9ydD5LaWVsPC9vcnQ+CgkJPHRlbGVmb25udW1tZXI+KzQ5IDQzMSA5ODgtODY1MDwvdGVsZWZvbm51bW1lcj4KCQk8dGVsZWZheG51bW1lcj4rNDkgNDMxIDk4OC02MTYxMTExPC90ZWxlZmF4bnVtbWVyPgoJCTxlbWFpbGFkcmVzc2U+aW5mb0BlYS1zaC5kZTwvZW1haWxhZHJlc3NlPgoJCTxkZW1haWxhZHJlc3NlPmVhLXBvc3RzdGVsbGVAZWEtc2guZGUtbWFpbC5kZTwvZGVtYWlsYWRyZXNzZT4KCQk8a29udGFrdHN5c3RlbV9rZW5udW5nPmFmbXNoOjkwNjg4NzNfQXVzbmFobWVMS1dGYWhydmVyYm90PC9rb250YWt0c3lzdGVtX2tlbm51bmc+CgkJPGtvbnRha3RzeXN0ZW1fa2VubnVuZ3p1c2F0ej5hbGxlPC9rb250YWt0c3lzdGVtX2tlbm51bmd6dXNhdHo+Cgk8L2VtcGZhbmdlbmRlc3RlbGxlPgoJPGVya2xhZXJ1bmdlbj4KCQk8Y2hlY2tfZ2VidWVocmVuPnRydWU8L2NoZWNrX2dlYnVlaHJlbj4KCQk8Y2hlY2tfcmljaHRpZ2tlaXQ+dHJ1ZTwvY2hlY2tfcmljaHRpZ2tlaXQ+CgkJPGNoZWNrX2RhdGVuc2NodXR6PnRydWU8L2NoZWNrX2RhdGVuc2NodXR6PgoJCTxjaGVja19taXNzYnJhdWNoPnRydWU8L2NoZWNrX21pc3NicmF1Y2g+CgkJPGJfZ2VidWVocmVuX2Jlc2NocmlmdHVuZz4qIE1pciBpc3QgYmVrYW5udCwgZGFzcyBkdXJjaCBkYXMgRWlucmVpY2hlbgoJCQlkZXMgZWxla3Ryb25pc2NoZW4gQW50cmFnZXMgdm9uIGRlciB6dXN0w6RuZGlnZW4gU3RlbGxlIEdlYsO8aHJlbgoJCQllcmhvYmVuIHdlcmRlbiBrw7ZubmVuLjwvYl9nZWJ1ZWhyZW5fYmVzY2hyaWZ0dW5nPgoJCTxiX2dlYnVlaHJlbl9pbnRybz5HZWLDvGhyIGJlaSBBdXNzdGVsbHVuZyBkZXMga2xlaW5lbiBXYWZmZW5zY2hlaW5zOgoJCQk2MCwwMCBFdXJvLiBCZWFyYmVpdHVuZ3NnZWLDvGhyIGJlaSBWZXJzYWd1bmc6IDQ1LDAwIEV1cm8uCgkJCVNpZSBzaW5kIGdlbcOkw58gwqcgMzkgV2FmZkcgdmVycGZsaWNodGV0LCBkZXIgenVzdMOkbmRpZ2VuIEJlaMO2cmRlIGRpZSB6dXIKCQkJRHVyY2hmw7xocnVuZyBkZXMgR2VzZXR6ZXMgZXJmb3JkZXJsaWNoZW4gQXVza8O8bmZ0ZSB6dSBlcnRlaWxlbi4gWnVyCgkJCVByw7xmdW5nIElocmVyIHdhZmZlbnJlY2h0bGljaGVuIFp1dmVybMOkc3NpZ2tlaXQgdW5kIEVpZ251bmcgaG9sdCBkaWUKCQkJQmVow7ZyZGUgZWluZSB1bmJlc2NocsOkbmt0ZSBBdXNrdW5mdCBhdXMgZGVtIEJ1bmRlc3plbnRyYWxyZWdpc3RlciwKCQkJZWluZSBBdXNrdW5mdCBhdXMgZGVtIHplbnRyYWxlbiBzdGFhdHNhbndhbHRzY2hhZnRsaWNoZW4KCQkJVmVyZmFocmVuc3JlZ2lzdGVyLCBlaW5lIFN0ZWxsdW5nbmFobWUgZGVyIMO2cnRsaWNoZW4KCQkJUG9saXplaWRpZW5zdHN0ZWxsZSB1bmQgSWhyZXIgV29obnNpdHpnZW1laW5kZSBlaW4uPC9iX2dlYnVlaHJlbl9pbnRybz4KCQk8Yl9yaWNodGlna2VpdD4qIEljaCBiZXN0w6R0aWdlIGRpZSBSaWNodGlna2VpdCBtZWluZXIgQW5nYWJlbi48L2JfcmljaHRpZ2tlaXQ+CgkJPGJfZGF0ZW5zY2h1dHo+KiBJY2ggZXJrbMOkcmUgbWljaCBkYW1pdCBlaW52ZXJzdGFuZGVuLCBkYXNzIGRlcgoJCQlFaW5oZWl0bGljaGVyIEFuc3ByZWNocGFydG5lciBTY2hsZXN3aWctSG9sc3RlaW4genVyIEVyZsO8bGx1bmcgc2VpbmVyCgkJCUF1ZmdhYmVuIG1laW5lIERhdGVuIHVudGVyIEVpbmhhbHR1bmcgZGVyIEJlc3RpbW11bmdlbiBkZXIKCQkJRGF0ZW5zY2h1dHotR3J1bmR2ZXJvcmRudW5nIChEUy1HVk8pIHVuZCBkZXMKCQkJTGFuZGVzZGF0ZW5zY2h1dHpnZXNldHplcyBTY2hsZXN3aWctSG9sc3RlaW4gKExEU0ctU0gpIHNwZWljaGVydCwKCQkJdmVyYXJiZWl0ZXQgdW5kIGRpZXNlIGltIFJhaG1lbiBkZXIgZ2VzZXR6bGljaGVuIEJlc3RpbW11bmdlbiBhbiBkaWUKCQkJZsO8ciBkaWUgRW50c2NoZWlkdW5nIHp1c3TDpG5kaWdlIFN0ZWxsZSB3ZWl0ZXJsZWl0ZXQuIEViZW5zbyBiaW4gaWNoCgkJCW1pdCBkZXIgcmVjaHRza29uZm9ybWVuIERhdGVudmVyYXJiZWl0dW5nIHVuZCBTcGVpY2hlcnVuZyBkdXJjaCBkaWUKCQkJenVzdMOkbmRpZ2UgU3RlbGxlIGVpbnZlcnN0YW5kZW4uIE1pciBpc3QgYmVrYW5udCwgZGFzcyBpY2ggZGllCgkJCUVpbndpbGxpZ3VuZyBpbiBkaWUgVmVyYXJiZWl0dW5nIHVuZCDDnGJlcm1pdHRsdW5nIGplZGVyemVpdCBnZWdlbsO8YmVyCgkJCWRlbSBFaW5oZWl0bGljaGVyIEFuc3ByZWNocGFydG5lciBTY2hsZXN3aWctSG9sc3RlaW4sIFJldmVudGxvdWFsbGVlCgkJCTYsIDI0MTA1IEtpZWwgd2lkZXJydWZlbiBrYW5uLiBFaW4gV2lkZXJydWYgaXN0IGFiZXIgbnVyIHdpcmtzYW0gZsO8cgoJCQlkaWUgWnVrdW5mdC4gVmVyYXJiZWl0dW5nZW4sIGRpZSB2b3IgZGVtIFdpZGVycnVmIGVyZm9sZ3Qgc2luZCwgc2luZAoJCQlkYXZvbiBuaWNodCBiZXRyb2ZmZW4uIMOcYmVyIGRpZSBWZXJhcmJlaXR1bmcgbWVpbmVyIHBlcnNvbmVuYmV6b2dlbmVuCgkJCURhdGVuIHVuZCBkaWUgbWlyIG5hY2ggZGVuIGRhdGVuc2NodXR6cmVjaHRsaWNoZW4gUmVnZWx1bmdlbgoJCQl6dXN0ZWhlbmRlbiBBbnNwcsO8Y2hlIHVuZCBSZWNodGUgaGFiZSBpY2ggdW50ZXIgRGF0ZW5zY2h1dHplcmtsw6RydW5nCgkJCUtlbm50bmlzIGVybGFuZ3QuPC9iX2RhdGVuc2NodXR6PgoJCTxiX21pc3NicmF1Y2g+KiBNaXIgaXN0IGJla2FubnQsIGRhc3MgenVyIFZlcmZvbGd1bmcgd2lkZXJyZWNodGxpY2hlcgoJCQlOdXR6dW5nIGRpZSBEYXRlbiBtZWluZXMgenVyIERhdGVuZWluZ2FiZSBnZW51dHp0ZW4gRW5kZ2Vyw6R0ZXMKCQkJYXVmZ2V6ZWljaG5ldCB1bmQgdmVyd2VuZGV0IHdlcmRlbiBrw7ZubmVuLjwvYl9taXNzYnJhdWNoPgoJCTxwb2xpY3l1cmw+aHR0cDovL3dhZm14cGEwMDIuZHBhb3IuZGUvc2gvZGF0ZW5zY2h1dHovZGF0ZW5zY2h1dHplcmtsYWVydW5nRUFfZGUuZG9jPC9wb2xpY3l1cmw+Cgk8L2Vya2xhZXJ1bmdlbj4KCTxsb2dvdXJsPmh0dHA6Ly93YWZteHBhMDAyLmRwYW9yLmRlL3NoL2xvZ29zL2tvcGZfOTA2ODg3My5kb2M8L2xvZ291cmw+Cgk8Zm0+CgkJPGFuc3ByZWNocGFydG5lcj4KCQkJPGZpcm1lbm5hbWUgLz4KCQkJPGFucmVkZT5IZXJyPC9hbnJlZGU+CgkJCTx2b3JuYW1lPk1heDwvdm9ybmFtZT4KCQkJPGZhbWlsaWVubmFtZT5UZXN0ZXJtYW5uPC9mYW1pbGllbm5hbWU+CgkJCTxhbnNjaHJpZnQ+CgkJCQk8c3RyYXNzZT5Lw7ZuaWdzd2VnPC9zdHJhc3NlPgoJCQkJPGhhdXNudW1tZXI+NzQ8L2hhdXNudW1tZXI+CgkJCQk8cG9zdGZhY2ggLz4KCQkJCTxwb3N0bGVpdHphaGw+MjQ4Mzc8L3Bvc3RsZWl0emFobD4KCQkJCTxvcnQ+U2NobGVzd2lnPC9vcnQ+CgkJCQk8b3J0c3RlaWwgLz4KCQkJCTx6dXNhdHogLz4KCQkJCTxzdGFhdD5EZXV0c2NobGFuZDwvc3RhYXQ+CgkJCTwvYW5zY2hyaWZ0PgoJCQk8a29udGFrdD4KCQkJCTx0ZWxlZm9ubnVtbWVyPisgNDkgNDYyMSA5NjU0PC90ZWxlZm9ubnVtbWVyPgoJCQkJPG1vYmlsbnVtbWVyPis0OSAxMjM8L21vYmlsbnVtbWVyPgoJCQkJPHRlbGVmYXhudW1tZXI+KyA0OSA0NjIxIDk2NTQ8L3RlbGVmYXhudW1tZXI+CgkJCQk8ZW1haWxhZHJlc3NlPm1heC50ZXN0ZXJtYW5uQGdteC5kZTwvZW1haWxhZHJlc3NlPgoJCQkJPGRlbWFpbGFkcmVzc2U+bWF4LnRlc3Rlcm1hbm5AZ214LmRlLW1haWwuZGU8L2RlbWFpbGFkcmVzc2U+CgkJCTwva29udGFrdD4KCQk8L2Fuc3ByZWNocGFydG5lcj4KCQk8dmVyd2FsdHVuZ3NsZWlzdHVuZ2VuPgoJCQk8dmVyd2FsdHVuZ3NsZWlzdHVuZz4KCQkJCTxhdXNnZXdhZWhsdGVfenVzdGFlbmRpZ2VzdGVsbGU+CgkJCQkJPE9yZ2FuaXNhdGlvbnNlaW5oZWl0ZW5JRD45NTM1NjY5PC9PcmdhbmlzYXRpb25zZWluaGVpdGVuSUQ+CgkJCQkJPE9yZ2FuaXNhdGlvbnNlaW5oZWl0ZW5CRVpFSUNITlVORz5LcmVpcwoJCQkJCQlTY2hsZXN3aWctRmxlbnNidXJnL0tyZWlzdmVyd2FsdHVuZyAtIEFsbGdlbWVpbmUKCQkJCQkJT3JkbnVuZ3NhbmdlbGVnZW5oZWl0ZW48L09yZ2FuaXNhdGlvbnNlaW5oZWl0ZW5CRVpFSUNITlVORz4KCQkJCTwvYXVzZ2V3YWVobHRlX3p1c3RhZW5kaWdlc3RlbGxlPgoJCQkJPEdlYmlldElEPjkwMDczMTQ8L0dlYmlldElEPgoJCQkJPEdlYmlldEJFWkVJQ0hOVU5HPlNjaGxlc3dpZzwvR2ViaWV0QkVaRUlDSE5VTkc+CgkJCQk8QW5saWVnZW5JRD44OTY2NjcxPC9BbmxpZWdlbklEPgoJCQkJPEFubGllZ2VuQkVaRUlDSE5VTkc+V2FmZmVuc2NoZWluIC8gS2xlaW5lciBXYWZmZW5zY2hlaW48L0FubGllZ2VuQkVaRUlDSE5VTkc+CgkJCQk8bGVpa2FLRVlMSVNUPjk5MDg5MDA4MDAwMDAwOzk5MDg5MDA4MDAxMDAwPC9sZWlrYUtFWUxJU1Q+CgkJCQk8bGVpa2FCRVpFSUNITlVORyAvPgoJCQk8L3ZlcndhbHR1bmdzbGVpc3R1bmc+CgkJPC92ZXJ3YWx0dW5nc2xlaXN0dW5nZW4+Cgk8L2ZtPgo8L215Rm9ybT4=</content> - <contentType>text/xml</contentType> - <id>myForm-xml</id> - <name>XML-Daten.xml</name> - </attachments> - <caller /> - <client>sh-dev</client> - <clientId>sh-dev</clientId> - <customer>Kiel</customer> - <customerId>Kiel</customerId> - <form>SimpleFormSendetAnTestServer</form> - <formId>SimpleFormSendetAnTestServer</formId> - <id>20221212092912345678</id> - <primaryDataAttachmentId>myForm-xml</primaryDataAttachmentId> - <sender>intelliform.ozg-sh.de</sender> - <timestamp>2022-12-12T09:30:29.443Z</timestamp> - <username /> - </data> - </ns2:deposit> - </soap:Body> -</soap:Envelope> diff --git a/semantik-adapter/src/test/resources/intelliform/XML-Daten_Gewerbe.xml b/semantik-adapter/src/test/resources/intelliform/XML-Daten_Gewerbe.xml deleted file mode 100644 index 84555d9a28cd0bfe036b84e4516f45f787fa1862..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/test/resources/intelliform/XML-Daten_Gewerbe.xml +++ /dev/null @@ -1,241 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<myForm xmlns:pdf="http://xmlns.cit.de/assistants/pdf" - xmlns:t="http://xmlns.cit.de/intelliform/transaction" - t:id="20201202575230443004" t:timestamp="2020-12-02T14:58:43.790Z" - t:sender="afm.schleswig-holstein.de" t:form="Gewerbeanmeldung" - t:form-id="eGewerbe/eGewerbeAnmeldung" - t:customer="Einheitlicher Ansprechpartner" t:customer-id="ea-sh" - t:client="Schleswig-Holstein" t:client-id="land"> - <GueltigAb>2020-11-02</GueltigAb> - <GrundAnmeldungSchluessel>01</GrundAnmeldungSchluessel> - <AnliegenID>8938634</AnliegenID> - <NiederlassungArt>1</NiederlassungArt> - <IstReisegewerbe>false</IstReisegewerbe> - <BetriebArtIndustrie>false</BetriebArtIndustrie> - <BetriebArtHandwerk>false</BetriebArtHandwerk> - <BetriebArtHandel>false</BetriebArtHandel> - <BetriebArtSonstiges>true</BetriebArtSonstiges> - <rechtsform>nicht eingetragenes Einzelunternehmen</rechtsform> - <rfm>180</rfm> - <registerart /> - <min2gesellschafter>false</min2gesellschafter> - <gesetzlichervertreter>Inhaber</gesetzlichervertreter> - <Betrieb> - <ID>910838</ID> - <geschaeftsbezeichnung>OZG-Consulting</geschaeftsbezeichnung> - <EintragungPLZ /> - <EintragungOrt /> - <GerichtSchluessel /> - </Betrieb> - <sh_strasse>Reventloualle</sh_strasse> - <sh_zusatz /> - <sh_hausnummer>6</sh_hausnummer> - <sh_plz>24105</sh_plz> - <ort_auswahl>9006402$01002000</ort_auswahl> - <sh_ortsteil /> - <ort>Kiel</ort> - <GebietID>9006402</GebietID> - <GebietBEZEICHNUNG>Kiel</GebietBEZEICHNUNG> - <GebietGNR94_GNR>01002000</GebietGNR94_GNR> - <staat>000</staat> - <iso3166numerisch>276</iso3166numerisch> - <kont_telefonnummer>0431 123</kont_telefonnummer> - <kont_telefaxnummer>+ 49 4621 9654</kont_telefaxnummer> - <kont_email>max.testermann@gmx.de</kont_email> - <kont_demail>max.testermann@gmx.de-mail.de</kont_demail> - <kont_homepage>http://www.max-tester.de</kont_homepage> - <b_kont_vorwahl_telefon>0431</b_kont_vorwahl_telefon> - <b_kont_telefon>123</b_kont_telefon> - <b_kont_vorwahl_telefax>+ 49 4621</b_kont_vorwahl_telefax> - <b_kont_telefax>9654</b_kont_telefax> - <TaetigkeitenGesamt> - <TaetigkeitenGesamt-item> - <auswahl_oberbegriff>S</auswahl_oberbegriff> - <auswahl_kategorie>96</auswahl_kategorie> - <check_taetigkeitsschwerpunkt>true</check_taetigkeitsschwerpunkt> - <a_taetigkeit>OZG-Entwicklung</a_taetigkeit> - <b_oberbegriff>S Erbringung von sonstigen Dienstleistungen</b_oberbegriff> - <b_kategorie>96 Erbringung von sonstigen überwiegend persönlichen - Dienstleistungen</b_kategorie> - <b_unterklasse>96.09.0 Erbringung von sonstigen Dienstleistungen a. - n. g.</b_unterklasse> - <b_unterklasse_schluessel>96.09.0</b_unterklasse_schluessel> - <b_inkl>- Tätigkeiten von Astrologinnen, Astrologen Spiritistinnenund - Spiritisten - Erbringung persönlicher Dienstleistungen wie - Begleitdienste, Heirats- und Partnervermittlung - Betreuung von - Haustieren wie Unterbringung, Pflege, Beaufsichtigung und Dressur - - Tätigkeiten von Ahnenforschungsinstituten - Tätigkeiten von - Tätowierungs- und Piercingstudios - Tätigkeiten von Schuhputzerinnen - und Schuhputzern, Trägerinnen und Trägern, Parkplatzzuweiserinnen - und -zuweisern usw. - Betrieb von münzbetriebenen Geräten für - persönliche Dienstleistungen wie Fotoautomaten, Waagen, - Blutdruckmessern, Schließfächern usw.</b_inkl> - </TaetigkeitenGesamt-item> - </TaetigkeitenGesamt> - <IstNebenerwerb>false</IstNebenerwerb> - <AnzahlVollzeitBeschaeftigte>1</AnzahlVollzeitBeschaeftigte> - <AnzahlTeilzeitBeschaeftigte>0</AnzahlTeilzeitBeschaeftigte> - <BeteiligtePerson> - <BeteiligtePerson-item> - <personFunktion>1</personFunktion> - <personFunktionText>Einzelgewerbetreibender</personFunktionText> - <doktorgradSchluessel /> - <doktorgrad /> - <familienname>Testermann</familienname> - <vorname>Max</vorname> - <geschlechtText>männlich</geschlechtText> - <geschlecht>1</geschlecht> - <geburtsname>Max Testermann</geburtsname> - <geburtsdatum>1995-03-21</geburtsdatum> - <geburtsort>Flensburg</geburtsort> - <geburtsland>Deutschland</geburtsland> - <geburtslandSchluesel>000</geburtslandSchluesel> - <staatsangehoerigkeit>deutsch</staatsangehoerigkeit> - <staatsangehoerigkeitSchluessel>000</staatsangehoerigkeitSchluessel> - <adr_strasse>Königsweg</adr_strasse> - <adr_zusatz>Appartment 321</adr_zusatz> - <adr_hausnummer>74</adr_hausnummer> - <adr_plz>24837</adr_plz> - <adr_ort>Schleswig</adr_ort> - <adr_ortsteil>Schleswig</adr_ortsteil> - <adr_land>Deutschland$DE$DEU$276$.de</adr_land> - <b_adr_numerisch>276</b_adr_numerisch> - <b_adr_land>Deutschland</b_adr_land> - <b_adr_alpha2>DE</b_adr_alpha2> - <b_adr_alpha3>DEU</b_adr_alpha3> - <b_adr_domain>.de</b_adr_domain> - <kont_telefonnummer>+ 49 4621 9654</kont_telefonnummer> - <kont_telefaxnummer>+ 49 4621 9654</kont_telefaxnummer> - <kont_email>max.testermann@gmx.de</kont_email> - <kont_demail>max.testermann@gmx.de-mail.de</kont_demail> - <kont_homepage>http://www.max-tester.de</kont_homepage> - <b_kont_vorwahl_telefon>+ 49 4621</b_kont_vorwahl_telefon> - <b_kont_telefon>9654</b_kont_telefon> - <b_kont_vorwahl_telefax>+ 49 4621</b_kont_vorwahl_telefax> - <b_kont_telefax>9654</b_kont_telefax> - <Status_Erlaubnis>0</Status_Erlaubnis> - <b_Erlaubnis>Liegt nicht vor</b_Erlaubnis> - </BeteiligtePerson-item> - </BeteiligtePerson> - <KontaktsystemTypA>233034600</KontaktsystemTypA> - <KontaktsystemTypB>233034601</KontaktsystemTypB> - <zustaendigestelle> - <OrganisationseinheitenAuswahl>9081994</OrganisationseinheitenAuswahl> - <OrganisationseinheitenID>9081994</OrganisationseinheitenID> - <OrganisationseinheitenBEZEICHNUNG>Landeshauptstadt Kiel - Bürger- und - Ordnungsamt, Gewerbemeldestelle</OrganisationseinheitenBEZEICHNUNG> - <strasse>Fabrikstraße</strasse> - <hausnummer>8-10 </hausnummer> - <postleitzahl>24103</postleitzahl> - <ortID>9006402</ortID> - <ort>Kiel</ort> - <telefonnummer>+49 431 901-2807</telefonnummer> - <telefaxnummer>+49 431 901-62070</telefaxnummer> - <emailadresse>Gewerbemeldestelle@kiel.de</emailadresse> - <demailadresse /> - <kontaktsystem_kennung /> - <kontaktsystem_kennungzusatz /> - <AnliegenBEZEICHNUNG>Gewerbeanmeldung, Elektronische Gewerbeanzeige</AnliegenBEZEICHNUNG> - <leikaKEYLIST>99050012104000</leikaKEYLIST> - </zustaendigestelle> - <empfangendestelle> - <OrganisationseinheitenAuswahl>9068873</OrganisationseinheitenAuswahl> - <OrganisationseinheitenID>9068873</OrganisationseinheitenID> - <OrganisationseinheitenBEZEICHNUNG>Einheitlicher Ansprechpartner - Schleswig-Holstein</OrganisationseinheitenBEZEICHNUNG> - <strasse>Reventlouallee</strasse> - <hausnummer>6</hausnummer> - <postleitzahl>24105</postleitzahl> - <ortID>9006402</ortID> - <ort>Kiel</ort> - <telefonnummer>+49 431 988-8650</telefonnummer> - <telefaxnummer>+49 431 988-6161111</telefaxnummer> - <emailadresse>info@ea-sh.de</emailadresse> - <demailadresse>ea-poststelle@ea-sh.de-mail.de</demailadresse> - <kontaktsystem_kennung>afmsh:9068873_AusnahmeLKWFahrverbot</kontaktsystem_kennung> - <kontaktsystem_kennungzusatz>alle</kontaktsystem_kennungzusatz> - </empfangendestelle> - <erklaerungen> - <check_gebuehren>true</check_gebuehren> - <check_richtigkeit>true</check_richtigkeit> - <check_datenschutz>true</check_datenschutz> - <check_missbrauch>true</check_missbrauch> - <check_hinweis>true</check_hinweis> - <b_gebuehren_beschriftung>* Die Gewerbeanmeldung ist kostenpflichtig. - Die Höhe der Gebühren bemisst sich nach der Landesverordnung über - Verwaltungsgebühren (Allgemeiner Gebührentarif) Tarifstelle 11.1.1 - - VwGebV. Genaue Auskünfte hierzu erteilt das zuständige Gewerbeamt.</b_gebuehren_beschriftung> - <b_gebuehren_intro /> - <b_richtigkeit>* Ich bestätige die Richtigkeit meiner Angaben.</b_richtigkeit> - <b_datenschutz>* Ich erkläre mich damit einverstanden, dass der - Einheitlicher Ansprechpartner Schleswig-Holstein zur Erfüllung seiner - Aufgaben meine Daten unter Einhaltung der Bestimmungen der - Datenschutz-Grundverordnung (DS-GVO) und des - Landesdatenschutzgesetzes Schleswig-Holstein (LDSG-SH) speichert, - verarbeitet und diese im Rahmen der gesetzlichen Bestimmungen an die - für die Entscheidung zuständige Stelle weiterleitet. Ebenso bin ich - mit der rechtskonformen Datenverarbeitung und Speicherung durch die - zuständige Stelle einverstanden. Mir ist bekannt, dass ich die - Einwilligung in die Verarbeitung und Übermittlung jederzeit gegenüber - dem Einheitlicher Ansprechpartner Schleswig-Holstein, Reventlouallee - 6, 24105 Kiel widerrufen kann. Ein Widerruf ist aber nur wirksam für - die Zukunft. Verarbeitungen, die vor dem Widerruf erfolgt sind, sind - davon nicht betroffen. Über die Verarbeitung meiner personenbezogenen - Daten und die mir nach den datenschutzrechtlichen Regelungen - zustehenden Ansprüche und Rechte habe ich unter Datenschutzerklärung - Kenntnis erlangt.</b_datenschutz> - <b_missbrauch>* Mir ist bekannt, dass zur Verfolgung widerrechtlicher - Nutzung die Daten meines zur Dateneingabe genutzten Endgerätes - aufgezeichnet und verwendet werden können.</b_missbrauch> - <b_hinweis_beschriftung>* Diese Anzeige berechtigt nicht zum Beginn - des Gewerbebetriebes, wenn noch eine Erlaubnis oder eine Eintragung - in die Handwerksrolle notwendig ist. Zuwiderhandlungen können mit - Geldbuße oder Geldstrafe oder Freiheitsstrafe geahndet werden. Diese - Anzeige ist keine Genehmigung zur Errichtung einer Betriebsstätte - entsprechend dem Planungs- und Baurecht.</b_hinweis_beschriftung> - <b_hinweis_intro>Hinweis</b_hinweis_intro> - <policyurl>http://wafmxpa002.dpaor.de/sh/datenschutz/datenschutzerklaerungEA_de.doc</policyurl> - </erklaerungen> - <b_timestamp>20201202160323</b_timestamp> - <logourl>http://wafmxpa002.dpaor.de/sh/logos/kopf_9068873.doc</logourl> - <fm> - <ansprechpartner> - <firmenname /> - <anrede>Herr</anrede> - <vorname>Max</vorname> - <familienname>Testermann</familienname> - <anschrift> - <strasse>Reventloualle</strasse> - <hausnummer>6</hausnummer> - <postfach /> - <postleitzahl>24105</postleitzahl> - <ort>Kiel</ort> - <ortsteil /> - <zusatz /> - <staat>Deutschland</staat> - </anschrift> - <kontakt> - <telefonnummer>0431 123</telefonnummer> - <mobilnummer /> - <telefaxnummer>+ 49 4621 9654</telefaxnummer> - <emailadresse>max.testermann@gmx.de</emailadresse> - <demailadresse>max.testermann@gmx.de-mail.de</demailadresse> - </kontakt> - </ansprechpartner> - <verwaltungsleistungen> - <verwaltungsleistung> - <ausgewaehlte_zustaendigestelle> - <OrganisationseinheitenID>9081994</OrganisationseinheitenID> - <OrganisationseinheitenBEZEICHNUNG>Landeshauptstadt Kiel - Bürger- - und Ordnungsamt, Gewerbemeldestelle</OrganisationseinheitenBEZEICHNUNG> - </ausgewaehlte_zustaendigestelle> - <GebietID>9006402</GebietID> - <GebietBEZEICHNUNG>Kiel</GebietBEZEICHNUNG> - <AnliegenID>8938634</AnliegenID> - <AnliegenBEZEICHNUNG>Gewerbeanmeldung, Elektronische Gewerbeanzeige</AnliegenBEZEICHNUNG> - <leikaKEYLIST>99050012104000</leikaKEYLIST> - <leikaBEZEICHNUNG /> - </verwaltungsleistung> - </verwaltungsleistungen> - </fm> -</myForm> \ No newline at end of file diff --git a/semantik-adapter/src/test/resources/intelliform/XML-Daten_Gewerbe_organisationseinheitenID.xml b/semantik-adapter/src/test/resources/intelliform/XML-Daten_Gewerbe_organisationseinheitenID.xml deleted file mode 100644 index b3de948851da491635354c45fbd6810b1bc21af6..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/test/resources/intelliform/XML-Daten_Gewerbe_organisationseinheitenID.xml +++ /dev/null @@ -1,223 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<myForm xmlns:pdf="http://xmlns.cit.de/assistants/pdf" - xmlns:t="http://xmlns.cit.de/intelliform/transaction" - t:id="20201202575230443004" t:timestamp="2020-12-02T14:58:43.790Z" - t:sender="afm.schleswig-holstein.de" t:form="Gewerbeanmeldung" - t:form-id="eGewerbe/eGewerbeAnmeldung" - t:customer="Einheitlicher Ansprechpartner" t:customer-id="ea-sh" - t:client="Schleswig-Holstein" t:client-id="land"> - <GueltigAb>2020-11-02</GueltigAb> - <GrundAnmeldungSchluessel>01</GrundAnmeldungSchluessel> - <AnliegenID>8938634</AnliegenID> - <NiederlassungArt>1</NiederlassungArt> - <IstReisegewerbe>false</IstReisegewerbe> - <BetriebArtIndustrie>false</BetriebArtIndustrie> - <BetriebArtHandwerk>false</BetriebArtHandwerk> - <BetriebArtHandel>false</BetriebArtHandel> - <BetriebArtSonstiges>true</BetriebArtSonstiges> - <rechtsform>nicht eingetragenes Einzelunternehmen</rechtsform> - <rfm>180</rfm> - <registerart /> - <min2gesellschafter>false</min2gesellschafter> - <gesetzlichervertreter>Inhaber</gesetzlichervertreter> - <Betrieb> - <ID>910838</ID> - <geschaeftsbezeichnung>OZG-Consulting</geschaeftsbezeichnung> - <EintragungPLZ /> - <EintragungOrt /> - <GerichtSchluessel /> - </Betrieb> - <sh_strasse>Reventloualle</sh_strasse> - <sh_zusatz /> - <sh_hausnummer>6</sh_hausnummer> - <sh_plz>24105</sh_plz> - <ort_auswahl>9006402$01002000</ort_auswahl> - <sh_ortsteil /> - <ort>Kiel</ort> - <GebietID>9006402</GebietID> - <GebietBEZEICHNUNG>Kiel</GebietBEZEICHNUNG> - <GebietGNR94_GNR>01002000</GebietGNR94_GNR> - <staat>000</staat> - <iso3166numerisch>276</iso3166numerisch> - <kont_telefonnummer>0431 123</kont_telefonnummer> - <kont_telefaxnummer>+ 49 4621 9654</kont_telefaxnummer> - <kont_email>max.testermann@gmx.de</kont_email> - <kont_demail>max.testermann@gmx.de-mail.de</kont_demail> - <kont_homepage>http://www.max-tester.de</kont_homepage> - <b_kont_vorwahl_telefon>0431</b_kont_vorwahl_telefon> - <b_kont_telefon>123</b_kont_telefon> - <b_kont_vorwahl_telefax>+ 49 4621</b_kont_vorwahl_telefax> - <b_kont_telefax>9654</b_kont_telefax> - <TaetigkeitenGesamt> - <TaetigkeitenGesamt-item> - <auswahl_oberbegriff>S</auswahl_oberbegriff> - <auswahl_kategorie>96</auswahl_kategorie> - <check_taetigkeitsschwerpunkt>true</check_taetigkeitsschwerpunkt> - <a_taetigkeit>OZG-Entwicklung</a_taetigkeit> - <b_oberbegriff>S Erbringung von sonstigen Dienstleistungen</b_oberbegriff> - <b_kategorie>96 Erbringung von sonstigen überwiegend persönlichen - Dienstleistungen</b_kategorie> - <b_unterklasse>96.09.0 Erbringung von sonstigen Dienstleistungen a. - n. g.</b_unterklasse> - <b_unterklasse_schluessel>96.09.0</b_unterklasse_schluessel> - <b_inkl>- Tätigkeiten von Astrologinnen, Astrologen Spiritistinnenund - Spiritisten - Erbringung persönlicher Dienstleistungen wie - Begleitdienste, Heirats- und Partnervermittlung - Betreuung von - Haustieren wie Unterbringung, Pflege, Beaufsichtigung und Dressur - - Tätigkeiten von Ahnenforschungsinstituten - Tätigkeiten von - Tätowierungs- und Piercingstudios - Tätigkeiten von Schuhputzerinnen - und Schuhputzern, Trägerinnen und Trägern, Parkplatzzuweiserinnen - und -zuweisern usw. - Betrieb von münzbetriebenen Geräten für - persönliche Dienstleistungen wie Fotoautomaten, Waagen, - Blutdruckmessern, Schließfächern usw.</b_inkl> - </TaetigkeitenGesamt-item> - </TaetigkeitenGesamt> - <IstNebenerwerb>false</IstNebenerwerb> - <AnzahlVollzeitBeschaeftigte>1</AnzahlVollzeitBeschaeftigte> - <AnzahlTeilzeitBeschaeftigte>0</AnzahlTeilzeitBeschaeftigte> - <BeteiligtePerson> - <BeteiligtePerson-item> - <personFunktion>1</personFunktion> - <personFunktionText>Einzelgewerbetreibender</personFunktionText> - <doktorgradSchluessel /> - <doktorgrad /> - <familienname>Testermann</familienname> - <vorname>Max</vorname> - <geschlechtText>männlich</geschlechtText> - <geschlecht>1</geschlecht> - <geburtsname>Max Testermann</geburtsname> - <geburtsdatum>1995-03-21</geburtsdatum> - <geburtsort>Flensburg</geburtsort> - <geburtsland>Deutschland</geburtsland> - <geburtslandSchluesel>000</geburtslandSchluesel> - <staatsangehoerigkeit>deutsch</staatsangehoerigkeit> - <staatsangehoerigkeitSchluessel>000</staatsangehoerigkeitSchluessel> - <adr_strasse>Königsweg</adr_strasse> - <adr_zusatz>Appartment 321</adr_zusatz> - <adr_hausnummer>74</adr_hausnummer> - <adr_plz>24837</adr_plz> - <adr_ort>Schleswig</adr_ort> - <adr_ortsteil>Schleswig</adr_ortsteil> - <adr_land>Deutschland$DE$DEU$276$.de</adr_land> - <b_adr_numerisch>276</b_adr_numerisch> - <b_adr_land>Deutschland</b_adr_land> - <b_adr_alpha2>DE</b_adr_alpha2> - <b_adr_alpha3>DEU</b_adr_alpha3> - <b_adr_domain>.de</b_adr_domain> - <kont_telefonnummer>+ 49 4621 9654</kont_telefonnummer> - <kont_telefaxnummer>+ 49 4621 9654</kont_telefaxnummer> - <kont_email>max.testermann@gmx.de</kont_email> - <kont_demail>max.testermann@gmx.de-mail.de</kont_demail> - <kont_homepage>http://www.max-tester.de</kont_homepage> - <b_kont_vorwahl_telefon>+ 49 4621</b_kont_vorwahl_telefon> - <b_kont_telefon>9654</b_kont_telefon> - <b_kont_vorwahl_telefax>+ 49 4621</b_kont_vorwahl_telefax> - <b_kont_telefax>9654</b_kont_telefax> - <Status_Erlaubnis>0</Status_Erlaubnis> - <b_Erlaubnis>Liegt nicht vor</b_Erlaubnis> - </BeteiligtePerson-item> - </BeteiligtePerson> - <KontaktsystemTypA>233034600</KontaktsystemTypA> - <KontaktsystemTypB>233034601</KontaktsystemTypB> - <OrganisationseinheitenID>97465445</OrganisationseinheitenID> - <empfangendestelle> - <OrganisationseinheitenAuswahl>9068873</OrganisationseinheitenAuswahl> - <OrganisationseinheitenID>9068873</OrganisationseinheitenID> - <OrganisationseinheitenBEZEICHNUNG>Einheitlicher Ansprechpartner - Schleswig-Holstein</OrganisationseinheitenBEZEICHNUNG> - <strasse>Reventlouallee</strasse> - <hausnummer>6</hausnummer> - <postleitzahl>24105</postleitzahl> - <ortID>9006402</ortID> - <ort>Kiel</ort> - <telefonnummer>+49 431 988-8650</telefonnummer> - <telefaxnummer>+49 431 988-6161111</telefaxnummer> - <emailadresse>info@ea-sh.de</emailadresse> - <demailadresse>ea-poststelle@ea-sh.de-mail.de</demailadresse> - <kontaktsystem_kennung>afmsh:9068873_AusnahmeLKWFahrverbot</kontaktsystem_kennung> - <kontaktsystem_kennungzusatz>alle</kontaktsystem_kennungzusatz> - </empfangendestelle> - <erklaerungen> - <check_gebuehren>true</check_gebuehren> - <check_richtigkeit>true</check_richtigkeit> - <check_datenschutz>true</check_datenschutz> - <check_missbrauch>true</check_missbrauch> - <check_hinweis>true</check_hinweis> - <b_gebuehren_beschriftung>* Die Gewerbeanmeldung ist kostenpflichtig. - Die Höhe der Gebühren bemisst sich nach der Landesverordnung über - Verwaltungsgebühren (Allgemeiner Gebührentarif) Tarifstelle 11.1.1 - - VwGebV. Genaue Auskünfte hierzu erteilt das zuständige Gewerbeamt.</b_gebuehren_beschriftung> - <b_gebuehren_intro /> - <b_richtigkeit>* Ich bestätige die Richtigkeit meiner Angaben.</b_richtigkeit> - <b_datenschutz>* Ich erkläre mich damit einverstanden, dass der - Einheitlicher Ansprechpartner Schleswig-Holstein zur Erfüllung seiner - Aufgaben meine Daten unter Einhaltung der Bestimmungen der - Datenschutz-Grundverordnung (DS-GVO) und des - Landesdatenschutzgesetzes Schleswig-Holstein (LDSG-SH) speichert, - verarbeitet und diese im Rahmen der gesetzlichen Bestimmungen an die - für die Entscheidung zuständige Stelle weiterleitet. Ebenso bin ich - mit der rechtskonformen Datenverarbeitung und Speicherung durch die - zuständige Stelle einverstanden. Mir ist bekannt, dass ich die - Einwilligung in die Verarbeitung und Übermittlung jederzeit gegenüber - dem Einheitlicher Ansprechpartner Schleswig-Holstein, Reventlouallee - 6, 24105 Kiel widerrufen kann. Ein Widerruf ist aber nur wirksam für - die Zukunft. Verarbeitungen, die vor dem Widerruf erfolgt sind, sind - davon nicht betroffen. Über die Verarbeitung meiner personenbezogenen - Daten und die mir nach den datenschutzrechtlichen Regelungen - zustehenden Ansprüche und Rechte habe ich unter Datenschutzerklärung - Kenntnis erlangt.</b_datenschutz> - <b_missbrauch>* Mir ist bekannt, dass zur Verfolgung widerrechtlicher - Nutzung die Daten meines zur Dateneingabe genutzten Endgerätes - aufgezeichnet und verwendet werden können.</b_missbrauch> - <b_hinweis_beschriftung>* Diese Anzeige berechtigt nicht zum Beginn - des Gewerbebetriebes, wenn noch eine Erlaubnis oder eine Eintragung - in die Handwerksrolle notwendig ist. Zuwiderhandlungen können mit - Geldbuße oder Geldstrafe oder Freiheitsstrafe geahndet werden. Diese - Anzeige ist keine Genehmigung zur Errichtung einer Betriebsstätte - entsprechend dem Planungs- und Baurecht.</b_hinweis_beschriftung> - <b_hinweis_intro>Hinweis</b_hinweis_intro> - <policyurl>http://wafmxpa002.dpaor.de/sh/datenschutz/datenschutzerklaerungEA_de.doc</policyurl> - </erklaerungen> - <b_timestamp>20201202160323</b_timestamp> - <logourl>http://wafmxpa002.dpaor.de/sh/logos/kopf_9068873.doc</logourl> - <fm> - <ansprechpartner> - <firmenname /> - <anrede>Herr</anrede> - <vorname>Max</vorname> - <familienname>Testermann</familienname> - <anschrift> - <strasse>Reventloualle</strasse> - <hausnummer>6</hausnummer> - <postfach /> - <postleitzahl>24105</postleitzahl> - <ort>Kiel</ort> - <ortsteil /> - <zusatz /> - <staat>Deutschland</staat> - </anschrift> - <kontakt> - <telefonnummer>0431 123</telefonnummer> - <mobilnummer /> - <telefaxnummer>+ 49 4621 9654</telefaxnummer> - <emailadresse>max.testermann@gmx.de</emailadresse> - <demailadresse>max.testermann@gmx.de-mail.de</demailadresse> - </kontakt> - </ansprechpartner> - <verwaltungsleistungen> - <verwaltungsleistung> - <ausgewaehlte_zustaendigestelle> - <OrganisationseinheitenID>9081994</OrganisationseinheitenID> - <OrganisationseinheitenBEZEICHNUNG>Landeshauptstadt Kiel - Bürger- - und Ordnungsamt, Gewerbemeldestelle</OrganisationseinheitenBEZEICHNUNG> - </ausgewaehlte_zustaendigestelle> - <GebietID>9006402</GebietID> - <GebietBEZEICHNUNG>Kiel</GebietBEZEICHNUNG> - <AnliegenID>8938634</AnliegenID> - <AnliegenBEZEICHNUNG>Gewerbeanmeldung, Elektronische Gewerbeanzeige</AnliegenBEZEICHNUNG> - <leikaKEYLIST>99050012104000</leikaKEYLIST> - <leikaBEZEICHNUNG /> - </verwaltungsleistung> - </verwaltungsleistungen> - </fm> -</myForm> \ No newline at end of file diff --git a/semantik-adapter/src/test/resources/intelliform/XML-Daten_Gewerbe_organisationseinheitenID_und_zustaendigstelle.xml b/semantik-adapter/src/test/resources/intelliform/XML-Daten_Gewerbe_organisationseinheitenID_und_zustaendigstelle.xml deleted file mode 100644 index eee2389786b1e4a2715857c90441cf4ecbf8cd7f..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/test/resources/intelliform/XML-Daten_Gewerbe_organisationseinheitenID_und_zustaendigstelle.xml +++ /dev/null @@ -1,242 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<myForm xmlns:pdf="http://xmlns.cit.de/assistants/pdf" - xmlns:t="http://xmlns.cit.de/intelliform/transaction" - t:id="20201202575230443004" t:timestamp="2020-12-02T14:58:43.790Z" - t:sender="afm.schleswig-holstein.de" t:form="Gewerbeanmeldung" - t:form-id="eGewerbe/eGewerbeAnmeldung" - t:customer="Einheitlicher Ansprechpartner" t:customer-id="ea-sh" - t:client="Schleswig-Holstein" t:client-id="land"> - <GueltigAb>2020-11-02</GueltigAb> - <GrundAnmeldungSchluessel>01</GrundAnmeldungSchluessel> - <AnliegenID>8938634</AnliegenID> - <NiederlassungArt>1</NiederlassungArt> - <IstReisegewerbe>false</IstReisegewerbe> - <BetriebArtIndustrie>false</BetriebArtIndustrie> - <BetriebArtHandwerk>false</BetriebArtHandwerk> - <BetriebArtHandel>false</BetriebArtHandel> - <BetriebArtSonstiges>true</BetriebArtSonstiges> - <rechtsform>nicht eingetragenes Einzelunternehmen</rechtsform> - <rfm>180</rfm> - <registerart /> - <min2gesellschafter>false</min2gesellschafter> - <gesetzlichervertreter>Inhaber</gesetzlichervertreter> - <Betrieb> - <ID>910838</ID> - <geschaeftsbezeichnung>OZG-Consulting</geschaeftsbezeichnung> - <EintragungPLZ /> - <EintragungOrt /> - <GerichtSchluessel /> - </Betrieb> - <sh_strasse>Reventloualle</sh_strasse> - <sh_zusatz /> - <sh_hausnummer>6</sh_hausnummer> - <sh_plz>24105</sh_plz> - <ort_auswahl>9006402$01002000</ort_auswahl> - <sh_ortsteil /> - <ort>Kiel</ort> - <GebietID>9006402</GebietID> - <GebietBEZEICHNUNG>Kiel</GebietBEZEICHNUNG> - <GebietGNR94_GNR>01002000</GebietGNR94_GNR> - <staat>000</staat> - <iso3166numerisch>276</iso3166numerisch> - <kont_telefonnummer>0431 123</kont_telefonnummer> - <kont_telefaxnummer>+ 49 4621 9654</kont_telefaxnummer> - <kont_email>max.testermann@gmx.de</kont_email> - <kont_demail>max.testermann@gmx.de-mail.de</kont_demail> - <kont_homepage>http://www.max-tester.de</kont_homepage> - <b_kont_vorwahl_telefon>0431</b_kont_vorwahl_telefon> - <b_kont_telefon>123</b_kont_telefon> - <b_kont_vorwahl_telefax>+ 49 4621</b_kont_vorwahl_telefax> - <b_kont_telefax>9654</b_kont_telefax> - <TaetigkeitenGesamt> - <TaetigkeitenGesamt-item> - <auswahl_oberbegriff>S</auswahl_oberbegriff> - <auswahl_kategorie>96</auswahl_kategorie> - <check_taetigkeitsschwerpunkt>true</check_taetigkeitsschwerpunkt> - <a_taetigkeit>OZG-Entwicklung</a_taetigkeit> - <b_oberbegriff>S Erbringung von sonstigen Dienstleistungen</b_oberbegriff> - <b_kategorie>96 Erbringung von sonstigen überwiegend persönlichen - Dienstleistungen</b_kategorie> - <b_unterklasse>96.09.0 Erbringung von sonstigen Dienstleistungen a. - n. g.</b_unterklasse> - <b_unterklasse_schluessel>96.09.0</b_unterklasse_schluessel> - <b_inkl>- Tätigkeiten von Astrologinnen, Astrologen Spiritistinnenund - Spiritisten - Erbringung persönlicher Dienstleistungen wie - Begleitdienste, Heirats- und Partnervermittlung - Betreuung von - Haustieren wie Unterbringung, Pflege, Beaufsichtigung und Dressur - - Tätigkeiten von Ahnenforschungsinstituten - Tätigkeiten von - Tätowierungs- und Piercingstudios - Tätigkeiten von Schuhputzerinnen - und Schuhputzern, Trägerinnen und Trägern, Parkplatzzuweiserinnen - und -zuweisern usw. - Betrieb von münzbetriebenen Geräten für - persönliche Dienstleistungen wie Fotoautomaten, Waagen, - Blutdruckmessern, Schließfächern usw.</b_inkl> - </TaetigkeitenGesamt-item> - </TaetigkeitenGesamt> - <IstNebenerwerb>false</IstNebenerwerb> - <AnzahlVollzeitBeschaeftigte>1</AnzahlVollzeitBeschaeftigte> - <AnzahlTeilzeitBeschaeftigte>0</AnzahlTeilzeitBeschaeftigte> - <BeteiligtePerson> - <BeteiligtePerson-item> - <personFunktion>1</personFunktion> - <personFunktionText>Einzelgewerbetreibender</personFunktionText> - <doktorgradSchluessel /> - <doktorgrad /> - <familienname>Testermann</familienname> - <vorname>Max</vorname> - <geschlechtText>männlich</geschlechtText> - <geschlecht>1</geschlecht> - <geburtsname>Max Testermann</geburtsname> - <geburtsdatum>1995-03-21</geburtsdatum> - <geburtsort>Flensburg</geburtsort> - <geburtsland>Deutschland</geburtsland> - <geburtslandSchluesel>000</geburtslandSchluesel> - <staatsangehoerigkeit>deutsch</staatsangehoerigkeit> - <staatsangehoerigkeitSchluessel>000</staatsangehoerigkeitSchluessel> - <adr_strasse>Königsweg</adr_strasse> - <adr_zusatz>Appartment 321</adr_zusatz> - <adr_hausnummer>74</adr_hausnummer> - <adr_plz>24837</adr_plz> - <adr_ort>Schleswig</adr_ort> - <adr_ortsteil>Schleswig</adr_ortsteil> - <adr_land>Deutschland$DE$DEU$276$.de</adr_land> - <b_adr_numerisch>276</b_adr_numerisch> - <b_adr_land>Deutschland</b_adr_land> - <b_adr_alpha2>DE</b_adr_alpha2> - <b_adr_alpha3>DEU</b_adr_alpha3> - <b_adr_domain>.de</b_adr_domain> - <kont_telefonnummer>+ 49 4621 9654</kont_telefonnummer> - <kont_telefaxnummer>+ 49 4621 9654</kont_telefaxnummer> - <kont_email>max.testermann@gmx.de</kont_email> - <kont_demail>max.testermann@gmx.de-mail.de</kont_demail> - <kont_homepage>http://www.max-tester.de</kont_homepage> - <b_kont_vorwahl_telefon>+ 49 4621</b_kont_vorwahl_telefon> - <b_kont_telefon>9654</b_kont_telefon> - <b_kont_vorwahl_telefax>+ 49 4621</b_kont_vorwahl_telefax> - <b_kont_telefax>9654</b_kont_telefax> - <Status_Erlaubnis>0</Status_Erlaubnis> - <b_Erlaubnis>Liegt nicht vor</b_Erlaubnis> - </BeteiligtePerson-item> - </BeteiligtePerson> - <KontaktsystemTypA>233034600</KontaktsystemTypA> - <KontaktsystemTypB>233034601</KontaktsystemTypB> - <zustaendigestelle> - <OrganisationseinheitenAuswahl>9081994</OrganisationseinheitenAuswahl> - <OrganisationseinheitenID>9081994</OrganisationseinheitenID> - <OrganisationseinheitenBEZEICHNUNG>Landeshauptstadt Kiel - Bürger- und - Ordnungsamt, Gewerbemeldestelle</OrganisationseinheitenBEZEICHNUNG> - <strasse>Fabrikstraße</strasse> - <hausnummer>8-10 </hausnummer> - <postleitzahl>24103</postleitzahl> - <ortID>9006402</ortID> - <ort>Kiel</ort> - <telefonnummer>+49 431 901-2807</telefonnummer> - <telefaxnummer>+49 431 901-62070</telefaxnummer> - <emailadresse>Gewerbemeldestelle@kiel.de</emailadresse> - <demailadresse /> - <kontaktsystem_kennung /> - <kontaktsystem_kennungzusatz /> - <AnliegenBEZEICHNUNG>Gewerbeanmeldung, Elektronische Gewerbeanzeige</AnliegenBEZEICHNUNG> - <leikaKEYLIST>99050012104000</leikaKEYLIST> - </zustaendigestelle> - <OrganisationseinheitenID>organisationseinheitenID</OrganisationseinheitenID> - <empfangendestelle> - <OrganisationseinheitenAuswahl>9068873</OrganisationseinheitenAuswahl> - <OrganisationseinheitenID>9068873</OrganisationseinheitenID> - <OrganisationseinheitenBEZEICHNUNG>Einheitlicher Ansprechpartner - Schleswig-Holstein</OrganisationseinheitenBEZEICHNUNG> - <strasse>Reventlouallee</strasse> - <hausnummer>6</hausnummer> - <postleitzahl>24105</postleitzahl> - <ortID>9006402</ortID> - <ort>Kiel</ort> - <telefonnummer>+49 431 988-8650</telefonnummer> - <telefaxnummer>+49 431 988-6161111</telefaxnummer> - <emailadresse>info@ea-sh.de</emailadresse> - <demailadresse>ea-poststelle@ea-sh.de-mail.de</demailadresse> - <kontaktsystem_kennung>afmsh:9068873_AusnahmeLKWFahrverbot</kontaktsystem_kennung> - <kontaktsystem_kennungzusatz>alle</kontaktsystem_kennungzusatz> - </empfangendestelle> - <erklaerungen> - <check_gebuehren>true</check_gebuehren> - <check_richtigkeit>true</check_richtigkeit> - <check_datenschutz>true</check_datenschutz> - <check_missbrauch>true</check_missbrauch> - <check_hinweis>true</check_hinweis> - <b_gebuehren_beschriftung>* Die Gewerbeanmeldung ist kostenpflichtig. - Die Höhe der Gebühren bemisst sich nach der Landesverordnung über - Verwaltungsgebühren (Allgemeiner Gebührentarif) Tarifstelle 11.1.1 - - VwGebV. Genaue Auskünfte hierzu erteilt das zuständige Gewerbeamt.</b_gebuehren_beschriftung> - <b_gebuehren_intro /> - <b_richtigkeit>* Ich bestätige die Richtigkeit meiner Angaben.</b_richtigkeit> - <b_datenschutz>* Ich erkläre mich damit einverstanden, dass der - Einheitlicher Ansprechpartner Schleswig-Holstein zur Erfüllung seiner - Aufgaben meine Daten unter Einhaltung der Bestimmungen der - Datenschutz-Grundverordnung (DS-GVO) und des - Landesdatenschutzgesetzes Schleswig-Holstein (LDSG-SH) speichert, - verarbeitet und diese im Rahmen der gesetzlichen Bestimmungen an die - für die Entscheidung zuständige Stelle weiterleitet. Ebenso bin ich - mit der rechtskonformen Datenverarbeitung und Speicherung durch die - zuständige Stelle einverstanden. Mir ist bekannt, dass ich die - Einwilligung in die Verarbeitung und Übermittlung jederzeit gegenüber - dem Einheitlicher Ansprechpartner Schleswig-Holstein, Reventlouallee - 6, 24105 Kiel widerrufen kann. Ein Widerruf ist aber nur wirksam für - die Zukunft. Verarbeitungen, die vor dem Widerruf erfolgt sind, sind - davon nicht betroffen. Über die Verarbeitung meiner personenbezogenen - Daten und die mir nach den datenschutzrechtlichen Regelungen - zustehenden Ansprüche und Rechte habe ich unter Datenschutzerklärung - Kenntnis erlangt.</b_datenschutz> - <b_missbrauch>* Mir ist bekannt, dass zur Verfolgung widerrechtlicher - Nutzung die Daten meines zur Dateneingabe genutzten Endgerätes - aufgezeichnet und verwendet werden können.</b_missbrauch> - <b_hinweis_beschriftung>* Diese Anzeige berechtigt nicht zum Beginn - des Gewerbebetriebes, wenn noch eine Erlaubnis oder eine Eintragung - in die Handwerksrolle notwendig ist. Zuwiderhandlungen können mit - Geldbuße oder Geldstrafe oder Freiheitsstrafe geahndet werden. Diese - Anzeige ist keine Genehmigung zur Errichtung einer Betriebsstätte - entsprechend dem Planungs- und Baurecht.</b_hinweis_beschriftung> - <b_hinweis_intro>Hinweis</b_hinweis_intro> - <policyurl>http://wafmxpa002.dpaor.de/sh/datenschutz/datenschutzerklaerungEA_de.doc</policyurl> - </erklaerungen> - <b_timestamp>20201202160323</b_timestamp> - <logourl>http://wafmxpa002.dpaor.de/sh/logos/kopf_9068873.doc</logourl> - <fm> - <ansprechpartner> - <firmenname /> - <anrede>Herr</anrede> - <vorname>Max</vorname> - <familienname>Testermann</familienname> - <anschrift> - <strasse>Reventloualle</strasse> - <hausnummer>6</hausnummer> - <postfach /> - <postleitzahl>24105</postleitzahl> - <ort>Kiel</ort> - <ortsteil /> - <zusatz /> - <staat>Deutschland</staat> - </anschrift> - <kontakt> - <telefonnummer>0431 123</telefonnummer> - <mobilnummer /> - <telefaxnummer>+ 49 4621 9654</telefaxnummer> - <emailadresse>max.testermann@gmx.de</emailadresse> - <demailadresse>max.testermann@gmx.de-mail.de</demailadresse> - </kontakt> - </ansprechpartner> - <verwaltungsleistungen> - <verwaltungsleistung> - <ausgewaehlte_zustaendigestelle> - <OrganisationseinheitenID>9081994</OrganisationseinheitenID> - <OrganisationseinheitenBEZEICHNUNG>Landeshauptstadt Kiel - Bürger- - und Ordnungsamt, Gewerbemeldestelle</OrganisationseinheitenBEZEICHNUNG> - </ausgewaehlte_zustaendigestelle> - <GebietID>9006402</GebietID> - <GebietBEZEICHNUNG>Kiel</GebietBEZEICHNUNG> - <AnliegenID>8938634</AnliegenID> - <AnliegenBEZEICHNUNG>Gewerbeanmeldung, Elektronische Gewerbeanzeige</AnliegenBEZEICHNUNG> - <leikaKEYLIST>99050012104000</leikaKEYLIST> - <leikaBEZEICHNUNG /> - </verwaltungsleistung> - </verwaltungsleistungen> - </fm> -</myForm> \ No newline at end of file diff --git a/semantik-adapter/src/test/resources/intelliform/XML-Daten_Strassengefaelle.xml b/semantik-adapter/src/test/resources/intelliform/XML-Daten_Strassengefaelle.xml deleted file mode 100644 index f9dc71fb05888873b51210a9714bda15db602205..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/test/resources/intelliform/XML-Daten_Strassengefaelle.xml +++ /dev/null @@ -1,21 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<myForm xmlns:pdf="http://xmlns.cit.de/assistants/pdf" xmlns:t="http://xmlns.cit.de/intelliform/transaction" t:id="20201202575230443004" t:timestamp="2020-12-02T14:58:43.790Z" t:sender="afm.schleswig-holstein.de" t:form="Überarbeitung Straßengefälle nach §12" t:form-id="eStrassengefaelle/eUeberarbeitung" t:customer="Einheitlicher Ansprechpartner" t:customer-id="ea-sh" t:client="Schleswig-Holstein" t:client-id="land"> - <sh_strasse>Fallstraße</sh_strasse> - <sh_zusatz/> - <sh_hausnummer>12 a</sh_hausnummer> - <ort>Überörtlingen</ort> - <TaetigkeitenGesamt> - <TaetigkeitenGesamt-item> - <b_inkl>Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.</b_inkl> - </TaetigkeitenGesamt-item> - </TaetigkeitenGesamt> -</myForm> diff --git a/semantik-adapter/src/test/resources/intelliform/XML-Keine_Daten.xml b/semantik-adapter/src/test/resources/intelliform/XML-Keine_Daten.xml deleted file mode 100644 index 92e52bd02a277b21a1da8de490275f8c7f905235..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/test/resources/intelliform/XML-Keine_Daten.xml +++ /dev/null @@ -1,3 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<myForm xmlns:pdf="http://xmlns.cit.de/assistants/pdf" xmlns:t="http://xmlns.cit.de/intelliform/transaction" t:id="20201202575230443004" t:timestamp="2020-12-02T14:58:43.790Z" t:sender="afm.schleswig-holstein.de" t:form="Sonderfall ohne Daten, dafür aber mit langem Titel und Sonderzeichen wie Äöüß nach §§123ff. & -45-" t:form-id="eOhne/eDaten" t:customer="Einheitlicher Ansprechpartner" t:customer-id="ea-sh" t:client="Schleswig-Holstein" t:client-id="land"> -</myForm> diff --git a/semantik-adapter/src/test/resources/intelliform/andererName-Daten.xml b/semantik-adapter/src/test/resources/intelliform/andererName-Daten.xml deleted file mode 100644 index 525f02ac567c56c796076744b993ab31fc97e997..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/test/resources/intelliform/andererName-Daten.xml +++ /dev/null @@ -1,14 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<myForm xmlns:pdf="http://xmlns.cit.de/assistants/pdf" - xmlns:t="http://xmlns.cit.de/intelliform/transaction" - t:id="20201118365670866101" t:timestamp="2020-11-18T09:09:27.627Z" - t:sender="afm.schleswig-holstein.de" - t:form="Kleiner Waffenschein gem. § 10 Abs. 4 Satz 4 Waffengesetz (WaffG)" - t:form-id="waffen/kleinerWaffenschein" - t:customer="Einheitlicher Ansprechpartner" t:customer-id="ea-sh" - t:client="Schleswig-Holstein" t:client-id="land"> - - <zustaendigestelle> - <OrganisationseinheitenID>0815</OrganisationseinheitenID> - </zustaendigestelle> -</myForm> \ No newline at end of file diff --git a/semantik-adapter/src/test/resources/junit-platform.properties b/semantik-adapter/src/test/resources/junit-platform.properties deleted file mode 100644 index 1cebb76d5a58ac034b2627d12411d82d1e85821e..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/test/resources/junit-platform.properties +++ /dev/null @@ -1 +0,0 @@ -junit.jupiter.extensions.autodetection.enabled = true \ No newline at end of file diff --git a/semantik-adapter/src/test/resources/mantelantrag/4620-EH6C_7d703670-15b6-42b2-8cd1-88a7e4c494b9_Antrag_Max_Mustermann_SGBXII.xml b/semantik-adapter/src/test/resources/mantelantrag/4620-EH6C_7d703670-15b6-42b2-8cd1-88a7e4c494b9_Antrag_Max_Mustermann_SGBXII.xml deleted file mode 100644 index 3872cdb8d4bbff8112620fdc044f0bc70aeb6468..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/test/resources/mantelantrag/4620-EH6C_7d703670-15b6-42b2-8cd1-88a7e4c494b9_Antrag_Max_Mustermann_SGBXII.xml +++ /dev/null @@ -1,253 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<myForm xmlns:t="http://xmlns.cit.de/intelliform/transaction" - xmlns:u="http://xmlns.cit.de/intelliform/user" t:uuid="87812a84-a463-4922-b8dd-f1d0d7c5f0d7" - t:id="20240620346740905800" - t:timestamp="2024-06-20T07:37:54.042Z" - t:sender="stage.afm.schleswig-holstein.de" - t:form="Antrag auf Leistungen der Eingliederungshilfe und/oder Sozialhilfe" - t:form-id="maa_mantelantrag/maa_mantelantrag" t:customer="Schleswig-Holstein" - t:customer-id="sh" t:client="Schleswig-Holstein" t:client-id="land" t:lang="de" - u:FamilyNames="Team" u:PrincipalType="Citizen" u:Username="noreply@ozg-sh.de" - u:CitizenProfileType="Standard" u:username="605b5b10-0c3c-4b2d-247c-08da6f152b74" u:GivenNames="OZG-Cloud" - u:AssuranceLevel="Low" u:Title="Herr" u:displayName="OZG-Cloud Team" u:mailAddress="noreply@ozg-sh.de" - u:EmailAddress="noreply@ozg-sh.de" u:firstName="OZG-Cloud" u:lastName="Team" t:required-login-level="LOW" - t:effective-login-level="LOW"> - <gebiets_id>9007404</gebiets_id> - <egh_sgb9>false</egh_sgb9> - <hzl>false</hzl> - <grusi>false</grusi> - <hzg>false</hzg> - <hzp>true</hzp> - <ambulant_stationaer>ambulant</ambulant_stationaer> - <hzuebss>false</hzuebss> - <hial>false</hial> - <ambulant>true</ambulant> - <stationaer>false</stationaer> - <sessionid>e898afa9-6f12-49f9-85fc-b52b86492640</sessionid> - <anliegen_id>[8936847]</anliegen_id> - <anliegen_namen>[Ambulante Hilfe zur Pflege]</anliegen_namen> - <TypenIDLN>233034601</TypenIDLN> - <logopath1/> - <logopath2/> - <logopath3/> - <gebiet_typid>300004</gebiet_typid> - <gebiet_parent_id1>9006398</gebiet_parent_id1> - <gebiet_parent_typid1>300003</gebiet_parent_typid1> - <gebiet_parent_id2>9006398</gebiet_parent_id2> - <gebiet_parent_typid2>300003</gebiet_parent_typid2> - <gebiet_parent_id3>9006398</gebiet_parent_id3> - <gebiet_parent_typid3>300003</gebiet_parent_typid3> - <gebiet_parent_name3>Segeberg</gebiet_parent_name3> - <oeid>[266235917]</oeid> - <link_datenschutz>https://www.segeberg.de/datenschutz</link_datenschutz> - <link_datenschutz2/> - <link_datenschutz3/> - <link_bankgeheimnis> - https://test.afm.schleswig-holstein.de/intelliform/templates/land/default/default/maa_mantelantrag/Erklaerung_Befreiung_vom_Bankgeheimnis.pdf - </link_bankgeheimnis> - <link_grundsicherung> - https://test.afm.schleswig-holstein.de/intelliform/templates/land/default/default/maa_mantelantrag/Anlage_Erklaerung_zur_Zahlung_von_Grundsicherungsleistungen_an_Leistungserbringer.pdf - </link_grundsicherung> - <link_schweigepflicht> - https://test.afm.schleswig-holstein.de/intelliform/templates/land/default/default/maa_mantelantrag/Schweigepflichtentbindung.pdf - </link_schweigepflicht> - <link_abtretung> - https://test.afm.schleswig-holstein.de/intelliform/templates/land/default/default/maa_mantelantrag/Anlage_Einverstaendniserklaerung_und_Abtretung.pdf - </link_abtretung> - <link_wahrheit> - https://test.afm.schleswig-holstein.de/intelliform/templates/land/default/default/maa_mantelantrag/Erklaerung_der_antragstellenden_Person.pdf - </link_wahrheit> - <kontaktsystem_oeid>123</kontaktsystem_oeid> - <OrganisationseinheitenBEZEICHNUNG>Kreis Segeberg - Soziale Sicherung</OrganisationseinheitenBEZEICHNUNG> - <zust_strasse>Hamburger Straße</zust_strasse> - <zust_hausnummer>30</zust_hausnummer> - <zust_postleitzahl>23795</zust_postleitzahl> - <ortid>9007404</ortid> - <zust_ort>Bad Segeberg</zust_ort> - <zust_telefonnummer>+49 4551 9519438</zust_telefonnummer> - <zust_faxnummer/> - <zust_emailadresse>sozialplanung@segeberg.de</zust_emailadresse> - <zustellung_nachrichtenbroker>afmsh:ozg-cloud-utopia-test</zustellung_nachrichtenbroker> - <zustellung_email_ln/> - <zustellung_webservice/> - <kontaktsystem_oeid2>321</kontaktsystem_oeid2> - <OrganisationseinheitenBEZEICHNUNG2/> - <zust_strasse2/> - <zust_hausnummer2/> - <zust_postleitzahl2/> - <ortid2/> - <zust_ort2/> - <zust_telefonnummer2/> - <zust_faxnummer2/> - <zust_emailadresse2/> - <zustellung_nachrichtenbroker2>afmsh:ozg-cloud-bad-segeberg-kreis</zustellung_nachrichtenbroker2> - <zustellung_email_ln2/> - <zustellung_webservice2/> - <kontaktsystem_oeid3>444</kontaktsystem_oeid3> - <OrganisationseinheitenBEZEICHNUNG3/> - <zust_strasse3/> - <zust_hausnummer3/> - <zust_postleitzahl3/> - <ortid3/> - <zust_ort3/> - <zust_telefonnummer3/> - <zust_faxnummer3/> - <zust_emailadresse3/> - <zustellung_nachrichtenbroker3>gae:ozg-cloud-itcase-test</zustellung_nachrichtenbroker3>> - <zustellung_email_ln3/> - <zustellung_webservice3/> - <grund>Hilfe</grund> - <ambulante_hilfen>Hilfe</ambulante_hilfen> - <nur_egh>false</nur_egh> - <nur_blindenhilfe>false</nur_blindenhilfe> - <nur_pers_angaben>false</nur_pers_angaben> - <nur_pers_mehrbedarfe>false</nur_pers_mehrbedarfe> - <antragsteller> - <anrede/> - <titel/> - <pers_nachname>Mustermann</pers_nachname> - <geburtsname/> - <pers_vorname>Max</pers_vorname> - <geburtsdatum>2000-01-15</geburtsdatum> - <geburtsort/> - <sh_strasse>Musterstrasse</sh_strasse> - <sh_hausnummer>123</sh_hausnummer> - <adresszusatz/> - <sh_plz>23795</sh_plz> - <ort>Bad Segeberg</ort> - <kont_email/> - <telefon/> - <mobiltelefon/> - <familienstand>ledig</familienstand> - <deutsch>deutsch</deutsch> - <a_ausweisdokument>false</a_ausweisdokument> - <erwerb/> - <erwerbsunfaehig/> - <betreuer>false</betreuer> - <partner>false</partner> - <kont_telefonnummer/> - </antragsteller> - <angaben_antragsteller> - <sozialhilfe_p>Nein</sozialhilfe_p> - <eingliederungshilfe>Nein</eingliederungshilfe> - <leistungen/> - <rentenantrag/> - <rentenbeitraege/> - <auslandserwerb/> - <lebensunterhalt>Arbeit</lebensunterhalt> - <zuzug>false</zuzug> - <pflege_noetig>false</pflege_noetig> - <haushaltshilfe_noetig/> - <pflegesachleistung_noetig/> - <pflegegeld_noetig/> - <pflegeleistungen_noetig/> - <ansprueche_dritte>false</ansprueche_dritte> - <stoerung_vorhanden>false</stoerung_vorhanden> - <sozialhilfe>Nein</sozialhilfe> - </angaben_antragsteller> - <weitere_personen>false</weitere_personen> - <familienangehoerige>false</familienangehoerige> - <fin_antragsteller> - <groesse_wohnung unit="m2"/> - <untervermietet_wohnung unit="m2"/> - <raeume/> - <baujahr/> - <wohnung_kosten unit="Euro"/> - <betriebskosten unit="Euro"/> - <heizkosten unit="Euro"/> - <heizart/> - <a_mietvertrag>false</a_mietvertrag> - <pauschalmiete unit="Euro"/> - <warmwasser/> - <wohngeld/> - </fin_antragsteller> - <ver> - <ver-item> - <name_id>a</name_id> - <versicherung_vorhanden>false</versicherung_vorhanden> - <name>Max Mustermann</name> - <fruehere_kv_vorhanden/> - <frueherer_erwerb_v/> - <bedarf_hzg/> - <kuenftige_kv/> - </ver-item> - </ver> - <mehr> - <mehr-item> - <name_id>a</name_id> - <schwanger/> - <alleinerziehend/> - <teure_ernaehrung/> - <mittagsverpflegung/> - <schulbuecher/> - <sonderbedarf/> - <name>Max Mustermann</name> - </mehr-item> - </mehr> - <einkommen_xii> - <einkommen_xii-item> - <name_id>a</name_id> - <nselbststaendig_vorhanden>false</nselbststaendig_vorhanden> - <gewerbe_vorhanden>false</gewerbe_vorhanden> - <landwirtschaft_vorhanden>false</landwirtschaft_vorhanden> - <vermietung_vorhanden>false</vermietung_vorhanden> - <kapital_vorhanden>false</kapital_vorhanden> - <krankenkasse_vorhanden>false</krankenkasse_vorhanden> - <pflegekasse_vorhanden>false</pflegekasse_vorhanden> - <bg_vorhanden>false</bg_vorhanden> - <alg_vorhanden>false</alg_vorhanden> - <leistungen_afa_vorhanden>false</leistungen_afa_vorhanden> - <grusi_vorhanden>false</grusi_vorhanden> - <kindergeld_vorhanden>false</kindergeld_vorhanden> - <elterngeld_vorhanden>false</elterngeld_vorhanden> - <rente_inland_vorhanden>false</rente_inland_vorhanden> - <rente_ausland_vorhanden>false</rente_ausland_vorhanden> - <rente_sonstige_vorhanden>false</rente_sonstige_vorhanden> - <unterhalt_vorhanden>false</unterhalt_vorhanden> - <bafoeg_vorhanden>false</bafoeg_vorhanden> - <baukindergeld_vorhanden>false</baukindergeld_vorhanden> - <blindengeld_vorhanden>false</blindengeld_vorhanden> - <vwl_vorhanden>false</vwl_vorhanden> - <sonstiges_vorhanden>false</sonstiges_vorhanden> - <einkommen_gepfaendet>false</einkommen_gepfaendet> - <einkommen_vorhanden>false</einkommen_vorhanden> - <name>Max Mustermann</name> - </einkommen_xii-item> - </einkommen_xii> - <vermoegen> - <vermoegen-item> - <name_id>a</name_id> - <bargeld_vorhanden>false</bargeld_vorhanden> - <konto_vorhanden>false</konto_vorhanden> - <sparguthaben_vorhanden>false</sparguthaben_vorhanden> - <altersvorsorge_vorhanden>false</altersvorsorge_vorhanden> - <bausparvertraege_vorhanden>false</bausparvertraege_vorhanden> - <aktien_vorhanden>false</aktien_vorhanden> - <paypal_vorhanden>false</paypal_vorhanden> - <lebensversicherung_vorhanden>false</lebensversicherung_vorhanden> - <kfz_vorhanden>false</kfz_vorhanden> - <sachwerte_vorhanden>false</sachwerte_vorhanden> - <haus_vorhanden>false</haus_vorhanden> - <hypotheken_vorhanden>false</hypotheken_vorhanden> - <erbschaft_vorhanden>false</erbschaft_vorhanden> - <sonstiges_vorhanden>false</sonstiges_vorhanden> - <veraeusserung_vermoegen>false</veraeusserung_vermoegen> - <vermoegen_vorhanden>false</vermoegen_vorhanden> - <name>Max Mustermann</name> - </vermoegen-item> - </vermoegen> - <datenerhebung>true</datenerhebung> - <vollstaendigkeit>true</vollstaendigkeit> - <a_befreiung_bankgeheimnis>false</a_befreiung_bankgeheimnis> - <a_entbindung_schweigepflicht>false</a_entbindung_schweigepflicht> - <name_bank/> - <iban/> - <kontoinhaber/> - <name_pdf>Antrag_Max_Mustermann_SGBXII</name_pdf> - <postfachnachicht>Sehr geehrte/r Antragsteller*in,<br/><br/>Ihr Antrag wurde erfolgreich übermittelt.<br/><br/>Bitte - denken Sie daran, zur Vervollständigung Ihres Antrages die unterschriebenen Dokumente und erforderlichen - Nachweise einzureichen.<br/><br/>Die Bearbeitung Ihres Antrages ist erst nach Vorlage aller - erforderlichen Dokumente und Nachweise möglich.<br/><br/><br/>Mit freundlichen Grüßen<br/><br/>Kreis - Segeberg - Soziale Sicherung<br/>Hamburger Straße 30<br/>23795 Bad Segeberg - </postfachnachicht> -</myForm> \ No newline at end of file diff --git a/semantik-adapter/src/test/resources/mantelantrag/4620-EH6C_b3c9168a-6ae9-4361-8b2f-6837bb341021_Geschaeftsgang.Geschaeftsgang.0201.xml b/semantik-adapter/src/test/resources/mantelantrag/4620-EH6C_b3c9168a-6ae9-4361-8b2f-6837bb341021_Geschaeftsgang.Geschaeftsgang.0201.xml deleted file mode 100644 index 6054acb59996d3a71da066dc3bd6956506c35460..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/test/resources/mantelantrag/4620-EH6C_b3c9168a-6ae9-4361-8b2f-6837bb341021_Geschaeftsgang.Geschaeftsgang.0201.xml +++ /dev/null @@ -1,125 +0,0 @@ -<?xml version="1.0"?> -<xdomea:Geschaeftsgang.Geschaeftsgang.0201 xmlns:xdomea="http://www.xdomea.de/V2.0.1"> - <xdomea:Kopf> - <xdomea:ProzessID>b3c9168a-6ae9-4361-8b2f-6837bb341021</xdomea:ProzessID> - <xdomea:Nachrichtentyp codeName="Geschaeftsgang.Geschaeftsgang.0201" codelistAgencyName="AG XDOMEA des KoopA ADV" codelistVersionIdentifier="2.0.0" languageCode="de" codelistName="Nachrichtentyp">0201</xdomea:Nachrichtentyp> - <xdomea:Erstellungszeitpunkt>2024-06-20T09:55:04.420+02:00</xdomea:Erstellungszeitpunkt> - <xdomea:Absender> - <xdomea:Behoerdenkennung> - <xdomea:Kennung codeName="WebMethod_Online-Dienste">WebMethod_Online-Dienste</xdomea:Kennung> - <xdomea:Praefix codeName="afmsh:">afmsh:</xdomea:Praefix> - </xdomea:Behoerdenkennung> - <xdomea:Institution> - <xdomea:Name>Schleswig-Holstein</xdomea:Name> - <xdomea:Kurzbezeichnung>Schleswig-Holstein</xdomea:Kurzbezeichnung> - </xdomea:Institution> - </xdomea:Absender> - <xdomea:Empfaenger> - <xdomea:Behoerdenkennung> - <xdomea:Kennung codeName="ozg-cloud-utopia-test">ozg-cloud-utopia-test</xdomea:Kennung> - <xdomea:Praefix codeName="afmsh:">afmsh:</xdomea:Praefix> - </xdomea:Behoerdenkennung> - </xdomea:Empfaenger> - <xdomea:SendendesSystem> - <xdomea:InstanzID>AFMSH.MSR</xdomea:InstanzID> - <xdomea:Produktname>MSR</xdomea:Produktname> - <xdomea:Version>10.5</xdomea:Version> - </xdomea:SendendesSystem> - <xdomea:EmpfangsbestaetigungAnInitiator>false</xdomea:EmpfangsbestaetigungAnInitiator> - <xdomea:EmpfangsbestaetigungAnVorgaenger>false</xdomea:EmpfangsbestaetigungAnVorgaenger> - </xdomea:Kopf> - <xdomea:Hauptobjekt> - <xdomea:Dokument> - <xdomea:Identifikation> - <xdomea:ID>4e31a750-4988-48f6-928e-066c98238173</xdomea:ID> - </xdomea:Identifikation> - <xdomea:AllgemeineMetadaten> - <xdomea:Betreff>Antrag auf Leistungen der Eingliederungshilfe und/oder Sozialhilfe</xdomea:Betreff> - <xdomea:Kennzeichen>20240620346740905800</xdomea:Kennzeichen> - </xdomea:AllgemeineMetadaten> - <xdomea:Posteingangsdatum>2024-06-20</xdomea:Posteingangsdatum> - <xdomea:Typ>maa_mantelantrag/maa_mantelantrag</xdomea:Typ> - <xdomea:Version> - <xdomea:Nummer>0.0</xdomea:Nummer> - <xdomea:Format> - <xdomea:Name codeName="xml - eXtensible Markup Language" codelistAgencyName="AG XDOMEA des KoopA ADV" codelistVersionIdentifier="2.0.0" languageCode="de" codelistName="Dateiformat">030</xdomea:Name> - <xdomea:Version>0.0</xdomea:Version> - <xdomea:Primaerdokument> - <xdomea:Dateiname>7d703670-15b6-42b2-8cd1-88a7e4c494b9_Antrag_Max_Mustermann_SGBXII.xml</xdomea:Dateiname> - </xdomea:Primaerdokument> - </xdomea:Format> - </xdomea:Version> - <xdomea:Version> - <xdomea:Nummer>0.0</xdomea:Nummer> - <xdomea:Format> - <xdomea:Name codeName="pdf - Portable Document Format" codelistAgencyName="AG XDOMEA des KoopA ADV" codelistVersionIdentifier="2.0.0" languageCode="de" codelistName="Dateiformat">018</xdomea:Name> - <xdomea:Version>0.0</xdomea:Version> - <xdomea:Primaerdokument> - <xdomea:Dateiname>90c53ff4-259b-4165-8ad3-9dda32235ca2_Antrag_Max_Mustermann_SGBXII.pdf</xdomea:Dateiname> - </xdomea:Primaerdokument> - </xdomea:Format> - </xdomea:Version> - </xdomea:Dokument> - </xdomea:Hauptobjekt> - <xdomea:ExternerGeschaeftsgang> - <xdomea:Identifikation> - <xdomea:ID>69f5c99d-8f53-448a-b800-cf165d40392e</xdomea:ID> - </xdomea:Identifikation> - <xdomea:Beteiligungsschritt> - <xdomea:Nummer>1</xdomea:Nummer> - <xdomea:Status codeName="zukuenftig" codelistAgencyName="AG XDOMEA des KoopA ADV" codelistVersionIdentifier="2.0.0" languageCode="de" codelistName="Beteiligungsstatus">001</xdomea:Status> - <xdomea:Verfuegung> - <xdomea:Ersteller> - <xdomea:Behoerdenkennung> - <xdomea:Kennung codeName="WebMethod_Online-Dienste">WebMethod_Online-Dienste</xdomea:Kennung> - <xdomea:Praefix codeName="afmsh:">afmsh:</xdomea:Praefix> - </xdomea:Behoerdenkennung> - </xdomea:Ersteller> - <xdomea:Adressat> - <xdomea:Behoerdenkennung> - <xdomea:Kennung codeName="ozg-cloud-utopia-test">ozg-cloud-utopia-test</xdomea:Kennung> - <xdomea:Praefix codeName="afmsh:">afmsh:</xdomea:Praefix> - </xdomea:Behoerdenkennung> - </xdomea:Adressat> - <xdomea:Erstellungsdatum>2024-06-20</xdomea:Erstellungsdatum> - <xdomea:Erstellungsuhrzeit>09:55:03</xdomea:Erstellungsuhrzeit> - </xdomea:Verfuegung> - </xdomea:Beteiligungsschritt> - </xdomea:ExternerGeschaeftsgang> - <xdomea:Anlage> - <xdomea:Dokument> - <xdomea:Identifikation> - <xdomea:ID>9c0d0202-f193-47e6-bd3e-f230b240c41b</xdomea:ID> - </xdomea:Identifikation> - <xdomea:Typ>Anlage</xdomea:Typ> - <xdomea:Version> - <xdomea:Nummer>1</xdomea:Nummer> - <xdomea:Format> - <xdomea:Name codeName="xml - eXtensible Markup Language" codelistAgencyName="AG XDOMEA des KoopA ADV" codelistVersionIdentifier="2.0.0" languageCode="de" codelistName="Dateiformat">030</xdomea:Name> - <xdomea:Version>0.0</xdomea:Version> - <xdomea:Primaerdokument> - <xdomea:Dateiname>799220b6-df8a-482c-a451-62916a558b1a_SAML-Assertion.xml</xdomea:Dateiname> - </xdomea:Primaerdokument> - </xdomea:Format> - </xdomea:Version> - </xdomea:Dokument> - </xdomea:Anlage> - <xdomea:Anlage> - <xdomea:Dokument> - <xdomea:Identifikation> - <xdomea:ID>fa8c3b9e-db49-4094-bb2e-09ea4557f1d1</xdomea:ID> - </xdomea:Identifikation> - <xdomea:Typ>Anlage</xdomea:Typ> - <xdomea:Version> - <xdomea:Nummer>1</xdomea:Nummer> - <xdomea:Format> - <xdomea:Name codeName="xml - eXtensible Markup Language" codelistAgencyName="AG XDOMEA des KoopA ADV" codelistVersionIdentifier="2.0.0" languageCode="de" codelistName="Dateiformat">030</xdomea:Name> - <xdomea:Version>0.0</xdomea:Version> - <xdomea:Primaerdokument> - <xdomea:Dateiname>aeb3e272-de0d-46b4-9340-6358035facea_EmailBodyBuergerTemplate.xml</xdomea:Dateiname> - </xdomea:Primaerdokument> - </xdomea:Format> - </xdomea:Version> - </xdomea:Dokument> - </xdomea:Anlage> -</xdomea:Geschaeftsgang.Geschaeftsgang.0201> \ No newline at end of file diff --git a/semantik-adapter/src/test/resources/xta/Beispieldatensatz_Fachnachricht.xml b/semantik-adapter/src/test/resources/xta/Beispieldatensatz_Fachnachricht.xml deleted file mode 100644 index 618c4813e1803a0619c68920505c9ee7cb303b12..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/test/resources/xta/Beispieldatensatz_Fachnachricht.xml +++ /dev/null @@ -1,32 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<application xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.dataport.de/dFAD/ApplicationDataMessageSchema"> - <ApplicationFormId>08db3c1c-db1f-4d27-8dec-73af167e87f2</ApplicationFormId> - <Timestamp>2023-04-18T11:40:24.9940624+02:00</Timestamp> - <ApplicationDataMessageVersion>1</ApplicationDataMessageVersion> - <Title>Testantrag XML-Fachnachricht-Erweiterung</Title> - <ProjectName>XML-Fachnachricht-Erweiterung</ProjectName> - <ProjectTitle>XML-Fachnachricht-Erweiterung</ProjectTitle> - <TransmittedApplicationId>7AtSMHpx3LfJp4</TransmittedApplicationId> - <InboxReference>sh/sh/4dd01647-b9d9-4775-1b50-08da3d83800a</InboxReference> - <MetaText1>9795669</MetaText1> - <Pages> - <Page> - <Title>Beispiel Seite 1</Title> - <Navigation>Beispiel Seite 1</Navigation> - <Controls> - <Control> - <RadioButtonGroup> - <Label>Beispiel-Steuerelement</Label> - <Alias>beispiel-element</Alias> - <SelectedItems> - <SelectedItem> - <Label>Beispielwert 2</Label> - <Value>bsp-2</Value> - </SelectedItem> - </SelectedItems> - </RadioButtonGroup> - </Control> - </Controls> - </Page> - </Pages> -</application> \ No newline at end of file diff --git a/semantik-adapter/src/test/resources/zip-file-0.txt b/semantik-adapter/src/test/resources/zip-file-0.txt deleted file mode 100644 index 7073e6590de64929654c9b7ce15f138e4e980836..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/test/resources/zip-file-0.txt +++ /dev/null @@ -1,2 +0,0 @@ -Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. - diff --git a/semantik-adapter/src/test/resources/zip-file-1.txt b/semantik-adapter/src/test/resources/zip-file-1.txt deleted file mode 100644 index cc0e7610296f49ef5ac08a29313824db875b52ed..0000000000000000000000000000000000000000 --- a/semantik-adapter/src/test/resources/zip-file-1.txt +++ /dev/null @@ -1,796 +0,0 @@ -Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. - -Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. - -Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. - -At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. - -Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. - -Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. - -Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. - -At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. - -Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. - -Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. - -Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. - -At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. - -Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. - -Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. - -Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. - -At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. - -Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. - -Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. - -Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. - -At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. - -Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. - -Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. - -Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. - -At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. - -Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. - -Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. - -Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. - -At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. - -Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. - -Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. - -Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. - -At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. - -Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. - -Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. - -Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. - -At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. - -Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. - -Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. - -Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. - -At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. - -Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. - -Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. - -Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. - -At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. - -Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. - -Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. - -Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. - -At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. - -Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. - -Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. - -Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. - -At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. - -Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. - -Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. - -Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. - -At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. - -Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. - -Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. - -Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. - -At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. - -Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. - -Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. - -Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. - -At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. - -Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. - -Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. - -Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. - -At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. - -Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. - -Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. - -Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. - -At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. - -Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. - -Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. - -Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. - -At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. - -Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. - -Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. - -Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. - -At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. - -Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. - -Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. - -Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. - -At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. - -Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. - -Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. - -Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. - -At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. - -Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. - -Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. - -Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. - -At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. - -Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. - -Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. - -Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. - -At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. - -Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. - -Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. - -Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. - -At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. - -Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. - -Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo - -Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. - -Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. - -Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. - -At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. - -Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. - -Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. - -Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. - -At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. - -Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. - -Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. - -Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. - -At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. - -Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. - -Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. - -Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. - -At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. - -Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. - -Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. - -Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. - -At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. - -Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. - -Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. - -Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. - -At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. - -Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. - -Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. - -Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. - -At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. - -Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. - -Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. - -Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. - -At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. - -Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. - -Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. - -Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. - -At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. - -Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. - -Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. - -Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. - -At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. - -Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. - -Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. - -Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. - -At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. - -Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. - -Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. - -Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. - -At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. - -Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. - -Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. - -Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. - -At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. - -Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. - -Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. - -Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. - -At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. - -Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. - -Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. - -Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. - -At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. - -Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. - -Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. - -Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. - -At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. - -Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. - -Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. - -Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. - -At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. - -Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. - -Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. - -Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. - -At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. - -Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. - -Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. - -Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. - -At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. - -Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. - -Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. - -Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. - -At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. - -Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. - -Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. - -Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. - -At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. - -Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. - -Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. - -Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. - -At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. - -Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. - -Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. - -Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. - -At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. - -Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. - -Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. - -Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. - -At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. - -Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. - -Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. - -Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. - -At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. - -Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. - -Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo - -orem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. - -Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. - -Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. - -At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. - -Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. - -Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. - -orem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. - -Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. - -Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. - -At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. - -Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. - -Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. - -orem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. - -Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. - -Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. - -At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. - -Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. - -Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. - -orem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. - -Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. - -Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. - -At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. - -Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. - -Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. - -orem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. - -Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. - -Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. - -At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. - -Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. - -Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. - -Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. - -orem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. - -Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. - -Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. - -At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. - -Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. - -Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. - -orem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. - -Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. - -Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. - -At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. - -Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. - -Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. - - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. - -Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. - -Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. - -At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. - -Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. - -Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. - - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. - -Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. - -Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. - -At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. - -Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. - -Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. - - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. - -Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. - -Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. - -At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. - -Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. - -Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. - -Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. - -augue duis dolore te feugait nulla facilisi. augue duis dolore te feugait nulla facilisi. augue duis dolore te feugait nulla facilisi. augue duis dolore te feugait nulla facilisi. augue duis dolore te feugait nulla facilisi. augue duis dolore te feugait nulla facilisi. augue duis dolore te feugait nulla facilisi. - -augue duis dolore te feugait nulla facilisi. augue duis dolore te feugait nulla facilisi. augue duis dolore te feugait nulla facilisi. augue duis dolore te feugait nulla facilisi. augue duis dolore te feugait nulla facilisi. augue duis dolore te feugait nulla facilisi. augue duis dolore te feugait nulla facilisi. - -augue duis dolore te feugait nulla facilisi. augue duis dolore te feugait nulla facilisi. augue duis dolore te feugait diff --git a/semantik-adapter/src/test/resources/zipbombs/filewithmanyfiles.dat.zip b/semantik-adapter/src/test/resources/zipbombs/filewithmanyfiles.dat.zip deleted file mode 100644 index 028b50d4663558eb718abfe2b568d6ac1671521c..0000000000000000000000000000000000000000 Binary files a/semantik-adapter/src/test/resources/zipbombs/filewithmanyfiles.dat.zip and /dev/null differ diff --git a/semantik-adapter/src/test/resources/zipbombs/filewithnulls.dat.zip b/semantik-adapter/src/test/resources/zipbombs/filewithnulls.dat.zip deleted file mode 100644 index 2648814ae1d461b3812d16e8274af15041925c26..0000000000000000000000000000000000000000 Binary files a/semantik-adapter/src/test/resources/zipbombs/filewithnulls.dat.zip and /dev/null differ diff --git a/sonar-project.properties b/sonar-project.properties index 8660b9e44335323e02f6aaa513605e4a34635db9..ae83713112d772df03c834293f860d4ffdea0c9f 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -1,13 +1,13 @@ # # Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den -# Ministerpräsidenten des Landes Schleswig-Holstein +# Ministerpr�sidenten des Landes Schleswig-Holstein # Staatskanzlei # Abteilung Digitalisierung und zentrales IT-Management der Landesregierung # # Lizenziert unter der EUPL, Version 1.2 oder - sobald -# diese von der Europäischen Kommission genehmigt wurden - +# diese von der Europ�ischen Kommission genehmigt wurden - # Folgeversionen der EUPL ("Lizenz"); -# Sie dürfen dieses Werk ausschließlich gemäß +# Sie d�rfen dieses Werk ausschlie�lich gem�� # dieser Lizenz nutzen. # Eine Kopie der Lizenz finden Sie hier: # @@ -16,11 +16,16 @@ # Sofern nicht durch anwendbare Rechtsvorschriften # gefordert oder in schriftlicher Form vereinbart, wird # die unter der Lizenz verbreitete Software "so wie sie -# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - -# ausdrücklich oder stillschweigend - verbreitet. -# Die sprachspezifischen Genehmigungen und Beschränkungen +# ist", OHNE JEGLICHE GEW�HRLEISTUNG ODER BEDINGUNGEN - +# ausdr�cklich oder stillschweigend - verbreitet. +# Die sprachspezifischen Genehmigungen und Beschr�nkungen # unter der Lizenz sind dem Lizenztext zu entnehmen. # sonar.java.coveragePlugin=jacoco -sonar.jacoco.reportPath=target/jacoco.exec \ No newline at end of file +sonar.jacoco.reportPath=target/jacoco.exec +sonar.projectKey=formsolutions-adapter +sonar.test.inclusions=**/*.java +sonar.exclusions=**/target/** +sonar.sourceEncoding=UTF-8 +sonar.projectName=FormSolutions-Adapter diff --git a/src/main/helm/Chart.yaml b/src/main/helm/Chart.yaml deleted file mode 100644 index 2b05d0cc44865405be7186d55cd52125e5caeddd..0000000000000000000000000000000000000000 --- a/src/main/helm/Chart.yaml +++ /dev/null @@ -1,31 +0,0 @@ -# -# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den -# Ministerpräsidenten des Landes Schleswig-Holstein -# Staatskanzlei -# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung -# -# Lizenziert unter der EUPL, Version 1.2 oder - sobald -# diese von der Europäischen Kommission genehmigt wurden - -# Folgeversionen der EUPL ("Lizenz"); -# Sie dürfen dieses Werk ausschließlich gemäß -# dieser Lizenz nutzen. -# Eine Kopie der Lizenz finden Sie hier: -# -# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 -# -# Sofern nicht durch anwendbare Rechtsvorschriften -# gefordert oder in schriftlicher Form vereinbart, wird -# die unter der Lizenz verbreitete Software "so wie sie -# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - -# ausdrücklich oder stillschweigend - verbreitet. -# Die sprachspezifischen Genehmigungen und Beschränkungen -# unter der Lizenz sind dem Lizenztext zu entnehmen. -# - -apiVersion: v1 -appVersion: "1.1" -description: A Helm chart for Intelliform Adapter -name: Intelliform-Adapter -version: 0.0.0-MANAGED-BY-JENKINS -icon: https://simpleicons.org/icons/helm.svg - diff --git a/src/main/helm/README.md b/src/main/helm/README.md deleted file mode 100644 index 2de2b441e29ccb265bc1114b5e12dfcc4efa825f..0000000000000000000000000000000000000000 --- a/src/main/helm/README.md +++ /dev/null @@ -1,100 +0,0 @@ -# Intelliform Adapter - -Adapter zum empfangen von Formulardaten von einem IntellForm basierten Formularserver, zum Beispiel iAFM (integriertes Antrags- und Formularmanagement). - -## Routingkonfiguration - -### Vorgang-Manager Instanzen - -Für alle Vorgang-Manager-Instanzen, die von dem Adapter erreichbar sein sollen, muss in das _Environment_ ein Eintrag mit dem GRPC-Service ergänzt werden: - -```yaml -grpc.client.vorgang-manager-*vorgang-manager-name*.address:*url und port* -grpc.client.vorgang-manager-*vorgang-manager-name*.negotiationType: PLAINTEXT -``` - -### Fallback Strategy - -Die Fallback Stratey steuert wie mit Eingängen umgegangen werden soll, für die keine passende Vorgang-Manager-Instanze gefunden werden konnte. - -Folgende Optionen stehen zur Verfügung: - -- **DENY** der Antrag wird mit einer Fehlermeldung abgelehnt. Dies funktioniert nur, solange die Abarbeitung synchron erfolgt. - -- **FUNDSTELLE** der Antrag wird an eine zentrale Fundstelle weitergeleitet. Dafür muss der Name der Vorgang-Manager-Instanze, die als Fundstelle fungiert, eingetragen werden. - -### Routing Strategy - -Die Routing Strategy steuert wie das Routing konfiguriert wird und wieviele Vorgang-Manager-Instanzen berücksichtigt werden können. - -Folgende Optionen stehen zur Verfügung: - -- **MULTI** es kann an beliebig viele Vorgang-Manager-Instanzen geroutet werden. Dafür muss in der Environment ein Mapping der Organisationseinheit-Id auf den Namen einer Vorgang-Manager-Instanz konfiguriert werden. - -```yaml -ozgcloud.adapter.organisationseinheiten.*id*: *vorgang-manager-name* -``` - -- **SINGLE** es wird immer nur an eine Vorgang-Manager-Instanze geroutet, der Name der Instanz ist im Feld 'Vorgang-Manager Name' anzugeben. - -### Beispielkonfiguration - -```yaml -env: - springProfiles: "oc, dev" - grpc: - - name: grpc_client_vorgang-manager-test_address - value: "vorgang-manager.test:9090" - - name: grpc_client_vorgang-manager-test_negotiationType - value: PLAINTEXT - - name: ozgcloud.adapter.organisationseinheiten.1357913579 - value: test -image: - tag: snapshot-latest -imageCredentials: - email: webmaster@ozg-sh.de - password: <geheim> - registry: docker.ozg-sh.de - username: ozgcloud -ingress: - host: kiel-afm.dev.by.ozg-cloud.de -replicaCount: 2 -resources: - limits: - cpu: 1 - memory: 1200Mi - requests: - cpu: 100m - memory: 250Mi -global: - cattle: - clusterId: c-8g78g - clusterName: ozg-dev - systemDefaultRegistry: "" - systemDefaultRegistry: "" -routing: - fallbackStrategy: FUNDSTELLE - fundstelleVorgangManagerName: kiel - routingStrategy: MULTI - targetVorgangManagerName: kiel -``` - -### Benutzung beliebiger environment Werte - -In jedem der Projekte kann man beliebige weitere environments setzen. Dazu muss man in der jeweiligen values.yaml unter env.customList ein name value Paar setzen: - -```yaml -env: - customList: - - name: Dinge - value: true - - name: ... - value: ... -``` - -```yaml -env: - customList: - key_1: value_1 - key_2: value_2 -``` \ No newline at end of file diff --git a/src/main/helm/templates/NOTES.txt b/src/main/helm/templates/NOTES.txt deleted file mode 100644 index 0fa4f7107864c675dde045f8f7f09d39e9e2d422..0000000000000000000000000000000000000000 --- a/src/main/helm/templates/NOTES.txt +++ /dev/null @@ -1,24 +0,0 @@ -==== - Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - Ministerpräsidenten des Landes Schleswig-Holstein - Staatskanzlei - Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - - Lizenziert unter der EUPL, Version 1.2 oder - sobald - diese von der Europäischen Kommission genehmigt wurden - - Folgeversionen der EUPL ("Lizenz"); - Sie dürfen dieses Werk ausschließlich gemäß - dieser Lizenz nutzen. - Eine Kopie der Lizenz finden Sie hier: - - https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - - Sofern nicht durch anwendbare Rechtsvorschriften - gefordert oder in schriftlicher Form vereinbart, wird - die unter der Lizenz verbreitete Software "so wie sie - ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - ausdrücklich oder stillschweigend - verbreitet. - Die sprachspezifischen Genehmigungen und Beschränkungen - unter der Lizenz sind dem Lizenztext zu entnehmen. -==== - diff --git a/src/main/helm/templates/_helpers.tpl b/src/main/helm/templates/_helpers.tpl deleted file mode 100644 index a66961e50f3068d6dbd68be3bc801d1860195c3a..0000000000000000000000000000000000000000 --- a/src/main/helm/templates/_helpers.tpl +++ /dev/null @@ -1,109 +0,0 @@ -{{/* vim: set filetype=mustache: */}} - -{{/* error check 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec) */}} -{{/* Namespace */}} -{{- define "app.namespace" -}} -{{- if gt (len (.Release.Namespace)) 63 -}} -{{- fail (printf ".Release.Namespace %s ist zu lang (max. 63 Zeichen)" .Release.Namespace) -}} -{{- end -}} -{{ printf "%s" .Release.Namespace }} -{{- end -}} - -{{/* Chart: Name + Version */}} -{{- define "app.chart" -}} -{{- if gt (len (printf "%s-%s" .Chart.Name .Chart.Version)) 63 -}} -{{- fail (printf ".Chart.Name-.Chart.Version %s-%s ist zu lang (max. 63 Zeichen)" .Chart.Name .Chart.Version) -}} -{{- end -}} -{{ printf "%s-%s" .Chart.Name .Chart.Version }} -{{- end -}} - -{{/* Managed-by -> On Helm, this value is always Helm */}} -{{- define "app.managedBy" -}} -{{- if gt (len (.Release.Service)) 63 -}} -{{- fail (printf ".Release.Service %s ist zu lang (max. 63 Zeichen)" .Release.Service) -}} -{{- end -}} -{{ printf "%s" .Release.Service }} -{{- end -}} - -{{/* Default Labels: Helm recommended best-practice labels https://helm.sh/docs/chart_best_practices/labels/ */}} -{{- define "app.defaultLabels" }} -app.kubernetes.io/instance: afm-adapter -app.kubernetes.io/managed-by: {{ include "app.managedBy" . }} -app.kubernetes.io/name: {{ .Release.Name }} -app.kubernetes.io/part-of: ozgcloud -app.kubernetes.io/version: {{ .Chart.Version }} -app.kubernetes.io/namespace: {{ include "app.namespace" . }} -helm.sh/chart: {{ include "app.chart" . }} -ozg-component: eingangsadapter -{{- end -}} - -{{- define "app.matchLabels" }} -app.kubernetes.io/name: {{ .Release.Name }} -app.kubernetes.io/namespace: {{ include "app.namespace" . }} -{{- end -}} - - -{{- define "app.envSpringProfiles" }} -{{- if (.Values.env).overrideSpringProfiles -}} -{{ printf "%s" (.Values.env).overrideSpringProfiles }} -{{- else -}} -{{ printf "oc, %s" (include "app.ozgcloudEnvironment" . ) }} -{{- end -}} -{{- end -}} - -{{- define "app.ozgcloudEnvironment" -}} -{{- required "Environment muss angegeben sein" (.Values.ozgcloud).environment -}} -{{- end -}} - -{{- define "app.ozgcloudBezeichner" -}} -{{ $length := len (.Values.ozgcloud).bezeichner }} -{{- if ge 46 $length -}} -{{ (.Values.ozgcloud).bezeichner }} -{{- else -}} -{{ required (printf "Bezeichner %s ist zu lang (max. 46 Zeichen)" (.Values.ozgcloud).bezeichner) nil }} -{{- end -}} -{{- end -}} - -{{- define "app.ingress.host" }} -{{- if (.Values.ingress).adapterBezeichner }} -{{- printf "%s-%s.%s" (include "app.ozgcloudBezeichner" .) .Values.ingress.adapterBezeichner .Values.baseUrl }} -{{- else if eq (.Values.image).name "formsolutions-adapter" }} -{{- printf "%s-fs.%s" (include "app.ozgcloudBezeichner" .) .Values.baseUrl }} -{{- else if eq (.Values.image).name "formcycle-adapter" }} -{{- printf "%s-formcycle.%s" (include "app.ozgcloudBezeichner" .) .Values.baseUrl }} -{{- else }} -{{- printf "%s-afm.%s" (include "app.ozgcloudBezeichner" .) .Values.baseUrl }} -{{- end }} -{{- end -}} - -{{- define "app.serviceAccountName" -}} -{{- if (.Values.serviceAccount).name }} -{{- printf "%s" .Values.serviceAccount.name }} -{{- else if eq (.Values.image).name "intelliform-adapter" }} -{{- printf "afm-adapter-service-account" }} -{{- else if eq (.Values.image).name "formsolutions-adapter" }} -{{- printf "fs-adapter-service-account" }} -{{- else if eq (.Values.image).name "formcycle-adapter" }} -{{- printf "formcycle-adapter-service-account" }} -{{- else if eq (.Values.image).name "enterprise-adapter" }} -{{- printf "enterprise-adapter-service-account" }} -{{- end }} -{{- end -}} - -{{- define "app.getCustomList" -}} -{{- with (.Values.env).customList -}} -{{- if kindIs "map" . -}} -{{ include "app.dictToList" . }} -{{- else if kindIs "slice" . -}} -{{ . | toYaml }} -{{- end -}} -{{- end -}} -{{- end -}} - -{{- define "app.dictToList" -}} -{{- $customList := list -}} -{{- range $key, $value := . -}} -{{- $customList = append $customList (dict "name" $key "value" $value) }} -{{- end -}} -{{- $customList | toYaml -}} -{{- end -}} \ No newline at end of file diff --git a/src/main/helm/templates/bindings_type_configmap.yaml b/src/main/helm/templates/bindings_type_configmap.yaml deleted file mode 100644 index 8e4fbacefd484339668748edd53d0f4503a14ac5..0000000000000000000000000000000000000000 --- a/src/main/helm/templates/bindings_type_configmap.yaml +++ /dev/null @@ -1,8 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ .Release.Name }}-bindings-type - namespace: {{ include "app.namespace" . }} -data: - type: | - ca-certificates \ No newline at end of file diff --git a/src/main/helm/templates/deployment.yaml b/src/main/helm/templates/deployment.yaml deleted file mode 100644 index b59bb1cc41fbfbba0098590a4986042bd510300e..0000000000000000000000000000000000000000 --- a/src/main/helm/templates/deployment.yaml +++ /dev/null @@ -1,193 +0,0 @@ -# -# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den -# Ministerpräsidenten des Landes Schleswig-Holstein -# Staatskanzlei -# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung -# -# Lizenziert unter der EUPL, Version 1.2 oder - sobald -# diese von der Europäischen Kommission genehmigt wurden - -# Folgeversionen der EUPL ("Lizenz"); -# Sie dürfen dieses Werk ausschließlich gemäß -# dieser Lizenz nutzen. -# Eine Kopie der Lizenz finden Sie hier: -# -# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 -# -# Sofern nicht durch anwendbare Rechtsvorschriften -# gefordert oder in schriftlicher Form vereinbart, wird -# die unter der Lizenz verbreitete Software "so wie sie -# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - -# ausdrücklich oder stillschweigend - verbreitet. -# Die sprachspezifischen Genehmigungen und Beschränkungen -# unter der Lizenz sind dem Lizenztext zu entnehmen. -# - -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ .Release.Name }} - namespace: {{ include "app.namespace" . }} - labels: - {{- include "app.defaultLabels" . | indent 4 }} -spec: - progressDeadlineSeconds: 600 - replicas: {{ .Values.replicaCount }} - revisionHistoryLimit: 10 - selector: - matchLabels: - {{- include "app.matchLabels" . | indent 6 }} - strategy: - rollingUpdate: - maxSurge: 1 - maxUnavailable: 0 - type: RollingUpdate - template: - metadata: - labels: - {{- include "app.defaultLabels" . | indent 8 }} - component: afm-adapter - spec: - {{- if (.Values.serviceAccount).create }} - serviceAccountName: {{ include "app.serviceAccountName" . }} - {{- end }} - topologySpreadConstraints: - - maxSkew: 1 - topologyKey: kubernetes.io/hostname - whenUnsatisfiable: DoNotSchedule - labelSelector: - matchLabels: - app.kubernetes.io/name: {{ .Release.Name }} - containers: - - env: - - name: SERVICE_BINDING_ROOT - value: "/bindings" - {{- range (.Values.env).grpc }} - - name: {{ .name }} - value: {{ .value }} - {{- end }} - - name: spring_profiles_active - value: {{ include "app.envSpringProfiles" . }} - - name: ozgcloud_adapter_fallbackStrategy - value: {{ (.Values.routing).fallbackStrategy | default "DENY"}} - {{- if (.Values.routing).fundstelleVorgangManagerName}} - - name: ozgcloud_adapter_fundstelleVorgangManagerName - value: {{ .Values.routing.fundstelleVorgangManagerName }} - {{- end }} - - name: ozgcloud_adapter_routingStrategy - value: {{ (.Values.routing).routingStrategy | default "SINGLE"}} - {{- if (.Values.routing).targetVorgangManagerName }} - - name: ozgcloud_adapter_targetVorgangManagerName - value: {{ (.Values.routing).targetVorgangManagerName}} - - name: grpc_client_vorgang-manager-{{ (.Values.routing).targetVorgangManagerName}}_address - value: 'dns:///vorgang-manager.{{ coalesce (.Values.routing).targetNamespace .Release.Namespace }}:9090' - - name: grpc_client_vorgang-manager-{{ (.Values.routing).targetVorgangManagerName}}_negotiationType - value: {{ (.Values.routing).negotiationType | default "TLS" }} - {{- end }} - {{- if eq (.Values.routing).routingStrategy "ZUFI" }} - - name: grpc_client_zufi-manager_address - value: {{ required "routing.zufiManager.address must be set when routingStrategy=ZUFI" ((.Values.routing).zufiManager).address | quote }} - - name: grpc_client_zufi-manager_negotiationType - value: {{ ((.Values.routing).zufiManager).negotiationType | default "PLAINTEXT" }} - {{- end }} - - {{- with include "app.getCustomList" . }} -{{ . | indent 8 }} - {{- end }} - image: "{{ .Values.image.repo }}/{{ .Values.image.name }}:{{ coalesce (.Values.image).tag "latest" }}" - imagePullPolicy: Always - name: intelliform-adapter - ports: - - containerPort: 8080 - name: 8080tcp1 - protocol: TCP - - containerPort: 8081 - name: metrics - protocol: TCP - readinessProbe: - failureThreshold: 3 - httpGet: - path: /actuator/health/readiness - port: 8081 - scheme: HTTP - periodSeconds: 10 - successThreshold: 1 - timeoutSeconds: 3 - startupProbe: - failureThreshold: 10 - httpGet: - path: /actuator/health/readiness - port: 8081 - scheme: HTTP - initialDelaySeconds: 30 - periodSeconds: 5 - successThreshold: 1 - timeoutSeconds: 5 - {{- if .Values.enableLivenessProbe }} - livenessProbe: - failureThreshold: 3 - httpGet: - path: /actuator/health/liveness - port: 8081 - scheme: HTTP - periodSeconds: 10 - successThreshold: 1 - timeoutSeconds: 3 - {{- end }} - resources: - {{- with .Values.resources }} -{{ toYaml . | indent 10 }} - {{- end }} - securityContext: - allowPrivilegeEscalation: false - privileged: false - readOnlyRootFilesystem: false - runAsNonRoot: true - {{- with (.Values.securityContext).runAsUser }} - runAsUser: {{ . }} - {{- end }} - {{- with (.Values.securityContext).runAsGroup }} - runAsGroup: {{ . }} - {{- end }} - {{- with (.Values.securityContext).capabilities }} - capabilities: -{{ toYaml . | indent 12 }} - {{- end }} - stdin: true - terminationMessagePath: /dev/termination-log - terminationMessagePolicy: File - tty: true - volumeMounts: - - name: temp-dir - mountPath: "/tmp" - - name: namespace-ca-cert - mountPath: "/bindings/namespace-certificate" - readOnly: true - volumes: - - name: temp-dir - emptyDir: {} - - name: namespace-ca-cert - projected: - sources: - - secret: - name: {{ include "app.namespace" . }}-ca-cert - optional: true - items: - - key: ca.crt - path: ca.crt - - configMap: - name: {{ .Release.Name }}-bindings-type - dnsConfig: {} - dnsPolicy: ClusterFirst - imagePullSecrets: - - name: {{ required "imagePullSecret must be set" .Values.imagePullSecret }} - restartPolicy: Always - {{- with .Values.hostAliases }} - hostAliases: -{{ toYaml . | indent 8 }} - {{- end }} - schedulerName: default-scheduler - {{- with .Values.podSecurityContext }} - securityContext: -{{ toYaml . | indent 8 }} - {{- end }} - terminationGracePeriodSeconds: 30 \ No newline at end of file diff --git a/src/main/helm/templates/ingress.yaml b/src/main/helm/templates/ingress.yaml deleted file mode 100644 index fa2ba46fea9549d096b59469ce9a3ac821883986..0000000000000000000000000000000000000000 --- a/src/main/helm/templates/ingress.yaml +++ /dev/null @@ -1,67 +0,0 @@ -# -# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den -# Ministerpräsidenten des Landes Schleswig-Holstein -# Staatskanzlei -# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung -# -# Lizenziert unter der EUPL, Version 1.2 oder - sobald -# diese von der Europäischen Kommission genehmigt wurden - -# Folgeversionen der EUPL ("Lizenz"); -# Sie dürfen dieses Werk ausschließlich gemäß -# dieser Lizenz nutzen. -# Eine Kopie der Lizenz finden Sie hier: -# -# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 -# -# Sofern nicht durch anwendbare Rechtsvorschriften -# gefordert oder in schriftlicher Form vereinbart, wird -# die unter der Lizenz verbreitete Software "so wie sie -# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - -# ausdrücklich oder stillschweigend - verbreitet. -# Die sprachspezifischen Genehmigungen und Beschränkungen -# unter der Lizenz sind dem Lizenztext zu entnehmen. -# - -{{- if (.Values.ingress).enabled }} -apiVersion: networking.k8s.io/v1 -kind: Ingress -metadata: - annotations: - {{- with (.Values.ingress).annotations }} -{{ toYaml . | indent 4 }} - {{- end }} - {{- if not (.Values.ingress).disableDefaultCertManager }} - {{- if (.Values.ingress).use_staging_cert }} - cert-manager.io/cluster-issuer: letsencrypt-staging - {{- else }} - cert-manager.io/cluster-issuer: letsencrypt-prod - {{- end }} - {{- end }} - name: {{ .Release.Name }} - namespace: {{ include "app.namespace" . }} -spec: - {{- if and (.Values.ingress).className }} - ingressClassName: {{ .Values.ingress.className }} - {{- end }} - rules: - - http: - paths: - - backend: - service: - port: - number: 8080 - name: {{ .Release.Name }} - path: '' - pathType: ImplementationSpecific - host: {{ include "app.ingress.host" . }} - tls: - - hosts: - - {{ include "app.ingress.host" . }} - {{- if not (.Values.ingress).skipTlsSecret -}} - {{- if (.Values.ingress).tlsSecretName }} - secretName: {{ (.Values.ingress).tlsSecretName }} - {{- else }} - secretName: {{ .Values.ozgcloud.bezeichner }}-{{ .Release.Name }}-tls - {{- end }} - {{- end }} -{{- end -}} \ No newline at end of file diff --git a/src/main/helm/templates/network_policy.yaml b/src/main/helm/templates/network_policy.yaml deleted file mode 100644 index b8183ad098fd1c1a6767d626d035f1b382c9713c..0000000000000000000000000000000000000000 --- a/src/main/helm/templates/network_policy.yaml +++ /dev/null @@ -1,91 +0,0 @@ -# -# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den -# Ministerpräsidenten des Landes Schleswig-Holstein -# Staatskanzlei -# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung -# -# Lizenziert unter der EUPL, Version 1.2 oder - sobald -# diese von der Europäischen Kommission genehmigt wurden - -# Folgeversionen der EUPL ("Lizenz"); -# Sie dürfen dieses Werk ausschließlich gemäß -# dieser Lizenz nutzen. -# Eine Kopie der Lizenz finden Sie hier: -# -# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 -# -# Sofern nicht durch anwendbare Rechtsvorschriften -# gefordert oder in schriftlicher Form vereinbart, wird -# die unter der Lizenz verbreitete Software "so wie sie -# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - -# ausdrücklich oder stillschweigend - verbreitet. -# Die sprachspezifischen Genehmigungen und Beschränkungen -# unter der Lizenz sind dem Lizenztext zu entnehmen. -# - -{{- if not (.Values.networkPolicy).disabled }} -apiVersion: networking.k8s.io/v1 -kind: NetworkPolicy -metadata: - name: network-policy-{{ .Release.Name}} - namespace: {{ .Release.Namespace }} -spec: - podSelector: - matchLabels: - ozg-component: eingangsadapter - policyTypes: - - Ingress - - Egress - ingress: - - ports: - - port: 8080 - - from: - - namespaceSelector: - matchLabels: - name: {{ (.Values.networkPolicy).monitoringNamespace | default "openshift-user-workload-monitoring" }} - ports: - - protocol: TCP - port: 8081 - egress: - - to: - - podSelector: - matchLabels: - component: vorgang-manager - ports: - - port: 9090 - protocol: TCP - - to: - - namespaceSelector: - matchLabels: - kubernetes.io/metadata.name: {{ required "networkPolicy.dnsServerNamespace must be set" (.Values.networkPolicy).dnsServerNamespace }} - ports: - - port: 53 - protocol: UDP - - port: 53 - protocol: TCP - - port: 5353 - protocol: UDP - - port: 5353 - protocol: TCP - -{{- if eq (.Values.routing).routingStrategy "ZUFI" }} - - to: - - namespaceSelector: - matchLabels: - kubernetes.io/metadata.name: {{ required "routing.zufiManager.namespace must be set if routingStrategy=ZUFI" ((.Values.routing).zufiManager).namespace }} - podSelector: - matchLabels: - component: zufi-server - ports: - - port: 9090 - protocol: TCP - - to: - - namespaceSelector: {} - podSelector: - matchLabels: - component: vorgang-manager - ports: - - port: 9090 - protocol: TCP -{{- end }} - -{{- end }} \ No newline at end of file diff --git a/src/main/helm/templates/service.yaml b/src/main/helm/templates/service.yaml deleted file mode 100644 index 93574b29b45f4157a6c0dafbd69b2ed60a25a9f2..0000000000000000000000000000000000000000 --- a/src/main/helm/templates/service.yaml +++ /dev/null @@ -1,45 +0,0 @@ -# -# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den -# Ministerpräsidenten des Landes Schleswig-Holstein -# Staatskanzlei -# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung -# -# Lizenziert unter der EUPL, Version 1.2 oder - sobald -# diese von der Europäischen Kommission genehmigt wurden - -# Folgeversionen der EUPL ("Lizenz"); -# Sie dürfen dieses Werk ausschließlich gemäß -# dieser Lizenz nutzen. -# Eine Kopie der Lizenz finden Sie hier: -# -# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 -# -# Sofern nicht durch anwendbare Rechtsvorschriften -# gefordert oder in schriftlicher Form vereinbart, wird -# die unter der Lizenz verbreitete Software "so wie sie -# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - -# ausdrücklich oder stillschweigend - verbreitet. -# Die sprachspezifischen Genehmigungen und Beschränkungen -# unter der Lizenz sind dem Lizenztext zu entnehmen. -# - -apiVersion: v1 -kind: Service -metadata: - name: {{ .Release.Name }} - namespace: {{ include "app.namespace" . }} - labels: - {{- include "app.defaultLabels" . | indent 4 }} - component: afm-adapter-service -spec: - ports: - - name: http - port: 8080 - protocol: TCP - targetPort: 8080 - - name: metrics - port: 8081 - protocol: TCP - type: ClusterIP - selector: - {{- include "app.matchLabels" . | indent 4 }} - component: afm-adapter \ No newline at end of file diff --git a/src/main/helm/templates/service_account.yaml b/src/main/helm/templates/service_account.yaml deleted file mode 100644 index 0e13e6bcabf1933117c29487473453b63265922a..0000000000000000000000000000000000000000 --- a/src/main/helm/templates/service_account.yaml +++ /dev/null @@ -1,31 +0,0 @@ -# -# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den -# Ministerpräsidenten des Landes Schleswig-Holstein -# Staatskanzlei -# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung -# -# Lizenziert unter der EUPL, Version 1.2 oder - sobald -# diese von der Europäischen Kommission genehmigt wurden - -# Folgeversionen der EUPL ("Lizenz"); -# Sie dürfen dieses Werk ausschließlich gemäß -# dieser Lizenz nutzen. -# Eine Kopie der Lizenz finden Sie hier: -# -# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 -# -# Sofern nicht durch anwendbare Rechtsvorschriften -# gefordert oder in schriftlicher Form vereinbart, wird -# die unter der Lizenz verbreitete Software "so wie sie -# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - -# ausdrücklich oder stillschweigend - verbreitet. -# Die sprachspezifischen Genehmigungen und Beschränkungen -# unter der Lizenz sind dem Lizenztext zu entnehmen. -# - -{{- if (.Values.serviceAccount).create }} -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ include "app.serviceAccountName" . }} - namespace: {{ include "app.namespace" . }} -{{- end }} \ No newline at end of file diff --git a/src/main/helm/templates/service_monitor.yaml b/src/main/helm/templates/service_monitor.yaml deleted file mode 100644 index 053a25810d66a1d9530bfeae0ec3da3f3fc86068..0000000000000000000000000000000000000000 --- a/src/main/helm/templates/service_monitor.yaml +++ /dev/null @@ -1,43 +0,0 @@ -# -# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den -# Ministerpräsidenten des Landes Schleswig-Holstein -# Staatskanzlei -# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung -# -# Lizenziert unter der EUPL, Version 1.2 oder - sobald -# diese von der Europäischen Kommission genehmigt wurden - -# Folgeversionen der EUPL ("Lizenz"); -# Sie dürfen dieses Werk ausschließlich gemäß -# dieser Lizenz nutzen. -# Eine Kopie der Lizenz finden Sie hier: -# -# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 -# -# Sofern nicht durch anwendbare Rechtsvorschriften -# gefordert oder in schriftlicher Form vereinbart, wird -# die unter der Lizenz verbreitete Software "so wie sie -# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - -# ausdrücklich oder stillschweigend - verbreitet. -# Die sprachspezifischen Genehmigungen und Beschränkungen -# unter der Lizenz sind dem Lizenztext zu entnehmen. -# - -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - name: {{ .Release.Name }} - namespace: {{ include "app.namespace" . }} - labels: - {{- include "app.defaultLabels" . | indent 4 }} - component: afm-adapter-service-monitor -spec: - endpoints: - - port: metrics - path: /actuator/prometheus - namespaceSelector: - matchNames: - - {{ include "app.namespace" . }} - selector: - matchLabels: - {{- include "app.matchLabels" . | indent 6 }} - component: afm-adapter-service \ No newline at end of file diff --git a/src/main/helm/templates/tests/test-ingress-connection.yaml b/src/main/helm/templates/tests/test-ingress-connection.yaml deleted file mode 100644 index 6d33a4e544785fedc58153ce275ecfb949c46885..0000000000000000000000000000000000000000 --- a/src/main/helm/templates/tests/test-ingress-connection.yaml +++ /dev/null @@ -1,39 +0,0 @@ -# -# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den -# Ministerpräsidenten des Landes Schleswig-Holstein -# Staatskanzlei -# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung -# -# Lizenziert unter der EUPL, Version 1.2 oder - sobald -# diese von der Europäischen Kommission genehmigt wurden - -# Folgeversionen der EUPL ("Lizenz"); -# Sie dürfen dieses Werk ausschließlich gemäß -# dieser Lizenz nutzen. -# Eine Kopie der Lizenz finden Sie hier: -# -# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 -# -# Sofern nicht durch anwendbare Rechtsvorschriften -# gefordert oder in schriftlicher Form vereinbart, wird -# die unter der Lizenz verbreitete Software "so wie sie -# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - -# ausdrücklich oder stillschweigend - verbreitet. -# Die sprachspezifischen Genehmigungen und Beschränkungen -# unter der Lizenz sind dem Lizenztext zu entnehmen. -# - -apiVersion: v1 -kind: Pod -metadata: - name: "{{ .Release.Name }}-test-ingress" - labels: - {{- include "app.matchLabels" . | nindent 4 }} - annotations: - "helm.sh/hook": test -spec: - containers: - - name: wget - image: busybox - command: ['wget'] - args: ['https://{{ .Values.ingress.host }}/ws/intelliform_formDatas.wsdl'] - restartPolicy: Never diff --git a/src/main/helm/templates/tests/test-service-connection.yaml b/src/main/helm/templates/tests/test-service-connection.yaml deleted file mode 100644 index 62dda4f5ef40ec4f566af007a57def2ab26ce7b5..0000000000000000000000000000000000000000 --- a/src/main/helm/templates/tests/test-service-connection.yaml +++ /dev/null @@ -1,39 +0,0 @@ -# -# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den -# Ministerpräsidenten des Landes Schleswig-Holstein -# Staatskanzlei -# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung -# -# Lizenziert unter der EUPL, Version 1.2 oder - sobald -# diese von der Europäischen Kommission genehmigt wurden - -# Folgeversionen der EUPL ("Lizenz"); -# Sie dürfen dieses Werk ausschließlich gemäß -# dieser Lizenz nutzen. -# Eine Kopie der Lizenz finden Sie hier: -# -# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 -# -# Sofern nicht durch anwendbare Rechtsvorschriften -# gefordert oder in schriftlicher Form vereinbart, wird -# die unter der Lizenz verbreitete Software "so wie sie -# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - -# ausdrücklich oder stillschweigend - verbreitet. -# Die sprachspezifischen Genehmigungen und Beschränkungen -# unter der Lizenz sind dem Lizenztext zu entnehmen. -# - -apiVersion: v1 -kind: Pod -metadata: - name: "{{ .Release.Name }}-test-connection" - labels: - {{- include "app.matchLabels" . | nindent 4 }} - annotations: - "helm.sh/hook": test -spec: - containers: - - name: wget - image: busybox - command: ['wget'] - args: ['{{ .Release.Name }}:8080/ws/intelliform_formDatas.wsdl'] - restartPolicy: Never diff --git a/src/main/helm/values.yaml b/src/main/helm/values.yaml deleted file mode 100644 index 118009532b1262af86efb421e2108e41dae7775c..0000000000000000000000000000000000000000 --- a/src/main/helm/values.yaml +++ /dev/null @@ -1,40 +0,0 @@ -# -# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den -# Ministerpräsidenten des Landes Schleswig-Holstein -# Staatskanzlei -# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung -# -# Lizenziert unter der EUPL, Version 1.2 oder - sobald -# diese von der Europäischen Kommission genehmigt wurden - -# Folgeversionen der EUPL ("Lizenz"); -# Sie dürfen dieses Werk ausschließlich gemäß -# dieser Lizenz nutzen. -# Eine Kopie der Lizenz finden Sie hier: -# -# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 -# -# Sofern nicht durch anwendbare Rechtsvorschriften -# gefordert oder in schriftlicher Form vereinbart, wird -# die unter der Lizenz verbreitete Software "so wie sie -# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - -# ausdrücklich oder stillschweigend - verbreitet. -# Die sprachspezifischen Genehmigungen und Beschränkungen -# unter der Lizenz sind dem Lizenztext zu entnehmen. -# - -baseUrl: test.sh.ozg-cloud.de - -image: - repo: docker.ozg-sh.de - name: intelliform-adapter # [default: intelliform-adapter] - tag: latest # [default: latest] - - -ingress: - enabled: true - # overrideHost: kiel-afm.dev.by.ozg-cloud.de - -routing: - targetVorgangManagerName: vorgang-manager -# fallbackStrategy: DENY -# routingStrategy: SINGLE diff --git a/formsolutions-adapter/src/main/java/de/ozgcloud/eingang/formsolutions/FormSolutionsAttachmentsMapper.java b/src/main/java/de/ozgcloud/eingang/formsolutions/FormSolutionsAttachmentsMapper.java similarity index 100% rename from formsolutions-adapter/src/main/java/de/ozgcloud/eingang/formsolutions/FormSolutionsAttachmentsMapper.java rename to src/main/java/de/ozgcloud/eingang/formsolutions/FormSolutionsAttachmentsMapper.java diff --git a/formsolutions-adapter/src/main/java/de/ozgcloud/eingang/formsolutions/FormSolutionsEingang.java b/src/main/java/de/ozgcloud/eingang/formsolutions/FormSolutionsEingang.java similarity index 100% rename from formsolutions-adapter/src/main/java/de/ozgcloud/eingang/formsolutions/FormSolutionsEingang.java rename to src/main/java/de/ozgcloud/eingang/formsolutions/FormSolutionsEingang.java diff --git a/formsolutions-adapter/src/main/java/de/ozgcloud/eingang/formsolutions/FormSolutionsFileMapperUtils.java b/src/main/java/de/ozgcloud/eingang/formsolutions/FormSolutionsFileMapperUtils.java similarity index 100% rename from formsolutions-adapter/src/main/java/de/ozgcloud/eingang/formsolutions/FormSolutionsFileMapperUtils.java rename to src/main/java/de/ozgcloud/eingang/formsolutions/FormSolutionsFileMapperUtils.java diff --git a/formsolutions-adapter/src/main/java/de/ozgcloud/eingang/formsolutions/FormSolutionsRequestMapper.java b/src/main/java/de/ozgcloud/eingang/formsolutions/FormSolutionsRequestMapper.java similarity index 100% rename from formsolutions-adapter/src/main/java/de/ozgcloud/eingang/formsolutions/FormSolutionsRequestMapper.java rename to src/main/java/de/ozgcloud/eingang/formsolutions/FormSolutionsRequestMapper.java diff --git a/formsolutions-adapter/src/main/java/de/ozgcloud/eingang/formsolutions/SemantikAdapterConfiguration.java b/src/main/java/de/ozgcloud/eingang/formsolutions/SemantikAdapterConfiguration.java similarity index 100% rename from formsolutions-adapter/src/main/java/de/ozgcloud/eingang/formsolutions/SemantikAdapterConfiguration.java rename to src/main/java/de/ozgcloud/eingang/formsolutions/SemantikAdapterConfiguration.java diff --git a/formsolutions-adapter/src/main/java/de/ozgcloud/eingang/formsolutions/SendFormEndpoint.java b/src/main/java/de/ozgcloud/eingang/formsolutions/SendFormEndpoint.java similarity index 100% rename from formsolutions-adapter/src/main/java/de/ozgcloud/eingang/formsolutions/SendFormEndpoint.java rename to src/main/java/de/ozgcloud/eingang/formsolutions/SendFormEndpoint.java diff --git a/formsolutions-adapter/src/main/java/de/ozgcloud/eingang/formsolutions/WebServiceConfiguration.java b/src/main/java/de/ozgcloud/eingang/formsolutions/WebServiceConfiguration.java similarity index 100% rename from formsolutions-adapter/src/main/java/de/ozgcloud/eingang/formsolutions/WebServiceConfiguration.java rename to src/main/java/de/ozgcloud/eingang/formsolutions/WebServiceConfiguration.java diff --git a/formsolutions-adapter/src/main/resources/application-local.yml b/src/main/resources/application-local.yml similarity index 100% rename from formsolutions-adapter/src/main/resources/application-local.yml rename to src/main/resources/application-local.yml diff --git a/formsolutions-adapter/src/main/resources/application.yml b/src/main/resources/application.yml similarity index 100% rename from formsolutions-adapter/src/main/resources/application.yml rename to src/main/resources/application.yml diff --git a/formsolutions-adapter/src/main/resources/banner.txt b/src/main/resources/banner.txt similarity index 100% rename from formsolutions-adapter/src/main/resources/banner.txt rename to src/main/resources/banner.txt diff --git a/formsolutions-adapter/src/main/resources/formsolutions/formdata.xsd b/src/main/resources/formsolutions/formdata.xsd similarity index 100% rename from formsolutions-adapter/src/main/resources/formsolutions/formdata.xsd rename to src/main/resources/formsolutions/formdata.xsd diff --git a/formsolutions-adapter/src/main/resources/wsdl/jsonWrap.wsdl b/src/main/resources/wsdl/jsonWrap.wsdl similarity index 100% rename from formsolutions-adapter/src/main/resources/wsdl/jsonWrap.wsdl rename to src/main/resources/wsdl/jsonWrap.wsdl diff --git a/formsolutions-adapter/src/main/resources/wsdl/jsonWrap.xsd b/src/main/resources/wsdl/jsonWrap.xsd similarity index 100% rename from formsolutions-adapter/src/main/resources/wsdl/jsonWrap.xsd rename to src/main/resources/wsdl/jsonWrap.xsd diff --git a/src/test/helm-linter-values.yaml b/src/test/helm-linter-values.yaml deleted file mode 100644 index 42eb0483702aedeef01c2dd6a7430108adfa3560..0000000000000000000000000000000000000000 --- a/src/test/helm-linter-values.yaml +++ /dev/null @@ -1,33 +0,0 @@ -# -# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den -# Ministerpräsidenten des Landes Schleswig-Holstein -# Staatskanzlei -# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung -# -# Lizenziert unter der EUPL, Version 1.2 oder - sobald -# diese von der Europäischen Kommission genehmigt wurden - -# Folgeversionen der EUPL ("Lizenz"); -# Sie dürfen dieses Werk ausschließlich gemäß -# dieser Lizenz nutzen. -# Eine Kopie der Lizenz finden Sie hier: -# -# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 -# -# Sofern nicht durch anwendbare Rechtsvorschriften -# gefordert oder in schriftlicher Form vereinbart, wird -# die unter der Lizenz verbreitete Software "so wie sie -# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - -# ausdrücklich oder stillschweigend - verbreitet. -# Die sprachspezifischen Genehmigungen und Beschränkungen -# unter der Lizenz sind dem Lizenztext zu entnehmen. -# - -ozgcloud: - environment: test - bezeichner: helm - bundesland: sh - -networkPolicy: - dnsServerNamespace: test-dns-server-namespace - -imagePullSecret: image-pull-secret \ No newline at end of file diff --git a/src/test/helm/bindings_type_test.yaml b/src/test/helm/bindings_type_test.yaml deleted file mode 100644 index f0fa5ade329232c346f328205e67e54f03e1f262..0000000000000000000000000000000000000000 --- a/src/test/helm/bindings_type_test.yaml +++ /dev/null @@ -1,46 +0,0 @@ -# -# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den -# Ministerpräsidenten des Landes Schleswig-Holstein -# Staatskanzlei -# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung -# -# Lizenziert unter der EUPL, Version 1.2 oder - sobald -# diese von der Europäischen Kommission genehmigt wurden - -# Folgeversionen der EUPL ("Lizenz"); -# Sie dürfen dieses Werk ausschließlich gemäß -# dieser Lizenz nutzen. -# Eine Kopie der Lizenz finden Sie hier: -# -# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 -# -# Sofern nicht durch anwendbare Rechtsvorschriften -# gefordert oder in schriftlicher Form vereinbart, wird -# die unter der Lizenz verbreitete Software "so wie sie -# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - -# ausdrücklich oder stillschweigend - verbreitet. -# Die sprachspezifischen Genehmigungen und Beschränkungen -# unter der Lizenz sind dem Lizenztext zu entnehmen. -# - -suite: test bindings type configmap -templates: - - templates/bindings_type_configmap.yaml -release: - name: eingang-manager - namespace: sh-helm-test -tests: - - it: xta bindings type - asserts: - - isKind: - of: ConfigMap - - isAPIVersion: - of: v1 - - equal: - path: metadata.name - value: eingang-manager-bindings-type - - equal: - path: metadata.namespace - value: sh-helm-test - - equal: - path: data.type - value: ca-certificates diff --git a/src/test/helm/deployment_63_chars_test.yaml b/src/test/helm/deployment_63_chars_test.yaml deleted file mode 100644 index 62c2f8e3ca43e56adea5171322c914b79f892698..0000000000000000000000000000000000000000 --- a/src/test/helm/deployment_63_chars_test.yaml +++ /dev/null @@ -1,56 +0,0 @@ -# -# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den -# Ministerpräsidenten des Landes Schleswig-Holstein -# Staatskanzlei -# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung -# -# Lizenziert unter der EUPL, Version 1.2 oder - sobald -# diese von der Europäischen Kommission genehmigt wurden - -# Folgeversionen der EUPL ("Lizenz"); -# Sie dürfen dieses Werk ausschließlich gemäß -# dieser Lizenz nutzen. -# Eine Kopie der Lizenz finden Sie hier: -# -# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 -# -# Sofern nicht durch anwendbare Rechtsvorschriften -# gefordert oder in schriftlicher Form vereinbart, wird -# die unter der Lizenz verbreitete Software "so wie sie -# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - -# ausdrücklich oder stillschweigend - verbreitet. -# Die sprachspezifischen Genehmigungen und Beschränkungen -# unter der Lizenz sind dem Lizenztext zu entnehmen. -# - -suite: test deyploment less than 63 chars -release: - name: eingang-manager - namespace: sh-helm-test - -chart: - name: eingang-manager -set: - ozgcloud.environment: test - imagePullSecret: image-pull-secret -templates: - - templates/deployment.yaml - -tests: - - it: should fail on .Release.Namespace length longer than 63 characters - release: - namespace: test1234567890123123456789012345678901234567890123456789012345678901234567890123456789012345678904567890 - asserts: - - failedTemplate: - errorMessage: .Release.Namespace test1234567890123123456789012345678901234567890123456789012345678901234567890123456789012345678904567890 ist zu lang (max. 63 Zeichen) - - it: should not fail on .Release.Namespace length less than 63 characters - asserts: - - notFailedTemplate: {} - - it: should fail on .Chart.Name-.Chart.Version length longer than 63 characters - chart: - version: 1.0-test1234567890123123456789012345678901234567890123456789012345678901234567890123456789012345678904567890 - asserts: - - failedTemplate: - errorMessage: .Chart.Name-.Chart.Version Intelliform-Adapter-1.0-test1234567890123123456789012345678901234567890123456789012345678901234567890123456789012345678904567890 ist zu lang (max. 63 Zeichen) - - it: should not fail on .Chart.Name-.Chart.Version length less than 63 characters - asserts: - - notFailedTemplate: {} \ No newline at end of file diff --git a/src/test/helm/deployment_bindings_test.yaml b/src/test/helm/deployment_bindings_test.yaml deleted file mode 100644 index f4e0f24ea4f4e017b21eb33eb0f331ca415a6346..0000000000000000000000000000000000000000 --- a/src/test/helm/deployment_bindings_test.yaml +++ /dev/null @@ -1,75 +0,0 @@ -# -# Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den -# Ministerpräsidenten des Landes Schleswig-Holstein -# Staatskanzlei -# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung -# -# Lizenziert unter der EUPL, Version 1.2 oder - sobald -# diese von der Europäischen Kommission genehmigt wurden - -# Folgeversionen der EUPL ("Lizenz"); -# Sie dürfen dieses Werk ausschließlich gemäß -# dieser Lizenz nutzen. -# Eine Kopie der Lizenz finden Sie hier: -# -# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 -# -# Sofern nicht durch anwendbare Rechtsvorschriften -# gefordert oder in schriftlicher Form vereinbart, wird -# die unter der Lizenz verbreitete Software "so wie sie -# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - -# ausdrücklich oder stillschweigend - verbreitet. -# Die sprachspezifischen Genehmigungen und Beschränkungen -# unter der Lizenz sind dem Lizenztext zu entnehmen. -# - -suite: deployment bindings -templates: - - templates/deployment.yaml -release: - name: eingang-manager - namespace: sh-helm-test -set: - ozgcloud.environment: test - imagePullSecret: image-pull-secret -tests: - - it: should have temp-dir volume - asserts: - - contains: - path: spec.template.spec.containers[0].volumeMounts - content: - name: temp-dir - mountPath: "/tmp" - - - it: should have temp-dir volume mount - asserts: - - contains: - path: spec.template.spec.volumes - content: - name: temp-dir - emptyDir: {} - - - it: should have projected namespace-ca-cert volume - asserts: - - contains: - path: spec.template.spec.volumes - content: - name: namespace-ca-cert - projected: - sources: - - secret: - name: sh-helm-test-ca-cert - optional: true - items: - - key: ca.crt - path: ca.crt - - configMap: - name: eingang-manager-bindings-type - - - it: should have namespace-ca-cert volume mount - asserts: - - contains: - path: spec.template.spec.containers[0].volumeMounts - content: - name: namespace-ca-cert - mountPath: "/bindings/namespace-certificate" - readOnly: true \ No newline at end of file diff --git a/src/test/helm/deployment_container_security_context_test.yaml b/src/test/helm/deployment_container_security_context_test.yaml deleted file mode 100644 index 0613312047954222164d9e3290025f0873d95086..0000000000000000000000000000000000000000 --- a/src/test/helm/deployment_container_security_context_test.yaml +++ /dev/null @@ -1,89 +0,0 @@ -# -# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den -# Ministerpräsidenten des Landes Schleswig-Holstein -# Staatskanzlei -# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung -# -# Lizenziert unter der EUPL, Version 1.2 oder - sobald -# diese von der Europäischen Kommission genehmigt wurden - -# Folgeversionen der EUPL ("Lizenz"); -# Sie dürfen dieses Werk ausschließlich gemäß -# dieser Lizenz nutzen. -# Eine Kopie der Lizenz finden Sie hier: -# -# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 -# -# Sofern nicht durch anwendbare Rechtsvorschriften -# gefordert oder in schriftlicher Form vereinbart, wird -# die unter der Lizenz verbreitete Software "so wie sie -# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - -# ausdrücklich oder stillschweigend - verbreitet. -# Die sprachspezifischen Genehmigungen und Beschränkungen -# unter der Lizenz sind dem Lizenztext zu entnehmen. -# - -suite: test deployment container security -release: - name: eingang-manager - namespace: sh-helm-test -templates: - - templates/deployment.yaml -set: - ozgcloud.environment: test - imagePullSecret: image-pull-secret -tests: - - it: check default values - asserts: - - equal: - path: spec.template.spec.containers[0].securityContext.allowPrivilegeEscalation - value: false - - equal: - path: spec.template.spec.containers[0].securityContext.privileged - value: false - - equal: - path: spec.template.spec.containers[0].securityContext.readOnlyRootFilesystem - value: false - - equal: - path: spec.template.spec.containers[0].securityContext.runAsNonRoot - value: true - - isNull: - path: spec.template.spec.containers[0].securityContext.runAsUser - - isNull: - path: spec.template.spec.containers[0].securityContext.runAsGroup - - isNull: - path: spec.template.spec.securityContext.fsGroup - - isNull: - path: spec.template.spec.containers[0].securityContext.capabilities - - it: check runAsUser - set: - securityContext.runAsUser: 1000 - asserts: - - equal: - path: spec.template.spec.containers[0].securityContext.runAsUser - value: 1000 - - it: check runAsGroup - set: - securityContext.runAsGroup: 1000 - asserts: - - equal: - path: spec.template.spec.containers[0].securityContext.runAsGroup - value: 1000 - - it: check fsGroup - set: - podSecurityContext.fsGroup: 1000 - asserts: - - equal: - path: spec.template.spec.securityContext.fsGroup - value: 1000 - - it: check capabilities - set: - securityContext: - capabilities: - drop: - - ALL - asserts: - - equal: - path: spec.template.spec.containers[0].securityContext.capabilities - value: - drop: - - ALL \ No newline at end of file diff --git a/src/test/helm/deployment_defaults_containers_health_test.yaml b/src/test/helm/deployment_defaults_containers_health_test.yaml deleted file mode 100644 index c6e30a3a92cda6fdb3ad6c7ec29c41dea5e19139..0000000000000000000000000000000000000000 --- a/src/test/helm/deployment_defaults_containers_health_test.yaml +++ /dev/null @@ -1,82 +0,0 @@ -# -# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den -# Ministerpräsidenten des Landes Schleswig-Holstein -# Staatskanzlei -# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung -# -# Lizenziert unter der EUPL, Version 1.2 oder - sobald -# diese von der Europäischen Kommission genehmigt wurden - -# Folgeversionen der EUPL ("Lizenz"); -# Sie dürfen dieses Werk ausschließlich gemäß -# dieser Lizenz nutzen. -# Eine Kopie der Lizenz finden Sie hier: -# -# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 -# -# Sofern nicht durch anwendbare Rechtsvorschriften -# gefordert oder in schriftlicher Form vereinbart, wird -# die unter der Lizenz verbreitete Software "so wie sie -# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - -# ausdrücklich oder stillschweigend - verbreitet. -# Die sprachspezifischen Genehmigungen und Beschränkungen -# unter der Lizenz sind dem Lizenztext zu entnehmen. -# - -suite: test deployment health check -release: - name: eingang-manager - namespace: sh-helm-test -templates: - - templates/deployment.yaml -set: - ozgcloud.environment: test - imagePullSecret: image-pull-secret -tests: - - it: should have correct health check values - asserts: - - equal: - path: spec.template.spec.containers[0].readinessProbe.failureThreshold - value: 3 - - equal: - path: spec.template.spec.containers[0].readinessProbe.httpGet.path - value: /actuator/health/readiness - - equal: - path: spec.template.spec.containers[0].readinessProbe.httpGet.port - value: 8081 - - equal: - path: spec.template.spec.containers[0].readinessProbe.httpGet.scheme - value: HTTP - - equal: - path: spec.template.spec.containers[0].readinessProbe.periodSeconds - value: 10 - - equal: - path: spec.template.spec.containers[0].readinessProbe.successThreshold - value: 1 - - equal: - path: spec.template.spec.containers[0].readinessProbe.timeoutSeconds - value: 3 - - equal: - path: spec.template.spec.containers[0].startupProbe.failureThreshold - value: 10 - - equal: - path: spec.template.spec.containers[0].startupProbe.httpGet.path - value: /actuator/health/readiness - - equal: - path: spec.template.spec.containers[0].startupProbe.httpGet.port - value: 8081 - - equal: - path: spec.template.spec.containers[0].startupProbe.httpGet.scheme - value: HTTP - - equal: - path: spec.template.spec.containers[0].startupProbe.initialDelaySeconds - value: 30 - - equal: - path: spec.template.spec.containers[0].startupProbe.periodSeconds - value: 5 - - equal: - path: spec.template.spec.containers[0].startupProbe.successThreshold - value: 1 - - equal: - path: spec.template.spec.containers[0].startupProbe.timeoutSeconds - value: 5 - \ No newline at end of file diff --git a/src/test/helm/deployment_defaults_labels_test.yaml b/src/test/helm/deployment_defaults_labels_test.yaml deleted file mode 100644 index 4e2d5f7fd51431f4d91582e5cc50dd5d8ba1d837..0000000000000000000000000000000000000000 --- a/src/test/helm/deployment_defaults_labels_test.yaml +++ /dev/null @@ -1,49 +0,0 @@ -# -# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den -# Ministerpräsidenten des Landes Schleswig-Holstein -# Staatskanzlei -# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung -# -# Lizenziert unter der EUPL, Version 1.2 oder - sobald -# diese von der Europäischen Kommission genehmigt wurden - -# Folgeversionen der EUPL ("Lizenz"); -# Sie dürfen dieses Werk ausschließlich gemäß -# dieser Lizenz nutzen. -# Eine Kopie der Lizenz finden Sie hier: -# -# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 -# -# Sofern nicht durch anwendbare Rechtsvorschriften -# gefordert oder in schriftlicher Form vereinbart, wird -# die unter der Lizenz verbreitete Software "so wie sie -# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - -# ausdrücklich oder stillschweigend - verbreitet. -# Die sprachspezifischen Genehmigungen und Beschränkungen -# unter der Lizenz sind dem Lizenztext zu entnehmen. -# - -suite: test deployment default label -release: - name: intelliform-adapter - namespace: sh-helm-test -templates: - - templates/deployment.yaml - -set: - ozgcloud.environment: test - imagePullSecret: image-pull-secret -tests: - - it: check default labels - asserts: - - equal: - path: metadata.labels - value: - app.kubernetes.io/instance: afm-adapter - app.kubernetes.io/managed-by: Helm - app.kubernetes.io/name: intelliform-adapter - app.kubernetes.io/namespace: sh-helm-test - app.kubernetes.io/part-of: ozgcloud - app.kubernetes.io/version: 0.0.0-MANAGED-BY-JENKINS - helm.sh/chart: Intelliform-Adapter-0.0.0-MANAGED-BY-JENKINS - ozg-component: eingangsadapter - diff --git a/src/test/helm/deployment_defaults_spec_containers_test.yaml b/src/test/helm/deployment_defaults_spec_containers_test.yaml deleted file mode 100644 index 947c086f31e1b3a064cbe3577123c4e087577669..0000000000000000000000000000000000000000 --- a/src/test/helm/deployment_defaults_spec_containers_test.yaml +++ /dev/null @@ -1,75 +0,0 @@ -# -# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den -# Ministerpräsidenten des Landes Schleswig-Holstein -# Staatskanzlei -# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung -# -# Lizenziert unter der EUPL, Version 1.2 oder - sobald -# diese von der Europäischen Kommission genehmigt wurden - -# Folgeversionen der EUPL ("Lizenz"); -# Sie dürfen dieses Werk ausschließlich gemäß -# dieser Lizenz nutzen. -# Eine Kopie der Lizenz finden Sie hier: -# -# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 -# -# Sofern nicht durch anwendbare Rechtsvorschriften -# gefordert oder in schriftlicher Form vereinbart, wird -# die unter der Lizenz verbreitete Software "so wie sie -# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - -# ausdrücklich oder stillschweigend - verbreitet. -# Die sprachspezifischen Genehmigungen und Beschränkungen -# unter der Lizenz sind dem Lizenztext zu entnehmen. -# - -suite: test deployment actuator -release: - name: eingang-manager - namespace: sh-helm-test -templates: - - templates/deployment.yaml -set: - ozgcloud.environment: test - imagePullSecret: image-pull-secret -tests: - - it: check for some standard values - asserts: - - equal: - path: spec.template.spec.containers[0].image - value: docker.ozg-sh.de/intelliform-adapter:latest - - equal: - path: spec.template.spec.containers[0].imagePullPolicy - value: Always - - equal: - path: spec.template.spec.containers[0].name - value: intelliform-adapter - - equal: - path: spec.template.spec.containers[0].ports[0].containerPort - value: 8080 - - equal: - path: spec.template.spec.containers[0].ports[0].name - value: 8080tcp1 - - equal: - path: spec.template.spec.containers[0].ports[0].protocol - value: TCP - - equal: - path: spec.template.spec.containers[0].stdin - value: true - - equal: - path: spec.template.spec.containers[0].terminationMessagePath - value: /dev/termination-log - - equal: - path: spec.template.spec.containers[0].terminationMessagePolicy - value: File - - equal: - path: spec.template.spec.containers[0].tty - value: true - - equal: - path: spec.template.spec.containers[0].ports[1].containerPort - value: 8081 - - equal: - path: spec.template.spec.containers[0].ports[1].name - value: metrics - - equal: - path: spec.template.spec.containers[0].ports[1].protocol - value: TCP \ No newline at end of file diff --git a/src/test/helm/deployment_defaults_topologySpreadConstraints_test.yaml b/src/test/helm/deployment_defaults_topologySpreadConstraints_test.yaml deleted file mode 100644 index 9364e4502d8d63cc0968b5590212fec3591c7f84..0000000000000000000000000000000000000000 --- a/src/test/helm/deployment_defaults_topologySpreadConstraints_test.yaml +++ /dev/null @@ -1,48 +0,0 @@ -# -# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den -# Ministerpräsidenten des Landes Schleswig-Holstein -# Staatskanzlei -# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung -# -# Lizenziert unter der EUPL, Version 1.2 oder - sobald -# diese von der Europäischen Kommission genehmigt wurden - -# Folgeversionen der EUPL ("Lizenz"); -# Sie dürfen dieses Werk ausschließlich gemäß -# dieser Lizenz nutzen. -# Eine Kopie der Lizenz finden Sie hier: -# -# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 -# -# Sofern nicht durch anwendbare Rechtsvorschriften -# gefordert oder in schriftlicher Form vereinbart, wird -# die unter der Lizenz verbreitete Software "so wie sie -# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - -# ausdrücklich oder stillschweigend - verbreitet. -# Die sprachspezifischen Genehmigungen und Beschränkungen -# unter der Lizenz sind dem Lizenztext zu entnehmen. -# - -suite: test deployment topology -release: - name: eingang-manager - namespace: sh-helm-test -templates: - - templates/deployment.yaml -set: - ozgcloud.environment: test - imagePullSecret: image-pull-secret -tests: - - it: check default values - asserts: - - equal: - path: spec.template.spec.topologySpreadConstraints[0].maxSkew - value: 1 - - equal: - path: spec.template.spec.topologySpreadConstraints[0].topologyKey - value: kubernetes.io/hostname - - equal: - path: spec.template.spec.topologySpreadConstraints[0].whenUnsatisfiable - value: DoNotSchedule - - equal: - path: spec.template.spec.topologySpreadConstraints[0].labelSelector.matchLabels["app.kubernetes.io/name"] - value: eingang-manager \ No newline at end of file diff --git a/src/test/helm/deployment_env_customList_test.yaml b/src/test/helm/deployment_env_customList_test.yaml deleted file mode 100644 index 32e81b53357cbab961e85421719a7cb5b274e5e0..0000000000000000000000000000000000000000 --- a/src/test/helm/deployment_env_customList_test.yaml +++ /dev/null @@ -1,72 +0,0 @@ -# -# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den -# Ministerpräsidenten des Landes Schleswig-Holstein -# Staatskanzlei -# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung -# -# Lizenziert unter der EUPL, Version 1.2 oder - sobald -# diese von der Europäischen Kommission genehmigt wurden - -# Folgeversionen der EUPL ("Lizenz"); -# Sie dürfen dieses Werk ausschließlich gemäß -# dieser Lizenz nutzen. -# Eine Kopie der Lizenz finden Sie hier: -# -# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 -# -# Sofern nicht durch anwendbare Rechtsvorschriften -# gefordert oder in schriftlicher Form vereinbart, wird -# die unter der Lizenz verbreitete Software "so wie sie -# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - -# ausdrücklich oder stillschweigend - verbreitet. -# Die sprachspezifischen Genehmigungen und Beschränkungen -# unter der Lizenz sind dem Lizenztext zu entnehmen. -# - -suite: test environments customList -templates: - - templates/deployment.yaml -set: - ozgcloud.environment: test - imagePullSecret: image-pull-secret -tests: - - it: check customList as list - set: - env.customList: - - name: my_test_environment_name - value: "A test value" - - name: test_environment - value: "B test value" - asserts: - - contains: - path: spec.template.spec.containers[0].env - content: - name: my_test_environment_name - value: "A test value" - - contains: - path: spec.template.spec.containers[0].env - content: - name: test_environment - value: "B test value" - - it: check customList as dict - set: - env.customList: - my_test_environment_name: "A test value" - test_environment: "B test value" - asserts: - - contains: - path: spec.template.spec.containers[0].env - content: - name: my_test_environment_name - value: "A test value" - - contains: - path: spec.template.spec.containers[0].env - content: - name: test_environment - value: "B test value" - - it: check customList test value is not set by default - asserts: - - notContains: - path: spec.template.spec.containers[0].env - content: - name: my_test_environment_name - value: "A test value" diff --git a/src/test/helm/deployment_host_aliases_test.yaml b/src/test/helm/deployment_host_aliases_test.yaml deleted file mode 100644 index 4ba73fa7df272156fb3597522bcdf478abd88d1f..0000000000000000000000000000000000000000 --- a/src/test/helm/deployment_host_aliases_test.yaml +++ /dev/null @@ -1,54 +0,0 @@ -# -# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den -# Ministerpräsidenten des Landes Schleswig-Holstein -# Staatskanzlei -# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung -# -# Lizenziert unter der EUPL, Version 1.2 oder - sobald -# diese von der Europäischen Kommission genehmigt wurden - -# Folgeversionen der EUPL ("Lizenz"); -# Sie dürfen dieses Werk ausschließlich gemäß -# dieser Lizenz nutzen. -# Eine Kopie der Lizenz finden Sie hier: -# -# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 -# -# Sofern nicht durch anwendbare Rechtsvorschriften -# gefordert oder in schriftlicher Form vereinbart, wird -# die unter der Lizenz verbreitete Software "so wie sie -# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - -# ausdrücklich oder stillschweigend - verbreitet. -# Die sprachspezifischen Genehmigungen und Beschränkungen -# unter der Lizenz sind dem Lizenztext zu entnehmen. -# - -suite: deployment host aliases -release: - name: eingang-manager - namespace: sh-helm-test -templates: - - templates/deployment.yaml - -set: - ozgcloud.environment: test - imagePullSecret: image-pull-secret -tests: - - it: should not set hostAliases - asserts: - - isNull: - path: spec.template.spec.hostAliases - - it: should set hostAliases - set: - hostAliases: - - ip: "127.0.0.1" - hostname: - - "eins" - - "zwei" - asserts: - - contains: - path: spec.template.spec.hostAliases - content: - ip: "127.0.0.1" - hostname: - - "eins" - - "zwei" diff --git a/src/test/helm/deployment_imagepull_secret_test.yaml b/src/test/helm/deployment_imagepull_secret_test.yaml deleted file mode 100644 index eb15225e4c522e445b55a64820eafa03b98022aa..0000000000000000000000000000000000000000 --- a/src/test/helm/deployment_imagepull_secret_test.yaml +++ /dev/null @@ -1,44 +0,0 @@ -# -# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den -# Ministerpräsidenten des Landes Schleswig-Holstein -# Staatskanzlei -# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung -# -# Lizenziert unter der EUPL, Version 1.2 oder - sobald -# diese von der Europäischen Kommission genehmigt wurden - -# Folgeversionen der EUPL ("Lizenz"); -# Sie dürfen dieses Werk ausschließlich gemäß -# dieser Lizenz nutzen. -# Eine Kopie der Lizenz finden Sie hier: -# -# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 -# -# Sofern nicht durch anwendbare Rechtsvorschriften -# gefordert oder in schriftlicher Form vereinbart, wird -# die unter der Lizenz verbreitete Software "so wie sie -# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - -# ausdrücklich oder stillschweigend - verbreitet. -# Die sprachspezifischen Genehmigungen und Beschränkungen -# unter der Lizenz sind dem Lizenztext zu entnehmen. -# - -suite: test deployment imagepullsecret -release: - name: afm-adapter - namespace: sh-helm-test -templates: - - templates/deployment.yaml -set: - ozgcloud.environment: test -tests: - - it: should set the imagePull secret - set: - imagePullSecret: image-pull-secret - asserts: - - equal: - path: spec.template.spec.imagePullSecrets[0].name - value: image-pull-secret - - it: should fail tempalte when not set - asserts: - - failedTemplate: - errorMessage: imagePullSecret must be set \ No newline at end of file diff --git a/src/test/helm/deployment_liveness_probe_test.yaml b/src/test/helm/deployment_liveness_probe_test.yaml deleted file mode 100644 index 944984fb52cf4b6fbefa346eb1fcfcf065c1a581..0000000000000000000000000000000000000000 --- a/src/test/helm/deployment_liveness_probe_test.yaml +++ /dev/null @@ -1,51 +0,0 @@ -# -# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den -# Ministerpräsidenten des Landes Schleswig-Holstein -# Staatskanzlei -# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung -# -# Lizenziert unter der EUPL, Version 1.2 oder - sobald -# diese von der Europäischen Kommission genehmigt wurden - -# Folgeversionen der EUPL ("Lizenz"); -# Sie dürfen dieses Werk ausschließlich gemäß -# dieser Lizenz nutzen. -# Eine Kopie der Lizenz finden Sie hier: -# -# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 -# -# Sofern nicht durch anwendbare Rechtsvorschriften -# gefordert oder in schriftlicher Form vereinbart, wird -# die unter der Lizenz verbreitete Software "so wie sie -# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - -# ausdrücklich oder stillschweigend - verbreitet. -# Die sprachspezifischen Genehmigungen und Beschränkungen -# unter der Lizenz sind dem Lizenztext zu entnehmen. -# - -suite: test deployment liveness probe -templates: - - templates/deployment.yaml -set: - ozgcloud.environment: test - imagePullSecret: image-pull-secret -tests: - - it: livenessProbe should be disabled by default - asserts: - - notExists: - path: spec.template.spec.containers[0].livenessProbe - - - it: enable livenessProbe - set: - enableLivenessProbe: true - asserts: - - isSubset: - path: spec.template.spec.containers[0].livenessProbe - content: - failureThreshold: 3 - httpGet: - path: /actuator/health/liveness - port: 8081 - scheme: HTTP - periodSeconds: 10 - successThreshold: 1 - timeoutSeconds: 3 diff --git a/src/test/helm/deployment_pod_default_spec_values_test.yaml b/src/test/helm/deployment_pod_default_spec_values_test.yaml deleted file mode 100644 index ed1df2ad69fe488678b6778fc7143b9879db902a..0000000000000000000000000000000000000000 --- a/src/test/helm/deployment_pod_default_spec_values_test.yaml +++ /dev/null @@ -1,50 +0,0 @@ - # -# Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den -# Ministerpräsidenten des Landes Schleswig-Holstein -# Staatskanzlei -# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung -# -# Lizenziert unter der EUPL, Version 1.2 oder - sobald -# diese von der Europäischen Kommission genehmigt wurden - -# Folgeversionen der EUPL ("Lizenz"); -# Sie dürfen dieses Werk ausschließlich gemäß -# dieser Lizenz nutzen. -# Eine Kopie der Lizenz finden Sie hier: -# -# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 -# -# Sofern nicht durch anwendbare Rechtsvorschriften -# gefordert oder in schriftlicher Form vereinbart, wird -# die unter der Lizenz verbreitete Software "so wie sie -# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - -# ausdrücklich oder stillschweigend - verbreitet. -# Die sprachspezifischen Genehmigungen und Beschränkungen -# unter der Lizenz sind dem Lizenztext zu entnehmen. -# - -suite: test deployment container basics -release: - name: eingang-manager - namespace: sh-helm-test -templates: - - templates/deployment.yaml -set: - ozgcloud.environment: test - imagePullSecret: image-pull-secret -tests: - - it: should have correct pod template values - asserts: - - isEmpty: - path: spec.template.spec.dnsConfig - - equal: - path: spec.template.spec.dnsPolicy - value: "ClusterFirst" - - equal: - path: spec.template.spec.restartPolicy - value: "Always" - - equal: - path: spec.template.spec.schedulerName - value: "default-scheduler" - - equal: - path: spec.template.spec.terminationGracePeriodSeconds - value: 30 \ No newline at end of file diff --git a/src/test/helm/deployment_resources_test.yaml b/src/test/helm/deployment_resources_test.yaml deleted file mode 100644 index 6404c0c9b9549733ce89f1b3a73e5384b692c702..0000000000000000000000000000000000000000 --- a/src/test/helm/deployment_resources_test.yaml +++ /dev/null @@ -1,61 +0,0 @@ -# -# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den -# Ministerpräsidenten des Landes Schleswig-Holstein -# Staatskanzlei -# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung -# -# Lizenziert unter der EUPL, Version 1.2 oder - sobald -# diese von der Europäischen Kommission genehmigt wurden - -# Folgeversionen der EUPL ("Lizenz"); -# Sie dürfen dieses Werk ausschließlich gemäß -# dieser Lizenz nutzen. -# Eine Kopie der Lizenz finden Sie hier: -# -# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 -# -# Sofern nicht durch anwendbare Rechtsvorschriften -# gefordert oder in schriftlicher Form vereinbart, wird -# die unter der Lizenz verbreitete Software "so wie sie -# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - -# ausdrücklich oder stillschweigend - verbreitet. -# Die sprachspezifischen Genehmigungen und Beschränkungen -# unter der Lizenz sind dem Lizenztext zu entnehmen. -# - -suite: test deployment resources -release: - name: afm-adapter -templates: - - templates/deployment.yaml -set: - ozgcloud.environment: test - imagePullSecret: image-pull-secret -tests: - - it: test resources - set: - resources: - limits: - cpu: "11m" - memory: "22Mi" - requests: - cpu: "33m" - memory: "44Mi" - asserts: - - equal: - path: spec.template.spec.containers[0].resources.limits.cpu - value: 11m - - equal: - path: spec.template.spec.containers[0].resources.limits.memory - value: 22Mi - - equal: - path: spec.template.spec.containers[0].resources.requests.cpu - value: 33m - - equal: - path: spec.template.spec.containers[0].resources.requests.memory - value: 44Mi - - - it: test empty resources - asserts: - - isEmpty: - path: spec.template.spec.containers[0].resources - diff --git a/src/test/helm/deployment_routing_strategy_env_test.yaml b/src/test/helm/deployment_routing_strategy_env_test.yaml deleted file mode 100644 index e70cff6f10669ad7574fb80dcbf96f3c11aee715..0000000000000000000000000000000000000000 --- a/src/test/helm/deployment_routing_strategy_env_test.yaml +++ /dev/null @@ -1,80 +0,0 @@ -# -# Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den -# Ministerpräsidenten des Landes Schleswig-Holstein -# Staatskanzlei -# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung -# -# Lizenziert unter der EUPL, Version 1.2 oder - sobald -# diese von der Europäischen Kommission genehmigt wurden - -# Folgeversionen der EUPL ("Lizenz"); -# Sie dürfen dieses Werk ausschließlich gemäß -# dieser Lizenz nutzen. -# Eine Kopie der Lizenz finden Sie hier: -# -# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 -# -# Sofern nicht durch anwendbare Rechtsvorschriften -# gefordert oder in schriftlicher Form vereinbart, wird -# die unter der Lizenz verbreitete Software "so wie sie -# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - -# ausdrücklich oder stillschweigend - verbreitet. -# Die sprachspezifischen Genehmigungen und Beschränkungen -# unter der Lizenz sind dem Lizenztext zu entnehmen. -# - -suite: test deployment routing strategy -release: - name: intelliform-adapter - namespace: sh-helm-test -templates: - - deployment.yaml -set: - image.tag: latest - ozgcloud.environment: test - imagePullSecret: image-pull-secret -tests: - - it: validate default routing values without questions.yaml - asserts: - - contains: - path: spec.template.spec.containers[0].env - content: - name: ozgcloud_adapter_routingStrategy - value: SINGLE - - contains: - path: spec.template.spec.containers[0].env - content: - name: ozgcloud_adapter_fallbackStrategy - value: DENY - - contains: - path: spec.template.spec.containers[0].env - content: - name: grpc_client_vorgang-manager-vorgang-manager_negotiationType - value: TLS - - contains: - path: spec.template.spec.containers[0].env - content: - name: grpc_client_vorgang-manager-vorgang-manager_address - value: dns:///vorgang-manager.sh-helm-test:9090 - - - it: validate routing infos - set: - routing: - routingStrategy: MULTI - fallbackStrategy: FUNDSTELLE - negotiationType: PLAINTEXT - asserts: - - contains: - path: spec.template.spec.containers[0].env - content: - name: ozgcloud_adapter_routingStrategy - value: MULTI - - contains: - path: spec.template.spec.containers[0].env - content: - name: ozgcloud_adapter_fallbackStrategy - value: FUNDSTELLE - - contains: - path: spec.template.spec.containers[0].env - content: - name: grpc_client_vorgang-manager-vorgang-manager_negotiationType - value: PLAINTEXT \ No newline at end of file diff --git a/src/test/helm/deployment_routing_zufi_test.yaml b/src/test/helm/deployment_routing_zufi_test.yaml deleted file mode 100644 index 85c3e1b73b83bca9bc5f183d2a4a03bb96963d3b..0000000000000000000000000000000000000000 --- a/src/test/helm/deployment_routing_zufi_test.yaml +++ /dev/null @@ -1,89 +0,0 @@ -# -# Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den -# Ministerpräsidenten des Landes Schleswig-Holstein -# Staatskanzlei -# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung -# -# Lizenziert unter der EUPL, Version 1.2 oder - sobald -# diese von der Europäischen Kommission genehmigt wurden - -# Folgeversionen der EUPL ("Lizenz"); -# Sie dürfen dieses Werk ausschließlich gemäß -# dieser Lizenz nutzen. -# Eine Kopie der Lizenz finden Sie hier: -# -# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 -# -# Sofern nicht durch anwendbare Rechtsvorschriften -# gefordert oder in schriftlicher Form vereinbart, wird -# die unter der Lizenz verbreitete Software "so wie sie -# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - -# ausdrücklich oder stillschweigend - verbreitet. -# Die sprachspezifischen Genehmigungen und Beschränkungen -# unter der Lizenz sind dem Lizenztext zu entnehmen. -# - -suite: test deployment zufi routing -release: - name: intelliform-adapter - namespace: sh-helm-test -templates: - - deployment.yaml -set: - image.tag: latest - ozgcloud.environment: test - imagePullSecret: image-pull-secret -tests: - - it: should set zufi routing values when zufi is enabled - set: - routing: - routingStrategy: "ZUFI" - zufiManager: - address: "127.0.0.1" - negotiationType: "TLS" - asserts: - - contains: - path: spec.template.spec.containers[0].env - content: - name: grpc_client_zufi-manager_address - value: "127.0.0.1" - - contains: - path: spec.template.spec.containers[0].env - content: - name: grpc_client_zufi-manager_negotiationType - value: "TLS" - - - it: should not set zufi routing values when zufi is disabled - asserts: - - notContains: - path: spec.template.spec.containers[0].env - content: - name: grpc_client_zufi-manager_address - any: true - - notContains: - path: spec.template.spec.containers[0].env - content: - name: grpc_client_zufi-manager_negotiationType - any: true - - - it: should throw error if zufi manager address is not set - set: - routing: - routingStrategy: "ZUFI" - zufiManager: - negotiationType: "PLAINTEXT" - asserts: - - failedTemplate: - errorMessage: "routing.zufiManager.address must be set when routingStrategy=ZUFI" - - - it: should set default value for zufi negotiationType - set: - routing: - routingStrategy: "ZUFI" - zufiManager: - address: "127.0.0.1" - asserts: - - contains: - path: spec.template.spec.containers[0].env - content: - name: grpc_client_zufi-manager_negotiationType - value: "PLAINTEXT" \ No newline at end of file diff --git a/src/test/helm/deployment_service_account_test.yaml b/src/test/helm/deployment_service_account_test.yaml deleted file mode 100644 index 0a5df07ed2cc679e0271998764a6a00ea893dff1..0000000000000000000000000000000000000000 --- a/src/test/helm/deployment_service_account_test.yaml +++ /dev/null @@ -1,84 +0,0 @@ -# -# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den -# Ministerpräsidenten des Landes Schleswig-Holstein -# Staatskanzlei -# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung -# -# Lizenziert unter der EUPL, Version 1.2 oder - sobald -# diese von der Europäischen Kommission genehmigt wurden - -# Folgeversionen der EUPL ("Lizenz"); -# Sie dürfen dieses Werk ausschließlich gemäß -# dieser Lizenz nutzen. -# Eine Kopie der Lizenz finden Sie hier: -# -# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 -# -# Sofern nicht durch anwendbare Rechtsvorschriften -# gefordert oder in schriftlicher Form vereinbart, wird -# die unter der Lizenz verbreitete Software "so wie sie -# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - -# ausdrücklich oder stillschweigend - verbreitet. -# Die sprachspezifischen Genehmigungen und Beschränkungen -# unter der Lizenz sind dem Lizenztext zu entnehmen. -# - -suite: deployment service account -release: - name: eingang-manager - namespace: sh-helm-test -templates: - - templates/deployment.yaml - -set: - ozgcloud.environment: test - imagePullSecret: image-pull-secret -tests: - - it: should use afm-adapter service account name - set: - image.name: intelliform-adapter - serviceAccount: - create: true - asserts: - - equal: - path: spec.template.spec.serviceAccountName - value: afm-adapter-service-account - - it: should use fs-adapter service account name - set: - image.name: formsolutions-adapter - serviceAccount: - create: true - asserts: - - equal: - path: spec.template.spec.serviceAccountName - value: fs-adapter-service-account - - it: should use formcycle-adapter service account name - set: - image.name: formcycle-adapter - serviceAccount: - create: true - asserts: - - equal: - path: spec.template.spec.serviceAccountName - value: formcycle-adapter-service-account - - it: should use enterprise-adapter service account name - set: - image.name: enterprise-adapter - serviceAccount: - create: true - asserts: - - equal: - path: spec.template.spec.serviceAccountName - value: enterprise-adapter-service-account - - it: should use service account with name - set: - serviceAccount: - create: true - name: helm-service-account - asserts: - - equal: - path: spec.template.spec.serviceAccountName - value: helm-service-account - - it: should use default service account - asserts: - - isNull: - path: spec.template.spec.serviceAccountName \ No newline at end of file diff --git a/src/test/helm/deployment_springProfile_env_test.yaml b/src/test/helm/deployment_springProfile_env_test.yaml deleted file mode 100644 index 001fbf3d2e27589848ca87efb16347a183a2cd34..0000000000000000000000000000000000000000 --- a/src/test/helm/deployment_springProfile_env_test.yaml +++ /dev/null @@ -1,50 +0,0 @@ -# -# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den -# Ministerpräsidenten des Landes Schleswig-Holstein -# Staatskanzlei -# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung -# -# Lizenziert unter der EUPL, Version 1.2 oder - sobald -# diese von der Europäischen Kommission genehmigt wurden - -# Folgeversionen der EUPL ("Lizenz"); -# Sie dürfen dieses Werk ausschließlich gemäß -# dieser Lizenz nutzen. -# Eine Kopie der Lizenz finden Sie hier: -# -# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 -# -# Sofern nicht durch anwendbare Rechtsvorschriften -# gefordert oder in schriftlicher Form vereinbart, wird -# die unter der Lizenz verbreitete Software "so wie sie -# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - -# ausdrücklich oder stillschweigend - verbreitet. -# Die sprachspezifischen Genehmigungen und Beschränkungen -# unter der Lizenz sind dem Lizenztext zu entnehmen. -# - -suite: test spring profiles -release: - name: if-adapter -templates: - - templates/deployment.yaml -set: - imagePullSecret: image-pull-secret -tests: - - it: should override spring profiles - set: - env.overrideSpringProfiles: oc,stage,ea - asserts: - - contains: - path: spec.template.spec.containers[0].env - content: - name: spring_profiles_active - value: oc,stage,ea - - it: should generate spring profiles - set: - ozgcloud.environment: test - asserts: - - contains: - path: spec.template.spec.containers[0].env - content: - name: spring_profiles_active - value: oc, test \ No newline at end of file diff --git a/src/test/helm/deyploment_general_value_and_default_spec_test.yaml b/src/test/helm/deyploment_general_value_and_default_spec_test.yaml deleted file mode 100644 index 0ab50fa23c12c02f58e50dd546c9a8417b40c975..0000000000000000000000000000000000000000 --- a/src/test/helm/deyploment_general_value_and_default_spec_test.yaml +++ /dev/null @@ -1,73 +0,0 @@ -# -# Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den -# Ministerpräsidenten des Landes Schleswig-Holstein -# Staatskanzlei -# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung -# -# Lizenziert unter der EUPL, Version 1.2 oder - sobald -# diese von der Europäischen Kommission genehmigt wurden - -# Folgeversionen der EUPL ("Lizenz"); -# Sie dürfen dieses Werk ausschließlich gemäß -# dieser Lizenz nutzen. -# Eine Kopie der Lizenz finden Sie hier: -# -# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 -# -# Sofern nicht durch anwendbare Rechtsvorschriften -# gefordert oder in schriftlicher Form vereinbart, wird -# die unter der Lizenz verbreitete Software "so wie sie -# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - -# ausdrücklich oder stillschweigend - verbreitet. -# Die sprachspezifischen Genehmigungen und Beschränkungen -# unter der Lizenz sind dem Lizenztext zu entnehmen. -# - -suite: test deployment general values -release: - name: eingang-manager - namespace: sh-helm-test -templates: - - templates/deployment.yaml -set: - ozgcloud.environment: test - imagePullSecret: image-pull-secret -tests: - - it: should have correct apiVersion - asserts: - - isKind: - of: Deployment - - isAPIVersion: - of: "apps/v1" - - - it: should have correct deployment metadata - asserts: - - equal: - path: metadata.name - value: eingang-manager - - equal: - path: metadata.namespace - value: sh-helm-test - - - - it: should have correct deyployment general spec values - asserts: - - equal: - path: spec.progressDeadlineSeconds - value: 600 - - equal: - path: spec.replicas - value: null - - equal: - path: spec.revisionHistoryLimit - value: 10 - - it: should have correct deployment spec strategy values - asserts: - - equal: - path: spec.strategy - value: - rollingUpdate: - maxSurge: 1 - maxUnavailable: 0 - type: RollingUpdate - - diff --git a/src/test/helm/ingress_create_or_not_test.yaml b/src/test/helm/ingress_create_or_not_test.yaml deleted file mode 100644 index fa92ab46b56c118237bd47ad6f9ef891d9278777..0000000000000000000000000000000000000000 --- a/src/test/helm/ingress_create_or_not_test.yaml +++ /dev/null @@ -1,49 +0,0 @@ -# -# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den -# Ministerpräsidenten des Landes Schleswig-Holstein -# Staatskanzlei -# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung -# -# Lizenziert unter der EUPL, Version 1.2 oder - sobald -# diese von der Europäischen Kommission genehmigt wurden - -# Folgeversionen der EUPL ("Lizenz"); -# Sie dürfen dieses Werk ausschließlich gemäß -# dieser Lizenz nutzen. -# Eine Kopie der Lizenz finden Sie hier: -# -# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 -# -# Sofern nicht durch anwendbare Rechtsvorschriften -# gefordert oder in schriftlicher Form vereinbart, wird -# die unter der Lizenz verbreitete Software "so wie sie -# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - -# ausdrücklich oder stillschweigend - verbreitet. -# Die sprachspezifischen Genehmigungen und Beschränkungen -# unter der Lizenz sind dem Lizenztext zu entnehmen. -# - -suite: test ingress creation dependent from values -templates: - - templates/ingress.yaml - -set: - ozgcloud: - bezeichner: helm - -tests: - - it: create ingress by config - set: - ingress.enabled: true - asserts: - - isKind: - of: Ingress - - it: not create ingress by config - set: - ingress.enabled: false - asserts: - - hasDocuments: - count: 0 - - it: ingress should be created by default - asserts: - - isKind: - of: Ingress diff --git a/src/test/helm/ingress_nginx_test.yaml b/src/test/helm/ingress_nginx_test.yaml deleted file mode 100644 index f968300409794fbe83e56b70fd48e1dea3cee088..0000000000000000000000000000000000000000 --- a/src/test/helm/ingress_nginx_test.yaml +++ /dev/null @@ -1,68 +0,0 @@ -# -# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den -# Ministerpräsidenten des Landes Schleswig-Holstein -# Staatskanzlei -# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung -# -# Lizenziert unter der EUPL, Version 1.2 oder - sobald -# diese von der Europäischen Kommission genehmigt wurden - -# Folgeversionen der EUPL ("Lizenz"); -# Sie dürfen dieses Werk ausschließlich gemäß -# dieser Lizenz nutzen. -# Eine Kopie der Lizenz finden Sie hier: -# -# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 -# -# Sofern nicht durch anwendbare Rechtsvorschriften -# gefordert oder in schriftlicher Form vereinbart, wird -# die unter der Lizenz verbreitete Software "so wie sie -# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - -# ausdrücklich oder stillschweigend - verbreitet. -# Die sprachspezifischen Genehmigungen und Beschränkungen -# unter der Lizenz sind dem Lizenztext zu entnehmen. -# - -suite: test ingress options -templates: - - templates/ingress.yaml - -set: - ozgcloud: - bezeichner: helm - -tests: - - it: should create afm ingress tls - release: - name: afm-adapter - asserts: - - equal: - path: spec.tls[0].secretName - value: helm-afm-adapter-tls - - it: should create afm ingress tls - release: - name: fs-adapter - set: - image.name: formsolutions-adapter - asserts: - - equal: - path: spec.tls[0].secretName - value: helm-fs-adapter-tls - - - it: should not set secretName - set: - ingress.skipTlsSecret: true - asserts: - - isNull: - path: spec.tls[0].secretName - - - it: should not set ingressClassName - asserts: - - isNull: - path: spec.ingressClassName - - it: should set ingressClassName - set: - ingress.className: nginx - asserts: - - equal: - path: spec.ingressClassName - value: nginx \ No newline at end of file diff --git a/src/test/helm/ingress_test.yaml b/src/test/helm/ingress_test.yaml deleted file mode 100644 index ee0b43da744be9805ca8e9a5930f532f34e502db..0000000000000000000000000000000000000000 --- a/src/test/helm/ingress_test.yaml +++ /dev/null @@ -1,147 +0,0 @@ -# -# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den -# Ministerpräsidenten des Landes Schleswig-Holstein -# Staatskanzlei -# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung -# -# Lizenziert unter der EUPL, Version 1.2 oder - sobald -# diese von der Europäischen Kommission genehmigt wurden - -# Folgeversionen der EUPL ("Lizenz"); -# Sie dürfen dieses Werk ausschließlich gemäß -# dieser Lizenz nutzen. -# Eine Kopie der Lizenz finden Sie hier: -# -# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 -# -# Sofern nicht durch anwendbare Rechtsvorschriften -# gefordert oder in schriftlicher Form vereinbart, wird -# die unter der Lizenz verbreitete Software "so wie sie -# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - -# ausdrücklich oder stillschweigend - verbreitet. -# Die sprachspezifischen Genehmigungen und Beschränkungen -# unter der Lizenz sind dem Lizenztext zu entnehmen. -# - -suite: test ingress creation -release: - name: intelliform-adapter - namespace: sh-helm-test -templates: - - templates/ingress.yaml -set: - ozgcloud: - bezeichner: helm -tests: - - it: should match basic data - asserts: - - containsDocument: - kind: Ingress - apiVersion: networking.k8s.io/v1 - - equal: - path: metadata.name - value: intelliform-adapter - - equal: - path: metadata.namespace - value: sh-helm-test - - it: should match service port number - asserts: - - equal: - path: spec.rules[0].http.paths[0].backend.service.port.number - value: 8080 - - it: should match service name - asserts: - - equal: - path: spec.rules[0].http.paths[0].backend.service.name - value: intelliform-adapter - - it: should match service path - asserts: - - equal: - path: spec.rules[0].http.paths[0].path - value: '' - - it: should match service pathType - asserts: - - equal: - path: spec.rules[0].http.paths[0].pathType - value: ImplementationSpecific - - it: should create afm host - asserts: - - equal: - path: spec.rules[0].host - value: helm-afm.test.sh.ozg-cloud.de - - equal: - path: spec.tls[0].hosts[0] - value: helm-afm.test.sh.ozg-cloud.de - - - - it: should create fs host - set: - image.name: formsolutions-adapter - asserts: - - equal: - path: spec.rules[0].host - value: helm-fs.test.sh.ozg-cloud.de - - equal: - path: spec.tls[0].hosts[0] - value: helm-fs.test.sh.ozg-cloud.de - - - it: should create formcycle host - set: - image.name: formcycle-adapter - asserts: - - equal: - path: spec.rules[0].host - value: helm-formcycle.test.sh.ozg-cloud.de - - equal: - path: spec.tls[0].hosts[0] - value: helm-formcycle.test.sh.ozg-cloud.de - - - - it: should create custom adapter host - set: - ingress.adapterBezeichner: test - asserts: - - equal: - path: spec.rules[0].host - value: helm-test.test.sh.ozg-cloud.de - - equal: - path: spec.tls[0].hosts[0] - value: helm-test.test.sh.ozg-cloud.de - - - it: should use letsencrypt-prod cluster-issuer as default - asserts: - - equal: - path: metadata.annotations["cert-manager.io/cluster-issuer"] - value: letsencrypt-prod - - - it: should use letsencrypt-staging cluster-issuer if use_staging_cert is true - set: - ingress.use_staging_cert: true - asserts: - - equal: - path: metadata.annotations["cert-manager.io/cluster-issuer"] - value: letsencrypt-staging - - - it: should use letsencrypt-prod cluster-issuer if use_staging_cert is false - set: - ingress.use_staging_cert: false - asserts: - - equal: - path: metadata.annotations["cert-manager.io/cluster-issuer"] - value: letsencrypt-prod - - - it: should disable default cert-manager - set: - ingress.disableDefaultCertManager: true - asserts: - - notExists: - path: metadata.annotations["cert-manager.io/cluster-issuer"] - - - it: should set ingress annotation proxy body size to 42m - set: - ingress: - annotations: - nginx.ingress.kubernetes.io/proxy-body-size: 42m - asserts: - - equal: - path: metadata.annotations["nginx.ingress.kubernetes.io/proxy-body-size"] - value: 42m \ No newline at end of file diff --git a/src/test/helm/network_policy_test.yaml b/src/test/helm/network_policy_test.yaml deleted file mode 100644 index 30fc46d189a03d78ac050d89d8ec157b94f84ac7..0000000000000000000000000000000000000000 --- a/src/test/helm/network_policy_test.yaml +++ /dev/null @@ -1,225 +0,0 @@ -# -# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den -# Ministerpräsidenten des Landes Schleswig-Holstein -# Staatskanzlei -# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung -# -# Lizenziert unter der EUPL, Version 1.2 oder - sobald -# diese von der Europäischen Kommission genehmigt wurden - -# Folgeversionen der EUPL ("Lizenz"); -# Sie dürfen dieses Werk ausschließlich gemäß -# dieser Lizenz nutzen. -# Eine Kopie der Lizenz finden Sie hier: -# -# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 -# -# Sofern nicht durch anwendbare Rechtsvorschriften -# gefordert oder in schriftlicher Form vereinbart, wird -# die unter der Lizenz verbreitete Software "so wie sie -# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - -# ausdrücklich oder stillschweigend - verbreitet. -# Die sprachspezifischen Genehmigungen und Beschränkungen -# unter der Lizenz sind dem Lizenztext zu entnehmen. -# - -suite: network policy test -release: - name: afm-adapter - namespace: by-helm-test -templates: - - templates/network_policy.yaml -tests: - - it: should match apiVersion - set: - networkPolicy: - dnsServerNamespace: test-dns-namespace - asserts: - - isAPIVersion: - of: networking.k8s.io/v1 - - it: should match kind - set: - networkPolicy: - dnsServerNamespace: test-dns-namespace - asserts: - - isKind: - of: NetworkPolicy - - it: validate metadata - set: - networkPolicy: - dnsServerNamespace: test-dns-namespace - asserts: - - equal: - path: metadata - value: - name: network-policy-afm-adapter - namespace: by-helm-test - - it: validate spec - set: - networkPolicy: - dnsServerNamespace: test-dns-namespace - asserts: - - equal: - path: spec - value: - podSelector: - matchLabels: - ozg-component: eingangsadapter - policyTypes: - - Ingress - - Egress - ingress: - - ports: - - port: 8080 - - from: - - namespaceSelector: - matchLabels: - name: openshift-user-workload-monitoring - ports: - - protocol: TCP - port: 8081 - egress: - - to: - - podSelector: - matchLabels: - component: vorgang-manager - ports: - - port: 9090 - protocol: TCP - - to: - - namespaceSelector: - matchLabels: - kubernetes.io/metadata.name: test-dns-namespace - ports: - - port: 53 - protocol: UDP - - port: 53 - protocol: TCP - - port: 5353 - protocol: UDP - - port: 5353 - protocol: TCP - - - it: should set monitoring namespace - set: - networkPolicy: - dnsServerNamespace: test-dns-namespace - monitoringNamespace: test-monitoring - asserts: - - contains: - path: spec.ingress - content: - from: - - namespaceSelector: - matchLabels: - name: test-monitoring - ports: - - protocol: TCP - port: 8081 - - - it: test network policy disabled - set: - networkPolicy: - disabled: true - dnsServerNamespace: test-dns-namespace - asserts: - - hasDocuments: - count: 0 - - - it: test network policy unset should be disabled - set: - networkPolicy: - disabled: false - dnsServerNamespace: test-dns-namespace - asserts: - - hasDocuments: - count: 1 - - it: test network policy dnsServerNamespace must be set message - set: - networkPolicy: - disabled: false - asserts: - - failedTemplate: - errorMessage: networkPolicy.dnsServerNamespace must be set - - - it: test network policy should be enabled by default - set: - networkPolicy: - dnsServerNamespace: test-dns-server-namespace - asserts: - - hasDocuments: - count: 1 - - - - it: should add zufi rules when zufi-routing is enabled - set: - networkPolicy: - dnsServerNamespace: test-dns-server-namespace - routing: - routingStrategy: ZUFI - zufiManager: - namespace: zufi-namespace - asserts: - - contains: - path: spec.egress - content: - to: - - namespaceSelector: - matchLabels: - kubernetes.io/metadata.name: zufi-namespace - podSelector: - matchLabels: - component: zufi-server - ports: - - port: 9090 - protocol: TCP - - contains: - path: spec.egress - content: - to: - - namespaceSelector: {} - podSelector: - matchLabels: - component: vorgang-manager - ports: - - port: 9090 - protocol: TCP - - - it: should throw error when zufi is enabled but zufi namespace not set - set: - networkPolicy: - dnsServerNamespace: test-dns-server-namespace - routing: - routingStrategy: ZUFI - asserts: - - failedTemplate: - errorMessage: routing.zufiManager.namespace must be set if routingStrategy=ZUFI - - - it: should not add zufi rule when zufi-routing is disabled - set: - networkPolicy: - dnsServerNamespace: test-dns-server-namespace - routing: - zufiManager: - namespace: zufi-namespace - asserts: - - notContains: - path: spec.egress - content: - to: - - namespaceSelector: - matchLabels: - kubernetes.io/metadata.name: zufi-namespace - podSelector: - matchLabels: - component: zufi-server - - notContains: - path: spec.egress - content: - to: - - namespaceSelector: {} - podSelector: - matchLabels: - component: vorgang-manager - ports: - - port: 9090 - protocol: TCP \ No newline at end of file diff --git a/src/test/helm/realm_name_length_test.yaml b/src/test/helm/realm_name_length_test.yaml deleted file mode 100644 index 5cb46db2bb654c1ff01c2ad09c9d95e8e62b4158..0000000000000000000000000000000000000000 --- a/src/test/helm/realm_name_length_test.yaml +++ /dev/null @@ -1,41 +0,0 @@ -# -# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den -# Ministerpräsidenten des Landes Schleswig-Holstein -# Staatskanzlei -# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung -# -# Lizenziert unter der EUPL, Version 1.2 oder - sobald -# diese von der Europäischen Kommission genehmigt wurden - -# Folgeversionen der EUPL ("Lizenz"); -# Sie dürfen dieses Werk ausschließlich gemäß -# dieser Lizenz nutzen. -# Eine Kopie der Lizenz finden Sie hier: -# -# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 -# -# Sofern nicht durch anwendbare Rechtsvorschriften -# gefordert oder in schriftlicher Form vereinbart, wird -# die unter der Lizenz verbreitete Software "so wie sie -# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - -# ausdrücklich oder stillschweigend - verbreitet. -# Die sprachspezifischen Genehmigungen und Beschränkungen -# unter der Lizenz sind dem Lizenztext zu entnehmen. -# - -suite: test ozgcloud bezeichner length -release: - name: eingang-manager - namespace: sh-helm-test -templates: - - templates/ingress.yaml - -tests: - - it: should fail on bezeichner length longer than 46 characters - set: - ozgcloud: - bezeichner: test1234567890123123456789012345678901234567890123456789012345678901234567890123456789012345678904567890 - environment: test - bundesland: by - asserts: - - failedTemplate: - errorMessage: Bezeichner test1234567890123123456789012345678901234567890123456789012345678901234567890123456789012345678904567890 ist zu lang (max. 46 Zeichen) \ No newline at end of file diff --git a/src/test/helm/service_account_test.yaml b/src/test/helm/service_account_test.yaml deleted file mode 100644 index 81b86cc0508c4023402a30ec49ee8de8a5abff20..0000000000000000000000000000000000000000 --- a/src/test/helm/service_account_test.yaml +++ /dev/null @@ -1,108 +0,0 @@ -# -# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den -# Ministerpräsidenten des Landes Schleswig-Holstein -# Staatskanzlei -# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung -# -# Lizenziert unter der EUPL, Version 1.2 oder - sobald -# diese von der Europäischen Kommission genehmigt wurden - -# Folgeversionen der EUPL ("Lizenz"); -# Sie dürfen dieses Werk ausschließlich gemäß -# dieser Lizenz nutzen. -# Eine Kopie der Lizenz finden Sie hier: -# -# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 -# -# Sofern nicht durch anwendbare Rechtsvorschriften -# gefordert oder in schriftlicher Form vereinbart, wird -# die unter der Lizenz verbreitete Software "so wie sie -# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - -# ausdrücklich oder stillschweigend - verbreitet. -# Die sprachspezifischen Genehmigungen und Beschränkungen -# unter der Lizenz sind dem Lizenztext zu entnehmen. -# - -suite: test service account -release: - name: eingang-manager - namespace: sh-helm-test -templates: - - templates/service_account.yaml -tests: - - it: should create default afm adapter service account name - set: - image.name: intelliform-adapter - serviceAccount: - create: true - asserts: - - isKind: - of: ServiceAccount - - isAPIVersion: - of: v1 - - equal: - path: metadata.name - value: afm-adapter-service-account - - equal: - path: metadata.namespace - value: sh-helm-test - - - it: should create default fs adapter service account name - set: - image.name: formsolutions-adapter - serviceAccount: - create: true - asserts: - - isKind: - of: ServiceAccount - - equal: - path: metadata.name - value: fs-adapter-service-account - - equal: - path: metadata.namespace - value: sh-helm-test - - it: should create default formcycle adapter service account name - set: - image.name: formcycle-adapter - serviceAccount: - create: true - asserts: - - isKind: - of: ServiceAccount - - equal: - path: metadata.name - value: formcycle-adapter-service-account - - equal: - path: metadata.namespace - value: sh-helm-test - - it: should create default enterprise adapter service account name - set: - image.name: enterprise-adapter - serviceAccount: - create: true - asserts: - - isKind: - of: ServiceAccount - - equal: - path: metadata.name - value: enterprise-adapter-service-account - - equal: - path: metadata.namespace - value: sh-helm-test - - it: should create service account with name - set: - serviceAccount: - create: true - name: helm-service-account - asserts: - - isKind: - of: ServiceAccount - - equal: - path: metadata.name - value: helm-service-account - - equal: - path: metadata.namespace - value: sh-helm-test - - it: should not create service account - asserts: - - hasDocuments: - count: 0 \ No newline at end of file diff --git a/src/test/helm/service_monitor_test.yaml b/src/test/helm/service_monitor_test.yaml deleted file mode 100644 index c85a7a6b6cb599d55d1bd699bd84f2f2ac6f387c..0000000000000000000000000000000000000000 --- a/src/test/helm/service_monitor_test.yaml +++ /dev/null @@ -1,96 +0,0 @@ -# -# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den -# Ministerpräsidenten des Landes Schleswig-Holstein -# Staatskanzlei -# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung -# -# Lizenziert unter der EUPL, Version 1.2 oder - sobald -# diese von der Europäischen Kommission genehmigt wurden - -# Folgeversionen der EUPL ("Lizenz"); -# Sie dürfen dieses Werk ausschließlich gemäß -# dieser Lizenz nutzen. -# Eine Kopie der Lizenz finden Sie hier: -# -# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 -# -# Sofern nicht durch anwendbare Rechtsvorschriften -# gefordert oder in schriftlicher Form vereinbart, wird -# die unter der Lizenz verbreitete Software "so wie sie -# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - -# ausdrücklich oder stillschweigend - verbreitet. -# Die sprachspezifischen Genehmigungen und Beschränkungen -# unter der Lizenz sind dem Lizenztext zu entnehmen. -# - -suite: test service monitor -release: - name: afm-adapter - namespace: sh-helm-test -templates: - - templates/service_monitor.yaml -tests: - - it: should have basic info and the label component with value afm-adapter-service-monitor attached - asserts: - - isKind: - of: ServiceMonitor - - isAPIVersion: - of: monitoring.coreos.com/v1 - - equal: - path: metadata.name - value: afm-adapter - - equal: - path: metadata.namespace - value: sh-helm-test - - equal: - path: metadata.labels["component"] - value: afm-adapter-service-monitor - - - it: should contain default lables and component lables - asserts: - - equal: - path: metadata.labels - value: - app.kubernetes.io/instance: afm-adapter - app.kubernetes.io/managed-by: Helm - app.kubernetes.io/name: afm-adapter - app.kubernetes.io/namespace: sh-helm-test - app.kubernetes.io/part-of: ozgcloud - app.kubernetes.io/version: 0.0.0-MANAGED-BY-JENKINS - component: afm-adapter-service-monitor - helm.sh/chart: Intelliform-Adapter-0.0.0-MANAGED-BY-JENKINS - ozg-component: eingangsadapter - - - it: should have the metrics endpoint configured by default - set: - env.springProfiles: oc,stage - asserts: - - contains: - path: spec.endpoints - content: - port: metrics - path: /actuator/prometheus - - it: should be able to enable the endpoint - asserts: - - contains: - path: spec.endpoints - content: - port: metrics - path: /actuator/prometheus - - it: namespace selector should contain the namespace - asserts: - - contains: - path: spec.namespaceSelector.matchNames - content: sh-helm-test - - it: selector should contain the component label with the value afm-adapter-service - asserts: - - equal: - path: spec.selector.matchLabels["component"] - value: afm-adapter-service - - it: selector should contain helm recommended labels name and namespace - asserts: - - equal: - path: spec.selector.matchLabels["app.kubernetes.io/name"] - value: afm-adapter - - equal: - path: spec.selector.matchLabels["app.kubernetes.io/namespace"] - value: sh-helm-test diff --git a/src/test/helm/service_test.yaml b/src/test/helm/service_test.yaml deleted file mode 100644 index ebc38d5c4c073721252e15a296588b7a73af23bf..0000000000000000000000000000000000000000 --- a/src/test/helm/service_test.yaml +++ /dev/null @@ -1,100 +0,0 @@ -# -# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den -# Ministerpräsidenten des Landes Schleswig-Holstein -# Staatskanzlei -# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung -# -# Lizenziert unter der EUPL, Version 1.2 oder - sobald -# diese von der Europäischen Kommission genehmigt wurden - -# Folgeversionen der EUPL ("Lizenz"); -# Sie dürfen dieses Werk ausschließlich gemäß -# dieser Lizenz nutzen. -# Eine Kopie der Lizenz finden Sie hier: -# -# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 -# -# Sofern nicht durch anwendbare Rechtsvorschriften -# gefordert oder in schriftlicher Form vereinbart, wird -# die unter der Lizenz verbreitete Software "so wie sie -# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - -# ausdrücklich oder stillschweigend - verbreitet. -# Die sprachspezifischen Genehmigungen und Beschränkungen -# unter der Lizenz sind dem Lizenztext zu entnehmen. -# - -suite: test service -release: - name: afm-adapter - namespace: sh-helm-test -templates: - - templates/service.yaml -tests: - - it: should have basics and the label component with value afm-adapter-service attached - asserts: - - isKind: - of: Service - - isAPIVersion: - of: v1 - - equal: - path: metadata.labels["component"] - value: afm-adapter-service - - equal: - path: metadata.name - value: afm-adapter - - equal: - path: metadata.namespace - value: sh-helm-test - - it: should be of type ClusterIP - asserts: - - equal: - path: spec.type - value: ClusterIP - - it: ports should contain the 8080 default http port - asserts: - - contains: - path: spec.ports - content: - name: http - port: 8080 - protocol: TCP - targetPort: 8080 - count: 1 - any: true - - it: ports should contain the metrics port - asserts: - - contains: - path: spec.ports - content: - name: metrics - port: 8081 - protocol: TCP - count: 1 - any: true - - it: selector should contain the component label with the value afm-adapter - asserts: - - equal: - path: spec.selector["component"] - value: afm-adapter - - it: selector should contain helm recommended labels name and namespace - asserts: - - equal: - path: spec.selector["app.kubernetes.io/name"] - value: afm-adapter - - equal: - path: spec.selector["app.kubernetes.io/namespace"] - value: sh-helm-test - - - it: should contain default lables and component lables - asserts: - - equal: - path: metadata.labels - value: - app.kubernetes.io/instance: afm-adapter - app.kubernetes.io/managed-by: Helm - app.kubernetes.io/name: afm-adapter - app.kubernetes.io/namespace: sh-helm-test - app.kubernetes.io/part-of: ozgcloud - app.kubernetes.io/version: 0.0.0-MANAGED-BY-JENKINS - component: afm-adapter-service - helm.sh/chart: Intelliform-Adapter-0.0.0-MANAGED-BY-JENKINS - ozg-component: eingangsadapter \ No newline at end of file diff --git a/formsolutions-adapter/src/test/java/de/ozgcloud/eingang/formsolutions/FormSolutionsAttachmentsMapperTest.java b/src/test/java/de/ozgcloud/eingang/formsolutions/FormSolutionsAttachmentsMapperTest.java similarity index 100% rename from formsolutions-adapter/src/test/java/de/ozgcloud/eingang/formsolutions/FormSolutionsAttachmentsMapperTest.java rename to src/test/java/de/ozgcloud/eingang/formsolutions/FormSolutionsAttachmentsMapperTest.java diff --git a/formsolutions-adapter/src/test/java/de/ozgcloud/eingang/formsolutions/FormSolutionsEingangTestFactory.java b/src/test/java/de/ozgcloud/eingang/formsolutions/FormSolutionsEingangTestFactory.java similarity index 100% rename from formsolutions-adapter/src/test/java/de/ozgcloud/eingang/formsolutions/FormSolutionsEingangTestFactory.java rename to src/test/java/de/ozgcloud/eingang/formsolutions/FormSolutionsEingangTestFactory.java diff --git a/formsolutions-adapter/src/test/java/de/ozgcloud/eingang/formsolutions/FormSolutionsFileMapperUtilsTest.java b/src/test/java/de/ozgcloud/eingang/formsolutions/FormSolutionsFileMapperUtilsTest.java similarity index 100% rename from formsolutions-adapter/src/test/java/de/ozgcloud/eingang/formsolutions/FormSolutionsFileMapperUtilsTest.java rename to src/test/java/de/ozgcloud/eingang/formsolutions/FormSolutionsFileMapperUtilsTest.java diff --git a/formsolutions-adapter/src/test/java/de/ozgcloud/eingang/formsolutions/FormSolutionsFilesTestFactory.java b/src/test/java/de/ozgcloud/eingang/formsolutions/FormSolutionsFilesTestFactory.java similarity index 51% rename from formsolutions-adapter/src/test/java/de/ozgcloud/eingang/formsolutions/FormSolutionsFilesTestFactory.java rename to src/test/java/de/ozgcloud/eingang/formsolutions/FormSolutionsFilesTestFactory.java index 2fc6b7e14324b00a227f0d6ce1e6d9db4dbbd611..17a93b2dc2a2e1f4b8e8e0f6e96b2ad62441df42 100644 --- a/formsolutions-adapter/src/test/java/de/ozgcloud/eingang/formsolutions/FormSolutionsFilesTestFactory.java +++ b/src/test/java/de/ozgcloud/eingang/formsolutions/FormSolutionsFilesTestFactory.java @@ -34,7 +34,7 @@ public class FormSolutionsFilesTestFactory { public static final String ZIP_ENCODED = "UEsDBBQACAAIACpaS1QAAAAAAAAAAFipAwAIACAAMjQway50eHRVVA0AB7A3BmJPRzNixTcGYnV4CwABBGJsYAsEAQJgC+3YTXIb1xmF4TlX0QtQaQ+uZOjKJJUFtIAW1TF+aHS3HGv1uQ2SoeJKUskgxeP7PZPEPxIBvDjq6+f+eL1N52F+WrbzcLyerrdhmddhPE/rh+FwvSzTOq1b+4fjsf2aw3x5HKbTvN4+DMt0HI7zeB4u18t2/nWY5tv5ehzW6fzUfsh8+Toft8s6bOtwGj+1Fxmm9fkFpuE8Pl7GYTzNP2+/th8w3cb1u5/39XrantZt/Dj8sA5fp9t1mK7L/rvHw2Fb9l+/Dn/dlvU6HLfry4+8//tpHG7Tp+38cfhze9PDob3PcfhpXI7D4/Zpuj3epsuH9m7bK43DOv40n8f275fxcli39vuXdfjx37b4+B/+nU46/e+dHh7+uM3LMG7tA7Z3dRqm9ovm27y1z/P8a+fL8GW6HG/Trf2m9jdft9PTto7rtP/y9o+mZWkf/XpqrzRPz21/3vZPvv+0+XR6fdFWahs+T9vjPK7DZTudxuHzeJhP87K//muS21uTc/sM+1/P9yjX49yqzI+XeVnm8/DzNg+fTuPl2N7B022clql9KXvgcW0v+O3bbT4Nx+k0XfZPuj1u7dPsn/PlnbQ3v7+Tcf7tO/kvhnPYlzPdhn0589t0frucNp3L/OlL+9Dzch/QfDl8N532Kv9yOC+7ua9lfRrv39Bf1uGX9t6G9mHO7WWH87z/xdf2t+P5w15iaS+5rLftOEx/m26Huc1gna+XYf9o58P19tTe7rK19/rUPsrp2ma77r9nXk77m7m/7vzUfu8+tcP13N7u9e2L/DhYyD8t5OHhT+1bOs3tz97rY6G9lWHZv7GxfROf2k9pP3f+3JoM16f7N9E+9P4Kl/lLe9X53L6Q43z//s/7fuZje7dtI+fxW3vjT6fxcN/A5/3/h6fr/eOMy7I/AuLm+d7jzHiA7e8j6bHu+Ps/d/rh7Y3/4xPfP+fz/zwXef0U+yd6CXn/0Pcy7bO8NN4bvQTeP+/6lvk5yEvp7z5++6jtr7/7/Pcez19AS/HS6zXCXub+Gq91tpdv4O07+Z3saf9j9gfzTftadPp9dBLCYHTC7ABExTkGs8MWgtmYjdl9HH+YjdkV56tTxU5CGIxOmB2AqDjHYHbYQjAbszG7j+MPszG74nx1qthJCIPRCbMDEBXnGMwOWwhmYzZm93H8YTZmV5yvThU7CWEwOmF2AKLiHIPZYQvBbMzG7D6OP8zG7Irz1aliJyEMRifMDkBUnGMwO2whmI3ZmN3H8YfZmF1xvjpV7CSEweiE2QGIinMMZoctBLMxG7P7OP4wG7Mrzlenip2EMBidMDsAUXGOweywhWA2ZmN2H8cfZmN2xfnqVLGTEAajE2YHICrOMZgdthDMxmzM7uP4w2zMrjhfnSp2EsJgdMLsAETFOQazwxaC2ZiN2X0cf5iN2RXnq1PFTkIYjE6YHYCoOMdgdthCMBuzMbuP4w+zMbvifHWq2EkIg9EJswMQFecYzA5bCGZjNmb3cfxhNmZXnK9OFTsJYTA6YXYAouIcg9lhC8FszMbsPo4/zMbsivPVqWInIQxGJ8wOQFScYzA7bCGYjdmY3cfxh9mYXXG+OlXsJITB6ITZAYiKcwxmhy0EszEbs/s4/jAbsyvOV6eKnYQwGJ0wOwBRcY7B7LCFYDZmY3Yfxx9mY3bF+epUsZMQBqMTZgcgKs4xmB22EMzGbMzu4/jDbMyuOF+dKnYSwmB0wuwARMU5BrPDFoLZmI3ZfRx/mI3ZFeerU8VOQhiMTpgdgKg4x2B22EIwG7Mxu4/jD7Mxu+J8darYSQiD0QmzAxAV5xjMDlsIZmM2Zvdx/GE2Zlecr04VOwlhMDphdgCi4hyD2WELwWzMxuw+jj/MxuyK89WpYichDEYnzA5AVJxjMDtsIZiN2Zjdx/GH2Zhdcb46VewkhMHohNkBiIpzDGaHLQSzMRuz+zj+MBuzK85Xp4qdhDAYnTA7AFFxjsHssIVgNmZjdh/HH2ZjdsX56lSxkxAGoxNmByAqzjGYHbYQzMZszO7j+MNszK44X50qdhLCYHTC7ABExTnmfZj98OBPkCeNTp7InsgZT2QXny4+XXy6+Oz8+HPx6eKz4nx1qthJCIPRCbMDEBXnGMwOWwhmYzZm93H8YTZmV5yvThU7CWEwOmF2AKLiHIPZYQvBbMzG7D6OP8zG7Irz1aliJyEMRifMDkBUnGMwO2whmI3ZmN3H8YfZmF1xvjpV7CSEweiE2QGIinMMZoctBLMxG7P7OP4wG7Mrzlenip2EMBidMDsAUXGOweywhWA2ZmN2H8cfZmN2xfnqVLGTEAajE2YHICrOMZgdthDMxmzM7uP4w2zMrjhfnSp2EsJgdMLsAETFOQazwxaC2ZiN2X0cf5iN2RXnq1PFTkIYjE6YHYCoOMdgdthCMBuzMbuP4w+zMbvifHWq2EkIg9EJswMQFecYzA5bCGZjNmb3cfxhNmZXnK9OFTsJYTA6YXYAouIcg9lhC8FszMbsPo4/zMbsivPVqWInIQxGJ8wOQFScYzA7bCGYjdmY3cfxh9mYXXG+OlXsJITB6ITZAYiKcwxmhy0EszEbs/s4/jAbsyvOV6eKnYQwGJ0wOwBRcY7B7LCFYDZmY3Yfxx9mY3bF+epUsZMQBqMTZgcgKs4xmB22EMzGbMzu4/jDbMyuOF+dKnYSwmB0wuwARMU5BrPDFoLZmI3ZfRx/mI3ZFeerU8VOQhiMTpgdgKg4x2B22EIwG7Mxu4/jD7Mxu+J8darYSQiD0QmzAxAV5xjMDlsIZmM2Zvdx/GE2Zlecr04VOwlhMDphdgCi4hyD2WELwWzMxuw+jj/MxuyK89WpYichDEYnzA5AVJxjMDtsIZiN2Zjdx/GH2Zhdcb46VewkhMHohNkBiIpzDGaHLQSzMRuz+zj+MBuzK85Xp4qdhDAYnTA7AFFxjsHssIVgNmZjdh/HH2ZjdsX56lSxkxAGoxNmByAqzjGYHbYQzMZszO7j+MNszK44X50qdhLCYHTC7ABExTkGs8MWgtmYjdl9HH+YjdkV56tTxU5CGIxOmB2AqDjHYHbYQjAbszG7j+MPszG74nx1qthJCIPRCbMDEBXnmPdh9sODP0AeNDp5IHsgRzyQ3Xu693Tv6d6z8+PPvad7z4rz1aliJyEMRifMDkBUnGMwO2whroQ9g3VyVr3/k8hZ5axyJexK2JVwhePPlbAr4Yrz1aliJyEMRifMDkBUnGMwO2whroQ9g3VyVr3/k8hZ5axyJexK2JVwhePPlbAr4Yrz1aliJyEMRifMDkBUnGMwO2whroQ9g3VyVr3/k8hZ5axyJexK2JVwhePPlbAr4Yrz1aliJyEMRifMDkBUnGMwO2whroQ9g3VyVr3/k8hZ5axyJexK2JVwhePPlbAr4Yrz1aliJyEMRifMDkBUnGMwO2whvpC4L8TD3qGok/94eO8nkf94cFa5o3dH746+wvHnjt4dfcX56lSxkxAGoxNmByAqzjGYHbYQV8KewTo5q97/SeSscla5EnYl7Eq4wvHnStiVcMX56lSxkxAGoxNmByAqzjGYHbaQh4e/A1BLBwjvMF5fdAoAAFipAwBQSwMEFAAIAAgAe1pLVAAAAAAAAAAAGOQDAAgAIAAyNTVrLnR4dFVUDQAHSzgGYj01M2JLOAZidXgLAAEEYmxgCwQBAmAL7dhNctvoFUbhuVaBBbi8h65k2JVJKguASVhGmj8yAThprz4fKCl2upJUepDS6+8+E1u2KAI4OMTVuT9fb9N5mJ+W7Twcr6frbVjmdRjP0/puOFwvy7RO69b+czy21xzmy+Mwneb19m5YpuNwnMfzcLletvOvwzTfztfjsE7np/Ym8+XLfNwu67Ctw2n80A4yTOvzAabhPD5exmE8zZ+3X9sbTLdx/e79vlxP29O6je+Hn9bhy3S7DtN12X96PBy2ZX/9Ovx1W9brcNyuL295//40Drfpw3Z+P/y5nfRwaOc5Dr+My3F43D5Mt8fbdHnXzrYdaRzW8Zf5PLbvL+PlsG7t55d1+Pk/snj/X76HE06/n9PDwx+3eRnGrV1gO6vTMLUXzbd5a9fz/Nr5MnyaLsfbdGs/1P7xZTs9beu4TvvL239Ny9Iu/XpqR5qnZ7aft/3K93ebT6fXgzZS2/Bx2h7ncR0u2+k0Dh/Hw3yal/34r0hu35ic2zXsX893KNfj3KjMj5d5Webz8Hmbhw+n8XJsZ/B0G6dlajdlBzyu7YBfv97m03CcTtNlv9LtcWtXs1/ny5m0k9/PZJx/eyb/gziH3ZzpNuzmzN/U+a05TZ3L/OFTu+h5uQs0Xw7fqdOO8m/FefHmbsv6NN7v0F/W4W/t3IZ2Med22OE87198af8cz+92Eks75LLetuMw/X26HeamwTpfL8N+aefD9fbUTnfZ2rk+tUs5XZu26/4z83LaT+Z+3Pmp/eyu2uF6bqd7/XYj3w8M+RdDHh7+1O7SaW6fvdfHQjuVYdnv2NjuxIf2Lu1954+NyXB9ut+JdtH7ES7zp3bU+dxuyHG+3//z7s98bGfbHDmPX9uJP53Gw92Bj/vfw9P1fjnjsuyPgDg931rOjAfYfh5Jj3Xj7//M6advJ/7PK75f5/Mfz0Rer2K/oheQ94u+k2nX8sJ4Z/QCeL/e9RvmZyAvpL+7/Hap7evvrv/O4/kGNBQvvF4h7GTux3ils73cgW/35Afxaf+Y/YG+abcFpx+DExCEwUlmB0RUXMfI7DBDZLbMltl9jD+ZLbMr6otTRU5AEAYnmR0QUXEdI7PDDJHZMltm9zH+ZLbMrqgvThU5AUEYnGR2QETFdYzMDjNEZstsmd3H+JPZMruivjhV5AQEYXCS2QERFdcxMjvMEJkts2V2H+NPZsvsivriVJETEITBSWYHRFRcx8jsMENktsyW2X2MP5ktsyvqi1NFTkAQBieZHRBRcR0js8MMkdkyW2b3Mf5ktsyuqC9OFTkBQRicZHZARMV1jMwOM0Rmy2yZ3cf4k9kyu6K+OFXkBARhcJLZAREV1zEyO8wQmS2zZXYf409my+yK+uJUkRMQhMFJZgdEVFzHyOwwQ2S2zJbZfYw/mS2zK+qLU0VOQBAGJ5kdEFFxHSOzwwyR2TJbZvcx/mS2zK6oL04VOQFBGJxkdkBExXWMzA4zRGbLbJndx/iT2TK7or44VeQEBGFwktkBERXXMTI7zBCZLbNldh/jT2bL7Ir64lSRExCEwUlmB0RUXMfI7DBDZLbMltl9jD+ZLbMr6otTRU5AEAYnmR0QUXEdI7PDDJHZMltm9zH+ZLbMrqgvThU5AUEYnGR2QETFdYzMDjNEZstsmd3H+JPZMruivjhV5AQEYXCS2QERFdcxMjvMEJkts2V2H+NPZsvsivriVJETEITBSWYHRFRcx8jsMENktsyW2X2MP5ktsyvqi1NFTkAQBieZHRBRcR0js8MMkdkyW2b3Mf5ktsyuqC9OFTkBQRicZHZARMV1jMwOM0Rmy2yZ3cf4k9kyu6K+OFXkBARhcJLZAREV1zEyO8wQmS2zZXYf409my+yK+uJUkRMQhMFJZgdEVFzHyOwwQ2S2zJbZfYw/mS2zK+qLU0VOQBAGJ5kdEFFxHSOzwwyR2TJbZvcx/mS2zK6oL04VOQFBGJxkdkBExXWMzA4zRGbLbJndx/iT2TK7or44VeQEBGFwktkBERXXMTI7zBCZLbNldh/jT2bL7Ir64lSRExCEwUlmB0RUXMe8TWY/PPgEedLg5InsiZzxRLb4tPi0+LT47Hz8WXxafFbUF6eKnIAgDE4yOyCi4jpGZocZIrNltszuY/zJbJldUV+cKnICgjA4yeyAiIrrGJkdZojMltkyu4/xJ7NldkV9carICQjC4CSzAyIqrmNkdpghMltmy+w+xp/MltkV9cWpIicgCIOTzA6IqLiOkdlhhshsmS2z+xh/MltmV9QXp4qcgCAMTjI7IKLiOkZmhxkis2W2zO5j/MlsmV1RX5wqcgKCMDjJ7ICIiusYmR1miMyW2TK7j/Ens2V2RX1xqsgJCMLgJLMDIiquY2R2mCEyW2bL7D7Gn8yW2RX1xakiJyAIg5PMDoiouI6R2WGGyGyZLbP7GH8yW2ZX1BenipyAIAxOMjsgouI6RmaHGSKzZbbM7mP8yWyZXVFfnCpyAoIwOMnsgIiK6xiZHWaIzJbZMruP8SezZXZFfXGqyAkIwuAkswMiKq5jZHaYITJbZsvsPsafzJbZFfXFqSInIAiDk8wOiKi4jpHZYYbIbJkts/sYfzJbZlfUF6eKnIAgDE4yOyCi4jpGZocZIrNltszuY/zJbJldUV+cKnICgjA4yeyAiIrrGJkdZojMltkyu4/xJ7NldkV9carICQjC4CSzAyIqrmNkdpghMltmy+w+xp/MltkV9cWpIicgCIOTzA6IqLiOkdlhhshsmS2z+xh/MltmV9QXp4qcgCAMTjI7IKLiOkZmhxkis2W2zO5j/MlsmV1RX5wqcgKCMDjJ7ICIiusYmR1miMyW2TK7j/Ens2V2RX1xqsgJCMLgJLMDIiquY2R2mCEyW2bL7D7Gn8yW2RX1xakiJyAIg5PMDoiouI6R2WGGyGyZLbP7GH8yW2ZX1BenipyAIAxOMjsgouI6RmaHGSKzZbbM7mP8yWyZXVFfnCpyAoIwOMnsgIiK6xiZHWaIzJbZMruP8SezZXZFfXGqyAkIwuAkswMiKq5jZHaYITJbZsvsPsafzJbZFfXFqSInIAiDk8wOiKi4jpHZYYbIbJkts/sYfzJbZlfUF6eKnIAgDE4yOyCi4jrmbTL74cEHyIMGJw9kD+SIB7K9p72nvae9Z+fjz97T3rOivjhV5AQEYXCS2QERFdcxMjvMECthz2CczKq3fxKZVWaVlbCVsJVwhfFnJWwlXFFfnCpyAoIwOMnsgIiK6xiZHWaIlbBnME5m1ds/icwqs8pK2ErYSrjC+LMSthKuqC9OFTkBQRicZHZARMV1jMwOM8RK2DMYJ7Pq7Z9EZpVZZSVsJWwlXGH8WQlbCVfUF6eKnIAgDE4yOyCi4jpGZocZYiXsGYyTWfX2TyKzyqyyErYSthKuMP6shK2EK+qLU0VOQBAGJ5kdEFFxHSOzwwxxQ+JuiIe9oYiTXx7e+knklwezyo7ejt6OvsL4s6O3o6+oL04VOQFBGJxkdkBExXWMzA4zxErYMxgns+rtn0RmlVllJWwlbCVcYfxZCVsJV9QXp4qcgCAMTjI7IKLiOkZmhxny4DPjM+MzYzVlNWU1VfBXRqspq6mK+uJUkRMQhMHJaiogouI6RmaHGWI15TPjM2M1ZTVlNVXxV0arKaupivriVJETEITByWoqIKLiOkZmhxliNeUz4zNjNWU1ZTVV8VdGqymrqYr64lSRExCEwclqKiCi4jpGZocZ8vDwu17uxd+9GLsfj93DPwBQSwcIPFXRB/0KAAAY5AMAUEsBAhQDFAAIAAgAKlpLVO8wXl90CgAAWKkDAAgAIAAAAAAAAAAAAKSBAAAAADI0MGsudHh0VVQNAAewNwZiT0czYsU3BmJ1eAsAAQRibGALBAECYAtQSwECFAMUAAgACAB7WktUPFXRB/0KAAAY5AMACAAgAAAAAAAAAAAApIHKCgAAMjU1ay50eHRVVA0AB0s4BmI9NTNiSzgGYnV4CwABBGJsYAsEAQJgC1BLBQYAAAAAAgACAKwAAAAdFgAAAAA="; public static final byte[] ZIP_DECODED = Base64.getDecoder().decode(ZIP_ENCODED.getBytes()); - public static final String PDF_ENCODED = "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ZW5kb2JqCjI5IDAgb2JqCjw8L0NvbG9yU3BhY2UvRGV2aWNlR3JheS9TdWJ0eXBlL0ltYWdlL0hlaWdodCAxOS9GaWx0ZXIvRmxhdGVEZWNvZGUvVHlwZS9YT2JqZWN0L1dpZHRoIDE5L0xlbmd0aCAxMzIvQml0c1BlckNvbXBvbmVudCA4Pj5zdHJlYW0KeJxl0AENwCAMBMCXUAmTgAQkTMIkTEIdIGESkDAJSJgEJHQtDEKzTyDhUlqCyD83+9wijCVEYE+HSPQUtA97KiJ1c5S06HS9oo3HSvTYtU6Uc1DKWrSjk64asKtkfGSHulXdaFCbZImYhKtJwkLNCjmycQGeqMwX8/ivtP7XPy90XasiCmVuZHN0cmVhbQplbmRvYmoKMzAgMCBvYmoKPDwvQ29sb3JTcGFjZS9EZXZpY2VSR0IvU3VidHlwZS9JbWFnZS9IZWlnaHQgMTkvRmlsdGVyL0ZsYXRlRGVjb2RlL1R5cGUvWE9iamVjdC9XaWR0aCAxOS9TTWFzayAyOSAwIFIvTGVuZ3RoIDE4L0JpdHNQZXJDb21wb25lbnQgOD4+c3RyZWFtCnicY2AYBaNgFIwCkgEABDsAAQplbmRzdHJlYW0KZW5kb2JqCjMxIDAgb2JqCjw8L0NvbG9yU3BhY2UvRGV2aWNlR3JheS9TdWJ0eXBlL0ltYWdlL0hlaWdodCAxOS9GaWx0ZXIvRmxhdGVEZWNvZGUvVHlwZS9YT2JqZWN0L1dpZHRoIDE5L0xlbmd0aCAzMS9CaXRzUGVyQ29tcG9uZW50IDg+PnN0cmVhbQp4nPv/HxPsb0AF+///b2BABQ2jQgghLOGFCQANA2i1CmVuZHN0cmVhbQplbmRvYmoKMzIgMCBvYmoKPDwvQ29sb3JTcGFjZS9EZXZpY2VSR0IvU3VidHlwZS9JbWFnZS9IZWlnaHQgMTkvRmlsdGVyL0ZsYXRlRGVjb2RlL1R5cGUvWE9iamVjdC9XaWR0aCAxOS9TTWFzayAzMSAwIFIvTGVuZ3RoIDE4L0JpdHNQZXJDb21wb25lbnQgOD4+c3RyZWFtCnicY2AYBaNgFIwCkgEABDsAAQplbmRzdHJlYW0KZW5kb2JqCjMzIDAgb2JqCjw8L0NvbG9yU3BhY2UvRGV2aWNlR3JheS9TdWJ0eXBlL0ltYWdlL0hlaWdodCAxOS9GaWx0ZXIvRmxhdGVEZWNvZGUvVHlwZS9YT2JqZWN0L1dpZHRoIDE5L0xlbmd0aCAzMS9CaXRzUGVyQ29tcG9uZW50IDg+PnN0cmVhbQp4nPv/HxPsb0AF+///b2BABQ2jQgghLOGFCQANA2i1CmVuZHN0cmVhbQplbmRvYmoKMzQgMCBvYmoKPDwvQ29sb3JTcGFjZS9EZXZpY2VSR0IvU3VidHlwZS9JbWFnZS9IZWlnaHQgMTkvRmlsdGVyL0ZsYXRlRGVjb2RlL1R5cGUvWE9iamVjdC9XaWR0aCAxOS9TTWFzayAzMyAwIFIvTGVuZ3RoIDE4L0JpdHNQZXJDb21wb25lbnQgOD4+c3RyZWFtCnicY2AYBaNgFIwCkgEABDsAAQplbmRzdHJlYW0KZW5kb2JqCjM1IDAgb2JqCjw8L0NvbG9yU3BhY2UvRGV2aWNlR3JheS9TdWJ0eXBlL0ltYWdlL0hlaWdodCAxOS9GaWx0ZXIvRmxhdGVEZWNvZGUvVHlwZS9YT2JqZWN0L1dpZHRoIDE5L0xlbmd0aCAxMzIvQml0c1BlckNvbXBvbmVudCA4Pj5zdHJlYW0KeJxl0AENwCAMBMCXUAmTgAQkTMIkTEIdIGESkDAJSJgEJHQtDEKzTyDhUlqCyD83+9wijCVEYE+HSPQUtA97KiJ1c5S06HS9oo3HSvTYtU6Uc1DKWrSjk64asKtkfGSHulXdaFCbZImYhKtJwkLNCjmycQGeqMwX8/ivtP7XPy90XasiCmVuZHN0cmVhbQplbmRvYmoKMzYgMCBvYmoKPDwvQ29sb3JTcGFjZS9EZXZpY2VSR0IvU3VidHlwZS9JbWFnZS9IZWlnaHQgMTkvRmlsdGVyL0ZsYXRlRGVjb2RlL1R5cGUvWE9iamVjdC9XaWR0aCAxOS9TTWFzayAzNSAwIFIvTGVuZ3RoIDE4L0JpdHNQZXJDb21wb25lbnQgOD4+c3RyZWFtCnicY2AYBaNgFIwCkgEABDsAAQplbmRzdHJlYW0KZW5kb2JqCjM3IDAgb2JqCjw8L1N1YnR5cGUvRm9ybS9GaWx0ZXIvRmxhdGVEZWNvZGUvVHlwZS9YT2JqZWN0L01hdHJpeFsxIDAgMCAxIDAgMF0vRm9ybVR5cGUgMS9SZXNvdXJjZXM8PC9Gb250PDwvSGVsdiAx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bHYgMTAgMCBSPj4+Pi9SZWN0WzAgMCAwIDBdL0FQPDwvTiAxMSAwIFI+Pi9GZiAwPj4KZW5kb2JqCjQ5IDAgb2JqCjw8L0JTPDwvUy9TL1cgMT4+L1N1YnR5cGUvV2lkZ2V0L1QoZmlsZVVybCkvVHlwZS9Bbm5vdC9WKGh0dHBzJTNBJTJGJTJGa3VuZGVudGVzdC5mb3JtLXNvbHV0aW9ucy5kZSUyRm1ldGFmb3JtJTJGRm9ybS1Tb2x1dGlvbnMlMkZzaWQlMkZhc3Npc3RhbnQlMkY2MWIyMDhlODY2ZGExMjM2NDRjOTdlNTYlM0ZhbmxpZWdlbklkJTNEMTIzNCUyNm9yZ2FuaXNhdGlvbnNlaW5oZWl0ZW5JRCUzRDkwMzAyMjklMjZrb21tdW5hbHZlcndhbHR1bmdJZCUzRDEwMDAwMDAwMCUyNmNvbnNlbnRDb21wbGV0ZSUzRHRydWUlMjZjYWNoZUlEJTNENGZiNmI2ZTAtMGYxYy00OTcwLWI5ZWQtZGJmMjQyZDMzM2Y5JTI2Y2l0aXplblBvcnRhbExvZ2luU3VjY2VzcyUzRHRydWUpL0YgNi9EQSgvSGVsdiAwIFRmIDAgZyApL0ZUL1R4L0RSPDwvRm9udDw8L0hlbHYgMTAgMCBSPj4+Pi9SZWN0WzAgMCAwIDBdL0FQPDwvTiAxMiAwIFI+Pi9GZiAwPj4KZW5kb2JqCjUwIDAgb2JqCjw8L0JTPDwvUy9TL1cgMT4+L1N1YnR5cGUvV2lkZ2V0L1QoQVNfVm9ybmFtZSkvVHlwZS9Bbm5vdC9WKFN1c2FubmUpL0YgNi9EQSgvSGVsdiAwIFRmIDAgZyApL0ZUL1R4L0RSPDwvRm9udDw8L0hlbHYgMTAgMCBSPj4+Pi9SZWN0WzAgMCAwIDBdL0FQPDwvTiAxNSAwIFI+Pi9GZiAwPj4KZW5kb2JqCjUxIDAgb2JqCjw8L0JTPDwvUy9TL1cgMT4+L1N1YnR5cGUvV2lkZ2V0L1QoQVNfTmFtZSkvVHlwZS9Bbm5vdC9WKEZpc2NoZXIpL0YgNi9EQSgvSGVsdiAwIFRmIDAgZyApL0ZUL1R4L0RSPDwvRm9udDw8L0hlbHYgMTAgMCBSPj4+Pi9SZWN0WzAgMCAwIDBdL0FQPDwvTiAxNiAwIFI+Pi9GZiAwPj4KZW5kb2JqCjUyIDAgb2JqCjw8L0JTPDwvUy9TL1cgMT4+L1N1YnR5cGUvV2lkZ2V0L1QoQVNfUnVmbmFtZSkvVHlwZS9Bbm5vdC9GIDYvREEoL0hlbHYgMCBUZiAwIGcgKS9GVC9UeC9EUjw8L0ZvbnQ8PC9IZWx2IDEwIDAgUj4+Pj4vUmVjdFswIDAgMCAwXS9BUDw8L04gMTcgMCBSPj4vRmYgMD4+CmVuZG9iago1MyAwIG9iago8PC9CUzw8L1MvUy9XIDE+Pi9TdWJ0eXBlL1dpZGdldC9UKEFTX09yZGVuc25hbWVfS3VlbnN0bGVybmFtZSkvVHlwZS9Bbm5vdC9GIDYvREEoL0hlbHYgMCBUZiAwIGcgKS9GVC9UeC9EUjw8L0ZvbnQ8PC9IZWx2IDEwIDAgUj4+Pj4vUmVjdFswIDAgMCAwXS9BUDw8L04gMTggMCBSPj4vRmYgMD4+CmVuZG9iago1NCAwIG9iago8PC9CUzw8L1MvUy9XIDE+Pi9TdWJ0eXBlL1dpZGdldC9UKHN0YWF0KS9UeXBlL0Fubm90L1YoREUpL0YgNi9EQSgvSGVsdiAwIFRmIDAgZyApL0ZUL1R4L0RSPDwvRm9udDw8L0hlbHYgMTAgMCBSPj4+Pi9SZWN0WzAgMCAwIDBdL0FQPDwvTiAxOSAwIFI+Pi9GZiAwPj4KZW5kb2JqCjU1IDAgb2JqCjw8L0JTPDwvUy9TL1cgMT4+L1N1YnR5cGUvV2lkZ2V0L1QoQVNfUExaKS9UeXBlL0Fubm90L1YoMTIzNDUpL0YgNi9EQSgvSGVsdiAwIFRmIDAgZyApL0ZUL1R4L0RSPDwvRm9udDw8L0hlbHYgMTAgMCBSPj4+Pi9SZWN0WzAgMCAwIDBdL0FQPDwvTiAyMCAwIFI+Pi9GZiAwPj4KZW5kb2JqCjU2IDAgb2JqCjw8L0JTPDwvUy9TL1cgMT4+L1N1YnR5cGUvV2lkZ2V0L1QoQVNfT3J0KS9UeXBlL0Fubm90L1YoS2llbCkvRiA2L0RBKC9IZWx2IDAgVGYgMCBnICkvRlQvVHgvRFI8PC9Gb250PDwvSGVsdiAxMCAwIFI+Pj4+L1JlY3RbMCAwIDAgMF0vQVA8PC9OIDIxIDAgUj4+L0ZmIDA+PgplbmRvYmoKNTcgMCBvYmoKPDwvQlM8PC9TL1MvVyAxPj4vU3VidHlwZS9XaWRnZXQvVChCdW5kZXNsYW5kKS9UeXBlL0Fubm90L0YgNi9EQSgvSGVsdiAwIFRmIDAgZyApL0ZUL1R4L0RSPDwvRm9udDw8L0hlbHYgMTAgMCBSPj4+Pi9SZWN0WzAgMCAwIDBdL0FQPDwvTiAyMiAwIFI+Pi9GZiAwPj4KZW5kb2JqCjU4IDAgb2JqCjw8L0JTPDwvUy9TL1cgMT4+L1N1YnR5cGUvV2lkZ2V0L1QoQVNfU3RyYXNzZSkvVHlwZS9Bbm5vdC9WKEhhdXB0c3RyYd9lKS9GIDYvREEoL0hlbHYgMCBUZiAwIGcgKS9GVC9UeC9EUjw8L0ZvbnQ8PC9IZWx2IDEwIDAgUj4+Pj4vUmVjdFswIDAgMCAwXS9BUDw8L04gMjMgMCBSPj4vRmYgMD4+CmVuZG9iago1OSAwIG9iago8PC9CUzw8L1MvUy9XIDE+Pi9TdWJ0eXBlL1dpZGdldC9UKEFTX0hhdXNudW1tZXIpL1R5cGUvQW5ub3QvRiA2L0RBKC9IZWx2IDAgVGYgMCBnICkvRlQvVHgvRFI8PC9Gb250PDwvSGVsdiAxMCAwIFI+Pj4+L1JlY3RbMCAwIDAgMF0vQVA8PC9OIDI0IDAgUj4+L0ZmIDA+PgplbmRvYmoKNjAgMCBvYmoKPDwvQlM8PC9TL1MvVyAxPj4vU3VidHlwZS9XaWRnZXQvVChBU19UZWxlZm9uKS9UeXBlL0Fubm90L0YgNi9EQSgvSGVsdiAwIFRmIDAgZyApL0ZUL1R4L0RSPDwvRm9udDw8L0hlbHYgMTAgMCBSPj4+Pi9SZWN0WzAgMCAwIDBdL0FQPDwvTiAyNSAwIFI+Pi9GZiAwPj4KZW5kb2JqCjYxIDAgb2JqCjw8L0JTPDwvUy9TL1cgMT4+L1N1YnR5cGUvV2lkZ2V0L1QoQVNfRS1NYWlsKS9UeXBlL0Fubm90L1Yobm9yZXBseUBvemctc2guZGU=KS9GIDYvREEoL0hlbHYgMCBUZiAwIGcgKS9GVC9UeC9EUjw8L0ZvbnQ8PC9IZWx2IDEwIDAgUj4+Pj4vUmVjdFswIDAgMCAwXS9BUDw8L04gMjYgMCBSPj4vRmYgMD4+CmVuZG9iago2MiAwIG9iago8PC9CUzw8L1MvUy9XIDE+Pi9TdWJ0eXBlL1dpZGdldC9UKEFTX0ZheCkvVHlwZS9Bbm5vdC9GIDYvREEoL0hlbHYgMCBUZiAwIGcgKS9GVC9UeC9EUjw8L0ZvbnQ8PC9IZWx2IDEwIDAgUj4+Pj4vUmVjdFswIDAgMCAwXS9BUDw8L04gMjcgMCBSPj4vRmYgMD4+CmVuZG9iago2MyAwIG9iago8PC9CUzw8L1MvUy9XIDE+Pi9TdWJ0eXBlL1dpZGdldC9UKG9mc1hYMV9mcm9tX3NtYWlsMykvVHlwZS9Bbm5vdC9WKHN1c2FubmUuZmlzY2hlckBkYXRhcG9ydC5kZSkvRiA2L0RBKC9IZWx2IDAgVGYgMCBnICkvRlQvVHgvRFI8PC9Gb250PDwvSGVsdiAxMCAwIFI+Pj4+L1JlY3RbMCAwIDAgMF0vQVA8PC9OIDI4IDAgUj4+L0ZmIDA+PgplbmRvYmoKNjQgMCBvYmoKPDwvQlM8PC9TL1MvVyAxPj4vU3VidHlwZS9XaWRnZXQvVChIdW5kX05hbWUpL1R5cGUvQW5ub3QvVihIYXNzbykvRiA2L0RBKC9IZWx2IDAgVGYgMCBnICkvRlQvVHgvRFI8PC9Gb250PDwvSGVsdiAxMCAwIFI+Pj4+L1JlY3RbMCAwIDAgMF0vQVA8PC9OIDM3IDAgUj4+L0ZmIDA+PgplbmRvYmoKNjUgMCBvYmoKPDwvQlM8PC9TL1MvVyAxPj4vU3VidHlwZS9XaWRnZXQvVChIdW5kX1Jhc3NlKS9UeXBlL0Fubm90L1YoU2No5GZlcmh1bmQpL0YgNi9EQSgvSGVsdiAwIFRmIDAgZyApL0ZUL1R4L0RSPDwvRm9udDw8L0hlbHYgMTAgMCBSPj4+Pi9SZWN0WzAgMCAwIDBdL0FQPDwvTiAzOCAwIFI+Pi9GZiAwPj4KZW5kb2JqCjY2IDAgb2JqCjw8L0JTPDwvUy9TL1cgMT4+L1N1YnR5cGUvV2lkZ2V0L1QoSHVuZF9HZXNjaGxlY2h0KS9UeXBlL0Fubm90L1Yod2VpYmxpY2gpL0YgNi9EQSgvSGVsdiAwIFRmIDAgZyApL0ZUL1R4L0RSPDwvRm9udDw8L0hlbHYgMTAgMCBSPj4+Pi9SZWN0WzAgMCAwIDBdL0FQPDwvTiAzOSAwIFI+Pi9GZiAwPj4KZW5kb2JqCjY3IDAgb2JqCjw8L0JTPDwvUy9TL1cgMT4+L1N1YnR5cGUvV2lkZ2V0L1QoS2FzdHJhdGlvbikvVHlwZS9Bbm5vdC9WKG5laW4pL0YgNi9EQSgvSGVsdiAwIFRmIDAgZyApL0ZUL1R4L0RSPDwvRm9udDw8L0hlbHYgMTAgMCBSPj4+Pi9SZWN0WzAgMCAwIDBdL0FQPDwvTiA0MCAwIFI+Pi9GZiAwPj4KZW5kb2JqCjY4IDAgb2JqCjw8L0JTPDwvUy9TL1cgMT4+L1N1YnR5cGUvV2lkZ2V0L1QoSHVuZF9HZWJ1cnRkYXR1bSkvVHlwZS9Bbm5vdC9GIDYvREEoL0hlbHYgMCBUZiAwIGcgKS9GVC9UeC9EUjw8L0ZvbnQ8PC9IZWx2IDEwIDAgUj4+Pj4vUmVjdFswIDAgMCAwXS9BUDw8L04gNDEgMCBSPj4vRmYgMD4+CmVuZG9iago2OSAwIG9iago8PC9CUzw8L1MvUy9XIDE+Pi9TdWJ0eXBlL1dpZGdldC9UKEh1bmRfQWx0ZXIpL1R5cGUvQW5ub3QvVig1KS9GIDYvREEoL0hlbHYgMCBUZiAwIGcgKS9GVC9UeC9EUjw8L0ZvbnQ8PC9IZWx2IDEwIDAgUj4+Pj4vUmVjdFswIDAgMCAwXS9BUDw8L04gNDIgMCBSPj4vRmYgMD4+CmVuZG9iago3MCAwIG9iago8PC9CUzw8L1MvUy9XIDE+Pi9TdWJ0eXBlL1dpZGdldC9UKEh1bmRfQ2hpcE5yKS9UeXBlL0Fubm90L1YoMTIzNDU2Nzg5MTIzNDU2KS9GIDYvREEoL0hlbHYgMCBUZiAwIGcgKS9GVC9UeC9EUjw8L0ZvbnQ8PC9IZWx2IDEwIDAgUj4+Pj4vUmVjdFswIDAgMCAwXS9BUDw8L04gNDMgMCBSPj4vRmYgMD4+CmVuZG9iago3MSAwIG9iago8PC9CUzw8L1MvUy9XIDE+Pi9TdWJ0eXBlL1dpZGdldC9UKEh1bmRfRmVsbGZhcmJlKS9U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ZWxkc1s0NyAwIFIgNDggMCBSIDQ5IDAgUiA1MCAwIFIgNTEgMCBSIDUyIDAgUiA1MyAwIFIgNTQgMCBSIDU1IDAgUiA1NiAwIFIgNTcgMCBSIDU4IDAgUiA1OSAwIFIgNjAgMCBSIDYxIDAgUiA2MiAwIFIgNjMgMCBSIDY0IDAgUiA2NSAwIFIgNjYgMCBSIDY3IDAgUiA2OCAwIFIgNjkgMCBSIDcwIDAgUiA3MSAwIFIgNzIgMCBSIDczIDAgUl0vREEoL0hlbHYgMCBUZiAwIGcgKS9EUjw8L0ZvbnQ8PC9IZWx2IDEwIDAgUj4+Pj4+PgplbmRvYmoKODMgMCBvYmoKPDwvVHlwZS9DYXRhbG9nL0Fjcm9Gb3JtIDgyIDAgUi9QYWdlcyA3NSAwIFI+PgplbmRvYmoKeHJlZgowIDg0CjAwMDAwMDAwMDAgNjU1MzUgZiAKMDAwMDAwMDAxNSAwMDAwMCBuIAowMDAwMDAyODA5IDAwMDAwIG4gCjAwMDAwMDQyMDYgMDAwMDAgbiAKMDAwMDAwNTYwNCAwMDAwMCBuIAowMDAwMDA1OTA5IDAwMDAwIG4gCjAwMDAwMDU5ODUgMDAwMDAgbiAKMDAwMDAwNjEyNSAwMDAwMCBuIAowMDAwMDA3NDA2IDAwMDAwIG4gCjAwMDAwMDYzNDEgMDAwMDAgbiAKMDAwMDAwNjU5NSAwMDAwMCBuIAowMDAwMDA2Njg0IDAwMDAwIG4gCjAwMDAwMDY5MzkgMDAwMDAgbiAKMDAwMDAzODI3NyAwMDAwMCBuIAowMDAwMDM4ODA0IDAwMDAwIG4gCjAwMDAwMDc1MzYgMDAwMDAgbiAKMDAwMDAwNzc5NCAwMDAwMCBuIAowMDAwMDA4MDUyIDAwMDAwIG4gCjAwMDAwMDgyNDcgMDAwMDAgbiAKMDAwMDAwODQ0MiAwMDAwMCBuIAowMDAwMDA4Njk1IDAwMDAwIG4gCjAwMDAwMDg5NTEgMDAwMDAgbiAKMDAwMDAwOTIwNiAwMDAwMCBuIAowMDAwMDA5NDAxIDAwMDAwIG4gCjAwMDAwMDk2NjQgMDAwMDAgbiAKMDAwMDAwOTg1OSAwMDAwMCBuIAowMDAwMDEwMDU0IDAwMDAwIG4gCjAwMDAwMTAzMzMgMDAwMDAgbiAKMDAwMDAxMDUyOCAwMDAwMCBuIAowMDAwMDEwODA3IDAwMDAwIG4gCjAwMDAwMTEwOTQgMDAwMDAgbiAKMDAwMDAxMTI3OCAwMDAwMCBuIAowMDAwMDExNDYzIDAwMDAwIG4gCjAwMDAwMTE2NDcgMDAwMDAgbiAKMDAwMDAxMTgzMiAwMDAwMCBuIAowMDAwMDEyMDE2IDAwMDAwIG4gCjAwMDAwMTIzMDMgMDAwMDAgbiAKMDAwMDAxMjQ4NyAwMDAwMCBuIAowMDAwMDEyNzQzIDAwMDAwIG4gCjAwMDAwMTMwMDYgMDAwMDAgbiAKMDAwMDAxMzI2NSAwMDAwMCBuIAowMDAwMDEzNTIwIDAwMDAwIG4gCjAwMDAwMTM3MTUgMDAwMDAgbiAKMDAwMDAxMzk2NyAwMDAwMCBuIAowMDAwMDE0MjI5IDAwMDAwIG4gCjAwMDAwMTQ0ODQgMDAwMDAgbiAKMDAwMDAxNDczNyAwMDAwMCBuIAowMDAwMDE0OTkwIDAwMDAwIG4gCjAwMDAwMTUxNjYgMDAwMDAgbiAKMDAwMDAxNTM1OCAwMDAwMCBuIAowMDAwMDE1ODQ0IDAwMDAwIG4gCjAwMDAwMTYwMjQgMDAwMDAgbiAKMDAwMDAxNjIwMSAwMDAwMCBuIAowMDAwMDE2MzcwIDAwMDAwIG4gCjAwMDAwMTY1NTYgMDAwMDAgbiAKMDAwMDAxNjcyNiAwMDAwMCBuIAowMDAwMDE2OTAwIDAwMDAwIG4gCjAwMDAwMTcwNzMgMDAwMDAgbiAKMDAwMDAxNzI0MiAwMDAwMCBuIAowMDAwMDE3NDI2IDAwMDAwIG4gCjAwMDAwMTc1OTggMDAwMDAgbiAKMDAwMDAxNzc2NyAwMDAwMCBuIAowMDAwMDE3OTY2IDAwMDAwIG4gCjAwMDAwMTgxMzEgMDAwMDAgbiAKMDAwMDAxODMzOSAwMDAwMCBuIAowMDAwMDE4NTE2IDAwMDAwIG4gCjAwMDAwMTg3MDAgMDAwMDAgbiAKMDAwMDAxODg4NiAwMDAwMCBuIAowMDAwMDE5MDYzIDAwMDAwIG4gCjAwMDAwMTkyMzggMDAwMDAgbiAKMDAwMDAxOTQxMiAwMDAwMCBuIAowMDAwMDE5NjAxIDAwMDAwIG4gCjAwMDAwMTk3ODIgMDAwMDAgbiAKMDAwMDAxOTk1OSAwMDAwMCBuIAowMDAwMDIwMTM2IDAwMDAwIG4gCjAwMDAwMjE0MTUgMDAwMDAgbiAKMDAwMDAyMTQ3NSAwMDAwMCBuIAowMDAwMDIzNjMzIDAwMDAwIG4gCjAwMDAwMjE5NTggMDAwMDAgbiAKMDAwMDAyMjA1MiAwMDAwMCBuIAowMDAwMDIzNzkwIDAwMDAwIG4gCjAwMDAwMzgwOTMgMDAwMDAgbiAKMDAwMDAzOTQ0OCAwMDAwMCBuIAowMDAwMDM5NzE0IDAwMDAwIG4gCnRyYWlsZXIKPDwvSW5mbyA0IDAgUi9JRCBbPGVlZWQ2YmEzM2YwZDY5ZjkzZWEyYzZjNWFhM2U0ZWJjPjw4ZGIwNDk0YjcxMmY5ZTE5NTJmZGMwMjI2Mjg3NzdhZj5dL1Jvb3QgODMgMCBSL1NpemUgODQ+PgolaVRleHQtNS41LjUKc3RhcnR4cmVmCjM5Nzc3CiUlRU9GCg=="; + public static final String PDF_ENCODED = "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ZW5kb2JqCjI5IDAgb2JqCjw8L0NvbG9yU3BhY2UvRGV2aWNlR3JheS9TdWJ0eXBlL0ltYWdlL0hlaWdodCAxOS9GaWx0ZXIvRmxhdGVEZWNvZGUvVHlwZS9YT2JqZWN0L1dpZHRoIDE5L0xlbmd0aCAxMzIvQml0c1BlckNvbXBvbmVudCA4Pj5zdHJlYW0KeJxl0AENwCAMBMCXUAmTgAQkTMIkTEIdIGESkDAJSJgEJHQtDEKzTyDhUlqCyD83+9wijCVEYE+HSPQUtA97KiJ1c5S06HS9oo3HSvTYtU6Uc1DKWrSjk64asKtkfGSHulXdaFCbZImYhKtJwkLNCjmycQGeqMwX8/ivtP7XPy90XasiCmVuZHN0cmVhbQplbmRvYmoKMzAgMCBvYmoKPDwvQ29sb3JTcGFjZS9EZXZpY2VSR0IvU3VidHlwZS9JbWFnZS9IZWlnaHQgMTkvRmlsdGVyL0ZsYXRlRGVjb2RlL1R5cGUvWE9iamVjdC9XaWR0aCAxOS9TTWFzayAyOSAwIFIvTGVuZ3RoIDE4L0JpdHNQZXJDb21wb25lbnQgOD4+c3RyZWFtCnicY2AYBaNgFIwCkgEABDsAAQplbmRzdHJlYW0KZW5kb2JqCjMxIDAgb2JqCjw8L0NvbG9yU3BhY2UvRGV2aWNlR3JheS9TdWJ0eXBlL0ltYWdlL0hlaWdodCAxOS9GaWx0ZXIvRmxhdGVEZWNvZGUvVHlwZS9YT2JqZWN0L1dpZHRoIDE5L0xlbmd0aCAzMS9CaXRzUGVyQ29tcG9uZW50IDg+PnN0cmVhbQp4nPv/HxPsb0AF+///b2BABQ2jQgghLOGFCQANA2i1CmVuZHN0cmVhbQplbmRvYmoKMzIgMCBvYmoKPDwvQ29sb3JTcGFjZS9EZXZpY2VSR0IvU3VidHlwZS9JbWFnZS9IZWlnaHQgMTkvRmlsdGVyL0ZsYXRlRGVjb2RlL1R5cGUvWE9iamVjdC9XaWR0aCAxOS9TTWFzayAzMSAwIFIvTGVuZ3RoIDE4L0JpdHNQZXJDb21wb25lbnQgOD4+c3RyZWFtCnicY2AYBaNgFIwCkgEABDsAAQplbmRzdHJlYW0KZW5kb2JqCjMzIDAgb2JqCjw8L0NvbG9yU3BhY2UvRGV2aWNlR3JheS9TdWJ0eXBlL0ltYWdlL0hlaWdodCAxOS9GaWx0ZXIvRmxhdGVEZWNvZGUvVHlwZS9YT2JqZWN0L1dpZHRoIDE5L0xlbmd0aCAzMS9CaXRzUGVyQ29tcG9uZW50IDg+PnN0cmVhbQp4nPv/HxPsb0AF+///b2BABQ2jQgghLOGFCQANA2i1CmVuZHN0cmVhbQplbmRvYmoKMzQgMCBvYmoKPDwvQ29sb3JTcGFjZS9EZXZpY2VSR0IvU3VidHlwZS9JbWFnZS9IZWlnaHQgMTkvRmlsdGVyL0ZsYXRlRGVjb2RlL1R5cGUvWE9iamVjdC9XaWR0aCAxOS9TTWFzayAzMyAwIFIvTGVuZ3RoIDE4L0JpdHNQZXJDb21wb25lbnQgOD4+c3RyZWFtCnicY2AYBaNgFIwCkgEABDsAAQplbmRzdHJlYW0KZW5kb2JqCjM1IDAgb2JqCjw8L0NvbG9yU3BhY2UvRGV2aWNlR3JheS9TdWJ0eXBlL0ltYWdlL0hlaWdodCAxOS9GaWx0ZXIvRmxhdGVEZWNvZGUvVHlwZS9YT2JqZWN0L1dpZHRoIDE5L0xlbmd0aCAxMzIvQml0c1BlckNvbXBvbmVudCA4Pj5zdHJlYW0KeJxl0AENwCAMBMCXUAmTgAQkTMIkTEIdIGESkDAJSJgEJHQtDEKzTyDhUlqCyD83+9wijCVEYE+HSPQUtA97KiJ1c5S06HS9oo3HSvTYtU6Uc1DKWrSjk64asKtkfGSHulXdaFCbZImYhKtJwkLNCjmycQGeqMwX8/ivtP7XPy90XasiCmVuZHN0cmVhbQplbmRvYmoKMzYgMCBvYmoKPDwvQ29sb3JTcGFjZS9EZXZpY2VSR0IvU3VidHlwZS9JbWFnZS9IZWlnaHQgMTkvRmlsdGVyL0ZsYXRlRGVjb2RlL1R5cGUvWE9iamVjdC9XaWR0aCAxOS9TTWFzayAzNSAwIFIvTGVuZ3RoIDE4L0JpdHNQZXJDb21wb25lbnQgOD4+c3RyZWFtCnicY2AYBaNgFIwCkgEABDsAAQplbmRzdHJlYW0KZW5kb2JqCjM3IDAgb2JqCjw8L1N1YnR5cGUvRm9ybS9GaWx0ZXIvRmxhdGVEZWNvZGUvVHlwZS9YT2JqZWN0L01hdHJpeFsxIDAgMCAxIDAgMF0vRm9ybVR5cGUgMS9SZXNvdXJjZXM8PC9Gb250PDwvSGVsdiAx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bHYgMTAgMCBSPj4+Pi9SZWN0WzAgMCAwIDBdL0FQPDwvTiAxMSAwIFI+Pi9GZiAwPj4KZW5kb2JqCjQ5IDAgb2JqCjw8L0JTPDwvUy9TL1cgMT4+L1N1YnR5cGUvV2lkZ2V0L1QoZmlsZVVybCkvVHlwZS9Bbm5vdC9WKGh0dHBzJTNBJTJGJTJGa3VuZGVudGVzdC5mb3JtLXNvbHV0aW9ucy5kZSUyRm1ldGFmb3JtJTJGRm9ybS1Tb2x1dGlvbnMlMkZzaWQlMkZhc3Npc3RhbnQlMkY2MWIyMDhlODY2ZGExMjM2NDRjOTdlNTYlM0ZhbmxpZWdlbklkJTNEMTIzNCUyNm9yZ2FuaXNhdGlvbnNlaW5oZWl0ZW5JRCUzRDkwMzAyMjklMjZrb21tdW5hbHZlcndhbHR1bmdJZCUzRDEwMDAwMDAwMCUyNmNvbnNlbnRDb21wbGV0ZSUzRHRydWUlMjZjYWNoZUlEJTNENGZiNmI2ZTAtMGYxYy00OTcwLWI5ZWQtZGJmMjQyZDMzM2Y5JTI2Y2l0aXplblBvcnRhbExvZ2luU3VjY2VzcyUzRHRydWUpL0YgNi9EQSgvSGVsdiAwIFRmIDAgZyApL0ZUL1R4L0RSPDwvRm9udDw8L0hlbHYgMTAgMCBSPj4+Pi9SZWN0WzAgMCAwIDBdL0FQPDwvTiAxMiAwIFI+Pi9GZiAwPj4KZW5kb2JqCjUwIDAgb2JqCjw8L0JTPDwvUy9TL1cgMT4+L1N1YnR5cGUvV2lkZ2V0L1QoQVNfVm9ybmFtZSkvVHlwZS9Bbm5vdC9WKFN1c2FubmUpL0YgNi9EQSgvSGVsdiAwIFRmIDAgZyApL0ZUL1R4L0RSPDwvRm9udDw8L0hlbHYgMTAgMCBSPj4+Pi9SZWN0WzAgMCAwIDBdL0FQPDwvTiAxNSAwIFI+Pi9GZiAwPj4KZW5kb2JqCjUxIDAgb2JqCjw8L0JTPDwvUy9TL1cgMT4+L1N1YnR5cGUvV2lkZ2V0L1QoQVNfTmFtZSkvVHlwZS9Bbm5vdC9WKEZpc2NoZXIpL0YgNi9EQSgvSGVsdiAwIFRmIDAgZyApL0ZUL1R4L0RSPDwvRm9udDw8L0hlbHYgMTAgMCBSPj4+Pi9SZWN0WzAgMCAwIDBdL0FQPDwvTiAxNiAwIFI+Pi9GZiAwPj4KZW5kb2JqCjUyIDAgb2JqCjw8L0JTPDwvUy9TL1cgMT4+L1N1YnR5cGUvV2lkZ2V0L1QoQVNfUnVmbmFtZSkvVHlwZS9Bbm5vdC9GIDYvREEoL0hlbHYgMCBUZiAwIGcgKS9GVC9UeC9EUjw8L0ZvbnQ8PC9IZWx2IDEwIDAgUj4+Pj4vUmVjdFswIDAgMCAwXS9BUDw8L04gMTcgMCBSPj4vRmYgMD4+CmVuZG9iago1MyAwIG9iago8PC9CUzw8L1MvUy9XIDE+Pi9TdWJ0eXBlL1dpZGdldC9UKEFTX09yZGVuc25hbWVfS3VlbnN0bGVybmFtZSkvVHlwZS9Bbm5vdC9GIDYvREEoL0hlbHYgMCBUZiAwIGcgKS9GVC9UeC9EUjw8L0ZvbnQ8PC9IZWx2IDEwIDAgUj4+Pj4vUmVjdFswIDAgMCAwXS9BUDw8L04gMTggMCBSPj4vRmYgMD4+CmVuZG9iago1NCAwIG9iago8PC9CUzw8L1MvUy9XIDE+Pi9TdWJ0eXBlL1dpZGdldC9UKHN0YWF0KS9UeXBlL0Fubm90L1YoREUpL0YgNi9EQSgvSGVsdiAwIFRmIDAgZyApL0ZUL1R4L0RSPDwvRm9udDw8L0hlbHYgMTAgMCBSPj4+Pi9SZWN0WzAgMCAwIDBdL0FQPDwvTiAxOSAwIFI+Pi9GZiAwPj4KZW5kb2JqCjU1IDAgb2JqCjw8L0JTPDwvUy9TL1cgMT4+L1N1YnR5cGUvV2lkZ2V0L1QoQVNfUExaKS9UeXBlL0Fubm90L1YoMTIzNDUpL0YgNi9EQSgvSGVsdiAwIFRmIDAgZyApL0ZUL1R4L0RSPDwvRm9udDw8L0hlbHYgMTAgMCBSPj4+Pi9SZWN0WzAgMCAwIDBdL0FQPDwvTiAyMCAwIFI+Pi9GZiAwPj4KZW5kb2JqCjU2IDAgb2JqCjw8L0JTPDwvUy9TL1cgMT4+L1N1YnR5cGUvV2lkZ2V0L1QoQVNfT3J0KS9UeXBlL0Fubm90L1YoS2llbCkvRiA2L0RBKC9IZWx2IDAgVGYgMCBnICkvRlQvVHgvRFI8PC9Gb250PDwvSGVsdiAxMCAwIFI+Pj4+L1JlY3RbMCAwIDAgMF0vQVA8PC9OIDIxIDAgUj4+L0ZmIDA+PgplbmRvYmoKNTcgMCBvYmoKPDwvQlM8PC9TL1MvVyAxPj4vU3VidHlwZS9XaWRnZXQvVChCdW5kZXNsYW5kKS9UeXBlL0Fubm90L0YgNi9EQSgvSGVsdiAwIFRmIDAgZyApL0ZUL1R4L0RSPDwvRm9udDw8L0hlbHYgMTAgMCBSPj4+Pi9SZWN0WzAgMCAwIDBdL0FQPDwvTiAyMiAwIFI+Pi9GZiAwPj4KZW5kb2JqCjU4IDAgb2JqCjw8L0JTPDwvUy9TL1cgMT4+L1N1YnR5cGUvV2lkZ2V0L1QoQVNfU3RyYXNzZSkvVHlwZS9Bbm5vdC9WKEhhdXB0c3RyYd9lKS9GIDYvREEoL0hlbHYgMCBUZiAwIGcgKS9GVC9UeC9EUjw8L0ZvbnQ8PC9IZWx2IDEwIDAgUj4+Pj4vUmVjdFswIDAgMCAwXS9BUDw8L04gMjMgMCBSPj4vRmYgMD4+CmVuZG9iago1OSAwIG9iago8PC9CUzw8L1MvUy9XIDE+Pi9TdWJ0eXBlL1dpZGdldC9UKEFTX0hhdXNudW1tZXIpL1R5cGUvQW5ub3QvRiA2L0RBKC9IZWx2IDAgVGYgMCBnICkvRlQvVHgvRFI8PC9Gb250PDwvSGVsdiAxMCAwIFI+Pj4+L1JlY3RbMCAwIDAgMF0vQVA8PC9OIDI0IDAgUj4+L0ZmIDA+PgplbmRvYmoKNjAgMCBvYmoKPDwvQlM8PC9TL1MvVyAxPj4vU3VidHlwZS9XaWRnZXQvVChBU19UZWxlZm9uKS9UeXBlL0Fubm90L0YgNi9EQSgvSGVsdiAwIFRmIDAgZyApL0ZUL1R4L0RSPDwvRm9udDw8L0hlbHYgMTAgMCBSPj4+Pi9SZWN0WzAgMCAwIDBdL0FQPDwvTiAyNSAwIFI+Pi9GZiAwPj4KZW5kb2JqCjYxIDAgb2JqCjw8L0JTPDwvUy9TL1cgMT4+L1N1YnR5cGUvV2lkZ2V0L1QoQVNfRS1NYWlsKS9UeXBlL0Fubm90L1Yoc3VzYW5uZS5maXNjaGVyQGRhdGFwb3J0LmRlKS9GIDYvREEoL0hlbHYgMCBUZiAwIGcgKS9GVC9UeC9EUjw8L0ZvbnQ8PC9IZWx2IDEwIDAgUj4+Pj4vUmVjdFswIDAgMCAwXS9BUDw8L04gMjYgMCBSPj4vRmYgMD4+CmVuZG9iago2MiAwIG9iago8PC9CUzw8L1MvUy9XIDE+Pi9TdWJ0eXBlL1dpZGdldC9UKEFTX0ZheCkvVHlwZS9Bbm5vdC9GIDYvREEoL0hlbHYgMCBUZiAwIGcgKS9GVC9UeC9EUjw8L0ZvbnQ8PC9IZWx2IDEwIDAgUj4+Pj4vUmVjdFswIDAgMCAwXS9BUDw8L04gMjcgMCBSPj4vRmYgMD4+CmVuZG9iago2MyAwIG9iago8PC9CUzw8L1MvUy9XIDE+Pi9TdWJ0eXBlL1dpZGdldC9UKG9mc1hYMV9mcm9tX3NtYWlsMykvVHlwZS9Bbm5vdC9WKHN1c2FubmUuZmlzY2hlckBkYXRhcG9ydC5kZSkvRiA2L0RBKC9IZWx2IDAgVGYgMCBnICkvRlQvVHgvRFI8PC9Gb250PDwvSGVsdiAxMCAwIFI+Pj4+L1JlY3RbMCAwIDAgMF0vQVA8PC9OIDI4IDAgUj4+L0ZmIDA+PgplbmRvYmoKNjQgMCBvYmoKPDwvQlM8PC9TL1MvVyAxPj4vU3VidHlwZS9XaWRnZXQvVChIdW5kX05hbWUpL1R5cGUvQW5ub3QvVihIYXNzbykvRiA2L0RBKC9IZWx2IDAgVGYgMCBnICkvRlQvVHgvRFI8PC9Gb250PDwvSGVsdiAxMCAwIFI+Pj4+L1JlY3RbMCAwIDAgMF0vQVA8PC9OIDM3IDAgUj4+L0ZmIDA+PgplbmRvYmoKNjUgMCBvYmoKPDwvQlM8PC9TL1MvVyAxPj4vU3VidHlwZS9XaWRnZXQvVChIdW5kX1Jhc3NlKS9UeXBlL0Fubm90L1YoU2No5GZlcmh1bmQpL0YgNi9EQSgvSGVsdiAwIFRmIDAgZyApL0ZUL1R4L0RSPDwvRm9udDw8L0hlbHYgMTAgMCBSPj4+Pi9SZWN0WzAgMCAwIDBdL0FQPDwvTiAzOCAwIFI+Pi9GZiAwPj4KZW5kb2JqCjY2IDAgb2JqCjw8L0JTPDwvUy9TL1cgMT4+L1N1YnR5cGUvV2lkZ2V0L1QoSHVuZF9HZXNjaGxlY2h0KS9UeXBlL0Fubm90L1Yod2VpYmxpY2gpL0YgNi9EQSgvSGVsdiAwIFRmIDAgZyApL0ZUL1R4L0RSPDwvRm9udDw8L0hlbHYgMTAgMCBSPj4+Pi9SZWN0WzAgMCAwIDBdL0FQPDwvTiAzOSAwIFI+Pi9GZiAwPj4KZW5kb2JqCjY3IDAgb2JqCjw8L0JTPDwvUy9TL1cgMT4+L1N1YnR5cGUvV2lkZ2V0L1QoS2FzdHJhdGlvbikvVHlwZS9Bbm5vdC9WKG5laW4pL0YgNi9EQSgvSGVsdiAwIFRmIDAgZyApL0ZUL1R4L0RSPDwvRm9udDw8L0hlbHYgMTAgMCBSPj4+Pi9SZWN0WzAgMCAwIDBdL0FQPDwvTiA0MCAwIFI+Pi9GZiAwPj4KZW5kb2JqCjY4IDAgb2JqCjw8L0JTPDwvUy9TL1cgMT4+L1N1YnR5cGUvV2lkZ2V0L1QoSHVuZF9HZWJ1cnRkYXR1bSkvVHlwZS9Bbm5vdC9GIDYvREEoL0hlbHYgMCBUZiAwIGcgKS9GVC9UeC9EUjw8L0ZvbnQ8PC9IZWx2IDEwIDAgUj4+Pj4vUmVjdFswIDAgMCAwXS9BUDw8L04gNDEgMCBSPj4vRmYgMD4+CmVuZG9iago2OSAwIG9iago8PC9CUzw8L1MvUy9XIDE+Pi9TdWJ0eXBlL1dpZGdldC9UKEh1bmRfQWx0ZXIpL1R5cGUvQW5ub3QvVig1KS9GIDYvREEoL0hlbHYgMCBUZiAwIGcgKS9GVC9UeC9EUjw8L0ZvbnQ8PC9IZWx2IDEwIDAgUj4+Pj4vUmVjdFswIDAgMCAwXS9BUDw8L04gNDIgMCBSPj4vRmYgMD4+CmVuZG9iago3MCAwIG9iago8PC9CUzw8L1MvUy9XIDE+Pi9TdWJ0eXBlL1dpZGdldC9UKEh1bmRfQ2hpcE5yKS9UeXBlL0Fubm90L1YoMTIzNDU2Nzg5MTIzNDU2KS9GIDYvREEoL0hlbHYgMCBUZiAwIGcgKS9GVC9UeC9EUjw8L0ZvbnQ8PC9IZWx2IDEwIDAgUj4+Pj4vUmVjdFswIDAgMCAwXS9BUDw8L04gNDMgMCBSPj4vRmYgMD4+CmVuZG9iago3MSAwIG9iago8PC9CUzw8L1MvUy9XIDE+Pi9TdWJ0eXBlL1dpZGdldC9UKEh1bmRfRmVsbGZhcmJlKS9UeXBlL0Fubm90L1YoaGVsbCkvRiA2L0RBKC9IZWx2IDAgVGYgMCBnICkvRlQvVHgvRFI8PC9Gb250PDwvSGVsdiAxMCAwIFI+Pj4+L1JlY3RbMCAwIDAgMF0vQVA8PC9OIDQ0IDAgUj4+L0ZmIDA+PgplbmRvYmoKNzIgMCBvYmoKPDwvQlM8PC9T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NjYgMCBSIDY3IDAgUiA2OCAwIFIgNjkgMCBSIDcwIDAgUiA3MSAwIFIgNzIgMCBSIDczIDAgUl0vREEoL0hlbHYgMCBUZiAwIGcgKS9EUjw8L0ZvbnQ8PC9IZWx2IDEwIDAgUj4+Pj4+PgplbmRvYmoKODMgMCBvYmoKPDwvVHlwZS9DYXRhbG9nL0Fjcm9Gb3JtIDgyIDAgUi9QYWdlcyA3NSAwIFI+PgplbmRvYmoKeHJlZgowIDg0CjAwMDAwMDAwMDAgNjU1MzUgZiAKMDAwMDAwMDAxNSAwMDAwMCBuIAowMDAwMDAyODA5IDAwMDAwIG4gCjAwMDAwMDQyMDYgMDAwMDAgbiAKMDAwMDAwNTYwNCAwMDAwMCBuIAowMDAwMDA1OTA5IDAwMDAwIG4gCjAwMDAwMDU5ODUgMDAwMDAgbiAKMDAwMDAwNjEyNSAwMDAwMCBuIAowMDAwMDA3NDA2IDAwMDAwIG4gCjAwMDAwMDYzNDEgMDAwMDAgbiAKMDAwMDAwNjU5NSAwMDAwMCBuIAowMDAwMDA2Njg0IDAwMDAwIG4gCjAwMDAwMDY5MzkgMDAwMDAgbiAKMDAwMDAzODI3NyAwMDAwMCBuIAowMDAwMDM4ODA0IDAwMDAwIG4gCjAwMDAwMDc1MzYgMDAwMDAgbiAKMDAwMDAwNzc5NCAwMDAwMCBuIAowMDAwMDA4MDUyIDAwMDAwIG4gCjAwMDAwMDgyNDcgMDAwMDAgbiAKMDAwMDAwODQ0MiAwMDAwMCBuIAowMDAwMDA4Njk1IDAwMDAwIG4gCjAwMDAwMDg5NTEgMDAwMDAgbiAKMDAwMDAwOTIwNiAwMDAwMCBuIAowMDAwMDA5NDAxIDAwMDAwIG4gCjAwMDAwMDk2NjQgMDAwMDAgbiAKMDAwMDAwOTg1OSAwMDAwMCBuIAowMDAwMDEwMDU0IDAwMDAwIG4gCjAwMDAwMTAzMzMgMDAwMDAgbiAKMDAwMDAxMDUyOCAwMDAwMCBuIAowMDAwMDEwODA3IDAwMDAwIG4gCjAwMDAwMTEwOTQgMDAwMDAgbiAKMDAwMDAxMTI3OCAwMDAwMCBuIAowMDAwMDExNDYzIDAwMDAwIG4gCjAwMDAwMTE2NDcgMDAwMDAgbiAKMDAwMDAxMTgzMiAwMDAwMCBuIAowMDAwMDEyMDE2IDAwMDAwIG4gCjAwMDAwMTIzMDMgMDAwMDAgbiAKMDAwMDAxMjQ4NyAwMDAwMCBuIAowMDAwMDEyNzQzIDAwMDAwIG4gCjAwMDAwMTMwMDYgMDAwMDAgbiAKMDAwMDAxMzI2NSAwMDAwMCBuIAowMDAwMDEzNTIwIDAwMDAwIG4gCjAwMDAwMTM3MTUgMDAwMDAgbiAKMDAwMDAxMzk2NyAwMDAwMCBuIAowMDAwMDE0MjI5IDAwMDAwIG4gCjAwMDAwMTQ0ODQgMDAwMDAgbiAKMDAwMDAxNDczNyAwMDAwMCBuIAowMDAwMDE0OTkwIDAwMDAwIG4gCjAwMDAwMTUxNjYgMDAwMDAgbiAKMDAwMDAxNTM1OCAwMDAwMCBuIAowMDAwMDE1ODQ0IDAwMDAwIG4gCjAwMDAwMTYwMjQgMDAwMDAgbiAKMDAwMDAxNjIwMSAwMDAwMCBuIAowMDAwMDE2MzcwIDAwMDAwIG4gCjAwMDAwMTY1NTYgMDAwMDAgbiAKMDAwMDAxNjcyNiAwMDAwMCBuIAowMDAwMDE2OTAwIDAwMDAwIG4gCjAwMDAwMTcwNzMgMDAwMDAgbiAKMDAwMDAxNzI0MiAwMDAwMCBuIAowMDAwMDE3NDI2IDAwMDAwIG4gCjAwMDAwMTc1OTggMDAwMDAgbiAKMDAwMDAxNzc2NyAwMDAwMCBuIAowMDAwMDE3OTY2IDAwMDAwIG4gCjAwMDAwMTgxMzEgMDAwMDAgbiAKMDAwMDAxODMzOSAwMDAwMCBuIAowMDAwMDE4NTE2IDAwMDAwIG4gCjAwMDAwMTg3MDAgMDAwMDAgbiAKMDAwMDAxODg4NiAwMDAwMCBuIAowMDAwMDE5MDYzIDAwMDAwIG4gCjAwMDAwMTkyMzggMDAwMDAgbiAKMDAwMDAxOTQxMiAwMDAwMCBuIAowMDAwMDE5NjAxIDAwMDAwIG4gCjAwMDAwMTk3ODIgMDAwMDAgbiAKMDAwMDAxOTk1OSAwMDAwMCBuIAowMDAwMDIwMTM2IDAwMDAwIG4gCjAwMDAwMjE0MTUgMDAwMDAgbiAKMDAwMDAyMTQ3NSAwMDAwMCBuIAowMDAwMDIzNjMzIDAwMDAwIG4gCjAwMDAwMjE5NTggMDAwMDAgbiAKMDAwMDAyMjA1MiAwMDAwMCBuIAowMDAwMDIzNzkwIDAwMDAwIG4gCjAwMDAwMzgwOTMgMDAwMDAgbiAKMDAwMDAzOTQ0OCAwMDAwMCBuIAowMDAwMDM5NzE0IDAwMDAwIG4gCnRyYWlsZXIKPDwvSW5mbyA0IDAgUi9JRCBbPGVlZWQ2YmEzM2YwZDY5ZjkzZWEyYzZjNWFhM2U0ZWJjPjw4ZGIwNDk0YjcxMmY5ZTE5NTJmZGMwMjI2Mjg3NzdhZj5dL1Jvb3QgODMgMCBSL1NpemUgODQ+PgolaVRleHQtNS41LjUKc3RhcnR4cmVmCjM5Nzc3CiUlRU9GCg=="; public static final byte[] PDF_DECODED = Base64.getDecoder().decode(PDF_ENCODED.getBytes()); public static final String JSON_CONTENT = "{}"; diff --git a/formsolutions-adapter/src/test/java/de/ozgcloud/eingang/formsolutions/FormSolutionsRequestMapperITCase.java b/src/test/java/de/ozgcloud/eingang/formsolutions/FormSolutionsRequestMapperITCase.java similarity index 100% rename from formsolutions-adapter/src/test/java/de/ozgcloud/eingang/formsolutions/FormSolutionsRequestMapperITCase.java rename to src/test/java/de/ozgcloud/eingang/formsolutions/FormSolutionsRequestMapperITCase.java diff --git a/formsolutions-adapter/src/test/java/de/ozgcloud/eingang/formsolutions/FormSolutionsRequestMapperTest.java b/src/test/java/de/ozgcloud/eingang/formsolutions/FormSolutionsRequestMapperTest.java similarity index 100% rename from formsolutions-adapter/src/test/java/de/ozgcloud/eingang/formsolutions/FormSolutionsRequestMapperTest.java rename to src/test/java/de/ozgcloud/eingang/formsolutions/FormSolutionsRequestMapperTest.java diff --git a/formsolutions-adapter/src/test/java/de/ozgcloud/eingang/formsolutions/FormsolutionsAdapterApplicationTest.java b/src/test/java/de/ozgcloud/eingang/formsolutions/FormsolutionsAdapterApplicationTest.java similarity index 100% rename from formsolutions-adapter/src/test/java/de/ozgcloud/eingang/formsolutions/FormsolutionsAdapterApplicationTest.java rename to src/test/java/de/ozgcloud/eingang/formsolutions/FormsolutionsAdapterApplicationTest.java diff --git a/formsolutions-adapter/src/test/java/de/ozgcloud/eingang/formsolutions/FormsolutionsITCase.java b/src/test/java/de/ozgcloud/eingang/formsolutions/FormsolutionsITCase.java similarity index 100% rename from formsolutions-adapter/src/test/java/de/ozgcloud/eingang/formsolutions/FormsolutionsITCase.java rename to src/test/java/de/ozgcloud/eingang/formsolutions/FormsolutionsITCase.java diff --git a/formsolutions-adapter/src/test/java/de/ozgcloud/eingang/formsolutions/SendFormEndpointITCase.java b/src/test/java/de/ozgcloud/eingang/formsolutions/SendFormEndpointITCase.java similarity index 100% rename from formsolutions-adapter/src/test/java/de/ozgcloud/eingang/formsolutions/SendFormEndpointITCase.java rename to src/test/java/de/ozgcloud/eingang/formsolutions/SendFormEndpointITCase.java diff --git a/formsolutions-adapter/src/test/java/de/ozgcloud/eingang/formsolutions/SendFormEndpointTest.java b/src/test/java/de/ozgcloud/eingang/formsolutions/SendFormEndpointTest.java similarity index 100% rename from formsolutions-adapter/src/test/java/de/ozgcloud/eingang/formsolutions/SendFormEndpointTest.java rename to src/test/java/de/ozgcloud/eingang/formsolutions/SendFormEndpointTest.java diff --git a/common/src/test/resources/META-INF/services/org.junit.jupiter.api.extension.Extension b/src/test/resources/META-INF/services/org.junit.jupiter.api.extension.Extension similarity index 100% rename from common/src/test/resources/META-INF/services/org.junit.jupiter.api.extension.Extension rename to src/test/resources/META-INF/services/org.junit.jupiter.api.extension.Extension diff --git a/formsolutions-adapter/src/test/resources/SimpleJsonWithAttachments.json b/src/test/resources/SimpleJsonWithAttachments.json similarity index 100% rename from formsolutions-adapter/src/test/resources/SimpleJsonWithAttachments.json rename to src/test/resources/SimpleJsonWithAttachments.json diff --git a/formsolutions-adapter/src/test/resources/application-itcase.yml b/src/test/resources/application-itcase.yml similarity index 100% rename from formsolutions-adapter/src/test/resources/application-itcase.yml rename to src/test/resources/application-itcase.yml diff --git a/formsolutions-adapter/src/test/resources/application.yml b/src/test/resources/application.yml similarity index 100% rename from formsolutions-adapter/src/test/resources/application.yml rename to src/test/resources/application.yml diff --git a/formsolutions-adapter/src/test/resources/formular/RequestJsonContent.json b/src/test/resources/formular/RequestJsonContent.json similarity index 100% rename from formsolutions-adapter/src/test/resources/formular/RequestJsonContent.json rename to src/test/resources/formular/RequestJsonContent.json diff --git a/common/src/test/resources/junit-platform.properties b/src/test/resources/junit-platform.properties similarity index 100% rename from common/src/test/resources/junit-platform.properties rename to src/test/resources/junit-platform.properties diff --git a/xta-adapter/doc/example-response-getmessages-items-pending.xml b/xta-adapter/doc/example-response-getmessages-items-pending.xml deleted file mode 100644 index bdc87bdc1989d52151d8bff1700546b5c60adac2..0000000000000000000000000000000000000000 --- a/xta-adapter/doc/example-response-getmessages-items-pending.xml +++ /dev/null @@ -1,51 +0,0 @@ -<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"> - <soapenv:Header xmlns:wsa="http://www.w3.org/2005/08/addressing"> - <tran:MsgBoxResponse xmlns:tran="http://www.osci.eu/ws/2008/05/transport"> - <tran:MsgBoxResponse MsgBoxRequestID="urn:de:xta:requestid:xta-tester:e8959968-a8c3-4ba4-aad1-5928ad6030dc"> - <tran:ItemsPending>1</tran:ItemsPending> - </tran:MsgBoxResponse> - </tran:MsgBoxResponse> - <wsa:Action>http://www.osci.eu/ws/2008/05/transport/urn/messageTypes/MsgBoxStatusListRequest</wsa:Action> - <wsa:RelatesTo>uuid:d30e3dbd-4724-4a08-84b9-55e61ce1b404</wsa:RelatesTo> - </soapenv:Header> - <soapenv:Body> - <tran:MsgStatusList xmlns:tran="http://www.osci.eu/ws/2008/05/transport" xmlns:tran1="http://www.osci.eu/ws/2014/10/transport" xmlns:add="http://www.w3.org/2005/08/addressing"> - <tran1:MessageMetaData> - <tran1:DeliveryAttributes> - <tran1:Origin>2022-02-25T14:13:57.613+01:00</tran1:Origin> - <tran1:InitialSend>2022-02-25T14:13:57.613+01:00</tran1:InitialSend> - <tran1:Delivery>2022-02-25T14:13:57.613+01:00</tran1:Delivery> - <tran1:InitialFetch>2022-02-25T14:13:57.613+01:00</tran1:InitialFetch> - </tran1:DeliveryAttributes> - <tran1:Originators> - <tran1:Author> - <tran1:Identifier category="category" type="type"/> - </tran1:Author> - <tran1:Sender> - <tran1:Identifier category="category" type="type"/> - </tran1:Sender> - </tran1:Originators> - <tran1:Destinations> - <tran1:Reader> - <tran1:Identifier category="category" type="type"/> - </tran1:Reader> - </tran1:Destinations> - <tran1:MsgIdentification> - <add:MessageID>urn:de:xta:messageid:xta-tester:0149cd17-a905-4b4b-83c6-10b5ca04a96b</add:MessageID> - </tran1:MsgIdentification> - <tran1:Qualifier> - <tran1:Service>urn:service</tran1:Service> - <tran1:BusinessScenario> - <tran1:Defined> - <name>test</name> - </tran1:Defined> - </tran1:BusinessScenario> - <tran1:MessageType> - <name>mytype</name> - </tran1:MessageType> - </tran1:Qualifier> - <tran1:MsgSize>10</tran1:MsgSize> - </tran1:MessageMetaData> - </tran:MsgStatusList> - </soapenv:Body> -</soapenv:Envelope> \ No newline at end of file diff --git a/xta-adapter/doc/example-response-getmessages-no-messages-available.xml b/xta-adapter/doc/example-response-getmessages-no-messages-available.xml deleted file mode 100644 index 8f56105d0dc5bf57ffccff6b47c85e7088891741..0000000000000000000000000000000000000000 --- a/xta-adapter/doc/example-response-getmessages-no-messages-available.xml +++ /dev/null @@ -1,11 +0,0 @@ -<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing"> - <s:Header> - <a:Action s:mustUnderstand="1">http://www.osci.eu/ws/2008/05/transport/urn/messageTypes/MsgBoxStatusListRequest</a:Action> - <h:MsgBoxResponse MsgBoxRequestID="1" xmlns:h="http://www.osci.eu/ws/2008/05/transport" xmlns="http://www.osci.eu/ws/2008/05/transport" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> - <NoMessageAvailable reason="Keine Nachrichten gefunden."/> - </h:MsgBoxResponse> - </s:Header> - <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> - <MsgStatusList xmlns="http://www.osci.eu/ws/2008/05/transport"/> - </s:Body> -</s:Envelope> \ No newline at end of file diff --git a/xta-adapter/pom.xml b/xta-adapter/pom.xml deleted file mode 100644 index e52b51d51b71d20a53c842523407cf0f8438ba74..0000000000000000000000000000000000000000 --- a/xta-adapter/pom.xml +++ /dev/null @@ -1,194 +0,0 @@ -<?xml version="1.0"?> -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> - <modelVersion>4.0.0</modelVersion> - <parent> - <groupId>de.ozgcloud.eingang</groupId> - <artifactId>eingang-manager</artifactId> - <version>2.16.0-SNAPSHOT</version> - </parent> - <artifactId>xta-adapter</artifactId> - <name>Eingangs Adapter - XTA</name> - <packaging>jar</packaging> - - <properties> - <spring-boot.build-image.imageName>docker.ozg-sh.de/xta-adapter:build-latest</spring-boot.build-image.imageName> - </properties> - - <dependencies> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-web-services</artifactId> - <exclusions> - <exclusion> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-tomcat</artifactId> - </exclusion> - </exclusions> - </dependency> - <dependency> - <groupId>org.springframework.ws</groupId> - <artifactId>spring-ws-security</artifactId> - </dependency> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-log4j2</artifactId> - </dependency> - <!-- own projects --> - <dependency> - <groupId>de.ozgcloud.eingang</groupId> - <artifactId>common</artifactId> - </dependency> - <dependency> - <groupId>de.ozgcloud.eingang</groupId> - <artifactId>semantik-adapter</artifactId> - </dependency> - <dependency> - <groupId>de.ozgcloud.eingang</groupId> - <artifactId>fim-adapter</artifactId> - </dependency> - <!--mapstruct--> - <dependency> - <groupId>org.mapstruct</groupId> - <artifactId>mapstruct</artifactId> - </dependency> - <dependency> - <groupId>org.springframework.ws</groupId> - <artifactId>spring-ws-core</artifactId> - </dependency> - <dependency> - <groupId>org.springframework.ws</groupId> - <artifactId>spring-ws-support</artifactId> - </dependency> - <dependency> - <groupId>org.springframework.ws</groupId> - <artifactId>spring-ws-test</artifactId> - <scope>test</scope> - </dependency> - <!-- JAXB API only --> - <dependency> - <groupId>jakarta.xml.bind</groupId> - <artifactId>jakarta.xml.bind-api</artifactId> - </dependency> - <dependency> - <groupId>com.sun.xml.bind</groupId> - <artifactId>jaxb-impl</artifactId> - </dependency> - <!-- Dev --> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-devtools</artifactId> - <scope>runtime</scope> - <optional>true</optional> - </dependency> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-configuration-processor</artifactId> - <optional>true</optional> - </dependency> - <!-- Test --> - <dependency> - <groupId>de.ozgcloud.eingang</groupId> - <artifactId>common</artifactId> - <type>test-jar</type> - <scope>test</scope> - </dependency> - </dependencies> - - <build> - <plugins> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-compiler-plugin</artifactId> - </plugin> - <plugin> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-maven-plugin</artifactId> - <configuration> - <profiles>local,sec</profiles> - </configuration> - </plugin> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-dependency-plugin</artifactId> - <executions> - <execution> - <goals> - <goal>unpack</goal> - </goals> - <configuration> - <artifactItems> - <artifactItem> - <groupId>de.ozgcloud.eingang</groupId> - <artifactId>fim-adapter</artifactId> - <version>${project.version}</version> - <includes>**/*.yml,**/*.xml,**/*.xsd</includes> - </artifactItem> - </artifactItems> - <outputDirectory>${project.build.directory}/classes/</outputDirectory> - </configuration> - </execution> - </executions> - </plugin> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-failsafe-plugin</artifactId> - </plugin> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-surefire-plugin</artifactId> - </plugin> - <plugin> - <groupId>org.jacoco</groupId> - <artifactId>jacoco-maven-plugin</artifactId> - </plugin> - <plugin> - <groupId>pl.project13.maven</groupId> - <artifactId>git-commit-id-plugin</artifactId> - </plugin> - - <plugin> - <groupId>org.codehaus.mojo</groupId> - <artifactId>jaxb2-maven-plugin</artifactId> - <executions> - <execution> - <id>wsdl1</id> - <goals> - <goal>xjc</goal> - </goals> - <configuration> - <sourceType>wsdl</sourceType> - <sources> - <source>${basedir}/src/main/resources/XTA.wsdl</source> - </sources> - <clearOutputDir>false</clearOutputDir> - <arguments>-wsdl</arguments> - </configuration> - </execution> - </executions> - </plugin> - </plugins> - </build> - - <profiles> - <profile> - <id>ci-build</id> - <build> - <plugins> - <plugin> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-maven-plugin</artifactId> - <executions> - <execution> - <id>build-image</id> - <phase>install</phase> - <goals> - <goal>build-image-no-fork</goal> - </goals> - </execution> - </executions> - </plugin> - </plugins> - </build> - </profile> - </profiles> -</project> diff --git a/xta-adapter/readme.md b/xta-adapter/readme.md deleted file mode 100644 index 86a1f9338e7831a8af8c7b4202815531260d25e4..0000000000000000000000000000000000000000 --- a/xta-adapter/readme.md +++ /dev/null @@ -1,48 +0,0 @@ -# Keystore passwort - -Das Keystore und Passwort müssen extra hinzugefügt werden. Keystore irgendwo im Dateisystem ablegen. -Dazu eine Datei 'application-sec.yml' anlegen: - -ozgcloud: - xta: - keystore: - store: file:<pfad zum keystore> - password: <geheim> - -Den Dienst dann mit dem Spring-Profile 'sec' starten. - -# P12 Datei erzeugen und als Umgerbungsvariable umwandeln - -Wir haben eine pfx Datei bekommen und wandeln diese in eine P12 Cert Datei um: - - keytool -importkeystore -srckeystore KOP_SH_KIEL_DEV.pfx -srcstoretype pkcs12 -destkeystore KOP_SH_KIEL_DEV.p12 -deststoretype PKCS12 - -Dann in Base64 umwandeln, damit es als Umgebungsvariable gesetzt werden kann: - - base64 KOP_SH_KIEL_DEV.p12 - -# Lokale Installation -Lokal das Root CA in keystore laden (https://ddatabox.dataport.de/public/download-shares/XUok5Wk3EDGWyYaoFGldOeJfGu0J8pke): - - sudo keytool -trustcacerts -keystore /lib/jvm/java-1.17.0-openjdk-amd64/lib/security/cacerts -storepass changeit -importcert -alias dataportRoot -file DataportRootCA02.crt - -Port forwarding aktivieren. Um eine Verbindung zum Nachrichtenbroker aufbauen zu können, muss diese über den Hetzner-Server geroutet werden: - - ssh -L 3000:[Hetzner-Server-IP]:443 ozg-sh.de (ggf ssh -L 0.0.0.0:3000:[Hetzner-Server-IP]:443 ozg-sh.de) - -## Alternative Dataport Zertifikat Installation -Zertifikate direkt vom Endpunkt anfragen: -```shell -openssl s_client -showcerts -connect li33-0005.dp.dsecurecloud.de:443 </dev/null -``` -und das `Dataport Root CA` Zertifikat unter `/etc/ssl/certs/dataport-root-ca.pem` abspeichern, dann `sudo update-ca-certificates` aufrufen. - -## deprecated - -DEPRECATED, da wir den HostNameVerifier deaktiviert haben: Hosts Datei erzeugen, damit der Hostname passt: - - 127.0.0.1 LI33-0005 - -# SoapUi Projekt zum manuellen Abrufen des Nachrichtenbrokers -Im Dokumentation Repo unter `Entwicklungsumgebung/Beistellungen/soapUiXTA` liegt ein SoapUi Projekt, -dass manuelle XTA-Aufrufe des Nachrichtenbrokers ermöglicht. diff --git a/xta-adapter/run_helm_test.sh b/xta-adapter/run_helm_test.sh deleted file mode 100755 index 31d13d5b9e4162f68f627d2eb96c3b2b3a98828a..0000000000000000000000000000000000000000 --- a/xta-adapter/run_helm_test.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/sh - -set -e - -helm template ./src/main/helm/ -f src/test/helm-linter-values.yaml -helm lint -f src/test/helm-linter-values.yaml ./src/main/helm/ -cd src/main/helm && helm unittest -f '../../test/helm/**/*.yaml' . diff --git a/xta-adapter/src/main/helm/Chart.yaml b/xta-adapter/src/main/helm/Chart.yaml deleted file mode 100644 index 63f41e33d74056096e8c7066e712b1485de937d9..0000000000000000000000000000000000000000 --- a/xta-adapter/src/main/helm/Chart.yaml +++ /dev/null @@ -1,31 +0,0 @@ -# -# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den -# Ministerpräsidenten des Landes Schleswig-Holstein -# Staatskanzlei -# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung -# -# Lizenziert unter der EUPL, Version 1.2 oder - sobald -# diese von der Europäischen Kommission genehmigt wurden - -# Folgeversionen der EUPL ("Lizenz"); -# Sie dürfen dieses Werk ausschließlich gemäß -# dieser Lizenz nutzen. -# Eine Kopie der Lizenz finden Sie hier: -# -# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 -# -# Sofern nicht durch anwendbare Rechtsvorschriften -# gefordert oder in schriftlicher Form vereinbart, wird -# die unter der Lizenz verbreitete Software "so wie sie -# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - -# ausdrücklich oder stillschweigend - verbreitet. -# Die sprachspezifischen Genehmigungen und Beschränkungen -# unter der Lizenz sind dem Lizenztext zu entnehmen. -# - -apiVersion: v1 -appVersion: "1.1" -description: A Helm chart for Xta-Adapter -name: xta-adapter -version: 0.0.0-MANAGED-BY-JENKINS -icon: https://simpleicons.org/icons/helm.svg - diff --git a/xta-adapter/src/main/helm/README.md b/xta-adapter/src/main/helm/README.md deleted file mode 100644 index e0a7cdacb4a8c23bb9516c07556c582b59199ad2..0000000000000000000000000000000000000000 --- a/xta-adapter/src/main/helm/README.md +++ /dev/null @@ -1,35 +0,0 @@ -# Helm - -## Linter - -`helm lint -f test-values.yaml` - -## Unit-Tests - -Für Unit-Tests wird das helm [helm-unittest](https://github.com/quintush/helm-unittest) plugin benötigt. Die Unit-Tests liegen im Verzeichnis src/test/helm - -`helm unittest -f '../../test/helm/*.yaml' -v '../../test/helm/values/unit-values.yaml' .` - -## SyntaxCheck - -`helm template --debug -f test-values.yaml .` - -## Package - -`helm package --version=[version] .` - -## Versionierung - -Jenkins verwendet die Version aus der pom.xml - -### Master Branch - -Im master Branch werden die ersten 7 Zeichen vom git commit hash an die Version gehangen. - -### Release Branch - -Ist nur die Version aus der pom.xml - -### Feature Branch - -In einem feature Branch wird der Branchname an die Version gehangen. \ No newline at end of file diff --git a/xta-adapter/src/main/helm/app-readme.md b/xta-adapter/src/main/helm/app-readme.md deleted file mode 100644 index 8d33e802a5142a579e690d124737d9e8b3ba7e7e..0000000000000000000000000000000000000000 --- a/xta-adapter/src/main/helm/app-readme.md +++ /dev/null @@ -1 +0,0 @@ -# Xta-Adapter \ No newline at end of file diff --git a/xta-adapter/src/main/helm/templates/_helpers.tpl b/xta-adapter/src/main/helm/templates/_helpers.tpl deleted file mode 100644 index 5f233e14c2eca1effd045608f7549e390bef9c99..0000000000000000000000000000000000000000 --- a/xta-adapter/src/main/helm/templates/_helpers.tpl +++ /dev/null @@ -1,79 +0,0 @@ -{{/* vim: set filetype=mustache: */}} - -{{/* error check 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec) */}} -{{/* Namespace */}} -{{- define "app.namespace" -}} -{{- if gt (len (.Release.Namespace)) 63 -}} -{{- fail (printf ".Release.Namespace %s ist zu lang (max. 63 Zeichen)" .Release.Namespace) -}} -{{- end -}} -{{ printf "%s" .Release.Namespace }} -{{- end -}} - -{{/* Chart: Name + Version */}} -{{- define "app.chart" -}} -{{- if gt (len (printf "%s-%s" .Chart.Name .Chart.Version)) 63 -}} -{{- fail (printf ".Chart.Name-.Chart.Version %s-%s ist zu lang (max. 63 Zeichen)" .Chart.Name .Chart.Version) -}} -{{- end -}} -{{ printf "%s-%s" .Chart.Name .Chart.Version }} -{{- end -}} - -{{/* Managed-by -> On Helm, this value is always Helm */}} -{{- define "app.managedBy" -}} -{{- if gt (len (.Release.Service)) 63 -}} -{{- fail (printf ".Release.Service %s ist zu lang (max. 63 Zeichen)" .Release.Service) -}} -{{- end -}} -{{ printf "%s" .Release.Service }} -{{- end -}} - -{{/* Default Labels: Helm recommended best-practice labels https://helm.sh/docs/chart_best_practices/labels/ */}} -{{- define "app.defaultLabels" }} -app.kubernetes.io/instance: {{ .Release.Name }} -app.kubernetes.io/managed-by: {{ include "app.managedBy" . }} -app.kubernetes.io/name: {{ .Release.Name }} -app.kubernetes.io/part-of: ozgcloud -app.kubernetes.io/version: {{ .Chart.Version }} -app.kubernetes.io/namespace: {{ include "app.namespace" . }} -helm.sh/chart: {{ include "app.chart" . }} -{{- end -}} - -{{- define "app.envSpringProfiles" }} -{{- if (.Values.env).overrideSpringProfiles -}} -{{ printf "%s" (.Values.env).overrideSpringProfiles }} -{{- else -}} -{{ printf "oc, %s" (include "app.kopEnvironment" . ) }} -{{- end -}} -{{- end -}} - -{{- define "app.kopEnvironment" -}} -{{- required "Environment muss angegeben sein" (.Values.ozgcloud).environment -}} -{{- end -}} - -{{- define "app.xtaSchedule" -}} -{{- if (.Values.xta).schedule -}} -{{ .Values.xta.schedule | quote }} -{{- else if eq (include "app.kopEnvironment" . ) "dev" -}} -{{ "*/15 * * * *" | quote }} -{{- end -}} -{{- end -}} - -{{- define "app.serviceAccountName" -}} -{{ printf "%s" ( (.Values.serviceAccount).name | default "xta-adapter-service-account" ) }} -{{- end -}} - -{{- define "app.getCustomList" -}} -{{- with (.Values.env).customList -}} -{{- if kindIs "map" . -}} -{{ include "app.dictToList" . }} -{{- else if kindIs "slice" . -}} -{{ . | toYaml }} -{{- end -}} -{{- end -}} -{{- end -}} - -{{- define "app.dictToList" -}} -{{- $customList := list -}} -{{- range $key, $value := . -}} -{{- $customList = append $customList (dict "name" $key "value" $value) }} -{{- end -}} -{{- $customList | toYaml -}} -{{- end -}} \ No newline at end of file diff --git a/xta-adapter/src/main/helm/templates/network_policy.yaml b/xta-adapter/src/main/helm/templates/network_policy.yaml deleted file mode 100644 index ff1ebff546dae5ea3eeecf224e1652a6ab929091..0000000000000000000000000000000000000000 --- a/xta-adapter/src/main/helm/templates/network_policy.yaml +++ /dev/null @@ -1,98 +0,0 @@ -# -# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den -# Ministerpräsidenten des Landes Schleswig-Holstein -# Staatskanzlei -# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung -# -# Lizenziert unter der EUPL, Version 1.2 oder - sobald -# diese von der Europäischen Kommission genehmigt wurden - -# Folgeversionen der EUPL ("Lizenz"); -# Sie dürfen dieses Werk ausschließlich gemäß -# dieser Lizenz nutzen. -# Eine Kopie der Lizenz finden Sie hier: -# -# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 -# -# Sofern nicht durch anwendbare Rechtsvorschriften -# gefordert oder in schriftlicher Form vereinbart, wird -# die unter der Lizenz verbreitete Software "so wie sie -# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - -# ausdrücklich oder stillschweigend - verbreitet. -# Die sprachspezifischen Genehmigungen und Beschränkungen -# unter der Lizenz sind dem Lizenztext zu entnehmen. -# - -{{- if not (.Values.networkPolicy).disabled }} -apiVersion: networking.k8s.io/v1 -kind: NetworkPolicy -metadata: - name: network-policy-xta-adapter - namespace: {{ .Release.Namespace }} -spec: - podSelector: - matchLabels: - ozg-component: xta-adapter - policyTypes: - - Egress - egress: - - to: - - podSelector: - matchLabels: - component: vorgang-manager - ports: - - port: 9090 - protocol: TCP - - to: - - namespaceSelector: - matchLabels: - kubernetes.io/metadata.name: {{ required "networkPolicy.dnsServerNamespace must be set" (.Values.networkPolicy).dnsServerNamespace }} - ports: - - port: 53 - protocol: UDP - - port: 53 - protocol: TCP - - port: 5353 - protocol: UDP - - port: 5353 - protocol: TCP - - to: - - namespaceSelector: - matchLabels: - kubernetes.io/metadata.name: ssh-port-forward - ports: - - port: 443 - protocol: TCP - - port: 80 - protocol: TCP - - port: 9000 - protocol: TCP - -{{- if eq (.Values.routing).routingStrategy "ZUFI" }} - - to: - - namespaceSelector: - matchLabels: - kubernetes.io/metadata.name: {{ required "routing.zufiManager.namespace must be set if routingStrategy=ZUFI" ((.Values.routing).zufiManager).namespace }} - podSelector: - matchLabels: - component: zufi-server - ports: - - port: 9090 - protocol: TCP - - to: - - namespaceSelector: {} - podSelector: - matchLabels: - component: vorgang-manager - ports: - - port: 9090 - protocol: TCP -{{- end }} - -{{- with (.Values.networkPolicy).additionalEgressConfigLocal }} -{{ toYaml . | indent 2 }} -{{- end }} -{{- with (.Values.networkPolicy).additionalEgressConfigGlobal }} -{{ toYaml . | indent 2 }} -{{- end }} - -{{- end }} \ No newline at end of file diff --git a/xta-adapter/src/main/helm/templates/service_account.yaml b/xta-adapter/src/main/helm/templates/service_account.yaml deleted file mode 100644 index 0e13e6bcabf1933117c29487473453b63265922a..0000000000000000000000000000000000000000 --- a/xta-adapter/src/main/helm/templates/service_account.yaml +++ /dev/null @@ -1,31 +0,0 @@ -# -# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den -# Ministerpräsidenten des Landes Schleswig-Holstein -# Staatskanzlei -# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung -# -# Lizenziert unter der EUPL, Version 1.2 oder - sobald -# diese von der Europäischen Kommission genehmigt wurden - -# Folgeversionen der EUPL ("Lizenz"); -# Sie dürfen dieses Werk ausschließlich gemäß -# dieser Lizenz nutzen. -# Eine Kopie der Lizenz finden Sie hier: -# -# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 -# -# Sofern nicht durch anwendbare Rechtsvorschriften -# gefordert oder in schriftlicher Form vereinbart, wird -# die unter der Lizenz verbreitete Software "so wie sie -# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - -# ausdrücklich oder stillschweigend - verbreitet. -# Die sprachspezifischen Genehmigungen und Beschränkungen -# unter der Lizenz sind dem Lizenztext zu entnehmen. -# - -{{- if (.Values.serviceAccount).create }} -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ include "app.serviceAccountName" . }} - namespace: {{ include "app.namespace" . }} -{{- end }} \ No newline at end of file diff --git a/xta-adapter/src/main/helm/templates/xta_adapter_cronjob.yaml b/xta-adapter/src/main/helm/templates/xta_adapter_cronjob.yaml deleted file mode 100644 index 761959137f507e67d20c246ec86bc7393c52a75d..0000000000000000000000000000000000000000 --- a/xta-adapter/src/main/helm/templates/xta_adapter_cronjob.yaml +++ /dev/null @@ -1,179 +0,0 @@ -# -# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den -# Ministerpräsidenten des Landes Schleswig-Holstein -# Staatskanzlei -# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung -# -# Lizenziert unter der EUPL, Version 1.2 oder - sobald -# diese von der Europäischen Kommission genehmigt wurden - -# Folgeversionen der EUPL ("Lizenz"); -# Sie dürfen dieses Werk ausschließlich gemäß -# dieser Lizenz nutzen. -# Eine Kopie der Lizenz finden Sie hier: -# -# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 -# -# Sofern nicht durch anwendbare Rechtsvorschriften -# gefordert oder in schriftlicher Form vereinbart, wird -# die unter der Lizenz verbreitete Software "so wie sie -# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - -# ausdrücklich oder stillschweigend - verbreitet. -# Die sprachspezifischen Genehmigungen und Beschränkungen -# unter der Lizenz sind dem Lizenztext zu entnehmen. -# - -apiVersion: batch/v1 -kind: CronJob -metadata: - name: {{ .Release.Name }} - namespace: {{ include "app.namespace" . }} - labels: - {{- include "app.defaultLabels" . | indent 4 }} -spec: - schedule: {{ include "app.xtaSchedule" . }} - successfulJobsHistoryLimit: 3 - failedJobsHistoryLimit: 3 - concurrencyPolicy: Forbid - startingDeadlineSeconds: 120 - jobTemplate: - spec: - backoffLimit: 1 - template: - metadata: - labels: - workload: xta-adapter-cronjob - ozg-component: xta-adapter - spec: - {{- if (.Values.serviceAccount).create }} - serviceAccountName: {{ include "app.serviceAccountName" . }} - {{- end }} - restartPolicy: Never - containers: - - name: xta-adapter - image: "{{ .Values.image.repo }}/{{ .Values.image.name }}:{{ (.Values.image).tag }}" - imagePullPolicy: Always - env: - - name: spring_profiles_active - value: {{ include "app.envSpringProfiles" . }} - - name: SERVICE_BINDING_ROOT - value: "/bindings" - - name: ozgcloud_xta_server_name - value: {{ (.Values.xta).server.name }} - - name: ozgcloud_xta_server_address - value: {{ (.Values.xta).server.address }} - - name: ozgcloud_xta_server_protocol - value: {{ (.Values.xta).server.protocol }} - - name: ozgcloud_xta_identifiers - value: {{ (.Values.xta).identifiers | join "," | quote }} - - name: ozgcloud_xta_keystore_file - value: "keystore/xta-keystore.p12" - - name: ozgcloud_xta_keystore_password - valueFrom: - secretKeyRef: - name: "xta-keystore" - key: password - optional: false - - name: ozgcloud_adapter_fallbackStrategy - value: {{ (.Values.routing).fallbackStrategy | default "DENY"}} - - name: ozgcloud_adapter_routingStrategy - value: {{ (.Values.routing).routingStrategy | default "SINGLE"}} - {{- if (.Values.routing).targetVorgangManagerName }} - - name: ozgcloud_adapter_targetVorgangManagerName - value: {{ (.Values.routing).targetVorgangManagerName}} - - name: grpc_client_vorgang-manager-{{ (.Values.routing).targetVorgangManagerName }}_address - value: 'dns:///vorgang-manager.{{ coalesce (.Values.routing).targetNamespace .Release.Namespace }}:9090' - - name: grpc_client_vorgang-manager-{{ (.Values.routing).targetVorgangManagerName }}_negotiationType - value: {{ (.Values.routing).negotiationType | default "PLAINTEXT" }} - {{- end }} - {{- if eq (.Values.routing).routingStrategy "ZUFI" }} - - name: grpc_client_zufi-manager_address - value: {{ required "routing.zufiManager.address must be set when routingStrategy=ZUFI" ((.Values.routing).zufiManager).address | quote }} - - name: grpc_client_zufi-manager_negotiationType - value: {{ ((.Values.routing).zufiManager).negotiationType | default "PLAINTEXT" }} - {{- end }} - {{- with include "app.getCustomList" . }} -{{ . | indent 16 }} - {{- end }} - volumeMounts: - - name: bindings - mountPath: "/bindings/ca-certificates/type" - subPath: type - readOnly: true - - name: xta-root-ca - mountPath: "/bindings/ca-certificates/xta-root-ca.crt" - subPath: ca.crt - readOnly: true - - name: xta-keystore - mountPath: "/workspace/keystore/xta-keystore.p12" - subPath: file - readOnly: true - - name: temp-dir - mountPath: "/tmp" - securityContext: - allowPrivilegeEscalation: false - privileged: false - readOnlyRootFilesystem: false - runAsNonRoot: true - {{- with (.Values.securityContext).runAsUser }} - runAsUser: {{ . }} - {{- end }} - {{- with (.Values.securityContext).runAsGroup }} - runAsGroup: {{ . }} - {{- end }} - {{- with (.Values.securityContext).capabilities }} - capabilities: -{{ toYaml . | indent 18 }} - {{- end }} - resources: - {{- with .Values.resources }} -{{ toYaml . | indent 16 }} - {{- end }} - - {{- if (.Values.dummyProbesEnabled) }} - livenessProbe: - exec: - command: - - echo - - '>' - - /dev/null - periodSeconds: 10 - successThreshold: 1 - timeoutSeconds: 3 - readinessProbe: - exec: - command: - - echo - - '>' - - /dev/null - periodSeconds: 10 - successThreshold: 1 - timeoutSeconds: 3 - startupProbe: - exec: - command: - - echo - - '>' - - /dev/null - periodSeconds: 10 - successThreshold: 1 - timeoutSeconds: 3 - {{- end }} - - volumes: - - name: bindings - configMap: - name: xta-adapter-bindings-type - - name: xta-root-ca - secret: - secretName: xta-root-ca - - name: xta-keystore - secret: - secretName: xta-keystore - - name: temp-dir - emptyDir: {} - imagePullSecrets: - - name: {{ required "imagePullSecret must be set" .Values.imagePullSecret }} - {{- with .Values.podSecurityContext }} - securityContext: -{{ toYaml . | indent 12 }} - {{- end }} diff --git a/xta-adapter/src/main/helm/templates/xta_bindings_type_configmap.yaml b/xta-adapter/src/main/helm/templates/xta_bindings_type_configmap.yaml deleted file mode 100644 index 983076ff6af90bffb3efc8e8936cbdf647b22782..0000000000000000000000000000000000000000 --- a/xta-adapter/src/main/helm/templates/xta_bindings_type_configmap.yaml +++ /dev/null @@ -1,10 +0,0 @@ -{{- if (.Values.xta).rootCa }} -apiVersion: v1 -kind: ConfigMap -metadata: - name: xta-adapter-bindings-type - namespace: {{ include "app.namespace" . }} -data: - type: | - ca-certificates -{{- end }} \ No newline at end of file diff --git a/xta-adapter/src/main/helm/templates/xta_keystore_secret.yaml b/xta-adapter/src/main/helm/templates/xta_keystore_secret.yaml deleted file mode 100644 index c3a2a68798bf5f19a85acdba50846f217b3d9998..0000000000000000000000000000000000000000 --- a/xta-adapter/src/main/helm/templates/xta_keystore_secret.yaml +++ /dev/null @@ -1,36 +0,0 @@ -# -# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den -# Ministerpräsidenten des Landes Schleswig-Holstein -# Staatskanzlei -# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung -# -# Lizenziert unter der EUPL, Version 1.2 oder - sobald -# diese von der Europäischen Kommission genehmigt wurden - -# Folgeversionen der EUPL ("Lizenz"); -# Sie dürfen dieses Werk ausschließlich gemäß -# dieser Lizenz nutzen. -# Eine Kopie der Lizenz finden Sie hier: -# -# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 -# -# Sofern nicht durch anwendbare Rechtsvorschriften -# gefordert oder in schriftlicher Form vereinbart, wird -# die unter der Lizenz verbreitete Software "so wie sie -# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - -# ausdrücklich oder stillschweigend - verbreitet. -# Die sprachspezifischen Genehmigungen und Beschränkungen -# unter der Lizenz sind dem Lizenztext zu entnehmen. -# - -{{- if (.Values.xta).keystore }} -apiVersion: v1 -kind: Secret -metadata: - name: xta-keystore - namespace: {{ include "app.namespace" . }} -type: Opaque -stringData: - password: {{ .Values.xta.keystore.password }} -data: - file: {{ .Values.xta.keystore.file }} -{{- end }} \ No newline at end of file diff --git a/xta-adapter/src/main/helm/templates/xta_root_ca_secret.yaml b/xta-adapter/src/main/helm/templates/xta_root_ca_secret.yaml deleted file mode 100644 index 76a6045db112864e7474688c449ad0ffac0d58e3..0000000000000000000000000000000000000000 --- a/xta-adapter/src/main/helm/templates/xta_root_ca_secret.yaml +++ /dev/null @@ -1,34 +0,0 @@ -# -# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den -# Ministerpräsidenten des Landes Schleswig-Holstein -# Staatskanzlei -# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung -# -# Lizenziert unter der EUPL, Version 1.2 oder - sobald -# diese von der Europäischen Kommission genehmigt wurden - -# Folgeversionen der EUPL ("Lizenz"); -# Sie dürfen dieses Werk ausschließlich gemäß -# dieser Lizenz nutzen. -# Eine Kopie der Lizenz finden Sie hier: -# -# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 -# -# Sofern nicht durch anwendbare Rechtsvorschriften -# gefordert oder in schriftlicher Form vereinbart, wird -# die unter der Lizenz verbreitete Software "so wie sie -# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - -# ausdrücklich oder stillschweigend - verbreitet. -# Die sprachspezifischen Genehmigungen und Beschränkungen -# unter der Lizenz sind dem Lizenztext zu entnehmen. -# - -{{- if (.Values.xta).rootCa }} -apiVersion: v1 -kind: Secret -metadata: - name: xta-root-ca - namespace: {{ include "app.namespace" . }} -type: Opaque -data: - ca.crt: {{ .Values.xta.rootCa }} -{{- end }} \ No newline at end of file diff --git a/xta-adapter/src/main/helm/values.yaml b/xta-adapter/src/main/helm/values.yaml deleted file mode 100644 index b7fd23ad6dcbad154f52411df043403824f33d86..0000000000000000000000000000000000000000 --- a/xta-adapter/src/main/helm/values.yaml +++ /dev/null @@ -1,36 +0,0 @@ -# -# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den -# Ministerpräsidenten des Landes Schleswig-Holstein -# Staatskanzlei -# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung -# -# Lizenziert unter der EUPL, Version 1.2 oder - sobald -# diese von der Europäischen Kommission genehmigt wurden - -# Folgeversionen der EUPL ("Lizenz"); -# Sie dürfen dieses Werk ausschließlich gemäß -# dieser Lizenz nutzen. -# Eine Kopie der Lizenz finden Sie hier: -# -# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 -# -# Sofern nicht durch anwendbare Rechtsvorschriften -# gefordert oder in schriftlicher Form vereinbart, wird -# die unter der Lizenz verbreitete Software "so wie sie -# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - -# ausdrücklich oder stillschweigend - verbreitet. -# Die sprachspezifischen Genehmigungen und Beschränkungen -# unter der Lizenz sind dem Lizenztext zu entnehmen. -# - -image: - repo: docker.ozg-sh.de - name: xta-adapter - tag: 9.9.99 - -# env: -# overrideSpringProfiles: "oc,prod" - -routing: - targetVorgangManagerName: vorgang-manager - fallbackStrategy: DENY - routingStrategy: SINGLE \ No newline at end of file diff --git a/xta-adapter/src/main/java/de/ozgcloud/eingang/xdomea/XMLHelper.java b/xta-adapter/src/main/java/de/ozgcloud/eingang/xdomea/XMLHelper.java deleted file mode 100644 index 1eb09f2e7a2fd4e6b194e855f40ea50e110dc044..0000000000000000000000000000000000000000 --- a/xta-adapter/src/main/java/de/ozgcloud/eingang/xdomea/XMLHelper.java +++ /dev/null @@ -1,63 +0,0 @@ -package de.ozgcloud.eingang.xdomea; - -import java.io.IOException; - -import javax.xml.XMLConstants; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; -import javax.xml.xpath.XPathExpression; -import javax.xml.xpath.XPathExpressionException; -import javax.xml.xpath.XPathFactory; -import javax.xml.xpath.XPathFactoryConfigurationException; - -import org.w3c.dom.Document; -import org.xml.sax.SAXException; - -import de.ozgcloud.eingang.common.errorhandling.TechnicalException; -import de.ozgcloud.eingang.common.formdata.IncomingFile; -import lombok.AccessLevel; -import lombok.NoArgsConstructor; - -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class XMLHelper { - - private static final DocumentBuilder DOCUMENT_BUILDER = createDocumentBuilder(); - private static final XPathFactory X_PATH_FACTORY = createXPathFactory(); - - public static Document parseDocument(IncomingFile incomingFile) { - try (var inputStream = incomingFile.getContentStream()) { - return DOCUMENT_BUILDER.parse(inputStream); - } catch (SAXException | IOException e) { - throw new TechnicalException("Failed to parse xml document!", e); - } - } - - public static XPathExpression compileXPathExpression(String xPathString) { - try { - return X_PATH_FACTORY.newXPath().compile(xPathString); - } catch (XPathExpressionException e) { - throw new TechnicalException("Failed to compile xpath expression!", e); - } - } - - private static DocumentBuilder createDocumentBuilder() { - var documentBuilderFactory = DocumentBuilderFactory.newInstance(); - try { - documentBuilderFactory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); - return documentBuilderFactory.newDocumentBuilder(); - } catch (ParserConfigurationException e) { - throw new TechnicalException("Failed to configure document builder", e); - } - } - - private static XPathFactory createXPathFactory() { - var xPathFactory = XPathFactory.newInstance(); - try { - xPathFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, Boolean.TRUE); - return xPathFactory; - } catch (XPathFactoryConfigurationException e) { - throw new TechnicalException("Failed to configure xpath factory!", e); - } - } -} diff --git a/xta-adapter/src/main/java/de/ozgcloud/eingang/xdomea/XdomeaMessageData.java b/xta-adapter/src/main/java/de/ozgcloud/eingang/xdomea/XdomeaMessageData.java deleted file mode 100644 index 432b06c5273798eb5bf67ff0666dea40211c69ad..0000000000000000000000000000000000000000 --- a/xta-adapter/src/main/java/de/ozgcloud/eingang/xdomea/XdomeaMessageData.java +++ /dev/null @@ -1,17 +0,0 @@ -package de.ozgcloud.eingang.xdomea; - -import java.util.List; - -import de.ozgcloud.eingang.common.formdata.IncomingFile; -import de.ozgcloud.eingang.common.formdata.IncomingFileGroup; -import lombok.Builder; -import lombok.Singular; - -@Builder -public record XdomeaMessageData( - IncomingFile metadataFile, - List<IncomingFile> representations, - @Singular - List<IncomingFileGroup> attachments -) { -} diff --git a/xta-adapter/src/main/java/de/ozgcloud/eingang/xdomea/XdomeaMessageDataMapper.java b/xta-adapter/src/main/java/de/ozgcloud/eingang/xdomea/XdomeaMessageDataMapper.java deleted file mode 100644 index 6457a44999996af0d349119bcc365724f0541bb7..0000000000000000000000000000000000000000 --- a/xta-adapter/src/main/java/de/ozgcloud/eingang/xdomea/XdomeaMessageDataMapper.java +++ /dev/null @@ -1,152 +0,0 @@ -package de.ozgcloud.eingang.xdomea; - -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import org.springframework.stereotype.Component; - -import de.ozgcloud.eingang.common.errorhandling.TechnicalException; -import de.ozgcloud.eingang.common.formdata.IncomingFile; -import de.ozgcloud.eingang.common.formdata.IncomingFileGroup; -import de.ozgcloud.eingang.xta.RepresentationsAttachmentsPair; -import lombok.RequiredArgsConstructor; -import lombok.extern.log4j.Log4j2; - -@Component -@Log4j2 -@RequiredArgsConstructor -public class XdomeaMessageDataMapper { - static final String XDOMEA_0201_XML_FILE_NAME_SUFFIX = "_Geschaeftsgang.Geschaeftsgang.0201.xml"; - static final String ATTACHMENT_GROUP_NAME = "Dokument"; - - private final XdomeaXMLValueReader valueReader; - - public RepresentationsAttachmentsPair mapIncomingFilesToRepresentationsAttachmentsPair(List<IncomingFile> incomingFileList) { - var xdomeaMessageData = mapIncomingFilesToXdomeaMessageData(incomingFileList); - return RepresentationsAttachmentsPair.builder() - .representations(removeUuidPrefixFromIncomingFiles(getPairRepresentations(xdomeaMessageData))) - .attachments(removeUuidPrefixFromIncomingFileGroups(xdomeaMessageData.attachments())) - .build(); - } - - private List<IncomingFileGroup> removeUuidPrefixFromIncomingFileGroups(List<IncomingFileGroup> incomingFileGroups) { - return incomingFileGroups.stream() - .map(group -> group.toBuilder() - .clearFiles() - .files(removeUuidPrefixFromIncomingFiles(group.getFiles())) - .build()) - .toList(); - } - - private List<IncomingFile> removeUuidPrefixFromIncomingFiles(List<IncomingFile> incomingFiles) { - return incomingFiles.stream() - .map(this::removeUuidPrefixFromIncomingFile) - .toList(); - } - - private IncomingFile removeUuidPrefixFromIncomingFile(IncomingFile incomingFile) { - return incomingFile.toBuilder() - .name(removeUuidPrefix(incomingFile.getName())) - .build(); - } - - private String removeUuidPrefix(String name) { - return name.replaceFirst("^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}_", ""); - } - - private List<IncomingFile> getPairRepresentations(XdomeaMessageData xdomeaMessageData) { - return Stream.concat( - Stream.of(xdomeaMessageData.metadataFile()), - xdomeaMessageData.representations().stream() - ).toList(); - } - - XdomeaMessageData mapIncomingFilesToXdomeaMessageData(List<IncomingFile> incomingFileList) { - var xdomeaXMLFile = findXdomeaXMLFile(incomingFileList); - var representationFileNames = valueReader.readRepresentationFileNames(xdomeaXMLFile); - var attachmentFileNames = getFileNamesExcluding( - incomingFileList, - Stream.concat(Stream.of(xdomeaXMLFile.getName()), representationFileNames.stream()) - ); - - var fileNameToFileMap = createFileNameToIncomingFileMap(incomingFileList); - return XdomeaMessageData.builder() - .metadataFile(xdomeaXMLFile) - .representations(getRepresentations(representationFileNames, fileNameToFileMap)) - .attachments(getAttachments(attachmentFileNames, fileNameToFileMap)) - .build(); - } - - private Map<String, IncomingFile> createFileNameToIncomingFileMap(List<IncomingFile> incomingFileList) { - return incomingFileList.stream() - .collect(Collectors.toMap(IncomingFile::getName, file -> file)); - } - - private Stream<String> getFileNamesExcluding(List<IncomingFile> incomingFileList, Stream<String> excludedFileNames) { - return dropNames( - incomingFileList.stream().map(IncomingFile::getName), - excludedFileNames.collect(Collectors.toSet()) - ); - } - - private List<IncomingFile> getRepresentations(List<String> representationFileNames, Map<String, IncomingFile> fileNameToFileMap) { - return getFilesByName( - movePrimaryRepresentationFileNameToFirstPosition(representationFileNames), - fileNameToFileMap - ); - } - - private List<IncomingFileGroup> getAttachments(Stream<String> attachmentFileNames, Map<String, IncomingFile> fileNameToFileMap) { - return Stream.of(IncomingFileGroup.builder() - .name(ATTACHMENT_GROUP_NAME) - .files( - getFilesByName( - attachmentFileNames, - fileNameToFileMap - ) - ) - .build()) - // Do not include empty attachment group - .filter(group -> !group.getFiles().isEmpty()) - .toList(); - } - - private Stream<String> movePrimaryRepresentationFileNameToFirstPosition(List<String> representationFileNames) { - var primaryRepresentationFileName = findPrimaryRepresentationName(representationFileNames); - return Stream.concat( - Stream.of(primaryRepresentationFileName), - dropNames(representationFileNames.stream(), Set.of(primaryRepresentationFileName)) - ); - } - - private List<IncomingFile> getFilesByName(Stream<String> names, Map<String, IncomingFile> fileNameToFileMap) { - return names.map(fileNameToFileMap::get).toList(); - } - - private Stream<String> dropNames(Stream<String> names, Set<String> namesToDrop) { - return names.filter(name -> !namesToDrop.contains(name)); - } - - String findPrimaryRepresentationName(List<String> representationFileNames) { - var xmlFileNames = representationFileNames.stream() - .filter(name -> name.endsWith(".xml")) - .toList(); - if (xmlFileNames.isEmpty()) { - throw new TechnicalException("No xml representation file name found!"); - } else if (xmlFileNames.size() > 1) { - LOG.warn("There is more than one xml representations. Choosing the first of {}.", xmlFileNames.size()); - } - return xmlFileNames.getFirst(); - } - - IncomingFile findXdomeaXMLFile(List<IncomingFile> incomingFileList) { - return incomingFileList.stream() - .filter(file -> file.getName().endsWith(XDOMEA_0201_XML_FILE_NAME_SUFFIX)) - .findFirst() - .orElseThrow(() -> new TechnicalException("Primary xdomea xml representation not found!")); - } - -} diff --git a/xta-adapter/src/main/java/de/ozgcloud/eingang/xdomea/XdomeaXMLValueReader.java b/xta-adapter/src/main/java/de/ozgcloud/eingang/xdomea/XdomeaXMLValueReader.java deleted file mode 100644 index a94e189b394b396001768386244c08a4cd750250..0000000000000000000000000000000000000000 --- a/xta-adapter/src/main/java/de/ozgcloud/eingang/xdomea/XdomeaXMLValueReader.java +++ /dev/null @@ -1,64 +0,0 @@ -package de.ozgcloud.eingang.xdomea; - -import static de.ozgcloud.eingang.xdomea.XMLHelper.*; - -import java.util.List; -import java.util.stream.IntStream; -import java.util.stream.Stream; - -import javax.xml.xpath.XPathConstants; -import javax.xml.xpath.XPathExpression; -import javax.xml.xpath.XPathExpressionException; - -import org.springframework.stereotype.Component; -import org.w3c.dom.Element; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; - -import de.ozgcloud.eingang.common.errorhandling.TechnicalException; -import de.ozgcloud.eingang.common.formdata.IncomingFile; - -@Component -public class XdomeaXMLValueReader { - - private static final String DATEINAME_NODE_QUERY_STRING = "//Hauptobjekt//Dateiname"; - // Interpret XML-Attachments as representations - // XML filetype code: 030 (see https://www.xrepository.de/details/urn:xoev-de:xdomea:codeliste:dateiformat) - private static final String DATEINAME_NODE_FOR_XML_ANHANG_QUERY_STRING = "//Anlage//Format/Name[contains(., '030')]/..//Dateiname"; - private static final XPathExpression DATEINAME_NODE_QUERY = compileXPathExpression( - DATEINAME_NODE_QUERY_STRING + "|" + DATEINAME_NODE_FOR_XML_ANHANG_QUERY_STRING); - - public List<String> readRepresentationFileNames(IncomingFile xdomeaXMLFile) { - return getTextsFromNodes( - queryDateinameNodeList( - XMLHelper.parseDocument(xdomeaXMLFile) - .getDocumentElement() - ) - ); - } - - private NodeList queryDateinameNodeList(Element contextElement) { - try { - return (NodeList) DATEINAME_NODE_QUERY - .evaluate( - contextElement, - XPathConstants.NODESET - ); - } catch (XPathExpressionException e) { - throw new TechnicalException("Failed to execute xpath search!", e); - } - } - - private List<String> getTextsFromNodes(NodeList nodeList) { - return streamNodeList(nodeList) - .map(Node::getTextContent) - .map(String::trim) - .toList(); - } - - private Stream<Node> streamNodeList(NodeList nodeList) { - return IntStream.range(0, nodeList.getLength()) - .mapToObj(nodeList::item); - } - -} diff --git a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/MsgStatusListTypeAndHeaderResponse.java b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/MsgStatusListTypeAndHeaderResponse.java deleted file mode 100644 index aead2074638fccd8336b8c52c9e98fda734fc5f3..0000000000000000000000000000000000000000 --- a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/MsgStatusListTypeAndHeaderResponse.java +++ /dev/null @@ -1,19 +0,0 @@ -package de.ozgcloud.eingang.xta; - -import java.math.BigInteger; -import java.util.stream.Stream; - -import eu.osci.ws._2014._10.transport.MessageMetaData; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; - -@AllArgsConstructor -@Getter -@Builder -class MsgStatusListTypeAndHeaderResponse { - private String msgBoxRequestID; - private boolean noMessageAvailable; - private BigInteger messageItemsPending; - private Stream<MessageMetaData> messages; -} \ No newline at end of file diff --git a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/RepresentationsAttachmentsPair.java b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/RepresentationsAttachmentsPair.java deleted file mode 100644 index 0639e78e5439c4811ba1cd3c57d6f780fb7b7cbe..0000000000000000000000000000000000000000 --- a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/RepresentationsAttachmentsPair.java +++ /dev/null @@ -1,14 +0,0 @@ -package de.ozgcloud.eingang.xta; - -import java.util.List; - -import de.ozgcloud.eingang.common.formdata.IncomingFile; -import de.ozgcloud.eingang.common.formdata.IncomingFileGroup; -import lombok.Builder; - -@Builder -public record RepresentationsAttachmentsPair( - List<IncomingFile> representations, - List<IncomingFileGroup> attachments -) { -} diff --git a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/WsHeaderAddingInterceptor.java b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/WsHeaderAddingInterceptor.java deleted file mode 100644 index f0ae4deba9f754a290717d608921cc3acf353301..0000000000000000000000000000000000000000 --- a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/WsHeaderAddingInterceptor.java +++ /dev/null @@ -1,75 +0,0 @@ -package de.ozgcloud.eingang.xta; - -import java.util.Objects; - -import jakarta.xml.bind.JAXBContext; -import jakarta.xml.bind.JAXBElement; -import jakarta.xml.bind.JAXBException; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.ws.client.WebServiceClientException; -import org.springframework.ws.client.support.interceptor.ClientInterceptor; -import org.springframework.ws.context.MessageContext; -import org.springframework.ws.soap.SoapMessage; - -import de.ozgcloud.eingang.common.errorhandling.TechnicalException; -import eu.osci.ws._2014._10.transport.OriginatorsType; -import eu.osci.ws._2014._10.transport.PartyIdentifierType; -import eu.osci.ws._2014._10.transport.PartyType; - -@Component -class WsHeaderAddingInterceptor implements ClientInterceptor { - - @Autowired - private XtaCurrentIdentifierService xtaCurrentIdentifierService; - - @Override - public boolean handleRequest(MessageContext messageContext) throws WebServiceClientException { - var soapMessage = (SoapMessage) messageContext.getRequest(); - var header = soapMessage.getSoapHeader(); - - try { - JAXBContext context = JAXBContext.newInstance(PartyType.class); - var marshaller = context.createMarshaller(); - marshaller.marshal(createAuthor(), header.getResult()); - } catch (JAXBException e) { - throw new TechnicalException("Error on handling Request for adding Header.", e); - } - - return true; - } - - JAXBElement<PartyType> createAuthor() { - eu.osci.ws._2014._10.transport.ObjectFactory objectFactory = new eu.osci.ws._2014._10.transport.ObjectFactory(); - - PartyType partyType = new PartyType(); - PartyIdentifierType identifier = new PartyIdentifierType(); - identifier.setValue(Objects.requireNonNull( - xtaCurrentIdentifierService.getCurrentIdentifier(), - "Expect current identifier to be set!") - ); - partyType.setIdentifier(identifier); - - var origin = new OriginatorsType(); - origin.setAuthor(partyType); - - return objectFactory.createAuthor(partyType); - } - - @Override - public boolean handleResponse(MessageContext messageContext) throws WebServiceClientException { - return true; - } - - @Override - public boolean handleFault(MessageContext messageContext) throws WebServiceClientException { - return true; - } - - @Override - public void afterCompletion(MessageContext messageContext, Exception ex) throws WebServiceClientException { - // nothing to do here - } - -} diff --git a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaCurrentIdentifierService.java b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaCurrentIdentifierService.java deleted file mode 100644 index f5f6b25a9b49c40f8a088305b237570a11761b14..0000000000000000000000000000000000000000 --- a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaCurrentIdentifierService.java +++ /dev/null @@ -1,28 +0,0 @@ -package de.ozgcloud.eingang.xta; - -import java.util.List; - -import jakarta.validation.Valid; - -import org.springframework.stereotype.Service; - -import lombok.Getter; -import lombok.RequiredArgsConstructor; -import lombok.Setter; - -@Service -@RequiredArgsConstructor -public class XtaCurrentIdentifierService { - - @Setter - @Getter - private String currentIdentifier; - - @Valid - private final XtaProperties properties; - - public List<String> getIdentifiers() { - return properties.getIdentifiers(); - } - -} diff --git a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaFile.java b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaFile.java deleted file mode 100644 index 560042079ed47862e1d394651ff8e12da77ddf76..0000000000000000000000000000000000000000 --- a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaFile.java +++ /dev/null @@ -1,14 +0,0 @@ -package de.ozgcloud.eingang.xta; - -import java.io.File; -import java.math.BigInteger; - -import lombok.Builder; - -@Builder -public record XtaFile(File file, - String contentType, - String name, - BigInteger size) { - -} diff --git a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaIncomingFilesMapper.java b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaIncomingFilesMapper.java deleted file mode 100644 index 891512d2f4b878594ee813dbe3cdf5d9c4bfdb4c..0000000000000000000000000000000000000000 --- a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaIncomingFilesMapper.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch das - * Ministerium für Energiewende, Klimaschutz, Umwelt und Natur - * Zentrales IT-Management - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ - -package de.ozgcloud.eingang.xta; - -import java.util.Collection; -import java.util.List; -import java.util.Objects; -import java.util.stream.Stream; - -import org.springframework.stereotype.Component; - -import de.ozgcloud.eingang.common.formdata.IncomingFile; -import de.ozgcloud.eingang.xta.zip.ZipFileExtractor; -import lombok.RequiredArgsConstructor; -import lombok.extern.log4j.Log4j2; - -@Log4j2 -@Component -@RequiredArgsConstructor -class XtaIncomingFilesMapper { - - private final ZipFileExtractor zipFileExtractor; - - public List<IncomingFile> toIncomingFiles(Collection<XtaFile> messageFiles) { - if (Objects.nonNull(messageFiles)) { - return messageFiles.stream() - .map(this::toIncomingFile) - .flatMap(this::tryToExtractZip) - .toList(); - } - return List.of(); - } - - IncomingFile toIncomingFile(XtaFile messageFile) { - return IncomingFile.builder() - .name(messageFile.name()) - .contentType(messageFile.contentType()) - .file(messageFile.file()) - .size(messageFile.file().length()) - .build(); - } - - Stream<IncomingFile> tryToExtractZip(IncomingFile incomingFile) { - try { - List<IncomingFile> extractedZips = zipFileExtractor.extractIncomingFilesSafely(incomingFile); - return extractedZips.stream(); - } catch (RuntimeException e) { - return Stream.of(incomingFile); - } - } -} diff --git a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaMapperHelper.java b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaMapperHelper.java deleted file mode 100644 index 5711cb57e1644e1c4325421671f7cb480eda8408..0000000000000000000000000000000000000000 --- a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaMapperHelper.java +++ /dev/null @@ -1,31 +0,0 @@ -package de.ozgcloud.eingang.xta; - -import lombok.AccessLevel; -import lombok.NoArgsConstructor; -import org.apache.commons.lang3.StringUtils; - -import java.time.ZonedDateTime; - -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class XtaMapperHelper { - - public static String getFormEngineName(XtaMessageMetaData metaData) { - if (StringUtils.equals(metaData.getMessageType(), XtaService.XDOMEA_0201_MESSAGE_TYPE)) { - // TODO OZG-5778 verify the correct engine name - return "XDOMEA"; - } - - if (StringUtils.startsWith(metaData.getMessageType(), XtaService.FIM_MESSAGE_TYPE_PREFIX)) { - return "FIM"; - } - return null; - } - - // TODO OZG-6176 Check if the problem can be fixed elsewhere - public static ZonedDateTime getCreatedAt(XtaMessageMetaData metaData) { - if (metaData.getOrigin() != null) { - return metaData.getOrigin(); - } - return ZonedDateTime.now(); - } -} diff --git a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaMessage.java b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaMessage.java deleted file mode 100644 index 2f51bd853ba2b95d58481319c083bc20f089c94f..0000000000000000000000000000000000000000 --- a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaMessage.java +++ /dev/null @@ -1,19 +0,0 @@ -package de.ozgcloud.eingang.xta; - -import java.util.Collection; - -import lombok.Builder; -import lombok.Getter; -import lombok.Singular; - -@Builder(toBuilder = true) -@Getter -public class XtaMessage { - private String primaryFormDataMessage; - - private XtaMessageMetaData metaData; - @Singular - private Collection<XtaFile> messageFiles; - @Singular - private Collection<XtaFile> attachments; -} diff --git a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaMessageId.java b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaMessageId.java deleted file mode 100644 index e247f5f4f60123063810d7b6417671496adcb1e4..0000000000000000000000000000000000000000 --- a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaMessageId.java +++ /dev/null @@ -1,14 +0,0 @@ -package de.ozgcloud.eingang.xta; - -import de.ozgcloud.common.datatype.StringBasedValue; - -public class XtaMessageId extends StringBasedValue { - - public XtaMessageId(String messageId) { - super(messageId); - } - - public static XtaMessageId from(String messageId) { - return new XtaMessageId(messageId); - } -} diff --git a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaMessageMapper.java b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaMessageMapper.java deleted file mode 100644 index 7fb082ce762666db56da08c5734d9517738ef1a0..0000000000000000000000000000000000000000 --- a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaMessageMapper.java +++ /dev/null @@ -1,50 +0,0 @@ -package de.ozgcloud.eingang.xta; - -import java.util.Optional; - -import org.mapstruct.Context; -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; - -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.common.formdata.FormHeader; -import de.ozgcloud.eingang.common.formdata.FormMetaData; -import de.ozgcloud.eingang.common.vorgang.VorgangNummerSupplier; -import de.ozgcloud.eingang.semantik.enginebased.FilesMapperHelper; - -@Mapper(imports = { FilesMapperHelper.class, XtaMapperHelper.class }) -interface XtaMessageMapper { - int VORGANG_NUMMER_SUFFIX_LENGTH = 4; - - @Mapping(target = "antragsteller", ignore = true) - @Mapping(target = "formData", ignore = true) - @Mapping(target = "id", ignore = true) - @Mapping(target = "zustaendigeStelle", ignore = true) - @Mapping(target = "header", source = "metaData") - @Mapping(target = "numberOfAttachments", expression = "java(FilesMapperHelper.countAttachedFiles(representationsAttachmentsPair.attachments()))") - @Mapping(target = "numberOfRepresentations", dependsOn = "representations", expression = "java(representationsAttachmentsPair.representations().size())") - @Mapping(target = "representation", ignore = true) - @Mapping(target = "attachment", ignore = true) - @Mapping(target = "control.metaData", source = "metaData") - FormData toFormData(RepresentationsAttachmentsPair representationsAttachmentsPair, XtaMessageMetaData metaData, - @Context VorgangNummerSupplier vorgangNummerSupplier); - - @Mapping(target = "formId", source = "messageType") - @Mapping(target = "requestId", source = "messageId") - @Mapping(target = "vorgangNummer", expression = "java(vorgangNummerSupplier.get(VORGANG_NUMMER_SUFFIX_LENGTH))") - @Mapping(target = "serviceKonto", ignore = true) - @Mapping(target = "createdAt", expression = "java(XtaMapperHelper.getCreatedAt(metaData))") - @Mapping(target = "sender", constant = "XTA") - @Mapping(target = "channel", constant = "XTA") - @Mapping(target = "formName", ignore = true) - @Mapping(target = "formEngineName", expression = "java(XtaMapperHelper.getFormEngineName(metaData))") - FormHeader formHeaderFromMetaData(XtaMessageMetaData metaData, @Context VorgangNummerSupplier vorgangNummerSupplier); - - default String fromId(XtaMessageId id) { - return id.toString(); - } - - default Optional<FormMetaData> mapMetaData(XtaMessageMetaData value) { - return Optional.ofNullable(value); - } -} diff --git a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaMessageMetaData.java b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaMessageMetaData.java deleted file mode 100644 index 84fc3290bd1420e24750706a3a073cca4801ea2a..0000000000000000000000000000000000000000 --- a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaMessageMetaData.java +++ /dev/null @@ -1,59 +0,0 @@ -package de.ozgcloud.eingang.xta; - -import java.time.ZonedDateTime; - -import de.ozgcloud.eingang.common.formdata.FormMetaData; -import de.ozgcloud.eingang.common.formdata.IncomingFile; -import lombok.Builder; -import lombok.Getter; -import lombok.ToString; - -@Builder -@Getter -@ToString -class XtaMessageMetaData implements FormMetaData { - static final String SERVICE = "service"; - static final String MESSAGE_TYPE_ENTRY_NAME = "messageType"; - static final String MESSAGE_TYPE_LIST_VERSION = "messageTypeListVersion"; - static final String MESSAGE_ID_ENTRY_NAME = "messageId"; - static final String XTA_IDENTIFIER_ENTRY_NAME = "xtaIdentifier"; - - // MsgIdentification.MessageId - private XtaMessageId messageId; - - // DeliveryAttributes.origin - private ZonedDateTime origin; - // DeliveryAttributes.delivery - private ZonedDateTime delivery; - - // Qualifier.MessageType.code - private String messageType; - // Qualifier.MessageType.listVersion - private String messageTypeListVersion; - // Qualifier.Service - private String service; - - private String xtaIdentifier; - - private IncomingFile metaDataFile; - - @Override - public String getEntry(String name) { - switch (name) { - case MESSAGE_TYPE_ENTRY_NAME: - return getMessageType(); - case MESSAGE_TYPE_LIST_VERSION: - return getMessageTypeListVersion(); - case MESSAGE_ID_ENTRY_NAME: - return getMessageId().toString(); - case XTA_IDENTIFIER_ENTRY_NAME: - return getXtaIdentifier(); - case SERVICE: - return getService(); - - default: - return null; - } - } - -} diff --git a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaMessageMetaDataMapper.java b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaMessageMetaDataMapper.java deleted file mode 100644 index f5566e157a78701db29b3ca828e1e9e8fdcb5cef..0000000000000000000000000000000000000000 --- a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaMessageMetaDataMapper.java +++ /dev/null @@ -1,36 +0,0 @@ -package de.ozgcloud.eingang.xta; - -import java.util.stream.Stream; - -import jakarta.xml.bind.JAXBElement; - -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; - -import eu.osci.ws._2008._05.transport.MsgStatusListType; -import eu.osci.ws._2014._10.transport.MessageMetaData; - -@Mapper -interface XtaMessageMetaDataMapper { - - @Mapping(target = "messageTypeListVersion", ignore = true) - @Mapping(target = "metaDataFile", ignore = true) - @Mapping(target = "service", ignore = true) - @Mapping(target = "origin", source = "deliveryAttributes.origin") - @Mapping(target = "delivery", source = "deliveryAttributes.delivery") - @Mapping(target = "messageId", source = "msgIdentification.messageID.value") - @Mapping(target = "messageType", source = "qualifier.messageType.code") - @Mapping(target = "xtaIdentifier", source = "destinations.reader.identifier.value") - XtaMessageMetaData fromSoap(MessageMetaData metaData); - - default XtaMessageId fromString(String id) { - return XtaMessageId.from(id); - } - - @Mapping(target = "moreMessagesAvailable", constant = "false") - XtaMessageMetaDatasAndHeader msgStatusListFromSoap(MsgStatusListTypeAndHeaderResponse statusList); - - default Stream<XtaMessageMetaData> map(JAXBElement<MsgStatusListType> msgStatusListResponse) { - return msgStatusListResponse.getValue().getMessageMetaData().stream().map(this::fromSoap); - } -} diff --git a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaMessageMetaDatasAndHeader.java b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaMessageMetaDatasAndHeader.java deleted file mode 100644 index ff04d5df1c24571a7e8e5d4c0f704089536dbe98..0000000000000000000000000000000000000000 --- a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaMessageMetaDatasAndHeader.java +++ /dev/null @@ -1,15 +0,0 @@ -package de.ozgcloud.eingang.xta; - -import java.util.stream.Stream; - -import lombok.Builder; -import lombok.Getter; - -@Builder -@Getter -class XtaMessageMetaDatasAndHeader { - - private String msgBoxRequestID; - private boolean moreMessagesAvailable; - private Stream<XtaMessageMetaData> messages; -} diff --git a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaMessageMetadataRemoteIterator.java b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaMessageMetadataRemoteIterator.java deleted file mode 100644 index b12ce91b9ca05f1db26f5ab8b3f8f85fd982ab28..0000000000000000000000000000000000000000 --- a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaMessageMetadataRemoteIterator.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (C) 2023 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ -package de.ozgcloud.eingang.xta; - -import java.util.Iterator; - -public class XtaMessageMetadataRemoteIterator implements Iterator<XtaMessageMetaData> { - - private final XtaRemoteService xtaRemoteService; - private XtaMessageMetaDatasAndHeader messagesMetadata; - private Iterator<XtaMessageMetaData> remoteMessageIterator; - - public XtaMessageMetadataRemoteIterator(XtaRemoteService xtaRemoteService) { - this.xtaRemoteService = xtaRemoteService; - messagesMetadata = this.xtaRemoteService.getMessagesMetadata(); - remoteMessageIterator = getRemoteMessageIterator(messagesMetadata); - } - - @Override - public boolean hasNext() { - if (remoteMessageIterator.hasNext()) { - return true; - } - if (messagesMetadata.isMoreMessagesAvailable()) { - loadNextMessages(); - return remoteMessageIterator.hasNext(); - } - return false; - } - - void loadNextMessages() { - messagesMetadata = xtaRemoteService.getNextMessagesMetadata(messagesMetadata.getMsgBoxRequestID()); - remoteMessageIterator = getRemoteMessageIterator(messagesMetadata); - } - - Iterator<XtaMessageMetaData> getRemoteMessageIterator(XtaMessageMetaDatasAndHeader messagesMetadata) { - return messagesMetadata.getMessages().iterator(); - } - - @Override - public XtaMessageMetaData next() { - return remoteMessageIterator.next(); - } -} diff --git a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaProperties.java b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaProperties.java deleted file mode 100644 index 23a4e4bcc030f56f017200536653a3fca84c44d4..0000000000000000000000000000000000000000 --- a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaProperties.java +++ /dev/null @@ -1,85 +0,0 @@ -package de.ozgcloud.eingang.xta; - -import java.math.BigInteger; -import java.net.URI; -import java.util.List; - -import jakarta.validation.constraints.NotEmpty; -import jakarta.validation.constraints.NotNull; - -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.context.annotation.Configuration; -import org.springframework.core.io.Resource; -import org.springframework.stereotype.Component; -import org.springframework.validation.annotation.Validated; - -import lombok.Getter; -import lombok.Setter; -import lombok.ToString; - -@Validated -@ToString -@Setter -@Getter -@Configuration -@ConfigurationProperties(prefix = XtaProperties.PROPERTIES_PREFIX) -class XtaProperties { - static final String PROPERTIES_PREFIX = "ozgcloud.xta"; - - private Server server; - private BigInteger maxListElements; - - private KeyStore keyStore; - private Actions actions; - @NotEmpty - private List<String> identifiers; -} - -@Validated -@ToString -@Getter -@Setter -@Component -@ConfigurationProperties(prefix = Server.PROPERTIES_PREFIX) -class Server { - static final String PROPERTIES_PREFIX = XtaProperties.PROPERTIES_PREFIX + ".server"; - - @NotEmpty - private String name; - private String address; - @NotEmpty - private String protocol; -} - -@Validated -@ToString -@Getter -@Setter -@Component -@ConfigurationProperties(prefix = KeyStore.PROPERTIES_PREFIX) -class KeyStore { - static final String PROPERTIES_PREFIX = XtaProperties.PROPERTIES_PREFIX + ".keystore"; - - @NotNull - private Resource file; - private String type = "PKCS12"; - @NotEmpty - private char[] password; -} - -@Validated -@ToString -@Setter -@Getter -@Configuration -@ConfigurationProperties(prefix = Actions.PROPERTIES_PREFIX) -class Actions { - static final String PROPERTIES_PREFIX = XtaProperties.PROPERTIES_PREFIX + ".actions"; - - @NotNull - private URI statusList; - @NotNull - private URI fetchRequest; - @NotNull - private URI closeRequest; -} diff --git a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaRemoteService.java b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaRemoteService.java deleted file mode 100644 index a837c55d3c1670242f12ea891542be116052e09f..0000000000000000000000000000000000000000 --- a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaRemoteService.java +++ /dev/null @@ -1,296 +0,0 @@ -package de.ozgcloud.eingang.xta; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.net.URI; -import java.net.URISyntaxException; -import java.util.Collections; -import java.util.Iterator; -import java.util.stream.Stream; - -import javax.xml.namespace.QName; -import javax.xml.transform.TransformerException; - -import jakarta.validation.Valid; -import jakarta.xml.bind.JAXBElement; - -import org.apache.commons.io.IOUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.boot.webservices.client.WebServiceTemplateBuilder; -import org.springframework.oxm.jaxb.Jaxb2Marshaller; -import org.springframework.stereotype.Service; -import org.springframework.ws.WebServiceMessage; -import org.springframework.ws.client.core.WebServiceMessageCallback; -import org.springframework.ws.client.core.WebServiceMessageExtractor; -import org.springframework.ws.soap.SoapFaultDetailElement; -import org.springframework.ws.soap.SoapHeader; -import org.springframework.ws.soap.SoapHeaderElement; -import org.springframework.ws.soap.SoapMessage; -import org.springframework.ws.soap.addressing.client.ActionCallback; -import org.springframework.ws.soap.addressing.version.Addressing10; -import org.springframework.ws.soap.client.SoapFaultClientException; -import org.springframework.ws.support.MarshallingUtils; -import org.w3._2005._08.addressing.AttributedURIType; - -import de.ozgcloud.eingang.common.errorhandling.TechnicalException; -import de.xoev.transport.xta._211.ContentType; -import de.xoev.transport.xta._211.ExceptionType; -import de.xoev.transport.xta._211.GenericContentContainer; -import eu.osci.ws._2008._05.transport.MsgBoxCloseRequestType; -import eu.osci.ws._2008._05.transport.MsgBoxFetchRequest; -import eu.osci.ws._2008._05.transport.MsgBoxGetNextRequestType; -import eu.osci.ws._2008._05.transport.MsgBoxResponseType; -import eu.osci.ws._2008._05.transport.MsgBoxStatusListRequestType; -import eu.osci.ws._2008._05.transport.MsgSelector; -import eu.osci.ws._2008._05.transport.MsgStatusListType; -import eu.osci.ws._2008._05.transport.ObjectFactory; -import eu.osci.ws._2014._10.transport.MessageMetaData; -import lombok.NonNull; -import lombok.extern.log4j.Log4j2; - -@Log4j2 -@Service -class XtaRemoteService { - - private static final String ERROR_ON_CLOSE_LOG_TEMPLATE = "Error result on close request.\nReason: %s"; - private static final String DETAIL_LOG_TEMPLATE = "Code: %s, Message: %s"; - - @Autowired - @Valid - private XtaProperties properties; - - @Autowired - private XtaMessageMetaDataMapper mapper; - - @Autowired - private WebServiceTemplateBuilder webServiceTemplateBuilder; - - @Autowired - @Qualifier("osciTransportMarshaller") - private Jaxb2Marshaller osciMarshaller; - - @Autowired - @Qualifier("xoevTransportMarshaller") - private Jaxb2Marshaller xoevMarshaller; - - public XtaMessageMetaDatasAndHeader getMessagesMetadata() { - return mapper.msgStatusListFromSoap(getStatusList()); - } - - public XtaMessageMetaDatasAndHeader getNextMessagesMetadata(String msgBoxRequestId) { - return mapper.msgStatusListFromSoap(getNextStatusList(msgBoxRequestId)); - } - - MsgStatusListTypeAndHeaderResponse getStatusList() { - var request = buildListRequest(); - return getGenericStatusList(request); - } - - MsgStatusListTypeAndHeaderResponse getNextStatusList(String msgBoxRequestId) { - var request = buildNextListRequest(msgBoxRequestId); - return getGenericStatusList(request); - } - - MsgStatusListTypeAndHeaderResponse getGenericStatusList(Object request) { - var template = webServiceTemplateBuilder.setMarshaller(osciMarshaller).setUnmarshaller(osciMarshaller).build(); - - return template.sendAndReceive(buildMarshalCallBack(request, buildActionCallback()), buildHeaderExtractor()); - } - - private ActionCallback buildActionCallback() { - return new ActionCallback(properties.getActions().getStatusList(), new Addressing10(), getTargetUri()); - } - - WebServiceMessageCallback buildMarshalCallBack(Object jaxbElement, ActionCallback callback) { - return new WebServiceMessageCallback() { - @Override - public void doWithMessage(WebServiceMessage message) throws IOException, TransformerException { - MarshallingUtils.marshal(osciMarshaller, jaxbElement, message); - callback.doWithMessage(message); - } - }; - } - - WebServiceMessageExtractor<MsgStatusListTypeAndHeaderResponse> buildHeaderExtractor() { - return new WebServiceMessageExtractor<MsgStatusListTypeAndHeaderResponse>() { - @Override - public MsgStatusListTypeAndHeaderResponse extractData(WebServiceMessage message) throws IOException, TransformerException { - - MsgBoxResponseType header = extractHeader(message); - - return MsgStatusListTypeAndHeaderResponse.builder() - .msgBoxRequestID(header.getMsgBoxRequestID()) - .noMessageAvailable(header.getNoMessageAvailable() != null) - .messageItemsPending(header.getItemsPending()) - .messages(extractMessages(message)) - .build(); - } - - @SuppressWarnings("unchecked") - private MsgBoxResponseType extractHeader(WebServiceMessage message) { - SoapHeader soapHeader = ((SoapMessage) message).getSoapHeader(); - Iterator<SoapHeaderElement> it = soapHeader - .examineHeaderElements(new QName("http://www.osci.eu/ws/2008/05/transport", "MsgBoxResponse")); - validateHasHeader(it); - return ((JAXBElement<MsgBoxResponseType>) osciMarshaller.unmarshal(it.next().getSource())).getValue(); - } - - private void validateHasHeader(Iterator<SoapHeaderElement> it) { - if (!it.hasNext()) { - throw new TechnicalException("Response from XTA GetStatusList has no header"); - } - } - - @SuppressWarnings("unchecked") - private Stream<MessageMetaData> extractMessages(WebServiceMessage message) throws IOException { - return ((JAXBElement<MsgStatusListType>) MarshallingUtils.unmarshal(osciMarshaller, message)).getValue().getMessageMetaData() - .stream(); - } - }; - } - - private JAXBElement<MsgBoxStatusListRequestType> buildListRequest() { - ObjectFactory objectFactory = new ObjectFactory(); - - MsgBoxStatusListRequestType msg = new MsgBoxStatusListRequestType(); - msg.setMaxListItems(properties.getMaxListElements()); - return objectFactory.createMsgBoxStatusListRequest(msg); - } - - private JAXBElement<MsgBoxGetNextRequestType> buildNextListRequest(String msgBoxRequestId) { - ObjectFactory objectFactory = new ObjectFactory(); - - MsgBoxGetNextRequestType msg = new MsgBoxGetNextRequestType(); - msg.setMsgBoxRequestID(msgBoxRequestId); - return objectFactory.createMsgBoxGetNextRequest(msg); - } - - private URI getTargetUri() { - try { - return new URI(buildServerAddressUri()); - } catch (URISyntaxException e) { - throw new TechnicalException("Error building target url: " + e); - } - } - - String buildServerAddressUri() { - return XtaRemoteServiceConfiguration.URI_TEMPLATE.formatted(properties.getServer().getProtocol(), - properties.getServer().getName()); - } - - public XtaMessage getMessage(XtaMessageId messageId) { - var contentContainer = loadContentContainer(messageId.toString()); - XtaFile formDataFile = getMessage(contentContainer); - - return XtaMessage.builder() - .metaData(null) - .primaryFormDataMessage(formDataFile.name()) - .messageFiles(Collections.singleton(formDataFile)) - .attachments(getAttachments(contentContainer).toList()) - .build(); - } - - GenericContentContainer loadContentContainer(String messageId) { - var callback = new ActionCallback(properties.getActions().getFetchRequest(), new Addressing10(), getTargetUri()); - var template = webServiceTemplateBuilder.setMarshaller(osciMarshaller).setUnmarshaller(xoevMarshaller).build(); - - return (GenericContentContainer) template.marshalSendAndReceive(buildFetchRequest(messageId), callback); - } - - XtaFile getMessage(GenericContentContainer container) { - return toXtaFile(container.getContentContainer().getMessage()); - } - - Stream<XtaFile> getAttachments(GenericContentContainer container) { - return container.getContentContainer().getAttachment().stream().map(this::toXtaFile); - } - - private XtaFile toXtaFile(ContentType type) { - return XtaFile.builder() - .file(persistToFile(type.getValue())) - .name(type.getFilename()) - .contentType(type.getContentType()) - .size(type.getSize()) - .build(); - } - - private File persistToFile(byte[] data) { - try { - var file = File.createTempFile("xta", ".data"); - file.deleteOnExit(); - var out = new FileOutputStream(file); - IOUtils.write(data, out); - out.flush(); - out.close(); - return file; - } catch (IOException e) { - throw new TechnicalException("Error writing Attachment to temp file", e); - } - } - - private JAXBElement<MsgBoxFetchRequest> buildFetchRequest(String msgId) { - MsgSelector msgSelector = new MsgSelector(); - AttributedURIType attribute = new AttributedURIType(); - attribute.setValue(msgId); - msgSelector.getMessageID().add(attribute); - - var request = new MsgBoxFetchRequest(); - request.setMsgSelector(msgSelector); - - return wrapAsJaxBElemement(request); - } - - private JAXBElement<MsgBoxFetchRequest> wrapAsJaxBElemement(MsgBoxFetchRequest request) { - QName qname = new QName("http://www.osci.eu/ws/2008/05/transport", "MsgBoxFetchRequest"); - - return new JAXBElement<>(qname, MsgBoxFetchRequest.class, request); - } - - public void close(@NonNull XtaMessageId messageId) { - var callback = new ActionCallback(properties.getActions().getCloseRequest(), new Addressing10(), getTargetUri()); - var template = webServiceTemplateBuilder.setMarshaller(osciMarshaller).setUnmarshaller(xoevMarshaller).build(); - - try { - template.marshalSendAndReceive(buildCloseRequest(messageId.toString()), callback); - } catch (SoapFaultClientException e) { - logErrorOnClose(e); - } - } - - private JAXBElement<MsgBoxCloseRequestType> buildCloseRequest(String msgId) { - MsgBoxCloseRequestType request = new MsgBoxCloseRequestType(); - var lastMsgReceived = request.getLastMsgReceived(); - - AttributedURIType attribute = new AttributedURIType(); - attribute.setValue(msgId); - lastMsgReceived.add(attribute); - - return new ObjectFactory().createMsgBoxCloseRequest(request); - } - - private void logErrorOnClose(SoapFaultClientException e) { - try { - var fault = e.getSoapFault(); - StringBuilder logBuilder = new StringBuilder(ERROR_ON_CLOSE_LOG_TEMPLATE.formatted(e.getSoapFault().getFaultStringOrReason())); - - var entries = fault.getFaultDetail().getDetailEntries(); - entries.forEachRemaining(entry -> logBuilder.append("\n").append(formatFaultEntry(entry))); - - LOG.error(logBuilder.toString(), e); - } catch (Exception e1) { - LOG.error("Error on loggging close error", e1); - LOG.error("origin error was", e); - } - } - - private String formatFaultEntry(SoapFaultDetailElement soapfaultdetailelement1) { - @SuppressWarnings("unchecked") - ExceptionType exceptionType = ((JAXBElement<ExceptionType>) xoevMarshaller.unmarshal(soapfaultdetailelement1.getSource())).getValue(); - - return DETAIL_LOG_TEMPLATE.formatted(exceptionType.getErrorCode().getCode(), exceptionType.getErrorCode().getName().toString()); - - } - -} diff --git a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaRemoteServiceConfiguration.java b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaRemoteServiceConfiguration.java deleted file mode 100644 index 8668263d9b0914c6458296220db651e6b26552c7..0000000000000000000000000000000000000000 --- a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaRemoteServiceConfiguration.java +++ /dev/null @@ -1,126 +0,0 @@ -package de.ozgcloud.eingang.xta; - -import java.io.IOException; -import java.io.InputStream; -import java.net.URI; -import java.net.URISyntaxException; -import java.security.KeyStore; -import java.security.KeyStoreException; -import java.security.NoSuchAlgorithmException; -import java.security.cert.CertificateException; - -import javax.net.ssl.KeyManagerFactory; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.webservices.client.WebServiceTemplateCustomizer; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.oxm.jaxb.Jaxb2Marshaller; -import org.springframework.ws.client.support.destination.DestinationProvider; -import org.springframework.ws.client.support.interceptor.ClientInterceptor; -import org.springframework.ws.soap.SoapVersion; -import org.springframework.ws.soap.saaj.SaajSoapMessageFactory; -import org.springframework.ws.transport.WebServiceMessageSender; -import org.springframework.ws.transport.http.HttpsUrlConnectionMessageSender; - -import de.ozgcloud.eingang.common.errorhandling.TechnicalException; -import lombok.extern.log4j.Log4j2; - -@Log4j2 -@Configuration -public class XtaRemoteServiceConfiguration { - - static final String URI_TEMPLATE = "%s://%s/MB_XTA-WS/XTA210msgBoxPort.svc"; - - @Autowired - private XtaProperties properties; - - @Bean - Jaxb2Marshaller osciTransportMarshaller() { - Jaxb2Marshaller marshaller = new Jaxb2Marshaller(); - marshaller.setContextPath("eu.osci.ws._2008._05.transport"); - marshaller.setMtomEnabled(true); - return marshaller; - } - - @Bean - Jaxb2Marshaller xoevTransportMarshaller() { - Jaxb2Marshaller unmarshaller = new Jaxb2Marshaller(); - unmarshaller.setContextPath("de.xoev.transport.xta._211"); - unmarshaller.setMtomEnabled(true); - return unmarshaller; - } - - @Bean - WebServiceTemplateCustomizer webServiceTemplateCustomizer() { - return template -> template.setMessageSender(messageSender()); - } - - @Bean - WebServiceTemplateCustomizer setMessageFactoryCustomizer() { - return template -> template.setMessageFactory(messageFactory()); - } - - @Bean - WebServiceTemplateCustomizer addingInterceptorCustomizer(WsHeaderAddingInterceptor interceptor) { - return template -> template.setInterceptors(new ClientInterceptor[] { interceptor }); - } - - @Bean - WebServiceTemplateCustomizer setDestionationProvider() { - return template -> template.setDestinationProvider(destinationProvider()); - } - - @Bean - DestinationProvider destinationProvider() { - return () -> { - try { - String serverUri = buildServerAddressUri(properties.getServer()); - LOG.trace("Xta Service remote URI: {}", serverUri); - return new URI(serverUri); - } catch (URISyntaxException e) { - throw new TechnicalException("Error building URI", e); - } - }; - } - - String buildServerAddressUri(Server server) { - return URI_TEMPLATE.formatted(server.getProtocol(), server.getAddress()); - } - - @Bean - SaajSoapMessageFactory messageFactory() { - SaajSoapMessageFactory messageFactory = new SaajSoapMessageFactory(); - messageFactory.setSoapVersion(SoapVersion.SOAP_12); - return messageFactory; - } - - @Bean - WebServiceMessageSender messageSender() { - try { - var keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); - keyManagerFactory.init(xtaKeyStore(), properties.getKeyStore().getPassword()); - - var messageSender1 = new HttpsUrlConnectionMessageSender(); - messageSender1.setKeyManagers(keyManagerFactory.getKeyManagers()); - messageSender1.setHostnameVerifier((hostname, session) -> true); // NOSONAR hostname verification is senseless due missing DNS for - // Dataport XTA Server - - return messageSender1; - } catch (Exception e) { - throw new TechnicalException("Error initializating message sender.", e); - } - } - - @Bean - KeyStore xtaKeyStore() throws KeyStoreException, CertificateException, NoSuchAlgorithmException, IOException { - var keyStoreResource = properties.getKeyStore().getFile(); - var keyStore = KeyStore.getInstance(properties.getKeyStore().getType()); - try (InputStream keyStoreStream = keyStoreResource.getInputStream()) { - keyStore.load(keyStoreStream, properties.getKeyStore().getPassword()); - } - - return keyStore; - } - -} diff --git a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaRunner.java b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaRunner.java deleted file mode 100644 index cc384b4c48a83c2c3493e06489394ff19f08f1cf..0000000000000000000000000000000000000000 --- a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaRunner.java +++ /dev/null @@ -1,48 +0,0 @@ -package de.ozgcloud.eingang.xta; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.ApplicationListener; -import org.springframework.context.annotation.Profile; -import org.springframework.context.event.ContextRefreshedEvent; -import org.springframework.stereotype.Component; - -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.semantik.SemantikAdapter; -import lombok.NonNull; -import lombok.extern.log4j.Log4j2; - -@Profile({ "!itcase" }) -@Log4j2 -@Component -class XtaRunner implements ApplicationListener<ContextRefreshedEvent> { - - @Autowired - private XtaService service; - @Autowired - private SemantikAdapter semantikAdapter; - - @Override - public void onApplicationEvent(ContextRefreshedEvent event) { - LOG.info("Fetching XTA Messages"); - runGetXtaMessages(); - } - - void runGetXtaMessages() { - try { - service.getMessages().forEach(this::processAndAcknowledge); - } catch (RuntimeException e) { - LOG.error("Error fetch XTA Message List.", e); - } - } - - private void processAndAcknowledge(@NonNull FormData formData) { - try { - LOG.info("Process XTA-Message '{}'.", formData.getHeader().getRequestId()); - semantikAdapter.processFormData(formData); - service.acknowledgeReceive(XtaMessageId.from(formData.getHeader().getRequestId())); - } catch (RuntimeException e) { - LOG.error("Error on processing XTA-Message. Continue with next message.", e); - } - } - -} diff --git a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaService.java b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaService.java deleted file mode 100644 index 500e78da873a6acfc55c01a880f4ec953a875d4a..0000000000000000000000000000000000000000 --- a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaService.java +++ /dev/null @@ -1,152 +0,0 @@ -package de.ozgcloud.eingang.xta; - -import static java.util.Collections.*; - -import java.util.Collection; -import java.util.List; -import java.util.Optional; -import java.util.Spliterators; -import java.util.stream.Stream; -import java.util.stream.StreamSupport; - -import org.apache.commons.collections.CollectionUtils; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import de.ozgcloud.eingang.common.errorhandling.TechnicalException; -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.common.formdata.FormData.Representations; -import de.ozgcloud.eingang.common.formdata.IncomingFile; -import de.ozgcloud.eingang.common.formdata.IncomingFileGroup; -import de.ozgcloud.eingang.common.vorgang.VorgangNummerSupplier; -import de.ozgcloud.eingang.xdomea.XdomeaMessageDataMapper; -import lombok.NonNull; -import lombok.extern.log4j.Log4j2; - -@Service -@Log4j2 -class XtaService { - - static final String XDOMEA_0201_MESSAGE_TYPE = "Geschaeftsgang.Geschaeftsgang.0201"; - - static final String FIM_MESSAGE_TYPE_PREFIX = "fim."; - - @Autowired - private XtaRemoteService remoteService; - @Autowired - private XtaMessageMapper mapper; - @Autowired - private VorgangNummerSupplier vorgangNummerSupplier; - @Autowired - private XdomeaMessageDataMapper xdomeaMessageDataMapper; - @Autowired - private XtaIncomingFilesMapper xtaIncomingFilesMapper; - @Autowired - private XtaCurrentIdentifierService service; - - public Stream<FormData> getMessages() { - return createXtaMessageStream() - .filter(this::isSupportedMessageType) - .map(this::getFormDataIfNoRuntimeException) - .flatMap(Optional::stream); - } - - Stream<XtaMessageMetaData> createXtaMessageStream() { - return service.getIdentifiers().stream() - .flatMap(this::createXtaMessageStreamForIdentifier); - } - - private Stream<XtaMessageMetaData> createXtaMessageStreamForIdentifier(String identifier) { - service.setCurrentIdentifier(identifier); - var iterator = new XtaMessageMetadataRemoteIterator(remoteService); - return StreamSupport.stream(Spliterators.spliteratorUnknownSize(iterator, 0), false); - } - - boolean isSupportedMessageType(XtaMessageMetaData metaData) { - if (isXDomeaMessageType(metaData.getMessageType()) || isFimMessageType(metaData.getMessageType())) { - return true; - } - LOG.warn("Ignoring XTA-Message of type '{}'.", metaData.getMessageType()); - return false; - } - - Optional<FormData> getFormDataIfNoRuntimeException(@NonNull XtaMessageMetaData metaData) { - try { - return Optional.of(getFormData(metaData)); - } catch (RuntimeException exception) { - LOG.error("Failed to process xta message (id: %s)".formatted(metaData.getMessageId()), exception); - return Optional.empty(); - } - } - - FormData getFormData(@NonNull XtaMessageMetaData metaData) { - var msg = remoteService.getMessage(metaData.getMessageId()); - var incomingFiles = xtaIncomingFilesMapper.toIncomingFiles(msg.getMessageFiles()); - var representationsAttachmentsPair = getRepresentationsAttachmentsPair(metaData, incomingFiles); - - var formData = mapper.toFormData(representationsAttachmentsPair, metaData, vorgangNummerSupplier); - formData = addAttachments(msg, formData); - - return addRepresentations(formData, msg); - } - - FormData addRepresentations(FormData formData, XtaMessage msg) { - return formData.toBuilder().control( - formData.getControl().toBuilder() - .representations(Optional.of(buildRepresentations(formData.getControl().getRepresentations(), msg))) - .build()) - .build(); - } - - private Representations buildRepresentations(Optional<Representations> base, XtaMessage msg) { - return base.map(Representations::toBuilder).orElseGet(Representations::builder) - .primaryFormDataRepresentation(msg.getPrimaryFormDataMessage()) - .build(); - } - - FormData addAttachments(XtaMessage msg, FormData inFormData) { - var attachments = buildAttachmentsInFiles(msg.getAttachments()); - if (CollectionUtils.isNotEmpty(attachments)) { - return inFormData.toBuilder() - .attachment(IncomingFileGroup.builder().name("sonstige").files(attachments).build()) - .numberOfAttachments(attachments.size()) - .build(); - } - return inFormData; - } - - private List<IncomingFile> buildAttachmentsInFiles(Collection<XtaFile> attachmentFiles) { - return attachmentFiles.stream().map(xtaIncomingFilesMapper::toIncomingFile).toList(); - } - - RepresentationsAttachmentsPair getRepresentationsAttachmentsPair(XtaMessageMetaData metaData, List<IncomingFile> incomingFiles) { - if (isXDomeaMessageType(metaData.getMessageType())) { - return xdomeaMessageDataMapper.mapIncomingFilesToRepresentationsAttachmentsPair(incomingFiles); - } - if (isFimMessageType(metaData.getMessageType())) { - return mapIncomingFilesToRepresentations(incomingFiles); - } - - throw new TechnicalException("Unexpected XTA message type: %s".formatted(metaData.getMessageType())); - } - - private boolean isXDomeaMessageType(String messageType) { - return StringUtils.equals(messageType, XDOMEA_0201_MESSAGE_TYPE); - } - - private boolean isFimMessageType(String messageType) { - return StringUtils.startsWith(messageType, FIM_MESSAGE_TYPE_PREFIX); - } - - RepresentationsAttachmentsPair mapIncomingFilesToRepresentations(List<IncomingFile> incomingFiles) { - return RepresentationsAttachmentsPair.builder() - .representations(incomingFiles) - .attachments(emptyList()) - .build(); - } - - public void acknowledgeReceive(@NonNull XtaMessageId messageId) { - remoteService.close(messageId); - } -} diff --git a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/zip/LimitedInputStream.java b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/zip/LimitedInputStream.java deleted file mode 100644 index ee5dc7a8b70e7fe0241a60d94e98ed783f47f66e..0000000000000000000000000000000000000000 --- a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/zip/LimitedInputStream.java +++ /dev/null @@ -1,42 +0,0 @@ -package de.ozgcloud.eingang.xta.zip; - -import java.io.FilterInputStream; -import java.io.IOException; -import java.io.InputStream; - -public class LimitedInputStream extends FilterInputStream { - static final String LIMITED_EXCEEDED_MESSAGE = "Read limit exceeded"; - - private final long maxSize; - long bytesRead; - - public LimitedInputStream(InputStream in, long maxSize) { - super(in); - this.maxSize = maxSize; - this.bytesRead = 0; - } - - @Override - public int read() throws IOException { - var byteValue = super.read(); - if (byteValue != -1) { - updateAndVerifyReadLimit(1); - } - return byteValue; - } - - @Override - public int read(byte[] b, int off, int len) throws IOException { - return updateAndVerifyReadLimit(super.read(b, off, len)); - } - - private int updateAndVerifyReadLimit(int newBytesRead) throws IOException { - if (newBytesRead != -1) { - bytesRead += newBytesRead; - if (bytesRead > maxSize) { - throw new IOException(LIMITED_EXCEEDED_MESSAGE); - } - } - return newBytesRead; - } -} diff --git a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/zip/ReadableZipEntry.java b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/zip/ReadableZipEntry.java deleted file mode 100644 index fec9014ca3c6ac8c743517d6b45da904b5e9b7aa..0000000000000000000000000000000000000000 --- a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/zip/ReadableZipEntry.java +++ /dev/null @@ -1,28 +0,0 @@ -package de.ozgcloud.eingang.xta.zip; - -import java.io.IOException; -import java.io.InputStream; -import java.util.zip.ZipEntry; -import java.util.zip.ZipFile; - -import de.ozgcloud.eingang.common.errorhandling.TechnicalException; -import lombok.Builder; - -@Builder -record ReadableZipEntry(ZipEntry zipEntry, ZipFile parentZip) { - public InputStream getInputStream() throws IOException { - return parentZip.getInputStream(zipEntry); - } - - public Long getPositiveSize() { - var size = zipEntry.getSize(); - if (size < 0) { - throw new TechnicalException("Size of ZIP entry is unknown."); - } - return size; - } - - public String getName() { - return zipEntry.getName(); - } -} diff --git a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/zip/ZipFileExtractor.java b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/zip/ZipFileExtractor.java deleted file mode 100644 index 8f162061de832319567338ed51ad2a4c5dc069d3..0000000000000000000000000000000000000000 --- a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/zip/ZipFileExtractor.java +++ /dev/null @@ -1,119 +0,0 @@ -package de.ozgcloud.eingang.xta.zip; - -import java.io.File; -import java.io.IOException; -import java.net.URLConnection; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.function.Function; -import java.util.zip.ZipEntry; -import java.util.zip.ZipFile; - -import org.springframework.stereotype.Component; -import org.springframework.util.MimeTypeUtils; - -import de.ozgcloud.common.binaryfile.TempFileUtils; -import de.ozgcloud.eingang.common.errorhandling.TechnicalException; -import de.ozgcloud.eingang.common.formdata.IncomingFile; - -// TODO Resolve code duplication with ZipAttachmentReader in semantik-adapter common.zip -// Note: In contrast to the ZipAttachmentReader, here, the zip file is not included in list of extracted files -// Further, the suspicious compression ratio ZIP_MAX_THRESHOLD is evaluated on the whole zipFile, instead of individual entries -@Component -public class ZipFileExtractor { - - static final double ZIP_MAX_THRESHOLD = 100; - static final int ZIP_MAX_TOTAL_SIZE = 500 * 1024 * 1024; - static final int ZIP_MAX_ENTRIES = 100; - - public List<IncomingFile> extractIncomingFilesSafely(IncomingFile zipIncomingFile) { - var zipFile = zipIncomingFile.getFile(); - verifyLimits(zipFile); - return extractIncomingFiles(zipFile); - } - - void verifyLimits(File zipFile) { - var uncompressedSize = sumUncompressedEntrySizes(zipFile); - verifySizeLimit(uncompressedSize); - verifyCompressionRatio(zipFile, uncompressedSize); - } - - private void verifySizeLimit(long uncompressedSize) { - if (uncompressedSize > getZipMaxTotalSize()) { - throw new TechnicalException("Expect uncompressed size %s to be smaller than %d!".formatted(uncompressedSize, getZipMaxTotalSize())); - } - } - - private void verifyCompressionRatio(File zipFile, long totalSize) { - var compressionRatio = (double) totalSize / zipFile.length(); - if (compressionRatio > ZIP_MAX_THRESHOLD) { - throw new TechnicalException( - "Expect compression ratio %s to be smaller than %s! A zip bomb attack is suspected!".formatted(compressionRatio, - ZIP_MAX_THRESHOLD)); - } - } - - int getZipMaxTotalSize() { - return ZIP_MAX_TOTAL_SIZE; - } - - Long sumUncompressedEntrySizes(File zipFile) { - return mapZipEntries(zipFile, ReadableZipEntry::getPositiveSize) - .stream() - .mapToLong(Long::longValue) - .sum(); - } - - List<IncomingFile> extractIncomingFiles(File zipFile) { - return mapZipEntries(zipFile, this::mapReadableEntryToIncomingFile); - } - - private IncomingFile mapReadableEntryToIncomingFile(ReadableZipEntry entry) { - File file; - try (var inputStream = new LimitedInputStream(entry.getInputStream(), entry.getPositiveSize())) { - file = TempFileUtils.writeTmpFile(inputStream); - } catch (IOException | de.ozgcloud.common.errorhandling.TechnicalException e) { - throw new TechnicalException("Failed reading zip file element %s!".formatted(entry.getName()), e); - } - return createIncomingFile(file, entry.zipEntry()); - } - - <T> List<T> mapZipEntries(File zipFile, Function<ReadableZipEntry, T> mappingFunction) { - try (ZipFile zip = new ZipFile(zipFile)) { - var index = new AtomicInteger(); - var mappedElements = new ArrayList<T>(); - zip.stream().forEach(element -> { - if (index.getAndIncrement() >= ZIP_MAX_ENTRIES) { - throw new TechnicalException("Expect zip files to have at most %d entries!".formatted(ZIP_MAX_ENTRIES)); - } - mappedElements.add( - mappingFunction.apply( - ReadableZipEntry.builder() - .parentZip(zip) - .zipEntry(element) - .build() - ) - ); - }); - return mappedElements; - } catch (IOException e) { - throw new TechnicalException("Failed reading zip file!", e); - } - } - - IncomingFile createIncomingFile(File file, ZipEntry zipEntry) { - return IncomingFile.builder() - .name(zipEntry.getName()) - .size(zipEntry.getSize()) - .contentType(getContentType(zipEntry.getName())) - .file(file) - .build(); - } - - String getContentType(String name) { - Objects.requireNonNull(name); - return Objects.requireNonNullElse(URLConnection.guessContentTypeFromName(name), MimeTypeUtils.APPLICATION_OCTET_STREAM_VALUE); - } -} diff --git a/xta-adapter/src/main/resources/XTA.wsdl b/xta-adapter/src/main/resources/XTA.wsdl deleted file mode 100644 index d7ca5a364f4864a44ea0c2c5cbff4a76ae63a042..0000000000000000000000000000000000000000 --- a/xta-adapter/src/main/resources/XTA.wsdl +++ /dev/null @@ -1,620 +0,0 @@ -<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://xoev.de/transport/xta/211" - xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" - xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" - xmlns:xsd="http://www.w3.org/2001/XMLSchema" - xmlns:wsa="http://www.w3.org/2005/08/addressing" - xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap12/" - xmlns:wspmtom="http://schemas.xmlsoap.org/ws/2004/09/policy/optimizedmimeserialization" - xmlns:osci="http://www.osci.eu/ws/2008/05/transport" - xmlns:wsp="http://www.w3.org/ns/ws-policy" - xmlns:oscimeta="http://www.osci.eu/ws/2014/10/transport" - xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" - xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702" - xmlns:s12="http://www.w3.org/2003/05/soap-envelope" - xmlns:xta="http://xoev.de/transport/xta/211" name="XTA-Webservice"> - <wsp:Policy wsu:Id="osciCommon"> - <!--###### general osci policies ##########--> - <wsp:All> - <wsam:Addressing wsp:Optional="false"> - <wsp:Policy> - <wsam:AnonymousResponses/> - </wsp:Policy> - </wsam:Addressing> - <wspmtom:OptimizedMimeSerialization/> - <sp:Wss11> - <wsp:Policy> - <sp:MustSupportRefKeyIdentifier/> - <sp:MustSupportRefIssuerSerial/> - <sp:MustSupportRefThumbprint/> - <sp:MustSupportRefEncryptedKey/> - <sp:RequireSignatureConfirmation/> - </wsp:Policy> - </sp:Wss11> - <sp:Trust13> - <wsp:Policy> - <sp:MustSupportIssuedTokens/> - <sp:RequireClientEntropy/> - <sp:RequireServerEntropy/> - </wsp:Policy> - </sp:Trust13> - </wsp:All> - </wsp:Policy> - <wsp:Policy wsu:Id="TransportBindingPolicy"> - <wsp:ExactlyOne> - <wsp:All> - <sp:TransportBinding> - <wsp:Policy> - <sp:TransportToken> - <wsp:Policy> - <sp:HttpsToken RequireClientCertificate="true"/> - </wsp:Policy> - </sp:TransportToken> - <sp:AlgorithmSuite> - <wsp:Policy> - <sp:Basic256/> - </wsp:Policy> - </sp:AlgorithmSuite> - <sp:Layout> - <wsp:Policy> - <sp:Lax/> - </wsp:Policy> - </sp:Layout> - <!-- sp:IncludeTimestamp/ --> - </wsp:Policy> - </sp:TransportBinding> - <!-- sp:Wss10> - <wsp:Policy> - <sp:MustSupportRefKeyIdentifier/> - </wsp:Policy> - </sp:Wss10 --> - </wsp:All> - </wsp:ExactlyOne> - </wsp:Policy> - <!--Datenstrukturen --> - <types> - <xsd:schema targetNamespace="http://xoev.de/transport/xta/211"> - <xsd:import namespace="http://www.osci.eu/ws/2014/10/transport" schemaLocation="../xsd/OSCI_MessageMetaData_V2.02.xsd"/> - <xsd:import namespace="http://www.osci.eu/ws/2008/05/transport" schemaLocation="../xsd/OSCI2_02.xsd"/> - <xsd:include schemaLocation="../xsd/XTA-Webservice-Globale-Elemente.xsd"/> - <xsd:include schemaLocation="../xsd/XTA-Webservice-Exceptions.xsd"/> - </xsd:schema> - </types> - <!--Nachrichten --> - <message name="EmptyBody"/> - <message name="XTAHeader"> - <part name="AuthorIdentifier" element="oscimeta:Author"/> - <part name="MessageMetaData" element="oscimeta:MessageMetaData"/> - </message> - <message name="LookupServiceRequest"> - <part name="LookupServiceRequest" element="xta:LookupServiceRequest"/> - </message> - <message name="LookupServiceResponse"> - <part name="LookupServiceResponse" element="xta:LookupServiceResponse"/> - </message> - <message name="GetTransportReportResponse"> - <part name="GetTransportReportResponse" element="xta:TransportReport"/> - </message> - <message name="GenericContainerBody"> - <part name="GenericContainer" element="xta:GenericContentContainer"/> - </message> - <message name="MessageID"> - <part name="MessageID" element="wsa:MessageID"/> - </message> - <message name="OptHeaders"> - <part name="FetchResponseHeader" element="osci:MsgBoxResponse"/> - <part name="X509TokenContainer" element="osci:X509TokenContainer"/> - </message> - <message name="FetchMsgRequest"> - <part name="FetchRequest" element="osci:MsgBoxFetchRequest"/> - </message> - <message name="GetNextRequest"> - <part name="FetchRequest" element="osci:MsgBoxGetNextRequest"/> - </message> - <message name="CloseRequest"> - <part name="FetchRequest" element="osci:MsgBoxCloseRequest"/> - </message> - <message name="FetchListRequest"> - <part name="FetchRequest" element="osci:MsgBoxStatusListRequest"/> - </message> - <message name="FetchListResponse"> - <part name="FetchResponse" element="osci:MsgStatusList"/> - </message> - <message name="GetNextRequest"> - <part name="FetchRequest" element="osci:MsgBoxGetNextListRequest"/> - </message> - <!--Nachrichten - SOAP-Exceptions--> - <message name="PermissionDeniedException"> - <part name="permissionDeniedException" element="xta:PermissionDeniedException"/> - </message> - <message name="XTAWSTechnicalProblemException"> - <part name="xtawsTechnicalProblem" element="xta:XTAWSTechnicalProblemException"/> - </message> - <message name="ParameterIsNotValidException"> - <part name="parameterIsNotValidException" element="xta:ParameterIsNotValidException"/> - </message> - <message name="MessageSchemaViolationException"> - <part name="messageSchemaViolationException" element="xta:MessageSchemaViolationException"/> - </message> - <message name="MessageVirusDetectionException"> - <part name="messageVirusDetectionException" element="xta:MessageVirusDetectionException"/> - </message> - <message name="SyncAsyncException"> - <part name="syncAsyncException" element="xta:SyncAsyncException"/> - </message> - <message name="InvalidMessageIDException"> - <!-- <part name="invalidMessageIDException" element="xta:InvalidMessageIdException"/> ---> - <part name="invalidMessageIDException" element="xta:InvalidMessageIDException"/> - </message> - <message name="CancelDeniedException"> - <part name="cancelDeniedException" element="xta:CancelDeniedException"/> - </message> - <!--Interfaces --> - <portType name="managementPortType"> - <documentation>xta managementPort</documentation> - <operation name="checkAccountActive"> - <input message="xta:EmptyBody" wsam:Action="http://www.xta.de/XTA/CheckAccountActive"/> - <output message="xta:EmptyBody" wsam:Action="http://www.xta.de/XTA/CheckAccountActive"> - <documentation>only for exception handling</documentation> - </output> - <fault name="PermissionDeniedException" message="xta:PermissionDeniedException" wsam:Action="http://www.xta.de/XTA/CheckAccountActive"/> - <fault name="XTAWSTechnicalProblemException" message="xta:XTAWSTechnicalProblemException" wsam:Action="http://www.xta.de/XTA/CheckAccountActive"/> - </operation> - <operation name="lookupService"> - <input message="xta:LookupServiceRequest" wsam:Action="http://www.xta.de/XTA/IsServiceAvailable"/> - <output message="xta:LookupServiceResponse" wsam:Action="http://www.xta.de/XTA/IsServiceAvailable"/> - <fault name="PermissionDeniedException" message="xta:PermissionDeniedException" wsam:Action="http://www.xta.de/XTA/IsServiceAvailable"/> - <fault name="ParameterIsNotValid" message="xta:ParameterIsNotValidException" wsam:Action="http://www.xta.de/XTA/IsServiceAvailable"/> - <fault name="XTAWSTechnicalProblemException" message="xta:XTAWSTechnicalProblemException" wsam:Action="http://www.xta.de/XTA/IsServiceAvailable"/> - </operation> - <operation name="getTransportReport"> - <input message="xta:MessageID" wsam:Action="http://www.xta.de/XTA/GetTransportReport"/> - <output message="xta:GetTransportReportResponse" wsam:Action="http://www.xta.de/XTA/GetTransportReport"/> - <fault name="PermissionDeniedException" message="xta:PermissionDeniedException" wsam:Action="http://www.xta.de/XTA/GetTransportReport"/> - <fault name="XTAWSTechnicalProblemException" message="xta:XTAWSTechnicalProblemException" wsam:Action="http://www.xta.de/XTA/GetTransportReport"/> - <fault name="InvalidMessageIDException" message="xta:InvalidMessageIDException" wsam:Action="http://www.xta.de/XTA/GetTransportReport"/> - </operation> - <operation name="cancelMessage"> - <input message="xta:MessageID" wsam:Action="http://www.xta.de/XTA/CancelMessage"/> - <output message="xta:EmptyBody" wsam:Action="http://www.xta.de/XTA/CancelMessage"> - <documentation>only for exception handling</documentation> - </output> - <fault name="PermissionDeniedException" message="xta:PermissionDeniedException" wsam:Action="http://www.xta.de/XTA/CancelMessage"/> - <fault name="ParameterIsNotValidException" message="xta:ParameterIsNotValidException" wsam:Action="http://www.xta.de/XTA/CancelMessage"/> - <fault name="XTAWSTechnicalProblemException" message="xta:XTAWSTechnicalProblemException" wsam:Action="http://www.xta.de/XTA/CancelMessage"/> - <fault name="CancelDeniedException" message="xta:CancelDeniedException" wsam:Action="http://www.xta.de/XTA/CancelMessage"/> - </operation> - <operation name="createMessageId"> - <input message="xta:EmptyBody" wsam:Action="http://www.xta.de/XTA/CreateMessageID"/> - <output message="xta:MessageID" wsam:Action="http://www.xta.de/XTA/CreateMessageID"/> - <fault name="PermissionDeniedException" message="xta:PermissionDeniedException" wsam:Action="http://www.xta.de/XTA/CreateMessageID"/> - <fault name="XTAWSTechnicalProblemException" message="xta:XTAWSTechnicalProblemException" wsam:Action="http://www.xta.de/XTA/CreateMessageID"/> - </operation> - </portType> - <portType name="sendPortType"> - <documentation>sendPort</documentation> - <operation name="sendMessage"> - <input message="xta:GenericContainerBody" wsam:Action="http://www.xta.de/XTA/SendMessage"/> - <output message="xta:EmptyBody" wsam:Action="http://www.xta.de/XTA/SendMessage"/> - <fault name="PermissionDeniedException" message="xta:PermissionDeniedException" wsam:Action="http://www.xta.de/XTA/SendMessage"/> - <fault name="ParameterIsNotValidException" message="xta:ParameterIsNotValidException" wsam:Action="http://www.xta.de/XTA/SendMessage"/> - <fault name="XTAWSTechnicalProblemException" message="xta:XTAWSTechnicalProblemException" wsam:Action="http://www.xta.de/XTA/SendMessage"/> - <fault name="MessageSchemaViolationException" message="xta:MessageSchemaViolationException" wsam:Action="http://www.xta.de/XTA/SendMessage"/> - <fault name="MessageVirusDetectionException" message="xta:MessageVirusDetectionException" wsam:Action="http://www.xta.de/XTA/SendMessage"/> - <fault name="SyncAsyncException" message="xta:SyncAsyncException" wsam:Action="http://www.xta.de/XTA/SendMessage"/> - </operation> - <operation name="sendMessageSync"> - <input message="xta:GenericContainerBody" wsam:Action="http://www.xta.de/XTA/SendMessageSync"/> - <output message="xta:GenericContainerBody" wsam:Action="http://www.xta.de/XTA/SendMessageSync"/> - <fault name="PermissionDeniedException" message="xta:PermissionDeniedException" wsam:Action="http://www.xta.de/XTA/SendMessageSync"/> - <fault name="ParameterIsNotValidException" message="xta:ParameterIsNotValidException" wsam:Action="http://www.xta.de/XTA/SendMessageSync"/> - <fault name="XTAWSTechnicalProblemException" message="xta:XTAWSTechnicalProblemException" wsam:Action="http://www.xta.de/XTA/SendMessageSync"/> - <fault name="MessageSchemaViolationException" message="xta:MessageSchemaViolationException" wsam:Action="http://www.xta.de/XTA/SendMessageSync"/> - <fault name="MessageVirusDetectionException" message="xta:MessageVirusDetectionException" wsam:Action="http://www.xta.de/XTA/SendMessageSync"/> - <fault name="SyncAsyncException" message="xta:SyncAsyncException" wsam:Action="http://www.xta.de/XTA/SendMessageSync"/> - </operation> - </portType> - <portType name="msgBoxPortType"> - <documentation>msgboxfetchPort</documentation> - <operation name="getMessage"> - <input message="xta:FetchMsgRequest" wsam:Action="http://www.osci.eu/ws/2008/05/transport/urn/messageTypes/MsgBoxFetchRequest"/> - <output message="xta:GenericContainerBody" wsam:Action="http://www.osci.eu/ws/2008/05/transport/urn/messageTypes/MsgBoxFetchRequest"/> - <fault name="PermissionDeniedException" message="xta:PermissionDeniedException" wsam:Action="http://www.osci.eu/ws/2008/05/transport/urn/messageTypes/MsgBoxFetchRequest"/> - <fault name="XTAWSTechnicalProblemException" message="xta:XTAWSTechnicalProblemException" wsam:Action="http://www.osci.eu/ws/2008/05/transport/urn/messageTypes/MsgBoxFetchRequest"/> - <fault name="InvalidMessageIDException" message="xta:InvalidMessageIDException" wsam:Action="http://www.osci.eu/ws/2008/05/transport/urn/messageTypes/MsgBoxFetchRequest"/> - </operation> - <operation name="getStatusList"> - <input message="xta:FetchListRequest" wsam:Action="http://www.osci.eu/ws/2008/05/transport/urn/messageTypes/MsgBoxStatusListRequest"/> - <output message="xta:FetchListResponse" wsam:Action="http://www.osci.eu/ws/2008/05/transport/urn/messageTypes/MsgBoxStatusListRequest"/> - <fault name="PermissionDeniedException" message="xta:PermissionDeniedException" wsam:Action="http://www.osci.eu/ws/2008/05/transport/urn/messageTypes/MsgBoxStatusListRequest"/> - <fault name="XTAWSTechnicalProblemException" message="xta:XTAWSTechnicalProblemException" wsam:Action="http://www.osci.eu/ws/2008/05/transport/urn/messageTypes/MsgBoxStatusListRequest"/> - </operation> - <operation name="getNextMessage"> - <input message="xta:GetNextRequest" wsam:Action="http://www.osci.eu/ws/2008/05/transport/urn/messageTypes/MsgBoxGetNextMsgRequest"/> - <output message="xta:GenericContainerBody" wsam:Action="http://www.osci.eu/ws/2008/05/transport/urn/messageTypes/MsgBoxGetNextMsgRequest"/> - <!-- Stand 13.05.2016 Vorgabe fehlt in Abschnitt B1.1.1, Annahme: Es werden - dieselben Exceptions benötigt, wie für getMessage --> - <fault name="PermissionDeniedException" message="xta:PermissionDeniedException" wsam:Action="http://www.osci.eu/ws/2008/05/transport/urn/messageTypes/MsgBoxGetNextMsgRequest"/> - <fault name="XTAWSTechnicalProblemException" message="xta:XTAWSTechnicalProblemException" wsam:Action="http://www.osci.eu/ws/2008/05/transport/urn/messageTypes/MsgBoxGetNextMsgRequest"/> - <fault name="InvalidMessageIDException" message="xta:InvalidMessageIDException" wsam:Action="http://www.osci.eu/ws/2008/05/transport/urn/messageTypes/MsgBoxGetNextMsgRequest"/> - </operation> - <operation name="getNextStatusList"> - <input message="xta:GetNextRequest" wsam:Action="http://www.osci.eu/ws/2008/05/transport/urn/messageTypes/MsgBoxGetNextListRequest"/> - <output message="xta:FetchListResponse" wsam:Action="http://www.osci.eu/ws/2008/05/transport/urn/messageTypes/MsgBoxGetNextListRequest"/> - <fault name="PermissionDeniedException" message="xta:PermissionDeniedException" wsam:Action="http://www.osci.eu/ws/2008/05/transport/urn/messageTypes/MsgBoxGetNextListRequest"/> - <fault name="XTAWSTechnicalProblemException" message="xta:XTAWSTechnicalProblemException" wsam:Action="http://www.osci.eu/ws/2008/05/transport/urn/messageTypes/MsgBoxGetNextListRequest"/> - </operation> - <operation name="close"> - <input message="xta:CloseRequest" wsam:Action="http://www.osci.eu/ws/2008/05/transport/urn/messageTypes/MsgBoxCloseRequest"/> - <output message="xta:EmptyBody" wsam:Action="http://www.osci.eu/ws/2008/05/transport/urn/messageTypes/MsgBoxCloseRequest"> - <documentation>only for exception handling</documentation> - </output> - <fault name="PermissionDeniedException" message="xta:PermissionDeniedException" wsam:Action="http://www.osci.eu/ws/2008/05/transport/urn/messageTypes/MsgBoxCloseRequest"/> - <fault name="XTAWSTechnicalProblemException" message="xta:XTAWSTechnicalProblemException" wsam:Action="http://www.osci.eu/ws/2008/05/transport/urn/messageTypes/MsgBoxCloseRequest"/> - <fault name="InvalidMessageIDException" message="xta:InvalidMessageIDException" wsam:Action="http://www.osci.eu/ws/2008/05/transport/urn/messageTypes/MsgBoxCloseRequest"/> - </operation> - </portType> - <!--Bindung von Protokoll und Interface --> - <binding name="sendXTAHttpsBinding" type="xta:sendPortType"> - <documentation>https binding for the sendPort</documentation> - <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> - <wsp:PolicyReference URI="#TransportBindingPolicy"/> - <wsp:PolicyReference URI="#osciCommon"/> - <operation name="sendMessage"> - <documentation>The sendMessage method delivers a content message to the sending - hub.</documentation> - <soap:operation soapAction="http://www.xta.de/XTA/SendMessage" soapActionRequired="true" style="document"/> - <input> - <documentation>Input Header: MessageMetaData header contains additional information - for the for the given payload. Body: The GenericContainerBody containins the - "xöv" message.</documentation> - <soap:body use="literal"/> - <soap:header message="xta:XTAHeader" part="MessageMetaData" use="literal"/> - <soap:header message="xta:OptHeaders" part="X509TokenContainer" use="literal"/> - </input> - <output> - <documentation>only for exception handling</documentation> - <soap:body use="literal"/> - </output> - <fault name="PermissionDeniedException"> - <soap:fault name="PermissionDeniedException" use="literal"/> - </fault> - <fault name="ParameterIsNotValidException"> - <soap:fault name="ParameterIsNotValidException" use="literal"/> - </fault> - <fault name="XTAWSTechnicalProblemException"> - <soap:fault name="XTAWSTechnicalProblemException" use="literal"/> - </fault> - <fault name="MessageSchemaViolationException"> - <soap:fault name="MessageSchemaViolationException" use="literal"/> - </fault> - <fault name="MessageVirusDetectionException"> - <soap:fault name="MessageVirusDetectionException" use="literal"/> - </fault> - <fault name="SyncAsyncException"> - <soap:fault name="SyncAsyncException" use="literal"/> - </fault> - </operation> - <operation name="sendMessageSync"> - <documentation>The sendMessage method delivers a content message to the sending - hub.</documentation> - <soap:operation soapAction="http://www.xta.de/XTA/SendMessageSync" soapActionRequired="true" style="document"/> - <input> - <documentation>Input Header: MessageMetaData header contains additional information - for the for the given payload. Body: The GenericContainerBody contains the "xöv" - message.</documentation> - <soap:body use="literal"/> - <soap:header message="xta:XTAHeader" part="MessageMetaData" use="literal"/> - <soap:header message="xta:OptHeaders" part="X509TokenContainer" use="literal"/> - </input> - <output> - <documentation>Output body: A GenericContainerBody in the body, containing the - synchronous "xöv" message response.</documentation> - <soap:body use="literal"/> - <soap:header message="xta:XTAHeader" part="MessageMetaData" use="literal"/> - <soap:header message="xta:OptHeaders" part="X509TokenContainer" use="literal"/> - </output> - <fault name="PermissionDeniedException"> - <soap:fault name="PermissionDeniedException" use="literal"/> - </fault> - <fault name="ParameterIsNotValidException"> - <soap:fault name="ParameterIsNotValidException" use="literal"/> - </fault> - <fault name="XTAWSTechnicalProblemException"> - <soap:fault name="XTAWSTechnicalProblemException" use="literal"/> - </fault> - <fault name="MessageSchemaViolationException"> - <soap:fault name="MessageSchemaViolationException" use="literal"/> - </fault> - <fault name="MessageVirusDetectionException"> - <soap:fault name="MessageVirusDetectionException" use="literal"/> - </fault> - <fault name="SyncAsyncException"> - <soap:fault name="SyncAsyncException" use="literal"/> - </fault> - </operation> - </binding> - <binding name="managementHttpsBinding" type="xta:managementPortType"> - <documentation>https binding for the managementPort</documentation> - <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> - <wsp:PolicyReference URI="#TransportBindingPolicy"/> - <wsp:PolicyReference URI="#osciCommon"/> - <operation name="getTransportReport"> - <documentation>Method to get the transport report for the given - MessageID</documentation> - <soap:operation soapAction="http://www.xta.de/XTA/GetTransportReport" soapActionRequired="true" style="document"/> - <input> - <documentation>Input: optional xta:AuthorIdentifier header and the MessageID in the - body part.</documentation> - <soap:body use="literal"/> - <soap:header message="xta:XTAHeader" part="AuthorIdentifier" use="literal"/> - </input> - <output> - <documentation>Output body: The Transport report containing the detailed information - for the related message.</documentation> - <soap:body use="literal"/> - </output> - <fault name="PermissionDeniedException"> - <soap:fault name="PermissionDeniedException" use="literal"/> - </fault> - <fault name="XTAWSTechnicalProblemException"> - <soap:fault name="XTAWSTechnicalProblemException" use="literal"/> - </fault> - <fault name="InvalidMessageIDException"> - <soap:fault name="InvalidMessageIDException" use="literal"/> - </fault> - </operation> - <operation name="cancelMessage"> - <documentation>Method to cancel disptach order (if not yet finalied - successfully)</documentation> - <soap:operation soapAction="http://www.xta.de/XTA/CancelMessage" soapActionRequired="true" style="document"/> - <input> - <documentation>Input: optional xta:AuthorIdentifier header and the MessageID in the - body part.</documentation> - <soap:body use="literal"/> - <soap:header message="xta:XTAHeader" part="AuthorIdentifier" use="literal"/> - </input> - <output> - <documentation>only for exception handling</documentation> - <soap:body use="literal"/> - </output> - <fault name="CancelDeniedException"> - <soap:fault name="CancelDeniedException" use="literal"/> - </fault> - <fault name="PermissionDeniedException"> - <soap:fault name="PermissionDeniedException" use="literal"/> - </fault> - <fault name="ParameterIsNotValidException"> - <soap:fault name="ParameterIsNotValidException" use="literal"/> - </fault> - <fault name="XTAWSTechnicalProblemException"> - <soap:fault name="XTAWSTechnicalProblemException" use="literal"/> - </fault> - </operation> - <operation name="lookupService"> - <documentation>Method to get further information about the given address - information</documentation> - <soap:operation soapAction="http://www.xta.de/XTA/IsServiceAvailable" soapActionRequired="true" style="document"/> - <input> - <documentation>Input: optional xta:AuthorIdentifier header and a list of address - information in the body part</documentation> - <soap:body use="literal"/> - <soap:header message="xta:XTAHeader" part="AuthorIdentifier" use="literal"/> - </input> - <output> - <documentation>Output body: further information for the given address - list.</documentation> - <soap:body use="literal"/> - </output> - <fault name="PermissionDeniedException"> - <soap:fault name="PermissionDeniedException" use="literal"/> - </fault> - <fault name="ParameterIsNotValid"> - <soap:fault name="ParameterIsNotValid" use="literal"/> - </fault> - <fault name="XTAWSTechnicalProblemException"> - <soap:fault name="XTAWSTechnicalProblemException" use="literal"/> - </fault> - </operation> - <operation name="checkAccountActive"> - <documentation>Method to check whether the account is activ</documentation> - <soap:operation soapAction="http://www.xta.de/XTA/CheckAccountActive" soapActionRequired="true" style="document"/> - <input> - <documentation>Input: optional xta:AuthorIdentifier header.</documentation> - <soap:body use="literal"/> - <soap:header message="xta:XTAHeader" part="AuthorIdentifier" use="literal"/> - </input> - <output> - <documentation>only for exception handling</documentation> - <soap:body use="literal"/> - </output> - <fault name="PermissionDeniedException"> - <soap:fault name="PermissionDeniedException" use="literal"/> - </fault> - <fault name="XTAWSTechnicalProblemException"> - <soap:fault name="XTAWSTechnicalProblemException" use="literal"/> - </fault> - </operation> - <operation name="createMessageId"> - <documentation>Method to obtain new created MesMessageID</documentation> - <soap:operation soapAction="http://www.xta.de/XTA/CreateMessageID" soapActionRequired="true" style="document"/> - <input> - <documentation>Input: optional xta:AuthorIdentifier header</documentation> - <soap:body use="literal"/> - <soap:header message="xta:XTAHeader" part="AuthorIdentifier" use="literal"/> - </input> - <output> - <documentation>Output body: The created MesMessageID</documentation> - <soap:body use="literal"/> - </output> - <fault name="PermissionDeniedException"> - <soap:fault name="PermissionDeniedException" use="literal"/> - </fault> - <fault name="XTAWSTechnicalProblemException"> - <soap:fault name="XTAWSTechnicalProblemException" use="literal"/> - </fault> - </operation> - </binding> - <binding name="msgBoxHttpsBinding" type="xta:msgBoxPortType"> - <documentation>https binding for the msgBox</documentation> - <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> - <wsp:PolicyReference URI="#TransportBindingPolicy"/> - <wsp:PolicyReference URI="#osciCommon"/> - <operation name="getMessage"> - <documentation>The getMethode method returns the first message relating to the given - parameter</documentation> - <soap:operation soapAction="http://www.osci.eu/ws/2008/05/transport/urn/messageTypes/MsgBoxFetchRequest" soapActionRequired="true"/> - <input> - <documentation>Input: optional xta:AuthorIdentifier header and OSCI 2 - MsgBoxFetchRequest parameter in the body part</documentation> - <soap:body use="literal"/> - <soap:header message="xta:XTAHeader" part="AuthorIdentifier" use="literal"/> - </input> - <output> - <documentation>Output: Header: Optional xta:AuthorIdentifier header or OSCI2 Header - MsgBoxResponse with addional information and related GenericContentContainer in - the body part</documentation> - <soap:header message="xta:XTAHeader" part="MessageMetaData" use="literal"/> - <soap:header message="xta:OptHeaders" part="FetchResponseHeader" use="literal"/> - <soap:body use="literal"/> - </output> - <fault name="PermissionDeniedException"> - <soap:fault name="PermissionDeniedException" use="literal"/> - </fault> - <fault name="XTAWSTechnicalProblemException"> - <soap:fault name="XTAWSTechnicalProblemException" use="literal"/> - </fault> - <fault name="InvalidMessageIDException"> - <soap:fault name="InvalidMessageIDException" use="literal"/> - </fault> - </operation> - <operation name="getStatusList"> - <documentation>getStatusList returns the list of related message - information</documentation> - <soap:operation soapAction="http://www.osci.eu/ws/2008/05/transport/urn/messageTypes/MsgBoxStatusListRequest" soapActionRequired="true"/> - <input> - <documentation>Input: optional xta:AuthorIdentifier header and OSCI 2 - MsgStatusListRequest parameter in the body part</documentation> - <soap:body use="literal"/> - <soap:header message="xta:XTAHeader" part="AuthorIdentifier" use="literal"/> - </input> - <output> - <documentation>Output: Header: OSCI2 Header MsgBoxResponse with addional information - and related MsgStatusList in the body part</documentation> - <soap:header message="xta:OptHeaders" part="FetchResponseHeader" use="literal"/> - <soap:body use="literal"/> - </output> - <fault name="PermissionDeniedException"> - <soap:fault name="PermissionDeniedException" use="literal"/> - </fault> - <fault name="XTAWSTechnicalProblemException"> - <soap:fault name="XTAWSTechnicalProblemException" use="literal"/> - </fault> - </operation> - <operation name="getNextMessage"> - <documentation>getNextMessage returns next message relates to fetch - iterator</documentation> - <soap:operation soapAction="http://www.osci.eu/ws/2008/05/transport/urn/messageTypes/MsgBoxGetNextMsgRequest" soapActionRequired="true"/> - <input> - <documentation>Input: Optional xta:AuthorIdentifier header and in the body part the - MsgBoxNextRequest element conatining the fetch iterator</documentation> - <soap:body use="literal"/> - <soap:header message="xta:XTAHeader" part="AuthorIdentifier" use="literal"/> - </input> - <output> - <documentation>Output: Header: Optional xta:AuthorIdentifier header or OSCI2 Header - MsgBoxResponse with addional information and related MsgStatusList in the body - part</documentation> - <soap:header message="xta:XTAHeader" part="MessageMetaData" use="literal"/> - <soap:header message="xta:OptHeaders" part="FetchResponseHeader" use="literal"/> - <soap:body use="literal"/> - </output> - <fault name="PermissionDeniedException"> - <soap:fault name="PermissionDeniedException" use="literal"/> - </fault> - <fault name="XTAWSTechnicalProblemException"> - <soap:fault name="XTAWSTechnicalProblemException" use="literal"/> - </fault> - <fault name="InvalidMessageIDException"> - <soap:fault name="InvalidMessageIDException" use="literal"/> - </fault> - </operation> - <operation name="getNextStatusList"> - <documentation>getNextStatusList returns the next list of related message information - related to the fetch iterator</documentation> - <soap:operation soapAction="http://www.osci.eu/ws/2008/05/transport/urn/messageTypes/MsgBoxGetNextListRequest" soapActionRequired="true"/> - <input> - <documentation>Input: optional xta:AuthorIdentifier header and in the body part the - MsgBoxNextRequest element conatining the fetch iterator</documentation> - <soap:body use="literal"/> - <soap:header message="xta:XTAHeader" part="AuthorIdentifier" use="literal"/> - </input> - <output> - <documentation>Output: Header: OSCI2 Header MsgBoxResponse with addional information - and next related MsgStatusList in the body part</documentation> - <soap:header message="xta:OptHeaders" part="FetchResponseHeader" use="literal"/> - <soap:body use="literal"/> - </output> - <fault name="PermissionDeniedException"> - <soap:fault name="PermissionDeniedException" use="literal"/> - </fault> - <fault name="XTAWSTechnicalProblemException"> - <soap:fault name="XTAWSTechnicalProblemException" use="literal"/> - </fault> - </operation> - <operation name="close"> - <documentation>The close method returns close the fetch iterator</documentation> - <soap:operation soapAction="http://www.osci.eu/ws/2008/05/transport/urn/messageTypes/MsgBoxCloseRequest" soapActionRequired="true"/> - <input> - <documentation>Input: optional xta:AuthorIdentifier header and the - MsgBoxCloseRequest element conatining the fetch iterator in the body - part</documentation> - <soap:body use="literal"/> - <soap:header message="xta:XTAHeader" part="AuthorIdentifier" use="literal"/> - </input> - <output> - <documentation>only for exception handling</documentation> - <soap:body use="literal"/> - </output> - <fault name="PermissionDeniedException"> - <soap:fault name="PermissionDeniedException" use="literal"/> - </fault> - <fault name="XTAWSTechnicalProblemException"> - <soap:fault name="XTAWSTechnicalProblemException" use="literal"/> - </fault> - <fault name="InvalidMessageIDException"> - <soap:fault name="InvalidMessageIDException" use="literal"/> - </fault> - </operation> - </binding> - <!--Endpoints des Services --> - <service name="XTAService"> - <port name="MsgBoxPort" binding="xta:msgBoxHttpsBinding"> - <soap:address location="REPLACE_WITH_ACTUAL_URL"/> - <wsa:EndpointReference> - <wsa:Address>REPLACE_WITH_ACTUAL_URL</wsa:Address> - <wsa:ReferenceParameters> - <osci:TypeOfBusinessScenario>http://www.xoevxta.de/xta/ws</osci:TypeOfBusinessScenario> - </wsa:ReferenceParameters> - </wsa:EndpointReference> - </port> - <port name="SendXtaPort" binding="xta:sendXTAHttpsBinding"> - <soap:address location="REPLACE_WITH_ACTUAL_URL"/> - <wsa:EndpointReference> - <wsa:Address>REPLACE_WITH_ACTUAL_URL</wsa:Address> - <wsa:ReferenceParameters> - <osci:TypeOfBusinessScenario>http://www.xoevxta.de/xta/ws</osci:TypeOfBusinessScenario> - </wsa:ReferenceParameters> - </wsa:EndpointReference> - </port> - <port name="ManagementPort" binding="xta:managementHttpsBinding"> - <soap:address location="REPLACE_WITH_ACTUAL_URL"/> - <wsa:EndpointReference> - <wsa:Address>REPLACE_WITH_ACTUAL_URL</wsa:Address> - <wsa:ReferenceParameters> - <osci:TypeOfBusinessScenario>http://www.xoevxta.de/xta/ws</osci:TypeOfBusinessScenario> - </wsa:ReferenceParameters> - </wsa:EndpointReference> - </port> - </service> -</definitions> diff --git a/xta-adapter/src/main/resources/application-local.yml b/xta-adapter/src/main/resources/application-local.yml deleted file mode 100644 index 592ce7559484b5318fe4bf564bf66b85dae0b22f..0000000000000000000000000000000000000000 --- a/xta-adapter/src/main/resources/application-local.yml +++ /dev/null @@ -1,18 +0,0 @@ -ozgcloud: - xta: - identifiers: - - gae:noreply@ozg-sh.de - server: - address: localhost:3000 - name: LI33-0005 - protocol: https - adapter: - targetVorgangManagerName: local - fallbackStrategy: DENY - routingStrategy: SINGLE - -grpc: - client: - vorgang-manager-local: - address: static://127.0.0.1:9090 - negotiationType: PLAINTEXT diff --git a/xta-adapter/src/main/resources/application.yml b/xta-adapter/src/main/resources/application.yml deleted file mode 100644 index fd1f72982999b468311a1f7ec9faf5cec1b8a67d..0000000000000000000000000000000000000000 --- a/xta-adapter/src/main/resources/application.yml +++ /dev/null @@ -1,19 +0,0 @@ -logging: - level: - ROOT: WARN - '[de.ozgcloud]': INFO - '[org.springframework.ws]': WARN - -ozgcloud: - xta: - max-list-elements: 100 - keystore: - type: PKCS12 - actions: - status-list: "http://www.osci.eu/ws/2008/05/transport/urn/messageTypes/MsgBoxStatusListRequest" - fetch-request: "http://www.osci.eu/ws/2008/05/transport/urn/messageTypes/MsgBoxFetchRequest" - close-request: "http://www.osci.eu/ws/2008/05/transport/urn/messageTypes/MsgBoxCloseRequest" - -fim: - schemeLocations: - - fim-s17000652_1.4/S17000652V1.4_xfall.xsd \ No newline at end of file diff --git a/xta-adapter/src/main/wsdl/XTA-synchron.wsdl b/xta-adapter/src/main/wsdl/XTA-synchron.wsdl deleted file mode 100644 index 0f7fa6ebe04c4f80f38c6d4487f84ef9d4fdadde..0000000000000000000000000000000000000000 --- a/xta-adapter/src/main/wsdl/XTA-synchron.wsdl +++ /dev/null @@ -1,176 +0,0 @@ -<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://xoev.de/transport/xta/211" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsa="http://www.w3.org/2005/08/addressing" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:wspmtom="http://schemas.xmlsoap.org/ws/2004/09/policy/optimizedmimeserialization" xmlns:osci="http://www.osci.eu/ws/2008/05/transport" xmlns:oscimeta="http://www.osci.eu/ws/2014/10/transport" xmlns:wsp="http://www.w3.org/ns/ws-policy" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702" xmlns:s12="http://www.w3.org/2003/05/soap-envelope" xmlns:xta="http://xoev.de/transport/xta/211" name="XTA-Webservice"> - <wsp:Policy wsu:Id="osciCommon"> - <!--###### general osci policies ##########--> - <wsp:All> - <wsam:Addressing wsp:Optional="false"> - <wsp:Policy> - <wsam:AnonymousResponses/> - </wsp:Policy> - </wsam:Addressing> - <wspmtom:OptimizedMimeSerialization/> - <sp:Wss11> - <wsp:Policy> - <sp:MustSupportRefKeyIdentifier/> - <sp:MustSupportRefIssuerSerial/> - <sp:MustSupportRefThumbprint/> - <sp:MustSupportRefEncryptedKey/> - <sp:RequireSignatureConfirmation/> - </wsp:Policy> - </sp:Wss11> - <sp:Trust13> - <wsp:Policy> - <sp:MustSupportIssuedTokens/> - <sp:RequireClientEntropy/> - <sp:RequireServerEntropy/> - </wsp:Policy> - </sp:Trust13> - </wsp:All> - </wsp:Policy> - <wsp:Policy wsu:Id="TransportBindingPolicy"> - <wsp:ExactlyOne> - <wsp:All> - <sp:TransportBinding> - <wsp:Policy> - <sp:TransportToken> - <wsp:Policy> - <sp:HttpsToken RequireClientCertificate="true"/> - </wsp:Policy> - </sp:TransportToken> - <sp:AlgorithmSuite> - <wsp:Policy> - <sp:Basic256/> - </wsp:Policy> - </sp:AlgorithmSuite> - <sp:Layout> - <wsp:Policy> - <sp:Lax/> - </wsp:Policy> - </sp:Layout> - <!-- sp:IncludeTimestamp/ --> - </wsp:Policy> - </sp:TransportBinding> - <!-- sp:Wss10> - <wsp:Policy> - <sp:MustSupportRefKeyIdentifier/> - </wsp:Policy> - </sp:Wss10 --> - </wsp:All> - </wsp:ExactlyOne> - </wsp:Policy> - <!--Datenstrukturen --> - <types> - <xsd:schema targetNamespace="http://xoev.de/transport/xta/211"> - <xsd:import namespace="http://www.osci.eu/ws/2014/10/transport" schemaLocation="http://www.osci.eu/ws/2014/10/transport/OSCI_MessageMetaData_V2.02.xsd"/> - <xsd:import namespace="http://www.osci.eu/ws/2008/05/transport" schemaLocation="http://www.osci.eu/ws/2014/10/transport/OSCI2_02.xsd"/> - <xsd:include schemaLocation="http://xoev.de/transport/xta/211/XTA-Webservice-Globale-Elemente.xsd"/> - <xsd:include schemaLocation="http://xoev.de/transport/xta/211/XTA-Webservice-Exceptions.xsd"/> - </xsd:schema> - </types> - <!--Nachrichten --> - <message name="EmptyBody"/> - <message name="XTAHeader"> - <part name="MessageMetaData" element="oscimeta:MessageMetaData"/> - <part name="AuthorIdentifier" element="oscimeta:Author"/> - </message> - <message name="GenericContainerBody"> - <part name="GenericContainer" element="xta:GenericContentContainer"/> - </message> - <message name="OptHeaders"> - <part name="FetchResponseHeader" element="osci:MsgBoxResponse"/> - <part name="X509TokenContainer" element="osci:X509TokenContainer"/> - </message> - <!--Nachrichten - SOAP-Exceptions--> - <message name="PermissionDeniedException"> - <part name="permissionDeniedException" element="xta:PermissionDeniedException"/> - </message> - <message name="XTAWSTechnicalProblemException"> - <part name="xtawsTechnicalProblem" element="xta:XTAWSTechnicalProblemException"/> - </message> - <message name="ParameterIsNotValidException"> - <part name="parameterIsNotValidException" element="xta:ParameterIsNotValidException"/> - </message> - <message name="MessageSchemaViolationException"> - <part name="messageSchemaViolationException" element="xta:MessageSchemaViolationException"/> - </message> - <message name="MessageVirusDetectionException"> - <part name="messageVirusDetectionException" element="xta:MessageVirusDetectionException"/> - </message> - <message name="SyncAsyncException"> - <part name="syncAsyncException" element="xta:SyncAsyncException"/> - </message> - <message name="CancelDeniedException"> - <part name="cancelDeniedException" element="xta:CancelDeniedException"/> - </message> - <message name="InvalidMessageIDException"> - <part name="invalidMessageIDException" element="xta:InvalidMessageIDException"/> - </message> - <!--Interfaces --> - <portType name="sendSynchronPortType"> - <documentation>sendPort</documentation> - <operation name="sendMessageSync"> - <input message="xta:GenericContainerBody" wsam:Action="http://www.xta.de/XTA/SendMessageSync"/> - <output message="xta:GenericContainerBody" wsam:Action="http://www.xta.de/XTA/SendMessageSync"/> - <fault name="PermissionDeniedException" message="xta:PermissionDeniedException" wsam:Action="http://www.xta.de/XTA/SendMessageSync"/> - <fault name="ParameterIsNotValidException" message="xta:ParameterIsNotValidException" wsam:Action="http://www.xta.de/XTA/SendMessageSync"/> - <fault name="XTAWSTechnicalProblemException" message="xta:XTAWSTechnicalProblemException" wsam:Action="http://www.xta.de/XTA/SendMessageSync"/> - <fault name="MessageSchemaViolationException" message="xta:MessageSchemaViolationException" wsam:Action="http://www.xta.de/XTA/SendMessageSync"/> - <fault name="MessageVirusDetectionException" message="xta:MessageVirusDetectionException" wsam:Action="http://www.xta.de/XTA/SendMessageSync"/> - <fault name="SyncAsyncException" message="xta:SyncAsyncException" wsam:Action="http://www.xta.de/XTA/SendMessageSync"/> - </operation> - </portType> - <binding name="sendXTAHttpsBinding" type="xta:sendSynchronPortType"> - <documentation>https binding for the sendPort</documentation> - <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> - <wsp:PolicyReference URI="#TransportBindingPolicy"/> - <wsp:PolicyReference URI="#osciCommon"/> - <operation name="sendMessageSync"> - <documentation>The sendMessage method delivers a content message to the sending - hub</documentation> - <soap:operation soapAction="http://www.xta.de/XTA/SendMessageSync" soapActionRequired="true" style="document"/> - <input> - <documentation>Input Header: MessageMetaData header contains additional information - for the for the given payload. Body: The GenericContainerBody contains the "xöv" - message</documentation> - <soap:body use="literal"/> - <soap:header message="xta:XTAHeader" part="MessageMetaData" use="literal"/> - <soap:header message="xta:OptHeaders" part="X509TokenContainer" use="literal"/> - </input> - <output> - <documentation>Output body: A GenericContainerBody in the body, containing the - synchronous "xöv" message response</documentation> - <soap:body use="literal"/> - <soap:header message="xta:XTAHeader" part="MessageMetaData" use="literal"/> - <soap:header message="xta:OptHeaders" part="X509TokenContainer" use="literal"/> - </output> - <fault name="MessageSchemaViolationException"> - <soap:fault name="MessageSchemaViolationException" use="literal"/> - </fault> - <fault name="MessageVirusDetectionException"> - <soap:fault name="MessageVirusDetectionException" use="literal"/> - </fault> - <fault name="ParameterIsNotValidException"> - <soap:fault name="ParameterIsNotValidException" use="literal"/> - </fault> - <fault name="PermissionDeniedException"> - <soap:fault name="PermissionDeniedException" use="literal"/> - </fault> - <fault name="SyncAsyncException"> - <soap:fault name="SyncAsyncException" use="literal"/> - </fault> - <fault name="XTAWSTechnicalProblemException"> - <soap:fault name="XTAWSTechnicalProblemException" use="literal"/> - </fault> - </operation> - </binding> - <service name="XTAServiceSynchron"> - <port name="SendXtaSynchronPort" binding="xta:sendXTAHttpsBinding"> - <soap:address location="REPLACE_WITH_ACTUAL_URL"/> - <wsa:EndpointReference> - <wsa:Address>REPLACE_WITH_ACTUAL_URL</wsa:Address> - <wsa:ReferenceParameters> - <osci:TypeOfBusinessScenario>http://www.xoevxta.de/xta/ws</osci:TypeOfBusinessScenario> - </wsa:ReferenceParameters> - </wsa:EndpointReference> - </port> - </service> -</definitions> diff --git a/xta-adapter/src/main/xsd/OSCI2_02.xsd b/xta-adapter/src/main/xsd/OSCI2_02.xsd deleted file mode 100644 index 244fc7f8bf6989304cfdb8702f1f048bd2561c96..0000000000000000000000000000000000000000 --- a/xta-adapter/src/main/xsd/OSCI2_02.xsd +++ /dev/null @@ -1,328 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:wsa="http://www.w3.org/2005/08/addressing" xmlns:osci="http://www.osci.eu/ws/2008/05/transport" xmlns:oscimeta="http://www.osci.eu/ws/2014/10/transport" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:s12="http://www.w3.org/2003/05/soap-envelope" xmlns:wsp="http://www.w3.org/ns/ws-policy" targetNamespace="http://www.osci.eu/ws/2008/05/transport" elementFormDefault="qualified" attributeFormDefault="unqualified"> - <!--OSCI Transport Version 2.02 schema - last edited 2015-01-23 --> - <!--OSCI Transport 2.02 schema extended by metadata header for OSCI2.0, according modification for MsgBoxStatusList; MsgBoxFetchRequest attributed for reqeuesting whole envelope, headers of body of original message only--> - <xs:import namespace="http://www.osci.eu/ws/2014/10/transport" schemaLocation="OSCI_MessageMetaData_V2.02.xsd"/> - <xs:import namespace="http://www.w3.org/ns/ws-policy" schemaLocation="ws-policy.xsd"/> - <xs:import namespace="http://www.w3.org/2005/08/addressing" schemaLocation="ws-addr.xsd"/> - <xs:import namespace="http://www.w3.org/2000/09/xmldsig#" schemaLocation="xmldsig-core-schema.xsd"/> - <xs:import namespace="http://www.w3.org/2003/05/soap-envelope" schemaLocation="soap-envelope.xsd"/> - <xs:import namespace="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" schemaLocation="oasis-200401-wss-wssecurity-utility-1.0.xsd"/> - <!--WSA-Extension: BusinessScenarioType--> - <xs:complexType name="TypeOfBusinessScenarioType"> - <xs:simpleContent> - <xs:extension base="xs:anyURI"> - <xs:attribute ref="wsa:IsReferenceParameter" use="optional"/> - </xs:extension> - </xs:simpleContent> - </xs:complexType> - <xs:element name="TypeOfBusinessScenario" type="osci:TypeOfBusinessScenarioType"/> - <!--General header-part of OSCI messages: timestamps--> - <xs:complexType name="MsgTimeStampsType"> - <xs:sequence> - <xs:element name="ObsoleteAfter" type="xs:date" minOccurs="0"> - <xs:annotation> - <xs:documentation>Date, when this message is obsolete; may be set by Initiator</xs:documentation> - </xs:annotation> - </xs:element> - <xs:element name="Delivery" type="xs:dateTime" minOccurs="0"> - <xs:annotation> - <xs:documentation>Time of entry in a Recipient MsgBox</xs:documentation> - </xs:annotation> - </xs:element> - <xs:element name="InitialFetch" type="xs:dateTime" minOccurs="0"> - <xs:annotation> - <xs:documentation>Time of first comitted fetch from MsgBox by the Recipient</xs:documentation> - </xs:annotation> - </xs:element> - <xs:element name="Reception" type="xs:dateTime" minOccurs="0"> - <xs:annotation> - <xs:documentation>Reception Time set by the Recipient</xs:documentation> - </xs:annotation> - </xs:element> - </xs:sequence> - </xs:complexType> - <xs:element name="MsgTimeStamps" type="osci:MsgTimeStampsType"/> - <!--Types and Elements for MsgBox request/responses--> - <xs:annotation> - <xs:documentation>Template for MsgBox-Requests</xs:documentation> - </xs:annotation> - <xs:complexType name="MsgBoxRequestType"> - <xs:sequence> - <xs:element ref="osci:MsgSelector" minOccurs="0"/> - </xs:sequence> - </xs:complexType> - <xs:simpleType name="MsgBoxReasonEnum"> - <xs:restriction base="xs:anyURI"> - <xs:enumeration value="http://www.osci.eu/ws/2008/05/transport/MsgBox/reasons/NoMatch"/> - <xs:enumeration value="http://www.osci.eu/ws/2008/05/transport/MsgBox/reasons/SearchArgsInvalid"/> - <xs:enumeration value="http://www.osci.eu/ws/2008/05/transport/MsgBox/reasons/RequestIdInvalid"/> - </xs:restriction> - </xs:simpleType> - <xs:simpleType name="MsgBoxReasonOpenEnum"> - <xs:union memberTypes="osci:MsgBoxReasonEnum xs:anyURI"/> - </xs:simpleType> - <xs:complexType name="MsgBoxResponseType"> - <xs:choice> - <xs:element name="NoMessageAvailable"> - <xs:complexType> - <xs:attribute name="reason" type="osci:MsgBoxReasonOpenEnum" use="required"/> - </xs:complexType> - </xs:element> - <xs:element name="ItemsPending" type="xs:nonNegativeInteger"/> - </xs:choice> - <xs:attribute name="MsgBoxRequestID" type="xs:anyURI" use="required"/> - </xs:complexType> - <xs:complexType name="MsgAttributeListType"> - <xs:sequence> - <xs:element ref="wsa:MessageID"/> - <xs:element ref="wsa:RelatesTo" minOccurs="0" maxOccurs="unbounded"/> - <xs:element ref="wsa:From" minOccurs="0"/> - <xs:element ref="osci:TypeOfBusinessScenario"/> - <xs:element name="MsgSize" type="xs:int"/> - <!--xs:element ref="osci:MsgTimeStamps"/--> - <xs:element name="ObsoleteAfterDate" type="xs:date" minOccurs="0"/> - <xs:element name="DeliveryTime" type="xs:dateTime"/> - <xs:element name="InitialFetchedTime" type="xs:dateTime" minOccurs="0"/> - </xs:sequence> - </xs:complexType> - <xs:attribute name="MsgBoxRequestID" type="xs:anyURI"/> - <xs:element name="MsgSelector"> - <xs:complexType> - <xs:sequence minOccurs="0"> - <xs:element ref="wsa:MessageID" minOccurs="0" maxOccurs="unbounded"/> - <xs:element ref="wsa:RelatesTo" minOccurs="0" maxOccurs="unbounded"/> - <xs:element name="MsgBoxEntryTimeFrom" type="xs:dateTime" minOccurs="0"/> - <xs:element name="MsgBoxEntryTimeTo" type="xs:dateTime" minOccurs="0"/> - <xs:element name="Extension" type="xs:anyType" minOccurs="0"/> - </xs:sequence> - <xs:attribute name="newEntry" type="xs:boolean"/> - </xs:complexType> - </xs:element> - <xs:element name="MsgStatusList" type="osci:MsgStatusListType"/> - <xs:complexType name="MsgStatusListType"> - <xs:sequence> - <xs:element name="MsgAttributes" type="osci:MsgAttributeListType" minOccurs="0" maxOccurs="unbounded"/> - <xs:element ref="oscimeta:MessageMetaData" minOccurs="0" maxOccurs="unbounded"/> - </xs:sequence> - </xs:complexType> - <xs:element name="MsgBoxFetchRequest"> - <xs:complexType> - <xs:complexContent> - <xs:extension base="osci:MsgBoxRequestType"> - <xs:attribute name="MsgPart" default="Envelope"> - <xs:simpleType> - <xs:restriction base="xs:NMTOKEN"> - <xs:enumeration value="Envelope"/> - <xs:enumeration value="Header"/> - <xs:enumeration value="Body"/> - </xs:restriction> - </xs:simpleType> - </xs:attribute> - </xs:extension> - </xs:complexContent> - </xs:complexType> - </xs:element> - <xs:element name="MsgBoxStatusListRequest" type="osci:MsgBoxStatusListRequestType"/> - <xs:complexType name="MsgBoxStatusListRequestType"> - <xs:complexContent> - <xs:extension base="osci:MsgBoxRequestType"> - <xs:attribute name="maxListItems" type="xs:positiveInteger"/> - <xs:attribute name="ListForm"> - <xs:simpleType> - <xs:restriction base="xs:NMTOKEN"> - <xs:enumeration value="MsgAtrributes"/> - <xs:enumeration value="MessageMetaData"/> - </xs:restriction> - </xs:simpleType> - </xs:attribute> - </xs:extension> - </xs:complexContent> - </xs:complexType> - <xs:element name="MsgBoxResponse" type="osci:MsgBoxResponseType"/> - <xs:element name="MsgBoxGetNextRequest" type="osci:MsgBoxGetNextRequestType"/> - <xs:complexType name="MsgBoxGetNextRequestType"> - <xs:sequence minOccurs="0"> - <xs:element name="LastMsgReceived" type="wsa:AttributedURIType" maxOccurs="unbounded"/> - </xs:sequence> - <xs:attribute name="MsgBoxRequestID" type="xs:anyURI" use="required"/> - </xs:complexType> - <xs:element name="MsgBoxCloseRequest" type="osci:MsgBoxCloseRequestType"/> - <xs:complexType name="MsgBoxCloseRequestType"> - <xs:sequence minOccurs="0"> - <xs:element name="LastMsgReceived" type="wsa:AttributedURIType" maxOccurs="unbounded"/> - </xs:sequence> - <xs:attribute name="MsgBoxRequestID" type="xs:anyURI" use="required"/> - </xs:complexType> - <!--Types and Elements for Receipt- and Notification Handling--> - <xs:attribute name="qualTSPForReceipt" type="xs:boolean" default="false"/> - <xs:attribute name="echoRequest" type="xs:boolean" default="false"/> - <xs:complexType name="ReceiptDemandType"> - <xs:sequence> - <xs:element ref="wsa:ReplyTo"/> - </xs:sequence> - <xs:attribute name="qualTSPForReceipt" type="xs:boolean" default="false"/> - <xs:attribute name="echoRequest" type="xs:boolean" default="false"/> - </xs:complexType> - <xs:element name="DeliveryReceiptDemand" type="osci:DeliveryReceiptDemandType"/> - <xs:element name="ReceptionReceiptDemand" type="osci:ReceptionReceiptDemandType"/> - <xs:element name="ReceiptInfo" type="osci:ReceiptInfoType"/> - <xs:complexType name="ReceiptInfoType"> - <xs:sequence> - <xs:element ref="wsa:MessageID"/> - <xs:element ref="osci:MsgTimeStamps"/> - <xs:element ref="wsa:RelatesTo" minOccurs="0" maxOccurs="unbounded"/> - <xs:element name="To" type="wsa:EndpointReferenceType"/> - <xs:element ref="wsa:From" minOccurs="0"/> - <xs:element ref="wsa:ReplyTo"/> - <xs:element name="RequestEcho" type="xs:base64Binary" minOccurs="0"/> - <xs:element ref="oscimeta:MessageMetaData" minOccurs="0"/> - </xs:sequence> - <xs:attribute name="Id" type="xs:ID" use="required"/> - <xs:attribute name="ReceiptIssuerRole" use="optional"> - <xs:simpleType> - <xs:restriction base="xs:anyURI"> - <xs:enumeration value="http://www.osci.eu/ws/2008/05/transport/role/MsgBox"/> - <xs:enumeration value="http://www.osci.eu/ws/2008/05/transport/role/Recipient"/> - <xs:enumeration value="http://www.osci.eu/ws/2008/05/transport/role/Sender -"/> - <xs:enumeration value="http://www.osci.eu/ws/2008/05/transport/role/Relay -"/> - </xs:restriction> - </xs:simpleType> - </xs:attribute> - </xs:complexType> - <xs:complexType name="DeliveryReceiptDemandType"> - <xs:complexContent> - <xs:restriction base="osci:ReceiptDemandType"> - <xs:sequence> - <xs:element ref="wsa:ReplyTo"/> - </xs:sequence> - </xs:restriction> - </xs:complexContent> - </xs:complexType> - <xs:complexType name="ReceptionReceiptDemandType"> - <xs:complexContent> - <xs:restriction base="osci:ReceiptDemandType"> - <xs:sequence> - <xs:element ref="wsa:ReplyTo"/> - </xs:sequence> - </xs:restriction> - <!-- xs:attribute ref="s12:role" fixed="http://www.w3.org/2003/05/soap-envelope/role/ultimateReceiver"/--> - </xs:complexContent> - </xs:complexType> - <xs:complexType name="DeliveryReceiptType"> - <xs:sequence> - <xs:element ref="osci:ReceiptInfo"/> - <xs:element ref="ds:Signature"/> - </xs:sequence> - </xs:complexType> - <xs:element name="DeliveryReceipt" type="osci:DeliveryReceiptType"/> - <xs:element name="SubmissionReceipt" type="osci:DeliveryReceiptType"/> - <xs:element name="RelayReceipt" type="osci:DeliveryReceiptType"/> - <xs:complexType name="ReceptionReceiptType"> - <xs:sequence> - <xs:element ref="osci:ReceiptInfo"/> - <xs:element ref="ds:Signature"/> - </xs:sequence> - </xs:complexType> - <xs:element name="ReceptionReceipt" type="osci:ReceptionReceiptType"/> - <xs:complexType name="FetchedNotificationDemandType"> - <xs:sequence> - <xs:element ref="wsa:ReplyTo"/> - </xs:sequence> - <xs:attribute ref="s12:role" default="http://www.osci.eu/ws/2008/05/transport/role/MsgBox"/> - </xs:complexType> - <xs:element name="FetchedNotificationDemand" type="osci:FetchedNotificationDemandType"/> - <xs:complexType name="FetchedNotificationType"> - <xs:sequence> - <xs:element name="FetchedTime" type="xs:dateTime"/> - <xs:element ref="wsa:MessageID"/> - <xs:element ref="wsa:To"/> - <xs:element ref="wsa:From"/> - </xs:sequence> - </xs:complexType> - <xs:element name="FetchedNotification" type="osci:FetchedNotificationType"/> - <!--Extentensions for Key usage context--> - <xs:complexType name="X509TokenContainerType"> - <xs:sequence maxOccurs="unbounded"> - <xs:element ref="osci:X509TokenInfo"/> - </xs:sequence> - <xs:attribute name="validateCompleted" type="xs:boolean" default="false"/> - </xs:complexType> - <xs:element name="X509TokenContainer" type="osci:X509TokenContainerType"/> - <xs:element name="X509TokenInfo"> - <xs:complexType> - <xs:sequence> - <xs:element ref="ds:X509Data"/> - <xs:element name="TokenApplication" maxOccurs="unbounded"> - <xs:complexType> - <xs:sequence> - <xs:element name="TimeInstant" type="xs:dateTime"/> - <xs:element name="MsgItemRef" type="xs:IDREF" minOccurs="0"/> - </xs:sequence> - <xs:attribute name="validateResultRef" type="xs:IDREF"/> - <xs:attribute name="ocspNoCache" type="xs:boolean"/> - </xs:complexType> - </xs:element> - </xs:sequence> - <xs:attribute name="validated" type="xs:boolean" default="false"/> - <xs:attribute name="Id" type="xs:ID" use="required"/> - <!-- RFC 3280 for KeyUsage with Extentensions Attribute Certificate and usage for Authentication --> - </xs:complexType> - <!--OSCI Policy Asserstions--> - <!--Policy qualified Timestamp Servcie available--> - </xs:element> - <!--Poliy Assertion carrying Endpoints X509Certificates--> - <xs:element name="X509CertificateAssertion"> - <xs:complexType> - <xs:sequence> - <xs:element ref="wsp:All"/> - </xs:sequence> - </xs:complexType> - </xs:element> - <!--Policy, when qualified TSP service can be requested from this node--> - <xs:element name="QualTspAssertion"> - <xs:complexType> - <xs:attribute name="PolicyRef" type="xs:anyURI"/> - </xs:complexType> - </xs:element> - <!--Policy if and how MsgTimeStamps:OsoleteAfter is handled--> - <xs:element name="ObsoleteAfterAssertion"> - <xs:complexType> - <xs:sequence> - <xs:element name="MsgRetainDays" type="xs:positiveInteger"/> - <xs:element name="WarningBeforeMsgObsolete" type="xs:positiveInteger" minOccurs="0"/> - </xs:sequence> - <xs:attribute name="PolicyRef" type="xs:anyURI"/> - </xs:complexType> - </xs:element> - <!--Poliy for MakeConnection: Response Retention Days--> - <xs:element name="MsgRetainDays" type="xs:positiveInteger"/> - <!--Enumeration for possible X509 Token Usages--> - <xs:attribute name="TokenUsage"> - <xs:simpleType> - <xs:restriction base="xs:anyURI"> - <xs:enumeration value="http://www.osci.eu/common/names/TokenUsage/e2eContentEncryption"/> - <xs:enumeration value="http://www.osci.eu/common/names/TokenUsage/TransportEncryption"/> - <xs:enumeration value="http://www.osci.eu/common/names/TokenUsage/ReceiptSigning"/> - <xs:enumeration value="http://www.osci.eu/common/names/TokenUsage/TSPSigning"/> - </xs:restriction> - </xs:simpleType> - </xs:attribute> - <!--Opaque Body Type - not used--> - <!--Policy maximum accepted Message size and Frequency per hour--> - <xs:element name="AcceptedMsgLimits"> - <xs:complexType> - <xs:sequence> - <xs:element name="MaxSize" type="xs:positiveInteger"/> - <xs:element name="MaxPerHour" type="xs:positiveInteger"/> - </xs:sequence> - </xs:complexType> - </xs:element> - <xs:complexType name="MessageBody"> - <xs:sequence> - <xs:any namespace="##any" minOccurs="0" maxOccurs="unbounded"/> - </xs:sequence> - </xs:complexType> -</xs:schema> diff --git a/xta-adapter/src/main/xsd/OSCI_MessageMetaData_V2.02.xsd b/xta-adapter/src/main/xsd/OSCI_MessageMetaData_V2.02.xsd deleted file mode 100644 index fd04e3edccbf3c70f8c26967c778ee31cad6cc14..0000000000000000000000000000000000000000 --- a/xta-adapter/src/main/xsd/OSCI_MessageMetaData_V2.02.xsd +++ /dev/null @@ -1,379 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!--Schema for OSCI Message Meta Data - last edited 2015-02-19 --> -<!-- Change 2015-02-19: MessageType amended by mandatory attribte @payloadSchema --> -<!-- Change 2015-01-23: Alignment with XTA/KoSIT: introduced KeyCodeType, changed PropertyType, BusinessScenarioType, MessageType; ServiceQuality (to #any type), SecurityToken may carry IDREF attribute to token in payload now; usage attribute mandatory now --> -<!-- Change 2014-11-30: xoev basis data type schema version changed from 1_0 to 1_1 --> -<!-- Last recent changes: Codelist for BusinessScenarioTypes defined and imported --> -<!-- Changes: 2.0.2: Adoption of xoev:Codelist type for some elements; eliminating QName typed attributes/elements; PartyType elements now may include optional SecurityTokens (as e.g. used in XVergabe) --> -<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:oscimeta="http://www.osci.eu/ws/2014/10/transport" xmlns:wsa="http://www.w3.org/2005/08/addressing" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:xoev-dt="http://xoev.de/schemata/basisdatentypen/1_1" targetNamespace="http://www.osci.eu/ws/2014/10/transport" elementFormDefault="qualified" attributeFormDefault="unqualified"> - <xs:import namespace="http://www.w3.org/2005/08/addressing" schemaLocation="ws-addr.xsd"/> - <xs:import namespace="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" schemaLocation="oasis-200401-wss-wssecurity-secext-1.0.xsd"/> - <xs:import namespace="http://xoev.de/schemata/basisdatentypen/1_1" schemaLocation="xoev-basisdatentypen.xsd"/> - <xs:simpleType name="NonEmptyStringType"> - <xs:restriction base="xs:string"> - <xs:minLength value="1"/> - </xs:restriction> - </xs:simpleType> - <xs:simpleType name="NonEmptyURIType"> - <xs:restriction base="xs:anyURI"> - <xs:minLength value="1"/> - </xs:restriction> - </xs:simpleType> - <xs:complexType name="AnyType" mixed="true"> - <xs:sequence minOccurs="0" maxOccurs="unbounded"> - <xs:any namespace="##any" processContents="lax"/> - </xs:sequence> - <xs:anyAttribute namespace="##any"/> - </xs:complexType> - <!-- End AnyType --> - <xs:complexType name="ReceiptRequestType"> - <xs:sequence> - <xs:element name="Submission" minOccurs="0"> - <xs:annotation> - <xs:documentation>Sending node: Message accepted for delivery and submitted</xs:documentation> - </xs:annotation> - </xs:element> - <xs:element name="Relay" minOccurs="0"> - <xs:annotation> - <xs:documentation>Active node on the delivery route: Message forwarded to next hop</xs:documentation> - </xs:annotation> - </xs:element> - <xs:element name="Delivery" minOccurs="0"> - <xs:annotation> - <xs:documentation>Destination node:Successful delivery to Recipient in synchronous scenarios, to MsgBox if asynchronous</xs:documentation> - </xs:annotation> - </xs:element> - <xs:element name="Fetch" minOccurs="0"> - <xs:annotation> - <xs:documentation>Only MsgBox node: Initial fetch of Message by Recipient from his MsgBox</xs:documentation> - </xs:annotation> - </xs:element> - <xs:element name="Reception" minOccurs="0"> - <xs:annotation> - <xs:documentation>Ultimate Recipient node, after acceptance of message, after successful decryption of payload</xs:documentation> - </xs:annotation> - </xs:element> - <xs:element name="ReceiptTo" type="wsa:EndpointReferenceType" minOccurs="0"/> - </xs:sequence> - </xs:complexType> - <xs:complexType name="DeliveryAttributesType"> - <xs:annotation> - <xs:documentation>Message delivery time instants, quality and receipts requested</xs:documentation> - </xs:annotation> - <xs:sequence> - <xs:annotation> - <xs:documentation>Timestamps, priority etc.</xs:documentation> - </xs:annotation> - <xs:element name="Origin" type="xs:dateTime" minOccurs="0"> - <xs:annotation> - <xs:documentation>Production of content by Requester respective (response) Provider</xs:documentation> - </xs:annotation> - </xs:element> - <xs:element name="InitialSend" type="xs:dateTime" minOccurs="0"> - <xs:annotation> - <xs:documentation>Time when delivery was started (submission by Senders node)</xs:documentation> - </xs:annotation> - </xs:element> - <xs:element name="NotBefore" type="xs:dateTime" minOccurs="0"> - <xs:annotation> - <xs:documentation>Time when sending node should submit message</xs:documentation> - </xs:annotation> - </xs:element> - <xs:element name="ObsoleteAfter" type="xs:date" minOccurs="0"> - <xs:annotation> - <xs:documentation>Date, when this message is obsolete; may be set by Initiator</xs:documentation> - </xs:annotation> - </xs:element> - <xs:element name="Delivery" type="xs:dateTime" minOccurs="0"> - <xs:annotation> - <xs:documentation>Time of entry in a Recipients MsgBox or reception by Recipient in synchronous case</xs:documentation> - </xs:annotation> - </xs:element> - <xs:element name="InitialFetch" type="xs:dateTime" minOccurs="0"> - <xs:annotation> - <xs:documentation>Time of first comitted fetch from MsgBox by recipient</xs:documentation> - </xs:annotation> - </xs:element> - <xs:element name="Reception" type="xs:dateTime" minOccurs="0"> - <xs:annotation> - <xs:documentation>Reception time set by the Ultimate Recipient ("Reader", target application)</xs:documentation> - </xs:annotation> - </xs:element> - <xs:element name="ServiceQuality" type="oscimeta:NonEmptyStringType" minOccurs="0"> - <xs:annotation> - <xs:documentation>Property like priority etc. - XTA here points to "Service Profile"</xs:documentation> - </xs:annotation> - </xs:element> - <xs:element name="ReceiptRequests" type="oscimeta:ReceiptRequestType" minOccurs="0"> - <xs:annotation> - <xs:documentation>Receipts requested by sender or author</xs:documentation> - </xs:annotation> - </xs:element> - </xs:sequence> - </xs:complexType> - <xs:element name="SecurityToken"> - <xs:complexType> - <xs:choice> - <xs:element ref="wsse:BinarySecurityToken"/> - <xs:element ref="wsse:SecurityTokenReference"/> - <xs:element ref="wsse:UsernameToken"/> - </xs:choice> - <xs:attribute name="usage" use="required"> - <xs:simpleType> - <xs:restriction base="xs:NMTOKEN"> - <xs:enumeration value="AUTHENTICATION"/> - <xs:enumeration value="ENCRYPTION"/> - <xs:enumeration value="SIGNATURE"/> - </xs:restriction> - </xs:simpleType> - </xs:attribute> - <xs:attribute name="payloadRef" type="xs:IDREF"/> - </xs:complexType> - </xs:element> - <xs:complexType name="PartyType"> - <xs:annotation> - <xs:documentation>Logical identifier and optional security tokens of that entity (binary, may carry SAML, too) </xs:documentation> - </xs:annotation> - <xs:sequence> - <xs:element name="Identifier" type="oscimeta:PartyIdentifierType"/> - <xs:element ref="oscimeta:SecurityToken" minOccurs="0" maxOccurs="unbounded"/> - </xs:sequence> - </xs:complexType> - <xs:complexType name="PartyIdentifierType"> - <xs:annotation> - <xs:documentation>Value of generic party identifier, as classified by @type attribute, e.g.: Prefix:Kennung</xs:documentation> - </xs:annotation> - <xs:simpleContent> - <xs:extension base="xs:normalizedString"> - <xs:attribute name="type" type="oscimeta:NonEmptyStringType" use="required"> - <xs:annotation> - <xs:documentation>Orientation: ebMS Core: type, how to interpret Party-Id value, e.g.: xöv oder Justiz</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="name" type="oscimeta:NonEmptyStringType"> - <xs:annotation> - <xs:documentation>optional "friendly name" value for displaying in user agents (as e.g. known from eMail)</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="category" type="oscimeta:NonEmptyStringType"> - <xs:annotation> - <xs:documentation>Concrete role of party in business scenario (e.g. "buyer", "Meldehörde", "Standesamt"...)</xs:documentation> - </xs:annotation> - </xs:attribute> - </xs:extension> - </xs:simpleContent> - </xs:complexType> - <xs:element name="Author" type="oscimeta:PartyType"> - <xs:annotation> - <xs:documentation>Requester resp. (response-) Provider</xs:documentation> - </xs:annotation> - </xs:element> - <xs:element name="Reader" type="oscimeta:PartyType"> - <xs:annotation> - <xs:documentation>Destinations of the message</xs:documentation> - </xs:annotation> - </xs:element> - <xs:complexType name="OriginatorsType"> - <xs:sequence> - <xs:element ref="oscimeta:Author"/> - <xs:element ref="oscimeta:Sender" minOccurs="0"/> - <xs:element name="ReplyTo" type="oscimeta:PartyType" minOccurs="0"> - <xs:annotation> - <xs:documentation>If response expected different from value outlined in "From" address</xs:documentation> - </xs:annotation> - </xs:element> - </xs:sequence> - </xs:complexType> - <xs:complexType name="DestinationsType"> - <xs:sequence> - <xs:element ref="oscimeta:Reader"> - <xs:annotation> - <xs:documentation>Ultimate target of the message</xs:documentation> - </xs:annotation> - </xs:element> - <xs:element ref="oscimeta:OtherDestinations" minOccurs="0"/> - </xs:sequence> - </xs:complexType> - <xs:complexType name="ProcessIdentifierType"> - <xs:annotation> - <xs:documentation>Process ID message is realated to</xs:documentation> - </xs:annotation> - <xs:simpleContent> - <xs:extension base="oscimeta:NonEmptyStringType"> - <xs:attribute name="ProccesName" type="oscimeta:NonEmptyStringType"> - <xs:annotation> - <xs:documentation>Process may have a name, e.g. "order"</xs:documentation> - </xs:annotation> - </xs:attribute> - </xs:extension> - </xs:simpleContent> - </xs:complexType> - <xs:complexType name="MsgIdentificationType"> - <xs:sequence> - <xs:element ref="wsa:MessageID"/> - <xs:element name="In-Reply-To" type="wsa:AttributedURIType" minOccurs="0" maxOccurs="unbounded"> - <xs:annotation> - <xs:documentation>Referenced application level Message-Id(s)</xs:documentation> - </xs:annotation> - </xs:element> - <xs:element name="ProcessRef" minOccurs="0"> - <xs:annotation> - <xs:documentation>References to business process-id's (like ebMS Conversation-Id, "Aktenzeichen" in Germany)</xs:documentation> - </xs:annotation> - <xs:complexType> - <xs:sequence> - <xs:element name="Requester" type="oscimeta:ProcessIdentifierType" minOccurs="0"> - <xs:annotation> - <xs:documentation>Ref on requester (Source Application) side</xs:documentation> - </xs:annotation> - </xs:element> - <xs:element name="Responder" type="oscimeta:ProcessIdentifierType" minOccurs="0"> - <xs:annotation> - <xs:documentation>Ref on responder (Target Application) side, if different</xs:documentation> - </xs:annotation> - </xs:element> - </xs:sequence> - </xs:complexType> - </xs:element> - </xs:sequence> - </xs:complexType> - <xs:complexType name="KeyCodeType"> - <xs:complexContent> - <xs:restriction base="xoev-dt:Code"> - <xs:sequence> - <xs:element name="code" type="xs:token" form="unqualified"/> - <xs:element name="name" type="xs:normalizedString" form="unqualified" minOccurs="0"/> - </xs:sequence> - <xs:attribute name="listURI" type="xs:anyURI" use="required"/> - <xs:attribute name="listVersionID" type="xs:normalizedString" use="required"/> - </xs:restriction> - </xs:complexContent> - </xs:complexType> - <xs:complexType name="PropertyType"> - <xs:sequence> - <xs:element name="Key" type="oscimeta:KeyCodeType"/> - <xs:element name="Value" type="oscimeta:NonEmptyStringType"/> - </xs:sequence> - </xs:complexType> - <xs:complexType name="MessagePropertiesType"> - <xs:sequence> - <xs:element name="Property" type="oscimeta:PropertyType" maxOccurs="unbounded"/> - </xs:sequence> - </xs:complexType> - <xs:complexType name="QualifierType"> - <xs:sequence> - <xs:element name="Subject" type="xs:string" minOccurs="0"> - <xs:annotation> - <xs:documentation>Message subject text (informational)</xs:documentation> - </xs:annotation> - </xs:element> - <xs:element name="Service" type="xs:anyURI"> - <xs:annotation> - <xs:documentation>Distinct service in a certain business scenario context; in the XÖV context this is the "Dienste URI"</xs:documentation> - </xs:annotation> - </xs:element> - <xs:element name="BusinessScenario"> - <xs:annotation> - <xs:documentation>Domain qualifier, e.g. Meldewesen, XVergabe...</xs:documentation> - </xs:annotation> - <xs:complexType> - <xs:choice> - <xs:element name="Defined" type="oscimeta:KeyCodeType"/> - <xs:element name="Undefined" type="xs:normalizedString"/> - </xs:choice> - </xs:complexType> - </xs:element> - <xs:element name="MessageType"> - <xs:annotation> - <xs:documentation>Payload: Type of document or message. MessageTypes normally bound to specific BusinessScenario</xs:documentation> - </xs:annotation> - <xs:complexType> - <xs:complexContent> - <xs:extension base="oscimeta:KeyCodeType"> - <xs:attribute name="payloadSchema" type="oscimeta:NonEmptyURIType" use="required"/> - </xs:extension> - </xs:complexContent> - </xs:complexType> - </xs:element> - </xs:sequence> - </xs:complexType> - <xs:element name="DeliveryAttributes" type="oscimeta:DeliveryAttributesType"> - <xs:annotation> - <xs:documentation>Time stamps, receipts to be generated, service quality</xs:documentation> - </xs:annotation> - </xs:element> - <xs:element name="Originators" type="oscimeta:OriginatorsType"> - <xs:annotation> - <xs:documentation>Message originators and reply address</xs:documentation> - </xs:annotation> - </xs:element> - <xs:element name="Destinations" type="oscimeta:DestinationsType"> - <xs:annotation> - <xs:documentation>Actual and other destinations of Message</xs:documentation> - </xs:annotation> - </xs:element> - <xs:element name="MsgIdentification" type="oscimeta:MsgIdentificationType"> - <xs:annotation> - <xs:documentation>Message ID and Message relations</xs:documentation> - </xs:annotation> - </xs:element> - <xs:element name="Qualifier" type="oscimeta:QualifierType"> - <xs:annotation> - <xs:documentation>General payload properties, common to all scenarios</xs:documentation> - </xs:annotation> - </xs:element> - <xs:element name="MessageProperties"> - <xs:annotation> - <xs:documentation>Scenarios specific payload properties, to be agreed upon per scenario</xs:documentation> - </xs:annotation> - <xs:complexType> - <xs:sequence> - <xs:element name="Property" type="oscimeta:PropertyType" maxOccurs="unbounded"/> - </xs:sequence> - </xs:complexType> - </xs:element> - <xs:element name="Sender" type="oscimeta:PartyType"> - <xs:annotation> - <xs:documentation>Sending node, entry may be added by Sender node</xs:documentation> - </xs:annotation> - </xs:element> - <xs:element name="OtherDestinations"> - <xs:annotation> - <xs:documentation>Other destinations of message - informational, as known from e-mail</xs:documentation> - </xs:annotation> - <xs:complexType> - <xs:sequence> - <xs:element ref="oscimeta:OtherReaders" maxOccurs="unbounded"/> - <xs:element ref="oscimeta:CcReaders" minOccurs="0" maxOccurs="unbounded"/> - </xs:sequence> - </xs:complexType> - </xs:element> - <xs:element name="OtherReaders" type="oscimeta:PartyIdentifierType"/> - <xs:element name="CcReaders" type="oscimeta:PartyIdentifierType"> - <xs:annotation> - <xs:documentation>Destinations in cc role</xs:documentation> - </xs:annotation> - </xs:element> - <xs:element name="MessageMetaData"> - <xs:complexType> - <xs:sequence> - <xs:element ref="oscimeta:DeliveryAttributes"/> - <xs:element ref="oscimeta:Originators"/> - <xs:element ref="oscimeta:Destinations"/> - <xs:element ref="oscimeta:MsgIdentification"/> - <xs:element ref="oscimeta:Qualifier"/> - <xs:element ref="oscimeta:MessageProperties" minOccurs="0"/> - <xs:element name="MsgSize" type="xs:positiveInteger" minOccurs="0"> - <xs:annotation> - <xs:documentation>Message size in bytes</xs:documentation> - </xs:annotation> - </xs:element> - </xs:sequence> - <xs:attribute name="TestMsg" type="xs:boolean" default="false"> - <xs:annotation> - <xs:documentation>"true", if test-message; defaults to "false"</xs:documentation> - </xs:annotation> - </xs:attribute> - </xs:complexType> - </xs:element> -</xs:schema> diff --git a/xta-adapter/src/main/xsd/XTA-Webservice-Datentypen.xsd b/xta-adapter/src/main/xsd/XTA-Webservice-Datentypen.xsd deleted file mode 100644 index 69902b496a8396338b29823030e12d83288508be..0000000000000000000000000000000000000000 --- a/xta-adapter/src/main/xsd/XTA-Webservice-Datentypen.xsd +++ /dev/null @@ -1,544 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xta="http://xoev.de/transport/xta/211" xmlns:oscimeta="http://www.osci.eu/ws/2014/10/transport" xmlns:xoev-dt="http://xoev.de/schemata/basisdatentypen/1_1" targetNamespace="http://xoev.de/transport/xta/211" elementFormDefault="qualified" attributeFormDefault="unqualified" version="2.1.1"> - <xs:annotation> - <xs:documentation>Hier wird die Sammlung von Typen dargestellt, welche innerhalb des Standards XTA definiert und verwendet werden.</xs:documentation> - </xs:annotation> - <xs:import namespace="http://xoev.de/schemata/basisdatentypen/1_1" schemaLocation="xoev-basisdatentypen.xsd"/> - <xs:import namespace="http://www.osci.eu/ws/2014/10/transport" schemaLocation="OSCI_MessageMetaData_V2.02.xsd"/> - <xs:complexType name="AdditionalReportListType"> - <xs:annotation> - <xs:documentation>Dieser Typ gestattet das Ablegen weiterer Prüfberichte, welche das XTA-Protokoll (TransportReport) ergänzen sollen.</xs:documentation> - </xs:annotation> - <xs:sequence> - <xs:element name="Report" maxOccurs="unbounded"> - <xs:annotation> - <xs:documentation>In diesem Element ist ein zusätzlicher Report abgelegt, der das XTA-Protokoll (TransportReport) ergänzt. Die Art des Reports (z. B. OSCI Process Card) und der Inhalt des Reports werden bzw. sind in separaten Bereichen dieses Containers eingetragen.</xs:documentation> - </xs:annotation> - <xs:complexType> - <xs:sequence> - <xs:element name="Key" type="xta:Code.ReportType"> - <xs:annotation> - <xs:documentation>Dieses Element benennt den Typ des Reports, um dem Leser die Interpretation der Reportdaten zu ermöglichen. Die Benennung des Typs des Reports geschieht auf der Basis einer Codeliste.</xs:documentation> - </xs:annotation> - </xs:element> - <xs:element name="Data" type="xs:base64Binary"> - <xs:annotation> - <xs:documentation>Hier wird der zusätzliche Report in einem technisch neutralen Format eingetragen.</xs:documentation> - </xs:annotation> - </xs:element> - </xs:sequence> - </xs:complexType> - </xs:element> - </xs:sequence> - </xs:complexType> - <xs:complexType name="Code.Fehlernummer"> - <xs:annotation> - <xs:appinfo> - <listAgencyName>Koordinierungsstelle für IT-Standards (KoSIT)</listAgencyName> - <listName>XTA-WS Fehlernummer</listName> - </xs:appinfo> - <xs:documentation>Diese Codeliste gibt eine Übersicht über die in XTA-WS zu verwendenden Fehlernummern (ErrorCodes) und ordnet sie den Exceptions zu, in deren Kontext sie auftreten können.</xs:documentation> - </xs:annotation> - <xs:complexContent> - <xs:restriction base="xoev-dt:Code"> - <xs:sequence> - <xs:element name="code" type="xs:token" form="unqualified"/> - <xs:element name="name" type="xs:normalizedString" form="unqualified"/> - </xs:sequence> - <xs:attribute name="listURI" type="xs:anyURI" use="optional" fixed="urn:de:xta:webservice:codeliste:fehlernummer"/> - <xs:attribute name="listVersionID" type="xs:normalizedString" use="optional" fixed="1.0"/> - </xs:restriction> - </xs:complexContent> - </xs:complexType> - <xs:complexType name="Code.RecordType"> - <xs:annotation> - <xs:appinfo> - <listAgencyName>N.N.</listAgencyName> - <listName>Record Type</listName> - </xs:appinfo> - <xs:documentation>In diesen Typ ist eine auszuwählende bzw. selbst zu definierende Codeliste einzubinden, die Arten von Meldungen benennt, welche in das Protokoll zur Abarbeitung eines Transportauftrags (TransportReport) eingetragen werden. Dort können die Meldungen als Fehler-, Warn- oder Informationseinträge eingeordnet sein. -In die Attribute des vorliegenden Typs sind die Codelisten-URI und die Nummer der Version der ausgewählten Codeliste einzutragen. - -Die KoSIT hat die Absicht, für den Standard XTA eine passende Codeliste zu definieren und als einheitliches Angebot zur Einbindung für diesen Typ bereitzustellen. Diese Codeliste ist, wenn die Bereitstellung erfolgt ist, im XRepository (www.xrepository.de) unter der Codelisten-URI urn:de:xta:codeliste:record.type auffindbar und kann von dort im XML-Format OASIS Genericode abgerufen werden.</xs:documentation> - </xs:annotation> - <xs:complexContent> - <xs:restriction base="xoev-dt:Code"> - <xs:sequence> - <xs:element name="code" type="xs:token" form="unqualified"> - <xs:annotation> - <xs:documentation>In diesem Element ist ein Schlüssel aus der referenzierten Codeliste einzutragen.</xs:documentation> - </xs:annotation> - </xs:element> - </xs:sequence> - <xs:attribute name="listURI" type="xs:anyURI" use="required"> - <xs:annotation> - <xs:documentation>Hier wird die URI einer Codeliste eingetragen, die dadurch hier eingebunden ist. Es ist die Codeliste dafür auszuwählen, auf deren Basis der übermittelte Schlüssel durch den Leser der Nachricht interpretiert werden soll.</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="listVersionID" type="xs:normalizedString" use="required"> - <xs:annotation> - <xs:documentation>Die Version der Codeliste, welche der Interpretation des übermittelten Schlüssels zu Grunde gelegt werden soll.</xs:documentation> - </xs:annotation> - </xs:attribute> - </xs:restriction> - </xs:complexContent> - </xs:complexType> - <xs:complexType name="Code.ReportType"> - <xs:annotation> - <xs:appinfo> - <listAgencyName>N.N.</listAgencyName> - <listName>Report Type</listName> - </xs:appinfo> - <xs:documentation>Dieser Typ gestattet die Kennzeichnung der Art eines zusätzlichen Reports. Es wird eine zu wählende Codeliste eingebunden, die mögliche Arten von Reports nennt (spezielles Format, innerhalb oder außerhalb von XTA definiert), die in das XTA-Protokoll (TransportReport) eingefügt werden können. -Die KoSIT gibt für den Standard XTA eine Codeliste heraus, welche Einträge für einschlägige Arten von Reports auflistet. Diese Codeliste kann auf Antrag erweitert bzw. geändert werden. Sie ist durch XTA-konforme Systeme für übergreifende Prozesse zu verwenden. -Diese Codeliste ist im XRepository (www.xrepository.de) unter Nennung ihrer Codelisten-URI urn:de:xta:codeliste:report.type auffindbar und kann dort im XML-Format OASIS Genericode in der aktuellen Version abgerufen werden (ggf. sind auch frühere Versionen verfügbar). In die Attribute des vorliegenden Typs sind entsprechend ihre Codelisten-URI und die Nummer der ausgewählten Version einzutragen. -Für lokale Zwecke können XTA-Kommunikationspartner auch eigene Codelisten definieren (welche bilateral abgestimmte Reportformate benennen) und an dieser Stelle einbinden. In die Attribute des vorliegenden Typs werden dann Codelisten-URI und Versionsnummer der selbstdefinierten Codeliste eingetragen.</xs:documentation> - </xs:annotation> - <xs:complexContent> - <xs:restriction base="xoev-dt:Code"> - <xs:sequence> - <xs:element name="code" type="xs:token" form="unqualified"> - <xs:annotation> - <xs:documentation>In diesem Element ist ein Schlüssel aus der referenzierten Codeliste einzutragen.</xs:documentation> - </xs:annotation> - </xs:element> - </xs:sequence> - <xs:attribute name="listURI" type="xs:anyURI" use="required"> - <xs:annotation> - <xs:documentation>Hier wird die URI einer Codeliste eingetragen, die dadurch hier eingebunden ist. Es ist die Codeliste dafür auszuwählen, auf deren Basis der übermittelte Schlüssel durch den Leser der Nachricht interpretiert werden soll.</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="listVersionID" type="xs:normalizedString" use="required"> - <xs:annotation> - <xs:documentation>Die Version der Codeliste, welche der Interpretation des übermittelten Schlüssel zu Grunde gelegt werden soll.</xs:documentation> - </xs:annotation> - </xs:attribute> - </xs:restriction> - </xs:complexContent> - </xs:complexType> - <xs:complexType name="Code.ServiceParameterType"> - <xs:annotation> - <xs:appinfo> - <listAgencyName>N.N.</listAgencyName> - <listName>Service Parameter Type</listName> - </xs:appinfo> - <xs:documentation>Dieser Typ gestattet die Kennzeichnung der Art eines Parameters für die technische Erreichbarkeit des Dienstes, der adressiert werden soll. -Hier wird eine zu wählende Codeliste eingebunden, die mögliche Parameterarten nennt. -Die KoSIT gibt für den Standard XTA eine Codeliste heraus, welche einschlägige solcher Parameterarten auflistet. Diese Codeliste kann auf Antrag erweitert bzw. geändert werden. Sie ist durch XTA-konforme Systeme für übergreifende Prozesse zu verwenden. -Diese Codeliste ist im XRepository (www.xrepository.de) unter Nennung ihrer Codelisten-URI urn:de:xta:codeliste:service.parameter.type auffindbar und kann dort im XML-Format OASIS Genericode in der aktuellen Version abgerufen werden (ggf. sind auch frühere Versionen verfügbar). In die Attribute des vorliegenden Typs sind entsprechend ihre Codelisten-URI und die Nummer der ausgewählten Version einzutragen. -Für lokale Zwecke können XTA-Kommunikationspartner auch eigene Codelisten definieren (welche bilateral abgestimmte Parameterarten benennen) und an dieser Stelle einbinden. In die Attribute des vorliegenden Typs werden dann Codelisten-URI und Versionsnummer der selbstdefinierten Codeliste eingetragen.</xs:documentation> - </xs:annotation> - <xs:complexContent> - <xs:restriction base="xoev-dt:Code"> - <xs:sequence> - <xs:element name="code" type="xs:token" form="unqualified"> - <xs:annotation> - <xs:documentation>In diesem Element ist ein Schlüssel aus der referenzierten Codeliste einzutragen.</xs:documentation> - </xs:annotation> - </xs:element> - </xs:sequence> - <xs:attribute name="listURI" type="xs:anyURI" use="required"> - <xs:annotation> - <xs:documentation>Hier wird die URI einer Codeliste eingetragen, die dadurch hier eingebunden ist. Es ist die Codeliste dafür auszuwählen, auf deren Basis der übermittelte Schlüssel durch den Leser der Nachricht interpretiert werden soll.</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="listVersionID" type="xs:normalizedString" use="required"> - <xs:annotation> - <xs:documentation>Die Version der Codeliste, welche der Interpretation des übermittelten Schlüssel zu Grunde gelegt werden soll.</xs:documentation> - </xs:annotation> - </xs:attribute> - </xs:restriction> - </xs:complexContent> - </xs:complexType> - <xs:simpleType name="Codelist.Fehlernummer"> - <xs:annotation/> - <xs:restriction base="xs:token"> - <xs:enumeration value="9000"> - <xs:annotation> - <xs:appinfo> - <codeName>Unspezifizierter Fehler, als Freitext beschrieben</codeName> - </xs:appinfo> - </xs:annotation> - </xs:enumeration> - <xs:enumeration value="9010"> - <xs:annotation> - <xs:appinfo> - <codeName>Authentisierung/Zertifikat ist abgelaufen.</codeName> - </xs:appinfo> - <xs:documentation>PermissiondeniedException</xs:documentation> - </xs:annotation> - </xs:enumeration> - <xs:enumeration value="9011"> - <xs:annotation> - <xs:appinfo> - <codeName>Account ist gesperrt.</codeName> - </xs:appinfo> - <xs:documentation>PermissiondeniedException</xs:documentation> - </xs:annotation> - </xs:enumeration> - <xs:enumeration value="9012"> - <xs:annotation> - <xs:appinfo> - <codeName>Account nicht vorhanden.</codeName> - </xs:appinfo> - <xs:documentation>PermissiondeniedException</xs:documentation> - </xs:annotation> - </xs:enumeration> - <xs:enumeration value="9013"> - <xs:annotation> - <xs:appinfo> - <codeName>Dienst ist nicht gebucht.</codeName> - </xs:appinfo> - <xs:documentation>PermissiondeniedException</xs:documentation> - </xs:annotation> - </xs:enumeration> - <xs:enumeration value="9014"> - <xs:annotation> - <xs:appinfo> - <codeName>Authentisierung/Zertifikat passt nicht zur Absenderkennung.</codeName> - </xs:appinfo> - <xs:documentation>PermissiondeniedException</xs:documentation> - </xs:annotation> - </xs:enumeration> - <xs:enumeration value="9020"> - <xs:annotation> - <xs:appinfo> - <codeName>Keine Parameter vorhanden</codeName> - </xs:appinfo> - <xs:documentation>ParameterIsNotValidExeption</xs:documentation> - </xs:annotation> - </xs:enumeration> - <xs:enumeration value="9021"> - <xs:annotation> - <xs:appinfo> - <codeName>Keine gültige URI</codeName> - </xs:appinfo> - <xs:documentation>ParameterIsNotValidExeption</xs:documentation> - </xs:annotation> - </xs:enumeration> - <xs:enumeration value="9022"> - <xs:annotation> - <xs:appinfo> - <codeName>Ungültige Parameterkombination</codeName> - </xs:appinfo> - <xs:documentation>ParameterIsNotValidException</xs:documentation> - </xs:annotation> - </xs:enumeration> - <xs:enumeration value="9023"> - <xs:annotation> - <xs:appinfo> - <codeName>Die Nachricht überschreitet die Größenbeschränkung.</codeName> - </xs:appinfo> - <xs:documentation>ParameterIsNotValidException</xs:documentation> - </xs:annotation> - </xs:enumeration> - <xs:enumeration value="9024"> - <xs:annotation> - <xs:appinfo> - <codeName>MessageID ist bereits vergeben.</codeName> - </xs:appinfo> - <xs:documentation>ParameterIsNotValidException</xs:documentation> - </xs:annotation> - </xs:enumeration> - <xs:enumeration value="9030"> - <xs:annotation> - <xs:appinfo> - <codeName>Interner Fehler beim XTA-Server bzw. XTA-Dienstleister</codeName> - </xs:appinfo> - <xs:documentation>XTAWSTechnicalProblemException</xs:documentation> - </xs:annotation> - </xs:enumeration> - <xs:enumeration value="9031"> - <xs:annotation> - <xs:appinfo> - <codeName>Fehler beim externen Verzeichnisdienst</codeName> - </xs:appinfo> - <xs:documentation>XTAWSTechnicalProblemException</xs:documentation> - </xs:annotation> - </xs:enumeration> - <xs:enumeration value="9032"> - <xs:annotation> - <xs:appinfo> - <codeName>Fehler bei der Zustellung</codeName> - </xs:appinfo> - <xs:documentation>XTAWSTechnicalProblemException</xs:documentation> - </xs:annotation> - </xs:enumeration> - <xs:enumeration value="9050"> - <xs:annotation> - <xs:appinfo> - <codeName>Fachnachricht ist nicht schemakonform</codeName> - </xs:appinfo> - <xs:documentation>MessageSchemaViolationException</xs:documentation> - </xs:annotation> - </xs:enumeration> - <xs:enumeration value="9051"> - <xs:annotation> - <xs:appinfo> - <codeName>Fachnachricht trägt ein falsches Encoding.</codeName> - </xs:appinfo> - <xs:documentation>MessageSchemaViolationException</xs:documentation> - </xs:annotation> - </xs:enumeration> - <xs:enumeration value="9052"> - <xs:annotation> - <xs:appinfo> - <codeName>Nachricht verletzt das entsprechende Service Profil.</codeName> - </xs:appinfo> - <xs:documentation>MessageSchemaViolationException</xs:documentation> - </xs:annotation> - </xs:enumeration> - <xs:enumeration value="9060"> - <xs:annotation> - <xs:appinfo> - <codeName>Es wurde schadhafter Code ermittelt.</codeName> - </xs:appinfo> - <xs:documentation>MessageVirusDetectionException</xs:documentation> - </xs:annotation> - </xs:enumeration> - <xs:enumeration value="9070"> - <xs:annotation> - <xs:appinfo> - <codeName>MessageID für den Account nicht bekannt.</codeName> - </xs:appinfo> - <xs:documentation>InvalidMessageIDException</xs:documentation> - </xs:annotation> - </xs:enumeration> - <xs:enumeration value="9080"> - <xs:annotation> - <xs:appinfo> - <codeName>Der Dienst wird nur asynchron angeboten.</codeName> - </xs:appinfo> - <xs:documentation>SyncAsyncException</xs:documentation> - </xs:annotation> - </xs:enumeration> - <xs:enumeration value="9081"> - <xs:annotation> - <xs:appinfo> - <codeName>Der Dienst wird nur synchron angeboten.</codeName> - </xs:appinfo> - <xs:documentation>SyncAsyncException</xs:documentation> - </xs:annotation> - </xs:enumeration> - <xs:enumeration value="9100"> - <xs:annotation> - <xs:appinfo> - <codeName>Der durch den Schalter NotBefore gesetzte Termin ist -verstrichen.</codeName> - </xs:appinfo> - <xs:documentation>CancelDeniedException</xs:documentation> - </xs:annotation> - </xs:enumeration> - <xs:enumeration value="9101"> - <xs:annotation> - <xs:appinfo> - <codeName>Der Schalter NotBefore wurde nicht gesetzt.</codeName> - </xs:appinfo> - <xs:documentation>CancelDeniedException</xs:documentation> - </xs:annotation> - </xs:enumeration> - </xs:restriction> - </xs:simpleType> - <xs:complexType name="ContentType"> - <xs:annotation> - <xs:documentation>Typ für die technisch neutrale (base64-kodierte) Darstellung von Information. Enthält den base64-kodierten Inhalt (Fachnachricht), der zwischen WebService-Client und XTA-Server transportiert wird. Die Attribute sind der MIME-Spezifikation (RFC 2183) entnommen. -Die Belegung der Attribute ist für verschiedene Fachlichkeiten unterschiedlich und ist durch den Fachstandard festzulegen, der für die Fachnachricht verantwortlich ist.</xs:documentation> - </xs:annotation> - <xs:simpleContent> - <xs:extension base="xs:base64Binary"> - <xs:attribute name="contentDescription" type="oscimeta:NonEmptyStringType" use="optional"> - <xs:annotation> - <xs:documentation>Beschreibung des fachlichen Inhalts, z.B. 'Angebot' oder 'Rechnung'.</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="contentType" type="oscimeta:NonEmptyStringType" use="required"> - <xs:annotation> - <xs:documentation>Dieses Attribut nennt den MIME-Typ des enthaltenen Inhalts, hat also Einträge wie text/xml, text/plain, application/gzip oder application/pdf. Mandatorisch, weil besonders wichtige Information (wird in E-Mail analog gehandhabt).</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="encoding" type="oscimeta:NonEmptyStringType" use="optional"> - <xs:annotation> - <xs:documentation>Der Zeichensatz, der der Kodierung des Inhalts zugrunde gelegen hat.</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="filename" type="oscimeta:NonEmptyStringType" use="optional"> - <xs:annotation> - <xs:documentation>Der Dateiname der Datenquelle, falls der Inhalt einer Datei entnommen worden ist. Bsp.: Für die Übermittlung von xdomea-Nachrichten ist dieses Attribut Pflicht.</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="id" type="xs:ID" use="optional"> - <xs:annotation> - <xs:documentation>Bietet die Möglichkeit, den Inhalt über z.B. eine laufende Nummer zu referenzieren.</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="lang" type="xs:language" use="optional"> - <xs:annotation> - <xs:documentation>Sprache, in der der Inhalt formuliert ist.</xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="size" type="xs:positiveInteger" use="optional"> - <xs:annotation> - <xs:documentation>Die Größe des Inhalts in Bytes.</xs:documentation> - </xs:annotation> - </xs:attribute> - </xs:extension> - </xs:simpleContent> - </xs:complexType> - <xs:complexType name="IsServiceAvailableValueType"> - <xs:annotation> - <xs:documentation>Das Feld enthält die benötigten Attribute zum Ergebnis der Dienstanfrage: ob der Dienst angeboten wird oder nicht, oder ob diese Information generell nicht bekannt ist.</xs:documentation> - </xs:annotation> - <xs:choice> - <xs:element name="ServiceIsAvailable" type="xs:boolean"> - <xs:annotation> - <xs:documentation>Der Dienst wird angeboten (true) oder nicht angeboten (false).</xs:documentation> - </xs:annotation> - </xs:element> - <xs:element name="ServiceIsAvailableUnknown" type="xs:boolean" fixed="true"> - <xs:annotation> - <xs:documentation>Es ist nicht bekannt, ob der Dienst angeboten wird oder nicht.</xs:documentation> - </xs:annotation> - </xs:element> - </xs:choice> - </xs:complexType> - <xs:complexType name="LookupServiceResultType"> - <xs:annotation> - <xs:documentation>Das Ergebnis zu einer Dienstanfrage, das die Information enthält, ob der Dienst angeboten wird. Außerdem sind die nötigen technischen Paramter für die Erreichbarkeit vorhanden.</xs:documentation> - </xs:annotation> - <xs:complexContent> - <xs:extension base="xta:LookupServiceType"> - <xs:sequence> - <xs:element name="IsServiceAvailableValue" type="xta:IsServiceAvailableValueType"> - <xs:annotation> - <xs:documentation>Enthält das Ergebnis der Dienstanfrage: ob der Dienst angeboten wird oder nicht oder ob diese Information generell nicht bekannt ist.</xs:documentation> - </xs:annotation> - </xs:element> - <xs:element name="ServiceParameter" minOccurs="0" maxOccurs="unbounded"> - <xs:annotation> - <xs:documentation>Dieses Element enthält im Erfolgsfall die benötigten technischen Parameter für die elektronische Kommunikation mit dem Leser, z.B. das öffentliche Zertifikat des Lesers zur Inhaltsdatenverschlüsselung. Das Feld ist zu füllen, falls der angefragte Dienst angeboten und in diesem Kontext der Parameter benötigt wird. -Vom Fachszenario ist zu beschreiben, welche Parameter für die Erreichbarkeit der Dienste in diesem Fachszenario anzuwenden sind.</xs:documentation> - </xs:annotation> - <xs:complexType> - <xs:sequence> - <xs:element name="ParameterType" type="xta:Code.ServiceParameterType"> - <xs:annotation> - <xs:documentation>Dieses Element steht für die Art des Parameters, welche ins passende Kindelement einzutragen bzw. eingetragen ist. Die vorgesehenen Parameterarten werden auf der Basis einer Codeliste interpretiert, welche durch die Attribute listURI und listVersionID referenziert ist.</xs:documentation> - </xs:annotation> - </xs:element> - <xs:element name="Resource" type="xs:base64Binary"> - <xs:annotation> - <xs:documentation>Hier ist der Parameter enthalten bzw. einnzutragen in technisch neutraler Darstellung.</xs:documentation> - </xs:annotation> - </xs:element> - </xs:sequence> - </xs:complexType> - </xs:element> - </xs:sequence> - </xs:extension> - </xs:complexContent> - </xs:complexType> - <xs:complexType name="LookupServiceType"> - <xs:annotation> - <xs:documentation>Dies ist die Struktur einer Service-Anfrage: Sie enthält die Daten über den Diensteanbieter (Leser) und den Dienst des Lesers, den der Autor in Anspruch nehmen will. Diese Anfrage dient dazu, zu ermitteln, ob der Dienst von diesem Anbieter angeboten wird und über welche technischen Parameter er angesprochen werden kann.</xs:documentation> - </xs:annotation> - <xs:sequence> - <xs:element ref="oscimeta:Reader"> - <xs:annotation> - <xs:documentation>Dies ist die fachliche Identifizierung des Lesers. Der Wert entspricht z.B. dem DVDV-Behördenschlüssel.</xs:documentation> - </xs:annotation> - </xs:element> - <xs:element name="ServiceType" type="xs:anyURI"> - <xs:annotation> - <xs:documentation>Dies ist die Bezeichnung des anzufordernden Dienstes. Sie wird im Format einer URL übergeben, was den Vorteil hat, dass damit auch eine Versionsnummer eingeschlossen ist. Beispiel für Dienstebezeichnungen, wie sie im DVDV verwendet werden: http://www.osci.de/xmeld181/xmeld181Rueckmeldung.wsdl - - -Abgrenzung: "Dienst" ist das, was gemäß Diensteeinteilung der Fachdomäne im Verzeichnisdienst als Service (im Sinne eines Web Service) eingetragen ist. Dadurch ist die Dienstebezeichnung weniger differenziert als der Nachrichtentyp. Typischerweise sind im Verzeichnisdienst mehrere Nachrichtentypen in einer Service-WSDL zusammengefasst.</xs:documentation> - </xs:annotation> - </xs:element> - </xs:sequence> - </xs:complexType> - <xs:complexType name="MessageStatusType"> - <xs:annotation> - <xs:documentation>Gibt die Struktur für die Meldungen (Logging-Informationen) über den Transportverlauf vor. Er sieht Meldungszeilen für Infos, Warnungen und Fehler vor.</xs:documentation> - </xs:annotation> - <xs:sequence> - <xs:element name="Status" type="xs:integer"> - <xs:annotation> - <xs:documentation>Wird durch Sender bzw. Empfänger fortgeschrieben. Wird der TransportReport noch fortgeschrieben, wird er hier mit 0=offen markiert. Nach Abschluss des TransportReports wird nach dem Max-Prinzip der höchste Ampelstatus aus den Elementen ErrorList, WarnList, InfoList hier numerisch dargestellt. - - - - -0=offen: Die Nachricht befindet sich noch in der Verarbeitung. -1=grün: Es sind keine Fehler oder Warnungen aufgetreten. -2=gelb: Es sind Warnungen, aber keine kritischen Fehler aufgetreten. -3=rot: Es sind kritische Fehler aufgetreten.</xs:documentation> - </xs:annotation> - </xs:element> - <xs:element name="ErrorList" minOccurs="0"> - <xs:annotation> - <xs:documentation>Liste der Fehlermeldungen.</xs:documentation> - </xs:annotation> - <xs:complexType> - <xs:sequence> - <xs:element name="Error" type="xta:RecordType" minOccurs="0" maxOccurs="unbounded"> - <xs:annotation> - <xs:documentation>Hier wird die Fehlermeldung mit ihren Parametern eingetragen.</xs:documentation> - </xs:annotation> - </xs:element> - </xs:sequence> - </xs:complexType> - </xs:element> - <xs:element name="WarnList" minOccurs="0"> - <xs:annotation> - <xs:documentation>Liste der Warnungen.</xs:documentation> - </xs:annotation> - <xs:complexType> - <xs:sequence> - <xs:element name="Warning" type="xta:RecordType" minOccurs="0" maxOccurs="unbounded"> - <xs:annotation> - <xs:documentation>Hier wird die Warnung mit ihren Paramtern eingetragen.</xs:documentation> - </xs:annotation> - </xs:element> - </xs:sequence> - </xs:complexType> - </xs:element> - <xs:element name="InfoList" minOccurs="0"> - <xs:annotation> - <xs:documentation>Liste der Informationsmeldungen.</xs:documentation> - </xs:annotation> - <xs:complexType> - <xs:sequence> - <xs:element name="Info" type="xta:RecordType" minOccurs="0" maxOccurs="unbounded"> - <xs:annotation> - <xs:documentation>Hier wird die Informationsmeldung mit ihren Parametern eingetragen.</xs:documentation> - </xs:annotation> - </xs:element> - </xs:sequence> - </xs:complexType> - </xs:element> - </xs:sequence> - </xs:complexType> - <xs:complexType name="RecordType"> - <xs:annotation> - <xs:documentation>Der Typ zur Kennzeichnung und Erläuterung einer Meldung (anwendbar auf Info-, Fehlermeldungen und Warnungen).</xs:documentation> - </xs:annotation> - <xs:sequence> - <xs:element name="Timestamp" type="xs:dateTime"> - <xs:annotation> - <xs:documentation>Zeitstempel für den Zeitpunkt der Aufzeichnung der Meldung.</xs:documentation> - </xs:annotation> - </xs:element> - <xs:element name="Code" type="xta:Code.RecordType"> - <xs:annotation> - <xs:documentation>Schlüssel, der die Bedeutung der Meldung kodiert. Dieser Schlüssel muss aus einer eingebundenen Codeliste stammen.</xs:documentation> - </xs:annotation> - </xs:element> - <xs:element name="Reason" type="xs:string"> - <xs:annotation> - <xs:documentation>Hier wird zur weiteren Erläuterung der Grund der Meldung als Freitext eingetragen.</xs:documentation> - </xs:annotation> - </xs:element> - </xs:sequence> - </xs:complexType> -</xs:schema> diff --git a/xta-adapter/src/main/xsd/XTA-Webservice-Exceptions.xsd b/xta-adapter/src/main/xsd/XTA-Webservice-Exceptions.xsd deleted file mode 100644 index 65ab844aac9ea5a8f08f191873d9ecf9da94edfa..0000000000000000000000000000000000000000 --- a/xta-adapter/src/main/xsd/XTA-Webservice-Exceptions.xsd +++ /dev/null @@ -1,133 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xta="http://xoev.de/transport/xta/211" targetNamespace="http://xoev.de/transport/xta/211" version="2.1.1" elementFormDefault="qualified" attributeFormDefault="unqualified"> - <xs:annotation> - <xs:documentation>Hier wird die Sammlung von Typen dargestellt, welche innerhalb des Standards XTA verwendet werden, um SOAP Exceptions zu definieren und zu verwenden.</xs:documentation> - </xs:annotation> - <xs:include schemaLocation="XTA-Webservice-Datentypen.xsd" /> - <xs:complexType name="CancelDeniedExceptionType"> - <xs:annotation> - <xs:documentation>Dieser abgeleitete Typ wird vom zugehörigen Exception-Objeikt verwendet.</xs:documentation> - </xs:annotation> - <xs:complexContent> - <xs:extension base="xta:ExceptionType" /> - </xs:complexContent> - </xs:complexType> - <xs:complexType name="ExceptionType"> - <xs:annotation> - <xs:documentation>Dieser Datentyp legt die grundlegende Struktur einer Exception im Rahmen des XTA Webservice fest. Sie kapselt Information zu Identität und Bedeutung eines aufgetretenen Fehlers.</xs:documentation> - </xs:annotation> - <xs:sequence> - <xs:element name="errorCode" type="xta:Code.Fehlernummer"> - <xs:annotation> - <xs:documentation>In diesem Element werden Fehlernummer und Fehlertext übermittelt, die einen Fehler näher beschreiben (gemäß verlinkter Codeliste). -In das Unterelement code ist die Fehlernummer einzutragen, ins Unterelement name die entsprechende textuelle Repräsentation.</xs:documentation> - </xs:annotation> - </xs:element> - </xs:sequence> - </xs:complexType> - <xs:complexType name="InvalidMessageIDExceptionType"> - <xs:annotation> - <xs:documentation>Dieser abgeleitete Typ wird vom zugehörigen Exception-Objekt verwendet.</xs:documentation> - </xs:annotation> - <xs:complexContent> - <xs:extension base="xta:ExceptionType" /> - </xs:complexContent> - </xs:complexType> - <xs:complexType name="MessageSchemaViolationExceptionType"> - <xs:annotation> - <xs:documentation>Dieser abgeleitete Typ wird vom zugehörigen Exception-Objekt verwendet.</xs:documentation> - </xs:annotation> - <xs:complexContent> - <xs:extension base="xta:ExceptionType" /> - </xs:complexContent> - </xs:complexType> - <xs:complexType name="MessageVirusDetectionExceptionType"> - <xs:annotation> - <xs:documentation>Dieser abgeleitete Typ wird vom zugehörigen Exception-Objekt verwendet.</xs:documentation> - </xs:annotation> - <xs:complexContent> - <xs:extension base="xta:ExceptionType" /> - </xs:complexContent> - </xs:complexType> - <xs:complexType name="ParameterIsNotValidExceptionType"> - <xs:annotation> - <xs:documentation>Dieser abgeleitete Typ wird vom zugehörigen Exception-Objekt verwendet.</xs:documentation> - </xs:annotation> - <xs:complexContent> - <xs:extension base="xta:ExceptionType" /> - </xs:complexContent> - </xs:complexType> - <xs:complexType name="PermissionDeniedExceptionType"> - <xs:annotation> - <xs:documentation>Dieser abgeleitete Typ wird vom zugehörigen Exception-Objekt verwendet.</xs:documentation> - </xs:annotation> - <xs:complexContent> - <xs:extension base="xta:ExceptionType" /> - </xs:complexContent> - </xs:complexType> - <xs:complexType name="SyncAsyncExceptionType"> - <xs:annotation> - <xs:documentation>Dieser abgeleitete Typ wird vom zugehörigen Exception-Objekt verwendet.</xs:documentation> - </xs:annotation> - <xs:complexContent> - <xs:extension base="xta:ExceptionType" /> - </xs:complexContent> - </xs:complexType> - <xs:complexType name="XTAWSTechnicalProblemExceptionType"> - <xs:annotation> - <xs:documentation>Dieser abgeleitete Typ wird vom zugehörigen Exception-Objekt verwendet.</xs:documentation> - </xs:annotation> - <xs:complexContent> - <xs:extension base="xta:ExceptionType" /> - </xs:complexContent> - </xs:complexType> - <xs:element name="CancelDeniedException" type="xta:CancelDeniedExceptionType"> - <xs:annotation> - <xs:documentation>Diese Exception wird geworfen, falls die Methode cancelMessage aufgerufen wurde, aber der Transportauftrag aus einem der folgenden Gründe nicht zurückgezogen werden kann: - - Der bei Erteilung des Transportauftrags über den Schalter NotBefore gesetzte Termin ist erreicht. - -Der Schalter NotBefore wurde bei Erteilung des Transportauftrags nicht gesetzt.</xs:documentation> - </xs:annotation> - </xs:element> - <xs:element name="InvalidMessageIDException" type="xta:InvalidMessageIDExceptionType"> - <xs:annotation> - <xs:documentation>Diese Exception wird geworfen, wenn in einem gegebenen Kontext die anhand der ID bezeichnete Nachricht nicht bekannt ist, also beispielsweise nicht geliefert werden kann.</xs:documentation> - </xs:annotation> - </xs:element> - <xs:element name="MessageSchemaViolationException" type="xta:MessageSchemaViolationExceptionType"> - <xs:annotation> - <xs:documentation>Diese Exception wird geworfen, wenn eine Fachnachricht nicht der jeweiligen Schema-Definition entspricht.</xs:documentation> - </xs:annotation> - </xs:element> - <xs:element name="MessageVirusDetectionException" type="xta:MessageVirusDetectionExceptionType"> - <xs:annotation> - <xs:documentation>Diese Exception wird geworfen, wenn schadhafter Code in einem der übergebenen Container ermittelt wurde.</xs:documentation> - </xs:annotation> - </xs:element> - <xs:element name="ParameterIsNotValidException" type="xta:ParameterIsNotValidExceptionType"> - <xs:annotation> - <xs:documentation>Diese Fehlermeldung wird geworfen, wenn ein Parameter nicht korrekt an die Methode übergeben wurde.</xs:documentation> - </xs:annotation> - </xs:element> - <xs:element name="PermissionDeniedException" type="xta:PermissionDeniedExceptionType"> - <xs:annotation> - <xs:documentation>Diese Exception wird geworfen, wenn der Account gesperrt oder nicht vorhanden ist.</xs:documentation> - </xs:annotation> - </xs:element> - <xs:element name="SyncAsyncException" type="xta:SyncAsyncExceptionType"> - <xs:annotation> - <xs:documentation>Diese Exception wird geworfen falls dem XTA-Webservice - - eine Nachricht, die nur für die synchrone Weiterleitung gültig ist, für die asynchrone Weiterleitung übergeben wurde oder - -eine Nachricht für die synchrone Weiterleitung übergeben wurde, die nur für die asynchrone Weiterleitung gültig ist.</xs:documentation> - </xs:annotation> - </xs:element> - <xs:element name="XTAWSTechnicalProblemException" type="xta:XTAWSTechnicalProblemExceptionType"> - <xs:annotation> - <xs:documentation>Diese Exception wird allgemein geworfen, wenn ein technisches Problem im XTA-WS aufgetreten ist. Sie kann z. B. durch ein Problem beim Zugriff auf die interne Datenbank des XTA-Servers ausgelöst worden sein.</xs:documentation> - </xs:annotation> - </xs:element> -</xs:schema> - diff --git a/xta-adapter/src/main/xsd/XTA-Webservice-Globale-Elemente.xsd b/xta-adapter/src/main/xsd/XTA-Webservice-Globale-Elemente.xsd deleted file mode 100644 index 96d58300040856f9cae771e1936fe0b09e9e9c96..0000000000000000000000000000000000000000 --- a/xta-adapter/src/main/xsd/XTA-Webservice-Globale-Elemente.xsd +++ /dev/null @@ -1,137 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xta="http://xoev.de/transport/xta/211" xmlns:oscimeta="http://www.osci.eu/ws/2014/10/transport" xmlns:xenc="http://www.w3.org/2001/04/xmlenc#" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" targetNamespace="http://xoev.de/transport/xta/211" elementFormDefault="qualified" attributeFormDefault="unqualified" version="2.1.1"> - <xs:annotation> - <xs:documentation>Dies ist die Liste der globalen Elemente, welche durch die Operationen des XTA-WS verwendet werden .</xs:documentation> - </xs:annotation> - <xs:include schemaLocation="XTA-Webservice-Datentypen.xsd"/> - <xs:import namespace="http://www.w3.org/2001/04/xmlenc#" schemaLocation="xenc-schema.xsd"/> - <xs:import namespace="http://www.osci.eu/ws/2014/10/transport" schemaLocation="OSCI_MessageMetaData_V2.02.xsd"/> - <xs:import namespace="http://www.w3.org/2000/09/xmldsig#" schemaLocation="xmldsig-core-schema.xsd"/> - <xs:element name="GenericContentContainer"> - <xs:annotation> - <xs:documentation>Der GenericContentContainer nimmt den zu transportierenden oder abzuliefernden Inhalt auf, z.B. eine XÖV-Nachricht mit ihren Anlagen. Diese Inhalte können unverschlüsselt (Element ContentContainer) oder auch verschlüsselt (Element xenc:EncryptedData) hinterlegt werden. Die Verschlüsselung an dieser Stelle eignet sich für Ende-zu-Ende-Verschlüsselung durch den Autor, wenn dieses Objekt durch den Autor erstellt wird.</xs:documentation> - </xs:annotation> - <xs:complexType> - <xs:choice> - <xs:element ref="xenc:EncryptedData"> - <xs:annotation> - <xs:documentation>Dieses Objekt ist dafür vorgesehen, den Container-Inhalt verschlüsselt zu hinterlegen. Im entschlüsselten Zustand müssen die Daten dem Schwester-Element ContentContainer entsprechen.</xs:documentation> - </xs:annotation> - </xs:element> - <xs:element name="ContentContainer"> - <xs:annotation> - <xs:documentation>Der ContentContainer enthält genau eine Nachricht (Element Message) und null bis beliebig viele Anlagen, die alle in technisch neutraler Darstellung (base64-kodiert) eingefügt werden (Element Attachment). Die Gesamtgröße des Containers darf 40 MB nicht überschreiten.</xs:documentation> - </xs:annotation> - <xs:complexType> - <xs:sequence> - <xs:element name="Message" type="xta:ContentType"> - <xs:annotation> - <xs:documentation>Enthält den base64-kodierten Inhalt, der zwischen WebService-Client und XTA-Server transportiert wird. Die Attribute sind der MIME-Spezifikation (RFC 2183) entnommen. -Die zu übermittelnde Nachricht als primärer Inhalt dieses Containers ist optional durch Anhänge (Element Attachment) zu ergänzen. -In die Attribute wird je nach Kontext Metainformation zur Nachricht eingetragen.</xs:documentation> - </xs:annotation> - </xs:element> - <xs:element name="Attachment" type="xta:ContentType" minOccurs="0" maxOccurs="unbounded"> - <xs:annotation> - <xs:documentation>Hier können optional ergänzende Anhänge zur übermittelnden Nachricht eingefügt werden. -Die Attribute transportieren je nach Kontext Metainformation zum enthaltenen Anhang.</xs:documentation> - </xs:annotation> - </xs:element> - </xs:sequence> - </xs:complexType> - </xs:element> - </xs:choice> - </xs:complexType> - </xs:element> - <xs:element name="LookupServiceRequest"> - <xs:annotation> - <xs:documentation>Dies ist eine Liste von Dienstanfragen. -Jede Anfrage dient dazu, zu ermitteln, ob der Dienst von diesem Anbieter angeboten wird, und über welche technischen Parameter er angesprochen werden kann.</xs:documentation> - </xs:annotation> - <xs:complexType> - <xs:sequence> - <xs:element name="LookupServiceRequestList" maxOccurs="unbounded"> - <xs:annotation> - <xs:documentation>Dies ist die Struktur für eine Liste von Dienstanfragen.</xs:documentation> - </xs:annotation> - <xs:complexType> - <xs:sequence> - <xs:element name="LookupService" type="xta:LookupServiceType"> - <xs:annotation> - <xs:documentation>Dies ist eine Service-Anfrage. Sie enthält Daten zum potentiellen Diensteanbieter (Leser) und dem Dienst, der angefragt werden soll. Diese Anfrage dient dazu, zu ermitteln, ob der Dienst von diesem Anbieter angeboten wird, und über welche technischen Parameter er angesprochen werden kann.</xs:documentation> - </xs:annotation> - </xs:element> - </xs:sequence> - </xs:complexType> - </xs:element> - </xs:sequence> - </xs:complexType> - </xs:element> - <xs:element name="LookupServiceResponse"> - <xs:annotation> - <xs:documentation>Dies ist das Ergebnis zu einer Liste von Dienstanfragen, also eine Liste von Dienstanfrageergebnissen. Die Anfrage wird jeweils zitiert und das zugehörige Ergebnis ausgegeben.</xs:documentation> - </xs:annotation> - <xs:complexType> - <xs:sequence> - <xs:element name="LookupServiceResultList"> - <xs:annotation> - <xs:documentation>Die Struktur einer Liste von Dienstanfrageergebnissen.</xs:documentation> - </xs:annotation> - <xs:complexType> - <xs:sequence> - <xs:element name="LookupServiceResult" type="xta:LookupServiceResultType" nillable="true" maxOccurs="unbounded"> - <xs:annotation> - <xs:documentation>Dies ist die Struktur der Liste von Ergebnissen zur Liste von Diensteanfragen.</xs:documentation> - </xs:annotation> - </xs:element> - </xs:sequence> - </xs:complexType> - </xs:element> - </xs:sequence> - </xs:complexType> - </xs:element> - <xs:element name="TransportReport"> - <xs:annotation> - <xs:documentation>Der TransportReport ist die Struktur des durch XTA standardisierten Transportprotokolls. Neben den übermittelten Nachrichten ruft das Fachverfahren (in den Rollen Autor und Leser) über den Webservice-Client Zusatzinformationen über den Transportauftrag und die Transportereignisse vom XTA-WS ab. - - Um Autor und Leser die Möglichkeit zu geben, die Abarbeitung ihrer Transportaufträge zu überwachen, erstellen Sender und Empfänger Transportprotokolle, die in einer XML-Struktur des Typs TransportReport dargestellt und für Abruf und Auswertung bereit liegen. - -Die Datenstruktur aggregiert die Information zum erteilten Transportauftrag, zum Verlauf des sich anschließenden Transports einschließlich Zertifikatsüberprüfungen mit Ergebnissen.</xs:documentation> - </xs:annotation> - <xs:complexType> - <xs:sequence> - <xs:element ref="oscimeta:MessageMetaData"> - <xs:annotation> - <xs:documentation>Dieser Container umfasst alle Daten des Transportauftrags, auf dessen Ausführung sich der TransportReport bezieht. Zu den Informationen gehören die Identifizierung von Absender und (einem oder mehreren) Empfängern, Metainformation zu Inhalt und Identität der zu transportierenden Fachnachricht (Payload) sowie weitere Attribute, die Auslieferung, Quittungen und Service Qualität betreffen. -Weitere Informationen zu diesem Objekt sind in zu finden.</xs:documentation> - </xs:annotation> - </xs:element> - <xs:element name="ReportTime" type="xs:dateTime"> - <xs:annotation> - <xs:documentation>Zeitpunkt der letzten Aktualisierung des Protokolls. Ist bei Fortschreibung des Protokolls zu überschreiben.</xs:documentation> - </xs:annotation> - </xs:element> - <xs:element name="XTAServerIdentity" type="xs:token"> - <xs:annotation> - <xs:documentation>Hier protokolliert der den TransportReport erstellende Prozess seine Identität als Software-Instanz, indem er z.B. die Server-IP-Adresse oder die URI seines XTA-WS einträgt.</xs:documentation> - </xs:annotation> - </xs:element> - <xs:element name="MessageStatus" type="xta:MessageStatusType"> - <xs:annotation> - <xs:documentation>Enthält Information über den Veraluf des Transports. Es werden hier Listen mit aufgetretenen Fehler-, Warnungs- und Informationsmeldungen geführt. Außerdem ist nach Schließung des Transportauftrags im Feld Status eine "Schnell-Info" verfügbar.</xs:documentation> - </xs:annotation> - </xs:element> - <xs:element name="AdditionalReports" type="xta:AdditionalReportListType" minOccurs="0"> - <xs:annotation> - <xs:documentation>Hier sind weitere Prüfberichte abgelegt bzw. abzulegen, welche das XTA-Protokoll (TransportReport) ergänzen sollen.</xs:documentation> - </xs:annotation> - </xs:element> - <xs:element ref="ds:Signature" minOccurs="0"> - <xs:annotation> - <xs:documentation>Falls der TransportReport signiert ist, findet sich hier die Signatur.</xs:documentation> - </xs:annotation> - </xs:element> - </xs:sequence> - </xs:complexType> - </xs:element> -</xs:schema> diff --git a/xta-adapter/src/main/xsd/oasis-200401-wss-wssecurity-secext-1.0.xsd b/xta-adapter/src/main/xsd/oasis-200401-wss-wssecurity-secext-1.0.xsd deleted file mode 100644 index 1794066fd507e25a494479573430214d6b847b10..0000000000000000000000000000000000000000 --- a/xta-adapter/src/main/xsd/oasis-200401-wss-wssecurity-secext-1.0.xsd +++ /dev/null @@ -1,195 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -OASIS takes no position regarding the validity or scope of any intellectual property or other rights that might be claimed to pertain to the implementation or use of the technology described in this document or the extent to which any license under such rights might or might not be available; neither does it represent that it has made any effort to identify any such rights. Information on OASIS's procedures with respect to rights in OASIS specifications can be found at the OASIS website. Copies of claims of rights made available for publication and any assurances of licenses to be made available, or the result of an attempt made to obtain a general license or permission for the use of such proprietary rights by implementors or users of this specification, can be obtained from the OASIS Executive Director. -OASIS invites any interested party to bring to its attention any copyrights, patents or patent applications, or other proprietary rights which may cover technology that may be required to implement this specification. Please address the information to the OASIS Executive Director. -Copyright © OASIS Open 2002-2004. All Rights Reserved. -This document and translations of it may be copied and furnished to others, and derivative works that comment on or otherwise explain it or assist in its implementation may be prepared, copied, published and distributed, in whole or in part, without restriction of any kind, provided that the above copyright notice and this paragraph are included on all such copies and derivative works. However, this document itself does not be modified in any way, such as by removing the copyright notice or references to OASIS, except as needed for the purpose of developing OASIS specifications, in which case the procedures for copyrights defined in the OASIS Intellectual Property Rights document must be followed, or as required to translate it into languages other than English. -The limited permissions granted above are perpetual and will not be revoked by OASIS or its successors or assigns. -This document and the information contained herein is provided on an “AS IS” basis and OASIS DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. ---> -<xsd:schema targetNamespace="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope" xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" elementFormDefault="qualified" attributeFormDefault="unqualified" blockDefault="#all" version="0.2"> - <xsd:import namespace="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" schemaLocation="oasis-200401-wss-wssecurity-utility-1.0.xsd"/> - <xsd:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="xml.xsd"/> - <xsd:import namespace="http://www.w3.org/2000/09/xmldsig#" schemaLocation="xmldsig-core-schema.xsd"/> - <xsd:complexType name="AttributedString"> - <xsd:annotation> - <xsd:documentation>This type represents an element with arbitrary attributes.</xsd:documentation> - </xsd:annotation> - <xsd:simpleContent> - <xsd:extension base="xsd:string"> - <xsd:attribute ref="wsu:Id"/> - <xsd:anyAttribute namespace="##other" processContents="lax"/> - </xsd:extension> - </xsd:simpleContent> - </xsd:complexType> - <xsd:complexType name="PasswordString"> - <xsd:annotation> - <xsd:documentation>This type is used for password elements per Section 4.1.</xsd:documentation> - </xsd:annotation> - <xsd:simpleContent> - <xsd:extension base="wsse:AttributedString"> - <xsd:attribute name="Type" type="xsd:anyURI"/> - </xsd:extension> - </xsd:simpleContent> - </xsd:complexType> - <xsd:complexType name="EncodedString"> - <xsd:annotation> - <xsd:documentation>This type is used for elements containing stringified binary data.</xsd:documentation> - </xsd:annotation> - <xsd:simpleContent> - <xsd:extension base="wsse:AttributedString"> - <xsd:attribute name="EncodingType" type="xsd:anyURI"/> - </xsd:extension> - </xsd:simpleContent> - </xsd:complexType> - <xsd:complexType name="UsernameTokenType"> - <xsd:annotation> - <xsd:documentation>This type represents a username token per Section 4.1</xsd:documentation> - </xsd:annotation> - <xsd:sequence> - <xsd:element name="Username" type="wsse:AttributedString"/> - <xsd:any processContents="lax" minOccurs="0" maxOccurs="unbounded"/> - </xsd:sequence> - <xsd:attribute ref="wsu:Id"/> - <xsd:anyAttribute namespace="##other" processContents="lax"/> - </xsd:complexType> - <xsd:complexType name="BinarySecurityTokenType"> - <xsd:annotation> - <xsd:documentation>A security token that is encoded in binary</xsd:documentation> - </xsd:annotation> - <xsd:simpleContent> - <xsd:extension base="wsse:EncodedString"> - <xsd:attribute name="ValueType" type="xsd:anyURI"/> - </xsd:extension> - </xsd:simpleContent> - </xsd:complexType> - <xsd:complexType name="KeyIdentifierType"> - <xsd:annotation> - <xsd:documentation>A security token key identifier</xsd:documentation> - </xsd:annotation> - <xsd:simpleContent> - <xsd:extension base="wsse:EncodedString"> - <xsd:attribute name="ValueType" type="xsd:anyURI"/> - </xsd:extension> - </xsd:simpleContent> - </xsd:complexType> - <xsd:simpleType name="tUsage"> - <xsd:annotation> - <xsd:documentation>Typedef to allow a list of usages (as URIs).</xsd:documentation> - </xsd:annotation> - <xsd:list itemType="xsd:anyURI"/> - </xsd:simpleType> - <xsd:attribute name="Usage" type="tUsage"> - <xsd:annotation> - <xsd:documentation>This global attribute is used to indicate the usage of a referenced or indicated token within the containing context</xsd:documentation> - </xsd:annotation> - </xsd:attribute> - <xsd:complexType name="ReferenceType"> - <xsd:annotation> - <xsd:documentation>This type represents a reference to an external security token.</xsd:documentation> - </xsd:annotation> - <xsd:attribute name="URI" type="xsd:anyURI"/> - <xsd:attribute name="ValueType" type="xsd:anyURI"/> - <xsd:anyAttribute namespace="##other" processContents="lax"/> - </xsd:complexType> - <xsd:complexType name="EmbeddedType"> - <xsd:annotation> - <xsd:documentation>This type represents a reference to an embedded security token.</xsd:documentation> - </xsd:annotation> - <xsd:choice minOccurs="0" maxOccurs="unbounded"> - <xsd:any processContents="lax"/> - </xsd:choice> - <xsd:attribute name="ValueType" type="xsd:anyURI"/> - <xsd:anyAttribute namespace="##other" processContents="lax"/> - </xsd:complexType> - <xsd:complexType name="SecurityTokenReferenceType"> - <xsd:annotation> - <xsd:documentation>This type is used reference a security token.</xsd:documentation> - </xsd:annotation> - <xsd:choice minOccurs="0" maxOccurs="unbounded"> - <xsd:any processContents="lax"/> - </xsd:choice> - <xsd:attribute ref="wsu:Id"/> - <xsd:attribute ref="wsse:Usage"/> - <xsd:anyAttribute namespace="##other" processContents="lax"/> - </xsd:complexType> - <xsd:complexType name="SecurityHeaderType"> - <xsd:annotation> - <xsd:documentation>This complexType defines header block to use for security-relevant data directed at a specific SOAP actor.</xsd:documentation> - </xsd:annotation> - <xsd:sequence> - <xsd:any processContents="lax" minOccurs="0" maxOccurs="unbounded"> - <xsd:annotation> - <xsd:documentation>The use of "any" is to allow extensibility and different forms of security data.</xsd:documentation> - </xsd:annotation> - </xsd:any> - </xsd:sequence> - <xsd:anyAttribute namespace="##other" processContents="lax"/> - </xsd:complexType> - <xsd:complexType name="TransformationParametersType"> - <xsd:annotation> - <xsd:documentation>This complexType defines a container for elements to be specified from any namespace as properties/parameters of a DSIG transformation.</xsd:documentation> - </xsd:annotation> - <xsd:sequence> - <xsd:any processContents="lax" minOccurs="0" maxOccurs="unbounded"> - <xsd:annotation> - <xsd:documentation>The use of "any" is to allow extensibility from any namespace.</xsd:documentation> - </xsd:annotation> - </xsd:any> - </xsd:sequence> - <xsd:anyAttribute namespace="##other" processContents="lax"/> - </xsd:complexType> - <xsd:element name="UsernameToken" type="wsse:UsernameTokenType"> - <xsd:annotation> - <xsd:documentation>This element defines the wsse:UsernameToken element per Section 4.1.</xsd:documentation> - </xsd:annotation> - </xsd:element> - <xsd:element name="BinarySecurityToken" type="wsse:BinarySecurityTokenType"> - <xsd:annotation> - <xsd:documentation>This element defines the wsse:BinarySecurityToken element per Section 4.2.</xsd:documentation> - </xsd:annotation> - </xsd:element> - <xsd:element name="Reference" type="wsse:ReferenceType"> - <xsd:annotation> - <xsd:documentation>This element defines a security token reference</xsd:documentation> - </xsd:annotation> - </xsd:element> - <xsd:element name="Embedded" type="wsse:EmbeddedType"> - <xsd:annotation> - <xsd:documentation>This element defines a security token embedded reference</xsd:documentation> - </xsd:annotation> - </xsd:element> - <xsd:element name="KeyIdentifier" type="wsse:KeyIdentifierType"> - <xsd:annotation> - <xsd:documentation>This element defines a key identifier reference</xsd:documentation> - </xsd:annotation> - </xsd:element> - <xsd:element name="SecurityTokenReference" type="wsse:SecurityTokenReferenceType"> - <xsd:annotation> - <xsd:documentation>This element defines the wsse:SecurityTokenReference per Section 4.3.</xsd:documentation> - </xsd:annotation> - </xsd:element> - <xsd:element name="Security" type="wsse:SecurityHeaderType"> - <xsd:annotation> - <xsd:documentation>This element defines the wsse:Security SOAP header element per Section 4.</xsd:documentation> - </xsd:annotation> - </xsd:element> - <xsd:element name="TransformationParameters" type="wsse:TransformationParametersType"> - <xsd:annotation> - <xsd:documentation>This element contains properties for transformations from any namespace, including DSIG.</xsd:documentation> - </xsd:annotation> - </xsd:element> - <xsd:element name="Password" type="wsse:PasswordString"/> - <xsd:element name="Nonce" type="wsse:EncodedString"/> - <xsd:simpleType name="FaultcodeEnum"> - <xsd:restriction base="xsd:QName"> - <xsd:enumeration value="wsse:UnsupportedSecurityToken"/> - <xsd:enumeration value="wsse:UnsupportedAlgorithm"/> - <xsd:enumeration value="wsse:InvalidSecurity"/> - <xsd:enumeration value="wsse:InvalidSecurityToken"/> - <xsd:enumeration value="wsse:FailedAuthentication"/> - <xsd:enumeration value="wsse:FailedCheck"/> - <xsd:enumeration value="wsse:SecurityTokenUnavailable"/> - </xsd:restriction> - </xsd:simpleType> -</xsd:schema> diff --git a/xta-adapter/src/main/xsd/oasis-200401-wss-wssecurity-utility-1.0.xsd b/xta-adapter/src/main/xsd/oasis-200401-wss-wssecurity-utility-1.0.xsd deleted file mode 100644 index c213dd06cd666becaf965318bce654b1e8aae06a..0000000000000000000000000000000000000000 --- a/xta-adapter/src/main/xsd/oasis-200401-wss-wssecurity-utility-1.0.xsd +++ /dev/null @@ -1,108 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -OASIS takes no position regarding the validity or scope of any intellectual property or other rights that might be claimed to pertain to the implementation or use of the technology described in this document or the extent to which any license under such rights might or might not be available; neither does it represent that it has made any effort to identify any such rights. Information on OASIS's procedures with respect to rights in OASIS specifications can be found at the OASIS website. Copies of claims of rights made available for publication and any assurances of licenses to be made available, or the result of an attempt made to obtain a general license or permission for the use of such proprietary rights by implementors or users of this specification, can be obtained from the OASIS Executive Director. -OASIS invites any interested party to bring to its attention any copyrights, patents or patent applications, or other proprietary rights which may cover technology that may be required to implement this specification. Please address the information to the OASIS Executive Director. -Copyright © OASIS Open 2002-2004. All Rights Reserved. -This document and translations of it may be copied and furnished to others, and derivative works that comment on or otherwise explain it or assist in its implementation may be prepared, copied, published and distributed, in whole or in part, without restriction of any kind, provided that the above copyright notice and this paragraph are included on all such copies and derivative works. However, this document itself does not be modified in any way, such as by removing the copyright notice or references to OASIS, except as needed for the purpose of developing OASIS specifications, in which case the procedures for copyrights defined in the OASIS Intellectual Property Rights document must be followed, or as required to translate it into languages other than English. -The limited permissions granted above are perpetual and will not be revoked by OASIS or its successors or assigns. -This document and the information contained herein is provided on an “AS IS” basis and OASIS DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. ---> -<xsd:schema targetNamespace="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:xsd="http://www.w3.org/2001/XMLSchema" - - - -xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" -elementFormDefault="qualified" attributeFormDefault="unqualified" version="0.1"> - <!-- // Fault Codes /////////////////////////////////////////// --> - <xsd:simpleType name="tTimestampFault"> - <xsd:annotation> - <xsd:documentation> -This type defines the fault code value for Timestamp message expiration. - </xsd:documentation> - </xsd:annotation> - <xsd:restriction base="xsd:QName"> - <xsd:enumeration value="wsu:MessageExpired"/> - </xsd:restriction> - </xsd:simpleType> - <!-- // Global attributes //////////////////////////////////// --> - <xsd:attribute name="Id" type="xsd:ID"> - <xsd:annotation> - <xsd:documentation> -This global attribute supports annotating arbitrary elements with an ID. - </xsd:documentation> - </xsd:annotation> - </xsd:attribute> - <xsd:attributeGroup name="commonAtts"> - <xsd:annotation> - <xsd:documentation> -Convenience attribute group used to simplify this schema. - </xsd:documentation> - </xsd:annotation> - <xsd:attribute ref="wsu:Id" use="optional"/> - <xsd:anyAttribute namespace="##other" processContents="lax"/> - </xsd:attributeGroup> - <!-- // Utility types //////////////////////////////////////// --> - <xsd:complexType name="AttributedDateTime"> - <xsd:annotation> - <xsd:documentation> -This type is for elements whose [children] is a psuedo-dateTime and can have arbitrary attributes. - </xsd:documentation> - </xsd:annotation> - <xsd:simpleContent> - <xsd:extension base="xsd:string"> - <xsd:attributeGroup ref="wsu:commonAtts"/> - </xsd:extension> - </xsd:simpleContent> - </xsd:complexType> - <xsd:complexType name="AttributedURI"> - <xsd:annotation> - <xsd:documentation> -This type is for elements whose [children] is an anyURI and can have arbitrary attributes. - </xsd:documentation> - </xsd:annotation> - <xsd:simpleContent> - <xsd:extension base="xsd:anyURI"> - <xsd:attributeGroup ref="wsu:commonAtts"/> - </xsd:extension> - </xsd:simpleContent> - </xsd:complexType> - <!-- // Timestamp header components /////////////////////////// --> - <xsd:complexType name="TimestampType"> - <xsd:annotation> - <xsd:documentation> -This complex type ties together the timestamp related elements into a composite type. - </xsd:documentation> - </xsd:annotation> - <xsd:sequence> - <xsd:element ref="wsu:Created" minOccurs="0"/> - <xsd:element ref="wsu:Expires" minOccurs="0"/> - <xsd:choice minOccurs="0" maxOccurs="unbounded"> - <xsd:any namespace="##other" processContents="lax"/> - </xsd:choice> - </xsd:sequence> - <xsd:attributeGroup ref="wsu:commonAtts"/> - </xsd:complexType> - <xsd:element name="Timestamp" type="wsu:TimestampType"> - <xsd:annotation> - <xsd:documentation> -This element allows Timestamps to be applied anywhere element wildcards are present, -including as a SOAP header. - </xsd:documentation> - </xsd:annotation> - </xsd:element> - <!-- global element decls to allow individual elements to appear anywhere --> - <xsd:element name="Expires" type="wsu:AttributedDateTime"> - <xsd:annotation> - <xsd:documentation> -This element allows an expiration time to be applied anywhere element wildcards are present. - </xsd:documentation> - </xsd:annotation> - </xsd:element> - <xsd:element name="Created" type="wsu:AttributedDateTime"> - <xsd:annotation> - <xsd:documentation> -This element allows a creation time to be applied anywhere element wildcards are present. - </xsd:documentation> - </xsd:annotation> - </xsd:element> -</xsd:schema> diff --git a/xta-adapter/src/main/xsd/soap-envelope.xsd b/xta-adapter/src/main/xsd/soap-envelope.xsd deleted file mode 100644 index d181431df643b84da403a65e9211b554ff489555..0000000000000000000000000000000000000000 --- a/xta-adapter/src/main/xsd/soap-envelope.xsd +++ /dev/null @@ -1,127 +0,0 @@ -<!-- Schema defined in the SOAP Version 1.2 Part 1 specification - Recommendation: - http://www.w3.org/TR/2003/REC-soap12-part1-20030624/ - $Id: soap-envelope.xsd,v 1.1 2013/01/22 15:18:58 lindemann Exp $ - - Copyright (C)2003 W3C(R) (MIT, ERCIM, Keio), All Rights Reserved. - W3C viability, trademark, document use and software licensing rules - apply. - http://www.w3.org/Consortium/Legal/ - - This document is governed by the W3C Software License [1] as - described in the FAQ [2]. - - [1] http://www.w3.org/Consortium/Legal/copyright-software-19980720 - [2] http://www.w3.org/Consortium/Legal/IPR-FAQ-20000620.html#DTD ---> -<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://www.w3.org/2003/05/soap-envelope" xmlns:xml="http://www.w3.org/XML/1998/namespace" targetNamespace="http://www.w3.org/2003/05/soap-envelope" elementFormDefault="qualified"> - <xs:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="xml.xsd"/> - <!-- Envelope, header and body --> - <xs:element name="Envelope" type="tns:Envelope"/> - <xs:complexType name="Envelope"> - <xs:sequence> - <xs:element ref="tns:Header" minOccurs="0"/> - <xs:element ref="tns:Body"/> - </xs:sequence> - <xs:anyAttribute namespace="##other" processContents="lax"/> - </xs:complexType> - <xs:element name="Header" type="tns:Header"/> - <xs:complexType name="Header"> - <xs:annotation> - <xs:documentation> - Elements replacing the wildcard MUST be namespace qualified, but can be in the targetNamespace - </xs:documentation> - </xs:annotation> - <xs:sequence> - <xs:any namespace="##any" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> - </xs:sequence> - <xs:anyAttribute namespace="##other" processContents="lax"/> - </xs:complexType> - <xs:element name="Body" type="tns:Body"/> - <xs:complexType name="Body"> - <xs:sequence> - <xs:any namespace="##any" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> - </xs:sequence> - <xs:anyAttribute namespace="##other" processContents="lax"/> - </xs:complexType> - <!-- Global Attributes. The following attributes are intended to be - usable via qualified attribute names on any complex type referencing - them. --> - <xs:attribute name="mustUnderstand" type="xs:boolean" default="0"/> - <xs:attribute name="relay" type="xs:boolean" default="0"/> - <xs:attribute name="role" type="xs:anyURI"/> - <!-- 'encodingStyle' indicates any canonicalization conventions - followed in the contents of the containing element. For example, the - value 'http://www.w3.org/2003/05/soap-encoding' indicates the pattern - described in the SOAP Version 1.2 Part 2: Adjuncts Recommendation --> - <xs:attribute name="encodingStyle" type="xs:anyURI"/> - <xs:element name="Fault" type="tns:Fault"/> - <xs:complexType name="Fault" final="extension"> - <xs:annotation> - <xs:documentation> - Fault reporting structure - </xs:documentation> - </xs:annotation> - <xs:sequence> - <xs:element name="Code" type="tns:faultcode"/> - <xs:element name="Reason" type="tns:faultreason"/> - <xs:element name="Node" type="xs:anyURI" minOccurs="0"/> - <xs:element name="Role" type="xs:anyURI" minOccurs="0"/> - <xs:element name="Detail" type="tns:detail" minOccurs="0"/> - </xs:sequence> - </xs:complexType> - <xs:complexType name="faultreason"> - <xs:sequence> - <xs:element name="Text" type="tns:reasontext" maxOccurs="unbounded"/> - </xs:sequence> - </xs:complexType> - <xs:complexType name="reasontext"> - <xs:simpleContent> - <xs:extension base="xs:string"> - <xs:attribute ref="xml:lang" use="required"/> - </xs:extension> - </xs:simpleContent> - </xs:complexType> - <xs:complexType name="faultcode"> - <xs:sequence> - <xs:element name="Value" type="tns:faultcodeEnum"/> - <xs:element name="Subcode" type="tns:subcode" minOccurs="0"/> - </xs:sequence> - </xs:complexType> - <xs:simpleType name="faultcodeEnum"> - <xs:restriction base="xs:QName"> - <xs:enumeration value="tns:DataEncodingUnknown"/> - <xs:enumeration value="tns:MustUnderstand"/> - <xs:enumeration value="tns:Receiver"/> - <xs:enumeration value="tns:Sender"/> - <xs:enumeration value="tns:VersionMismatch"/> - </xs:restriction> - </xs:simpleType> - <xs:complexType name="subcode"> - <xs:sequence> - <xs:element name="Value" type="xs:QName"/> - <xs:element name="Subcode" type="tns:subcode" minOccurs="0"/> - </xs:sequence> - </xs:complexType> - <xs:complexType name="detail"> - <xs:sequence> - <xs:any namespace="##any" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> - </xs:sequence> - <xs:anyAttribute namespace="##other" processContents="lax"/> - </xs:complexType> - <!-- Global element declaration and complex type definition for header entry returned due to a mustUnderstand fault --> - <xs:element name="NotUnderstood" type="tns:NotUnderstoodType"/> - <xs:complexType name="NotUnderstoodType"> - <xs:attribute name="qname" type="xs:QName" use="required"/> - </xs:complexType> - <!-- Global element and associated types for managing version transition as described in Appendix A of the SOAP Version 1.2 Part 1 Recommendation --> - <xs:complexType name="SupportedEnvType"> - <xs:attribute name="qname" type="xs:QName" use="required"/> - </xs:complexType> - <xs:element name="Upgrade" type="tns:UpgradeType"/> - <xs:complexType name="UpgradeType"> - <xs:sequence> - <xs:element name="SupportedEnvelope" type="tns:SupportedEnvType" maxOccurs="unbounded"/> - </xs:sequence> - </xs:complexType> -</xs:schema> diff --git a/xta-adapter/src/main/xsd/ws-addr-wsdl.xsd b/xta-adapter/src/main/xsd/ws-addr-wsdl.xsd deleted file mode 100644 index 949b0119ee42ab2292810e929b9a86ed0e6c5e5d..0000000000000000000000000000000000000000 --- a/xta-adapter/src/main/xsd/ws-addr-wsdl.xsd +++ /dev/null @@ -1,60 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!--<!DOCTYPE xs:schema PUBLIC "-//W3C//DTD XMLSCHEMA 200102//EN" "http://www.w3.org/2001/XMLSchema.dtd">--> -<!-- - W3C XML Schema defined in the Web Services Addressing 1.0 - - WSDL Binding specification - http://www.w3.org/TR/ws-addr-core - - Copyright © 2006 World Wide Web Consortium, - - (Massachusetts Institute of Technology, European Research Consortium for - Informatics and Mathematics, Keio University). All Rights Reserved. This - work is distributed under the W3C® Software License [1] in the hope that - it will be useful, but WITHOUT ANY WARRANTY; without even the implied - warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - [1] http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231 - - $Id: ws-addr-wsdl.xsd,v 1.2 2006/05/12 09:46:04 hugo Exp $ ---> -<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://www.w3.org/2006/05/addressing/wsdl" targetNamespace="http://www.w3.org/2006/05/addressing/wsdl" elementFormDefault="qualified" blockDefault="#all"> - <xs:element name="ServiceName" type="tns:ServiceNameType"/> - <xs:complexType name="ServiceNameType"> - <xs:simpleContent> - <xs:extension base="xs:QName"> - <xs:attribute name="EndpointName" type="xs:NCName" use="optional"/> - <xs:anyAttribute namespace="##other" processContents="lax"/> - </xs:extension> - </xs:simpleContent> - </xs:complexType> - <xs:element name="InterfaceName" type="tns:AttributedQNameType"/> - <xs:complexType name="AttributedQNameType"> - <xs:simpleContent> - <xs:extension base="xs:QName"> - <xs:anyAttribute namespace="##other" processContents="lax"/> - </xs:extension> - </xs:simpleContent> - </xs:complexType> - <xs:attribute name="Action" type="xs:anyURI"/> - <xs:element name="UsingAddressing"> - <xs:complexType> - <xs:anyAttribute namespace="##other" processContents="lax"/> - </xs:complexType> - </xs:element> - <xs:simpleType name="AnonymousType"> - <xs:restriction base="xs:token"> - <xs:enumeration value="optional"/> - <xs:enumeration value="required"/> - <xs:enumeration value="prohibited"/> - </xs:restriction> - </xs:simpleType> - <xs:element name="Anonymous"> - <xs:complexType> - <xs:simpleContent> - <xs:extension base="tns:AnonymousType"> - <xs:anyAttribute namespace="##other" processContents="lax"/> - </xs:extension> - </xs:simpleContent> - </xs:complexType> - </xs:element> -</xs:schema> diff --git a/xta-adapter/src/main/xsd/ws-addr.xsd b/xta-adapter/src/main/xsd/ws-addr.xsd deleted file mode 100644 index e9a5bde8acffcf913609f9c296c13ec8dcef15e3..0000000000000000000000000000000000000000 --- a/xta-adapter/src/main/xsd/ws-addr.xsd +++ /dev/null @@ -1,126 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!--!DOCTYPE xs:schema PUBLIC "-//W3C//DTD XMLSCHEMA 200102//EN" "http://www.w3.org/2001/XMLSchema.dtd">--> -<!-- - W3C XML Schema defined in the Web Services Addressing 1.0 specification - http://www.w3.org/TR/ws-addr-core - - Copyright © 2005 World Wide Web Consortium, - - (Massachusetts Institute of Technology, European Research Consortium for - Informatics and Mathematics, Keio University). All Rights Reserved. This - work is distributed under the W3C® Software License [1] in the hope that - it will be useful, but WITHOUT ANY WARRANTY; without even the implied - warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - [1] http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231 - - $Id: ws-addr.xsd,v 1.2 2013/01/22 15:18:58 lindemann Exp $ ---> -<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://www.w3.org/2005/08/addressing" targetNamespace="http://www.w3.org/2005/08/addressing" elementFormDefault="qualified" attributeFormDefault="unqualified" blockDefault="#all"> - <!-- Constructs from the WS-Addressing Core --> - <xs:element name="EndpointReference" type="tns:EndpointReferenceType"/> - <xs:complexType name="EndpointReferenceType" mixed="false"> - <xs:sequence> - <xs:element name="Address" type="tns:AttributedURIType"/> - <xs:element name="ReferenceParameters" type="tns:ReferenceParametersType" minOccurs="0"/> - <xs:element ref="tns:Metadata" minOccurs="0"/> - <xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> - </xs:sequence> - <xs:anyAttribute namespace="##other" processContents="lax"/> - </xs:complexType> - <xs:complexType name="ReferenceParametersType" mixed="false"> - <xs:sequence> - <xs:any namespace="##any" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> - </xs:sequence> - <xs:anyAttribute namespace="##other" processContents="lax"/> - </xs:complexType> - <xs:element name="Metadata" type="tns:MetadataType"/> - <xs:complexType name="MetadataType" mixed="false"> - <xs:sequence> - <xs:any namespace="##any" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> - </xs:sequence> - <xs:anyAttribute namespace="##other" processContents="lax"/> - </xs:complexType> - <xs:element name="MessageID" type="tns:AttributedURIType"/> - <xs:element name="RelatesTo" type="tns:RelatesToType"/> - <xs:complexType name="RelatesToType" mixed="false"> - <xs:simpleContent> - <xs:extension base="xs:anyURI"> - <xs:attribute name="RelationshipType" type="tns:RelationshipTypeOpenEnum" use="optional" default="http://www.w3.org/2005/08/addressing/reply"/> - <xs:anyAttribute namespace="##other" processContents="lax"/> - </xs:extension> - </xs:simpleContent> - </xs:complexType> - <xs:simpleType name="RelationshipTypeOpenEnum"> - <xs:union memberTypes="tns:RelationshipType xs:anyURI"/> - </xs:simpleType> - <xs:simpleType name="RelationshipType"> - <xs:restriction base="xs:anyURI"> - <xs:enumeration value="http://www.w3.org/2005/08/addressing/reply"/> - </xs:restriction> - </xs:simpleType> - <xs:element name="ReplyTo" type="tns:EndpointReferenceType"/> - <xs:element name="From" type="tns:EndpointReferenceType"/> - <xs:element name="FaultTo" type="tns:EndpointReferenceType"/> - <xs:element name="To" type="tns:AttributedURIType"/> - <xs:element name="Action" type="tns:AttributedURIType"/> - <xs:complexType name="AttributedURIType" mixed="false"> - <xs:simpleContent> - <xs:extension base="xs:anyURI"> - <xs:anyAttribute namespace="##other" processContents="lax"/> - </xs:extension> - </xs:simpleContent> - </xs:complexType> - <!-- Constructs from the WS-Addressing SOAP binding --> - <xs:attribute name="IsReferenceParameter" type="xs:boolean"/> - <xs:simpleType name="FaultCodesOpenEnumType"> - <xs:union memberTypes="tns:FaultCodesType xs:QName"/> - </xs:simpleType> - <xs:simpleType name="FaultCodesType"> - <xs:restriction base="xs:QName"> - <xs:enumeration value="tns:InvalidAddressingHeader"/> - <xs:enumeration value="tns:InvalidAddress"/> - <xs:enumeration value="tns:InvalidEPR"/> - <xs:enumeration value="tns:InvalidCardinality"/> - <xs:enumeration value="tns:MissingAddressInEPR"/> - <xs:enumeration value="tns:DuplicateMessageID"/> - <xs:enumeration value="tns:ActionMismatch"/> - <xs:enumeration value="tns:MessageAddressingHeaderRequired"/> - <xs:enumeration value="tns:DestinationUnreachable"/> - <xs:enumeration value="tns:ActionNotSupported"/> - <xs:enumeration value="tns:EndpointUnavailable"/> - </xs:restriction> - </xs:simpleType> - <xs:element name="RetryAfter" type="tns:AttributedUnsignedLongType"/> - <xs:complexType name="AttributedUnsignedLongType" mixed="false"> - <xs:simpleContent> - <xs:extension base="xs:unsignedLong"> - <xs:anyAttribute namespace="##other" processContents="lax"/> - </xs:extension> - </xs:simpleContent> - </xs:complexType> - <xs:element name="ProblemHeaderQName" type="tns:AttributedQNameType"/> - <xs:complexType name="AttributedQNameType" mixed="false"> - <xs:simpleContent> - <xs:extension base="xs:QName"> - <xs:anyAttribute namespace="##other" processContents="lax"/> - </xs:extension> - </xs:simpleContent> - </xs:complexType> - <xs:element name="ProblemHeader" type="tns:AttributedAnyType"/> - <xs:complexType name="AttributedAnyType" mixed="false"> - <xs:sequence> - <xs:any namespace="##any" processContents="lax"/> - </xs:sequence> - <xs:anyAttribute namespace="##other" processContents="lax"/> - </xs:complexType> - <xs:element name="ProblemIRI" type="tns:AttributedURIType"/> - <xs:element name="ProblemAction" type="tns:ProblemActionType"/> - <xs:complexType name="ProblemActionType" mixed="false"> - <xs:sequence> - <xs:element ref="tns:Action" minOccurs="0"/> - <xs:element name="SoapAction" type="xs:anyURI" minOccurs="0"/> - </xs:sequence> - <xs:anyAttribute namespace="##other" processContents="lax"/> - </xs:complexType> -</xs:schema> diff --git a/xta-adapter/src/main/xsd/ws-policy.xsd b/xta-adapter/src/main/xsd/ws-policy.xsd deleted file mode 100644 index 7f0b7bb37698359b8863fc5e31d6cebca1752606..0000000000000000000000000000000000000000 --- a/xta-adapter/src/main/xsd/ws-policy.xsd +++ /dev/null @@ -1,141 +0,0 @@ -<?xml version='1.0' encoding='utf-8' ?> -<!-- - - W3C XML Schema defined in the Web Services Policy 1.5 - Framework specification - - http://www.w3.org/TR/ws-policy-framework - - Copyright © 2006 World Wide Web Consortium, - - (Massachusetts Institute of Technology, European Research Consortium for - Informatics and Mathematics, Keio University). All Rights Reserved. This - work is distributed under the W3C® Software License [1] in the hope that - it will be useful, but WITHOUT ANY WARRANTY; without even the implied - warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - [1] http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231 - - $Id: ws-policy.xsd,v 1.2 2013/01/22 15:18:58 lindemann Exp $ ---> -<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" - xmlns:tns="http://www.w3.org/ns/ws-policy" - xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" - xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" - targetNamespace="http://www.w3.org/ns/ws-policy" blockDefault="#all" - elementFormDefault="qualified"> - - <xs:import - namespace="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" - schemaLocation="oasis-200401-wss-wssecurity-secext-1.0.xsd" /> - - <xs:import - namespace="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" - schemaLocation="oasis-200401-wss-wssecurity-utility-1.0.xsd" /> - - <xs:import - namespace="http://www.w3.org/XML/1998/namespace" - schemaLocation="xml.xsd" /> - - <!-- Constructs from the Web Services Policy 1.5 Framework --> - - <xs:element name="Policy" > - <xs:complexType> - - <xs:complexContent> - <xs:extension base="tns:OperatorContentType" > - <xs:attribute name="Name" type="xs:anyURI" /> - <xs:anyAttribute namespace="##any" processContents="lax" /> - </xs:extension> - </xs:complexContent> - </xs:complexType> - </xs:element> - - <xs:element name="All" type="tns:OperatorContentType" /> - <xs:element name="ExactlyOne" type="tns:OperatorContentType" /> - - <xs:complexType name="OperatorContentType" > - <xs:sequence> - <xs:choice minOccurs="0" maxOccurs="unbounded" > - <xs:element ref="tns:Policy" /> - <xs:element ref="tns:All" /> - <xs:element ref="tns:ExactlyOne" /> - - <xs:element ref="tns:PolicyReference" /> - <xs:any namespace="##other" processContents="lax" /> - </xs:choice> - </xs:sequence> - </xs:complexType> - - <xs:element name="PolicyReference" > - <xs:complexType> - <xs:sequence> - <xs:any namespace="##any" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> - </xs:sequence> - <xs:attribute name="URI" type="xs:anyURI" use="required" /> - - <xs:attribute name="Digest" type="xs:base64Binary" /> - <xs:attribute name="DigestAlgorithm" - type="xs:anyURI" - default="http://www.w3.org/ns/ws-policy/Sha1Exc" - /> - <xs:anyAttribute namespace="##any" processContents="lax" /> - </xs:complexType> - </xs:element> - - <xs:attribute name="Optional" type="xs:boolean" default="false" /> - <xs:attribute name="Ignorable" type="xs:boolean" default="false" /> - - <!-- Constructs from the Web Services Policy 1.5 Attachment --> - - <xs:attribute name="PolicyURIs" > - <xs:simpleType> - <xs:list itemType="xs:anyURI" /> - </xs:simpleType> - </xs:attribute> - - <xs:element name="PolicyAttachment" > - <xs:complexType> - <xs:sequence> - - <xs:element ref="tns:AppliesTo" /> - <xs:choice maxOccurs="unbounded" > - <xs:element ref="tns:Policy" /> - <xs:element ref="tns:PolicyReference" /> - </xs:choice> - <!-- omitted only because it causes the content model to be non-determistic - <xs:element ref="wsse:Security" minOccurs="0" /> ---> - <xs:any namespace="##other" - processContents="lax" - minOccurs="0" - maxOccurs="unbounded" /> - </xs:sequence> - <xs:anyAttribute namespace="##any" processContents="lax" /> - - </xs:complexType> - </xs:element> - - <xs:element name="AppliesTo" > - <xs:complexType> - <xs:sequence> - <xs:any namespace="##any" - processContents="lax" - maxOccurs="unbounded" /> - </xs:sequence> - <xs:anyAttribute namespace="##any" processContents="lax" /> - - </xs:complexType> - </xs:element> - - <xs:element name="URI"> - <xs:complexType> - <xs:simpleContent> - <xs:extension base="xs:anyURI"> - <xs:anyAttribute namespace="##any" processContents="lax" /> - </xs:extension> - </xs:simpleContent> - </xs:complexType> - </xs:element> - -</xs:schema> diff --git a/xta-adapter/src/main/xsd/xenc-schema.xsd b/xta-adapter/src/main/xsd/xenc-schema.xsd deleted file mode 100644 index 3f0b4bf0ea7da044dcee9eeda9bd1a1e21a018a8..0000000000000000000000000000000000000000 --- a/xta-adapter/src/main/xsd/xenc-schema.xsd +++ /dev/null @@ -1,126 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:xenc="http://www.w3.org/2001/04/xmlenc#" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" targetNamespace="http://www.w3.org/2001/04/xmlenc#" elementFormDefault="qualified" version="1.0"> - <import namespace='http://www.w3.org/2000/09/xmldsig#' schemaLocation='xmldsig-core-schema.xsd'/> - <complexType name="EncryptedType" abstract="true"> - <sequence> - <element name="EncryptionMethod" type="xenc:EncryptionMethodType" minOccurs="0"/> - <element ref="ds:KeyInfo" minOccurs="0"/> - <element ref="xenc:CipherData"/> - <element ref="xenc:EncryptionProperties" minOccurs="0"/> - </sequence> - <attribute name="Id" type="ID" use="optional"/> - <attribute name="Type" type="anyURI" use="optional"/> - <attribute name="MimeType" type="string" use="optional"/> - <attribute name="Encoding" type="anyURI" use="optional"/> - </complexType> - <complexType name="EncryptionMethodType" mixed="true"> - <sequence> - <element name="KeySize" type="xenc:KeySizeType" minOccurs="0"/> - <element name="OAEPparams" type="base64Binary" minOccurs="0"/> - <!-- note that optional xenc11:MGF element may be used here for - RSA-OAEP, when appropriate --> - <any namespace="##other" minOccurs="0" maxOccurs="unbounded"/> - </sequence> - <attribute name="Algorithm" type="anyURI" use="required"/> - </complexType> - <simpleType name="KeySizeType"> - <restriction base="integer"/> - </simpleType> - <element name="CipherData" type="xenc:CipherDataType"/> - <complexType name="CipherDataType"> - <choice> - <element name="CipherValue" type="base64Binary"/> - <element ref="xenc:CipherReference"/> - </choice> - </complexType> - <element name="CipherReference" type="xenc:CipherReferenceType"/> - <complexType name="CipherReferenceType"> - <choice> - <element name="Transforms" type="xenc:TransformsType" minOccurs="0"/> - </choice> - <attribute name="URI" type="anyURI" use="required"/> - </complexType> - <complexType name="TransformsType"> - <sequence> - <element ref="ds:Transform" maxOccurs="unbounded"/> - </sequence> - </complexType> - <element name="EncryptedData" type="xenc:EncryptedDataType"/> - <complexType name="EncryptedDataType"> - <complexContent> - <extension base="xenc:EncryptedType"/> - </complexContent> - </complexType> - <!-- Children of ds:KeyInfo --> - <element name="EncryptedKey" type="xenc:EncryptedKeyType"/> - <complexType name="EncryptedKeyType"> - <complexContent> - <extension base="xenc:EncryptedType"> - <sequence> - <element ref="xenc:ReferenceList" minOccurs="0"/> - <element name="CarriedKeyName" type="string" minOccurs="0"/> - </sequence> - <attribute name="Recipient" type="string" use="optional"/> - </extension> - </complexContent> - </complexType> - <element name="AgreementMethod" type="xenc:AgreementMethodType"/> - <complexType name="AgreementMethodType" mixed="true"> - <sequence> - <element name="KA-Nonce" type="base64Binary" minOccurs="0"/> - <!-- <element ref="ds:DigestMethod" minOccurs="0"/> --> - <any namespace="##other" minOccurs="0" maxOccurs="unbounded"/> - <element name="OriginatorKeyInfo" type="ds:KeyInfoType" minOccurs="0"/> - <element name="RecipientKeyInfo" type="ds:KeyInfoType" minOccurs="0"/> - </sequence> - <attribute name="Algorithm" type="anyURI" use="required"/> - </complexType> - <!-- End Children of ds:KeyInfo --> - <element name="ReferenceList"> - <complexType> - <choice maxOccurs="unbounded"> - <element name="DataReference" type="xenc:ReferenceType"/> - <element name="KeyReference" type="xenc:ReferenceType"/> - </choice> - </complexType> - </element> - <complexType name="ReferenceType"> - <sequence> - <any namespace="##other" minOccurs="0" maxOccurs="unbounded"/> - </sequence> - <attribute name="URI" type="anyURI" use="required"/> - </complexType> - <element name="EncryptionProperties" type="xenc:EncryptionPropertiesType"/> - <complexType name="EncryptionPropertiesType"> - <sequence> - <element ref="xenc:EncryptionProperty" maxOccurs="unbounded"/> - </sequence> - <attribute name="Id" type="ID" use="optional"/> - </complexType> - <element name="EncryptionProperty" type="xenc:EncryptionPropertyType"/> - <complexType name="EncryptionPropertyType" mixed="true"> - <choice maxOccurs="unbounded"> - <any namespace="##other" processContents="lax"/> - </choice> - <attribute name="Target" type="anyURI" use="optional"/> - <attribute name="Id" type="ID" use="optional"/> - <anyAttribute namespace="http://www.w3.org/XML/1998/namespace"/> - </complexType> - <!-- Children of ds:KeyValue --> - <element name="DHKeyValue" type="xenc:DHKeyValueType"/> - <complexType name="DHKeyValueType"> - <sequence> - <sequence minOccurs="0"> - <element name="P" type="ds:CryptoBinary"/> - <element name="Q" type="ds:CryptoBinary"/> - <element name="Generator" type="ds:CryptoBinary"/> - </sequence> - <element name="Public" type="ds:CryptoBinary"/> - <sequence minOccurs="0"> - <element name="seed" type="ds:CryptoBinary"/> - <element name="pgenCounter" type="ds:CryptoBinary"/> - </sequence> - </sequence> - </complexType> - <!-- End Children of ds:KeyValue --> -</schema> diff --git a/xta-adapter/src/main/xsd/xml.xsd b/xta-adapter/src/main/xsd/xml.xsd deleted file mode 100644 index 77bfc7afb0cac830ee2ffd10258b19e16b3a09d4..0000000000000000000000000000000000000000 --- a/xta-adapter/src/main/xsd/xml.xsd +++ /dev/null @@ -1,145 +0,0 @@ -<?xml version='1.0'?> -<xs:schema targetNamespace="http://www.w3.org/XML/1998/namespace" xmlns:xs="http://www.w3.org/2001/XMLSchema" xml:lang="en"> - - <xs:annotation> - <xs:documentation> - See http://www.w3.org/XML/1998/namespace.html and - http://www.w3.org/TR/REC-xml for information about this namespace. - - This schema document describes the XML namespace, in a form - suitable for import by other schema documents. - - Note that local names in this namespace are intended to be defined - only by the World Wide Web Consortium or its subgroups. The - following names are currently defined in this namespace and should - not be used with conflicting semantics by any Working Group, - specification, or document instance: - - base (as an attribute name): denotes an attribute whose value - provides a URI to be used as the base for interpreting any - relative URIs in the scope of the element on which it - appears; its value is inherited. This name is reserved - by virtue of its definition in the XML Base specification. - - id (as an attribute name): denotes an attribute whose value - should be interpreted as if declared to be of type ID. - This name is reserved by virtue of its definition in the - xml:id specification. - - lang (as an attribute name): denotes an attribute whose value - is a language code for the natural language of the content of - any element; its value is inherited. This name is reserved - by virtue of its definition in the XML specification. - - space (as an attribute name): denotes an attribute whose - value is a keyword indicating what whitespace processing - discipline is intended for the content of the element; its - value is inherited. This name is reserved by virtue of its - definition in the XML specification. - - Father (in any context at all): denotes Jon Bosak, the chair of - the original XML Working Group. This name is reserved by - the following decision of the W3C XML Plenary and - XML Coordination groups: - - In appreciation for his vision, leadership and dedication - the W3C XML Plenary on this 10th day of February, 2000 - reserves for Jon Bosak in perpetuity the XML name - xml:Father - </xs:documentation> - </xs:annotation> - - <xs:annotation> - <xs:documentation>This schema defines attributes and an attribute group - suitable for use by - schemas wishing to allow xml:base, xml:lang, xml:space or xml:id - attributes on elements they define. - - To enable this, such a schema must import this schema - for the XML namespace, e.g. as follows: - <schema . . .> - . . . - <import namespace="http://www.w3.org/XML/1998/namespace" - schemaLocation="http://www.w3.org/2001/xml.xsd"/> - - Subsequently, qualified reference to any of the attributes - or the group defined below will have the desired effect, e.g. - - <type . . .> - . . . - <attributeGroup ref="xml:specialAttrs"/> - - will define a type which will schema-validate an instance - element with any of those attributes</xs:documentation> - </xs:annotation> - - <xs:annotation> - <xs:documentation>In keeping with the XML Schema WG's standard versioning - policy, this schema document will persist at - http://www.w3.org/2007/08/xml.xsd. - At the date of issue it can also be found at - http://www.w3.org/2001/xml.xsd. - The schema document at that URI may however change in the future, - in order to remain compatible with the latest version of XML Schema - itself, or with the XML namespace itself. In other words, if the XML - Schema or XML namespaces change, the version of this document at - http://www.w3.org/2001/xml.xsd will change - accordingly; the version at - http://www.w3.org/2007/08/xml.xsd will not change. - </xs:documentation> - </xs:annotation> - - <xs:attribute name="lang"> - <xs:annotation> - <xs:documentation>Attempting to install the relevant ISO 2- and 3-letter - codes as the enumerated possible values is probably never - going to be a realistic possibility. See - RFC 3066 at http://www.ietf.org/rfc/rfc3066.txt and the IANA registry - at http://www.iana.org/assignments/lang-tag-apps.htm for - further information. - - The union allows for the 'un-declaration' of xml:lang with - the empty string.</xs:documentation> - </xs:annotation> - <xs:simpleType> - <xs:union memberTypes="xs:language"> - <xs:simpleType> - <xs:restriction base="xs:string"> - <xs:enumeration value=""/> - </xs:restriction> - </xs:simpleType> - </xs:union> - </xs:simpleType> - </xs:attribute> - - <xs:attribute name="space"> - <xs:simpleType> - <xs:restriction base="xs:NCName"> - <xs:enumeration value="default"/> - <xs:enumeration value="preserve"/> - </xs:restriction> - </xs:simpleType> - </xs:attribute> - - <xs:attribute name="base" type="xs:anyURI"> - <xs:annotation> - <xs:documentation>See http://www.w3.org/TR/xmlbase/ for - information about this attribute.</xs:documentation> - </xs:annotation> - </xs:attribute> - - <xs:attribute name="id" type="xs:ID"> - <xs:annotation> - <xs:documentation>See http://www.w3.org/TR/xml-id/ for - information about this attribute.</xs:documentation> - </xs:annotation> - </xs:attribute> - - <xs:attributeGroup name="specialAttrs"> - <xs:attribute ref="xml:base"/> - <xs:attribute ref="xml:lang"/> - <xs:attribute ref="xml:space"/> - <xs:attribute ref="xml:id"/> - </xs:attributeGroup> - -</xs:schema> diff --git a/xta-adapter/src/main/xsd/xmldsig-core-schema.xsd b/xta-adapter/src/main/xsd/xmldsig-core-schema.xsd deleted file mode 100644 index e0ce6d13f4f80ee62e8cc6a42badda70b3cb7fd0..0000000000000000000000000000000000000000 --- a/xta-adapter/src/main/xsd/xmldsig-core-schema.xsd +++ /dev/null @@ -1,308 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Schema for XML Signatures - http://www.w3.org/2000/09/xmldsig# - $Revision: 1.2 $ on $Date: 2013/01/22 15:18:58 $ by $Author: lindemann $ - - Copyright 2001 The Internet Society and W3C (Massachusetts Institute - of Technology, Institut National de Recherche en Informatique et en - Automatique, Keio University). All Rights Reserved. - http://www.w3.org/Consortium/Legal/ - - This document is governed by the W3C Software License [1] as described - in the FAQ [2]. - - [1] http://www.w3.org/Consortium/Legal/copyright-software-19980720 - [2] http://www.w3.org/Consortium/Legal/IPR-FAQ-20000620.html#DTD ---> - - -<schema xmlns="http://www.w3.org/2001/XMLSchema" - xmlns:ds="http://www.w3.org/2000/09/xmldsig#" - targetNamespace="http://www.w3.org/2000/09/xmldsig#" - version="0.1" elementFormDefault="qualified"> - -<!-- Basic Types Defined for Signatures --> - -<simpleType name="CryptoBinary"> - <restriction base="base64Binary"> - </restriction> -</simpleType> - -<!-- Start Signature --> - -<element name="Signature" type="ds:SignatureType"/> -<complexType name="SignatureType"> - <sequence> - <element ref="ds:SignedInfo"/> - <element ref="ds:SignatureValue"/> - <element ref="ds:KeyInfo" minOccurs="0"/> - <element ref="ds:Object" minOccurs="0" maxOccurs="unbounded"/> - </sequence> - <attribute name="Id" type="ID" use="optional"/> -</complexType> - - <element name="SignatureValue" type="ds:SignatureValueType"/> - <complexType name="SignatureValueType"> - <simpleContent> - <extension base="base64Binary"> - <attribute name="Id" type="ID" use="optional"/> - </extension> - </simpleContent> - </complexType> - -<!-- Start SignedInfo --> - -<element name="SignedInfo" type="ds:SignedInfoType"/> -<complexType name="SignedInfoType"> - <sequence> - <element ref="ds:CanonicalizationMethod"/> - <element ref="ds:SignatureMethod"/> - <element ref="ds:Reference" maxOccurs="unbounded"/> - </sequence> - <attribute name="Id" type="ID" use="optional"/> -</complexType> - - <element name="CanonicalizationMethod" type="ds:CanonicalizationMethodType"/> - <complexType name="CanonicalizationMethodType" mixed="true"> - <sequence> - <any namespace="##any" minOccurs="0" maxOccurs="unbounded"/> - <!-- (0,unbounded) elements from (1,1) namespace --> - </sequence> - <attribute name="Algorithm" type="anyURI" use="required"/> - </complexType> - - <element name="SignatureMethod" type="ds:SignatureMethodType"/> - <complexType name="SignatureMethodType" mixed="true"> - <sequence> - <element name="HMACOutputLength" minOccurs="0" type="ds:HMACOutputLengthType"/> - <any namespace="##other" minOccurs="0" maxOccurs="unbounded"/> - <!-- (0,unbounded) elements from (1,1) external namespace --> - </sequence> - <attribute name="Algorithm" type="anyURI" use="required"/> - </complexType> - -<!-- Start Reference --> - -<element name="Reference" type="ds:ReferenceType"/> -<complexType name="ReferenceType"> - <sequence> - <element ref="ds:Transforms" minOccurs="0"/> - <element ref="ds:DigestMethod"/> - <element ref="ds:DigestValue"/> - </sequence> - <attribute name="Id" type="ID" use="optional"/> - <attribute name="URI" type="anyURI" use="optional"/> - <attribute name="Type" type="anyURI" use="optional"/> -</complexType> - - <element name="Transforms" type="ds:TransformsType"/> - <complexType name="TransformsType"> - <sequence> - <element ref="ds:Transform" maxOccurs="unbounded"/> - </sequence> - </complexType> - - <element name="Transform" type="ds:TransformType"/> - <complexType name="TransformType" mixed="true"> - <choice minOccurs="0" maxOccurs="unbounded"> - <any namespace="##other" processContents="lax"/> - <!-- (1,1) elements from (0,unbounded) namespaces --> - <element name="XPath" type="string"/> - </choice> - <attribute name="Algorithm" type="anyURI" use="required"/> - </complexType> - -<!-- End Reference --> - -<element name="DigestMethod" type="ds:DigestMethodType"/> -<complexType name="DigestMethodType" mixed="true"> - <sequence> - <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> - </sequence> - <attribute name="Algorithm" type="anyURI" use="required"/> -</complexType> - -<element name="DigestValue" type="ds:DigestValueType"/> -<simpleType name="DigestValueType"> - <restriction base="base64Binary"/> -</simpleType> - -<!-- End SignedInfo --> - -<!-- Start KeyInfo --> - -<element name="KeyInfo" type="ds:KeyInfoType"/> -<complexType name="KeyInfoType" mixed="true"> - <choice maxOccurs="unbounded"> - <element ref="ds:KeyName"/> - <element ref="ds:KeyValue"/> - <element ref="ds:RetrievalMethod"/> - <element ref="ds:X509Data"/> - <element ref="ds:PGPData"/> - <element ref="ds:SPKIData"/> - <element ref="ds:MgmtData"/> - <any processContents="lax" namespace="##other"/> - <!-- (1,1) elements from (0,unbounded) namespaces --> - </choice> - <attribute name="Id" type="ID" use="optional"/> -</complexType> - - <element name="KeyName" type="string"/> - <element name="MgmtData" type="string"/> - - <element name="KeyValue" type="ds:KeyValueType"/> - <complexType name="KeyValueType" mixed="true"> - <choice> - <element ref="ds:DSAKeyValue"/> - <element ref="ds:RSAKeyValue"/> - <any namespace="##other" processContents="lax"/> - </choice> - </complexType> - - <element name="RetrievalMethod" type="ds:RetrievalMethodType"/> - <complexType name="RetrievalMethodType"> - <sequence> - <element ref="ds:Transforms" minOccurs="0"/> - </sequence> - <attribute name="URI" type="anyURI"/> - <attribute name="Type" type="anyURI" use="optional"/> - </complexType> - -<!-- Start X509Data --> - -<element name="X509Data" type="ds:X509DataType"/> -<complexType name="X509DataType"> - <sequence maxOccurs="unbounded"> - <choice> - <element name="X509IssuerSerial" type="ds:X509IssuerSerialType"/> - <element name="X509SKI" type="base64Binary"/> - <element name="X509SubjectName" type="string"/> - <element name="X509Certificate" type="base64Binary"/> - <element name="X509CRL" type="base64Binary"/> - <any namespace="##other" processContents="lax"/> - </choice> - </sequence> -</complexType> - -<complexType name="X509IssuerSerialType"> - <sequence> - <element name="X509IssuerName" type="string"/> - <element name="X509SerialNumber" type="integer"/> - </sequence> -</complexType> - -<!-- End X509Data --> - -<!-- Begin PGPData --> - -<element name="PGPData" type="ds:PGPDataType"/> -<complexType name="PGPDataType"> - <choice> - <sequence> - <element name="PGPKeyID" type="base64Binary"/> - <element name="PGPKeyPacket" type="base64Binary" minOccurs="0"/> - <any namespace="##other" processContents="lax" minOccurs="0" - maxOccurs="unbounded"/> - </sequence> - <sequence> - <element name="PGPKeyPacket" type="base64Binary"/> - <any namespace="##other" processContents="lax" minOccurs="0" - maxOccurs="unbounded"/> - </sequence> - </choice> -</complexType> - -<!-- End PGPData --> - -<!-- Begin SPKIData --> - -<element name="SPKIData" type="ds:SPKIDataType"/> -<complexType name="SPKIDataType"> - <sequence maxOccurs="unbounded"> - <element name="SPKISexp" type="base64Binary"/> - <any namespace="##other" processContents="lax" minOccurs="0"/> - </sequence> -</complexType> - -<!-- End SPKIData --> - -<!-- End KeyInfo --> - -<!-- Start Object (Manifest, SignatureProperty) --> - -<element name="Object" type="ds:ObjectType"/> -<complexType name="ObjectType" mixed="true"> - <sequence minOccurs="0" maxOccurs="unbounded"> - <any namespace="##any" processContents="lax"/> - </sequence> - <attribute name="Id" type="ID" use="optional"/> - <attribute name="MimeType" type="string" use="optional"/> <!-- add a grep facet --> - <attribute name="Encoding" type="anyURI" use="optional"/> -</complexType> - -<element name="Manifest" type="ds:ManifestType"/> -<complexType name="ManifestType"> - <sequence> - <element ref="ds:Reference" maxOccurs="unbounded"/> - </sequence> - <attribute name="Id" type="ID" use="optional"/> -</complexType> - -<element name="SignatureProperties" type="ds:SignaturePropertiesType"/> -<complexType name="SignaturePropertiesType"> - <sequence> - <element ref="ds:SignatureProperty" maxOccurs="unbounded"/> - </sequence> - <attribute name="Id" type="ID" use="optional"/> -</complexType> - - <element name="SignatureProperty" type="ds:SignaturePropertyType"/> - <complexType name="SignaturePropertyType" mixed="true"> - <choice maxOccurs="unbounded"> - <any namespace="##other" processContents="lax"/> - <!-- (1,1) elements from (1,unbounded) namespaces --> - </choice> - <attribute name="Target" type="anyURI" use="required"/> - <attribute name="Id" type="ID" use="optional"/> - </complexType> - -<!-- End Object (Manifest, SignatureProperty) --> - -<!-- Start Algorithm Parameters --> - -<simpleType name="HMACOutputLengthType"> - <restriction base="integer"/> -</simpleType> - -<!-- Start KeyValue Element-types --> - -<element name="DSAKeyValue" type="ds:DSAKeyValueType"/> -<complexType name="DSAKeyValueType"> - <sequence> - <sequence minOccurs="0"> - <element name="P" type="ds:CryptoBinary"/> - <element name="Q" type="ds:CryptoBinary"/> - </sequence> - <element name="G" type="ds:CryptoBinary" minOccurs="0"/> - <element name="Y" type="ds:CryptoBinary"/> - <element name="J" type="ds:CryptoBinary" minOccurs="0"/> - <sequence minOccurs="0"> - <element name="Seed" type="ds:CryptoBinary"/> - <element name="PgenCounter" type="ds:CryptoBinary"/> - </sequence> - </sequence> -</complexType> - -<element name="RSAKeyValue" type="ds:RSAKeyValueType"/> -<complexType name="RSAKeyValueType"> - <sequence> - <element name="Modulus" type="ds:CryptoBinary"/> - <element name="Exponent" type="ds:CryptoBinary"/> - </sequence> -</complexType> - -<!-- End KeyValue Element-types --> - -<!-- End Signature --> - -</schema> diff --git a/xta-adapter/src/main/xsd/xmlmime.xsd b/xta-adapter/src/main/xsd/xmlmime.xsd deleted file mode 100644 index d78ec72db4f898ec9e90e93464441e998230a8c8..0000000000000000000000000000000000000000 --- a/xta-adapter/src/main/xsd/xmlmime.xsd +++ /dev/null @@ -1,49 +0,0 @@ -<?xml version="1.0" ?> -<!-- - W3C XML Schema defined in the Describing Media Content of Binary Data in XML - specification - http://www.w3.org/TR/xml-media-types - - Copyright © 2005 World Wide Web Consortium, - - (Massachusetts Institute of Technology, European Research Consortium for - Informatics and Mathematics, Keio University). All Rights Reserved. This - work is distributed under the W3C® Software License [1] in the hope that - it will be useful, but WITHOUT ANY WARRANTY; without even the implied - warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - - [1] http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231 - - $Id: xmlmime.xsd,v 1.1 2013/02/15 22:16:35 lindemann Exp $ ---> -<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" - xmlns:xmime="http://www.w3.org/2005/05/xmlmime" - targetNamespace="http://www.w3.org/2005/05/xmlmime" > - - <xs:attribute name="contentType"> - <xs:simpleType> - <xs:restriction base="xs:string" > - <xs:minLength value="3" /> - </xs:restriction> - </xs:simpleType> - </xs:attribute> - - <xs:attribute name="expectedContentTypes" type="xs:string" /> - - <xs:complexType name="base64Binary" > - <xs:simpleContent> - <xs:extension base="xs:base64Binary" > - <xs:attribute ref="xmime:contentType" /> - </xs:extension> - </xs:simpleContent> - </xs:complexType> - - <xs:complexType name="hexBinary" > - <xs:simpleContent> - <xs:extension base="xs:hexBinary" > - <xs:attribute ref="xmime:contentType" /> - </xs:extension> - </xs:simpleContent> - </xs:complexType> - -</xs:schema> \ No newline at end of file diff --git a/xta-adapter/src/main/xsd/xoev-basisdatentypen.xsd b/xta-adapter/src/main/xsd/xoev-basisdatentypen.xsd deleted file mode 100644 index 4da4268bfd6bcae479321fbd6de44da6d8caa872..0000000000000000000000000000000000000000 --- a/xta-adapter/src/main/xsd/xoev-basisdatentypen.xsd +++ /dev/null @@ -1,18 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xoev-dt="http://xoev.de/schemata/basisdatentypen/1_1" targetNamespace="http://xoev.de/schemata/basisdatentypen/1_1" version="1.1" elementFormDefault="qualified" attributeFormDefault="unqualified"> - <xs:complexType name="Code"> - <xs:annotation> - <xs:appinfo> - <title>Datentyp für die Übermittlung von Codes</title> - </xs:appinfo> - <xs:documentation>Datentyp für die Übermittlung von Codes (vgl. XÖV-Handbuch).</xs:documentation> - </xs:annotation> - <xs:sequence> - <xs:element name="code" type="xs:token" form="unqualified" /> - <xs:element name="name" minOccurs="0" type="xs:normalizedString" form="unqualified" /> - </xs:sequence> - <xs:attribute name="listURI" type="xs:anyURI" use="optional" /> - <xs:attribute name="listVersionID" type="xs:normalizedString" use="optional" /> - </xs:complexType> -</xs:schema> - diff --git a/xta-adapter/src/main/xsd/xoev1_0-basisdatentypen.xsd b/xta-adapter/src/main/xsd/xoev1_0-basisdatentypen.xsd deleted file mode 100644 index 9e3cee8070df3e3a31e66e332305feee92631de6..0000000000000000000000000000000000000000 --- a/xta-adapter/src/main/xsd/xoev1_0-basisdatentypen.xsd +++ /dev/null @@ -1,32 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<xs:schema targetNamespace="http://xoev.de/schemata/basisdatentypen/1_0" version="1.0" elementFormDefault="qualified" attributeFormDefault="unqualified" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xoev-dt="http://xoev.de/schemata/basisdatentypen/1_0"> - <xs:complexType name="Code"> - <xs:annotation> - <xs:appinfo> - <title>Datentyp für die Übermittlung von Codes</title> - </xs:appinfo> - <xs:documentation>Datentyp für die Übermittlung von Codes (vgl. XÖV-Handbuch).</xs:documentation> - </xs:annotation> - <xs:sequence> - <xs:element name="code" type="xs:token" form="unqualified"> - </xs:element> - <xs:element name="name" minOccurs="0" type="xs:normalizedString" form="unqualified"> - </xs:element> - </xs:sequence> - <xs:attribute name="listURI" type="xs:anyURI" use="optional"> - </xs:attribute> - <xs:attribute name="listVersionID" type="xs:normalizedString" use="optional"> - </xs:attribute> - </xs:complexType> - <xs:simpleType name="String.Latin"> - <xs:annotation> - <xs:appinfo> - <title>Datentyp für lateinische Zeichen in Unicode</title> - </xs:appinfo> - <xs:documentation>Einschränkung auf alle lateinischen Zeichen innerhalb Unicode (vgl. XÖV-Handbuch).</xs:documentation> - </xs:annotation> - <xs:restriction base="xs:normalizedString"> - <xs:pattern value="[	-

 -~¡-¬®-ıĴ-ſƇ-ƈƏƠ-ơƯ-ưƷƿǍ-ǔǞ-ǟǢ-ǯǴ-ǵǷǺ-ȟȪ-ȳəʒḂ-ḃḊ-ḋḐ-ḑḞ-ḡḤ-ḧḰ-ḱṀ-ṁṄ-ṅṖ-ṗṠ-ṣṪ-ṫẀ-ẅẌ-ẓẛẞẠ-ạẪ-ẬẽỄ-ễỊ-ỏỖ-ỗỤ-ụỲ-ỳỸ-ỹ€]*"/> - </xs:restriction> - </xs:simpleType> -</xs:schema> diff --git a/xta-adapter/src/test/helm-linter-values.yaml b/xta-adapter/src/test/helm-linter-values.yaml deleted file mode 100644 index 2c2f51b5dbcf44d63e52ffe673d77261e6318d14..0000000000000000000000000000000000000000 --- a/xta-adapter/src/test/helm-linter-values.yaml +++ /dev/null @@ -1,33 +0,0 @@ -# -# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den -# Ministerpräsidenten des Landes Schleswig-Holstein -# Staatskanzlei -# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung -# -# Lizenziert unter der EUPL, Version 1.2 oder - sobald -# diese von der Europäischen Kommission genehmigt wurden - -# Folgeversionen der EUPL ("Lizenz"); -# Sie dürfen dieses Werk ausschließlich gemäß -# dieser Lizenz nutzen. -# Eine Kopie der Lizenz finden Sie hier: -# -# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 -# -# Sofern nicht durch anwendbare Rechtsvorschriften -# gefordert oder in schriftlicher Form vereinbart, wird -# die unter der Lizenz verbreitete Software "so wie sie -# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - -# ausdrücklich oder stillschweigend - verbreitet. -# Die sprachspezifischen Genehmigungen und Beschränkungen -# unter der Lizenz sind dem Lizenztext zu entnehmen. -# - -ozgcloud: - environment: test - bezeichner: helm - bundesland: by - - -networkPolicy: - dnsServerNamespace: test-dns-server-namespace -imagePullSecret: image-pull-secret \ No newline at end of file diff --git a/xta-adapter/src/test/helm/network_policy_test.yaml b/xta-adapter/src/test/helm/network_policy_test.yaml deleted file mode 100644 index 863e8c70f6ae138eb7cbe584bf8c374504f99a49..0000000000000000000000000000000000000000 --- a/xta-adapter/src/test/helm/network_policy_test.yaml +++ /dev/null @@ -1,239 +0,0 @@ -# -# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den -# Ministerpräsidenten des Landes Schleswig-Holstein -# Staatskanzlei -# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung -# -# Lizenziert unter der EUPL, Version 1.2 oder - sobald -# diese von der Europäischen Kommission genehmigt wurden - -# Folgeversionen der EUPL ("Lizenz"); -# Sie dürfen dieses Werk ausschließlich gemäß -# dieser Lizenz nutzen. -# Eine Kopie der Lizenz finden Sie hier: -# -# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 -# -# Sofern nicht durch anwendbare Rechtsvorschriften -# gefordert oder in schriftlicher Form vereinbart, wird -# die unter der Lizenz verbreitete Software "so wie sie -# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - -# ausdrücklich oder stillschweigend - verbreitet. -# Die sprachspezifischen Genehmigungen und Beschränkungen -# unter der Lizenz sind dem Lizenztext zu entnehmen. -# - -suite: network policy test -release: - namespace: by-helm-test -templates: - - templates/network_policy.yaml - -tests: - - it: should match apiVersion - set: - networkPolicy: - dnsServerNamespace: test-dns-namespace - asserts: - - isAPIVersion: - of: networking.k8s.io/v1 - - it: should match kind - set: - networkPolicy: - dnsServerNamespace: test-dns-namespace - asserts: - - isKind: - of: NetworkPolicy - - it: validate metadata - set: - networkPolicy: - dnsServerNamespace: test-dns-namespace - asserts: - - equal: - path: metadata - value: - name: network-policy-xta-adapter - namespace: by-helm-test - - it: validate spec - set: - networkPolicy: - dnsServerNamespace: test-dns-namespace - asserts: - - equal: - path: spec - value: - podSelector: - matchLabels: - ozg-component: xta-adapter - policyTypes: - - Egress - egress: - - to: - - podSelector: - matchLabels: - component: vorgang-manager - ports: - - port: 9090 - protocol: TCP - - to: - - namespaceSelector: - matchLabels: - kubernetes.io/metadata.name: test-dns-namespace - ports: - - port: 53 - protocol: UDP - - port: 53 - protocol: TCP - - port: 5353 - protocol: UDP - - port: 5353 - protocol: TCP - - to: - - namespaceSelector: - matchLabels: - kubernetes.io/metadata.name: ssh-port-forward - ports: - - port: 443 - protocol: TCP - - port: 80 - protocol: TCP - - port: 9000 - protocol: TCP - - - it: add egress rules by values local - set: - networkPolicy: - ssoPublicIp: 51.89.117.53/32 - dnsServerNamespace: test-dns-namespace - additionalEgressConfigLocal: - - to: - - ipBlock: - cidr: 1.2.3.4/32 - asserts: - - contains: - path: spec.egress - content: - to: - - ipBlock: - cidr: 1.2.3.4/32 - - it: add egress rules by values global - set: - networkPolicy: - ssoPublicIp: 51.89.117.53/32 - dnsServerNamespace: test-dns-namespace - additionalEgressConfigGlobal: - - to: - - ipBlock: - cidr: 1.2.3.4/32 - asserts: - - contains: - path: spec.egress - content: - to: - - ipBlock: - cidr: 1.2.3.4/32 - - - it: test network policy disabled - set: - networkPolicy: - disabled: true - asserts: - - hasDocuments: - count: 0 - - - it: test network policy unset should be disabled - set: - networkPolicy: - disabled: false - dnsServerNamespace: test-dns-namespace - asserts: - - hasDocuments: - count: 1 - - it: test network policy dnsServerNamespace must be set message - set: - networkPolicy: - disabled: false - asserts: - - failedTemplate: - errorMessage: networkPolicy.dnsServerNamespace must be set - - - it: test network policy should be enabled by default - set: - networkPolicy: - dnsServerNamespace: test-dns-server-namespace - asserts: - - hasDocuments: - count: 1 - - - it: should add zufi rules when zufi-routing is enabled - set: - networkPolicy: - dnsServerNamespace: test-dns-server-namespace - routing: - routingStrategy: ZUFI - zufiManager: - namespace: zufi-namespace - asserts: - - contains: - path: spec.egress - content: - to: - - namespaceSelector: - matchLabels: - kubernetes.io/metadata.name: zufi-namespace - podSelector: - matchLabels: - component: zufi-server - ports: - - port: 9090 - protocol: TCP - - contains: - path: spec.egress - content: - to: - - namespaceSelector: {} - podSelector: - matchLabels: - component: vorgang-manager - ports: - - port: 9090 - protocol: TCP - - - it: should throw error when zufi is enabled but zufi namespace not set - set: - networkPolicy: - dnsServerNamespace: test-dns-server-namespace - routing: - routingStrategy: ZUFI - asserts: - - failedTemplate: - errorMessage: routing.zufiManager.namespace must be set if routingStrategy=ZUFI - - - it: should not add zufi rule when zufi-routing is disabled - set: - networkPolicy: - dnsServerNamespace: test-dns-server-namespace - routing: - zufiManager: - namespace: zufi-namespace - asserts: - - notContains: - path: spec.egress - content: - to: - - namespaceSelector: - matchLabels: - kubernetes.io/metadata.name: zufi-namespace - podSelector: - matchLabels: - component: zufi-server - - notContains: - path: spec.egress - content: - to: - - namespaceSelector: {} - podSelector: - matchLabels: - component: vorgang-manager - ports: - - port: 9090 - protocol: TCP diff --git a/xta-adapter/src/test/helm/service_account_test.yaml b/xta-adapter/src/test/helm/service_account_test.yaml deleted file mode 100644 index 1027bebb9e7062b7eff532148e3414810523f48f..0000000000000000000000000000000000000000 --- a/xta-adapter/src/test/helm/service_account_test.yaml +++ /dev/null @@ -1,66 +0,0 @@ -# -# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den -# Ministerpräsidenten des Landes Schleswig-Holstein -# Staatskanzlei -# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung -# -# Lizenziert unter der EUPL, Version 1.2 oder - sobald -# diese von der Europäischen Kommission genehmigt wurden - -# Folgeversionen der EUPL ("Lizenz"); -# Sie dürfen dieses Werk ausschließlich gemäß -# dieser Lizenz nutzen. -# Eine Kopie der Lizenz finden Sie hier: -# -# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 -# -# Sofern nicht durch anwendbare Rechtsvorschriften -# gefordert oder in schriftlicher Form vereinbart, wird -# die unter der Lizenz verbreitete Software "so wie sie -# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - -# ausdrücklich oder stillschweigend - verbreitet. -# Die sprachspezifischen Genehmigungen und Beschränkungen -# unter der Lizenz sind dem Lizenztext zu entnehmen. -# - -suite: test service account -release: - name: xta-adapter - namespace: sh-helm-test -templates: - - templates/service_account.yaml -tests: - - it: should create service account with default name - set: - serviceAccount: - create: true - asserts: - - isKind: - of: ServiceAccount - - isAPIVersion: - of: v1 - - equal: - path: metadata.name - value: xta-adapter-service-account - - equal: - path: metadata.namespace - value: sh-helm-test - - it: should create service account with name - set: - serviceAccount: - create: true - name: helm-service-account - asserts: - - isKind: - of: ServiceAccount - - isAPIVersion: - of: v1 - - equal: - path: metadata.name - value: helm-service-account - - equal: - path: metadata.namespace - value: sh-helm-test - - it: should not create service account - asserts: - - hasDocuments: - count: 0 \ No newline at end of file diff --git a/xta-adapter/src/test/helm/xta_adapter_63_chars_test.yaml b/xta-adapter/src/test/helm/xta_adapter_63_chars_test.yaml deleted file mode 100644 index 941883545d93772e6a349add7e60a8190e478629..0000000000000000000000000000000000000000 --- a/xta-adapter/src/test/helm/xta_adapter_63_chars_test.yaml +++ /dev/null @@ -1,56 +0,0 @@ -# -# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den -# Ministerpräsidenten des Landes Schleswig-Holstein -# Staatskanzlei -# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung -# -# Lizenziert unter der EUPL, Version 1.2 oder - sobald -# diese von der Europäischen Kommission genehmigt wurden - -# Folgeversionen der EUPL ("Lizenz"); -# Sie dürfen dieses Werk ausschließlich gemäß -# dieser Lizenz nutzen. -# Eine Kopie der Lizenz finden Sie hier: -# -# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 -# -# Sofern nicht durch anwendbare Rechtsvorschriften -# gefordert oder in schriftlicher Form vereinbart, wird -# die unter der Lizenz verbreitete Software "so wie sie -# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - -# ausdrücklich oder stillschweigend - verbreitet. -# Die sprachspezifischen Genehmigungen und Beschränkungen -# unter der Lizenz sind dem Lizenztext zu entnehmen. -# - -suite: test less than 63 chars -release: - name: xta-adapter - namespace: sh-helm-test -set: - ozgcloud.environment: test - imagePullSecret: image-pull-secret -chart: - name: xta-adapter - -templates: - - templates/xta_adapter_cronjob.yaml - -tests: - - it: should fail on .Release.Namespace length longer than 63 characters - release: - namespace: test1234567890123123456789012345678901234567890123456789012345678901234567890123456789012345678904567890 - asserts: - - failedTemplate: - errorMessage: .Release.Namespace test1234567890123123456789012345678901234567890123456789012345678901234567890123456789012345678904567890 ist zu lang (max. 63 Zeichen) - - it: should not fail on .Release.Namespace length less than 63 characters - asserts: - - notFailedTemplate: {} - - it: should fail on .Chart.Name-.Chart.Version length longer than 63 characters - chart: - version: 1.0-test1234567890123123456789012345678901234567890123456789012345678901234567890123456789012345678904567890 - asserts: - - failedTemplate: - errorMessage: .Chart.Name-.Chart.Version xta-adapter-1.0-test1234567890123123456789012345678901234567890123456789012345678901234567890123456789012345678904567890 ist zu lang (max. 63 Zeichen) - - it: should not fail on .Chart.Name-.Chart.Version length less than 63 characters - asserts: - - notFailedTemplate: {} \ No newline at end of file diff --git a/xta-adapter/src/test/helm/xta_adapter_cronjob_basic_test.yaml b/xta-adapter/src/test/helm/xta_adapter_cronjob_basic_test.yaml deleted file mode 100644 index 7eac13e81398613f23cc5e4dedc3309b69030c5a..0000000000000000000000000000000000000000 --- a/xta-adapter/src/test/helm/xta_adapter_cronjob_basic_test.yaml +++ /dev/null @@ -1,148 +0,0 @@ -# -# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den -# Ministerpräsidenten des Landes Schleswig-Holstein -# Staatskanzlei -# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung -# -# Lizenziert unter der EUPL, Version 1.2 oder - sobald -# diese von der Europäischen Kommission genehmigt wurden - -# Folgeversionen der EUPL ("Lizenz"); -# Sie dürfen dieses Werk ausschließlich gemäß -# dieser Lizenz nutzen. -# Eine Kopie der Lizenz finden Sie hier: -# -# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 -# -# Sofern nicht durch anwendbare Rechtsvorschriften -# gefordert oder in schriftlicher Form vereinbart, wird -# die unter der Lizenz verbreitete Software "so wie sie -# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - -# ausdrücklich oder stillschweigend - verbreitet. -# Die sprachspezifischen Genehmigungen und Beschränkungen -# unter der Lizenz sind dem Lizenztext zu entnehmen. -# - -suite: test xta adapter cronjob basics -templates: - - templates/xta_adapter_cronjob.yaml -release: - name: xta-adapter - namespace: helm-test -set: - ozgcloud.environment: dev - imagePullSecret: image-pull-secret - -tests: - - it: validate basic data - set: - image.name: xta-adapter - asserts: - - containsDocument: - kind: CronJob - apiVersion: batch/v1 - - equal: - path: metadata.name - value: xta-adapter - - equal: - path: metadata.namespace - value: helm-test - - equal: - path: spec.successfulJobsHistoryLimit - value: 3 - - equal: - path: spec.failedJobsHistoryLimit - value: 3 - - equal: - path: spec.concurrencyPolicy - value: Forbid - - it: check set schedule - set: - image.name: xta-adapter - xta: - schedule: "1 1 * * * *" - identifiers: - - gae:test@ozg-sh.de - server: - address: 1.2.3.4 - name: test - asserts: - - equal: - path: spec.schedule - value: "1 1 * * * *" - - it: check dev schedule - set: - image.name: xta-adapter - asserts: - - equal: - path: spec.schedule - value: "*/15 * * * *" - - it: check container image - set: - image.name: xta-adapter - asserts: - - equal: - path: spec.jobTemplate.spec.template.spec.containers[0].image - value: "docker.ozg-sh.de/xta-adapter:9.9.99" - - - it: check securityContext - asserts: - - equal: - path: spec.jobTemplate.spec.template.spec.containers[0].securityContext.allowPrivilegeEscalation - value: false - - equal: - path: spec.jobTemplate.spec.template.spec.containers[0].securityContext.privileged - value: false - - equal: - path: spec.jobTemplate.spec.template.spec.containers[0].securityContext.readOnlyRootFilesystem - value: false - - equal: - path: spec.jobTemplate.spec.template.spec.containers[0].securityContext.runAsNonRoot - value: true - - isNull: - path: spec.jobTemplate.spec.template.spec.containers[0].securityContext.runAsUser - - isNull: - path: spec.jobTemplate.spec.template.spec.containers[0].securityContext.runAsGroup - - isNull: - path: spec.jobTemplate.spec.template.spec.securityContext.fsGroup - - isNull: - path: spec.jobTemplate.spec.template.spec.containers[0].securityContext.capabilities - - it: check runAsUser - set: - securityContext.runAsUser: 1000 - asserts: - - equal: - path: spec.jobTemplate.spec.template.spec.containers[0].securityContext.runAsUser - value: 1000 - - it: check runAsGroup - set: - securityContext.runAsGroup: 1000 - asserts: - - equal: - path: spec.jobTemplate.spec.template.spec.containers[0].securityContext.runAsGroup - value: 1000 - - it: check pod labels - asserts: - - equal: - path: spec.jobTemplate.spec.template.metadata.labels - value: - ozg-component: xta-adapter - workload: xta-adapter-cronjob - - it: check fsGroup - set: - podSecurityContext.fsGroup: 1000 - asserts: - - equal: - path: spec.jobTemplate.spec.template.spec.securityContext.fsGroup - value: 1000 - - it: check capabilities - set: - securityContext: - capabilities: - drop: - - ALL - asserts: - - equal: - path: spec.jobTemplate.spec.template.spec.containers[0].securityContext.capabilities - value: - drop: - - ALL diff --git a/xta-adapter/src/test/helm/xta_adapter_cronjob_bindings_test.yaml b/xta-adapter/src/test/helm/xta_adapter_cronjob_bindings_test.yaml deleted file mode 100644 index 9305d2d92e471ba9e0239c57313496679b2bbea6..0000000000000000000000000000000000000000 --- a/xta-adapter/src/test/helm/xta_adapter_cronjob_bindings_test.yaml +++ /dev/null @@ -1,47 +0,0 @@ -# -# Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den -# Ministerpräsidenten des Landes Schleswig-Holstein -# Staatskanzlei -# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung -# -# Lizenziert unter der EUPL, Version 1.2 oder - sobald -# diese von der Europäischen Kommission genehmigt wurden - -# Folgeversionen der EUPL ("Lizenz"); -# Sie dürfen dieses Werk ausschließlich gemäß -# dieser Lizenz nutzen. -# Eine Kopie der Lizenz finden Sie hier: -# -# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 -# -# Sofern nicht durch anwendbare Rechtsvorschriften -# gefordert oder in schriftlicher Form vereinbart, wird -# die unter der Lizenz verbreitete Software "so wie sie -# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - -# ausdrücklich oder stillschweigend - verbreitet. -# Die sprachspezifischen Genehmigungen und Beschränkungen -# unter der Lizenz sind dem Lizenztext zu entnehmen. -# - -suite: xta-adapter bindings -templates: - - templates/xta_adapter_cronjob.yaml -set: - ozgcloud.environment: test - imagePullSecret: image-pull-secret -tests: - - it: should have temp-dir volume - asserts: - - contains: - path: spec.jobTemplate.spec.template.spec.containers[0].volumeMounts - content: - name: temp-dir - mountPath: "/tmp" - - - it: should have temp-dir volume mount - asserts: - - contains: - path: spec.jobTemplate.spec.template.spec.volumes - content: - name: temp-dir - emptyDir: {} - diff --git a/xta-adapter/src/test/helm/xta_adapter_cronjob_dummy_probes_test.yaml b/xta-adapter/src/test/helm/xta_adapter_cronjob_dummy_probes_test.yaml deleted file mode 100644 index a8cd367dcfe2e8b8dfb5b434769dfdde29f86886..0000000000000000000000000000000000000000 --- a/xta-adapter/src/test/helm/xta_adapter_cronjob_dummy_probes_test.yaml +++ /dev/null @@ -1,85 +0,0 @@ -# -# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den -# Ministerpräsidenten des Landes Schleswig-Holstein -# Staatskanzlei -# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung -# -# Lizenziert unter der EUPL, Version 1.2 oder - sobald -# diese von der Europäischen Kommission genehmigt wurden - -# Folgeversionen der EUPL ("Lizenz"); -# Sie dürfen dieses Werk ausschließlich gemäß -# dieser Lizenz nutzen. -# Eine Kopie der Lizenz finden Sie hier: -# -# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 -# -# Sofern nicht durch anwendbare Rechtsvorschriften -# gefordert oder in schriftlicher Form vereinbart, wird -# die unter der Lizenz verbreitete Software "so wie sie -# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - -# ausdrücklich oder stillschweigend - verbreitet. -# Die sprachspezifischen Genehmigungen und Beschränkungen -# unter der Lizenz sind dem Lizenztext zu entnehmen. -# - -suite: test xta adapter cronjob dummy probes -templates: - - templates/xta_adapter_cronjob.yaml -release: - name: xta-adapter - namespace: helm-test -set: - ozgcloud.environment: test - imagePullSecret: image-pull-secret -tests: - - it: check dummy livenessProbe default disabled - asserts: - - notExists: - path: spec.jobTemplate.spec.template.spec.containers[0].livenessProbe - - it: check dummy startupProbe default disabled - asserts: - - notExists: - path: spec.jobTemplate.spec.template.spec.containers[0].startupProbe - - it: check dummy readynessProbe default disabled - asserts: - - notExists: - path: spec.jobTemplate.spec.template.spec.containers[0].readinessProbe - - - it: check dummy livenessProbe disabled - set: - dummyProbesEnabled: false - asserts: - - notExists: - path: spec.jobTemplate.spec.template.spec.containers[0].livenessProbe - - it: check dummy startupProbe disabled - set: - dummyProbesEnabled: false - asserts: - - notExists: - path: spec.jobTemplate.spec.template.spec.containers[0].startupProbe - - it: check dummy readynessProbe disabled - set: - dummyProbesEnabled: false - asserts: - - notExists: - path: spec.jobTemplate.spec.template.spec.containers[0].readinessProbe - - - - it: check dummy livenessProbe enabled - set: - dummyProbesEnabled: true - asserts: - - isNotEmpty: - path: spec.jobTemplate.spec.template.spec.containers[0].livenessProbe - - it: check dummy startupProbe enabled - set: - dummyProbesEnabled: true - asserts: - - isNotEmpty: - path: spec.jobTemplate.spec.template.spec.containers[0].startupProbe - - it: check dummy readynessProbe enabled - set: - dummyProbesEnabled: true - asserts: - - isNotEmpty: - path: spec.jobTemplate.spec.template.spec.containers[0].readinessProbe diff --git a/xta-adapter/src/test/helm/xta_adapter_cronjob_env_test.yaml b/xta-adapter/src/test/helm/xta_adapter_cronjob_env_test.yaml deleted file mode 100644 index e247e20d6703fa518cf1eb74616e5447f4fd8a2e..0000000000000000000000000000000000000000 --- a/xta-adapter/src/test/helm/xta_adapter_cronjob_env_test.yaml +++ /dev/null @@ -1,202 +0,0 @@ -# -# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den -# Ministerpräsidenten des Landes Schleswig-Holstein -# Staatskanzlei -# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung -# -# Lizenziert unter der EUPL, Version 1.2 oder - sobald -# diese von der Europäischen Kommission genehmigt wurden - -# Folgeversionen der EUPL ("Lizenz"); -# Sie dürfen dieses Werk ausschließlich gemäß -# dieser Lizenz nutzen. -# Eine Kopie der Lizenz finden Sie hier: -# -# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 -# -# Sofern nicht durch anwendbare Rechtsvorschriften -# gefordert oder in schriftlicher Form vereinbart, wird -# die unter der Lizenz verbreitete Software "so wie sie -# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - -# ausdrücklich oder stillschweigend - verbreitet. -# Die sprachspezifischen Genehmigungen und Beschränkungen -# unter der Lizenz sind dem Lizenztext zu entnehmen. -# - -suite: test xta adapter cronjob env -templates: - - templates/xta_adapter_cronjob.yaml -release: - name: xta-adapter - namespace: helm-test -set: - ozgcloud.environment: test - imagePullSecret: image-pull-secret -tests: - - it: check default env - set: - image.name: xta-adapter - xta: - identifiers: - - gae:test@ozg-sh.de - - afmsh:test@ozg-sh.de - server: - name: test - address: 1.2.3.4 - protocol: https - asserts: - - contains: - path: spec.jobTemplate.spec.template.spec.containers[0].env - content: - name: spring_profiles_active - value: "oc, test" - - contains: - path: spec.jobTemplate.spec.template.spec.containers[0].env - content: - name: SERVICE_BINDING_ROOT - value: "/bindings" - - contains: - path: spec.jobTemplate.spec.template.spec.containers[0].env - content: - name: ozgcloud_xta_server_name - value: "test" - - contains: - path: spec.jobTemplate.spec.template.spec.containers[0].env - content: - name: ozgcloud_xta_server_address - value: "1.2.3.4" - - contains: - path: spec.jobTemplate.spec.template.spec.containers[0].env - content: - name: ozgcloud_xta_server_protocol - value: "https" - - contains: - path: spec.jobTemplate.spec.template.spec.containers[0].env - content: - name: ozgcloud_xta_identifiers - value: "gae:test@ozg-sh.de,afmsh:test@ozg-sh.de" - - contains: - path: spec.jobTemplate.spec.template.spec.containers[0].env - content: - name: ozgcloud_xta_keystore_file - value: "keystore/xta-keystore.p12" - - contains: - path: spec.jobTemplate.spec.template.spec.containers[0].env - content: - name: ozgcloud_xta_keystore_password - valueFrom: - secretKeyRef: - name: "xta-keystore" - key: password - optional: false - - contains: - path: spec.jobTemplate.spec.template.spec.containers[0].env - content: - name: ozgcloud_adapter_fallbackStrategy - value: "DENY" - - contains: - path: spec.jobTemplate.spec.template.spec.containers[0].env - content: - name: ozgcloud_adapter_routingStrategy - value: "SINGLE" - - contains: - path: spec.jobTemplate.spec.template.spec.containers[0].env - content: - name: ozgcloud_adapter_targetVorgangManagerName - value: "vorgang-manager" - - contains: - path: spec.jobTemplate.spec.template.spec.containers[0].env - content: - name: grpc_client_vorgang-manager-vorgang-manager_address - value: 'dns:///vorgang-manager.helm-test:9090' - - contains: - path: spec.jobTemplate.spec.template.spec.containers[0].env - content: - name: grpc_client_vorgang-manager-vorgang-manager_negotiationType - value: "PLAINTEXT" - - it: check set env values - set: - image.name: xta-adapter - env.overrideSpringProfiles: local - xta: - identifiers: - - gae:test@ozg-sh.de - server: - name: test - address: 1.2.3.4 - routing: - routingStrategy: MULTI - fallbackStrategy: FUNDSTELLE - negotiationType: TLS - asserts: - - contains: - path: spec.jobTemplate.spec.template.spec.containers[0].env - content: - name: spring_profiles_active - value: "local" - - contains: - path: spec.jobTemplate.spec.template.spec.containers[0].env - content: - name: ozgcloud_adapter_fallbackStrategy - value: "FUNDSTELLE" - - contains: - path: spec.jobTemplate.spec.template.spec.containers[0].env - content: - name: ozgcloud_adapter_routingStrategy - value: "MULTI" - - contains: - path: spec.jobTemplate.spec.template.spec.containers[0].env - content: - name: ozgcloud_adapter_targetVorgangManagerName - value: "vorgang-manager" - - contains: - path: spec.jobTemplate.spec.template.spec.containers[0].env - content: - name: grpc_client_vorgang-manager-vorgang-manager_address - value: 'dns:///vorgang-manager.helm-test:9090' - - contains: - path: spec.jobTemplate.spec.template.spec.containers[0].env - content: - name: grpc_client_vorgang-manager-vorgang-manager_negotiationType - value: "TLS" - - it: check customList as list - set: - env.customList: - - name: my_test_environment_name - value: "A test value" - - name: test_environment - value: "B test value" - asserts: - - contains: - path: spec.jobTemplate.spec.template.spec.containers[0].env - content: - name: my_test_environment_name - value: "A test value" - - contains: - path: spec.jobTemplate.spec.template.spec.containers[0].env - content: - name: test_environment - value: "B test value" - - it: check customList as dict - set: - env.customList: - my_test_environment_name: "A test value" - test_environment: "B test value" - asserts: - - contains: - path: spec.jobTemplate.spec.template.spec.containers[0].env - content: - name: my_test_environment_name - value: "A test value" - - contains: - path: spec.jobTemplate.spec.template.spec.containers[0].env - content: - name: test_environment - value: "B test value" - - - it: check customList test value is not set by default - asserts: - - notContains: - path: spec.jobTemplate.spec.template.spec.containers[0].env - content: - name: my_test_environment_name - value: "A test value" diff --git a/xta-adapter/src/test/helm/xta_adapter_cronjob_image_pull_test.yaml b/xta-adapter/src/test/helm/xta_adapter_cronjob_image_pull_test.yaml deleted file mode 100644 index 645b25738b9b4124900a5f90cd78b6cb621261e6..0000000000000000000000000000000000000000 --- a/xta-adapter/src/test/helm/xta_adapter_cronjob_image_pull_test.yaml +++ /dev/null @@ -1,45 +0,0 @@ -# -# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den -# Ministerpräsidenten des Landes Schleswig-Holstein -# Staatskanzlei -# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung -# -# Lizenziert unter der EUPL, Version 1.2 oder - sobald -# diese von der Europäischen Kommission genehmigt wurden - -# Folgeversionen der EUPL ("Lizenz"); -# Sie dürfen dieses Werk ausschließlich gemäß -# dieser Lizenz nutzen. -# Eine Kopie der Lizenz finden Sie hier: -# -# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 -# -# Sofern nicht durch anwendbare Rechtsvorschriften -# gefordert oder in schriftlicher Form vereinbart, wird -# die unter der Lizenz verbreitete Software "so wie sie -# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - -# ausdrücklich oder stillschweigend - verbreitet. -# Die sprachspezifischen Genehmigungen und Beschränkungen -# unter der Lizenz sind dem Lizenztext zu entnehmen. -# - -suite: test xta adapter imagePull secret -release: - name: xta-adapter - namespace: sh-helm-test -templates: - - templates/xta_adapter_cronjob.yaml -set: - ozgcloud.environment: dev - -tests: - - it: should fail when imagePull secret not set - asserts: - - failedTemplate: - errormessage: imagePullSecret must be set - - it: should set the imagePull secret - set: - imagePullSecret: image-pull-secret - asserts: - - equal: - path: spec.jobTemplate.spec.template.spec.imagePullSecrets[0].name - value: image-pull-secret \ No newline at end of file diff --git a/xta-adapter/src/test/helm/xta_adapter_cronjob_resources_test.yaml b/xta-adapter/src/test/helm/xta_adapter_cronjob_resources_test.yaml deleted file mode 100644 index a2db96cbea3602e3d47035ec294b177a8dc480be..0000000000000000000000000000000000000000 --- a/xta-adapter/src/test/helm/xta_adapter_cronjob_resources_test.yaml +++ /dev/null @@ -1,56 +0,0 @@ -# -# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den -# Ministerpräsidenten des Landes Schleswig-Holstein -# Staatskanzlei -# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung -# -# Lizenziert unter der EUPL, Version 1.2 oder - sobald -# diese von der Europäischen Kommission genehmigt wurden - -# Folgeversionen der EUPL ("Lizenz"); -# Sie dürfen dieses Werk ausschließlich gemäß -# dieser Lizenz nutzen. -# Eine Kopie der Lizenz finden Sie hier: -# -# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 -# -# Sofern nicht durch anwendbare Rechtsvorschriften -# gefordert oder in schriftlicher Form vereinbart, wird -# die unter der Lizenz verbreitete Software "so wie sie -# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - -# ausdrücklich oder stillschweigend - verbreitet. -# Die sprachspezifischen Genehmigungen und Beschränkungen -# unter der Lizenz sind dem Lizenztext zu entnehmen. -# - -suite: test xta adapter cronjob resources -templates: - - templates/xta_adapter_cronjob.yaml -release: - name: xta-adapter - namespace: helm-test -set: - ozgcloud.environment: dev - imagePullSecret: image-pull-secret -tests: - - it: check resources - set: - resources: - limits: - cpu: "11m" - memory: "22Mi" - requests: - cpu: "33m" - memory: "44Mi" - asserts: - - equal: - path: spec.jobTemplate.spec.template.spec.containers[0].resources.limits.cpu - value: "11m" - - equal: - path: spec.jobTemplate.spec.template.spec.containers[0].resources.limits.memory - value: "22Mi" - - equal: - path: spec.jobTemplate.spec.template.spec.containers[0].resources.requests.cpu - value: "33m" - - equal: - path: spec.jobTemplate.spec.template.spec.containers[0].resources.requests.memory - value: "44Mi" diff --git a/xta-adapter/src/test/helm/xta_adapter_cronjob_routing_zufi_test.yaml b/xta-adapter/src/test/helm/xta_adapter_cronjob_routing_zufi_test.yaml deleted file mode 100644 index 1414a4e8248f7fa5985c23322f4f39367fe74603..0000000000000000000000000000000000000000 --- a/xta-adapter/src/test/helm/xta_adapter_cronjob_routing_zufi_test.yaml +++ /dev/null @@ -1,88 +0,0 @@ -# -# Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den -# Ministerpräsidenten des Landes Schleswig-Holstein -# Staatskanzlei -# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung -# -# Lizenziert unter der EUPL, Version 1.2 oder - sobald -# diese von der Europäischen Kommission genehmigt wurden - -# Folgeversionen der EUPL ("Lizenz"); -# Sie dürfen dieses Werk ausschließlich gemäß -# dieser Lizenz nutzen. -# Eine Kopie der Lizenz finden Sie hier: -# -# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 -# -# Sofern nicht durch anwendbare Rechtsvorschriften -# gefordert oder in schriftlicher Form vereinbart, wird -# die unter der Lizenz verbreitete Software "so wie sie -# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - -# ausdrücklich oder stillschweigend - verbreitet. -# Die sprachspezifischen Genehmigungen und Beschränkungen -# unter der Lizenz sind dem Lizenztext zu entnehmen. -# - -suite: test deployment zufi routing -release: - name: intelliform-adapter - namespace: sh-helm-test -templates: - - templates/xta_adapter_cronjob.yaml -set: - ozgcloud.environment: test - imagePullSecret: image-pull-secret -tests: - - it: should set zufi routing values when zufi is enabled - set: - routing: - routingStrategy: "ZUFI" - zufiManager: - address: "127.0.0.1" - negotiationType: "TLS" - asserts: - - contains: - path: spec.jobTemplate.spec.template.spec.containers[0].env - content: - name: grpc_client_zufi-manager_address - value: "127.0.0.1" - - contains: - path: spec.jobTemplate.spec.template.spec.containers[0].env - content: - name: grpc_client_zufi-manager_negotiationType - value: "TLS" - - - it: should not set zufi routing values when zufi is disabled - asserts: - - notContains: - path: spec.jobTemplate.spec.template.spec.containers[0].env - content: - name: grpc_client_zufi-manager_address - any: true - - notContains: - path: spec.jobTemplate.spec.template.spec.containers[0].env - content: - name: grpc_client_zufi-manager_negotiationType - any: true - - - it: should throw error if zufi manager address is not set - set: - routing: - routingStrategy: "ZUFI" - zufiManager: - negotiationType: "PLAINTEXT" - asserts: - - failedTemplate: - errorMessage: "routing.zufiManager.address must be set when routingStrategy=ZUFI" - - - it: should set default value for zufi negotiationType - set: - routing: - routingStrategy: "ZUFI" - zufiManager: - address: "127.0.0.1" - asserts: - - contains: - path: spec.jobTemplate.spec.template.spec.containers[0].env - content: - name: grpc_client_zufi-manager_negotiationType - value: "PLAINTEXT" \ No newline at end of file diff --git a/xta-adapter/src/test/helm/xta_adapter_cronjob_service_account_test.yaml b/xta-adapter/src/test/helm/xta_adapter_cronjob_service_account_test.yaml deleted file mode 100644 index 961dbcf209534074b292de2dd879abadef922625..0000000000000000000000000000000000000000 --- a/xta-adapter/src/test/helm/xta_adapter_cronjob_service_account_test.yaml +++ /dev/null @@ -1,55 +0,0 @@ -# -# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den -# Ministerpräsidenten des Landes Schleswig-Holstein -# Staatskanzlei -# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung -# -# Lizenziert unter der EUPL, Version 1.2 oder - sobald -# diese von der Europäischen Kommission genehmigt wurden - -# Folgeversionen der EUPL ("Lizenz"); -# Sie dürfen dieses Werk ausschließlich gemäß -# dieser Lizenz nutzen. -# Eine Kopie der Lizenz finden Sie hier: -# -# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 -# -# Sofern nicht durch anwendbare Rechtsvorschriften -# gefordert oder in schriftlicher Form vereinbart, wird -# die unter der Lizenz verbreitete Software "so wie sie -# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - -# ausdrücklich oder stillschweigend - verbreitet. -# Die sprachspezifischen Genehmigungen und Beschränkungen -# unter der Lizenz sind dem Lizenztext zu entnehmen. -# - -suite: test cronjob service account -templates: - - templates/xta_adapter_cronjob.yaml -release: - name: xta-adapter - namespace: helm-test -set: - ozgcloud.environment: test - imagePullSecret: image-pull-secret -tests: - - it: should use service account with default name - set: - serviceAccount: - create: true - asserts: - - equal: - path: spec.jobTemplate.spec.template.spec.serviceAccountName - value: xta-adapter-service-account - - it: should use service account with name - set: - serviceAccount: - create: true - name: helm-service-account - asserts: - - equal: - path: spec.jobTemplate.spec.template.spec.serviceAccountName - value: helm-service-account - - it: should use default service account - asserts: - - isNull: - path: spec.jobTemplate.spec.template.spec.serviceAccountName diff --git a/xta-adapter/src/test/helm/xta_adapter_cronjob_volumes_test.yaml b/xta-adapter/src/test/helm/xta_adapter_cronjob_volumes_test.yaml deleted file mode 100644 index 352f196bf1b8a8cafccb6fa868e8da0efe595636..0000000000000000000000000000000000000000 --- a/xta-adapter/src/test/helm/xta_adapter_cronjob_volumes_test.yaml +++ /dev/null @@ -1,93 +0,0 @@ -# -# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den -# Ministerpräsidenten des Landes Schleswig-Holstein -# Staatskanzlei -# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung -# -# Lizenziert unter der EUPL, Version 1.2 oder - sobald -# diese von der Europäischen Kommission genehmigt wurden - -# Folgeversionen der EUPL ("Lizenz"); -# Sie dürfen dieses Werk ausschließlich gemäß -# dieser Lizenz nutzen. -# Eine Kopie der Lizenz finden Sie hier: -# -# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 -# -# Sofern nicht durch anwendbare Rechtsvorschriften -# gefordert oder in schriftlicher Form vereinbart, wird -# die unter der Lizenz verbreitete Software "so wie sie -# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - -# ausdrücklich oder stillschweigend - verbreitet. -# Die sprachspezifischen Genehmigungen und Beschränkungen -# unter der Lizenz sind dem Lizenztext zu entnehmen. -# - -suite: test xta adapter cronjob volume -templates: - - templates/xta_adapter_cronjob.yaml -release: - name: xta-adapter - namespace: helm-test -set: - ozgcloud.environment: dev - imagePullSecret: image-pull-secret -tests: - - it: check volume mounts - set: - image.name: xta-adapter - xta: - identifiers: - - gae:test@ozg-sh.de - server: - name: test - address: 1.2.3.4 - asserts: - - contains: - path: spec.jobTemplate.spec.template.spec.containers[0].volumeMounts - content: - name: bindings - mountPath: "/bindings/ca-certificates/type" - subPath: type - readOnly: true - - contains: - path: spec.jobTemplate.spec.template.spec.containers[0].volumeMounts - content: - name: xta-root-ca - mountPath: "/bindings/ca-certificates/xta-root-ca.crt" - subPath: ca.crt - readOnly: true - - contains: - path: spec.jobTemplate.spec.template.spec.containers[0].volumeMounts - content: - name: xta-keystore - mountPath: "/workspace/keystore/xta-keystore.p12" - subPath: file - readOnly: true - - it: check volumes - set: - image.name: xta-adapter - xta: - identifiers: - - gae:test@ozg-sh.de - server: - name: test - address: 1.2.3.4 - asserts: - - contains: - path: spec.jobTemplate.spec.template.spec.volumes - content: - name: bindings - configMap: - name: xta-adapter-bindings-type - - contains: - path: spec.jobTemplate.spec.template.spec.volumes - content: - name: xta-root-ca - secret: - secretName: xta-root-ca - - contains: - path: spec.jobTemplate.spec.template.spec.volumes - content: - name: xta-keystore - secret: - secretName: xta-keystore diff --git a/xta-adapter/src/test/helm/xta_bindings_type_test.yaml b/xta-adapter/src/test/helm/xta_bindings_type_test.yaml deleted file mode 100644 index ad3697998319f96038442aa30f873ea9a7b343a5..0000000000000000000000000000000000000000 --- a/xta-adapter/src/test/helm/xta_bindings_type_test.yaml +++ /dev/null @@ -1,56 +0,0 @@ -# -# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den -# Ministerpräsidenten des Landes Schleswig-Holstein -# Staatskanzlei -# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung -# -# Lizenziert unter der EUPL, Version 1.2 oder - sobald -# diese von der Europäischen Kommission genehmigt wurden - -# Folgeversionen der EUPL ("Lizenz"); -# Sie dürfen dieses Werk ausschließlich gemäß -# dieser Lizenz nutzen. -# Eine Kopie der Lizenz finden Sie hier: -# -# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 -# -# Sofern nicht durch anwendbare Rechtsvorschriften -# gefordert oder in schriftlicher Form vereinbart, wird -# die unter der Lizenz verbreitete Software "so wie sie -# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - -# ausdrücklich oder stillschweigend - verbreitet. -# Die sprachspezifischen Genehmigungen und Beschränkungen -# unter der Lizenz sind dem Lizenztext zu entnehmen. -# - -suite: test xta bindings type configmap -templates: - - templates/xta_bindings_type_configmap.yaml -release: - name: xta-adapter - namespace: helm-test -tests: - - it: test xta bindings type - set: - image.name: xta-adapter - xta: - rootCa: Z2VoZWltCg== - asserts: - - isKind: - of: ConfigMap - - isAPIVersion: - of: v1 - - equal: - path: metadata.name - value: xta-adapter-bindings-type - - equal: - path: metadata.namespace - value: helm-test - - equal: - path: data.type - value: ca-certificates - - it: should not create config map by default - asserts: - - hasDocuments: - count: 0 - - \ No newline at end of file diff --git a/xta-adapter/src/test/helm/xta_keystore_secret_test.yaml b/xta-adapter/src/test/helm/xta_keystore_secret_test.yaml deleted file mode 100644 index fca872c103aee45ca3a2c8921abe48ad4a1bcd5d..0000000000000000000000000000000000000000 --- a/xta-adapter/src/test/helm/xta_keystore_secret_test.yaml +++ /dev/null @@ -1,64 +0,0 @@ -# -# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den -# Ministerpräsidenten des Landes Schleswig-Holstein -# Staatskanzlei -# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung -# -# Lizenziert unter der EUPL, Version 1.2 oder - sobald -# diese von der Europäischen Kommission genehmigt wurden - -# Folgeversionen der EUPL ("Lizenz"); -# Sie dürfen dieses Werk ausschließlich gemäß -# dieser Lizenz nutzen. -# Eine Kopie der Lizenz finden Sie hier: -# -# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 -# -# Sofern nicht durch anwendbare Rechtsvorschriften -# gefordert oder in schriftlicher Form vereinbart, wird -# die unter der Lizenz verbreitete Software "so wie sie -# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - -# ausdrücklich oder stillschweigend - verbreitet. -# Die sprachspezifischen Genehmigungen und Beschränkungen -# unter der Lizenz sind dem Lizenztext zu entnehmen. -# - -suite: test xta keystore secret -templates: - - templates/xta_keystore_secret.yaml -release: - name: xta-adapter - namespace: helm-test -tests: - - it: test xta keystore - set: - image.name: xta-adapter - xta: - keystore: - password: <geheim> - file: Z2VoZWltCg== - asserts: - - isKind: - of: Secret - - isAPIVersion: - of: v1 - - equal: - path: type - value: Opaque - - equal: - path: metadata.name - value: xta-keystore - - equal: - path: metadata.namespace - value: helm-test - - equal: - path: stringData.password - value: geheim - - equal: - path: data.file - value: Z2VoZWltCg== - - - it: should not create keystore by default - asserts: - - hasDocuments: - count: 0 - diff --git a/xta-adapter/src/test/helm/xta_root_ca_secret_test.yaml b/xta-adapter/src/test/helm/xta_root_ca_secret_test.yaml deleted file mode 100644 index f65bbcb9edc38e2fed6da3531eecaae8a69db205..0000000000000000000000000000000000000000 --- a/xta-adapter/src/test/helm/xta_root_ca_secret_test.yaml +++ /dev/null @@ -1,58 +0,0 @@ -# -# Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den -# Ministerpräsidenten des Landes Schleswig-Holstein -# Staatskanzlei -# Abteilung Digitalisierung und zentrales IT-Management der Landesregierung -# -# Lizenziert unter der EUPL, Version 1.2 oder - sobald -# diese von der Europäischen Kommission genehmigt wurden - -# Folgeversionen der EUPL ("Lizenz"); -# Sie dürfen dieses Werk ausschließlich gemäß -# dieser Lizenz nutzen. -# Eine Kopie der Lizenz finden Sie hier: -# -# https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 -# -# Sofern nicht durch anwendbare Rechtsvorschriften -# gefordert oder in schriftlicher Form vereinbart, wird -# die unter der Lizenz verbreitete Software "so wie sie -# ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - -# ausdrücklich oder stillschweigend - verbreitet. -# Die sprachspezifischen Genehmigungen und Beschränkungen -# unter der Lizenz sind dem Lizenztext zu entnehmen. -# - -suite: test xta root ca secret -templates: - - templates/xta_root_ca_secret.yaml -release: - name: xta-adapter - namespace: helm-test -tests: - - it: test xta root ca - set: - image.name: xta-adapter - xta: - rootCa: Z2VoZWltCg== - asserts: - - isKind: - of: Secret - - isAPIVersion: - of: v1 - - equal: - path: metadata.name - value: xta-root-ca - - equal: - path: type - value: Opaque - - equal: - path: metadata.namespace - value: helm-test - - equal: - path: data["ca.crt"] - value: Z2VoZWltCg== - - - it: should not create ca secret by default - asserts: - - hasDocuments: - count: 0 \ No newline at end of file diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xdomea/XdomeaMessageDataMapperTest.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xdomea/XdomeaMessageDataMapperTest.java deleted file mode 100644 index 11942226183afeda3ceba1e5d8bebd59ce173728..0000000000000000000000000000000000000000 --- a/xta-adapter/src/test/java/de/ozgcloud/eingang/xdomea/XdomeaMessageDataMapperTest.java +++ /dev/null @@ -1,217 +0,0 @@ -package de.ozgcloud.eingang.xdomea; - -import static de.ozgcloud.eingang.common.formdata.IncomingFileGroupTestFactory.*; -import static de.ozgcloud.eingang.xdomea.XdomeaMessageDataMapper.*; -import static org.assertj.core.api.Assertions.*; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.Mockito.*; - -import java.util.Collection; -import java.util.List; -import java.util.stream.Stream; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.ValueSource; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Spy; - -import de.ozgcloud.eingang.common.errorhandling.TechnicalException; -import de.ozgcloud.eingang.common.formdata.IncomingFile; -import de.ozgcloud.eingang.common.formdata.IncomingFileGroup; -import de.ozgcloud.eingang.common.formdata.IncomingFileTestFactory; - -class XdomeaMessageDataMapperTest { - - @Spy - @InjectMocks - private XdomeaMessageDataMapper fileClassifier; - - @Mock - private XdomeaXMLValueReader valueReader; - - @DisplayName("map incoming files to representations attachments pair") - @Nested - class TestMapIncomingFilesToRepresentationsAttachmentsPair { - - @Mock - private List<IncomingFile> incomingFileList; - - @DisplayName("should map representations") - @ParameterizedTest - @ValueSource(booleans = { true, false }) - void shouldMapRepresentations(boolean useUuidPrefix) { - mockXdomeaMessageData(useUuidPrefix); - - var pair = fileClassifier.mapIncomingFilesToRepresentationsAttachmentsPair(incomingFileList); - - var representationFilenames = pair.representations().stream().map(IncomingFile::getName).toList(); - assertThat(representationFilenames).containsExactly(XDOMEA_XML_NAME, REPR_XML_NAME, REPR_PDF_NAME); - } - - @DisplayName("should map attachments") - @ParameterizedTest - @ValueSource(booleans = { true, false }) - void shouldMapAttachments(boolean useUuidPrefix) { - mockXdomeaMessageData(useUuidPrefix); - - var pair = fileClassifier.mapIncomingFilesToRepresentationsAttachmentsPair(incomingFileList); - - var attachmentFilenames = pair.attachments().stream() - .map(IncomingFileGroup::getFiles) - .flatMap(Collection::stream) - .map(IncomingFile::getName) - .toList(); - assertThat(attachmentFilenames).containsExactly(ATTATCHMENT_XML_NAME, ATTATCHMENT_PNG_NAME, ATTATCHMENT_PDF_NAME); - } - - private void mockXdomeaMessageData(boolean useUuidPrefix) { - doReturn(XdomeaMessageDataTestFactory.create(useUuidPrefix)).when(fileClassifier).mapIncomingFilesToXdomeaMessageData(incomingFileList); - } - - } - - @DisplayName("find Xdomea XML file") - @Nested - class TestFindXdomeaXmlFile { - - private static final String FILE_NAME_WITHOUT_SUFFIX = "some-file-name.xml"; - private static final String FILE_NAME_WITH_SUFFIX = "some-file-name" + XDOMEA_0201_XML_FILE_NAME_SUFFIX; - - @DisplayName("should throw if not found") - @Test - void shouldThrowIfNotFound() { - var incomingFilesWithout = List.of(IncomingFileTestFactory.createBuilder().name(FILE_NAME_WITHOUT_SUFFIX).build()); - - assertThatThrownBy(() -> fileClassifier.findXdomeaXMLFile(incomingFilesWithout)) - .isInstanceOf(TechnicalException.class); - } - - @DisplayName("should return if found") - @Test - void shouldReturnIfFound() { - var targetIncomingFile = IncomingFileTestFactory.createBuilder().name(FILE_NAME_WITH_SUFFIX).build(); - var incomingFilesWith = List.of( - IncomingFileTestFactory.createBuilder().name(FILE_NAME_WITHOUT_SUFFIX).build(), - targetIncomingFile - ); - - var primaryRepresentation = fileClassifier.findXdomeaXMLFile(incomingFilesWith); - - assertThat(primaryRepresentation).isEqualTo(targetIncomingFile); - } - } - - @DisplayName("find primary representation name") - @Nested - class TestFindPrimaryRepresentationName { - private static final String FILE_NAME_WITHOUT_XML_SUFFIX = "some-file-name.pdf"; - private static final String FILE_NAME_WITHOUT_XML_SUFFIX2 = "some-file-name.xml.pdf"; - private static final String FILE_NAME_WITH_XML_SUFFIX = "some-file-name.xml"; - private static final String FILE_NAME_WITH_XML_SUFFIX2 = "some-file-name.pdf.xml"; - - @DisplayName("should throw if no xml suffix") - @Test - void shouldThrowIfNoXmlSuffix() { - var listWithoutSuffix = List.of(FILE_NAME_WITHOUT_XML_SUFFIX, FILE_NAME_WITHOUT_XML_SUFFIX2); - - assertThrows(TechnicalException.class, () -> fileClassifier.findPrimaryRepresentationName(listWithoutSuffix)); - } - - @DisplayName("should return first with xml suffix") - @Test - void shouldReturnFirstWithXmlSuffix() { - var listWithSuffix = List.of(FILE_NAME_WITHOUT_XML_SUFFIX, FILE_NAME_WITH_XML_SUFFIX, FILE_NAME_WITHOUT_XML_SUFFIX2, - FILE_NAME_WITH_XML_SUFFIX2); - - var fileName = fileClassifier.findPrimaryRepresentationName(listWithSuffix); - - assertThat(fileName).isEqualTo(FILE_NAME_WITH_XML_SUFFIX); - } - } - - @DisplayName("classify attachments and representations") - @Nested - class TestClassifyAttachmentsAndRepresentations { - - @Mock - private IncomingFile xdomeaXMLFile; - - private List<IncomingFile> incomingFileList; - - @BeforeEach - void mock() { - incomingFileList = Stream.of( - XDOMEA_XML_NAME, - REPR_XML_NAME, - REPR_PDF_NAME, - ATTATCHMENT_XML_NAME, - ATTATCHMENT_PNG_NAME, - ATTATCHMENT_PDF_NAME - ) - .map(name -> IncomingFileTestFactory.createBuilder().name(name).build()) - .toList(); - doReturn(xdomeaXMLFile).when(fileClassifier).findXdomeaXMLFile(incomingFileList); - - when(xdomeaXMLFile.getName()).thenReturn(XDOMEA_XML_NAME); - - var representationFileNames = List.of(REPR_PDF_NAME, REPR_XML_NAME); - when(valueReader.readRepresentationFileNames(xdomeaXMLFile)).thenReturn(representationFileNames); - doReturn(REPR_XML_NAME).when(fileClassifier).findPrimaryRepresentationName(representationFileNames); - } - - @DisplayName("should contain xdomea metadata file") - @Test - void shouldContainXdomeaMetadataFile() { - var classification = doClassify(); - - var primaryDocument = classification.metadataFile(); - assertThat(primaryDocument.getName()).isEqualTo(XDOMEA_XML_NAME); - } - - @DisplayName("should contain representations") - @Test - void shouldContainRepresentations() { - var classification = doClassify(); - - var resultRepresentationFileNames = classification.representations().stream() - .map(IncomingFile::getName) - .toList(); - // Expect that the primary representation xml file is moved to the first position - assertThat(resultRepresentationFileNames).isEqualTo(List.of(REPR_XML_NAME, REPR_PDF_NAME)); - } - - @DisplayName("should contain attachments") - @Test - void shouldContainAttachments() { - var classification = doClassify(); - - var resultAttachmentFileNames = classification.attachments() - .getFirst() - .getFiles().stream() - .map(IncomingFile::getName) - .toList(); - assertThat(resultAttachmentFileNames).isEqualTo(List.of(ATTATCHMENT_XML_NAME, ATTATCHMENT_PNG_NAME, ATTATCHMENT_PDF_NAME)); - } - - @DisplayName("should have attachment group name") - @Test - void shouldHaveAttachmentGroupName() { - var classification = doClassify(); - - var resultAttachmentGroupName = classification.attachments() - .getFirst() - .getName(); - assertThat(resultAttachmentGroupName).isEqualTo(ATTACHMENT_GROUP_NAME); - } - - private XdomeaMessageData doClassify() { - return fileClassifier.mapIncomingFilesToXdomeaMessageData(incomingFileList); - } - } - -} diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xdomea/XdomeaMessageDataTestFactory.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xdomea/XdomeaMessageDataTestFactory.java deleted file mode 100644 index c9064a930eebc2837fa562b2070634886a03ad4e..0000000000000000000000000000000000000000 --- a/xta-adapter/src/test/java/de/ozgcloud/eingang/xdomea/XdomeaMessageDataTestFactory.java +++ /dev/null @@ -1,45 +0,0 @@ -package de.ozgcloud.eingang.xdomea; - -import static de.ozgcloud.eingang.common.formdata.IncomingFileGroupTestFactory.*; - -import java.util.UUID; -import java.util.stream.Stream; - -import de.ozgcloud.eingang.common.formdata.IncomingFileGroup; -import de.ozgcloud.eingang.common.formdata.IncomingFileTestFactory; - -public class XdomeaMessageDataTestFactory { - public static XdomeaMessageData create(boolean useUuidPrefix) { - return createBuilder(useUuidPrefix).build(); - } - - public static XdomeaMessageData.XdomeaMessageDataBuilder createBuilder(boolean useUuidPrefix) { - var incomingFiles = Stream.of( - XDOMEA_XML_NAME, - REPR_XML_NAME, - REPR_PDF_NAME, - ATTATCHMENT_XML_NAME, - ATTATCHMENT_PNG_NAME, - ATTATCHMENT_PDF_NAME - ) - .map(name -> useUuidPrefix ? withUUIDPrefix(name) : name) - .map(name -> IncomingFileTestFactory.createBuilder().name(name).build()) - .toList(); - - return XdomeaMessageData.builder() - .metadataFile(incomingFiles.getFirst()) - .representations(incomingFiles.subList(1, 3)) - .attachments(incomingFiles.subList(3, 6).stream() - .map(incomingFile -> IncomingFileGroup.builder() - .name("group-name") - .file(incomingFile) - .build()) - .toList() - ); - } - - private static String withUUIDPrefix(String name) { - return UUID.randomUUID() + "_" + name; - } - -} diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xdomea/XdomeaXMLValueReaderTest.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xdomea/XdomeaXMLValueReaderTest.java deleted file mode 100644 index 88d7d7cdae588621eee777d12af476eda7cd7abb..0000000000000000000000000000000000000000 --- a/xta-adapter/src/test/java/de/ozgcloud/eingang/xdomea/XdomeaXMLValueReaderTest.java +++ /dev/null @@ -1,59 +0,0 @@ -package de.ozgcloud.eingang.xdomea; - -import static org.assertj.core.api.Assertions.*; -import static org.mockito.Mockito.*; - -import java.nio.charset.StandardCharsets; - -import org.apache.commons.io.IOUtils; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.ValueSource; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Spy; - -import de.ozgcloud.common.test.TestUtils; -import de.ozgcloud.eingang.common.formdata.IncomingFile; -import lombok.SneakyThrows; - -class XdomeaXMLValueReaderTest { - private static final String XML_FILE_NAME = "file.xml"; - private static final String PDF_FILE_NAME = "file.pdf"; - private static final String XML_ATTACHMENT_FILE_NAME = "saml-attachment-file.xml"; - - @Spy - @InjectMocks - private XdomeaXMLValueReader valueReader; - - @DisplayName("read representation file names") - @Nested - class TestReadRepresentationFileNames { - - @Mock - IncomingFile incomingXmlFile; - - @DisplayName("should find 'Dateiname' elements and all XML-files in MSR mantelantrag") - @ParameterizedTest - @ValueSource(strings = { - "xdomea/mantelantrag_Geschaeftsgang.Geschaeftsgang.0201.xml", - "xdomea/dfoerdermittel_Geschaeftsgang.Geschaeftsgang.0201.xml" - }) - @SneakyThrows - void shouldFindDateinameElements(String antragXMLFilename) { - var xmlString = TestUtils.loadTextFile( - antragXMLFilename, - XML_FILE_NAME + "\n", - PDF_FILE_NAME, - "\n" + XML_ATTACHMENT_FILE_NAME + "\n"); - when(incomingXmlFile.getContentStream()).thenReturn(IOUtils.toInputStream(xmlString, StandardCharsets.UTF_8)); - - var names = valueReader.readRepresentationFileNames(incomingXmlFile); - - assertThat(names).containsExactly(XML_FILE_NAME, PDF_FILE_NAME, XML_ATTACHMENT_FILE_NAME); - } - - } - -} diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/FormDataTestFactory.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/FormDataTestFactory.java deleted file mode 100644 index 509880984a7ee0a50eb1fa424541121e7c58909e..0000000000000000000000000000000000000000 --- a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/FormDataTestFactory.java +++ /dev/null @@ -1,17 +0,0 @@ -package de.ozgcloud.eingang.xta; - -import de.ozgcloud.eingang.common.formdata.FormData; - -class FormDataTestFactory { - - static FormData create() { - return createBuilder().build(); - } - - static FormData.FormDataBuilder createBuilder() { - return FormData.builder() - .header(FormHeaderTestFactory.create()) - .numberOfRepresentations(1); - } - -} diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/FormHeaderTestFactory.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/FormHeaderTestFactory.java deleted file mode 100644 index be839ff4c74e238e98aed2a2237fe2f154ed59e4..0000000000000000000000000000000000000000 --- a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/FormHeaderTestFactory.java +++ /dev/null @@ -1,27 +0,0 @@ -package de.ozgcloud.eingang.xta; - -import de.ozgcloud.eingang.common.formdata.FormHeader; -import de.ozgcloud.eingang.common.formdata.FormHeader.FormHeaderBuilder; - -public class FormHeaderTestFactory { - - private static final String FORM_NAME = "xdomea"; - static final String VORGANGNUMMER = "vorgangNummer"; - static final String CHANNEL = "XTA"; - static final String FIM_FORM_ENGINE_NAME = "FIM"; - static final String XDOMEA_FORM_ENGINE_NAME = "XDOMEA"; - - static FormHeader create() { - return createBuilder().build(); - } - - static FormHeaderBuilder createBuilder() { - return FormHeader.builder() - .sender("XTA") - .requestId(XtaMessageTestFactory.MESSAGE_ID.toString()) - .vorgangNummer(VORGANGNUMMER) - .formName(FORM_NAME) - .formId(XtaMessageMetaDataTestFactory.MESSAGE_TYPE) - .createdAt(XtaMessageMetaDataTestFactory.ORIGIN); - } -} diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/MessageMetaDataTestFactory.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/MessageMetaDataTestFactory.java deleted file mode 100644 index f6faf22af1a6eeebbce3696acb9f3a39e29e073c..0000000000000000000000000000000000000000 --- a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/MessageMetaDataTestFactory.java +++ /dev/null @@ -1,22 +0,0 @@ -package de.ozgcloud.eingang.xta; - -import static de.ozgcloud.eingang.xta.XtaMessageTestFactory.*; - -import org.w3._2005._08.addressing.AttributedURIType; - -import eu.osci.ws._2014._10.transport.MessageMetaData; -import eu.osci.ws._2014._10.transport.MsgIdentificationType; - -class MessageMetaDataTestFactory { - - static MessageMetaData create() { - var result = new MessageMetaData(); - var identification = new MsgIdentificationType(); - var uri = new AttributedURIType(); - uri.setValue(MESSAGE_ID.toString()); - identification.setMessageID(uri); - result.setMsgIdentification(identification); - - return result; - } -} diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/MsgStatusListTypeAndHeaderResponseTestFactory.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/MsgStatusListTypeAndHeaderResponseTestFactory.java deleted file mode 100644 index 955fab809aa6298bfc494cae57dfc57b2937d249..0000000000000000000000000000000000000000 --- a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/MsgStatusListTypeAndHeaderResponseTestFactory.java +++ /dev/null @@ -1,20 +0,0 @@ -package de.ozgcloud.eingang.xta; - -import java.util.stream.Stream; - -import eu.osci.ws._2014._10.transport.MessageMetaData; - -class MsgStatusListTypeAndHeaderResponseTestFactory { - - public static final MessageMetaData MESSAGE1 = MessageMetaDataTestFactory.create(); - - public static MsgStatusListTypeAndHeaderResponse create() { - return createBuilder().build(); - } - - public static MsgStatusListTypeAndHeaderResponse.MsgStatusListTypeAndHeaderResponseBuilder createBuilder() { - return MsgStatusListTypeAndHeaderResponse.builder() - .msgBoxRequestID(null) - .messages(Stream.of(MESSAGE1)); - } -} diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/MsgStatusListTypeTestFactory.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/MsgStatusListTypeTestFactory.java deleted file mode 100644 index 17c8564b1059d26cf76347506cbd41addb0380fb..0000000000000000000000000000000000000000 --- a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/MsgStatusListTypeTestFactory.java +++ /dev/null @@ -1,13 +0,0 @@ -package de.ozgcloud.eingang.xta; - -import eu.osci.ws._2008._05.transport.MsgStatusListType; - -class MsgStatusListTypeTestFactory { - - static MsgStatusListType create() { - var result = new MsgStatusListType(); - result.getMessageMetaData().add(MessageMetaDataTestFactory.create()); - return result; - } - -} diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/RepresentationsAttachmentsPairTestFactory.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/RepresentationsAttachmentsPairTestFactory.java deleted file mode 100644 index 735e3d1f79b967c3b3f7401ece6183e91333c04b..0000000000000000000000000000000000000000 --- a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/RepresentationsAttachmentsPairTestFactory.java +++ /dev/null @@ -1,31 +0,0 @@ -package de.ozgcloud.eingang.xta; - -import java.util.List; - -import de.ozgcloud.eingang.common.formdata.IncomingFile; -import de.ozgcloud.eingang.common.formdata.IncomingFileGroup; -import de.ozgcloud.eingang.common.formdata.IncomingFileGroupTestFactory; -import de.ozgcloud.eingang.common.formdata.IncomingFileTestFactory; - -public class RepresentationsAttachmentsPairTestFactory { - static List<IncomingFile> PAIR_REPRESENTATIONS = List.of( - IncomingFileTestFactory.createBuilder().name("representation1.xml").build(), - IncomingFileTestFactory.createBuilder().name("representation1.pdf").build() - ); - - static List<IncomingFileGroup> PAIR_ATTACHMENTS = List.of( - IncomingFileGroupTestFactory.create(), - IncomingFileGroupTestFactory.create(), - IncomingFileGroupTestFactory.create() - ); - - static RepresentationsAttachmentsPair create() { - return createBuilder().build(); - } - - static RepresentationsAttachmentsPair.RepresentationsAttachmentsPairBuilder createBuilder() { - return RepresentationsAttachmentsPair.builder() - .representations(PAIR_REPRESENTATIONS) - .attachments(PAIR_ATTACHMENTS); - } -} diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaApplicationTest.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaApplicationTest.java deleted file mode 100644 index 8e2d830f342905d66d07dca69cd304b92bef142c..0000000000000000000000000000000000000000 --- a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaApplicationTest.java +++ /dev/null @@ -1,21 +0,0 @@ -package de.ozgcloud.eingang.xta; - -import static org.junit.jupiter.api.Assertions.*; - -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.ActiveProfiles; - -import de.ozgcloud.eingang.Application; - -@ActiveProfiles({ "local", "itcase" }) -@SpringBootTest(classes = Application.class) -class XtaApplicationTest { - - @Test - void startup() { - // should start without exception; - assertTrue(true); - } - -} diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaCurrentIdentifierServiceTest.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaCurrentIdentifierServiceTest.java deleted file mode 100644 index 884faf6b4dad5eda37f6be16c92b4e88cc3d095a..0000000000000000000000000000000000000000 --- a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaCurrentIdentifierServiceTest.java +++ /dev/null @@ -1,44 +0,0 @@ -package de.ozgcloud.eingang.xta; - -import static org.assertj.core.api.Assertions.*; -import static org.mockito.Mockito.*; - -import java.util.List; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Spy; - -class XtaCurrentIdentifierServiceTest { - - private static final String IDENTIFIER1 = "identifier1"; - private static final String IDENTIFIER2 = "identifier2"; - private static final List<String> IDENTIFIERS = List.of(IDENTIFIER1, IDENTIFIER2); - - @Spy - @InjectMocks - private XtaCurrentIdentifierService service; - - @Mock - private XtaProperties properties; - - @DisplayName("get identifiers") - @Nested - class TestGetIdentifiers { - @BeforeEach - void mock() { - when(properties.getIdentifiers()).thenReturn(IDENTIFIERS); - } - - @DisplayName("should return") - @Test - void shouldReturn() { - assertThat(service.getIdentifiers()).isEqualTo(IDENTIFIERS); - } - } - -} diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaFileTestFactory.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaFileTestFactory.java deleted file mode 100644 index a94916100583d520de553cd29cc89ad075f19919..0000000000000000000000000000000000000000 --- a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaFileTestFactory.java +++ /dev/null @@ -1,47 +0,0 @@ -package de.ozgcloud.eingang.xta; - -import java.io.File; -import java.io.InputStream; -import java.math.BigInteger; -import java.nio.charset.StandardCharsets; - -import org.apache.commons.io.FileUtils; - -import lombok.SneakyThrows; - -class XtaFileTestFactory { - - static final String NAME = "Test_File"; - static final String CONTENT = "slkafj3jifsdasx"; - static final String ZIP_CONTENT_TYPE = "application/zip"; - - static XtaFile create() { - return createBuilder().build(); - } - - static XtaFile.XtaFileBuilder createBuilder() { - return XtaFile.builder() - .name(NAME) - .contentType(ZIP_CONTENT_TYPE) - .file(createFile()); - } - - @SneakyThrows - private static File createFile() { - File tFile = File.createTempFile("test", ".zip"); - tFile.deleteOnExit(); - - FileUtils.write(tFile, CONTENT, StandardCharsets.UTF_8); - - return tFile; - } - - @SneakyThrows - static XtaFile withFileContent(InputStream stream, String fileName) { - File tFile = File.createTempFile(fileName, ".zip"); - tFile.deleteOnExit(); - - FileUtils.copyInputStreamToFile(stream, tFile); - return createBuilder().name(fileName).size(BigInteger.valueOf(tFile.length())).file(tFile).build(); - } -} diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaITCase.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaITCase.java deleted file mode 100644 index 8ab2ef0721098071ed195be0f18fcdd6a6e8f456..0000000000000000000000000000000000000000 --- a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaITCase.java +++ /dev/null @@ -1,327 +0,0 @@ -package de.ozgcloud.eingang.xta; - -import static org.assertj.core.api.Assertions.*; -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.*; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; -import java.util.List; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.ValueSource; -import org.mockito.ArgumentCaptor; -import org.mockito.Captor; -import org.mockito.Mock; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.boot.test.mock.mockito.SpyBean; -import org.springframework.context.annotation.Bean; -import org.springframework.test.context.ActiveProfiles; - -import de.ozgcloud.eingang.Application; -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.router.ManagableStub; -import de.ozgcloud.eingang.router.VorgangManagerServerResolver; -import de.ozgcloud.eingang.router.VorgangRemoteService; -import de.ozgcloud.vorgang.grpc.binaryFile.BinaryFileServiceGrpc.BinaryFileServiceStub; -import de.ozgcloud.vorgang.vorgang.GrpcEingang; -import de.ozgcloud.vorgang.vorgang.VorgangServiceGrpc.VorgangServiceBlockingStub; -import io.grpc.Channel; - -@SpringBootTest(classes = { - Application.class, - XtaITCase.ActivateXTARunnerConfig.class -}) -@ActiveProfiles({ "itcase" }) -class XtaITCase { - - @SpyBean - private VorgangRemoteService vorgangRemoteService; - @MockBean - private VorgangManagerServerResolver resolver; - - @Mock - private ManagableStub<VorgangServiceBlockingStub> vorgangManageableServiceStub; - @Mock - private VorgangServiceBlockingStub vorgangServiceStub; - @Mock - private ManagableStub<BinaryFileServiceStub> binaryFileManageableServiceStub; - @Mock - private BinaryFileServiceStub binaryFileServiceStub; - - @Mock - private Channel channel; - - @MockBean - private XtaRemoteService xtaRemoteService; - - @Captor - private ArgumentCaptor<FormData> formDataArgumentCaptor; - - @Captor - private ArgumentCaptor<GrpcEingang> eingangArgumentCaptor; - - @Autowired - private XtaRunner runner; - - @BeforeEach - void initTest() { - when(resolver.resolveVorgangServiceBlockingStubByOrganisationseinheitenId(any())).thenReturn(vorgangManageableServiceStub); - when(vorgangManageableServiceStub.get()).thenReturn(vorgangServiceStub); - when(vorgangServiceStub.getChannel()).thenReturn(channel); - when(channel.authority()).thenReturn("authorityDummy"); - - when(resolver.resolveBinaryFileServiceStubByOrganisationsEinheitId(any())).thenReturn(binaryFileManageableServiceStub); - when(binaryFileManageableServiceStub.get()).thenReturn(binaryFileServiceStub); - } - - @DisplayName("run get xta messages") - @Nested - class TestRunGetXtaMessages { - @BeforeEach - void setup() { - doReturn("vorgangId(unused)").when(vorgangRemoteService).createVorgang(any(), any(), any(), any()); - } - - @DisplayName("should have three representations with pdf") - @TestZipFileNamesWithPdf - void shouldHaveThreeRepresentationsWithPdf(String zipFileName) { - mockNachrichtenBroker(zipFileName); - - runner.runGetXtaMessages(); - - var eingang = captureEingang(); - assertThat(eingang.getNumberOfRepresentations()).isEqualTo(3); - } - - @DisplayName("should send two representations without pdf") - @TestZipFileNamesWithoutPdf - void shouldSendTwoXMLRepresentationsWithoutPdf(String zipFileName) { - mockNachrichtenBroker(zipFileName); - - runner.runGetXtaMessages(); - - var eingang = captureEingang(); - assertThat(eingang.getNumberOfRepresentations()).isEqualTo(2); - } - - @DisplayName("should have no attachments") - @TestZipFileNamesWithoutAnlage - void shouldHaveNoAttachments(String zipFileName) { - mockNachrichtenBroker(zipFileName); - - runner.runGetXtaMessages(); - - var eingang = captureEingang(); - assertThat(eingang.getNumberOfAttachments()).isZero(); - } - - @DisplayName("should have one attachment") - @TestZipFileNamesWithAnlage - void shouldHaveOneAttachment(String zipFileName) { - mockNachrichtenBroker(zipFileName); - - runner.runGetXtaMessages(); - - var eingang = captureEingang(); - assertThat(eingang.getNumberOfAttachments()).isEqualTo(1); - } - - @DisplayName("should have postfach id") - @TestZipFileNamesWithServiceKonto - void shouldHavePostfachId(String zipFileName) { - mockNachrichtenBroker(zipFileName); - - runner.runGetXtaMessages(); - - var serviceKonto = captureEingang() - .getHeader() - .getServiceKonto(); - assertThat(serviceKonto).isNotNull(); - var postfachId = serviceKonto - .getPostfachAddresses(0) - .getIdentifier() - .getProperty(0) - .getValue(0); - assertThat(postfachId).isEqualTo("4dd01647-b9d9-4775-1b50-08da3d83800a"); - } - - @DisplayName("should have organistationseinheit ID") - @TestZipFileNames - void shouldHaveOrganistationseinheitId(String zipFileName) { - mockNachrichtenBroker(zipFileName); - - runner.runGetXtaMessages(); - - var organisationseinheitenId = captureEingang() - .getZustaendigeStelle() - .getOrganisationseinheitenId(); - assertThat(organisationseinheitenId).isEqualTo("9795669"); - } - - @DisplayName("should have generated vorgang nummer for dFoerdermittel") - @Test - void shouldHaveVorgangsnummer() { - mockNachrichtenBroker("dfoerdermittel_with_anlage.zip"); - - runner.runGetXtaMessages(); - - var vorgangsNummer = captureEingang() - .getHeader() - .getVorgangNummer(); - assertThat(vorgangsNummer).hasSameSizeAs("4627-TY3X"); - } - - @DisplayName("should have vorgang nummer for AFM") - @TestZipFileNamesFromAFM - void shouldHaveVorgangsnummerForAfm(String zipFileName) { - mockNachrichtenBroker(zipFileName); - - runner.runGetXtaMessages(); - - var vorgangsNummer = captureEingang() - .getHeader() - .getVorgangNummer(); - assertThat(vorgangsNummer).hasSameSizeAs("20240404370530710707"); - } - - @DisplayName("should use xta vorgangsnummer for FIM") - @Test - void shouldUseVorgangsnummerForFIM() { - mockNachrichtenBroker("versammlungsanzeige.xml"); - - runner.runGetXtaMessages(); - - var vorgangNummer = captureEingang().getHeader().getVorgangNummer(); - assertThat(vorgangNummer).hasSize(9); - } - - @DisplayName("should have one attachment for FIM") - @Test - void shouldHaveOneRepresentationForFim() { - mockNachrichtenBroker("versammlungsanzeige.xml"); - - runner.runGetXtaMessages(); - - var eingang = captureEingang(); - assertThat(eingang.getNumberOfRepresentations()).isEqualTo(1); - } - - private GrpcEingang captureEingang() { - verify(vorgangRemoteService, times(1)) - .createVorgang( - formDataArgumentCaptor.capture(), - eingangArgumentCaptor.capture(), any(), any()); - - assertThat(formDataArgumentCaptor.getValue()).isNotNull(); - - return eingangArgumentCaptor.getValue(); - } - } - - private void mockNachrichtenBroker(String zipFileName) { - when(xtaRemoteService.getMessage(any(XtaMessageId.class))).thenReturn( - XtaResponseTestFactory.createGetMessageResponse(zipFileName)); - when(xtaRemoteService.getMessagesMetadata()) - .thenReturn(XtaResponseTestFactory.createGetStatusListResponse(List.of(zipFileName))); - when(xtaRemoteService.getNextMessagesMetadata(any())) - .thenReturn(XtaResponseTestFactory.createEmptyGetStatusListResponse()); - } - - @Target({ ElementType.METHOD }) - @Retention(RetentionPolicy.RUNTIME) - @ParameterizedTest - @ValueSource(strings = { - "dfoerdermittel_without_anlage.zip", - "brauchtumsfeuer_without_anlage.zip", - "mantelantrag_without_anlage.zip" - }) - @interface TestZipFileNamesWithoutAnlage { - } - - @Target({ ElementType.METHOD }) - @Retention(RetentionPolicy.RUNTIME) - @ParameterizedTest - @ValueSource(strings = { - "dfoerdermittel_with_anlage.zip", - "brauchtumsfeuer_with_anlage.zip", - "mantelantrag_with_anlage.zip" - }) - @interface TestZipFileNamesWithAnlage { - } - - @Target({ ElementType.METHOD }) - @Retention(RetentionPolicy.RUNTIME) - @ParameterizedTest - @ValueSource(strings = { - "dfoerdermittel_without_anlage.zip", - "mantelantrag_without_anlage.zip", - "brauchtumsfeuer_without_anlage.zip", - "dfoerdermittel_with_anlage.zip", - "mantelantrag_with_anlage.zip", - "brauchtumsfeuer_with_anlage.zip", - }) - @interface TestZipFileNamesWithPdf { - } - - @Target({ ElementType.METHOD }) - @Retention(RetentionPolicy.RUNTIME) - @ParameterizedTest - @ValueSource(strings = { - "waffenschein.zip" - }) - @interface TestZipFileNamesWithoutPdf { - } - - @Target({ ElementType.METHOD }) - @Retention(RetentionPolicy.RUNTIME) - @ParameterizedTest - @ValueSource(strings = { - "mantelantrag_without_anlage.zip", - "brauchtumsfeuer_without_anlage.zip", - "mantelantrag_with_anlage.zip", - "brauchtumsfeuer_with_anlage.zip", - }) - @interface TestZipFileNamesFromAFM { - } - - @Target({ ElementType.METHOD }) - @Retention(RetentionPolicy.RUNTIME) - @ParameterizedTest - @ValueSource(strings = { - "dfoerdermittel_without_anlage.zip", - "dfoerdermittel_with_anlage.zip", - }) - @interface TestZipFileNamesWithServiceKonto { - } - - @Target({ ElementType.METHOD }) - @Retention(RetentionPolicy.RUNTIME) - @ParameterizedTest - @ValueSource(strings = { - "dfoerdermittel_without_anlage.zip", - "mantelantrag_without_anlage.zip", - "brauchtumsfeuer_without_anlage.zip", - "dfoerdermittel_with_anlage.zip", - "mantelantrag_with_anlage.zip", - "brauchtumsfeuer_with_anlage.zip", - "waffenschein.zip" - }) - @interface TestZipFileNames { - } - - static class ActivateXTARunnerConfig { - @Bean - XtaRunner xtaRunner() { - return new XtaRunner(); - } - } -} diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaIncomingFilesMapperTest.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaIncomingFilesMapperTest.java deleted file mode 100644 index 8adbed4598d7224e121e0d723c6c29baf0456361..0000000000000000000000000000000000000000 --- a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaIncomingFilesMapperTest.java +++ /dev/null @@ -1,139 +0,0 @@ -/* - * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch das - * Ministerium für Energiewende, Klimaschutz, Umwelt und Natur - * Zentrales IT-Management - * - * Lizenziert unter der EUPL, Version 1.2 oder - sobald - * diese von der Europäischen Kommission genehmigt wurden - - * Folgeversionen der EUPL ("Lizenz"); - * Sie dürfen dieses Werk ausschließlich gemäß - * dieser Lizenz nutzen. - * Eine Kopie der Lizenz finden Sie hier: - * - * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 - * - * Sofern nicht durch anwendbare Rechtsvorschriften - * gefordert oder in schriftlicher Form vereinbart, wird - * die unter der Lizenz verbreitete Software "so wie sie - * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - - * ausdrücklich oder stillschweigend - verbreitet. - * Die sprachspezifischen Genehmigungen und Beschränkungen - * unter der Lizenz sind dem Lizenztext zu entnehmen. - */ - -package de.ozgcloud.eingang.xta; - -import static org.assertj.core.api.Assertions.*; -import static org.mockito.Mockito.*; - -import java.util.List; -import java.util.stream.Stream; - -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Spy; - -import de.ozgcloud.eingang.common.formdata.IncomingFile; -import de.ozgcloud.eingang.common.formdata.IncomingFileTestFactory; -import de.ozgcloud.eingang.xta.zip.ZipFileExtractor; - -class XtaIncomingFilesMapperTest { - @Spy - @InjectMocks - private XtaIncomingFilesMapper mapper; - - @Mock - private ZipFileExtractor extractor; - - @Nested - class TestToIncomingFiles { - - @Test - void shouldMapToIncomingFiles() { - var xtaFile = XtaFileTestFactory.create(); - var incomingFile = IncomingFileTestFactory.create(); - when(mapper.toIncomingFile(xtaFile)).thenReturn(incomingFile); - when(mapper.tryToExtractZip(incomingFile)).thenAnswer(x -> Stream.of(incomingFile)); - - mapper.toIncomingFiles(List.of(xtaFile, xtaFile)); - - inOrder(mapper).verify(mapper, calls(2)).toIncomingFile(xtaFile); - inOrder(mapper).verify(mapper, calls(2)).tryToExtractZip(incomingFile); - } - - @Test - void shouldHandleMissingMessageFile() { - var fileGroup = mapper.toIncomingFiles(null); - - assertThat(fileGroup).isEmpty(); - } - } - - @Nested - class ToIncomingFile { - @Test - void shouldHaveMessageFile() { - var inFile = mapper.toIncomingFile(XtaFileTestFactory.create()); - - assertThat(inFile.getContentStream()).isNotNull(); - } - - @Test - void shouldHaveFileName() { - var inFile = mapper.toIncomingFile(XtaFileTestFactory.create()); - - assertThat(inFile.getName()).isEqualTo(XtaFileTestFactory.NAME); - } - - @Test - void shouldHaveZipContentType() { - var inFile = mapper.toIncomingFile(XtaFileTestFactory.create()); - - assertThat(inFile.getContentType()).isEqualTo(XtaFileTestFactory.ZIP_CONTENT_TYPE); - } - - @Test - void shouldHaveSize() { - var inFile = mapper.toIncomingFile(XtaFileTestFactory.create()); - - assertThat(inFile.getSize()).isEqualTo(XtaFileTestFactory.CONTENT.length()); - } - } - - @Nested - class TestTryToExtractZip { - - @Mock - IncomingFile outFile1; - - @Mock - IncomingFile outFile2; - - private final IncomingFile zipFile = IncomingFileTestFactory.createBuilder() - .name("attachments.zip") - .build(); - - @Test - void shouldExtractZipFiles() { - var expectedExtractedFiles = List.of(outFile1, outFile2); - when(extractor.extractIncomingFilesSafely(zipFile)).thenReturn(expectedExtractedFiles); - - var extractedFiles = mapper.tryToExtractZip(zipFile).toList(); - - assertThat(extractedFiles).isEqualTo(expectedExtractedFiles); - } - - @Test - void shouldIgnoreNonZipFiles() { - when(extractor.extractIncomingFilesSafely(zipFile)).thenThrow(new RuntimeException()); - var incomingFile = IncomingFileTestFactory.create(); - - var extractedFiles = mapper.tryToExtractZip(incomingFile).toList(); - - assertThat(extractedFiles).containsExactly(incomingFile); - } - } - -} diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaMessageMapperTest.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaMessageMapperTest.java deleted file mode 100644 index 23a2f984e0b91d38e35e63c3d2d73efd8cd69733..0000000000000000000000000000000000000000 --- a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaMessageMapperTest.java +++ /dev/null @@ -1,125 +0,0 @@ -package de.ozgcloud.eingang.xta; - -import static de.ozgcloud.eingang.xta.XtaMessageMapper.*; -import static org.assertj.core.api.Assertions.*; -import static org.mockito.Mockito.*; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.mapstruct.factory.Mappers; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Spy; - -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.common.formdata.FormMetaDataTestFactory; -import de.ozgcloud.eingang.common.vorgang.VorgangNummerSupplier; - -class XtaMessageMapperTest { - - @Spy - @InjectMocks - private XtaMessageMapper mapper = Mappers.getMapper(XtaMessageMapper.class); - - @Mock - private VorgangNummerSupplier vorgangNummerSupplier; - - @Nested - class TestToFormData { - - private XtaMessageMetaData xtaMessageMetaData; - private RepresentationsAttachmentsPair representationsAttachmentsPair; - - @BeforeEach - void mock() { - xtaMessageMetaData = XtaMessageMetaDataTestFactory.create(); - representationsAttachmentsPair = RepresentationsAttachmentsPairTestFactory.create(); - when(vorgangNummerSupplier.get(VORGANG_NUMMER_SUFFIX_LENGTH)).thenReturn(FormHeaderTestFactory.VORGANGNUMMER); - } - - @Test - void shouldMapRepresentations() { - var formData = doMapping(); - - assertThat(formData.getRepresentations()).isEqualTo(representationsAttachmentsPair.representations()); - } - - @Test - void shouldSetNumberOfAttachments() { - var formData = doMapping(); - - assertThat(formData.getNumberOfAttachments()).isEqualTo(3); - } - - @Test - void shouldSetNumberOfRepresentations() { - var formData = doMapping(); - - assertThat(formData.getNumberOfRepresentations()).isEqualTo(2); - } - - @Test - void shouldMapAttachments() { - var formData = doMapping(); - - assertThat(formData.getAttachments()).isEqualTo(representationsAttachmentsPair.attachments()); - } - - @Test - void shouldMapVorgangNummer() { - var formData = doMapping(); - - assertThat(formData.getHeader().getVorgangNummer()).isEqualTo(FormHeaderTestFactory.VORGANGNUMMER); - } - - @Test - void shouldSetChannelXTA() { - var formData = doMapping(); - - assertThat(formData.getHeader().getChannel()).isEqualTo(FormHeaderTestFactory.CHANNEL); - } - - @Test - void shouldSetFormEngineName() { - var formData = doMapping(); - - assertThat(formData.getHeader().getFormEngineName()).isEqualTo(FormHeaderTestFactory.XDOMEA_FORM_ENGINE_NAME); - } - - @Test - void shouldSetDesinationId() { - var formData = doMapping(); - - assertThat(formData.getControl().getMetaData()).isPresent().get() - .extracting(metaData -> metaData.getEntry(XtaMessageMetaData.XTA_IDENTIFIER_ENTRY_NAME)) - .isEqualTo(FormMetaDataTestFactory.XTA_IDENTIFIER); - } - - private FormData doMapping() { - return mapper.toFormData(representationsAttachmentsPair, xtaMessageMetaData, vorgangNummerSupplier); - } - } - - @Nested - class TestToFimFormData { - - private XtaMessageMetaData xtaMessageMetaData; - private RepresentationsAttachmentsPair representationsAttachmentsPair; - - @BeforeEach - void mock() { - xtaMessageMetaData = XtaMessageMetaDataTestFactory.createFim(); - representationsAttachmentsPair = RepresentationsAttachmentsPairTestFactory.create(); - when(vorgangNummerSupplier.get(VORGANG_NUMMER_SUFFIX_LENGTH)).thenReturn(FormHeaderTestFactory.VORGANGNUMMER); - } - - @Test - void shouldSetFormEngineName() { - var formData = mapper.toFormData(representationsAttachmentsPair, xtaMessageMetaData, vorgangNummerSupplier); - - assertThat(formData.getHeader().getFormEngineName()).isEqualTo(FormHeaderTestFactory.FIM_FORM_ENGINE_NAME); - } - - } -} diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaMessageMetaDataMapperTest.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaMessageMetaDataMapperTest.java deleted file mode 100644 index 1233e71346ca304904f22fb36108bae6731bb3d1..0000000000000000000000000000000000000000 --- a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaMessageMetaDataMapperTest.java +++ /dev/null @@ -1,39 +0,0 @@ -package de.ozgcloud.eingang.xta; - -import static org.assertj.core.api.Assertions.*; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.mapstruct.factory.Mappers; -import org.mockito.Spy; - -class XtaMessageMetaDataMapperTest { - - @Spy - private final XtaMessageMetaDataMapper mapper = Mappers.getMapper(XtaMessageMetaDataMapper.class); - - @DisplayName("msg status list from soap") - @Nested - class TestMsgStatusListFromSoap { - - @Test - void shouldMap() { - var response = MsgStatusListTypeAndHeaderResponseTestFactory.create(); - - var result = mapper.msgStatusListFromSoap(response); - - assertThat(result).isNotNull(); - } - - @DisplayName("should set moreMessagesAvailable to false") - @Test - void shouldSetMoreMessagesAvailableToFalse() { - var response = MsgStatusListTypeAndHeaderResponseTestFactory.create(); - - var result = mapper.msgStatusListFromSoap(response); - - assertThat(result.isMoreMessagesAvailable()).isFalse(); - } - } -} diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaMessageMetaDataTestFactory.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaMessageMetaDataTestFactory.java deleted file mode 100644 index 5ee03139664cf766ba09ac8adc3e95d59e2fc246..0000000000000000000000000000000000000000 --- a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaMessageMetaDataTestFactory.java +++ /dev/null @@ -1,39 +0,0 @@ -package de.ozgcloud.eingang.xta; - -import static de.ozgcloud.eingang.xta.XtaMessageTestFactory.*; - -import java.time.ZonedDateTime; - -import de.ozgcloud.eingang.common.formdata.FormMetaDataTestFactory; - -class XtaMessageMetaDataTestFactory { - - static final String MESSAGE_TYPE = "Geschaeftsgang.Geschaeftsgang.0201"; - static final String FIM_MESSAGE_TYPE = "fim.S17000652.17000652001004"; - static final ZonedDateTime ORIGIN = ZonedDateTime.parse("2022-10-29T15:45:52.4942149+02:00"); - static final String SERVICE = "urn:fim:Versammlungsanzeige:1.4"; - static final String MESSAGE_TYPE_LIST_VERSION = "1.0"; - - static XtaMessageMetaData create() { - return createBuilder().build(); - } - - static XtaMessageMetaData.XtaMessageMetaDataBuilder createBuilder() { - return XtaMessageMetaData.builder() - .messageId(MESSAGE_ID) - .messageType(MESSAGE_TYPE) - .messageTypeListVersion(MESSAGE_TYPE_LIST_VERSION) - .origin(ORIGIN) - .xtaIdentifier(FormMetaDataTestFactory.XTA_IDENTIFIER) - .service(SERVICE); - } - - static XtaMessageMetaData createFim() { - return createFimBuilder().build(); - } - - static XtaMessageMetaData.XtaMessageMetaDataBuilder createFimBuilder() { - return createBuilder() - .messageType(FIM_MESSAGE_TYPE); - } -} diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaMessageMetaDatasAndHeaderTestFactory.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaMessageMetaDatasAndHeaderTestFactory.java deleted file mode 100644 index df3f26ef4d12eadfd7902ab56d88301a2f7e2f4a..0000000000000000000000000000000000000000 --- a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaMessageMetaDatasAndHeaderTestFactory.java +++ /dev/null @@ -1,21 +0,0 @@ -package de.ozgcloud.eingang.xta; - -import java.util.UUID; -import java.util.stream.Stream; - -class XtaMessageMetaDatasAndHeaderTestFactory { - - public static final String MSG_BOX_REQUEST_ID = UUID.randomUUID().toString(); - - public static final XtaMessageMetaData MESSAGE1 = XtaMessageMetaDataTestFactory.create(); - - public static XtaMessageMetaDatasAndHeader create() { - return createBuilder().build(); - } - - public static XtaMessageMetaDatasAndHeader.XtaMessageMetaDatasAndHeaderBuilder createBuilder() { - return XtaMessageMetaDatasAndHeader.builder() - .msgBoxRequestID(MSG_BOX_REQUEST_ID) - .messages(Stream.of(MESSAGE1)); - } -} diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaMessageMetadataRemoteIteratorTest.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaMessageMetadataRemoteIteratorTest.java deleted file mode 100644 index 3afc5fb59dca7c2b626cefe83bfaed5726b81643..0000000000000000000000000000000000000000 --- a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaMessageMetadataRemoteIteratorTest.java +++ /dev/null @@ -1,120 +0,0 @@ -package de.ozgcloud.eingang.xta; - -import static org.assertj.core.api.Assertions.*; -import static org.mockito.Mockito.*; - -import java.util.stream.Stream; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.mockito.Mock; - -class XtaMessageMetadataRemoteIteratorTest { - - private XtaMessageMetaDatasAndHeader messageMetaDatasAndHeader = XtaMessageMetaDatasAndHeaderTestFactory.create(); - - @Mock - private XtaRemoteService remoteService; - - @BeforeEach - void setup() { - when(remoteService.getMessagesMetadata()).thenReturn(messageMetaDatasAndHeader); - } - - @Nested - class TestIteratorInitialization { - - @Test - void shouldCallGetMessagesMetadata() { - new XtaMessageMetadataRemoteIterator(remoteService); - - verify(remoteService).getMessagesMetadata(); - } - - @Test - void shouldCallRemoteMessageIterator() { - when(remoteService.getMessagesMetadata()).thenReturn(messageMetaDatasAndHeader); - - Object remoteIterator = spy(new XtaMessageMetadataRemoteIterator(remoteService)); - - assertThat(remoteIterator).extracting("remoteMessageIterator").isNotNull(); - } - } - - @Nested - class TestHasNext { - - @Test - void shouldReturnTrueAfterInitialization() { - var remoteIterator = new XtaMessageMetadataRemoteIterator(remoteService); - - assertThat(remoteIterator.hasNext()).isTrue(); - } - - @Test - void shouldReturnTrueWhenMoreMessagesAvailable() { - var messageMetadataAndHeader = XtaMessageMetaDatasAndHeaderTestFactory.createBuilder().moreMessagesAvailable(true).build(); - when(remoteService.getMessagesMetadata()).thenReturn(messageMetadataAndHeader); - - var remoteIterator = new XtaMessageMetadataRemoteIterator(remoteService); - - assertThat(remoteIterator.hasNext()).isTrue(); - } - - @Test - void shouldCallLoadNextMessages() { - initTest(); - var remoteIterator = spy(new XtaMessageMetadataRemoteIterator(remoteService)); - - remoteIterator.hasNext(); - - verify(remoteIterator).loadNextMessages(); - } - - private void initTest() { - var messageMetadataAndHeader = XtaMessageMetaDatasAndHeaderTestFactory.createBuilder() - .messages(Stream.empty()).moreMessagesAvailable(true).build(); - when(remoteService.getMessagesMetadata()).thenReturn(messageMetadataAndHeader); - var nextMessageMetadataAndHeader = XtaMessageMetaDatasAndHeaderTestFactory.createBuilder().msgBoxRequestID("id").build(); - when(remoteService.getNextMessagesMetadata(any())).thenReturn(nextMessageMetadataAndHeader); - } - - @Test - void shouldReturnFalseWhenNoMoreMessagesAvailable() { - var messageMetadataAndHeader = XtaMessageMetaDatasAndHeaderTestFactory.createBuilder().messages(Stream.empty()).build(); - when(remoteService.getMessagesMetadata()).thenReturn(messageMetadataAndHeader); - - var remoteIterator = new XtaMessageMetadataRemoteIterator(remoteService); - - assertThat(remoteIterator.hasNext()).isFalse(); - } - } - - @Nested - class TestLoadNextMessages { - - private XtaMessageMetaDatasAndHeader nextMessageMetadataAndHeader = XtaMessageMetaDatasAndHeaderTestFactory.createBuilder().msgBoxRequestID("id").build(); - - @BeforeEach - void setup() { - when(remoteService.getNextMessagesMetadata(any())).thenReturn(nextMessageMetadataAndHeader); - } - - @Test - void shouldCallGetMessages() { - new XtaMessageMetadataRemoteIterator(remoteService).loadNextMessages(); - - verify(remoteService).getNextMessagesMetadata(messageMetaDatasAndHeader.getMsgBoxRequestID()); - } - - @Test - void shouldCallGetRemoteMessageIterator() { - var remoteIterator = spy(new XtaMessageMetadataRemoteIterator(remoteService)); - - remoteIterator.loadNextMessages(); - - verify(remoteIterator).getRemoteMessageIterator(nextMessageMetadataAndHeader); - } - } -} \ No newline at end of file diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaMessageTestFactory.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaMessageTestFactory.java deleted file mode 100644 index 1a1397db1e1bae3588ef81e7162f8c80308b2283..0000000000000000000000000000000000000000 --- a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaMessageTestFactory.java +++ /dev/null @@ -1,21 +0,0 @@ -package de.ozgcloud.eingang.xta; - -class XtaMessageTestFactory { - - static final XtaMessageId MESSAGE_ID = XtaMessageId.from("urn:de:xta:messageid:dataport_xta_210:81e40808-91c6-4765-aaf4-1aa62fec8be9"); - - static final XtaFile attachment = XtaFileTestFactory.create(); - static final String PRIMARY_FORM_DATA_MESSAGE = XtaFileTestFactory.NAME; - - static XtaMessage create() { - return createBuilder().build(); - } - - static XtaMessage.XtaMessageBuilder createBuilder() { - return XtaMessage.builder() - .metaData(XtaMessageMetaDataTestFactory.create()) - .messageFile(XtaFileTestFactory.create()) - .primaryFormDataMessage(XtaFileTestFactory.NAME) - .attachment(attachment); - } -} diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaPropertiesTestFactory.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaPropertiesTestFactory.java deleted file mode 100644 index da24d333dc2168449cdb26f58d009cf567828878..0000000000000000000000000000000000000000 --- a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaPropertiesTestFactory.java +++ /dev/null @@ -1,29 +0,0 @@ -package de.ozgcloud.eingang.xta; - -import java.net.URI; - -import lombok.SneakyThrows; - -class XtaPropertiesTestFactory { - - private static final String SERVER_PROTOCOL = "https"; - private static final String SERVER_ADDRESS = "xta-adapter-port-forward-service.ssh-port-forward.svc.cluster.local"; - - @SneakyThrows - static XtaProperties create() { - XtaProperties properties = new XtaProperties(); - - Actions actions = new Actions(); - properties.setActions(actions); - actions.setFetchRequest(new URI("http://tempuri.local/fetch")); - actions.setStatusList(new URI("http://tempuri.lcoal/statusList")); - - Server server = new Server(); - properties.setServer(server); - server.setProtocol(SERVER_PROTOCOL); - server.setAddress(SERVER_ADDRESS); - - return properties; - - } -} diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaRemoteServiceConfigurationTest.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaRemoteServiceConfigurationTest.java deleted file mode 100644 index 59d354ecb7c21690e7656712e51c7c5bc56428a3..0000000000000000000000000000000000000000 --- a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaRemoteServiceConfigurationTest.java +++ /dev/null @@ -1,22 +0,0 @@ -package de.ozgcloud.eingang.xta; - -import static org.assertj.core.api.Assertions.*; - -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Spy; - -class XtaRemoteServiceConfigurationTest { - - @Spy - @InjectMocks - XtaRemoteServiceConfiguration configuration; - - @Test - void testBuildServerAddressUri() { - - String serverUrl = configuration.buildServerAddressUri(XtaPropertiesTestFactory.create().getServer()); - - assertThat(serverUrl).isEqualTo("https://xta-adapter-port-forward-service.ssh-port-forward.svc.cluster.local/MB_XTA-WS/XTA210msgBoxPort.svc"); - } -} diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaRemoteServiceFunctionalCase.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaRemoteServiceFunctionalCase.java deleted file mode 100644 index 58b909b6e9e569a9afc02cbe4b03ebd5401e50df..0000000000000000000000000000000000000000 --- a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaRemoteServiceFunctionalCase.java +++ /dev/null @@ -1,71 +0,0 @@ -package de.ozgcloud.eingang.xta; - -import static org.assertj.core.api.Assertions.*; - -import jakarta.validation.Valid; - -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.ActiveProfiles; - -import de.ozgcloud.eingang.Application; - -@Disabled("real live test - do only activate for manual testing") -@ActiveProfiles({ "itcase", "local" }) -@SpringBootTest(classes = Application.class, // - properties = { "ozgcloud.xta.server.name=LI33-0005", - "ozgcloud.xta.server.address=LI33-0005:3000", - "ozgcloud.xta.server.protocol=https", - "ozgcloud.xta.keystore.file=file:./KOP_SH_KIEL_DEV.p12", - "ozgcloud.xta.keystore.password=<geheim>" // replace this with real password - }) -class XtaRemoteServiceITCase { - - @Autowired - private XtaRemoteService remoteService; - @Autowired - @Valid - private XtaProperties xtaProperties; - - @Nested - class TestProperties { - @Test - void shouldHaveStatusListAction() { - assertThat(xtaProperties.getActions().getStatusList()).isNotNull(); - } - } - - @Nested - class TestGetStatusList { - - @Test - void shouldSendRequest() { - - var result = remoteService.getStatusList(); - - assertThat(result).isNotNull(); - - } - } - - @Nested - class TestGetMessage { - @Test - void shouldSendRequest() { - var result = remoteService.loadContentContainer("urn:de:xta:messageid:dataport_xta_210:20eb297a-e224-45a0-9376-5ebd4d9bcc9a"); - - assertThat(result).isNotNull(); - } - } - - @Nested - class TestClose { - @Test - void shouldThrowNoException() { - assertThatNoException().isThrownBy(() -> remoteService.close(XtaMessageTestFactory.MESSAGE_ID)); - } - } -} diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaRemoteServiceTest.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaRemoteServiceTest.java deleted file mode 100644 index 3077811a1651d869a91028b8cb030e7052306b17..0000000000000000000000000000000000000000 --- a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaRemoteServiceTest.java +++ /dev/null @@ -1,146 +0,0 @@ -package de.ozgcloud.eingang.xta; - -import static org.assertj.core.api.Assertions.*; -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.*; - -import java.util.stream.Stream; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Mockito; -import org.mockito.Spy; -import org.springframework.boot.webservices.client.WebServiceTemplateBuilder; - -import de.xoev.transport.xta._211.GenericContentContainer; - -class XtaRemoteServiceTest { - - @Spy - @InjectMocks - private XtaRemoteService service; - - @Mock - private WebServiceTemplateBuilder templateBuilder; - @Mock - private XtaMessageMetaDataMapper mapper; - @Spy - private XtaProperties properties = XtaPropertiesTestFactory.create(); - - @Nested - class TestGetMessagesMetadata { - - @BeforeEach - void init() { - doReturn(MsgStatusListTypeAndHeaderResponseTestFactory.create()).when(service).getStatusList(); - when(mapper.msgStatusListFromSoap(any(MsgStatusListTypeAndHeaderResponse.class))) - .thenReturn(XtaMessageMetaDatasAndHeaderTestFactory.create()); - } - - @Test - void shouldCallGetStatusList() { - service.getMessagesMetadata().getMessages().toList(); - - verify(service).getStatusList(); - } - - @Test - void shouldCallMapper() { - service.getMessagesMetadata(); - - verify(mapper).msgStatusListFromSoap(notNull()); - } - - @Test - void shouldReturnMessageId() { - var metaData = service.getMessagesMetadata().getMessages().toList(); - - assertThat(metaData).hasSize(1).first().usingRecursiveComparison().isEqualTo(XtaMessageMetaDataTestFactory.create()); - } - } - - @Nested - class TestGetNextMessagesMetadata { - - @BeforeEach - void init() { - doReturn(MsgStatusListTypeAndHeaderResponseTestFactory.create()).when(service).getStatusList(); - when(mapper.msgStatusListFromSoap(any(MsgStatusListTypeAndHeaderResponse.class))) - .thenReturn(XtaMessageMetaDatasAndHeaderTestFactory.create()); - } - - @Test - void shouldCallGetNextStatusList() { - service.getMessagesMetadata().getMessages().toList(); - - verify(service).getStatusList(); - } - - @Test - void shouldCallMapper() { - service.getMessagesMetadata(); - - verify(mapper).msgStatusListFromSoap(notNull()); - } - - @Test - void shouldReturnMessageId() { - var metaData = service.getMessagesMetadata().getMessages().toList(); - - assertThat(metaData).hasSize(1).first().usingRecursiveComparison().isEqualTo(XtaMessageMetaDataTestFactory.create()); - } - } - - @Nested - class TestGetMessage { - - private XtaFile file = XtaFileTestFactory.create(); - @Mock - private GenericContentContainer contentContainerMock; - - @BeforeEach - void init() { - doReturn(file).when(service).getMessage(Mockito.<GenericContentContainer>any()); - doReturn(contentContainerMock).when(service).loadContentContainer(anyString()); - doReturn(Stream.of(file)).when(service).getAttachments(any()); - } - - @Test - void shouldCallLoadContentContainer() { - service.getMessage(XtaMessageTestFactory.MESSAGE_ID); - - verify(service).loadContentContainer(XtaMessageTestFactory.MESSAGE_ID.toString()); - } - - @Test - void shouldCallGetMessage() { - service.getMessage(XtaMessageTestFactory.MESSAGE_ID); - - verify(service).getMessage(contentContainerMock); - } - - @Test - void sohludCallGetAttachments() { - service.getMessage(XtaMessageTestFactory.MESSAGE_ID); - - verify(service).getAttachments(contentContainerMock); - } - - @Test - void shouldReturnMessageWithoutMetaData() { - var message = service.getMessage(XtaMessageTestFactory.MESSAGE_ID); - - assertThat(message.getMetaData()).isNull(); - } - - @Test - void shouldReturnMessageWithFile() { - var message = service.getMessage(XtaMessageTestFactory.MESSAGE_ID); - - assertThat(message.getMessageFiles()).hasSize(1).contains(file); - } - } -} \ No newline at end of file diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaResponseTestFactory.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaResponseTestFactory.java deleted file mode 100644 index 4e6fed5d2772f9799261cc5b368619c987810c6a..0000000000000000000000000000000000000000 --- a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaResponseTestFactory.java +++ /dev/null @@ -1,140 +0,0 @@ -package de.ozgcloud.eingang.xta; - -import static de.ozgcloud.eingang.xta.zip.TestZipFileFactory.*; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.math.BigInteger; -import java.nio.charset.StandardCharsets; -import java.time.ZonedDateTime; -import java.util.Arrays; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.UUID; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import org.apache.commons.codec.Resources; -import org.apache.commons.io.IOUtils; - -import de.ozgcloud.common.binaryfile.TempFileUtils; - -public class XtaResponseTestFactory { - - public static final Map<String, String> MESSAGE_TYPE_BY_ATTACHMENT_FILENAME = Map.of( - "mantelantrag_without_anlage.zip", "Geschaeftsgang.Geschaeftsgang.0201", - "dfoerdermittel_without_anlage.zip", "Geschaeftsgang.Geschaeftsgang.0201", - "brauchtumsfeuer_without_anlage.zip", "Geschaeftsgang.Geschaeftsgang.0201", - "versammlungsanzeige.xml", "fim.S17000652.17000652001004", - "mantelantrag_with_anlage.zip", "Geschaeftsgang.Geschaeftsgang.0201", - "dfoerdermittel_with_anlage.zip", "Geschaeftsgang.Geschaeftsgang.0201", - "brauchtumsfeuer_with_anlage.zip", "Geschaeftsgang.Geschaeftsgang.0201", - "waffenschein.zip", "Geschaeftsgang.Geschaeftsgang.0201" - ); - - private static final Map<String, String> MESSAGE_ID_BY_ATTACHMENT_FILENAME = MESSAGE_TYPE_BY_ATTACHMENT_FILENAME - .keySet().stream() - .collect(Collectors.toMap(name -> name, name -> generateMessageID())); - - private static String generateMessageID() { - return "urn:de:xta:messageid:dataport_xta_210:%s".formatted(UUID.randomUUID().toString()); - } - - public static XtaMessageMetaDatasAndHeader createEmptyGetStatusListResponse() { - return XtaMessageMetaDatasAndHeader.builder() - .msgBoxRequestID("testid-empty") - .moreMessagesAvailable(false) - .messages(Stream.empty()) - .build(); - } - - public static XtaMessageMetaDatasAndHeader createGetStatusListResponse(List<String> xtaAttachmentFileNames) { - var messageMetaDataItems = xtaAttachmentFileNames.stream() - .map(name -> - XtaMessageMetaData.builder() - .messageId(new XtaMessageId(MESSAGE_ID_BY_ATTACHMENT_FILENAME.get(name))) - .messageType(MESSAGE_TYPE_BY_ATTACHMENT_FILENAME.get(name)) - .origin(ZonedDateTime.now()) - .delivery(ZonedDateTime.now()) - .build() - ) - .toList(); - - return XtaMessageMetaDatasAndHeader.builder() - .msgBoxRequestID("testid-withattachment") - .moreMessagesAvailable(true) - .messages(messageMetaDataItems.stream()) - .build(); - } - - public static XtaMessage createGetMessageResponse(String xtaAttachmentFileName) { - File file; - try (var inputStream = getAttachmentInputStream(xtaAttachmentFileName)) { - file = TempFileUtils.writeTmpFile(inputStream); - } catch (IOException e) { - throw new RuntimeException(e); - } - - return XtaMessage.builder() - .messageFile(XtaFile.builder() - .contentType("application/zip") - .name(xtaAttachmentFileName) - .size(BigInteger.valueOf(file.length())) - .file(file) - .build()) - .build(); - } - - private static InputStream getAttachmentInputStream(String xtaAttachmentFileName) { - var attachmentResourcePath = getAttachmentFilePath(xtaAttachmentFileName); - if (xtaAttachmentFileName.endsWith(".zip")) { - try { - return new FileInputStream( - createAttachmentZipFile( - attachmentResourcePath.replace(".zip", ""))); - } catch (FileNotFoundException e) { - throw new RuntimeException(e); - } - } else { - return Resources.getInputStream(attachmentResourcePath); - } - } - - private static File createAttachmentZipFile(String attachmentResourceDirectory) { - return createTempZipFile(listResourceFileNames(attachmentResourceDirectory) - .map(subName -> { - try { - return TestZipEntry.builder() - .name(subName) - .content(IOUtils.toByteArray(Resources.getInputStream(attachmentResourceDirectory + "/" + subName))) - .build(); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - ).toList()); - } - - private static Stream<String> listResourceFileNames(String resourceDirectoryPath) { - try (var inputStream = Resources.getInputStream(resourceDirectoryPath)) { - return Arrays.stream(IOUtils.toString(inputStream, StandardCharsets.UTF_8).split("\n")); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - private static String getMessageType(String xtaAttachmentFileName) { - return Objects.requireNonNull( - MESSAGE_TYPE_BY_ATTACHMENT_FILENAME.get(xtaAttachmentFileName), - "Xta-message type for '%s' has to be configured!".formatted(xtaAttachmentFileName) - ); - } - - private static String getAttachmentFilePath(String xtaAttachmentFileName) { - return "mock-responses/getMessage/%s/%s".formatted(getMessageType(xtaAttachmentFileName), xtaAttachmentFileName); - } -} diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaRunnerTest.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaRunnerTest.java deleted file mode 100644 index 08ab8ed4b2e078005773560f1a71156878bb89a3..0000000000000000000000000000000000000000 --- a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaRunnerTest.java +++ /dev/null @@ -1,57 +0,0 @@ -package de.ozgcloud.eingang.xta; - -import static org.mockito.Mockito.*; - -import java.util.stream.Stream; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; - -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.semantik.SemantikAdapter; - -class XtaRunnerTest { - - @InjectMocks - private XtaRunner scheduler; - - @Mock - private XtaService service; - @Mock - private SemantikAdapter semantikAdapter; - - @Nested - class TestRunGetXtaMessages { - - public static final FormData MESSAGE = FormDataTestFactory.create(); - - @BeforeEach - void init() { - when(service.getMessages()).thenReturn(Stream.of(MESSAGE)); - } - - @Test - void shouldCallXtaServiceGetNextMessages() { - scheduler.runGetXtaMessages(); - - verify(service).getMessages(); - } - - @Test - void shouldHandOverFormDataToSemantikAdapter() { - scheduler.runGetXtaMessages(); - - verify(semantikAdapter).processFormData(MESSAGE); - } - - @Test - void shouldAcknowledgeReceive() { - scheduler.runGetXtaMessages(); - - verify(service).acknowledgeReceive(XtaMessageTestFactory.MESSAGE_ID); - } - } -} diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaServiceTest.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaServiceTest.java deleted file mode 100644 index effc877a5d5045273819eef3e441eb6893da1f02..0000000000000000000000000000000000000000 --- a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaServiceTest.java +++ /dev/null @@ -1,471 +0,0 @@ -package de.ozgcloud.eingang.xta; - -import static de.ozgcloud.eingang.xta.XtaService.*; -import static org.assertj.core.api.Assertions.*; -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.*; - -import java.util.List; -import java.util.Optional; -import java.util.stream.Stream; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.mockito.ArgumentCaptor; -import org.mockito.Captor; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Spy; - -import de.ozgcloud.eingang.common.errorhandling.TechnicalException; -import de.ozgcloud.eingang.common.formdata.FormData; -import de.ozgcloud.eingang.common.formdata.FormData.Representations; -import de.ozgcloud.eingang.common.formdata.FormDataControlTestFactory; -import de.ozgcloud.eingang.common.formdata.IncomingFile; -import de.ozgcloud.eingang.common.formdata.IncomingFileTestFactory; -import de.ozgcloud.eingang.common.vorgang.VorgangNummerSupplier; -import de.ozgcloud.eingang.xdomea.XdomeaMessageDataMapper; - -class XtaServiceTest { - - private static final String MESSAGE_TYPE_OTHER = "MESSAGE_TYPE_OTHER"; - - @Spy - @InjectMocks - private XtaService service; - - @Mock - private XtaRemoteService remoteService; - @Mock - private XtaMessageMapper mapper; - @Mock - private VorgangNummerSupplier vorgangNummerSupplier; - - @Mock - private XtaIncomingFilesMapper incomingFilesMapper; - - @Mock - private XdomeaMessageDataMapper xdomeaMessageDataMapper; - - @Mock - private XtaCurrentIdentifierService currentIdentifierService; - - @Mock - private FormData formData; - - @Mock - private FormData formData2; - - @Nested - class TestGetMessagesAsFormData { - - private final XtaMessageMetaData messageMetaData = XtaMessageMetaDataTestFactory.create(); - private final XtaMessage message = XtaMessageTestFactory.create(); - - @DisplayName("with one message") - @Nested - class TestWithOneMessage { - @BeforeEach - void setup() { - doReturn(Stream.of(messageMetaData)).when(service).createXtaMessageStream(); - } - - @Test - void shouldCallCreateStream() { - service.getMessages(); - - verify(service).createXtaMessageStream(); - } - - @Test - void shouldCallFilterByMessageType() { - setupMocks(); - - service.getMessages().toList(); - - verify(service).isSupportedMessageType(messageMetaData); - } - - @Test - void shouldCallGetFormDataIfNoRuntimeException() { - setupMocks(); - doReturn(true).when(service).isSupportedMessageType(messageMetaData); - - service.getMessages().toList(); - - verify(service).getFormData(messageMetaData); - } - - @Test - void shouldNotCallGetFormDataIfNoRuntimeException() { - doReturn(false).when(service).isSupportedMessageType(messageMetaData); - - service.getMessages().toList(); - - verify(service, never()).getFormDataIfNoRuntimeException(any()); - } - } - - @DisplayName("with multiple messages") - @Nested - class TestWithMultipleMessages { - private final XtaMessageMetaData messageMetaData2 = XtaMessageMetaDataTestFactory.createBuilder() - .messageId(XtaMessageId.from("messageId2")) - .build(); - private final XtaMessageMetaData messageMetaData3 = XtaMessageMetaDataTestFactory.createBuilder() - .messageId(XtaMessageId.from("messageId3")) - .build(); - - @BeforeEach - void setup() { - doReturn(Stream.of(messageMetaData, messageMetaData2, messageMetaData3)).when(service).createXtaMessageStream(); - } - - @DisplayName("should return stream of messages") - @Test - void shouldReturnStreamOfMessages() { - doReturn(true).when(service).isSupportedMessageType(messageMetaData); - doReturn(false).when(service).isSupportedMessageType(messageMetaData3); - doReturn(true).when(service).isSupportedMessageType(messageMetaData2); - doReturn(Optional.of(formData)).when(service).getFormDataIfNoRuntimeException(messageMetaData); - doReturn(Optional.of(formData2)).when(service).getFormDataIfNoRuntimeException(messageMetaData2); - - var result = service.getMessages().toList(); - - assertThat(result).containsExactly(formData, formData2); - } - } - - - private void setupMocks() { - var testFormData = FormDataTestFactory.create(); - when(mapper.toFormData(any(), any(), eq(vorgangNummerSupplier))).thenReturn(testFormData); - when(remoteService.getMessage(any(XtaMessageId.class))).thenReturn(message); - } - } - - @Nested - class TestIsSupportedMessageType { - - @Test - void shouldAcceptGeschaeftsgang() { - var geschaeftsgangMetaData = XtaMessageMetaDataTestFactory.create(); - - assertThat(service.isSupportedMessageType(geschaeftsgangMetaData)).isTrue(); - } - - @Test - void shouldAcceptFIM() { - var fimMetaData = XtaMessageMetaDataTestFactory.createBuilder() - .messageType(FIM_MESSAGE_TYPE_PREFIX + "34355") - .build(); - - assertThat(service.isSupportedMessageType(fimMetaData)).isTrue(); - } - - @Test - void shouldNotAcceptOtherMessageType() { - var metaDataDFoerder = XtaMessageMetaDataTestFactory.createBuilder().messageType(MESSAGE_TYPE_OTHER).build(); - - assertThat(service.isSupportedMessageType(metaDataDFoerder)).isFalse(); - } - } - - @DisplayName("get form data if no runtime exception") - @Nested - class TestGetFormDataIfNoRuntimeException { - - @Mock - XtaMessageMetaData messageMetaData; - - @Mock - FormData formData; - - @DisplayName("should call get formdata") - @Test - void shouldCallGetFormdata() { - service.getFormDataIfNoRuntimeException(messageMetaData); - - verify(service).getFormData(messageMetaData); - } - - @DisplayName("with exception") - @Nested - class TestWithException { - @DisplayName("should return empty") - @Test - void shouldReturnEmpty() { - doThrow(new RuntimeException("test-error")).when(service).getFormData(any()); - - var result = service.getFormDataIfNoRuntimeException(messageMetaData); - - assertThat(result).isEmpty(); - } - } - - @DisplayName("without exception") - @Nested - class TestWithoutException { - @DisplayName("should return") - @Test - void shouldReturn() { - doReturn(formData).when(service).getFormData(any()); - - var result = service.getFormDataIfNoRuntimeException(messageMetaData); - - assertThat(result).contains(formData); - } - } - } - - @Nested - class TestGetFormData { - - @Mock - private FormData formData; - - private XtaMessage message = XtaMessageTestFactory.create(); - private XtaMessageMetaData messageMetaData = XtaMessageMetaDataTestFactory.create(); - private RepresentationsAttachmentsPair classification; - private FormData mappedFormData = FormDataTestFactory.create(); - - @Captor - private ArgumentCaptor<XtaMessageMetaData> messageMetaDataCaptor; - - @Captor - private ArgumentCaptor<RepresentationsAttachmentsPair> classificationCaptor; - - @BeforeEach - void init() { - classification = RepresentationsAttachmentsPairTestFactory.create(); - var incomingFiles = List.of(IncomingFileTestFactory.create(), IncomingFileTestFactory.create()); - when(incomingFilesMapper.toIncomingFiles(message.getMessageFiles())).thenReturn(incomingFiles); - doReturn(classification).when(service).getRepresentationsAttachmentsPair(messageMetaData, incomingFiles); - } - - @BeforeEach - void mockMessageMapping() { - when(remoteService.getMessage(any(XtaMessageId.class))).thenReturn(message); - when(mapper.toFormData(any(), any(), any())).thenReturn(mappedFormData); - } - - @Test - void shouldCallRemoteService() { - service.getFormData(messageMetaData); - - verify(remoteService).getMessage(XtaMessageTestFactory.MESSAGE_ID); - } - - @Test - void shouldCallMapper() { - service.getFormData(messageMetaData); - - verify(mapper).toFormData(classification, messageMetaData, vorgangNummerSupplier); - } - - @Test - void shouldCallMapperToFormData() { - service.getFormData(messageMetaData); - - verify(mapper).toFormData(classificationCaptor.capture(), messageMetaDataCaptor.capture(), eq(vorgangNummerSupplier)); - assertThat(messageMetaDataCaptor.getValue()).isEqualTo(messageMetaData); - assertThat(classificationCaptor.getValue()).isEqualTo(classification); - } - - @Test - void shouldCallAddAttachments() { - service.getFormData(messageMetaData); - - verify(service).addAttachments(message, mappedFormData); - } - - @Test - void shouldReturnMappedResult() { - doReturn(mappedFormData).when(service).addRepresentations(any(), any()); - - var result = service.getFormData(messageMetaData); - - assertThat(result).isEqualTo(mappedFormData); - } - } - - @Nested - class TestAddAttachments { - - private final FormData inFormData = FormDataTestFactory.createBuilder().clearAttachments().numberOfAttachments(0).build(); - - @Test - void shouldAddAttachments() { - var result = service.addAttachments(XtaMessageTestFactory.create(), inFormData); - - assertThat(result.getAttachments()).hasSize(1); - assertThat(result.getNumberOfAttachments()).isEqualTo(1); - } - - @Test - void shouldWorkWithoutAnyAttachment() { - var result = service.addAttachments(XtaMessageTestFactory.createBuilder().clearAttachments().build(), inFormData); - - assertThat(result.getAttachments()).isEmpty(); - assertThat(result.getNumberOfAttachments()).isZero(); - } - } - - @DisplayName("get representations attachments pair") - @Nested - class TestGetRepresentationsAttachmentsPair { - - @Mock - private XtaMessageMetaData messageMetaData; - - @Mock - private RepresentationsAttachmentsPair classification; - - private List<IncomingFile> incomingFiles; - - @BeforeEach - void mock() { - incomingFiles = List.of(IncomingFileTestFactory.create(), IncomingFileTestFactory.create()); - } - - @DisplayName("should use correct mapper xdomea message type") - @Test - void shouldUseCorrectMapperXdomeaMessageType() { - when(messageMetaData.getMessageType()).thenReturn(XtaService.XDOMEA_0201_MESSAGE_TYPE); - when(xdomeaMessageDataMapper.mapIncomingFilesToRepresentationsAttachmentsPair(incomingFiles)) - .thenReturn(classification); - - var result = service.getRepresentationsAttachmentsPair(messageMetaData, incomingFiles); - - assertThat(result).isEqualTo(classification); - } - - @DisplayName("should use correct mapping for FIM message") - @Test - void shouldUseCorrectMappingForFimMessage() { - when(messageMetaData.getMessageType()).thenReturn(FIM_MESSAGE_TYPE_PREFIX + "836487"); - doReturn(classification).when(service).mapIncomingFilesToRepresentations(incomingFiles); - - var result = service.getRepresentationsAttachmentsPair(messageMetaData, incomingFiles); - - assertThat(result).isEqualTo(classification); - } - - @DisplayName("should throw exception for unexpected message type") - @Test - void shouldThrowExceptionForUnexpectedMessageType() { - when(messageMetaData.getMessageType()).thenReturn("unexpected"); - - assertThatThrownBy(() -> service.getRepresentationsAttachmentsPair(messageMetaData, incomingFiles)) - .isInstanceOf(TechnicalException.class); - } - } - - @DisplayName("map incoming files to representations") - @Nested - class TestMapIncomingFilesToRepresentations { - - private List<IncomingFile> incomingFiles; - - @BeforeEach - void mock() { - incomingFiles = List.of(IncomingFileTestFactory.create(), IncomingFileTestFactory.create()); - - } - - @DisplayName("should return representations with incoming files") - @Test - void shouldReturnRepresentationsWithIncomingFiles() { - var result = service.mapIncomingFilesToRepresentations(incomingFiles); - - assertThat(result.representations()).isEqualTo(incomingFiles); - } - - @DisplayName("should return attachments with empty list") - @Test - void shouldReturnAttachmentsWithEmptyList() { - var result = service.mapIncomingFilesToRepresentations(incomingFiles); - - assertThat(result.attachments()).isEmpty(); - } - } - - @Nested - class TestAcknowledgeReceive { - - @Test - void shouldCallRemoteService() { - service.acknowledgeReceive(XtaMessageTestFactory.MESSAGE_ID); - - verify(remoteService).close(XtaMessageTestFactory.MESSAGE_ID); - } - } - - @DisplayName("create XTA message stream") - @Nested - class TestCreateXtaMessageStream { - private static final List<String> XTA_IDENTIFIERS = List.of("XTA_IDENTIFIER", "XTA_IDENTIFIER2"); - - @Captor - private ArgumentCaptor<String> identifierCaptor; - - @BeforeEach - void mock() { - when(remoteService.getMessagesMetadata()) - .thenReturn(XtaMessageMetaDatasAndHeaderTestFactory.create()) - .thenReturn(XtaMessageMetaDatasAndHeaderTestFactory.create()); - when(currentIdentifierService.getIdentifiers()).thenReturn(XTA_IDENTIFIERS); - } - - @DisplayName("should return") - @Test - void shouldReturn() { - var result = service.createXtaMessageStream().toList(); - - assertThat(result).isEqualTo(getExpectedMessages()); - } - - private List<XtaMessageMetaData> getExpectedMessages() { - return Stream.concat( - XtaMessageMetaDatasAndHeaderTestFactory.create().getMessages(), - XtaMessageMetaDatasAndHeaderTestFactory.create().getMessages()).toList(); - } - - @DisplayName("should call set current identifier") - @Test - void shouldCallSetCurrentIdentifier() { - service.createXtaMessageStream().toList(); - - verify(currentIdentifierService, times(2)) - .setCurrentIdentifier(identifierCaptor.capture()); - assertThat(identifierCaptor.getAllValues()).isEqualTo(XTA_IDENTIFIERS); - } - } - - @Nested - class TestAddRepresentations { - @Test - void shouldAddPrimaryRepresentation() { - var result = service.addRepresentations(FormDataTestFactory.create(), XtaMessageTestFactory.create()); - - assertThat(result.getControl().getRepresentations()).isPresent().get() - .extracting(Representations::getPrimaryFormDataRepresentation).isEqualTo(XtaMessageTestFactory.PRIMARY_FORM_DATA_MESSAGE); - } - - @Test - void shouldRespectExistingRepresentation() { - var formData = FormDataTestFactory.createBuilder().control(FormDataControlTestFactory.createBuilder() - .representations(Optional.of( - Representations.builder().primaryFormDataPdfRepresentation("PDF_FILE").build())) - .build()).build(); - - var result = service.addRepresentations(formData, XtaMessageTestFactory.create()); - - var baseAssert = assertThat(result.getControl().getRepresentations()).isPresent().get(); - baseAssert.extracting(Representations::getPrimaryFormDataRepresentation).isEqualTo(XtaMessageTestFactory.PRIMARY_FORM_DATA_MESSAGE); - baseAssert.extracting(Representations::getPrimaryFormDataPdfRepresentation).isEqualTo("PDF_FILE"); - } - } -} diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/zip/LimitedInputStreamTest.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/zip/LimitedInputStreamTest.java deleted file mode 100644 index b01c316d94f4bc994601401daaabacb4e0134efc..0000000000000000000000000000000000000000 --- a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/zip/LimitedInputStreamTest.java +++ /dev/null @@ -1,141 +0,0 @@ -package de.ozgcloud.eingang.xta.zip; - -import static de.ozgcloud.eingang.xta.zip.LimitedInputStream.*; -import static org.assertj.core.api.Assertions.*; - -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.nio.charset.Charset; - -import org.apache.commons.io.IOUtils; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; - -import lombok.SneakyThrows; - -class LimitedInputStreamTest { - - private static final int READ_LIMIT = 10; - private static final String STRING_WITH_READ_LIMIT_LENGTH = "A".repeat(READ_LIMIT); - private static final String STRING_WITH_MORE_THAN_READ_LIMIT_LENGTH = "B".repeat(READ_LIMIT + 1); - - private LimitedInputStream limitedInputStream; - - private InputStream createStringInputSteam(String string) { - return new ByteArrayInputStream(string.getBytes()); - } - - @SneakyThrows - private String readInputStreamToString(InputStream inputStream) { - return IOUtils.toString(inputStream, Charset.defaultCharset()); - } - - @SneakyThrows - @DisplayName("should succeed if read limit is not exceeded") - @Test - void shouldSucceedIfReadLimitIsNotExceeded() { - limitedInputStream = new LimitedInputStream(createStringInputSteam(STRING_WITH_READ_LIMIT_LENGTH), READ_LIMIT); - - var outputString = readInputStreamToString(limitedInputStream); - - assertThat(outputString).isEqualTo(STRING_WITH_READ_LIMIT_LENGTH); - } - - @DisplayName("should fail if read limit is exceeded") - @Test - void shouldFailIfReadLimitIsExceeded() { - limitedInputStream = new LimitedInputStream(createStringInputSteam(STRING_WITH_MORE_THAN_READ_LIMIT_LENGTH), READ_LIMIT); - - assertThatThrownBy(() -> readInputStreamToString(limitedInputStream)) - .isInstanceOf(IOException.class) - .hasMessage(LIMITED_EXCEEDED_MESSAGE); - } - - @DisplayName("read") - @Nested - class TestRead { - - @SneakyThrows - @DisplayName("should return") - @Test - void shouldReturn() { - limitedInputStream = createLimitedInputStream(); - - var result = limitedInputStream.read(); - assertThat(result).isEqualTo(STRING_WITH_READ_LIMIT_LENGTH.getBytes()[0]); - } - - @SneakyThrows - @DisplayName("should advance bytesRead") - @Test - void shouldAdvanceBytesRead() { - limitedInputStream = createLimitedInputStream(); - limitedInputStream.bytesRead = READ_LIMIT - 1; - - limitedInputStream.read(); - assertThat(limitedInputStream.bytesRead).isEqualTo(READ_LIMIT); - } - - @DisplayName("should throw if exceeded") - @Test - void shouldThrowIfExceeded() { - limitedInputStream = createLimitedInputStreamWithExceeding(); - limitedInputStream.bytesRead = READ_LIMIT; - - assertThatThrownBy(() -> limitedInputStream.read()).isInstanceOf(IOException.class); - } - - } - - @DisplayName("read into buffer") - @Nested - class TestReadIntoBuffer { - private byte[] buffer; - - @BeforeEach - void mock() { - buffer = new byte[READ_LIMIT]; - } - - @SneakyThrows - @DisplayName("should return") - @Test - void shouldReturn() { - limitedInputStream = createLimitedInputStream(); - - var result = limitedInputStream.read(buffer); - - assertThat(result).isEqualTo(READ_LIMIT); - } - - @SneakyThrows - @DisplayName("should advance bytesRead") - @Test - void shouldAdvanceBytesRead() { - limitedInputStream = createLimitedInputStream(); - - limitedInputStream.read(buffer); - assertThat(limitedInputStream.bytesRead).isEqualTo(READ_LIMIT); - } - - @DisplayName("should throw if exceeded") - @Test - void shouldThrowIfExceeded() { - limitedInputStream = createLimitedInputStreamWithExceeding(); - limitedInputStream.bytesRead = 1; - - assertThatThrownBy(() -> limitedInputStream.read(buffer)).isInstanceOf(IOException.class); - } - } - - private LimitedInputStream createLimitedInputStream() { - return new LimitedInputStream(createStringInputSteam(STRING_WITH_READ_LIMIT_LENGTH), READ_LIMIT); - } - - private LimitedInputStream createLimitedInputStreamWithExceeding() { - return new LimitedInputStream(createStringInputSteam(STRING_WITH_MORE_THAN_READ_LIMIT_LENGTH), READ_LIMIT); - } -} diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/zip/ReadableZipEntryTest.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/zip/ReadableZipEntryTest.java deleted file mode 100644 index e5bfea0888cf15d8791777a8bf826e13868c489c..0000000000000000000000000000000000000000 --- a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/zip/ReadableZipEntryTest.java +++ /dev/null @@ -1,80 +0,0 @@ -package de.ozgcloud.eingang.xta.zip; - -import static org.assertj.core.api.Assertions.*; -import static org.mockito.Mockito.*; - -import java.io.InputStream; -import java.util.zip.ZipEntry; -import java.util.zip.ZipFile; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.mockito.Mock; - -import de.ozgcloud.eingang.common.errorhandling.TechnicalException; -import lombok.SneakyThrows; - -class ReadableZipEntryTest { - - @Mock - ZipEntry zipEntry; - - @Mock - ZipFile zipFile; - - private ReadableZipEntry readableZipEntry; - - @BeforeEach - void mock() { - readableZipEntry = ReadableZipEntry.builder() - .zipEntry(zipEntry) - .parentZip(zipFile) - .build(); - - } - - @DisplayName("get input stream") - @Nested - class TestGetInputStream { - @Mock - private InputStream inputStream; - - @SneakyThrows - @DisplayName("should return input stream") - @Test - void shouldReturnInputStream() { - when(zipFile.getInputStream(zipEntry)).thenReturn(inputStream); - - var inputStreamResult = readableZipEntry.getInputStream(); - - assertThat(inputStreamResult).isEqualTo(inputStream); - } - } - - @DisplayName("get positive size") - @Nested - class TestGetPositiveSize { - @DisplayName("should return size") - @Test - void shouldReturnSize() { - var size = 123L; - when(zipEntry.getSize()).thenReturn(size); - - var sizeResult = readableZipEntry.getPositiveSize(); - - assertThat(sizeResult).isEqualTo(size); - } - - @DisplayName("should throw if size is negative") - @Test - void shouldThrowIfSizeIsNegative() { - var size = -1L; - when(zipEntry.getSize()).thenReturn(size); - - assertThatThrownBy(() -> readableZipEntry.getPositiveSize()).isInstanceOf(TechnicalException.class); - } - - } -} diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/zip/TestZipFileFactory.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/zip/TestZipFileFactory.java deleted file mode 100644 index 8ac1b3595af4ae63e720a765d8fdced3a9730906..0000000000000000000000000000000000000000 --- a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/zip/TestZipFileFactory.java +++ /dev/null @@ -1,113 +0,0 @@ -package de.ozgcloud.eingang.xta.zip; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.util.List; -import java.util.zip.ZipEntry; -import java.util.zip.ZipOutputStream; - -import org.apache.commons.io.IOUtils; - -import de.ozgcloud.common.binaryfile.TempFileUtils; -import lombok.Builder; -import lombok.Getter; - -public class TestZipFileFactory { - - private static final String EXPANDED_ENTRY_NAME = "bomb.txt"; - - @Builder - @Getter - public static class TestZipEntry { - private String name; - private byte[] content; - } - - public static File createTempZipFile(List<TestZipEntry> testZipEntries) { - var file = TempFileUtils.createTmpFile().toFile(); - try (var zipOutputStream = new ZipOutputStream(new FileOutputStream(file))) { - for (TestZipEntry entry : testZipEntries) { - zipOutputStream.putNextEntry(new ZipEntry(entry.getName())); - zipOutputStream.write(entry.getContent()); - zipOutputStream.closeEntry(); - } - return file; - } catch (IOException e) { - throw new RuntimeException("Failed to create temporary zip file", e); - } - } - - public static File createTempZipBomb(int maxTotalSize) { - return overwriteFileWithZipEntrySize( - createTempZipWithSingleEntry(maxTotalSize * 2), - maxTotalSize - ); - } - - private static File createTempZipWithSingleEntry(int entrySize) { - var file = TempFileUtils.createTmpFile().toFile(); - try (var zipOutputStream = new ZipOutputStream(new FileOutputStream(file))) { - var entry = new ZipEntry(EXPANDED_ENTRY_NAME); - var content = "A".repeat(entrySize).getBytes(); - - zipOutputStream.putNextEntry(entry); - zipOutputStream.write(content); - zipOutputStream.closeEntry(); - - } catch (IOException e) { - throw new RuntimeException("Failed to create temporary zip file", e); - } - return file; - } - - private static File overwriteFileWithZipEntrySize(File file, int newSize) { - try { - var zipFileBytes = IOUtils.toByteArray(new FileInputStream(file)); - overwriteZipEntrySize(zipFileBytes, EXPANDED_ENTRY_NAME, newSize); - - // Write the adjusted ZIP content back to the file - try (var fos = new FileOutputStream(file)) { - fos.write(zipFileBytes); - } - } catch (IOException e) { - throw new RuntimeException("Failed to adjust size header of zip file", e); - } - return file; - } - - private static void overwriteZipEntrySize(byte[] zipFileBytes, String entryName, int newSize) throws IOException { - // Modify the uncompressed size entry size in the central directory structure (which is located at the end) - // Zip structure spec: https://www.iana.org/assignments/media-types/application/zip - var entryNameBytes = entryName.getBytes(); - - var lastIndexOfEntryName = findLastStartIndex(zipFileBytes, entryNameBytes); - if (lastIndexOfEntryName == -1) { - throw new IOException("ZIP entry not found: " + entryName); - } - var uncompressedSizeFieldStartOffset = lastIndexOfEntryName - (4 * 2 + 5 * 2 + 4); - writeIntToByteArray(newSize, zipFileBytes, uncompressedSizeFieldStartOffset); - } - - private static void writeIntToByteArray(int value, byte[] array, int offset) { - array[offset] = (byte) (value & 0xFF); - array[offset + 1] = (byte) ((value >> 8) & 0xFF); - array[offset + 2] = (byte) ((value >> 16) & 0xFF); - array[offset + 3] = (byte) ((value >> 24) & 0xFF); - } - - private static int findLastStartIndex(byte[] haystack, byte[] needle) { - var matchOffset = 0; - for (var i = haystack.length - 1; i >= needle.length; i--) { - if (haystack[i] == needle[needle.length - 1 - matchOffset]) { - if (++matchOffset == needle.length) { - return i; - } - } else { - matchOffset = 0; - } - } - return -1; - } -} diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/zip/ZipFileExtractorTest.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/zip/ZipFileExtractorTest.java deleted file mode 100644 index d23838973567f333510c7b14d5ae4536cd119655..0000000000000000000000000000000000000000 --- a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/zip/ZipFileExtractorTest.java +++ /dev/null @@ -1,371 +0,0 @@ -package de.ozgcloud.eingang.xta.zip; - -import static de.ozgcloud.eingang.xta.zip.TestZipFileFactory.*; -import static de.ozgcloud.eingang.xta.zip.ZipFileExtractor.*; -import static org.assertj.core.api.Assertions.*; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.Mockito.*; - -import java.io.File; -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.util.List; -import java.util.Map; -import java.util.stream.IntStream; -import java.util.zip.ZipEntry; - -import org.apache.commons.lang3.StringUtils; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Spy; -import org.springframework.util.MimeTypeUtils; - -import de.ozgcloud.eingang.common.errorhandling.TechnicalException; -import de.ozgcloud.eingang.common.formdata.IncomingFile; -import lombok.SneakyThrows; - -class ZipFileExtractorTest { - - @Spy - @InjectMocks - private ZipFileExtractor extractor; - - @DisplayName("extract incoming files safely") - @Nested - class TestExtractIncomingFilesWithSizeLimit { - @Mock - IncomingFile incomingZipFile; - - @Mock - File zipFile; - - @Mock - IncomingFile outIncomingFile; - - List<IncomingFile> outIncomingFiles; - - @BeforeEach - void mock() { - outIncomingFiles = List.of(outIncomingFile); - - when(incomingZipFile.getFile()).thenReturn(zipFile); - doNothing().when(extractor).verifyLimits(zipFile); - - doReturn(outIncomingFiles).when(extractor).extractIncomingFiles(zipFile); - } - - @DisplayName("should call verify limits") - @Test - void shouldCallVerifySizeLimit() { - extractor.extractIncomingFilesSafely(incomingZipFile); - - verify(extractor).verifyLimits(zipFile); - } - - @DisplayName("should return") - @Test - void shouldReturn() { - var output = extractor.extractIncomingFilesSafely(incomingZipFile); - - assertThat(output).isEqualTo(outIncomingFiles); - } - } - - @DisplayName("verify limits") - @Nested - class TestVerifyLimits { - @Mock - File zipFile; - - @DisplayName("should return") - @Test - void shouldReturn() { - when(zipFile.length()).thenReturn((long) ZIP_MAX_TOTAL_SIZE / 2); - doReturn((long) ZIP_MAX_TOTAL_SIZE).when(extractor).sumUncompressedEntrySizes(zipFile); - - extractor.verifyLimits(zipFile); - } - - @DisplayName("should throw if size limit exceeded") - @Test - void shouldThrowIfSizeLimitExceeded() { - doReturn((long) ZIP_MAX_TOTAL_SIZE + 1).when(extractor).sumUncompressedEntrySizes(zipFile); - - assertThatThrownBy(() -> extractor.verifyLimits(zipFile)) - .isInstanceOf(TechnicalException.class); - } - - @DisplayName("should throw if ratio exceeded") - @Test - void shouldThrowIfRatioExceeded() { - when(zipFile.length()).thenReturn(1L); - doReturn((long) ZIP_MAX_THRESHOLD + 1).when(extractor).sumUncompressedEntrySizes(zipFile); - - assertThatThrownBy(() -> extractor.verifyLimits(zipFile)) - .isInstanceOf(TechnicalException.class); - } - } - - @DisplayName("extract incoming files") - @Nested - class TestExtractIncomingFiles { - - private File zipFile; - - @BeforeEach - void mock() { - zipFile = createTempZipFile(fromMap(Map.of( - "file1.pdf", "file content1", - "file2.xml", "<root></root>", - "file3.png", "" - ))); - } - - @DisplayName("should contain content") - @Test - void shouldContainContent() { - var extractedFiles = extractor.extractIncomingFiles(zipFile); - - var contents = extractedFiles.stream().map(f -> { - try { - return Files.readString(f.getFile().toPath()); - } catch (IOException e) { - throw new RuntimeException(e); - } - }).toList(); - assertThat(contents).containsExactlyInAnyOrder("file content1", "<root></root>", ""); - } - - @DisplayName("should have names") - @Test - void shouldHaveNames() { - var extractedFiles = extractor.extractIncomingFiles(zipFile); - - var names = extractedFiles.stream().map(IncomingFile::getName).toList(); - assertThat(names).containsExactlyInAnyOrder("file1.pdf", "file2.xml", "file3.png"); - } - - @DisplayName("should have content types") - @Test - void shouldHaveContentTypes() { - var extractedFiles = extractor.extractIncomingFiles(zipFile); - - var names = extractedFiles.stream().map(IncomingFile::getContentType).toList(); - assertThat(names).containsExactlyInAnyOrder("application/pdf", "application/xml", "image/png"); - } - - private List<TestZipEntry> fromMap(Map<String, String> entries) { - return entries.entrySet().stream().map(kv -> TestZipEntry.builder() - .name(kv.getKey()) - .content(kv.getValue().getBytes(StandardCharsets.UTF_8)) - .build()) - .toList(); - } - } - - @DisplayName("extract zip bomb") - @Nested - class TestExtractZipBomb { - private static final int SMALLER_MAX_ZIP_FILE_SIZE = 2 * 1024; - - @DisplayName("should throw with too many entries") - @Test - void shouldThrow() { - var zipFile = createIncomingFile(createTempZipFile(IntStream.range(0, ZIP_MAX_ENTRIES + 1).mapToObj(i -> TestZipEntry.builder() - .name("file%d.txt".formatted(i)) - .content(toBytes("A".repeat(2))) - .build() - ).toList())); - - assertThatThrownBy(() -> extractor.extractIncomingFilesSafely(zipFile)) - .isInstanceOf(TechnicalException.class); - } - - @SneakyThrows - @DisplayName("should throw with fake getSize") - @Test - void shouldThrowWithFakeGetSize() { - doReturn(SMALLER_MAX_ZIP_FILE_SIZE).when(extractor).getZipMaxTotalSize(); - var zipBomb = createIncomingFile(createTempZipBomb(SMALLER_MAX_ZIP_FILE_SIZE)); - - assertThatThrownBy(() -> extractor.extractIncomingFilesSafely(zipBomb)) - .isInstanceOf(TechnicalException.class) - .hasRootCauseMessage(LimitedInputStream.LIMITED_EXCEEDED_MESSAGE); - } - - @DisplayName("should throw with too large size") - @Test - void shouldThrowWithTooLargeSize() { - doReturn(SMALLER_MAX_ZIP_FILE_SIZE).when(extractor).getZipMaxTotalSize(); - var zipFile = createIncomingFile(createTempZipFile(List.of(TestZipEntry.builder() - .name("toolargefile.txt") - .content(toBytes("A".repeat(SMALLER_MAX_ZIP_FILE_SIZE + 1))) - .build() - ))); - - assertThatThrownBy(() -> extractor.extractIncomingFilesSafely(zipFile)) - .isInstanceOf(TechnicalException.class); - } - - private IncomingFile createIncomingFile(File file) { - return IncomingFile.builder() - .file(file) - .build(); - } - } - - @DisplayName("create incoming file") - @Nested - class TestCreateIncomingFile { - @Mock - File file; - - @Mock - ZipEntry zipEntry; - - private static final String NAME = "filename.name"; - private static final Long SIZE = 5L; - private static final String CONTENT_TYPE = "some/content"; - - @BeforeEach - void mock() { - when(zipEntry.getName()).thenReturn(NAME); - when(zipEntry.getSize()).thenReturn(SIZE); - doReturn(CONTENT_TYPE).when(extractor).getContentType(NAME); - } - - @DisplayName("should have name") - @Test - void shouldHaveName() { - var incomingFile = create(); - - assertThat(incomingFile.getName()).isEqualTo(NAME); - } - - @DisplayName("should have size") - @Test - void shouldHaveSize() { - var incomingFile = create(); - - assertThat(incomingFile.getSize()).isEqualTo(SIZE); - } - - @DisplayName("should have content type") - @Test - void shouldHaveContentType() { - var incomingFile = create(); - - assertThat(incomingFile.getContentType()).isEqualTo(CONTENT_TYPE); - } - - @DisplayName("should have file") - @Test - void shouldHaveFile() { - var incomingFile = create(); - - assertThat(incomingFile.getFile()).isEqualTo(file); - } - - private IncomingFile create() { - return extractor.createIncomingFile(file, zipEntry); - } - } - - @DisplayName("sum uncompressed entry size") - @Nested - class TestSumUncompressedEntrySize { - @DisplayName("should return size") - @Test - void shouldReturnSize() { - var sizes = IntStream.range(100, 110).boxed().toList(); - var expectedSum = sizes.stream().mapToLong(Integer::longValue).sum(); - var zipFile = createTempZipFile(sizes.stream() - .map(size -> TestZipEntry.builder() - .name("somefilewithsize%d".formatted(size)) - .content(toBytes("A".repeat(size))) - .build() - ).toList()); - - var sum = extractor.sumUncompressedEntrySizes(zipFile); - - assertThat(sum).isEqualTo(expectedSum); - } - } - - @Nested - class TestContentType { - - @Test - void shouldReturnDefaultWhenNullString() { - assertThrows(NullPointerException.class, () -> extractor.getContentType(null)); - } - - @Test - void shouldReturnDefaultWhenEmptyString() { - var contentType = extractor.getContentType(StringUtils.EMPTY); - - assertThat(contentType).isEqualTo(MimeTypeUtils.APPLICATION_OCTET_STREAM_VALUE); - } - - @Test - void shouldReturnDefaultWhenSpaceString() { - var contentType = extractor.getContentType(StringUtils.SPACE); - - assertThat(contentType).isEqualTo(MimeTypeUtils.APPLICATION_OCTET_STREAM_VALUE); - } - - @Test - void shouldGetContentType() { - var fileNames = List.of("1.xml", "2.txt"); - - var contentTypes = fileNames.stream().map(extractor::getContentType).toList(); - - assertThat(contentTypes).containsExactlyInAnyOrder(MimeTypeUtils.APPLICATION_XML_VALUE, MimeTypeUtils.TEXT_PLAIN_VALUE); - } - } - - @DisplayName("map zip entries") - @Nested - class TestMapZipEntries { - - @DisplayName("should throw if max entries exceeded") - @Test - void shouldThrowIfMaxEntriesExceeded() { - var zipWithTooManyEntries = createTempZipFile(IntStream.range(0, ZIP_MAX_ENTRIES + 1) - .mapToObj(i -> TestZipEntry.builder() - .name("test%d.txt".formatted(i)) - .content(toBytes("test file %d".formatted(i))) - .build() - ).toList()); - - assertThatThrownBy(() -> extractor.mapZipEntries(zipWithTooManyEntries, entry -> null)) - .isInstanceOf(TechnicalException.class); - } - - @DisplayName("should map with mapping function") - @Test - void shouldMapWithMappingFunction() { - var expectedNumberList = IntStream.range(0, ZIP_MAX_ENTRIES).boxed().toList(); - var zipFile = createTempZipFile(expectedNumberList.stream() - .map(i -> TestZipEntry.builder() - .name("%d".formatted(i)) - .content(toBytes("some content")) - .build() - ).toList()); - - var numberList = extractor.mapZipEntries(zipFile, entry -> Integer.parseInt(entry.getName())); - - assertThat(numberList).isEqualTo(expectedNumberList); - } - } - - private byte[] toBytes(String string) { - return string.getBytes(StandardCharsets.UTF_8); - } - -} diff --git a/xta-adapter/src/test/resources/META-INF/services/org.junit.jupiter.api.extension.Extension b/xta-adapter/src/test/resources/META-INF/services/org.junit.jupiter.api.extension.Extension deleted file mode 100644 index 79b126e6cdb86bec1f4f08c205de8961bde1934a..0000000000000000000000000000000000000000 --- a/xta-adapter/src/test/resources/META-INF/services/org.junit.jupiter.api.extension.Extension +++ /dev/null @@ -1 +0,0 @@ -org.mockito.junit.jupiter.MockitoExtension \ No newline at end of file diff --git a/xta-adapter/src/test/resources/application-itcase.yml b/xta-adapter/src/test/resources/application-itcase.yml deleted file mode 100644 index 57024478bbf01070bc16c8710815acb3f750517c..0000000000000000000000000000000000000000 --- a/xta-adapter/src/test/resources/application-itcase.yml +++ /dev/null @@ -1,22 +0,0 @@ -ozgcloud: - xta: - identifiers: - - afmsh:010600000000_Online-Dienste - server: - address: localhost:3000 - name: LI33-0005 - protocol: https - keystore: - file: classpath:xtaTestStore.p12 - password: <geheim> - adapter: - targetVorgangManagerName: itcase - fallbackStrategy: DENY - routingStrategy: SINGLE - - -grpc: - client: - vorgang-manager-itcase: - address: in-process:vorgang-manager-itcase - negotiationType: PLAINTEXT diff --git a/xta-adapter/src/test/resources/junit-platform.properties b/xta-adapter/src/test/resources/junit-platform.properties deleted file mode 100644 index 1cebb76d5a58ac034b2627d12411d82d1e85821e..0000000000000000000000000000000000000000 --- a/xta-adapter/src/test/resources/junit-platform.properties +++ /dev/null @@ -1 +0,0 @@ -junit.jupiter.extensions.autodetection.enabled = true \ No newline at end of file diff --git a/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/brauchtumsfeuer_with_anlage/2ef19b50-2d00-4cb0-8318-e3422ab27b86_PDF-Antrag.pdf b/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/brauchtumsfeuer_with_anlage/2ef19b50-2d00-4cb0-8318-e3422ab27b86_PDF-Antrag.pdf deleted file mode 100644 index 1107550f6d33553de96634c3765aaf787e21e07c..0000000000000000000000000000000000000000 Binary files a/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/brauchtumsfeuer_with_anlage/2ef19b50-2d00-4cb0-8318-e3422ab27b86_PDF-Antrag.pdf and /dev/null differ diff --git a/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/brauchtumsfeuer_with_anlage/4bb895cc-7b60-4322-81fa-cf928d1a22e5_00TESTPDF.pdf b/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/brauchtumsfeuer_with_anlage/4bb895cc-7b60-4322-81fa-cf928d1a22e5_00TESTPDF.pdf deleted file mode 100644 index 26d15054ee2c6638da8d719645ce87b0d83a259a..0000000000000000000000000000000000000000 Binary files a/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/brauchtumsfeuer_with_anlage/4bb895cc-7b60-4322-81fa-cf928d1a22e5_00TESTPDF.pdf and /dev/null differ diff --git a/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/brauchtumsfeuer_with_anlage/60b6753a-23a8-4552-ae82-36ed96f63e03_Geschaeftsgang.Geschaeftsgang.0201.xml b/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/brauchtumsfeuer_with_anlage/60b6753a-23a8-4552-ae82-36ed96f63e03_Geschaeftsgang.Geschaeftsgang.0201.xml deleted file mode 100644 index 9623996ed13c169c65fdc7b49b98671a4ce5f6ee..0000000000000000000000000000000000000000 --- a/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/brauchtumsfeuer_with_anlage/60b6753a-23a8-4552-ae82-36ed96f63e03_Geschaeftsgang.Geschaeftsgang.0201.xml +++ /dev/null @@ -1,107 +0,0 @@ -<?xml version="1.0"?> -<xdomea:Geschaeftsgang.Geschaeftsgang.0201 xmlns:xdomea="http://www.xdomea.de/V2.0.1"> - <xdomea:Kopf> - <xdomea:ProzessID>60b6753a-23a8-4552-ae82-36ed96f63e03</xdomea:ProzessID> - <xdomea:Nachrichtentyp codeName="Geschaeftsgang.Geschaeftsgang.0201" codelistAgencyName="AG XDOMEA des KoopA ADV" codelistVersionIdentifier="2.0.0" languageCode="de" codelistName="Nachrichtentyp">0201</xdomea:Nachrichtentyp> - <xdomea:Erstellungszeitpunkt>2024-05-17T15:35:54.560+02:00</xdomea:Erstellungszeitpunkt> - <xdomea:Absender> - <xdomea:Behoerdenkennung> - <xdomea:Kennung codeName="WebMethod_Online-Dienste">WebMethod_Online-Dienste</xdomea:Kennung> - <xdomea:Praefix codeName="afmsh:">afmsh:</xdomea:Praefix> - </xdomea:Behoerdenkennung> - <xdomea:Institution> - <xdomea:Name>Schleswig-Holstein</xdomea:Name> - <xdomea:Kurzbezeichnung>Schleswig-Holstein</xdomea:Kurzbezeichnung> - </xdomea:Institution> - </xdomea:Absender> - <xdomea:Empfaenger> - <xdomea:Behoerdenkennung> - <xdomea:Kennung codeName="ozg-cloud-dev001 ">ozg-cloud-dev001 </xdomea:Kennung> - <xdomea:Praefix codeName="afmsh:">afmsh:</xdomea:Praefix> - </xdomea:Behoerdenkennung> - </xdomea:Empfaenger> - <xdomea:SendendesSystem> - <xdomea:InstanzID>AFMSH.MSR</xdomea:InstanzID> - <xdomea:Produktname>MSR</xdomea:Produktname> - <xdomea:Version>10.5</xdomea:Version> - </xdomea:SendendesSystem> - <xdomea:EmpfangsbestaetigungAnInitiator>false</xdomea:EmpfangsbestaetigungAnInitiator> - <xdomea:EmpfangsbestaetigungAnVorgaenger>false</xdomea:EmpfangsbestaetigungAnVorgaenger> - </xdomea:Kopf> - <xdomea:Hauptobjekt> - <xdomea:Dokument> - <xdomea:Identifikation> - <xdomea:ID>30714b70-3ba3-4f32-a36a-4990162f14bb</xdomea:ID> - </xdomea:Identifikation> - <xdomea:AllgemeineMetadaten> - <xdomea:Betreff>Brauchtumsfeuer NB Anbindung Test</xdomea:Betreff> - <xdomea:Kennzeichen>20240517561130590306</xdomea:Kennzeichen> - </xdomea:AllgemeineMetadaten> - <xdomea:Posteingangsdatum>2024-05-17</xdomea:Posteingangsdatum> - <xdomea:Typ>btf_brauchtumsfeuer_sh/btf_brauchtumsfeuer_nb</xdomea:Typ> - <xdomea:Version> - <xdomea:Nummer>0.0</xdomea:Nummer> - <xdomea:Format> - <xdomea:Name codeName="xml - eXtensible Markup Language" codelistAgencyName="AG XDOMEA des KoopA ADV" codelistVersionIdentifier="2.0.0" languageCode="de" codelistName="Dateiformat">030</xdomea:Name> - <xdomea:Version>0.0</xdomea:Version> - <xdomea:Primaerdokument> - <xdomea:Dateiname>73927734-c97b-4823-bad1-60401b112a9f_XML-Daten.xml</xdomea:Dateiname> - </xdomea:Primaerdokument> - </xdomea:Format> - </xdomea:Version> - <xdomea:Version> - <xdomea:Nummer>0.0</xdomea:Nummer> - <xdomea:Format> - <xdomea:Name codeName="pdf - Portable Document Format" codelistAgencyName="AG XDOMEA des KoopA ADV" codelistVersionIdentifier="2.0.0" languageCode="de" codelistName="Dateiformat">018</xdomea:Name> - <xdomea:Version>0.0</xdomea:Version> - <xdomea:Primaerdokument> - <xdomea:Dateiname>2ef19b50-2d00-4cb0-8318-e3422ab27b86_PDF-Antrag.pdf</xdomea:Dateiname> - </xdomea:Primaerdokument> - </xdomea:Format> - </xdomea:Version> - </xdomea:Dokument> - </xdomea:Hauptobjekt> - <xdomea:ExternerGeschaeftsgang> - <xdomea:Identifikation> - <xdomea:ID>6c89a915-791b-4e9f-a06b-a23a16925c34</xdomea:ID> - </xdomea:Identifikation> - <xdomea:Beteiligungsschritt> - <xdomea:Nummer>1</xdomea:Nummer> - <xdomea:Status codeName="zukuenftig" codelistAgencyName="AG XDOMEA des KoopA ADV" codelistVersionIdentifier="2.0.0" languageCode="de" codelistName="Beteiligungsstatus">001</xdomea:Status> - <xdomea:Verfuegung> - <xdomea:Ersteller> - <xdomea:Behoerdenkennung> - <xdomea:Kennung codeName="WebMethod_Online-Dienste">WebMethod_Online-Dienste</xdomea:Kennung> - <xdomea:Praefix codeName="afmsh:">afmsh:</xdomea:Praefix> - </xdomea:Behoerdenkennung> - </xdomea:Ersteller> - <xdomea:Adressat> - <xdomea:Behoerdenkennung> - <xdomea:Kennung codeName="ozg-cloud-dev001 ">ozg-cloud-dev001 </xdomea:Kennung> - <xdomea:Praefix codeName="afmsh:">afmsh:</xdomea:Praefix> - </xdomea:Behoerdenkennung> - </xdomea:Adressat> - <xdomea:Erstellungsdatum>2024-05-17</xdomea:Erstellungsdatum> - <xdomea:Erstellungsuhrzeit>15:35:54</xdomea:Erstellungsuhrzeit> - </xdomea:Verfuegung> - </xdomea:Beteiligungsschritt> - </xdomea:ExternerGeschaeftsgang> - <xdomea:Anlage> - <xdomea:Dokument> - <xdomea:Identifikation> - <xdomea:ID>44d72e8a-f8e3-484b-bf0c-a84cf1aebe0c</xdomea:ID> - </xdomea:Identifikation> - <xdomea:Typ>Anlage</xdomea:Typ> - <xdomea:Version> - <xdomea:Nummer>1</xdomea:Nummer> - <xdomea:Format> - <xdomea:Name codeName="pdf - Portable Document Format" codelistAgencyName="AG XDOMEA des KoopA ADV" codelistVersionIdentifier="2.0.0" languageCode="de" codelistName="Dateiformat">018</xdomea:Name> - <xdomea:Version>0.0</xdomea:Version> - <xdomea:Primaerdokument> - <xdomea:Dateiname>4bb895cc-7b60-4322-81fa-cf928d1a22e5_00TESTPDF.pdf</xdomea:Dateiname> - </xdomea:Primaerdokument> - </xdomea:Format> - </xdomea:Version> - </xdomea:Dokument> - </xdomea:Anlage> -</xdomea:Geschaeftsgang.Geschaeftsgang.0201> \ No newline at end of file diff --git a/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/brauchtumsfeuer_with_anlage/73927734-c97b-4823-bad1-60401b112a9f_XML-Daten.xml b/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/brauchtumsfeuer_with_anlage/73927734-c97b-4823-bad1-60401b112a9f_XML-Daten.xml deleted file mode 100644 index dd019ef8d904106ab1e5c20cbc0a10ad4fef5a75..0000000000000000000000000000000000000000 --- a/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/brauchtumsfeuer_with_anlage/73927734-c97b-4823-bad1-60401b112a9f_XML-Daten.xml +++ /dev/null @@ -1,89 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<myForm xmlns:t="http://xmlns.cit.de/intelliform/transaction" t:form-version="2.022" - t:uuid="a1d537b5-79f1-492b-8966-b66d391fe294" t:id="20240517561130590306" t:timestamp="2024-05-17T13:35:13.586Z" - t:sender="test.afm.schleswig-holstein.de" t:form="Brauchtumsfeuer NB Anbindung Test" - t:form-id="btf_brauchtumsfeuer_sh/btf_brauchtumsfeuer_nb" t:customer="Schleswig-Holstein" t:customer-id="sh" - t:client="Schleswig-Holstein" t:client-id="land" t:lang="de-DE"> - <GebietID>9006880</GebietID> - <AnliegenID>9552000</AnliegenID> - <GebietBEZEICHNUNG>Scharbeutz</GebietBEZEICHNUNG> - <zst_online_dienst>Brauchtumsfeuer: - Anmeldung;266889711;https://www.dataport.de/datenschutz/;WEBSERVICE;;;https://atlantis.stage.afm.ozg-sh.de/ws/intelliform_formDatas;https://www.dataport.de/impressum/;true - </zst_online_dienst> - <datenschutz_akzeptiert>true</datenschutz_akzeptiert> - <zustaendigestelle> - <OrganisationseinheitenID>9795669</OrganisationseinheitenID> - </zustaendigestelle> - <OrganisationseinheitenBEZEICHNUNG>Dataport-AFM-SH-Entwicklung Kunstbehörde</OrganisationseinheitenBEZEICHNUNG> - <zust_kontaktsystemkennung_ln /> - <zust_kontaktsystemkennung_nb /> - <zust_kontaktsystemkennung_webservice>https://atlantis.stage.afm.ozg-sh.de/ws/intelliform_formDatas - </zust_kontaktsystemkennung_webservice> - <zust_strasse>Entwicklerweg</zust_strasse> - <zust_hausnummer>123</zust_hausnummer> - <zust_postleitzahl>24107</zust_postleitzahl> - <ortID>9006402</ortID> - <zust_ort>Kiel</zust_ort> - <zust_telefonnummer>+49 40 42846-4032</zust_telefonnummer> - <zust_faxnummer /> - <zust_emailadresse>noreply@ozg-sh.de</zust_emailadresse> - <anzeigender_verantwortlich>true</anzeigender_verantwortlich> - <anzeigender_nachname>mit Anhang</anzeigender_nachname> - <anzeigender_vorname>Test</anzeigender_vorname> - <anzeigender_geburtsdatum>2001-01-01</anzeigender_geburtsdatum> - <anzeigender_land_auswahl>in Deutschland</anzeigender_land_auswahl> - <anzeigender_strasse>Test</anzeigender_strasse> - <anzeigender_hausnummer>1</anzeigender_hausnummer> - <anzeigender_postleitzahl>22222</anzeigender_postleitzahl> - <anzeigender_ort>Test</anzeigender_ort> - <anzeigender_firma /> - <kontakt_mail>noreply@ozg-sh.de</kontakt_mail> - <kontakt_telefon /> - <kontakt_mobil /> - <verantwortlicher_mobil>0123456789</verantwortlicher_mobil> - <verantwortlicher_mobil2 /> - <angabe>adresse</angabe> - <strasse>Teststr</strasse> - <hausnummer>1</hausnummer> - <ort>Scharbeutz</ort> - <ortsteil /> - <angaben_extra /> - <lageplan> - <file content-type="application/pdf" description="" id="assistants.85D54E9431CF70430ACBB8DD3E604E83C03B1891" - length="185689">00TESTPDF.pdf - </file> - </lageplan> - <feuer_datum>2025-07-08</feuer_datum> - <feuer_start>15:00</feuer_start> - <feuer_ende>23:00</feuer_ende> - <feuer_groesse>1000</feuer_groesse> - <feuer_art>Alles - </feuer_art> - <feuer_gefahrenabwehr /> - <weitergabe>true</weitergabe> - <richtigkeit>true</richtigkeit> - <missbrauch>true</missbrauch> - <betreff>Anzeige eines Brauchtumsfeuers</betreff> - <nachricht>Sehr geehrte/r Angtragssteller/in<br/><br/>Ihr Antrag wurde an die zuständige Stelle - gesendet.<br/> Ihre Vorgangsnummer und zuständige Stelle finden Sie im angehängten Dokument. <br/>Bitte - geben Sie diese Vorgangsnummer bei allen Anfragen zu Ihrerm Antrag an.<br/><br/><br/>Mit - freundlichen Grüßen<br/><br/>Ihre zuständige Stelle - </nachricht> - <mail /> - <nameid /> - <rest_response_name>[]</rest_response_name> - <mailboxguid /> - <antragsteller> - <pers_anrede /> - <pers_nachname>mit Anhang</pers_nachname> - <pers_vorname>Test</pers_vorname> - <pers_geburtsdatum>2001-01-01</pers_geburtsdatum> - <sh_strasse>Test</sh_strasse> - <sh_hausnummer>1</sh_hausnummer> - <sh_plz>22222</sh_plz> - <ort>Test</ort> - <kont_telefonnummer /> - <kont_mobilnummer /> - <kont_email>noreply@ozg-sh.de</kont_email> - </antragsteller> -</myForm> diff --git a/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/brauchtumsfeuer_without_anlage/0cec5d74-5ac3-4ff3-9a6f-69007ff3f27e_Geschaeftsgang.Geschaeftsgang.0201.xml b/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/brauchtumsfeuer_without_anlage/0cec5d74-5ac3-4ff3-9a6f-69007ff3f27e_Geschaeftsgang.Geschaeftsgang.0201.xml deleted file mode 100644 index e66b92187f6db6335ea86ea32f127d78f70cd786..0000000000000000000000000000000000000000 --- a/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/brauchtumsfeuer_without_anlage/0cec5d74-5ac3-4ff3-9a6f-69007ff3f27e_Geschaeftsgang.Geschaeftsgang.0201.xml +++ /dev/null @@ -1,89 +0,0 @@ -<?xml version="1.0"?> -<xdomea:Geschaeftsgang.Geschaeftsgang.0201 xmlns:xdomea="http://www.xdomea.de/V2.0.1"> - <xdomea:Kopf> - <xdomea:ProzessID>0cec5d74-5ac3-4ff3-9a6f-69007ff3f27e</xdomea:ProzessID> - <xdomea:Nachrichtentyp codeName="Geschaeftsgang.Geschaeftsgang.0201" codelistAgencyName="AG XDOMEA des KoopA ADV" codelistVersionIdentifier="2.0.0" languageCode="de" codelistName="Nachrichtentyp">0201</xdomea:Nachrichtentyp> - <xdomea:Erstellungszeitpunkt>2024-05-17T09:21:09.073+02:00</xdomea:Erstellungszeitpunkt> - <xdomea:Absender> - <xdomea:Behoerdenkennung> - <xdomea:Kennung codeName="WebMethod_Online-Dienste">WebMethod_Online-Dienste</xdomea:Kennung> - <xdomea:Praefix codeName="afmsh:">afmsh:</xdomea:Praefix> - </xdomea:Behoerdenkennung> - <xdomea:Institution> - <xdomea:Name>Schleswig-Holstein</xdomea:Name> - <xdomea:Kurzbezeichnung>Schleswig-Holstein</xdomea:Kurzbezeichnung> - </xdomea:Institution> - </xdomea:Absender> - <xdomea:Empfaenger> - <xdomea:Behoerdenkennung> - <xdomea:Kennung codeName="ozg-cloud-dev001">ozg-cloud-dev001</xdomea:Kennung> - <xdomea:Praefix codeName="afmsh:">afmsh:</xdomea:Praefix> - </xdomea:Behoerdenkennung> - </xdomea:Empfaenger> - <xdomea:SendendesSystem> - <xdomea:InstanzID>AFMSH.MSR</xdomea:InstanzID> - <xdomea:Produktname>MSR</xdomea:Produktname> - <xdomea:Version>10.5</xdomea:Version> - </xdomea:SendendesSystem> - <xdomea:EmpfangsbestaetigungAnInitiator>false</xdomea:EmpfangsbestaetigungAnInitiator> - <xdomea:EmpfangsbestaetigungAnVorgaenger>false</xdomea:EmpfangsbestaetigungAnVorgaenger> - </xdomea:Kopf> - <xdomea:Hauptobjekt> - <xdomea:Dokument> - <xdomea:Identifikation> - <xdomea:ID>e8f627fe-b90c-4fc7-ba61-20a43041971b</xdomea:ID> - </xdomea:Identifikation> - <xdomea:AllgemeineMetadaten> - <xdomea:Betreff>Brauchtumsfeuer NB Anbindung Test</xdomea:Betreff> - <xdomea:Kennzeichen>20240517335360945504</xdomea:Kennzeichen> - </xdomea:AllgemeineMetadaten> - <xdomea:Posteingangsdatum>2024-05-17</xdomea:Posteingangsdatum> - <xdomea:Typ>btf_brauchtumsfeuer_sh/btf_brauchtumsfeuer_nb</xdomea:Typ> - <xdomea:Version> - <xdomea:Nummer>0.0</xdomea:Nummer> - <xdomea:Format> - <xdomea:Name codeName="xml - eXtensible Markup Language" codelistAgencyName="AG XDOMEA des KoopA ADV" codelistVersionIdentifier="2.0.0" languageCode="de" codelistName="Dateiformat">030</xdomea:Name> - <xdomea:Version>0.0</xdomea:Version> - <xdomea:Primaerdokument> - <xdomea:Dateiname>758ae7f9-9984-43ba-8dda-b81aa3d92f95_XML-Daten.xml</xdomea:Dateiname> - </xdomea:Primaerdokument> - </xdomea:Format> - </xdomea:Version> - <xdomea:Version> - <xdomea:Nummer>0.0</xdomea:Nummer> - <xdomea:Format> - <xdomea:Name codeName="pdf - Portable Document Format" codelistAgencyName="AG XDOMEA des KoopA ADV" codelistVersionIdentifier="2.0.0" languageCode="de" codelistName="Dateiformat">018</xdomea:Name> - <xdomea:Version>0.0</xdomea:Version> - <xdomea:Primaerdokument> - <xdomea:Dateiname>3a41cc59-baf4-424d-8c69-a8e7f7470d68_PDF-Antrag.pdf</xdomea:Dateiname> - </xdomea:Primaerdokument> - </xdomea:Format> - </xdomea:Version> - </xdomea:Dokument> - </xdomea:Hauptobjekt> - <xdomea:ExternerGeschaeftsgang> - <xdomea:Identifikation> - <xdomea:ID>f5966df2-633a-4763-a769-b4250d66df58</xdomea:ID> - </xdomea:Identifikation> - <xdomea:Beteiligungsschritt> - <xdomea:Nummer>1</xdomea:Nummer> - <xdomea:Status codeName="zukuenftig" codelistAgencyName="AG XDOMEA des KoopA ADV" codelistVersionIdentifier="2.0.0" languageCode="de" codelistName="Beteiligungsstatus">001</xdomea:Status> - <xdomea:Verfuegung> - <xdomea:Ersteller> - <xdomea:Behoerdenkennung> - <xdomea:Kennung codeName="WebMethod_Online-Dienste">WebMethod_Online-Dienste</xdomea:Kennung> - <xdomea:Praefix codeName="afmsh:">afmsh:</xdomea:Praefix> - </xdomea:Behoerdenkennung> - </xdomea:Ersteller> - <xdomea:Adressat> - <xdomea:Behoerdenkennung> - <xdomea:Kennung codeName="ozg-cloud-dev001">ozg-cloud-dev001</xdomea:Kennung> - <xdomea:Praefix codeName="afmsh:">afmsh:</xdomea:Praefix> - </xdomea:Behoerdenkennung> - </xdomea:Adressat> - <xdomea:Erstellungsdatum>2024-05-17</xdomea:Erstellungsdatum> - <xdomea:Erstellungsuhrzeit>09:21:06</xdomea:Erstellungsuhrzeit> - </xdomea:Verfuegung> - </xdomea:Beteiligungsschritt> - </xdomea:ExternerGeschaeftsgang> -</xdomea:Geschaeftsgang.Geschaeftsgang.0201> \ No newline at end of file diff --git a/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/brauchtumsfeuer_without_anlage/3a41cc59-baf4-424d-8c69-a8e7f7470d68_PDF-Antrag.pdf b/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/brauchtumsfeuer_without_anlage/3a41cc59-baf4-424d-8c69-a8e7f7470d68_PDF-Antrag.pdf deleted file mode 100644 index 1107550f6d33553de96634c3765aaf787e21e07c..0000000000000000000000000000000000000000 Binary files a/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/brauchtumsfeuer_without_anlage/3a41cc59-baf4-424d-8c69-a8e7f7470d68_PDF-Antrag.pdf and /dev/null differ diff --git a/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/brauchtumsfeuer_without_anlage/758ae7f9-9984-43ba-8dda-b81aa3d92f95_XML-Daten.xml b/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/brauchtumsfeuer_without_anlage/758ae7f9-9984-43ba-8dda-b81aa3d92f95_XML-Daten.xml deleted file mode 100644 index 00e2a77f7ffabafbb4abcb2e81c8701a40b460aa..0000000000000000000000000000000000000000 --- a/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/brauchtumsfeuer_without_anlage/758ae7f9-9984-43ba-8dda-b81aa3d92f95_XML-Daten.xml +++ /dev/null @@ -1,3 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<myForm xmlns:t="http://xmlns.cit.de/intelliform/transaction" t:form-version="2.022" t:uuid="147839b0-e938-4606-a8bc-104afd83a2b3" t:id="20240517335360945504" t:timestamp="2024-05-17T07:18:56.031Z" t:sender="test.afm.schleswig-holstein.de" t:form="Brauchtumsfeuer NB Anbindung Test" t:form-id="btf_brauchtumsfeuer_sh/btf_brauchtumsfeuer_nb" t:customer="Schleswig-Holstein" t:customer-id="sh" t:client="Schleswig-Holstein" t:client-id="land" t:lang="de-DE"><GebietID>9006880</GebietID><AnliegenID>9552000</AnliegenID><GebietBEZEICHNUNG>Scharbeutz</GebietBEZEICHNUNG><zst_online_dienst>Brauchtumsfeuer: Anmeldung;266889711;https://www.dataport.de/datenschutz/;WEBSERVICE;;;https://atlantis.stage.afm.ozg-sh.de/ws/intelliform_formDatas;https://www.dataport.de/impressum/;true</zst_online_dienst><datenschutz_akzeptiert>true</datenschutz_akzeptiert><zustaendigestelle><OrganisationseinheitenID>9795669</OrganisationseinheitenID></zustaendigestelle><OrganisationseinheitenBEZEICHNUNG>Dataport-AFM-SH-Entwicklung Kunstbehörde</OrganisationseinheitenBEZEICHNUNG><zust_kontaktsystemkennung_ln/><zust_kontaktsystemkennung_nb/><zust_kontaktsystemkennung_webservice>https://atlantis.stage.afm.ozg-sh.de/ws/intelliform_formDatas</zust_kontaktsystemkennung_webservice><zust_strasse>Entwicklerweg</zust_strasse><zust_hausnummer>123</zust_hausnummer><zust_postleitzahl>24107</zust_postleitzahl><ortID>9006402</ortID><zust_ort>Kiel</zust_ort><zust_telefonnummer>+49 40 42846-4032</zust_telefonnummer><zust_faxnummer/><zust_emailadresse>noreply@ozg-sh.de</zust_emailadresse><anzeigender_verantwortlich>true</anzeigender_verantwortlich><anzeigender_nachname>OZG-Cloud</anzeigender_nachname><anzeigender_vorname>Test von</anzeigender_vorname><anzeigender_geburtsdatum>2001-01-01</anzeigender_geburtsdatum><anzeigender_land_auswahl>in Deutschland</anzeigender_land_auswahl><anzeigender_strasse>Teststraße</anzeigender_strasse><anzeigender_hausnummer>1</anzeigender_hausnummer><anzeigender_postleitzahl>22222</anzeigender_postleitzahl><anzeigender_ort>Teststadt</anzeigender_ort><anzeigender_firma/><kontakt_mail>noreply@ozg-sh.de</kontakt_mail><kontakt_telefon/><kontakt_mobil/><verantwortlicher_mobil>0123</verantwortlicher_mobil><verantwortlicher_mobil2/><angabe>adresse</angabe><strasse>Test</strasse><hausnummer>1</hausnummer><ort>Scharbeutz</ort><ortsteil/><angaben_extra/><feuer_datum>2024-10-01</feuer_datum><feuer_start>8:00</feuer_start><feuer_ende>12:00</feuer_ende><feuer_groesse>100</feuer_groesse><feuer_art>Holz -</feuer_art><feuer_gefahrenabwehr/><weitergabe>true</weitergabe><richtigkeit>true</richtigkeit><missbrauch>true</missbrauch><betreff>Anzeige eines Brauchtumsfeuers</betreff><nachricht>Sehr geehrte/r Angtragssteller/in<br/><br/>Ihr Antrag wurde an die zuständige Stelle gesendet.<br/> Ihre Vorgangsnummer und zuständige Stelle finden Sie im angehängten Dokument. <br/>Bitte geben Sie diese Vorgangsnummer bei allen Anfragen zu Ihrerm Antrag an.<br/><br/><br/>Mit freundlichen Grüßen<br/><br/>Ihre zuständige Stelle</nachricht><mail/><nameid/><rest_response_name>[]</rest_response_name><mailboxguid/><antragsteller><pers_anrede/><pers_nachname>OZG-Cloud</pers_nachname><pers_vorname>Test von</pers_vorname><pers_geburtsdatum>2001-01-01</pers_geburtsdatum><sh_strasse>Teststraße</sh_strasse><sh_hausnummer>1</sh_hausnummer><sh_plz>22222</sh_plz><ort>Teststadt</ort><kont_telefonnummer/><kont_mobilnummer/><kont_email>noreply@ozg-sh.de</kont_email></antragsteller></myForm> diff --git a/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/dfoerdermittel_with_anlage/06d36643-2883-4b74-9231-8dc7f2693af2_Zusammenfassung-01f903b0-c61e-429d-807f-5011d180c073.pdf b/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/dfoerdermittel_with_anlage/06d36643-2883-4b74-9231-8dc7f2693af2_Zusammenfassung-01f903b0-c61e-429d-807f-5011d180c073.pdf deleted file mode 100644 index 5ac687e093135486e303a1547f90f548c3d52f6d..0000000000000000000000000000000000000000 Binary files a/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/dfoerdermittel_with_anlage/06d36643-2883-4b74-9231-8dc7f2693af2_Zusammenfassung-01f903b0-c61e-429d-807f-5011d180c073.pdf and /dev/null differ diff --git a/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/dfoerdermittel_with_anlage/1d8ca22a-9d20-4507-aa5e-b764bb5642f0_Admin.png b/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/dfoerdermittel_with_anlage/1d8ca22a-9d20-4507-aa5e-b764bb5642f0_Admin.png deleted file mode 100644 index 9ec0d7a08d0be142997505dd5b6d13015054d5d5..0000000000000000000000000000000000000000 Binary files a/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/dfoerdermittel_with_anlage/1d8ca22a-9d20-4507-aa5e-b764bb5642f0_Admin.png and /dev/null differ diff --git a/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/dfoerdermittel_with_anlage/3ecc7e49-5dc2-499a-9be8-ce8b9d8c8714_Fachnachricht.xml b/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/dfoerdermittel_with_anlage/3ecc7e49-5dc2-499a-9be8-ce8b9d8c8714_Fachnachricht.xml deleted file mode 100644 index 14aa5016cdef7d7a084f7e7f83b3be12e24d99da..0000000000000000000000000000000000000000 --- a/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/dfoerdermittel_with_anlage/3ecc7e49-5dc2-499a-9be8-ce8b9d8c8714_Fachnachricht.xml +++ /dev/null @@ -1,32 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<application xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.dataport.de/dFAD/ApplicationDataMessageSchema"> - <ApplicationFormId>08dc645c-6704-48e7-868c-6afa8510384c</ApplicationFormId> - <Timestamp>2024-04-24T16:32:54.696248+02:00</Timestamp> - <ApplicationDataMessageVersion>3</ApplicationDataMessageVersion> - <Title>OZG-Cloud Test 2.0</Title> - <ProjectName>OZG-Cloud Test 2.0</ProjectName> - <ProjectTitle>OZG-Cloud Test 2.0</ProjectTitle> - <TransmittedApplicationId>UGLAG4ILLpz6a0</TransmittedApplicationId> - <MetaText1>9795669</MetaText1> - <InboxReference>hh/hh/4dd01647-b9d9-4775-1b50-08da3d83800a</InboxReference> - <AuthenticationAccountType>ServicekontoBasic</AuthenticationAccountType> - <AuthenticationMethod>UsernameAndPassword</AuthenticationMethod> - <AuthenticationIdentityDetails xsi:nil="true" /> - <Pages> - <Page> - <Title>Willkommen auf Ihrer neuen Seite</Title> - <Navigation>Freimodul 1</Navigation> - <Controls> - <Control> - <Upload> - <Label>Dateiupload</Label> - <Alias /> - <Files> - <Name>Admin.png</Name> - </Files> - </Upload> - </Control> - </Controls> - </Page> - </Pages> -</application> diff --git a/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/dfoerdermittel_with_anlage/b29d45cc-9aac-4452-ad08-60f5ab3bab95_Geschaeftsgang.Geschaeftsgang.0201.xml b/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/dfoerdermittel_with_anlage/b29d45cc-9aac-4452-ad08-60f5ab3bab95_Geschaeftsgang.Geschaeftsgang.0201.xml deleted file mode 100644 index 021987e3a06b61d8f509507c6cb9cac5ae4c8e44..0000000000000000000000000000000000000000 --- a/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/dfoerdermittel_with_anlage/b29d45cc-9aac-4452-ad08-60f5ab3bab95_Geschaeftsgang.Geschaeftsgang.0201.xml +++ /dev/null @@ -1,128 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<Geschaeftsgang.Geschaeftsgang.0201 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xsi:schemaLocation="urn:xoev-de:xdomea:schema:2.4.0 xdomea-Nachrichten-VBS.xsd" xmlns="urn:xoev-de:xdomea:schema:2.4.0"> - <Kopf> - <ProzessID>b29d45cc-9aac-4452-ad08-60f5ab3bab95</ProzessID> - <Nachrichtentyp listURI="urn:xoev-de:xdomea:codeliste:nachrichtentyp" listVersionID="1.0"> - <code xmlns="">0201</code> - </Nachrichtentyp> - <Erstellungszeitpunkt>2024-04-24T16:32:54.7247984+02:00</Erstellungszeitpunkt> - <Absender> - <Behoerdenkennung> - <Kennung listURI="" listVersionID=""> - <code xmlns="">010200200000</code> - </Kennung> - <Praefix listURI="" listVersionID=""> - <code xmlns="">gad</code> - </Praefix> - </Behoerdenkennung> - </Absender> - <Empfaenger> - <Behoerdenkennung> - <Kennung listURI="" listVersionID=""> - <code xmlns="">dev-environment@ozg-cloud.de</code> - </Kennung> - <Praefix listURI="" listVersionID=""> - <code xmlns="">gae</code> - </Praefix> - </Behoerdenkennung> - </Empfaenger> - <SendendesSystem> - <InstanzID>HH_dFoerdermittelantrag</InstanzID> - <Produktname>dFoerdermittelantrag</Produktname> - <Version>2.1.999.0</Version> - </SendendesSystem> - <EmpfangsbestaetigungAnInitiator>false</EmpfangsbestaetigungAnInitiator> - <EmpfangsbestaetigungAnVorgaenger>false</EmpfangsbestaetigungAnVorgaenger> - </Kopf> - <Hauptobjekt> - <Dokument> - <Identifikation> - <ID>5d142b11-7b52-4bfc-b14d-8d02fee84aa3</ID> - </Identifikation> - <AllgemeineMetadaten> - <Betreff>OZG-Cloud Test 2.0</Betreff> - <Kennzeichen>08dc645c-6704-48e7-868c-6afa8510384c</Kennzeichen> - </AllgemeineMetadaten> - <Version> - <Nummer>1</Nummer> - <Format> - <Name listURI="urn:xoev-de:xdomea:codeliste:dateiformat" listVersionID="1.0" xsi:type="DateiformatCodeType"> - <code xmlns="">030</code> - <name xmlns="">xml-eXtensible Markup Language</name> - </Name> - <Version>0.0</Version> - <Primaerdokument> - <Dateiname>3ecc7e49-5dc2-499a-9be8-ce8b9d8c8714_Fachnachricht.xml</Dateiname> - </Primaerdokument> - </Format> - <Format> - <Name listURI="urn:xoev-de:xdomea:codeliste:dateiformat" listVersionID="1.0" xsi:type="DateiformatCodeType"> - <code xmlns="">018</code> - <name xmlns="">pdf-Portable Document Format</name> - </Name> - <Version>0.0</Version> - <Primaerdokument> - <Dateiname>06d36643-2883-4b74-9231-8dc7f2693af2_Zusammenfassung-01f903b0-c61e-429d-807f-5011d180c073.pdf</Dateiname> - </Primaerdokument> - </Format> - </Version> - </Dokument> - </Hauptobjekt> - <ExternerGeschaeftsgang> - <Identifikation> - <ID>3ecc7e49-5dc2-499a-9be8-ce8b9d8c8714</ID> - </Identifikation> - <Beteiligungsschritt> - <Nummer>1</Nummer> - <Status listURI="urn:xoev-de:xdomea:codeliste:beteiligungsstatus" listVersionID="1.0"> - <code xmlns="">001</code> - <name xmlns="">Der Schritt liegt in der Zukunft.</name> - </Status> - <Verfuegung> - <Ersteller> - <Behoerdenkennung> - <Kennung listURI="" listVersionID=""> - <code xmlns="">010200200000</code> - </Kennung> - <Praefix listURI="" listVersionID=""> - <code xmlns="">gad</code> - </Praefix> - </Behoerdenkennung> - </Ersteller> - <Adressat> - <Behoerdenkennung> - <Kennung listURI="" listVersionID=""> - <code xmlns="">dev-environment@ozg-cloud.de</code> - </Kennung> - <Praefix listURI="" listVersionID=""> - <code xmlns="">gae</code> - </Praefix> - </Behoerdenkennung> - </Adressat> - <Erstellungsdatum>2024-04-24</Erstellungsdatum> - <Erstellungsuhrzeit>16:32:54</Erstellungsuhrzeit> - </Verfuegung> - </Beteiligungsschritt> - </ExternerGeschaeftsgang> - <Anlage> - <Dokument> - <Identifikation> - <ID>1d8ca22a-9d20-4507-aa5e-b764bb5642f0</ID> - </Identifikation> - <Typ>Anlage</Typ> - <Version> - <Nummer>1</Nummer> - <Format> - <Name listURI="urn:xoev-de:xdomea:codeliste:dateiformat" listVersionID="1.0" xsi:type="DateiformatCodeType"> - <code xmlns="">019</code> - <name xmlns="">png-Portable Network Graphics</name> - </Name> - <Version>0.0</Version> - <Primaerdokument> - <Dateiname>1d8ca22a-9d20-4507-aa5e-b764bb5642f0_Admin.png</Dateiname> - </Primaerdokument> - </Format> - </Version> - </Dokument> - </Anlage> -</Geschaeftsgang.Geschaeftsgang.0201> diff --git a/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/dfoerdermittel_without_anlage/269562a3-9142-45b8-9bd2-db840b8322bf_Fachnachricht.xml b/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/dfoerdermittel_without_anlage/269562a3-9142-45b8-9bd2-db840b8322bf_Fachnachricht.xml deleted file mode 100644 index 618c4813e1803a0619c68920505c9ee7cb303b12..0000000000000000000000000000000000000000 --- a/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/dfoerdermittel_without_anlage/269562a3-9142-45b8-9bd2-db840b8322bf_Fachnachricht.xml +++ /dev/null @@ -1,32 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<application xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.dataport.de/dFAD/ApplicationDataMessageSchema"> - <ApplicationFormId>08db3c1c-db1f-4d27-8dec-73af167e87f2</ApplicationFormId> - <Timestamp>2023-04-18T11:40:24.9940624+02:00</Timestamp> - <ApplicationDataMessageVersion>1</ApplicationDataMessageVersion> - <Title>Testantrag XML-Fachnachricht-Erweiterung</Title> - <ProjectName>XML-Fachnachricht-Erweiterung</ProjectName> - <ProjectTitle>XML-Fachnachricht-Erweiterung</ProjectTitle> - <TransmittedApplicationId>7AtSMHpx3LfJp4</TransmittedApplicationId> - <InboxReference>sh/sh/4dd01647-b9d9-4775-1b50-08da3d83800a</InboxReference> - <MetaText1>9795669</MetaText1> - <Pages> - <Page> - <Title>Beispiel Seite 1</Title> - <Navigation>Beispiel Seite 1</Navigation> - <Controls> - <Control> - <RadioButtonGroup> - <Label>Beispiel-Steuerelement</Label> - <Alias>beispiel-element</Alias> - <SelectedItems> - <SelectedItem> - <Label>Beispielwert 2</Label> - <Value>bsp-2</Value> - </SelectedItem> - </SelectedItems> - </RadioButtonGroup> - </Control> - </Controls> - </Page> - </Pages> -</application> \ No newline at end of file diff --git a/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/dfoerdermittel_without_anlage/c2170d27-7a58-4d94-afdf-62c89b9e1557_Zusammenfassung.pdf b/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/dfoerdermittel_without_anlage/c2170d27-7a58-4d94-afdf-62c89b9e1557_Zusammenfassung.pdf deleted file mode 100644 index 7b21e652f0decdd019673853696d5ea448f44643..0000000000000000000000000000000000000000 Binary files a/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/dfoerdermittel_without_anlage/c2170d27-7a58-4d94-afdf-62c89b9e1557_Zusammenfassung.pdf and /dev/null differ diff --git a/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/dfoerdermittel_without_anlage/d5be7468-e620-4126-a40e-61a7f9b46345_Geschaeftsgang.Geschaeftsgang.0201.xml b/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/dfoerdermittel_without_anlage/d5be7468-e620-4126-a40e-61a7f9b46345_Geschaeftsgang.Geschaeftsgang.0201.xml deleted file mode 100644 index 7f6df652f0ab5a5338b3e97fc3daff00bcb41a8d..0000000000000000000000000000000000000000 --- a/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/dfoerdermittel_without_anlage/d5be7468-e620-4126-a40e-61a7f9b46345_Geschaeftsgang.Geschaeftsgang.0201.xml +++ /dev/null @@ -1,111 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<Geschaeftsgang.Geschaeftsgang.0201 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="urn:xoev-de:xdomea:schema:2.4.0 xdomea-Nachrichten-VBS.xsd" - xmlns="urn:xoev-de:xdomea:schema:2.4.0"> - <Kopf> - <ProzessID>d5be7468-e620-4126-a40e-61a7f9b46345</ProzessID> - <Nachrichtentyp listURI="urn:xoev-de:xdomea:codeliste:nachrichtentyp" listVersionID="1.0"> - <code xmlns="">0201</code> - </Nachrichtentyp> - <Erstellungszeitpunkt>2023-04-04T06:59:15.4231885+02:00</Erstellungszeitpunkt> - <Absender> - <Behoerdenkennung> - <Kennung listURI="" listVersionID=""> - <code xmlns="">010100200000</code> - </Kennung> - <Praefix listURI="" listVersionID=""> - <code xmlns="">gad</code> - </Praefix> - </Behoerdenkennung> - </Absender> - <Empfaenger> - <Behoerdenkennung> - <Kennung listURI="" listVersionID=""> - <code xmlns="">noreply@ozg-sh.de</code> - </Kennung> - <Praefix listURI="" listVersionID=""> - <code xmlns="">gae</code> - </Praefix> - </Behoerdenkennung> - </Empfaenger> - <SendendesSystem> - <InstanzID>DE_dFoerdermittelantrag</InstanzID> - <Produktname>dFoerdermittelantrag</Produktname> - <Version>1.0.1.0</Version> - </SendendesSystem> - <EmpfangsbestaetigungAnInitiator>false</EmpfangsbestaetigungAnInitiator> - <EmpfangsbestaetigungAnVorgaenger>false</EmpfangsbestaetigungAnVorgaenger> - </Kopf> - <Hauptobjekt> - <Dokument> - <Identifikation> - <ID>be180ad4-da79-4de2-99b9-86aac2ca7c32</ID> - </Identifikation> - <AllgemeineMetadaten> - <Betreff>OZG-Cloud XTA-Test</Betreff> - <Kennzeichen>08db344b-0302-478e-8bc2-37edeb652460</Kennzeichen> - </AllgemeineMetadaten> - <Version> - <Nummer>1</Nummer> - <Format> - <Name listURI="urn:xoev-de:xdomea:codeliste:dateiformat" listVersionID="1.0" - xsi:type="DateiformatCodeType"> - <code xmlns="">030</code> - <name xmlns="">xml-eXtensible Markup Language</name> - </Name> - <Version>0.0</Version> - <Primaerdokument> - <Dateiname>269562a3-9142-45b8-9bd2-db840b8322bf_Fachnachricht.xml</Dateiname> - </Primaerdokument> - </Format> - <Format> - <Name listURI="urn:xoev-de:xdomea:codeliste:dateiformat" listVersionID="1.0" - xsi:type="DateiformatCodeType"> - <code xmlns="">018</code> - <name xmlns="">pdf-Portable Document Format</name> - </Name> - <Version>0.0</Version> - <Primaerdokument> - <Dateiname>c2170d27-7a58-4d94-afdf-62c89b9e1557_Zusammenfassung.pdf</Dateiname> - </Primaerdokument> - </Format> - </Version> - </Dokument> - </Hauptobjekt> - <ExternerGeschaeftsgang> - <Identifikation> - <ID>269562a3-9142-45b8-9bd2-db840b8322bf</ID> - </Identifikation> - <Beteiligungsschritt> - <Nummer>1</Nummer> - <Status listURI="urn:xoev-de:xdomea:codeliste:beteiligungsstatus" listVersionID="1.0"> - <code xmlns="">001</code> - <name xmlns="">Der Schritt liegt in der Zukunft.</name> - </Status> - <Verfuegung> - <Ersteller> - <Behoerdenkennung> - <Kennung listURI="" listVersionID=""> - <code xmlns="">010100200000</code> - </Kennung> - <Praefix listURI="" listVersionID=""> - <code xmlns="">gad</code> - </Praefix> - </Behoerdenkennung> - </Ersteller> - <Adressat> - <Behoerdenkennung> - <Kennung listURI="" listVersionID=""> - <code xmlns="">noreply@ozg-sh.de</code> - </Kennung> - <Praefix listURI="" listVersionID=""> - <code xmlns="">gae</code> - </Praefix> - </Behoerdenkennung> - </Adressat> - <Erstellungsdatum>2023-04-04</Erstellungsdatum> - <Erstellungsuhrzeit>06:59:15</Erstellungsuhrzeit> - </Verfuegung> - </Beteiligungsschritt> - </ExternerGeschaeftsgang> -</Geschaeftsgang.Geschaeftsgang.0201> diff --git a/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/mantelantrag_with_anlage/03d5bd15-2c1a-4c50-809c-0efcb21f610f_Antrag_Max_Mustermann_SGBIX.pdf b/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/mantelantrag_with_anlage/03d5bd15-2c1a-4c50-809c-0efcb21f610f_Antrag_Max_Mustermann_SGBIX.pdf deleted file mode 100644 index 5b07b65f3a5355f3dc096a260129c5e9aaa0881e..0000000000000000000000000000000000000000 Binary files a/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/mantelantrag_with_anlage/03d5bd15-2c1a-4c50-809c-0efcb21f610f_Antrag_Max_Mustermann_SGBIX.pdf and /dev/null differ diff --git a/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/mantelantrag_with_anlage/1d8ca22a-9d20-4507-aa5e-b764bb5642f0_Admin.png b/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/mantelantrag_with_anlage/1d8ca22a-9d20-4507-aa5e-b764bb5642f0_Admin.png deleted file mode 100644 index 9ec0d7a08d0be142997505dd5b6d13015054d5d5..0000000000000000000000000000000000000000 Binary files a/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/mantelantrag_with_anlage/1d8ca22a-9d20-4507-aa5e-b764bb5642f0_Admin.png and /dev/null differ diff --git a/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/mantelantrag_with_anlage/6082c5f7-61ab-4746-a482-0a400cc0301a_Antrag_Max_Mustermann_SGBIX.xml b/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/mantelantrag_with_anlage/6082c5f7-61ab-4746-a482-0a400cc0301a_Antrag_Max_Mustermann_SGBIX.xml deleted file mode 100644 index 5d7032ca91a377658636d62a14f0c64f06bf9151..0000000000000000000000000000000000000000 --- a/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/mantelantrag_with_anlage/6082c5f7-61ab-4746-a482-0a400cc0301a_Antrag_Max_Mustermann_SGBIX.xml +++ /dev/null @@ -1,229 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<myForm xmlns:t="http://xmlns.cit.de/intelliform/transaction" - t:uuid="1d4a1b9b-b456-4d76-becb-eff301665993" t:id="20240404370530710707" t:timestamp="2024-04-04T08:17:33.211Z" - t:sender="test.afm.schleswig-holstein.de" - t:form="Antrag auf Leistungen der Eingliederungshilfe und/oder Sozialhilfe" - t:form-id="maa_mantelantrag/maa_mantelantrag" t:customer="Schleswig-Holstein" t:customer-id="sh" - t:client="Schleswig-Holstein" t:client-id="land" t:lang="de" t:vollstaendigkeit="true"> - <gebiets_id>9007404</gebiets_id> - <egh_sgb9>true</egh_sgb9> - <bes_wohnform>false</bes_wohnform> - <hzl>false</hzl> - <grusi>false</grusi> - <hzg>false</hzg> - <hzp>false</hzp> - <hzuebss>false</hzuebss> - <hial>false</hial> - <ambulant>false</ambulant> - <stationaer>false</stationaer> - <sessionid>4cb66bdd-ad27-41c6-8f4b-fc7f023970ad</sessionid> - <anliegen_id>[8969232]</anliegen_id> - <anliegen_namen>[Eingliederungshilfe]</anliegen_namen> - <TypenIDLN>233034601</TypenIDLN> - <logopath1>https://include-sh-schul.zfinder.de/IWFileLoader?tsaid_mediaUUID=21734555-12d6-47aa-bd2e-5794634c592c - </logopath1> - <logopath2/> - <logopath3/> - <gebiet_typid>300004</gebiet_typid> - <gebiet_parent_id1>9006398</gebiet_parent_id1> - <gebiet_parent_typid1>300003</gebiet_parent_typid1> - <gebiet_parent_id2>9006398</gebiet_parent_id2> - <gebiet_parent_typid2>300003</gebiet_parent_typid2> - <gebiet_parent_id3>9006398</gebiet_parent_id3> - <gebiet_parent_typid3>300003</gebiet_parent_typid3> - <gebiet_parent_name3>Segeberg</gebiet_parent_name3> - <oeid>[266237176]</oeid> - <link_datenschutz>https://dse.segeberg.de/pdf/50_30_001.pdf</link_datenschutz> - <link_datenschutz2/> - <link_datenschutz3/> - <link_bankgeheimnis> - https://test.afm.schleswig-holstein.de/intelliform/templates/land/default/default/maa_mantelantrag/Erklaerung_Befreiung_vom_Bankgeheimnis.pdf - </link_bankgeheimnis> - <link_grundsicherung> - https://test.afm.schleswig-holstein.de/intelliform/templates/land/default/default/maa_mantelantrag/Anlage_Erklaerung_zur_Zahlung_von_Grundsicherungsleistungen_an_Leistungserbringer.pdf - </link_grundsicherung> - <link_schweigepflicht> - https://test.afm.schleswig-holstein.de/intelliform/templates/land/default/default/maa_mantelantrag/Schweigepflichtentbindung.pdf - </link_schweigepflicht> - <link_abtretung> - https://test.afm.schleswig-holstein.de/intelliform/templates/land/default/default/maa_mantelantrag/Anlage_Einverstaendniserklaerung_und_Abtretung.pdf - </link_abtretung> - <link_wahrheit> - https://test.afm.schleswig-holstein.de/intelliform/templates/land/default/default/maa_mantelantrag/Erklaerung_der_antragstellenden_Person.pdf - </link_wahrheit> - <kontaktsystem_oeid>9795669</kontaktsystem_oeid> - <OrganisationseinheitenBEZEICHNUNG>Kreis Segeberg - Eingliederungshilfe für Minderjährige - </OrganisationseinheitenBEZEICHNUNG> - <zust_strasse>Hamburger Straße</zust_strasse> - <zust_hausnummer>30</zust_hausnummer> - <zust_postleitzahl>23795</zust_postleitzahl> - <ortid>9007404</ortid> - <zust_ort>Bad Segeberg</zust_ort> - <zust_telefonnummer/> - <zust_faxnummer/> - <zust_emailadresse>Eingliederungshilfe-Minderjaehrige@segeberg.de</zust_emailadresse> - <zustellung_nachrichtenbroker>afmsh:010600000000_Online-Dienste</zustellung_nachrichtenbroker> - <zustellung_email_ln/> - <zustellung_webservice/> - <kontaktsystem_oeid2/> - <OrganisationseinheitenBEZEICHNUNG2/> - <zust_strasse2/> - <zust_hausnummer2/> - <zust_postleitzahl2/> - <ortid2/> - <zust_ort2/> - <zust_telefonnummer2/> - <zust_faxnummer2/> - <zust_emailadresse2/> - <zustellung_nachrichtenbroker2/> - <zustellung_email_ln2/> - <zustellung_webservice2/> - <kontaktsystem_oeid3/> - <OrganisationseinheitenBEZEICHNUNG3/> - <zust_strasse3/> - <zust_hausnummer3/> - <zust_postleitzahl3/> - <ortid3/> - <zust_ort3/> - <zust_telefonnummer3/> - <zust_faxnummer3/> - <zust_emailadresse3/> - <zustellung_nachrichtenbroker3/> - <zustellung_email_ln3/> - <zustellung_webservice3/> - <grund>Hilfe</grund> - <a_grund_bescheinigung>false</a_grund_bescheinigung> - <nur_egh>true</nur_egh> - <nur_blindenhilfe>false</nur_blindenhilfe> - <nur_pers_angaben>false</nur_pers_angaben> - <nur_pers_mehrbedarfe>false</nur_pers_mehrbedarfe> - <antragsteller> - <anrede/> - <titel/> - <pers_nachname>Mustermann</pers_nachname> - <geburtsname/> - <pers_vorname>Max</pers_vorname> - <geburtsdatum>2000-04-05</geburtsdatum> - <geburtsort/> - <sh_strasse>Musterstrasse</sh_strasse> - <sh_hausnummer>12</sh_hausnummer> - <adresszusatz/> - <sh_plz>12345</sh_plz> - <ort>Bad Segeberg</ort> - <kont_email/> - <telefon/> - <mobiltelefon/> - <familienstand>ledig</familienstand> - <deutsch>deutsch</deutsch> - <a_ausweisdokument>false</a_ausweisdokument> - <erwerb/> - <erwerbsunfaehig/> - <betreuer>false</betreuer> - <partner>false</partner> - <kont_telefonnummer/> - </antragsteller> - <angaben_antragsteller> - <sozialhilfe_p>Nein</sozialhilfe_p> - <eingliederungshilfe>Nein</eingliederungshilfe> - <leistungen>Nein</leistungen> - <rentenantrag>Nein</rentenantrag> - <sozialversicherungsnummer/> - <rentenbeitraege/> - <auslandserwerb/> - <lebensunterhalt>Arbeit</lebensunterhalt> - <zuzug>false</zuzug> - <pflege_noetig/> - <ansprueche_dritte>false</ansprueche_dritte> - <stoerung_vorhanden>false</stoerung_vorhanden> - <sozialhilfe>Nein</sozialhilfe> - </angaben_antragsteller> - <weitere_personen>false</weitere_personen> - <fin_antragsteller> - <groesse_wohnung unit="m2"/> - <untervermietet_wohnung unit="m2"/> - <raeume/> - <baujahr/> - <wohnung_kosten unit="Euro"/> - <betriebskosten unit="Euro"/> - <heizkosten unit="Euro"/> - <heizart/> - <a_mietvertrag>false</a_mietvertrag> - <pauschalmiete unit="Euro"/> - <warmwasser/> - <miete_vermieter/> - <wohngeld/> - </fin_antragsteller> - <wohnart>Mietwohnung</wohnart> - <ver> - <ver-item> - <name_id>a</name_id> - <versicherung_vorhanden>false</versicherung_vorhanden> - <name>Max Mustermann</name> - <fruehere_kv_vorhanden/> - <frueherer_erwerb_v/> - <bedarf_hzg/> - <kuenftige_kv/> - </ver-item> - </ver> - <werkstatt/> - <leistungen_bezogen>false</leistungen_bezogen> - <einkommen_antragsteller> - <lgh_hzl_bg/> - <nselbststaendig_vorhanden>false</nselbststaendig_vorhanden> - <gewerbe_vorhanden>false</gewerbe_vorhanden> - <landwirtschaft_vorhanden>false</landwirtschaft_vorhanden> - <vermietung_vorhanden>false</vermietung_vorhanden> - <kapital_vorhanden>false</kapital_vorhanden> - <krankenkasse_vorhanden>false</krankenkasse_vorhanden> - <pflegekasse_vorhanden>false</pflegekasse_vorhanden> - <alg_vorhanden>false</alg_vorhanden> - <leistungen_afa_vorhanden>false</leistungen_afa_vorhanden> - <wohngeld_vorhanden>false</wohngeld_vorhanden> - <kindergeld_vorhanden>false</kindergeld_vorhanden> - <elterngeld_vorhanden>false</elterngeld_vorhanden> - <rente_inland_vorhanden>false</rente_inland_vorhanden> - <rente_ausland_vorhanden>false</rente_ausland_vorhanden> - <rente_sonstige_vorhanden>false</rente_sonstige_vorhanden> - <unterhalt_vorhanden>false</unterhalt_vorhanden> - <blindengeld_vorhanden>false</blindengeld_vorhanden> - <sonstiges_vorhanden>false</sonstiges_vorhanden> - <einkommen_gepfaendet>false</einkommen_gepfaendet> - <einkommen_vorhanden>false</einkommen_vorhanden> - </einkommen_antragsteller> - <vermoegen> - <vermoegen-item> - <name_id>a</name_id> - <bargeld_vorhanden>false</bargeld_vorhanden> - <konto_vorhanden>false</konto_vorhanden> - <sparguthaben_vorhanden>false</sparguthaben_vorhanden> - <altersvorsorge_vorhanden>false</altersvorsorge_vorhanden> - <bausparvertraege_vorhanden>false</bausparvertraege_vorhanden> - <aktien_vorhanden>false</aktien_vorhanden> - <paypal_vorhanden>false</paypal_vorhanden> - <lebensversicherung_vorhanden>false</lebensversicherung_vorhanden> - <kfz_vorhanden>false</kfz_vorhanden> - <sachwerte_vorhanden>false</sachwerte_vorhanden> - <haus_vorhanden>false</haus_vorhanden> - <hypotheken_vorhanden>false</hypotheken_vorhanden> - <erbschaft_vorhanden>false</erbschaft_vorhanden> - <sonstiges_vorhanden>false</sonstiges_vorhanden> - <veraeusserung_vermoegen>false</veraeusserung_vermoegen> - <vermoegen_vorhanden>false</vermoegen_vorhanden> - <name>Max Mustermann</name> - </vermoegen-item> - </vermoegen> - <datenerhebung>true</datenerhebung> - <vollstaendigkeit>true</vollstaendigkeit> - <a_befreiung_bankgeheimnis>false</a_befreiung_bankgeheimnis> - <a_entbindung_schweigepflicht>false</a_entbindung_schweigepflicht> - <name_bank/> - <iban/> - <kontoinhaber/> - <name_pdf>Antrag_Max_Mustermann_SGBIX</name_pdf> - <postfachnachicht>Sehr geehrte/r Antragsteller*in,<br/><br/>Ihr Antrag wurde erfolgreich übermittelt.<br/><br/>Bitte - denken Sie daran, zur Vervollständigung Ihres Antrages die unterschriebenen Dokumente und erforderlichen - Nachweise einzureichen.<br/><br/>Die Bearbeitung Ihres Antrages ist erst nach Vorlage aller - erforderlichen Dokumente und Nachweise möglich.<br/><br/><br/>Mit freundlichen Grüßen<br/><br/>Kreis - Segeberg - Eingliederungshilfe für Minderjährige<br/>Hamburger Straße 30<br/>23795 Bad Segeberg - </postfachnachicht> -</myForm> diff --git a/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/mantelantrag_with_anlage/9f1b47d4-d6bf-4ec4-b0ff-1e30bee42ef2_Geschaeftsgang.Geschaeftsgang.0201.xml b/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/mantelantrag_with_anlage/9f1b47d4-d6bf-4ec4-b0ff-1e30bee42ef2_Geschaeftsgang.Geschaeftsgang.0201.xml deleted file mode 100644 index add2a33b3c40f57a558fc497e288a42d45c6648f..0000000000000000000000000000000000000000 --- a/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/mantelantrag_with_anlage/9f1b47d4-d6bf-4ec4-b0ff-1e30bee42ef2_Geschaeftsgang.Geschaeftsgang.0201.xml +++ /dev/null @@ -1,123 +0,0 @@ -<?xml version="1.0"?> -<xdomea:Geschaeftsgang.Geschaeftsgang.0201 xmlns:xdomea="http://www.xdomea.de/V2.0.1"> - <xdomea:Kopf> - <xdomea:ProzessID>9f1b47d4-d6bf-4ec4-b0ff-1e30bee42ef2</xdomea:ProzessID> - <xdomea:Nachrichtentyp codeName="Geschaeftsgang.Geschaeftsgang.0201" - codelistAgencyName="AG XDOMEA des KoopA ADV" codelistVersionIdentifier="2.0.0" - languageCode="de" codelistName="Nachrichtentyp">0201 - </xdomea:Nachrichtentyp> - <xdomea:Erstellungszeitpunkt>2024-04-04T10:24:07.468+02:00</xdomea:Erstellungszeitpunkt> - <xdomea:Absender> - <xdomea:Behoerdenkennung> - <xdomea:Kennung codeName="WebMethod_Online-Dienste">WebMethod_Online-Dienste</xdomea:Kennung> - <xdomea:Praefix codeName="afmsh:">afmsh:</xdomea:Praefix> - </xdomea:Behoerdenkennung> - <xdomea:Institution> - <xdomea:Name>Schleswig-Holstein</xdomea:Name> - <xdomea:Kurzbezeichnung>Schleswig-Holstein</xdomea:Kurzbezeichnung> - </xdomea:Institution> - </xdomea:Absender> - <xdomea:Empfaenger> - <xdomea:Behoerdenkennung> - <xdomea:Kennung codeName="ozg-cloud-dev001">ozg-cloud-dev001</xdomea:Kennung> - <xdomea:Praefix codeName="afmsh:">afmsh:</xdomea:Praefix> - </xdomea:Behoerdenkennung> - </xdomea:Empfaenger> - <xdomea:SendendesSystem> - <xdomea:InstanzID>AFMSH.MSR</xdomea:InstanzID> - <xdomea:Produktname>MSR</xdomea:Produktname> - <xdomea:Version>10.5</xdomea:Version> - </xdomea:SendendesSystem> - <xdomea:EmpfangsbestaetigungAnInitiator>false</xdomea:EmpfangsbestaetigungAnInitiator> - <xdomea:EmpfangsbestaetigungAnVorgaenger>false</xdomea:EmpfangsbestaetigungAnVorgaenger> - </xdomea:Kopf> - <xdomea:Hauptobjekt> - <xdomea:Dokument> - <xdomea:Identifikation> - <xdomea:ID>9bae73b1-2ef3-480b-8acc-8bcd9979a788</xdomea:ID> - </xdomea:Identifikation> - <xdomea:AllgemeineMetadaten> - <xdomea:Betreff>Antrag auf Leistungen der Eingliederungshilfe und/oder Sozialhilfe</xdomea:Betreff> - <xdomea:Kennzeichen>20240404370530710707</xdomea:Kennzeichen> - </xdomea:AllgemeineMetadaten> - <xdomea:Posteingangsdatum>2024-04-04</xdomea:Posteingangsdatum> - <xdomea:Typ>maa_mantelantrag/maa_mantelantrag</xdomea:Typ> - <xdomea:Version> - <xdomea:Nummer>0.0</xdomea:Nummer> - <xdomea:Format> - <xdomea:Name codeName="xml - eXtensible Markup Language" - codelistAgencyName="AG XDOMEA des KoopA ADV" codelistVersionIdentifier="2.0.0" - languageCode="de" codelistName="Dateiformat">030 - </xdomea:Name> - <xdomea:Version>0.0</xdomea:Version> - <xdomea:Primaerdokument> - <xdomea:Dateiname>6082c5f7-61ab-4746-a482-0a400cc0301a_Antrag_Max_Mustermann_SGBIX.xml - </xdomea:Dateiname> - </xdomea:Primaerdokument> - </xdomea:Format> - </xdomea:Version> - <xdomea:Version> - <xdomea:Nummer>0.0</xdomea:Nummer> - <xdomea:Format> - <xdomea:Name codeName="pdf - Portable Document Format" codelistAgencyName="AG XDOMEA des KoopA ADV" - codelistVersionIdentifier="2.0.0" languageCode="de" codelistName="Dateiformat">018 - </xdomea:Name> - <xdomea:Version>0.0</xdomea:Version> - <xdomea:Primaerdokument> - <xdomea:Dateiname>03d5bd15-2c1a-4c50-809c-0efcb21f610f_Antrag_Max_Mustermann_SGBIX.pdf - </xdomea:Dateiname> - </xdomea:Primaerdokument> - </xdomea:Format> - </xdomea:Version> - </xdomea:Dokument> - </xdomea:Hauptobjekt> - <xdomea:ExternerGeschaeftsgang> - <xdomea:Identifikation> - <xdomea:ID>8ae49342-8135-4f11-9930-5c4cc55b7ec2</xdomea:ID> - </xdomea:Identifikation> - <xdomea:Beteiligungsschritt> - <xdomea:Nummer>1</xdomea:Nummer> - <xdomea:Status codeName="zukuenftig" codelistAgencyName="AG XDOMEA des KoopA ADV" - codelistVersionIdentifier="2.0.0" languageCode="de" codelistName="Beteiligungsstatus">001 - </xdomea:Status> - <xdomea:Verfuegung> - <xdomea:Ersteller> - <xdomea:Behoerdenkennung> - <xdomea:Kennung codeName="WebMethod_Online-Dienste">WebMethod_Online-Dienste</xdomea:Kennung> - <xdomea:Praefix codeName="afmsh:">afmsh:</xdomea:Praefix> - </xdomea:Behoerdenkennung> - </xdomea:Ersteller> - <xdomea:Adressat> - <xdomea:Behoerdenkennung> - <xdomea:Kennung codeName="ozg-cloud-dev001">ozg-cloud-dev001</xdomea:Kennung> - <xdomea:Praefix codeName="afmsh:">afmsh:</xdomea:Praefix> - </xdomea:Behoerdenkennung> - </xdomea:Adressat> - <xdomea:Erstellungsdatum>2024-04-04</xdomea:Erstellungsdatum> - <xdomea:Erstellungsuhrzeit>10:24:06</xdomea:Erstellungsuhrzeit> - </xdomea:Verfuegung> - </xdomea:Beteiligungsschritt> - </xdomea:ExternerGeschaeftsgang> - <xdomea:Anlage> - <xdomea:Dokument> - <xdomea:Identifikation> - <xdomea:ID>1d8ca22a-9d20-4507-aa5e-b764bb5642f0</xdomea:ID> - </xdomea:Identifikation> - <xdomea:Typ>Anlage</xdomea:Typ> - <xdomea:Version> - <xdomea:Nummer>1</xdomea:Nummer> - <xdomea:Format> - <xdomea:Name listURI="urn:xoev-de:xdomea:codeliste:dateiformat" listVersionID="1.0" - xsi:type="DateiformatCodeType"> - <xdomea:code xmlns="">019</xdomea:code> - <xdomea:name xmlns="">png-Portable Network Graphics</xdomea:name> - </xdomea:Name> - <xdomea:Version>0.0</xdomea:Version> - <xdomea:Primaerdokument> - <xdomea:Dateiname>1d8ca22a-9d20-4507-aa5e-b764bb5642f0_Admin.png</xdomea:Dateiname> - </xdomea:Primaerdokument> - </xdomea:Format> - </xdomea:Version> - </xdomea:Dokument> - </xdomea:Anlage> -</xdomea:Geschaeftsgang.Geschaeftsgang.0201> diff --git a/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/mantelantrag_without_anlage/03d5bd15-2c1a-4c50-809c-0efcb21f610f_Antrag_Max_Mustermann_SGBIX.pdf b/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/mantelantrag_without_anlage/03d5bd15-2c1a-4c50-809c-0efcb21f610f_Antrag_Max_Mustermann_SGBIX.pdf deleted file mode 100644 index 5b07b65f3a5355f3dc096a260129c5e9aaa0881e..0000000000000000000000000000000000000000 Binary files a/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/mantelantrag_without_anlage/03d5bd15-2c1a-4c50-809c-0efcb21f610f_Antrag_Max_Mustermann_SGBIX.pdf and /dev/null differ diff --git a/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/mantelantrag_without_anlage/6082c5f7-61ab-4746-a482-0a400cc0301a_Antrag_Max_Mustermann_SGBIX.xml b/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/mantelantrag_without_anlage/6082c5f7-61ab-4746-a482-0a400cc0301a_Antrag_Max_Mustermann_SGBIX.xml deleted file mode 100644 index 5d7032ca91a377658636d62a14f0c64f06bf9151..0000000000000000000000000000000000000000 --- a/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/mantelantrag_without_anlage/6082c5f7-61ab-4746-a482-0a400cc0301a_Antrag_Max_Mustermann_SGBIX.xml +++ /dev/null @@ -1,229 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<myForm xmlns:t="http://xmlns.cit.de/intelliform/transaction" - t:uuid="1d4a1b9b-b456-4d76-becb-eff301665993" t:id="20240404370530710707" t:timestamp="2024-04-04T08:17:33.211Z" - t:sender="test.afm.schleswig-holstein.de" - t:form="Antrag auf Leistungen der Eingliederungshilfe und/oder Sozialhilfe" - t:form-id="maa_mantelantrag/maa_mantelantrag" t:customer="Schleswig-Holstein" t:customer-id="sh" - t:client="Schleswig-Holstein" t:client-id="land" t:lang="de" t:vollstaendigkeit="true"> - <gebiets_id>9007404</gebiets_id> - <egh_sgb9>true</egh_sgb9> - <bes_wohnform>false</bes_wohnform> - <hzl>false</hzl> - <grusi>false</grusi> - <hzg>false</hzg> - <hzp>false</hzp> - <hzuebss>false</hzuebss> - <hial>false</hial> - <ambulant>false</ambulant> - <stationaer>false</stationaer> - <sessionid>4cb66bdd-ad27-41c6-8f4b-fc7f023970ad</sessionid> - <anliegen_id>[8969232]</anliegen_id> - <anliegen_namen>[Eingliederungshilfe]</anliegen_namen> - <TypenIDLN>233034601</TypenIDLN> - <logopath1>https://include-sh-schul.zfinder.de/IWFileLoader?tsaid_mediaUUID=21734555-12d6-47aa-bd2e-5794634c592c - </logopath1> - <logopath2/> - <logopath3/> - <gebiet_typid>300004</gebiet_typid> - <gebiet_parent_id1>9006398</gebiet_parent_id1> - <gebiet_parent_typid1>300003</gebiet_parent_typid1> - <gebiet_parent_id2>9006398</gebiet_parent_id2> - <gebiet_parent_typid2>300003</gebiet_parent_typid2> - <gebiet_parent_id3>9006398</gebiet_parent_id3> - <gebiet_parent_typid3>300003</gebiet_parent_typid3> - <gebiet_parent_name3>Segeberg</gebiet_parent_name3> - <oeid>[266237176]</oeid> - <link_datenschutz>https://dse.segeberg.de/pdf/50_30_001.pdf</link_datenschutz> - <link_datenschutz2/> - <link_datenschutz3/> - <link_bankgeheimnis> - https://test.afm.schleswig-holstein.de/intelliform/templates/land/default/default/maa_mantelantrag/Erklaerung_Befreiung_vom_Bankgeheimnis.pdf - </link_bankgeheimnis> - <link_grundsicherung> - https://test.afm.schleswig-holstein.de/intelliform/templates/land/default/default/maa_mantelantrag/Anlage_Erklaerung_zur_Zahlung_von_Grundsicherungsleistungen_an_Leistungserbringer.pdf - </link_grundsicherung> - <link_schweigepflicht> - https://test.afm.schleswig-holstein.de/intelliform/templates/land/default/default/maa_mantelantrag/Schweigepflichtentbindung.pdf - </link_schweigepflicht> - <link_abtretung> - https://test.afm.schleswig-holstein.de/intelliform/templates/land/default/default/maa_mantelantrag/Anlage_Einverstaendniserklaerung_und_Abtretung.pdf - </link_abtretung> - <link_wahrheit> - https://test.afm.schleswig-holstein.de/intelliform/templates/land/default/default/maa_mantelantrag/Erklaerung_der_antragstellenden_Person.pdf - </link_wahrheit> - <kontaktsystem_oeid>9795669</kontaktsystem_oeid> - <OrganisationseinheitenBEZEICHNUNG>Kreis Segeberg - Eingliederungshilfe für Minderjährige - </OrganisationseinheitenBEZEICHNUNG> - <zust_strasse>Hamburger Straße</zust_strasse> - <zust_hausnummer>30</zust_hausnummer> - <zust_postleitzahl>23795</zust_postleitzahl> - <ortid>9007404</ortid> - <zust_ort>Bad Segeberg</zust_ort> - <zust_telefonnummer/> - <zust_faxnummer/> - <zust_emailadresse>Eingliederungshilfe-Minderjaehrige@segeberg.de</zust_emailadresse> - <zustellung_nachrichtenbroker>afmsh:010600000000_Online-Dienste</zustellung_nachrichtenbroker> - <zustellung_email_ln/> - <zustellung_webservice/> - <kontaktsystem_oeid2/> - <OrganisationseinheitenBEZEICHNUNG2/> - <zust_strasse2/> - <zust_hausnummer2/> - <zust_postleitzahl2/> - <ortid2/> - <zust_ort2/> - <zust_telefonnummer2/> - <zust_faxnummer2/> - <zust_emailadresse2/> - <zustellung_nachrichtenbroker2/> - <zustellung_email_ln2/> - <zustellung_webservice2/> - <kontaktsystem_oeid3/> - <OrganisationseinheitenBEZEICHNUNG3/> - <zust_strasse3/> - <zust_hausnummer3/> - <zust_postleitzahl3/> - <ortid3/> - <zust_ort3/> - <zust_telefonnummer3/> - <zust_faxnummer3/> - <zust_emailadresse3/> - <zustellung_nachrichtenbroker3/> - <zustellung_email_ln3/> - <zustellung_webservice3/> - <grund>Hilfe</grund> - <a_grund_bescheinigung>false</a_grund_bescheinigung> - <nur_egh>true</nur_egh> - <nur_blindenhilfe>false</nur_blindenhilfe> - <nur_pers_angaben>false</nur_pers_angaben> - <nur_pers_mehrbedarfe>false</nur_pers_mehrbedarfe> - <antragsteller> - <anrede/> - <titel/> - <pers_nachname>Mustermann</pers_nachname> - <geburtsname/> - <pers_vorname>Max</pers_vorname> - <geburtsdatum>2000-04-05</geburtsdatum> - <geburtsort/> - <sh_strasse>Musterstrasse</sh_strasse> - <sh_hausnummer>12</sh_hausnummer> - <adresszusatz/> - <sh_plz>12345</sh_plz> - <ort>Bad Segeberg</ort> - <kont_email/> - <telefon/> - <mobiltelefon/> - <familienstand>ledig</familienstand> - <deutsch>deutsch</deutsch> - <a_ausweisdokument>false</a_ausweisdokument> - <erwerb/> - <erwerbsunfaehig/> - <betreuer>false</betreuer> - <partner>false</partner> - <kont_telefonnummer/> - </antragsteller> - <angaben_antragsteller> - <sozialhilfe_p>Nein</sozialhilfe_p> - <eingliederungshilfe>Nein</eingliederungshilfe> - <leistungen>Nein</leistungen> - <rentenantrag>Nein</rentenantrag> - <sozialversicherungsnummer/> - <rentenbeitraege/> - <auslandserwerb/> - <lebensunterhalt>Arbeit</lebensunterhalt> - <zuzug>false</zuzug> - <pflege_noetig/> - <ansprueche_dritte>false</ansprueche_dritte> - <stoerung_vorhanden>false</stoerung_vorhanden> - <sozialhilfe>Nein</sozialhilfe> - </angaben_antragsteller> - <weitere_personen>false</weitere_personen> - <fin_antragsteller> - <groesse_wohnung unit="m2"/> - <untervermietet_wohnung unit="m2"/> - <raeume/> - <baujahr/> - <wohnung_kosten unit="Euro"/> - <betriebskosten unit="Euro"/> - <heizkosten unit="Euro"/> - <heizart/> - <a_mietvertrag>false</a_mietvertrag> - <pauschalmiete unit="Euro"/> - <warmwasser/> - <miete_vermieter/> - <wohngeld/> - </fin_antragsteller> - <wohnart>Mietwohnung</wohnart> - <ver> - <ver-item> - <name_id>a</name_id> - <versicherung_vorhanden>false</versicherung_vorhanden> - <name>Max Mustermann</name> - <fruehere_kv_vorhanden/> - <frueherer_erwerb_v/> - <bedarf_hzg/> - <kuenftige_kv/> - </ver-item> - </ver> - <werkstatt/> - <leistungen_bezogen>false</leistungen_bezogen> - <einkommen_antragsteller> - <lgh_hzl_bg/> - <nselbststaendig_vorhanden>false</nselbststaendig_vorhanden> - <gewerbe_vorhanden>false</gewerbe_vorhanden> - <landwirtschaft_vorhanden>false</landwirtschaft_vorhanden> - <vermietung_vorhanden>false</vermietung_vorhanden> - <kapital_vorhanden>false</kapital_vorhanden> - <krankenkasse_vorhanden>false</krankenkasse_vorhanden> - <pflegekasse_vorhanden>false</pflegekasse_vorhanden> - <alg_vorhanden>false</alg_vorhanden> - <leistungen_afa_vorhanden>false</leistungen_afa_vorhanden> - <wohngeld_vorhanden>false</wohngeld_vorhanden> - <kindergeld_vorhanden>false</kindergeld_vorhanden> - <elterngeld_vorhanden>false</elterngeld_vorhanden> - <rente_inland_vorhanden>false</rente_inland_vorhanden> - <rente_ausland_vorhanden>false</rente_ausland_vorhanden> - <rente_sonstige_vorhanden>false</rente_sonstige_vorhanden> - <unterhalt_vorhanden>false</unterhalt_vorhanden> - <blindengeld_vorhanden>false</blindengeld_vorhanden> - <sonstiges_vorhanden>false</sonstiges_vorhanden> - <einkommen_gepfaendet>false</einkommen_gepfaendet> - <einkommen_vorhanden>false</einkommen_vorhanden> - </einkommen_antragsteller> - <vermoegen> - <vermoegen-item> - <name_id>a</name_id> - <bargeld_vorhanden>false</bargeld_vorhanden> - <konto_vorhanden>false</konto_vorhanden> - <sparguthaben_vorhanden>false</sparguthaben_vorhanden> - <altersvorsorge_vorhanden>false</altersvorsorge_vorhanden> - <bausparvertraege_vorhanden>false</bausparvertraege_vorhanden> - <aktien_vorhanden>false</aktien_vorhanden> - <paypal_vorhanden>false</paypal_vorhanden> - <lebensversicherung_vorhanden>false</lebensversicherung_vorhanden> - <kfz_vorhanden>false</kfz_vorhanden> - <sachwerte_vorhanden>false</sachwerte_vorhanden> - <haus_vorhanden>false</haus_vorhanden> - <hypotheken_vorhanden>false</hypotheken_vorhanden> - <erbschaft_vorhanden>false</erbschaft_vorhanden> - <sonstiges_vorhanden>false</sonstiges_vorhanden> - <veraeusserung_vermoegen>false</veraeusserung_vermoegen> - <vermoegen_vorhanden>false</vermoegen_vorhanden> - <name>Max Mustermann</name> - </vermoegen-item> - </vermoegen> - <datenerhebung>true</datenerhebung> - <vollstaendigkeit>true</vollstaendigkeit> - <a_befreiung_bankgeheimnis>false</a_befreiung_bankgeheimnis> - <a_entbindung_schweigepflicht>false</a_entbindung_schweigepflicht> - <name_bank/> - <iban/> - <kontoinhaber/> - <name_pdf>Antrag_Max_Mustermann_SGBIX</name_pdf> - <postfachnachicht>Sehr geehrte/r Antragsteller*in,<br/><br/>Ihr Antrag wurde erfolgreich übermittelt.<br/><br/>Bitte - denken Sie daran, zur Vervollständigung Ihres Antrages die unterschriebenen Dokumente und erforderlichen - Nachweise einzureichen.<br/><br/>Die Bearbeitung Ihres Antrages ist erst nach Vorlage aller - erforderlichen Dokumente und Nachweise möglich.<br/><br/><br/>Mit freundlichen Grüßen<br/><br/>Kreis - Segeberg - Eingliederungshilfe für Minderjährige<br/>Hamburger Straße 30<br/>23795 Bad Segeberg - </postfachnachicht> -</myForm> diff --git a/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/mantelantrag_without_anlage/9f1b47d4-d6bf-4ec4-b0ff-1e30bee42ef2_Geschaeftsgang.Geschaeftsgang.0201.xml b/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/mantelantrag_without_anlage/9f1b47d4-d6bf-4ec4-b0ff-1e30bee42ef2_Geschaeftsgang.Geschaeftsgang.0201.xml deleted file mode 100644 index 8f742978a9470f48f962da1fa169c0090b8448fe..0000000000000000000000000000000000000000 --- a/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/mantelantrag_without_anlage/9f1b47d4-d6bf-4ec4-b0ff-1e30bee42ef2_Geschaeftsgang.Geschaeftsgang.0201.xml +++ /dev/null @@ -1,101 +0,0 @@ -<?xml version="1.0"?> -<xdomea:Geschaeftsgang.Geschaeftsgang.0201 xmlns:xdomea="http://www.xdomea.de/V2.0.1"> - <xdomea:Kopf> - <xdomea:ProzessID>9f1b47d4-d6bf-4ec4-b0ff-1e30bee42ef2</xdomea:ProzessID> - <xdomea:Nachrichtentyp codeName="Geschaeftsgang.Geschaeftsgang.0201" - codelistAgencyName="AG XDOMEA des KoopA ADV" codelistVersionIdentifier="2.0.0" - languageCode="de" codelistName="Nachrichtentyp">0201 - </xdomea:Nachrichtentyp> - <xdomea:Erstellungszeitpunkt>2024-04-04T10:24:07.468+02:00</xdomea:Erstellungszeitpunkt> - <xdomea:Absender> - <xdomea:Behoerdenkennung> - <xdomea:Kennung codeName="WebMethod_Online-Dienste">WebMethod_Online-Dienste</xdomea:Kennung> - <xdomea:Praefix codeName="afmsh:">afmsh:</xdomea:Praefix> - </xdomea:Behoerdenkennung> - <xdomea:Institution> - <xdomea:Name>Schleswig-Holstein</xdomea:Name> - <xdomea:Kurzbezeichnung>Schleswig-Holstein</xdomea:Kurzbezeichnung> - </xdomea:Institution> - </xdomea:Absender> - <xdomea:Empfaenger> - <xdomea:Behoerdenkennung> - <xdomea:Kennung codeName="ozg-cloud-dev001">ozg-cloud-dev001</xdomea:Kennung> - <xdomea:Praefix codeName="afmsh:">afmsh:</xdomea:Praefix> - </xdomea:Behoerdenkennung> - </xdomea:Empfaenger> - <xdomea:SendendesSystem> - <xdomea:InstanzID>AFMSH.MSR</xdomea:InstanzID> - <xdomea:Produktname>MSR</xdomea:Produktname> - <xdomea:Version>10.5</xdomea:Version> - </xdomea:SendendesSystem> - <xdomea:EmpfangsbestaetigungAnInitiator>false</xdomea:EmpfangsbestaetigungAnInitiator> - <xdomea:EmpfangsbestaetigungAnVorgaenger>false</xdomea:EmpfangsbestaetigungAnVorgaenger> - </xdomea:Kopf> - <xdomea:Hauptobjekt> - <xdomea:Dokument> - <xdomea:Identifikation> - <xdomea:ID>9bae73b1-2ef3-480b-8acc-8bcd9979a788</xdomea:ID> - </xdomea:Identifikation> - <xdomea:AllgemeineMetadaten> - <xdomea:Betreff>Antrag auf Leistungen der Eingliederungshilfe und/oder Sozialhilfe</xdomea:Betreff> - <xdomea:Kennzeichen>20240404370530710707</xdomea:Kennzeichen> - </xdomea:AllgemeineMetadaten> - <xdomea:Posteingangsdatum>2024-04-04</xdomea:Posteingangsdatum> - <xdomea:Typ>maa_mantelantrag/maa_mantelantrag</xdomea:Typ> - <xdomea:Version> - <xdomea:Nummer>0.0</xdomea:Nummer> - <xdomea:Format> - <xdomea:Name codeName="xml - eXtensible Markup Language" - codelistAgencyName="AG XDOMEA des KoopA ADV" codelistVersionIdentifier="2.0.0" - languageCode="de" codelistName="Dateiformat">030 - </xdomea:Name> - <xdomea:Version>0.0</xdomea:Version> - <xdomea:Primaerdokument> - <xdomea:Dateiname>6082c5f7-61ab-4746-a482-0a400cc0301a_Antrag_Max_Mustermann_SGBIX.xml - </xdomea:Dateiname> - </xdomea:Primaerdokument> - </xdomea:Format> - </xdomea:Version> - <xdomea:Version> - <xdomea:Nummer>0.0</xdomea:Nummer> - <xdomea:Format> - <xdomea:Name codeName="pdf - Portable Document Format" codelistAgencyName="AG XDOMEA des KoopA ADV" - codelistVersionIdentifier="2.0.0" languageCode="de" codelistName="Dateiformat">018 - </xdomea:Name> - <xdomea:Version>0.0</xdomea:Version> - <xdomea:Primaerdokument> - <xdomea:Dateiname>03d5bd15-2c1a-4c50-809c-0efcb21f610f_Antrag_Max_Mustermann_SGBIX.pdf - </xdomea:Dateiname> - </xdomea:Primaerdokument> - </xdomea:Format> - </xdomea:Version> - </xdomea:Dokument> - </xdomea:Hauptobjekt> - <xdomea:ExternerGeschaeftsgang> - <xdomea:Identifikation> - <xdomea:ID>8ae49342-8135-4f11-9930-5c4cc55b7ec2</xdomea:ID> - </xdomea:Identifikation> - <xdomea:Beteiligungsschritt> - <xdomea:Nummer>1</xdomea:Nummer> - <xdomea:Status codeName="zukuenftig" codelistAgencyName="AG XDOMEA des KoopA ADV" - codelistVersionIdentifier="2.0.0" languageCode="de" codelistName="Beteiligungsstatus">001 - </xdomea:Status> - <xdomea:Verfuegung> - <xdomea:Ersteller> - <xdomea:Behoerdenkennung> - <xdomea:Kennung codeName="WebMethod_Online-Dienste">WebMethod_Online-Dienste</xdomea:Kennung> - <xdomea:Praefix codeName="afmsh:">afmsh:</xdomea:Praefix> - </xdomea:Behoerdenkennung> - </xdomea:Ersteller> - <xdomea:Adressat> - <xdomea:Behoerdenkennung> - <xdomea:Kennung codeName="ozg-cloud-dev001">ozg-cloud-dev001</xdomea:Kennung> - <xdomea:Praefix codeName="afmsh:">afmsh:</xdomea:Praefix> - </xdomea:Behoerdenkennung> - </xdomea:Adressat> - <xdomea:Erstellungsdatum>2024-04-04</xdomea:Erstellungsdatum> - <xdomea:Erstellungsuhrzeit>10:24:06</xdomea:Erstellungsuhrzeit> - </xdomea:Verfuegung> - </xdomea:Beteiligungsschritt> - </xdomea:ExternerGeschaeftsgang> -</xdomea:Geschaeftsgang.Geschaeftsgang.0201> \ No newline at end of file diff --git a/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/waffenschein/8248e115-4aec-4253-bb2c-9788823ff9b1_XML-Daten.xml b/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/waffenschein/8248e115-4aec-4253-bb2c-9788823ff9b1_XML-Daten.xml deleted file mode 100644 index 4dabcc067d040ad07fda5101e4c6527459b5d53d..0000000000000000000000000000000000000000 --- a/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/waffenschein/8248e115-4aec-4253-bb2c-9788823ff9b1_XML-Daten.xml +++ /dev/null @@ -1,132 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<myForm xmlns:pdf="http://xmlns.cit.de/assistants/pdf" xmlns:t="http://xmlns.cit.de/intelliform/transaction" t:uuid="2b1b5768-e9b4-47f6-859e-c197ef4361a3" t:id="20240321325940124004" t:timestamp="2024-03-21T08:03:14.724Z" t:sender="test.afm.schleswig-holstein.de" t:form="Kleiner Waffenschein NB Test" t:form-id="waffen/kleinerWaffenscheinNB" t:customer="Einheitlicher Ansprechpartner" t:customer-id="ea-sh" t:client="Schleswig-Holstein" t:client-id="land" t:lang="de"> - <KontaktsystemTypA>233034600</KontaktsystemTypA> - <KontaktsystemTypB>233034601</KontaktsystemTypB> - <AnliegenID>8966671</AnliegenID> - <antragsteller> - <pers_anrede>Herr$03</pers_anrede> - <pers_nachname>Max</pers_nachname> - <pers_vorname>Mustermann</pers_vorname> - <pers_geburtsname>Mustermann</pers_geburtsname> - <pers_geburtsdatum>2000-02-15</pers_geburtsdatum> - <pers_geburtsort>Eutin</pers_geburtsort> - <pers_geburtsland>deutsch$Deutschland$000</pers_geburtsland> - <pers_staatsangehoerigkeit>deutsch$Deutschland$000</pers_staatsangehoerigkeit> - <b_anrede>Herr</b_anrede> - <b_anrede_schluesselnr>03</b_anrede_schluesselnr> - <b_geburtsland>Deutschland</b_geburtsland> - <b_geburtsland_signatur>000</b_geburtsland_signatur> - <b_staatsangehoerigkeit>deutsch</b_staatsangehoerigkeit> - <b_staatsangehoerigkeit_signatur>000</b_staatsangehoerigkeit_signatur> - <sh_strasse>Musterstrasse</sh_strasse> - <sh_hausnummer>123</sh_hausnummer> - <sh_plz>23701</sh_plz> - <ort_auswahl>9006885$01055012</ort_auswahl> - <ort>Eutin</ort> - <GebietID>9006885</GebietID> - <GebietBEZEICHNUNG>Eutin</GebietBEZEICHNUNG> - <GebietGNR94_GNR>01055012</GebietGNR94_GNR> - <staat>000</staat> - <iso3166numerisch>276</iso3166numerisch> - <kont_telefonnummer /> - <kont_mobilnummer /> - <kont_telefaxnummer /> - <kont_email /> - <kont_demail /> - <persoenlicheEignung> - <maengelvorhanden>false</maengelvorhanden> - <ermittlungsverfahren>false</ermittlungsverfahren> - <MitgliedschaftInVerboternerVereinigung>false</MitgliedschaftInVerboternerVereinigung> - </persoenlicheEignung> - </antragsteller> - <GebietID>9006885</GebietID> - <zustaendigestelle> - <OrganisationseinheitenAuswahl>279550874</OrganisationseinheitenAuswahl> - <OrganisationseinheitenID>9795669</OrganisationseinheitenID> - <OrganisationseinheitenBEZEICHNUNG>Fachdienst Sicherheit und Ordnung - Kreis Ostholstein</OrganisationseinheitenBEZEICHNUNG> - <strasse>Lübecker Straße</strasse> - <hausnummer>41</hausnummer> - <postleitzahl>23701</postleitzahl> - <ortID>9006885</ortID> - <ort>Eutin</ort> - <telefonnummer>+49 4521 788-0</telefonnummer> - <telefaxnummer>+49 4521 788-292</telefaxnummer> - <emailadresse>sicherheit@kreis-oh.de</emailadresse> - <demailadresse /> - <kontaktsystem_kennung /> - <kontaktsystem_kennungzusatz /> - <AnliegenBEZEICHNUNG>Waffenschein beantragen</AnliegenBEZEICHNUNG> - <leikaKEYLIST>99089122001000</leikaKEYLIST> - <auswahl_zustellung>abholen</auswahl_zustellung> - <b_zustellung>Ich hole den Kleinen Waffenschein selbst ab.</b_zustellung> - </zustaendigestelle> - <empfangendestelle> - <OrganisationseinheitenAuswahl>9068873</OrganisationseinheitenAuswahl> - <OrganisationseinheitenID>9068873</OrganisationseinheitenID> - <OrganisationseinheitenBEZEICHNUNG>Einheitlicher Ansprechpartner Schleswig-Holstein</OrganisationseinheitenBEZEICHNUNG> - <strasse>Deliusstraße</strasse> - <hausnummer>10</hausnummer> - <postleitzahl>24114</postleitzahl> - <ortID>9006402</ortID> - <ort>Kiel</ort> - <telefonnummer>+49 431 530550-0</telefonnummer> - <telefaxnummer>+49 431 530550-99</telefaxnummer> - <emailadresse>info@ea-sh.de</emailadresse> - <demailadresse>ea-poststelle@ea-sh.de-mail.de</demailadresse> - <kontaktsystem_kennung>afmsh:9068873_AusnahmeLKWFahrverbot</kontaktsystem_kennung> - <kontaktsystem_kennungzusatz>alle</kontaktsystem_kennungzusatz> - </empfangendestelle> - <erklaerungen> - <check_gebuehren>true</check_gebuehren> - <check_richtigkeit>true</check_richtigkeit> - <check_datenschutz>true</check_datenschutz> - <check_missbrauch>true</check_missbrauch> - <b_gebuehren_beschriftung>* Mir ist bekannt, dass durch das Einreichen des elektronischen Antrages von der zuständigen Stelle Gebühren erhoben werden können.</b_gebuehren_beschriftung> - <b_gebuehren_intro>Gebühr bei Ausstellung des kleinen Waffenscheins: 60,00 Euro. Bearbeitungsgebühr bei Versagung: 45,00 Euro. - Sie sind gemäß § 39 WaffG verpflichtet, der zuständigen Behörde die zur Durchführung des Gesetzes erforderlichen Auskünfte zu erteilen. Zur Prüfung Ihrer waffenrechtlichen Zuverlässigkeit und Eignung holt die Behörde eine unbeschränkte Auskunft aus dem Bundeszentralregister, eine Auskunft aus dem zentralen staatsanwaltschaftlichen Verfahrensregister, eine Stellungnahme der örtlichen Polizeidienststelle und Ihrer Wohnsitzgemeinde ein.</b_gebuehren_intro> - <b_richtigkeit>* Ich bestätige die Richtigkeit meiner Angaben.</b_richtigkeit> - <b_datenschutz>* Ich erkläre mich damit einverstanden, dass der Einheitlicher Ansprechpartner Schleswig-Holstein zur Erfüllung seiner Aufgaben meine Daten unter Einhaltung der Bestimmungen der Datenschutz-Grundverordnung (DS-GVO) und des Landesdatenschutzgesetzes Schleswig-Holstein (LDSG-SH) speichert, verarbeitet und diese im Rahmen der gesetzlichen Bestimmungen an die für die Entscheidung zuständige Stelle weiterleitet. Ebenso bin ich mit der rechtskonformen Datenverarbeitung und Speicherung durch die zuständige Stelle einverstanden. Mir ist bekannt, dass ich die Einwilligung in die Verarbeitung und Übermittlung jederzeit gegenüber dem Einheitlicher Ansprechpartner Schleswig-Holstein, Deliusstraße 10, 24114 Kiel widerrufen kann. Ein Widerruf ist aber nur wirksam für die Zukunft. Verarbeitungen, die vor dem Widerruf erfolgt sind, sind davon nicht betroffen. Über die Verarbeitung meiner personenbezogenen Daten und die mir nach den datenschutzrechtlichen Regelungen zustehenden Ansprüche und Rechte habe ich unter Datenschutzerklärung Kenntnis erlangt.</b_datenschutz> - <b_missbrauch>* Mir ist bekannt, dass zur Verfolgung widerrechtlicher Nutzung die Daten meines zur Dateneingabe genutzten Endgerätes aufgezeichnet und verwendet werden können.</b_missbrauch> - <policyurl>http://www.ea-sh.info/datenschutz/datenschutzerklaerungEA_de.doc</policyurl> - </erklaerungen> - <logourl>http://www.ea-sh.info/logos/kopf_9068873.doc</logourl> - <fm> - <ansprechpartner> - <firmenname /> - <anrede>Herr</anrede> - <vorname>Mustermann</vorname> - <familienname>Max</familienname> - <anschrift> - <strasse>Musterstrasse</strasse> - <hausnummer>123</hausnummer> - <postfach /> - <postleitzahl>23701</postleitzahl> - <ort>Eutin</ort> - <ortsteil /> - <zusatz /> - <staat>Deutschland</staat> - </anschrift> - <kontakt> - <telefonnummer /> - <mobilnummer /> - <telefaxnummer /> - <emailadresse /> - <demailadresse /> - </kontakt> - </ansprechpartner> - <verwaltungsleistungen> - <verwaltungsleistung> - <ausgewaehlte_zustaendigestelle> - <OrganisationseinheitenID>279550874</OrganisationseinheitenID> - <OrganisationseinheitenBEZEICHNUNG>Fachdienst Sicherheit und Ordnung - Kreis Ostholstein</OrganisationseinheitenBEZEICHNUNG> - </ausgewaehlte_zustaendigestelle> - <GebietID>9006885</GebietID> - <GebietBEZEICHNUNG>Eutin</GebietBEZEICHNUNG> - <AnliegenID>8966671</AnliegenID> - <AnliegenBEZEICHNUNG>Waffenschein beantragen</AnliegenBEZEICHNUNG> - <leikaKEYLIST>99089122001000</leikaKEYLIST> - <leikaBEZEICHNUNG /> - </verwaltungsleistung> - </verwaltungsleistungen> - </fm> -</myForm> diff --git a/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/waffenschein/d254806f-abf4-4e4c-ae74-ea03460f34d2_Geschaeftsgang.Geschaeftsgang.0201.xml b/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/waffenschein/d254806f-abf4-4e4c-ae74-ea03460f34d2_Geschaeftsgang.Geschaeftsgang.0201.xml deleted file mode 100644 index 1eaa092e8b3c7f63a6cdf276f3ef763a1302274d..0000000000000000000000000000000000000000 --- a/xta-adapter/src/test/resources/mock-responses/getMessage/Geschaeftsgang.Geschaeftsgang.0201/waffenschein/d254806f-abf4-4e4c-ae74-ea03460f34d2_Geschaeftsgang.Geschaeftsgang.0201.xml +++ /dev/null @@ -1,79 +0,0 @@ -<?xml version="1.0"?> -<xdomea:Geschaeftsgang.Geschaeftsgang.0201 xmlns:xdomea="http://www.xdomea.de/V2.0.1"> - <xdomea:Kopf> - <xdomea:ProzessID>d254806f-abf4-4e4c-ae74-ea03460f34d2</xdomea:ProzessID> - <xdomea:Nachrichtentyp codeName="Geschaeftsgang.Geschaeftsgang.0201" codelistAgencyName="AG XDOMEA des KoopA ADV" codelistVersionIdentifier="2.0.0" languageCode="de" codelistName="Nachrichtentyp">0201</xdomea:Nachrichtentyp> - <xdomea:Erstellungszeitpunkt>2024-03-21T09:05:01.424+01:00</xdomea:Erstellungszeitpunkt> - <xdomea:Absender> - <xdomea:Behoerdenkennung> - <xdomea:Kennung codeName="WebMethod_Online-Dienste">WebMethod_Online-Dienste</xdomea:Kennung> - <xdomea:Praefix codeName="afmsh:">afmsh:</xdomea:Praefix> - </xdomea:Behoerdenkennung> - <xdomea:Institution> - <xdomea:Name>Einheitlicher Ansprechpartner</xdomea:Name> - <xdomea:Kurzbezeichnung>Einheitlicher Ansprechpartner</xdomea:Kurzbezeichnung> - </xdomea:Institution> - </xdomea:Absender> - <xdomea:Empfaenger> - <xdomea:Behoerdenkennung> - <xdomea:Kennung codeName="ozg-cloud-dev001 ">ozg-cloud-dev001 </xdomea:Kennung> - <xdomea:Praefix codeName="afmsh:">afmsh:</xdomea:Praefix> - </xdomea:Behoerdenkennung> - </xdomea:Empfaenger> - <xdomea:SendendesSystem> - <xdomea:InstanzID>AFMSH.MSR</xdomea:InstanzID> - <xdomea:Produktname>MSR</xdomea:Produktname> - <xdomea:Version>10.5</xdomea:Version> - </xdomea:SendendesSystem> - <xdomea:EmpfangsbestaetigungAnInitiator>false</xdomea:EmpfangsbestaetigungAnInitiator> - <xdomea:EmpfangsbestaetigungAnVorgaenger>false</xdomea:EmpfangsbestaetigungAnVorgaenger> - </xdomea:Kopf> - <xdomea:Hauptobjekt> - <xdomea:Dokument> - <xdomea:Identifikation> - <xdomea:ID>5b4e3f41-180b-4a9f-aa5b-19f9aa72f32e</xdomea:ID> - </xdomea:Identifikation> - <xdomea:AllgemeineMetadaten> - <xdomea:Betreff>Kleiner Waffenschein NB Test</xdomea:Betreff> - <xdomea:Kennzeichen>20240321325940124004</xdomea:Kennzeichen> - </xdomea:AllgemeineMetadaten> - <xdomea:Posteingangsdatum>2024-03-21</xdomea:Posteingangsdatum> - <xdomea:Typ>waffen/kleinerWaffenscheinNB</xdomea:Typ> - <xdomea:Version> - <xdomea:Nummer>0.0</xdomea:Nummer> - <xdomea:Format> - <xdomea:Name codeName="xml - eXtensible Markup Language" codelistAgencyName="AG XDOMEA des KoopA ADV" codelistVersionIdentifier="2.0.0" languageCode="de" codelistName="Dateiformat">030</xdomea:Name> - <xdomea:Version>0.0</xdomea:Version> - <xdomea:Primaerdokument> - <xdomea:Dateiname>8248e115-4aec-4253-bb2c-9788823ff9b1_XML-Daten.xml</xdomea:Dateiname> - </xdomea:Primaerdokument> - </xdomea:Format> - </xdomea:Version> - </xdomea:Dokument> - </xdomea:Hauptobjekt> - <xdomea:ExternerGeschaeftsgang> - <xdomea:Identifikation> - <xdomea:ID>1f6e0806-f9eb-4bb3-88ad-0828411f1f2c</xdomea:ID> - </xdomea:Identifikation> - <xdomea:Beteiligungsschritt> - <xdomea:Nummer>1</xdomea:Nummer> - <xdomea:Status codeName="zukuenftig" codelistAgencyName="AG XDOMEA des KoopA ADV" codelistVersionIdentifier="2.0.0" languageCode="de" codelistName="Beteiligungsstatus">001</xdomea:Status> - <xdomea:Verfuegung> - <xdomea:Ersteller> - <xdomea:Behoerdenkennung> - <xdomea:Kennung codeName="WebMethod_Online-Dienste">WebMethod_Online-Dienste</xdomea:Kennung> - <xdomea:Praefix codeName="afmsh:">afmsh:</xdomea:Praefix> - </xdomea:Behoerdenkennung> - </xdomea:Ersteller> - <xdomea:Adressat> - <xdomea:Behoerdenkennung> - <xdomea:Kennung codeName="ozg-cloud-dev001 ">ozg-cloud-dev001 </xdomea:Kennung> - <xdomea:Praefix codeName="afmsh:">afmsh:</xdomea:Praefix> - </xdomea:Behoerdenkennung> - </xdomea:Adressat> - <xdomea:Erstellungsdatum>2024-03-21</xdomea:Erstellungsdatum> - <xdomea:Erstellungsuhrzeit>09:05:01</xdomea:Erstellungsuhrzeit> - </xdomea:Verfuegung> - </xdomea:Beteiligungsschritt> - </xdomea:ExternerGeschaeftsgang> -</xdomea:Geschaeftsgang.Geschaeftsgang.0201> diff --git a/xta-adapter/src/test/resources/mock-responses/getMessage/fim.S17000652.17000652001004/versammlungsanzeige.xml b/xta-adapter/src/test/resources/mock-responses/getMessage/fim.S17000652.17000652001004/versammlungsanzeige.xml deleted file mode 100644 index 09c2733737951f336ac139a6838df3be550c8a39..0000000000000000000000000000000000000000 --- a/xta-adapter/src/test/resources/mock-responses/getMessage/fim.S17000652.17000652001004/versammlungsanzeige.xml +++ /dev/null @@ -1 +0,0 @@ -<fim.S17000652.17000652001004 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="urn:xoev-de:xfall:standard:fim-s17000652_1.4"><G17003529><G05001479><G05001480><F05002750>85ad506f-25a2-4a93-a086-b069784c6d60</F05002750><F05002751>21.03.2024 08:56:33</F05002751><F05002752>fim.S17000652.17000652001004</F05002752><F05002753>urn:fim:Versammlungsanzeige:1.4</F05002753></G05001480><G05001481><F05002754>Fachdienst Sicherheit und Ordnung - Kreis Ostholstein</F05002754><F05002755>vbe:010550120100</F05002755><F05002756>Versammlungsbehörde</F05002756></G05001481><G05001482><F05002754>Dataport</F05002754><F05002755>ehp:010100100000</F05002755><F05002756>Versammlungsbehörde</F05002756></G05001482></G05001479><F17005454>true</F17005454><F17005455>false</F17005455><F17005533>85ad506f-25a2-4a93-a086-b069784c6d60</F17005533></G17003529><F17009191>false</F17009191><G17002112><F60000228>OZG-Cloud</F60000228><F60000227>Team</F60000227><G60000086><F60000243>Muster</F60000243><F60000244>1</F60000244><F60000246>12345</F60000246><F60000247>Muster</F60000247></G60000086><F60000242>noreply@ozg-sh.de</F60000242><F17009011>false</F17009011></G17002112><F17003371>Anzeigen einer ortsfesten Versammlung (Kundgebung / Demonstration)</F17003371><G17005404><G17007202><F17003373>fsdf</F17003373><F17003377>sdf</F17003377><G17005406><F60000048>2024-03-21</F60000048><F17001348>13.5</F17001348><F60000049>2024-03-21</F60000049><F17001349>15</F17001349></G17005406></G17007202><G17007205><F17003379>10</F17003379><F17003382>keine</F17003382><G17007234><F17011826>Nein</F17011826></G17007234><G17007235><F17011827>Nein</F17011827></G17007235></G17007205></G17005404></fim.S17000652.17000652001004> \ No newline at end of file diff --git a/xta-adapter/src/test/resources/xdomea/dfoerdermittel_Geschaeftsgang.Geschaeftsgang.0201.xml b/xta-adapter/src/test/resources/xdomea/dfoerdermittel_Geschaeftsgang.Geschaeftsgang.0201.xml deleted file mode 100644 index 06068ed7f11a66915d42260f0bb8c10774965b0f..0000000000000000000000000000000000000000 --- a/xta-adapter/src/test/resources/xdomea/dfoerdermittel_Geschaeftsgang.Geschaeftsgang.0201.xml +++ /dev/null @@ -1,138 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<Geschaeftsgang.Geschaeftsgang.0201 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xsi:schemaLocation="urn:xoev-de:xdomea:schema:2.4.0 xdomea-Nachrichten-VBS.xsd" xmlns="urn:xoev-de:xdomea:schema:2.4.0"> - <Kopf> - <ProzessID>b42b7984-279c-4260-8b48-c0389555608c</ProzessID> - <Nachrichtentyp listURI="urn:xoev-de:xdomea:codeliste:nachrichtentyp" listVersionID="1.0"> - <code xmlns="">0201</code> - </Nachrichtentyp> - <Erstellungszeitpunkt>2024-04-22T16:14:18.1885313+02:00</Erstellungszeitpunkt> - <Absender> - <Behoerdenkennung> - <Kennung listURI="" listVersionID=""> - <code xmlns="">010200200000</code> - </Kennung> - <Praefix listURI="" listVersionID=""> - <code xmlns="">gad</code> - </Praefix> - </Behoerdenkennung> - </Absender> - <Empfaenger> - <Behoerdenkennung> - <Kennung listURI="" listVersionID=""> - <code xmlns="">dev-environment@ozg-cloud.de</code> - </Kennung> - <Praefix listURI="" listVersionID=""> - <code xmlns="">gae</code> - </Praefix> - </Behoerdenkennung> - </Empfaenger> - <SendendesSystem> - <InstanzID>HH_dFoerdermittelantrag</InstanzID> - <Produktname>dFoerdermittelantrag</Produktname> - <Version>2.1.999.0</Version> - </SendendesSystem> - <EmpfangsbestaetigungAnInitiator>false</EmpfangsbestaetigungAnInitiator> - <EmpfangsbestaetigungAnVorgaenger>false</EmpfangsbestaetigungAnVorgaenger> - </Kopf> - <Hauptobjekt> - <Dokument> - <Identifikation> - <ID>0e7734d8-bf3f-4f8d-9568-3791abf8fe44</ID> - </Identifikation> - <AllgemeineMetadaten> - <Betreff>Testantrag für die OZG-Cloud</Betreff> - <Kennzeichen>08dc497a-f1d4-412d-80ca-4f58405dc83e</Kennzeichen> - </AllgemeineMetadaten> - <Version> - <Nummer>1</Nummer> - <Format> - <Name listURI="urn:xoev-de:xdomea:codeliste:dateiformat" listVersionID="1.0" xsi:type="DateiformatCodeType"> - <code xmlns="">030</code> - <name xmlns="">xml-eXtensible Markup Language</name> - </Name> - <Version>0.0</Version> - <Primaerdokument> - <Dateiname>%s</Dateiname> - </Primaerdokument> - </Format> - <Format> - <Name listURI="urn:xoev-de:xdomea:codeliste:dateiformat" listVersionID="1.0" xsi:type="DateiformatCodeType"> - <code xmlns="">018</code> - <name xmlns="">pdf-Portable Document Format</name> - </Name> - <Version>0.0</Version> - <Primaerdokument> - <Dateiname>%s</Dateiname> - </Primaerdokument> - </Format> - </Version> - </Dokument> - </Hauptobjekt> - <ExternerGeschaeftsgang> - <Identifikation> - <ID>78fd7cf4-e9b2-4df1-9dc3-3b192a9d61d3</ID> - </Identifikation> - <Beteiligungsschritt> - <Nummer>1</Nummer> - <Status listURI="urn:xoev-de:xdomea:codeliste:beteiligungsstatus" listVersionID="1.0"> - <code xmlns="">001</code> - <name xmlns="">Der Schritt liegt in der Zukunft.</name> - </Status> - <Verfuegung> - <Ersteller> - <Behoerdenkennung> - <Kennung listURI="" listVersionID=""> - <code xmlns="">010200200000</code> - </Kennung> - <Praefix listURI="" listVersionID=""> - <code xmlns="">gad</code> - </Praefix> - </Behoerdenkennung> - </Ersteller> - <Adressat> - <Behoerdenkennung> - <Kennung listURI="" listVersionID=""> - <code xmlns="">dev-environment@ozg-cloud.de</code> - </Kennung> - <Praefix listURI="" listVersionID=""> - <code xmlns="">gae</code> - </Praefix> - </Behoerdenkennung> - </Adressat> - <Erstellungsdatum>2024-04-22</Erstellungsdatum> - <Erstellungsuhrzeit>16:14:18</Erstellungsuhrzeit> - </Verfuegung> - </Beteiligungsschritt> - </ExternerGeschaeftsgang> - <Anlage> - <Dokument> - <Identifikation> - <ID>1d8ca22a-9d20-4507-aa5e-b764bb5642f0</ID> - </Identifikation> - <Typ>Anlage</Typ> - <Version> - <Nummer>1</Nummer> - <Format> - <Name listURI="urn:xoev-de:xdomea:codeliste:dateiformat" listVersionID="1.0" xsi:type="DateiformatCodeType"> - <code xmlns="">030</code> - <name xmlns="">xml-eXtensible Markup Language</name> - </Name> - <Version>0.0</Version> - <Primaerdokument> - <Dateiname>%s</Dateiname> - </Primaerdokument> - </Format> - <Format> - <Name listURI="urn:xoev-de:xdomea:codeliste:dateiformat" listVersionID="1.0" xsi:type="DateiformatCodeType"> - <code xmlns="">018</code> - <name xmlns="">pdf-Portable Document Format</name> - </Name> - <Version>0.0</Version> - <Primaerdokument> - <Dateiname>anhang.pdf</Dateiname> - </Primaerdokument> - </Format> - </Version> - </Dokument> - </Anlage> -</Geschaeftsgang.Geschaeftsgang.0201> diff --git a/xta-adapter/src/test/resources/xdomea/mantelantrag_Geschaeftsgang.Geschaeftsgang.0201.xml b/xta-adapter/src/test/resources/xdomea/mantelantrag_Geschaeftsgang.Geschaeftsgang.0201.xml deleted file mode 100644 index 7bed65db92efc3fb0109240b75e19cef0ba7023f..0000000000000000000000000000000000000000 --- a/xta-adapter/src/test/resources/xdomea/mantelantrag_Geschaeftsgang.Geschaeftsgang.0201.xml +++ /dev/null @@ -1,132 +0,0 @@ -<?xml version="1.0"?> -<xdomea:Geschaeftsgang.Geschaeftsgang.0201 xmlns:xdomea="http://www.xdomea.de/V2.0.1"> - <xdomea:Kopf> - <xdomea:ProzessID>9f1b47d4-d6bf-4ec4-b0ff-1e30bee42ef2</xdomea:ProzessID> - <xdomea:Nachrichtentyp codeName="Geschaeftsgang.Geschaeftsgang.0201" - codelistAgencyName="AG XDOMEA des KoopA ADV" codelistVersionIdentifier="2.0.0" - languageCode="de" codelistName="Nachrichtentyp">0201 - </xdomea:Nachrichtentyp> - <xdomea:Erstellungszeitpunkt>2024-04-04T10:24:07.468+02:00</xdomea:Erstellungszeitpunkt> - <xdomea:Absender> - <xdomea:Behoerdenkennung> - <xdomea:Kennung codeName="WebMethod_Online-Dienste">WebMethod_Online-Dienste</xdomea:Kennung> - <xdomea:Praefix codeName="afmsh:">afmsh:</xdomea:Praefix> - </xdomea:Behoerdenkennung> - <xdomea:Institution> - <xdomea:Name>Schleswig-Holstein</xdomea:Name> - <xdomea:Kurzbezeichnung>Schleswig-Holstein</xdomea:Kurzbezeichnung> - </xdomea:Institution> - </xdomea:Absender> - <xdomea:Empfaenger> - <xdomea:Behoerdenkennung> - <xdomea:Kennung codeName="ozg-cloud-dev001">ozg-cloud-dev001</xdomea:Kennung> - <xdomea:Praefix codeName="afmsh:">afmsh:</xdomea:Praefix> - </xdomea:Behoerdenkennung> - </xdomea:Empfaenger> - <xdomea:SendendesSystem> - <xdomea:InstanzID>AFMSH.MSR</xdomea:InstanzID> - <xdomea:Produktname>MSR</xdomea:Produktname> - <xdomea:Version>10.5</xdomea:Version> - </xdomea:SendendesSystem> - <xdomea:EmpfangsbestaetigungAnInitiator>false</xdomea:EmpfangsbestaetigungAnInitiator> - <xdomea:EmpfangsbestaetigungAnVorgaenger>false</xdomea:EmpfangsbestaetigungAnVorgaenger> - </xdomea:Kopf> - <xdomea:Hauptobjekt> - <xdomea:Dokument> - <xdomea:Identifikation> - <xdomea:ID>9bae73b1-2ef3-480b-8acc-8bcd9979a788</xdomea:ID> - </xdomea:Identifikation> - <xdomea:AllgemeineMetadaten> - <xdomea:Betreff>Antrag auf Leistungen der Eingliederungshilfe und/oder Sozialhilfe</xdomea:Betreff> - <xdomea:Kennzeichen>20240404370530710707</xdomea:Kennzeichen> - </xdomea:AllgemeineMetadaten> - <xdomea:Posteingangsdatum>2024-04-04</xdomea:Posteingangsdatum> - <xdomea:Typ>maa_mantelantrag/maa_mantelantrag</xdomea:Typ> - <xdomea:Version> - <xdomea:Nummer>0.0</xdomea:Nummer> - <xdomea:Format> - <xdomea:Name codeName="xml - eXtensible Markup Language" - codelistAgencyName="AG XDOMEA des KoopA ADV" codelistVersionIdentifier="2.0.0" - languageCode="de" codelistName="Dateiformat">030 - </xdomea:Name> - <xdomea:Version>0.0</xdomea:Version> - <xdomea:Primaerdokument> - <xdomea:Dateiname>%s</xdomea:Dateiname> - </xdomea:Primaerdokument> - </xdomea:Format> - </xdomea:Version> - <xdomea:Version> - <xdomea:Nummer>0.0</xdomea:Nummer> - <xdomea:Format> - <xdomea:Name codeName="pdf - Portable Document Format" codelistAgencyName="AG XDOMEA des KoopA ADV" - codelistVersionIdentifier="2.0.0" languageCode="de" codelistName="Dateiformat">018 - </xdomea:Name> - <xdomea:Version>0.0</xdomea:Version> - <xdomea:Primaerdokument> - <xdomea:Dateiname>%s</xdomea:Dateiname> - </xdomea:Primaerdokument> - </xdomea:Format> - </xdomea:Version> - </xdomea:Dokument> - </xdomea:Hauptobjekt> - <xdomea:ExternerGeschaeftsgang> - <xdomea:Identifikation> - <xdomea:ID>8ae49342-8135-4f11-9930-5c4cc55b7ec2</xdomea:ID> - </xdomea:Identifikation> - <xdomea:Beteiligungsschritt> - <xdomea:Nummer>1</xdomea:Nummer> - <xdomea:Status codeName="zukuenftig" codelistAgencyName="AG XDOMEA des KoopA ADV" - codelistVersionIdentifier="2.0.0" languageCode="de" codelistName="Beteiligungsstatus">001 - </xdomea:Status> - <xdomea:Verfuegung> - <xdomea:Ersteller> - <xdomea:Behoerdenkennung> - <xdomea:Kennung codeName="WebMethod_Online-Dienste">WebMethod_Online-Dienste</xdomea:Kennung> - <xdomea:Praefix codeName="afmsh:">afmsh:</xdomea:Praefix> - </xdomea:Behoerdenkennung> - </xdomea:Ersteller> - <xdomea:Adressat> - <xdomea:Behoerdenkennung> - <xdomea:Kennung codeName="ozg-cloud-dev001">ozg-cloud-dev001</xdomea:Kennung> - <xdomea:Praefix codeName="afmsh:">afmsh:</xdomea:Praefix> - </xdomea:Behoerdenkennung> - </xdomea:Adressat> - <xdomea:Erstellungsdatum>2024-04-04</xdomea:Erstellungsdatum> - <xdomea:Erstellungsuhrzeit>10:24:06</xdomea:Erstellungsuhrzeit> - </xdomea:Verfuegung> - </xdomea:Beteiligungsschritt> - </xdomea:ExternerGeschaeftsgang> - <xdomea:Anlage> - <xdomea:Dokument> - <xdomea:Identifikation> - <xdomea:ID>1d8ca22a-9d20-4507-aa5e-b764bb5642f0</xdomea:ID> - </xdomea:Identifikation> - <xdomea:Typ>Anlage</xdomea:Typ> - <xdomea:Version> - <xdomea:Nummer>1</xdomea:Nummer> - <xdomea:Format> - <xdomea:Name codeName="xml - eXtensible Markup Language" - codelistAgencyName="AG XDOMEA des KoopA ADV" codelistVersionIdentifier="2.0.0" - languageCode="de" codelistName="Dateiformat">030 - </xdomea:Name> - <xdomea:Version>0.0</xdomea:Version> - <xdomea:Primaerdokument> - <xdomea:Dateiname>%s</xdomea:Dateiname> - </xdomea:Primaerdokument> - </xdomea:Format> - </xdomea:Version> - <xdomea:Version> - <xdomea:Nummer>1</xdomea:Nummer> - <xdomea:Format> - <xdomea:Name codeName="pdf - Portable Document Format" codelistAgencyName="AG XDOMEA des KoopA ADV" - codelistVersionIdentifier="2.0.0" languageCode="de" codelistName="Dateiformat">018 - </xdomea:Name> - <xdomea:Version>0.0</xdomea:Version> - <xdomea:Primaerdokument> - <xdomea:Dateiname>anhang.pdf</xdomea:Dateiname> - </xdomea:Primaerdokument> - </xdomea:Format> - </xdomea:Version> - </xdomea:Dokument> - </xdomea:Anlage> -</xdomea:Geschaeftsgang.Geschaeftsgang.0201> diff --git a/xta-adapter/src/test/resources/xtaTestStore.p12 b/xta-adapter/src/test/resources/xtaTestStore.p12 deleted file mode 100644 index a0cc212c49745a428186d0d4f2f73dd6ac7f24ff..0000000000000000000000000000000000000000 Binary files a/xta-adapter/src/test/resources/xtaTestStore.p12 and /dev/null differ