diff --git a/changelog.txt b/changelog.txt index ab1e1af5ac15a0ce31c2ecece509238aaaa4d805..0f301f5bb38064901d7159eace5f028949d402db 100644 --- a/changelog.txt +++ b/changelog.txt @@ -27,6 +27,8 @@ eDelivery SMP 4.2 identifiersBehaviour.ParticipantIdentifierScheme.ebCoreId.concatenate: Concatenate ebCore party id in XML responses <ParticipantIdentifier >urn:oasis:names:tc:ebcore:partyid-type:unregistered:test-ebcore-id</ParticipantIdentifier> smp.passwordPolicy.expired.forceChange: Force change password at UI login if expired smp.passwordPolicy.warning.beforeExpiration: How many days before expiration should the UI warn users at login +- new application configuration property + libraries.folder: add external SPI beans libraries folder loaded at the startup of the SMP! - removed deprecated properties diff --git a/pom.xml b/pom.xml index 6085b56dbc18500bb77ae06ab6ce446c48311ee8..870d255edd7e3b714f50fc79addee7a884a5406d 100644 --- a/pom.xml +++ b/pom.xml @@ -24,9 +24,11 @@ <modules> <module>smp-angular</module> <module>smp-api</module> + <module>smp-spi</module> <module>smp-server-library</module> <module>smp-webapp</module> <module>smp-soapui-tests</module> + <module>smp-examples</module> </modules> <properties> diff --git a/smp-angular/src/app/app-config/smp-config.model.ts b/smp-angular/src/app/app-config/smp-config.model.ts index d2dc4eb6161aee0611536d475198e8c7a07e89e2..4692039d1552a4ade4e681a220694a2bccba8b4e 100644 --- a/smp-angular/src/app/app-config/smp-config.model.ts +++ b/smp-angular/src/app/app-config/smp-config.model.ts @@ -2,6 +2,7 @@ export interface SmpConfig { smlIntegrationOn?: boolean; smlParticipantMultiDomainOn?: boolean; concatEBCorePartyId?: boolean; + partyIDSchemeMandatory?: boolean; participantSchemaRegExp?: string; participantSchemaRegExpMessage?: string; passwordValidationRegExp?: string; diff --git a/smp-angular/src/app/domain/domain-details-dialog/domain-details-dialog.component.html b/smp-angular/src/app/domain/domain-details-dialog/domain-details-dialog.component.html index abcf1ec2d5f77a1c7440b4893361677ed85fbf7b..174f6fa8cc77c40bea35c3e5c4d243c124c6df61 100644 --- a/smp-angular/src/app/domain/domain-details-dialog/domain-details-dialog.component.html +++ b/smp-angular/src/app/domain/domain-details-dialog/domain-details-dialog.component.html @@ -25,7 +25,7 @@ <input matInput placeholder="SML domain" name="smlSubdomain" id="smldomain_id" [formControl]="domainForm.controls['smlSubdomain']" maxlength="63" > - <mat-hint align="end">Part of DNS Zone (e.g. for eHealth: 'ehealth', for peppol: '', ..</mat-hint> + <mat-hint align="end">The domain-specific part of the SML DNS zone (e.g., ‘mydomain’ for mydomain.sml.dns.zone or leave empty for sml.dns.zone). Note: informative value.</mat-hint> <div *ngIf="(!editMode && domainForm.controls['smlSubdomain'].touched || editMode) && domainForm.controls['smlSubdomain'].hasError('pattern')" diff --git a/smp-angular/src/app/service-group-edit/service-group-details-dialog/service-group-details-dialog.component.html b/smp-angular/src/app/service-group-edit/service-group-details-dialog/service-group-details-dialog.component.html index 4750a3c659fbb82e93aa63513c38725ea0ce1c7b..c1c4f717b64f100cb59e98cc0d0269d65f629d12 100644 --- a/smp-angular/src/app/service-group-edit/service-group-details-dialog/service-group-details-dialog.component.html +++ b/smp-angular/src/app/service-group-edit/service-group-details-dialog/service-group-details-dialog.component.html @@ -25,10 +25,16 @@ </mat-form-field> <mat-form-field style="width:100%"> - <input matInput placeholder="Participant scheme" name="participantScheme" - id="participantScheme_id" + <input *ngIf="lookups.cachedApplicationConfig.partyIDSchemeMandatory else notRequired" + matInput placeholder="Participant scheme" name="participantScheme" + id="participantSchemeMandatory_id" [formControl]="dialogForm.controls['participantScheme']" maxlength="255" required> + <input #notRequired + matInput placeholder="Participant scheme" name="participantScheme" + id="participantScheme_id" + [formControl]="dialogForm.controls['participantScheme']" + maxlength="255" > <div *ngIf="(!editMode && dialogForm.controls['participantScheme'].touched || editMode) && dialogForm.controls['participantScheme'].hasError('required')" style="color:red; font-size: 70%"> diff --git a/smp-angular/src/app/service-group-edit/service-group-details-dialog/service-group-details-dialog.component.ts b/smp-angular/src/app/service-group-edit/service-group-details-dialog/service-group-details-dialog.component.ts index 742b48fac5ea5dc5658583385a8eb8b71ef2b154..214c5f7f263ea2e273c44863c18810261e879431 100644 --- a/smp-angular/src/app/service-group-edit/service-group-details-dialog/service-group-details-dialog.component.ts +++ b/smp-angular/src/app/service-group-edit/service-group-details-dialog/service-group-details-dialog.component.ts @@ -110,7 +110,7 @@ export class ServiceGroupDetailsDialogComponent implements OnInit { this.current.status === SearchTableEntityStatus.NEW ? Validators.required : null), 'participantScheme': new FormControl({value: '', disabled: this.current.status !== SearchTableEntityStatus.NEW}, this.current.status === SearchTableEntityStatus.NEW ? - [Validators.required, Validators.pattern(this.participantSchemePattern)] : null), + [Validators.pattern(this.participantSchemePattern)] : null), 'serviceGroupDomains': new FormControl({value: []}, [this.minSelectedListCount(1), this.multiDomainOn(this.lookups.cachedApplicationConfig.smlParticipantMultiDomainOn)]), 'users': new FormControl({value: []}, [this.minSelectedListCount(1)]), @@ -118,6 +118,10 @@ export class ServiceGroupDetailsDialogComponent implements OnInit { }); + if (!!lookups.cachedApplicationConfig.partyIDSchemeMandatory && this.current.status == SearchTableEntityStatus.NEW){ + this.dialogForm.controls['participantScheme'].addValidators(Validators.required) ; + } + // update values this.dialogForm.controls['participantIdentifier'].setValue(this.current.participantIdentifier); this.dialogForm.controls['participantScheme'].setValue(this.current.participantScheme); diff --git a/smp-api/src/main/java/eu/europa/ec/smp/api/Identifiers.java b/smp-api/src/main/java/eu/europa/ec/smp/api/Identifiers.java index 9086b4f6847945b37ea9205e3ab079c1a64a5a26..37a20ce4703f1602453a89bdd8661fbbd4a640f4 100644 --- a/smp-api/src/main/java/eu/europa/ec/smp/api/Identifiers.java +++ b/smp-api/src/main/java/eu/europa/ec/smp/api/Identifiers.java @@ -37,26 +37,25 @@ public class Identifiers { private static final String EMPTY_IDENTIFIER = "Null/Empty"; - public static ParticipantIdentifierType asParticipantId(String participantIDentifier) { - String[] res = splitParticipantIdentifier(participantIDentifier); + public static ParticipantIdentifierType asParticipantId(String participantIdentifier, boolean schemeMandatory) { + String[] res = splitParticipantIdentifier(participantIdentifier, schemeMandatory); return new ParticipantIdentifierType(res[1], res[0]); } public static DocumentIdentifier asDocumentId(String doubleColonDelimitedId) { - String[] res = splitDoubleColonIdentifier(doubleColonDelimitedId); + String[] res = splitDoubleColonIdentifier(doubleColonDelimitedId, false); return new DocumentIdentifier(res[1], res[0]); } public static ProcessIdentifier asProcessId(String doubleColonDelimitedId) { - String[] res = splitDoubleColonIdentifier(doubleColonDelimitedId); + String[] res = splitDoubleColonIdentifier(doubleColonDelimitedId, false); return new ProcessIdentifier(res[1], res[0]); } public static String asString(ParticipantIdentifierType participantId) { if (StringUtils.isBlank(participantId.getScheme())) { - // if scheme is empty just return value (for OASIS SMP 1.0 must start with :: ) - return (StringUtils.startsWithIgnoreCase(participantId.getScheme(), EBCORE_IDENTIFIER_PREFIX) ? - "" : "::") + participantId.getValue(); + // if scheme is empty just return value (see section 3.4.1 of [SMP-v1.0]) MUST include neither an {identifier scheme} nor the :: separator ) + return participantId.getValue(); } String format = StringUtils.startsWithIgnoreCase(participantId.getScheme(), EBCORE_IDENTIFIER_PREFIX) ? @@ -81,7 +80,7 @@ public class Identifiers { return UriUtils.encode(s, UTF_8.name()); } - private static String[] splitParticipantIdentifier(String participantIdentifier) { + private static String[] splitParticipantIdentifier(String participantIdentifier, boolean schemeMandatory) { String[] idResult; if (StringUtils.isBlank(participantIdentifier)) { @@ -92,7 +91,7 @@ public class Identifiers { || identifier.startsWith("::" + EBCORE_IDENTIFIER_PREFIX)) { idResult = splitEbCoreIdentifier(identifier); } else { - idResult = splitDoubleColonIdentifier(identifier); + idResult = splitDoubleColonIdentifier(identifier, schemeMandatory); } return idResult; @@ -107,7 +106,7 @@ public class Identifiers { * @return array with two elements. First is schema and second is id */ - private static String[] splitDoubleColonIdentifier(String doubleColonDelimitedId) { + private static String[] splitDoubleColonIdentifier(String doubleColonDelimitedId, boolean schemeMandatory) { if (StringUtils.isBlank(doubleColonDelimitedId)) { throw new MalformedIdentifierException(EMPTY_IDENTIFIER, null); } @@ -115,18 +114,16 @@ public class Identifiers { String[] idResult = new String[2]; int delimiterIndex = doubleColonDelimitedId.indexOf("::"); - if (delimiterIndex < 0) { + if (schemeMandatory && delimiterIndex < 0) { throw new MalformedIdentifierException(doubleColonDelimitedId, null); } - idResult[0] = delimiterIndex == 0 ? null : doubleColonDelimitedId.substring(0, delimiterIndex); - idResult[1] = doubleColonDelimitedId.substring(delimiterIndex + 2); + idResult[0] = delimiterIndex <= 0 ? null : doubleColonDelimitedId.substring(0, delimiterIndex); + idResult[1] = doubleColonDelimitedId.substring(delimiterIndex + (delimiterIndex < 0?1:2)); if (StringUtils.isBlank(idResult[1])) { throw new MalformedIdentifierException(doubleColonDelimitedId, null); } - return idResult; - } public static String[] splitEbCoreIdentifier(final String partyId) { diff --git a/smp-api/src/test/java/eu/europa/ec/smp/api/IdentifiersTest.java b/smp-api/src/test/java/eu/europa/ec/smp/api/IdentifiersTest.java index 58a2135e850faf7be3f45ab267328b3f1bc84168..1c28003c62865c2858900da435de7927328c793a 100644 --- a/smp-api/src/test/java/eu/europa/ec/smp/api/IdentifiersTest.java +++ b/smp-api/src/test/java/eu/europa/ec/smp/api/IdentifiersTest.java @@ -66,18 +66,19 @@ public class IdentifiersTest { }; } - private static final Object[] participantIdentifierNegativeCases() { - return new Object[]{ - "Null value", null, - "Empty value", "", - "Not double colon and not ebCoreId", "a", - "Constant and is not ebCoreId 2", "abc", - "Only one colon", "a:b", - "Missing identifier", "a::", - "Not double colon and not ebCoreId", "ehealth-actorid-qns", - "Not double colon and not ebCoreId", "urn:poland:ncpb", - "Not double colon and not ebCoreId", "ehealth-resid-qns", - "Not double colon and not ebCoreId", "epsos##services:extended:epsos:51", + private static final Object[][] participantIdentifierNegativeCases() { + return new Object[][]{ + {"Null value", null, false}, + {"Empty value", "", false}, + {"Missing identifier", "a::", false}, + // following are false only if scheme is mandatory! + {"Not double colon and not ebCoreId", "a", true}, + {"Constant and is not ebCoreId 2", "abc", true}, + {"Only one colon", "a:b", true}, + {"Not double colon and not ebCoreId", "ehealth-actorid-qns", true}, + {"Not double colon and not ebCoreId", "urn:poland:ncpb", true}, + {"Not double colon and not ebCoreId", "ehealth-resid-qns", true}, + {"Not double colon and not ebCoreId", "epsos##services:extended:epsos:51", true}, }; } @@ -86,6 +87,7 @@ public class IdentifiersTest { {"a::b", "a", "b"}, {"a::b::c", "a", "b::c"}, {"a:b::c", "a:b", "c"}, + {"NoSchemeIdentifier", null, "NoSchemeIdentifier"}, {"ehealth-actorid-qns::urn:poland:ncpb", "ehealth-actorid-qns", "urn:poland:ncpb"}, {"ehealth-resid-qns::urn::epsos##services:extended:epsos::51", "ehealth-resid-qns", "urn::epsos##services:extended:epsos::51"}, {"iso6523-actorid-upis::0002:gutek", "iso6523-actorid-upis", "0002:gutek"}, @@ -135,7 +137,7 @@ public class IdentifiersTest { private static final Object[] ebCoreIdentifiersNegativeCases() { return new Object[][]{ - {"Not an ebCore ", "urn:my:space:tc:ebcore:partyid-type:unregistered:domain:ec.europa.eu", MalformedIdentifierException.class}, + //{"Not an ebCore ", "urn:my:space:tc:ebcore:partyid-type:unregistered:domain:ec.europa.eu", MalformedIdentifierException.class}, {"ebCore iso6523", "urn:oasis:names:tc:ebcore:partyid-type:iso6523:Illegal-value-without-scheme", IllegalArgumentException.class}, {"ebCore with no catalog", " urn:oasis:names:tc:ebcore:partyid-type:0088123456789", IllegalArgumentException.class}, }; @@ -144,15 +146,7 @@ public class IdentifiersTest { private static final Object[] negativeCases() { return new Object[]{ null, - "", - "a", - "abc", - "a:b", "a::", - "ehealth-actorid-qns", - "urn:poland:ncpb", - "ehealth-resid-qns", - "epsos##services:extended:epsos:51", }; } @@ -179,7 +173,7 @@ public class IdentifiersTest { @TestCaseName("{0}") public void testParticipantIdPositive(String caseName, String input, String scheme, String value) { //when - ParticipantIdentifierType participantId = Identifiers.asParticipantId(input); + ParticipantIdentifierType participantId = Identifiers.asParticipantId(input, true); //then assertEquals(scheme, participantId.getScheme()); @@ -202,10 +196,11 @@ public class IdentifiersTest { @Test @Parameters(method = "participantIdentifierNegativeCases") @TestCaseName("{0}") - public void testParticipantIdNegative(String negativeInput) { + public void testParticipantIdNegative(String caseName, String negativeInput, boolean schemeMandatory) { try { //when - Identifiers.asParticipantId(negativeInput); + Identifiers.asParticipantId(negativeInput, schemeMandatory); + System.out.println(negativeInput); } catch (Exception e) { //then negativeAssertions(negativeInput, e); @@ -221,7 +216,7 @@ public class IdentifiersTest { expectedEx.expect(clz); //when - Identifiers.asParticipantId(negativeInput); + Identifiers.asParticipantId(negativeInput, false); } diff --git a/smp-docker/compose/tomcat-mysql-smp-sml/docker-compose.yml b/smp-docker/compose/tomcat-mysql-smp-sml/docker-compose.yml index 2a6d87efb382b8135772d28257429f3c4225fb7d..e91550851b59c804b0c79b455c0da3c1bf9c8777 100644 --- a/smp-docker/compose/tomcat-mysql-smp-sml/docker-compose.yml +++ b/smp-docker/compose/tomcat-mysql-smp-sml/docker-compose.yml @@ -3,6 +3,8 @@ services: tomcat-mysql-sml: image: smp-sml-tomcat-mysql:${SMP_VERSION} container_name: smp-sml-tomcat-mysql + environment: + - SMP_INIT_PROPERTIES=smp.passwordPolicy.expired.forceChange=false||smp.cluster.enabled=false volumes: - ./properties/db-scripts:/tmp/custom-data/ # init script. ports: diff --git a/smp-examples/pom.xml b/smp-examples/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..d88204c78c3b1c553c18fccf3688718c077d7e08 --- /dev/null +++ b/smp-examples/pom.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + ~ Copyright 2017 European Commission | CEF eDelivery + ~ + ~ Licensed under the EUPL, Version 1.2 or – as soon they will be approved by the European Commission - subsequent versions of the EUPL (the "Licence"); + ~ You may not use this work except in compliance with the Licence. + ~ + ~ You may obtain a copy of the Licence attached in file: LICENCE-EUPL-v1.2.pdf + ~ + ~ Unless required by applicable law or agreed to in writing, software distributed under the Licence is distributed on an "AS IS" basis, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the Licence for the specific language governing permissions and limitations under the Licence. + --> + +<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0" + 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>eu.europa.ec.edelivery</groupId> + <artifactId>smp-modules</artifactId> + <version>4.2-SNAPSHOT</version> + <relativePath>../pom.xml</relativePath> + </parent> + + <artifactId>smp-examples</artifactId> + <name>smp-examples</name> + <packaging>pom</packaging> + <description>The sub-project contains SMP examples of API and SPI implementations. Currently, SPI payload validation example.</description> + <modules> + <module>smp-spi-example</module> + </modules> +</project> diff --git a/smp-examples/smp-spi-example/pom.xml b/smp-examples/smp-spi-example/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..aef0fe99618d74a8b8e3d7da9745b0fd52870aa7 --- /dev/null +++ b/smp-examples/smp-spi-example/pom.xml @@ -0,0 +1,47 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + ~ Copyright 2017 European Commission | CEF eDelivery + ~ + ~ Licensed under the EUPL, Version 1.2 or – as soon they will be approved by the European Commission - subsequent versions of the EUPL (the "Licence"); + ~ You may not use this work except in compliance with the Licence. + ~ + ~ You may obtain a copy of the Licence attached in file: LICENCE-EUPL-v1.2.pdf + ~ + ~ Unless required by applicable law or agreed to in writing, software distributed under the Licence is distributed on an "AS IS" basis, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the Licence for the specific language governing permissions and limitations under the Licence. + --> + +<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>eu.europa.ec.edelivery</groupId> + <artifactId>smp-modules</artifactId> + <version>4.2-SNAPSHOT</version> + <relativePath>../../pom.xml</relativePath> + </parent> + + <artifactId>smp-spi-example</artifactId> + <name>smp-spi-example</name> + <packaging>jar</packaging> + <description>Example of SMP's SPI Payload validation.</description> + <dependencies> + <dependency> + <groupId>eu.europa.ec.edelivery</groupId> + <artifactId>smp-spi</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-context</artifactId> + </dependency> + </dependencies> + <build> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-compiler-plugin</artifactId> + </plugin> + </plugins> + </build> +</project> diff --git a/smp-examples/smp-spi-example/src/main/java/eu/europa/ec/smp/spi/ExamplePayloadValidatorSpiImpl.java b/smp-examples/smp-spi-example/src/main/java/eu/europa/ec/smp/spi/ExamplePayloadValidatorSpiImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..520beb4a85dc3b51b40312a9a88504749b02bbe7 --- /dev/null +++ b/smp-examples/smp-spi-example/src/main/java/eu/europa/ec/smp/spi/ExamplePayloadValidatorSpiImpl.java @@ -0,0 +1,39 @@ +package eu.europa.ec.smp.spi; + +import eu.europa.ec.smp.spi.exceptions.PayloadValidatorSpiException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import java.io.IOException; +import java.io.InputStream; + +/** + * @author Joze Rihtarsic + * @since 4.2 + * <p> + * Example of the SMP Service provider interface (SPI) for uploaded payload validation. + */ +@Service +public class ExamplePayloadValidatorSpiImpl implements PayloadValidatorSpi { + private static final Logger LOG = LoggerFactory.getLogger(ExamplePayloadValidatorSpiImpl.class); + + /** + * Example methods logs the byte size and the mime type + * + * @param payload The payload data to be validated + * @param mimeType The payload mime type + * @throws PayloadValidatorSpiException in case the validation does not pass + */ + public void validatePayload(InputStream payload, String mimeType) throws PayloadValidatorSpiException { + try { + LOG.info("*********************************************************************"); + LOG.info("* Validate payload with size [{}] and mime type [{}]!", payload.available(), mimeType); + LOG.info("**********************************************************************"); + } catch (IOException e) { + throw new PayloadValidatorSpiException("Can not read payload", e); + } + } + + ; +} \ No newline at end of file diff --git a/smp-examples/smp-spi-example/src/main/resources/logback.xml b/smp-examples/smp-spi-example/src/main/resources/logback.xml new file mode 100644 index 0000000000000000000000000000000000000000..10ca94f2e20beb3b5f9da96237a19bf3531dd8bb --- /dev/null +++ b/smp-examples/smp-spi-example/src/main/resources/logback.xml @@ -0,0 +1,38 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<configuration> + <!-- pattern definition --> + <property name="encoderPattern" value="%d{ISO8601} [%thread] %5p %c{1}:%L - %m%n" scope="global"/> + <property name="consolePattern" value="%d{ISO8601} [%thread] %5p %c{1}:%L - %m%n" scope="global"/> + + <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender"> + <file>${log.folder:-logs}/spi-validation-example-smp.log</file> + <filter class="ch.qos.logback.core.filter.EvaluatorFilter"> + </filter> + <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> + <!-- rollover daily --> + <fileNamePattern>${log.folder:-logs}/spi-validation-example-smp-%d{yyyy-MM-dd}.%i.log</fileNamePattern> + <!-- each file should be at most 30MB, keep 60 days worth of history, but at most 20GB --> + <maxFileSize>30MB</maxFileSize> + <maxHistory>60</maxHistory> + <totalSizeCap>20GB</totalSizeCap> + </rollingPolicy> + <encoder> + <pattern>${encoderPattern}</pattern> + </encoder> + </appender> + + + + <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender"> + <Target>System.out</Target> + <encoder> + <pattern>${consolePattern}</pattern> + </encoder> + </appender> + <logger name="eu.europa.ec.edelivery" level="DEBUG" /> + <root level="WARN"> + <appender-ref ref="file"/> + <appender-ref ref="stdout"/> + </root> +</configuration> \ No newline at end of file diff --git a/smp-server-library/pom.xml b/smp-server-library/pom.xml index a49897b1fa73a3bc8270a18a76911cdfb0394931..0bffa3e2ac9fff59b572620fae169b2bf4718967 100644 --- a/smp-server-library/pom.xml +++ b/smp-server-library/pom.xml @@ -28,6 +28,11 @@ <artifactId>smp-api</artifactId> <version>${project.version}</version> </dependency> + <dependency> + <groupId>eu.europa.ec.edelivery</groupId> + <artifactId>smp-spi</artifactId> + <version>${project.version}</version> + </dependency> <dependency> <groupId>eu.europa.ec.bdmsl</groupId> <artifactId>bdmsl-api</artifactId> diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/config/DatabaseConfig.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/config/DatabaseConfig.java index 48e92dd2afe3a1054dbd78eccab16bd8347ec3b2..cd2a1158064fd86ab92cec31ecac693b33a5f822 100644 --- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/config/DatabaseConfig.java +++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/config/DatabaseConfig.java @@ -13,10 +13,13 @@ package eu.europa.ec.edelivery.smp.config; +import eu.europa.ec.edelivery.smp.exceptions.ErrorCode; import eu.europa.ec.edelivery.smp.exceptions.SMPRuntimeException; import eu.europa.ec.edelivery.smp.logging.SMPLogger; import eu.europa.ec.edelivery.smp.logging.SMPLoggerFactory; +import eu.europa.ec.edelivery.smp.utils.ExtLibraryClassLoader; import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.exception.ExceptionUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; @@ -33,6 +36,8 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; import javax.naming.NamingException; import javax.persistence.EntityManagerFactory; import javax.sql.DataSource; +import java.io.File; +import java.net.MalformedURLException; import java.util.Properties; import static eu.europa.ec.edelivery.smp.exceptions.ErrorCode.INTERNAL_ERROR; diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/config/DatabaseProperties.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/config/DatabaseProperties.java index 918a0009455ddda98d4d588be85fe7eaa4a2d709..1b8d3492316eb2629b478dc51a73d26e4d170a52 100644 --- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/config/DatabaseProperties.java +++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/config/DatabaseProperties.java @@ -1,6 +1,7 @@ package eu.europa.ec.edelivery.smp.config; import eu.europa.ec.edelivery.smp.data.model.DBConfiguration; +import eu.europa.ec.edelivery.smp.data.ui.enums.SMPPropertyEnum; import eu.europa.ec.edelivery.smp.logging.SMPLogger; import eu.europa.ec.edelivery.smp.logging.SMPLoggerFactory; @@ -8,6 +9,7 @@ import javax.persistence.EntityManager; import javax.persistence.TypedQuery; import java.time.OffsetDateTime; import java.util.List; +import java.util.Optional; import java.util.Properties; public class DatabaseProperties extends Properties { @@ -23,13 +25,27 @@ public class DatabaseProperties extends Properties { for (DBConfiguration dc : lst) { if(dc.getValue()!=null) { LOG.info("Database property: '{}' value: '{}'",dc.getProperty(), - dc.getProperty().toLowerCase().contains("password")?"******": dc.getValue()); + isSensitiveData(dc.getProperty())?"******": dc.getValue()); setProperty(dc.getProperty(), dc.getValue()); } lastUpdate = (lastUpdate==null || lastUpdate.isBefore(dc.getLastUpdatedOn()) )? dc.getLastUpdatedOn() :lastUpdate; } } + /** + * Return true for properties which must not be logged! + * @param property - value to validate if contains sensitive data + * @return true if data is sensitive, else return false + */ + public boolean isSensitiveData(String property){ + Optional<SMPPropertyEnum> propOpt = SMPPropertyEnum.getByProperty(property); + if (propOpt.isPresent()){ + return propOpt.get().isEncrypted() || property.toLowerCase().contains(".password.decrypted"); + } + LOG.warn("Database property [{}] is not recognized by the SMP!", property); + return false; + } + public OffsetDateTime getLastUpdate() { return lastUpdate; } diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/config/FileProperty.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/config/FileProperty.java index e08fdbb3b9729422da7289e50d8dd14232230cb2..b10e90017a1c656b0e725f7a877a0646593da41a 100644 --- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/config/FileProperty.java +++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/config/FileProperty.java @@ -31,9 +31,7 @@ public class FileProperty { public static final String PROPERTY_DB_URL = "jdbc.url"; public static final String PROPERTY_DB_JNDI = "datasource.jndi"; public static final String PROPERTY_DB_DIALECT = "hibernate.dialect"; - - private FileProperty() { - } + public static final String PROPERTY_LIB_FOLDER = "libraries.folder"; public static void updateLogConfiguration(String logFileFolder, String logPropertyFile, String configurationFolder) { diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/config/PropertyInitialization.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/config/PropertyInitialization.java index e28357843e8f746527d12738a8ecf7068bdf3f51..fa7dd2ce873772713ffcefa0f79f082c998ce5d3 100644 --- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/config/PropertyInitialization.java +++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/config/PropertyInitialization.java @@ -52,36 +52,9 @@ import static eu.europa.ec.edelivery.smp.exceptions.ErrorCode.INTERNAL_ERROR; * Also it uses hibernate to handle dates for Configuration table. */ public class PropertyInitialization { - // application properties contains build data and are set at build time. - private static final String FILE_APPLICATION_PROPERTIES = "/application.properties"; - - private static final String PROP_BUILD_NAME = "smp.artifact.name"; - private static final String PROP_BUILD_VERSION = "smp.artifact.version"; - private static final String PROP_BUILD_TIME = "smp.artifact.build.time"; - SMPLogger LOG = SMPLoggerFactory.getLogger(PropertyInitialization.class); - - public void logBuildProperties() { - InputStream is = PropertyInitialization.class.getResourceAsStream(FILE_APPLICATION_PROPERTIES); - if (is != null) { - Properties applProp = new Properties(); - try { - applProp.load(is); - LOG.info("*****************************************************************************************"); - LOG.info("Start application: name: {}, version: {}, build time: {}.", applProp.getProperty(PROP_BUILD_NAME) - , applProp.getProperty(PROP_BUILD_VERSION) - , applProp.getProperty(PROP_BUILD_TIME)); - LOG.info("*****************************************************************************************"); - } catch (IOException e) { - LOG.error("Error occurred while reading application properties. Is file " + FILE_APPLICATION_PROPERTIES + " included in war!", e); - } - } else { - LOG.error("Not found application build properties: {}!", FILE_APPLICATION_PROPERTIES); - } - } - protected Properties getDatabaseProperties(Properties fileProperties) { String dialect = fileProperties.getProperty(FileProperty.PROPERTY_DB_DIALECT); if (StringUtils.isBlank(dialect)) { diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/conversion/CaseSensitivityNormalizer.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/conversion/CaseSensitivityNormalizer.java index f97aaa9343f01d6cff99c947817f27d945091436..224bff8636a79d85f32dacd6d8d7eef811a7523c 100644 --- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/conversion/CaseSensitivityNormalizer.java +++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/conversion/CaseSensitivityNormalizer.java @@ -17,12 +17,9 @@ import eu.europa.ec.edelivery.smp.services.ConfigurationService; import org.apache.commons.lang3.StringUtils; import org.oasis_open.docs.bdxr.ns.smp._2016._05.DocumentIdentifier; import org.oasis_open.docs.bdxr.ns.smp._2016._05.ParticipantIdentifierType; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import java.io.IOException; import java.util.List; -import java.util.ListIterator; import static eu.europa.ec.smp.api.Identifiers.asParticipantId; import static eu.europa.ec.smp.api.Identifiers.asString; @@ -33,11 +30,11 @@ import static eu.europa.ec.smp.api.Identifiers.asString; @Component public class CaseSensitivityNormalizer { + protected static ConfigurationService configurationService; - @Autowired - ConfigurationService configurationService; - - + public CaseSensitivityNormalizer(ConfigurationService configurationService) { + this.configurationService = configurationService; + } public ParticipantIdentifierType normalizeParticipantIdentifier(String scheme, String value) { List<String> caseSensitiveParticipantSchemes = configurationService.getCaseSensitiveParticipantScheme(); @@ -49,8 +46,10 @@ public class CaseSensitivityNormalizer { } public ParticipantIdentifierType normalize(final ParticipantIdentifierType participantIdentifier) { - String scheme = participantIdentifier.getScheme(); - String value = participantIdentifier.getValue(); + ParticipantIdentifierType prtId = asParticipantId(asString(participantIdentifier), + configurationService.getParticipantSchemeMandatory()); + String scheme = prtId.getScheme(); + String value = prtId.getValue(); return normalizeParticipantIdentifier(scheme, value); } @@ -74,13 +73,6 @@ public class CaseSensitivityNormalizer { } public ParticipantIdentifierType normalizeParticipant(String participantId) { - return normalize(asParticipantId(participantId)); - } - - private static void toLowerCaseStringList(List<String> strings) { - ListIterator<String> iterator = strings.listIterator(); - while (iterator.hasNext()) { - iterator.set(iterator.next().toLowerCase().trim()); - } + return normalize(asParticipantId(participantId, configurationService.getParticipantSchemeMandatory())); } } diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/conversion/ServiceGroupConverter.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/conversion/ServiceGroupConverter.java index 734bb845cf16037836b00a1d13d8f4be648f7f9f..bbce5f4f957c5d074bace39e690d3af07095c014 100644 --- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/conversion/ServiceGroupConverter.java +++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/conversion/ServiceGroupConverter.java @@ -95,10 +95,12 @@ public class ServiceGroupConverter { * @return */ public static ServiceGroup unmarshal(byte[] serviceGroupXml) { + try { System.out.println("UNMARSHAL SERVICE GROUP " + new String(serviceGroupXml)); Document serviceGroupDoc = parse(serviceGroupXml); ServiceGroup serviceGroup = getUnmarshaller().unmarshal(serviceGroupDoc, ServiceGroup.class).getValue(); + /* if (serviceGroup!=null && serviceGroup.getParticipantIdentifier()!=null && StringUtils.isBlank(serviceGroup.getParticipantIdentifier().getScheme()) && StringUtils.startsWithAny(serviceGroup.getParticipantIdentifier().getValue(), @@ -106,9 +108,9 @@ public class ServiceGroupConverter { "::"+ EBCORE_IDENTIFIER_PREFIX)){ // normalize participant identifier LOG.info("Normalize ebCore identifier: " + serviceGroup.getParticipantIdentifier().getValue()); - ParticipantIdentifierType participantIdentifierType = Identifiers.asParticipantId(serviceGroup.getParticipantIdentifier().getValue()); + ParticipantIdentifierType participantIdentifierType = Identifiers.asParticipantId(serviceGroup.getParticipantIdentifier().getValue(), allowNullPartcScheme); serviceGroup.setParticipantIdentifier(participantIdentifierType); - } + }*/ return serviceGroup; } catch (ParserConfigurationException | IOException | SAXException | JAXBException ex) { throw new SMPRuntimeException(ErrorCode.XML_PARSE_EXCEPTION,ex,ServiceGroup.class.getName(), ExceptionUtils.getRootCauseMessage(ex)); diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/conversion/ServiceMetadataConverter.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/conversion/ServiceMetadataConverter.java index 6ef551981e2fa44d7afb849deb593651e71b3646..ba80b5245c5af3b26175e1ca7aa2f8a21a904b6c 100644 --- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/conversion/ServiceMetadataConverter.java +++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/conversion/ServiceMetadataConverter.java @@ -99,7 +99,7 @@ public class ServiceMetadataConverter { try { Document serviceMetadataDoc = parse(serviceMetadataXml); ServiceMetadata serviceMetadata = getUnmarshaller().unmarshal(serviceMetadataDoc, ServiceMetadata.class).getValue(); - +/* if (serviceMetadata!=null && serviceMetadata.getServiceInformation()!=null && serviceMetadata.getServiceInformation().getParticipantIdentifier()!=null @@ -109,9 +109,11 @@ public class ServiceMetadataConverter { "::"+Identifiers.EBCORE_IDENTIFIER_PREFIX)){ // normalize participant identifier LOG.info("Normalize ebCore identifier: " + serviceMetadata.getServiceInformation().getParticipantIdentifier().getValue()); - ParticipantIdentifierType participantIdentifierType = Identifiers.asParticipantId(serviceMetadata.getServiceInformation().getParticipantIdentifier().getValue()); + ParticipantIdentifierType participantIdentifierType = Identifiers.asParticipantId( + serviceMetadata.getServiceInformation().getParticipantIdentifier().getValue(),allowEmptyParticipantScheme); + serviceMetadata.getServiceInformation().setParticipantIdentifier(participantIdentifierType); - } + }*/ return serviceMetadata; } catch (SAXException | IOException | ParserConfigurationException | JAXBException ex) { diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/conversion/SmlIdentifierConverter.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/conversion/SmlIdentifierConverter.java index 1cf4afa9c8a3b65cb3d03530b89e01d4bb2e5f99..3bbf56e08cb9c77845967018cfb452f84f4b3146 100644 --- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/conversion/SmlIdentifierConverter.java +++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/conversion/SmlIdentifierConverter.java @@ -29,7 +29,7 @@ public class SmlIdentifierConverter { if (isBlank(smpId)) { throw new IllegalStateException("SMP ID is null or empty"); } - if (participantId == null || isBlank(participantId.getScheme()) || isBlank(participantId.getValue())) { + if (participantId == null || isBlank(participantId.getValue())) { throw new IllegalStateException("Participant Scheme or Id is null or empty"); } diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/dao/ConfigurationDao.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/dao/ConfigurationDao.java index 824b9f511df873726cc87cc1a35dfb316c76fdb3..348a142ac928fc57a4853106fca9e1130665f33d 100644 --- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/dao/ConfigurationDao.java +++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/dao/ConfigurationDao.java @@ -219,15 +219,21 @@ public class ConfigurationDao extends BaseDao<DBConfiguration> { * Application event when an {@code ApplicationContext} gets initialized or refreshed */ @EventListener({ContextRefreshedEvent.class}) - void contextRefreshedEvent() { + protected void contextRefreshedEvent() { + LOG.debug("Application context is initialized: triggered refresh to update all property listeners"); applicationInitialized = true; initiateDate = OffsetDateTime.now(); - updatePropertyListeners(); + reloadPropertiesFromDatabase(); } + /** + * Application event when an application stops {@code ApplicationContext} + */ @EventListener({ContextStoppedEvent.class}) - void contextStopEvent() { + protected void contextStopEvent() { + LOG.debug("Application context is stopped!"); applicationInitialized = false; + initiateDate =null; } private void updatePropertyListeners() { @@ -238,10 +244,14 @@ public class ConfigurationDao extends BaseDao<DBConfiguration> { LOG.debug("Application is not started. The PropertyUpdateEvent is not triggered"); return; } - + LOG.debug("Update all property listeners"); Map<String, PropertyUpdateListener> updateListenerList = getPropertyUpdateListener(); if (updateListenerList != null) { - updateListenerList.forEach(this::updateListener); + for (Map.Entry<String, PropertyUpdateListener> entry : updateListenerList.entrySet()) { + String key = entry.getKey(); + PropertyUpdateListener value = entry.getValue(); + updateListener(key, value); + } } } @@ -255,7 +265,18 @@ public class ConfigurationDao extends BaseDao<DBConfiguration> { private void updateListener(String name, PropertyUpdateListener listener) { LOG.debug("updateListener [{}]", name); Map<SMPPropertyEnum, Object> mapProp = new HashMap<>(); - listener.handledProperties().forEach(prop -> mapProp.put(prop, cachedPropertyValues.get(prop.getProperty()))); + for (SMPPropertyEnum prop : listener.handledProperties()) { + LOG.debug("Put property [{}]", prop.getProperty()); + if (this.cachedPropertyValues == null) { + LOG.error("cachedPropertyValues is FOR SOME REASON NULL "); + } + if (this.cachedPropertyValues != null && this.cachedPropertyValues.containsKey(prop.getProperty())) { + LOG.debug("Put property [{}] value [{}]", prop.getProperty(), this.cachedPropertyValues.get(prop.getProperty())); + mapProp.put(prop, this.cachedPropertyValues.get(prop.getProperty())); + } else { + LOG.debug("Property [{}] does not exist in cached map!", prop.getProperty()); + } + } listener.updateProperties(mapProp); } @@ -281,7 +302,7 @@ public class ConfigurationDao extends BaseDao<DBConfiguration> { } public Map<String, Object> validateConfiguration(Properties properties) { - + LOG.debug("Validate configuration properties."); // test if all mandatory properties exists List<String> lstMissingProperties = new ArrayList<>(); for (SMPPropertyEnum prop : SMPPropertyEnum.values()) { @@ -294,8 +315,6 @@ public class ConfigurationDao extends BaseDao<DBConfiguration> { LOG.error("Missing mandatory properties: [{}]. Fix the SMP configuration!", lstMissingProperties); } // update deprecated values - - properties = updateDeprecatedValues(properties); Map<String, Object> propertyValues = parseProperties(properties); @@ -319,7 +338,6 @@ public class ConfigurationDao extends BaseDao<DBConfiguration> { @Transactional public void updateCurrentEncryptedValues() { - File encryptionKey = (File) cachedPropertyValues.get(ENCRYPTION_FILENAME.getProperty()); for (SMPPropertyEnum prop : SMPPropertyEnum.values()) { String value = getProperty(cachedProperties, prop); if (prop.isEncrypted() && !StringUtils.isBlank(value) && value.startsWith(SecurityUtils.DECRYPTED_TOKEN_PREFIX)) { @@ -331,6 +349,7 @@ public class ConfigurationDao extends BaseDao<DBConfiguration> { protected void validateBasicProperties(Properties properties) { + LOG.debug("Validated the basic configuration properties."); // retrieve and validate configuration dir and encryption filename // because they are important for 'parsing and validating' other parameters String configurationDir = getProperty(properties, CONFIGURATION_DIR); @@ -365,15 +384,16 @@ public class ConfigurationDao extends BaseDao<DBConfiguration> { /** * Method validates if new value for deprecated value is already set. If not it set the value from deprecated property if exists! + * * @param properties * @return */ - public Properties updateDeprecatedValues(Properties properties){ + public Properties updateDeprecatedValues(Properties properties) { if (!properties.containsKey(EXTERNAL_TLS_AUTHENTICATION_CLIENT_CERT_HEADER_ENABLED.getProperty()) - && properties.containsKey(CLIENT_CERT_HEADER_ENABLED_DEPRECATED.getProperty())){ + && properties.containsKey(CLIENT_CERT_HEADER_ENABLED_DEPRECATED.getProperty())) { properties.setProperty(EXTERNAL_TLS_AUTHENTICATION_CLIENT_CERT_HEADER_ENABLED.getProperty(), - properties.getProperty(CLIENT_CERT_HEADER_ENABLED_DEPRECATED.getProperty()) ); + properties.getProperty(CLIENT_CERT_HEADER_ENABLED_DEPRECATED.getProperty())); } return properties; @@ -381,7 +401,7 @@ public class ConfigurationDao extends BaseDao<DBConfiguration> { protected Map<String, Object> parseProperties(Properties properties) { - + LOG.debug("Parse configuration properties."); // retrieve and validate configuration dir and encryption filename // because they are important for 'parsing and validating' other parameters validateBasicProperties(properties); @@ -391,7 +411,7 @@ public class ConfigurationDao extends BaseDao<DBConfiguration> { File configFolder = new File(configurationDir); File encryptionKeyFile = new File(configurationDir, encryptionKeyFilename); - HashMap propertyValues = new HashMap(); + HashMap<String, Object> propertyValues = new HashMap(); // put the first two values propertyValues.put(CONFIGURATION_DIR.getProperty(), configFolder); propertyValues.put(ENCRYPTION_FILENAME.getProperty(), encryptionKeyFile); @@ -418,6 +438,7 @@ public class ConfigurationDao extends BaseDao<DBConfiguration> { } propertyValues.put(prop.getProperty(), parsedProperty); } + LOG.debug("Parsed [{}] configuration properties.", propertyValues.size()); return propertyValues; } diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/dao/ServiceGroupDao.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/dao/ServiceGroupDao.java index 52888adb2d09edffe00ebe945e4b85656d5a88d0..05cb2a95c124e31dee71178e98c02f8ec9c0c96d 100644 --- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/dao/ServiceGroupDao.java +++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/dao/ServiceGroupDao.java @@ -49,7 +49,7 @@ public class ServiceGroupDao extends BaseDao<DBServiceGroup> { try { - TypedQuery<DBServiceGroup> query = memEManager.createNamedQuery("DBServiceGroup.getServiceGroup", DBServiceGroup.class); + TypedQuery<DBServiceGroup> query = memEManager.createNamedQuery("DBServiceGroup.getServiceGroupByIdentifier", DBServiceGroup.class); query.setParameter("participantIdentifier", participantId); query.setParameter("participantScheme", schema); DBServiceGroup res = query.getSingleResult(); diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/model/DBAlert.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/model/DBAlert.java index a45748e326fc53d9d8b554cdec83ff5517b7bfe6..1caf1a0a2a4d454e489c984e43da05b3b10a353d 100644 --- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/model/DBAlert.java +++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/model/DBAlert.java @@ -166,11 +166,6 @@ public class DBAlert extends BaseEntity { return properties; } - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), id, alertType, reportingTime, alertStatus, alertLevel); - } - @PreUpdate @PrePersist public void prePersistUpdate() { diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/model/DBServiceGroup.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/model/DBServiceGroup.java index c99b8838217943fcbcfb3393b729cce1e0eff048..52a97ff9e89f83e4e56896b6f84bd9e0044a0224 100644 --- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/model/DBServiceGroup.java +++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/model/DBServiceGroup.java @@ -31,9 +31,10 @@ import java.util.*; @org.hibernate.annotations.Table(appliesTo = "SMP_SERVICE_GROUP", comment = "Service group data - Identifier and scheme") @NamedQueries({ @NamedQuery(name = "DBServiceGroup.getServiceGroupByID", query = "SELECT d FROM DBServiceGroup d WHERE d.id = :id"), - @NamedQuery(name = "DBServiceGroup.getServiceGroup", query = "SELECT d FROM DBServiceGroup d WHERE d.participantIdentifier = :participantIdentifier and d.participantScheme = :participantScheme"), - @NamedQuery(name = "DBServiceGroup.getServiceGroupList", query = "SELECT d FROM DBServiceGroup d WHERE d.participantIdentifier = :participantIdentifier and d.participantScheme = :participantScheme"), - @NamedQuery(name = "DBServiceGroup.deleteById", query = "DELETE FROM DBServiceGroup d WHERE d.id = :id"), + @NamedQuery(name = "DBServiceGroup.getServiceGroupByIdentifier", query = "SELECT d FROM DBServiceGroup d WHERE d.participantIdentifier = :participantIdentifier " + + " AND (:participantScheme IS NULL AND d.participantScheme IS NULL " + + " OR d.participantScheme = :participantScheme)"), + @NamedQuery(name = "DBServiceGroup.deleteById", query = "DELETE FROM DBServiceGroup d WHERE d.id = :id"), }) @NamedNativeQueries({ @NamedNativeQuery(name = "DBServiceGroup.deleteAllOwnerships", query = "DELETE FROM SMP_OWNERSHIP WHERE FK_SG_ID=:serviceGroupId") @@ -69,7 +70,7 @@ public class DBServiceGroup extends BaseEntity { @Column(name = "PARTICIPANT_IDENTIFIER", length = CommonColumnsLengths.MAX_PARTICIPANT_IDENTIFIER_VALUE_LENGTH, nullable = false) String participantIdentifier; - @Column(name = "PARTICIPANT_SCHEME", length = CommonColumnsLengths.MAX_PARTICIPANT_IDENTIFIER_SCHEME_LENGTH, nullable = false) + @Column(name = "PARTICIPANT_SCHEME", length = CommonColumnsLengths.MAX_PARTICIPANT_IDENTIFIER_SCHEME_LENGTH) String participantScheme; @@ -214,6 +215,15 @@ public class DBServiceGroup extends BaseEntity { Objects.equals(participantScheme, that.participantScheme); } + @Override + public String toString() { + return new StringJoiner(", ", DBServiceGroup.class.getSimpleName() + "[", "]") + .add("id=" + id) + .add("participantIdentifier='" + participantIdentifier + "'") + .add("participantScheme='" + participantScheme + "'") + .toString(); + } + @Override public int hashCode() { return Objects.hash(super.hashCode(), id, participantIdentifier, participantScheme); diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/model/DBServiceGroupDomain.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/model/DBServiceGroupDomain.java index 0f23e6e70a4ae2eea437ff6d956c3a62f2600724..a9c36673513eca8be01e1b2ccbd3df9949f712db 100644 --- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/model/DBServiceGroupDomain.java +++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/model/DBServiceGroupDomain.java @@ -20,7 +20,10 @@ import java.util.Objects; @NamedNativeQueries({ @NamedNativeQuery(name = "DBServiceGroupDomain.getServiceGroupDomain", query = "SELECT sgd.* FROM SMP_DOMAIN dmn INNER JOIN SMP_SERVICE_GROUP_DOMAIN sgd ON sgd.FK_DOMAIN_ID = dmn.id " + " INNER JOIN SMP_SERVICE_GROUP sg ON sg.ID = sgd.FK_SG_ID " + - " where sg.PARTICIPANT_IDENTIFIER = :participantIdentifier AND sg.PARTICIPANT_SCHEME=:participantScheme and dmn.DOMAIN_CODE =:domainCode", resultClass = DBServiceGroupDomain.class), + " where sg.PARTICIPANT_IDENTIFIER = :participantIdentifier " + + " AND (:participantScheme IS NULL AND sg.PARTICIPANT_SCHEME IS NULL" + + " OR sg.PARTICIPANT_SCHEME=:participantScheme)" + + "and dmn.DOMAIN_CODE =:domainCode", resultClass = DBServiceGroupDomain.class), @NamedNativeQuery(name = "DBServiceGroupDomain.getOwnedServiceGroupDomainForUserIdAndServiceMetadataId", query = "SELECT sgd.* FROM SMP_SERVICE_GROUP_DOMAIN sgd" + " INNER JOIN SMP_SERVICE_GROUP sg ON sg.ID = sgd.FK_SG_ID " + diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/ui/SmpConfigRO.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/ui/SmpConfigRO.java index cbd1eae44668166eab338e2930f2c7bc8fce3dd1..1bfba5ae4e2063456bfe8fda6265f96f21b4bc08 100644 --- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/ui/SmpConfigRO.java +++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/ui/SmpConfigRO.java @@ -8,6 +8,7 @@ public class SmpConfigRO implements Serializable { boolean smlIntegrationOn; boolean smlParticipantMultiDomainOn; boolean concatEBCorePartyId; + boolean partyIDSchemeMandatory; String participantSchemaRegExp; String participantSchemaRegExpMessage; @@ -56,6 +57,14 @@ public class SmpConfigRO implements Serializable { this.participantSchemaRegExpMessage = participantSchemaRegExpMessage; } + public boolean isPartyIDSchemeMandatory() { + return partyIDSchemeMandatory; + } + + public void setPartyIDSchemeMandatory(boolean partyIDSchemeMandatory) { + this.partyIDSchemeMandatory = partyIDSchemeMandatory; + } + public String getPasswordValidationRegExp() { return passwordValidationRegExp; } diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/ui/enums/SMPPropertyEnum.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/ui/enums/SMPPropertyEnum.java index 8442ec4af076edfcbcf24345cfc7c45e813eefab..b02931eddc6020c911b9329467cc1300573eb889 100644 --- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/ui/enums/SMPPropertyEnum.java +++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/ui/enums/SMPPropertyEnum.java @@ -15,7 +15,7 @@ public enum SMPPropertyEnum { HTTP_FORWARDED_HEADERS_ENABLED("smp.http.forwarded.headers.enabled", "false", "Use (value true) or remove (value false) forwarded headers! There are security considerations for forwarded headers since an application cannot know if the headers were added by a proxy, as intended, or by a malicious client.", false, false, false, BOOLEAN), HTTP_HSTS_MAX_AGE("smp.http.httpStrictTransportSecurity.maxAge", "31536000", "How long(in seconds) HSTS should last in the browser's cache(default one year)", false, false, true, INTEGER), - HTTP_HEADER_SEC_POLICY("smp.http.header.security.policy", "default-src 'self'; script-src 'self'; child-src 'none'; connect-src 'self'; img-src 'self'; style-src 'self' 'unsafe-inline'; frame-ancestors 'self'; form-action 'self';", "Content Security Policy (CSP)", false, false, true, STRING), + HTTP_HEADER_SEC_POLICY("smp.http.header.security.policy", "", "Content Security Policy (CSP) default-src 'self'; script-src 'self'; connect-src 'self'; img-src 'self'; style-src 'self' 'unsafe-inline'; frame-ancestors 'self'; form-action 'self';", false, false, true, STRING), // http proxy configuration HTTP_PROXY_HOST("smp.proxy.host", "", "The http proxy host", false, false, false, STRING), HTTP_NO_PROXY_HOSTS("smp.noproxy.hosts", "localhost|127.0.0.1", "list of nor proxy hosts. Ex.: localhost|127.0.0.1", false, false, false, STRING), @@ -23,11 +23,13 @@ public enum SMPPropertyEnum { HTTP_PROXY_PORT("smp.proxy.port", "80", "The http proxy port", false, false, false, INTEGER), HTTP_PROXY_USER("smp.proxy.user", "", "The proxy user", false, false, false, STRING), - PARTC_SCH_REGEXP("identifiersBehaviour.ParticipantIdentifierScheme.validationRegex", "^((?!^.{26})([a-z0-9]+-[a-z0-9]+-[a-z0-9]+)|urn:oasis:names:tc:ebcore:partyid-type:(iso6523|unregistered)(:.+)?$)", "Participant Identifier Schema of each PUT ServiceGroup request is validated against this schema.", false, false, false, REGEXP), + PARTC_SCH_REGEXP("identifiersBehaviour.ParticipantIdentifierScheme.validationRegex", "^$|^(?!^.{26})([a-z0-9]+-[a-z0-9]+-[a-z0-9]+)$|^urn:oasis:names:tc:ebcore:partyid-type:(iso6523|unregistered)(:.+)?$", "Participant Identifier Schema of each PUT ServiceGroup request is validated against this schema.", false, false, false, REGEXP), PARTC_SCH_REGEXP_MSG("identifiersBehaviour.ParticipantIdentifierScheme.validationRegexMessage", "Participant scheme must start with:urn:oasis:names:tc:ebcore:partyid-type:(iso6523:|unregistered:) OR must be up to 25 characters long with form [domain]-[identifierArea]-[identifierType] (ex.: 'busdox-actorid-upis') and may only contain the following characters: [a-z0-9].", "Error message for UI", false, false, false, STRING), + PARTC_SCH_MANDATORY("identifiersBehaviour.scheme.mandatory", "true", "Scheme for participant identifier is mandatory", false, false, false, BOOLEAN), + PARTC_EBCOREPARTYID_CONCATENATE("identifiersBehaviour.ParticipantIdentifierScheme.ebCoreId.concatenate", - "true", "Concatenate ebCore party id in XML responses <ParticipantIdentifier>urn:oasis:names:tc:ebcore:partyid-type:unregistered:test-ebcore-id</ParticipantIdentifier>", false, false, false, BOOLEAN), + "false", "Concatenate ebCore party id in XML responses <ParticipantIdentifier>urn:oasis:names:tc:ebcore:partyid-type:unregistered:test-ebcore-id</ParticipantIdentifier>", false, false, false, BOOLEAN), CS_PARTICIPANTS("identifiersBehaviour.caseSensitive.ParticipantIdentifierSchemes", "sensitive-participant-sc1|sensitive-participant-sc2", "Specifies schemes of participant identifiers that must be considered CASE-SENSITIVE.", false, false, false, LIST_STRING), CS_DOCUMENTS("identifiersBehaviour.caseSensitive.DocumentIdentifierSchemes", "casesensitive-doc-scheme1|casesensitive-doc-scheme2", "Specifies schemes of document identifiers that must be considered CASE-SENSITIVE.", false, false, false, LIST_STRING), diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/exceptions/ErrorCode.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/exceptions/ErrorCode.java index 6dc32bbbb1c80ee426576f4cc9e7137e8eae8e4a..2f8a9356e4690ab8be8abd50f842c08b36b8973d 100644 --- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/exceptions/ErrorCode.java +++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/exceptions/ErrorCode.java @@ -59,7 +59,7 @@ public enum ErrorCode { JAXB_INITIALIZATION (500,"SMP:511",ErrorBusinessCode.TECHNICAL, "Could not create Unmarshaller for class %s!"), XML_PARSE_EXCEPTION (500,"SMP:512",ErrorBusinessCode.TECHNICAL, "Error occurred while parsing input stream for %s. Error: %s!"), - INVALID_REQUEST(500,"SMP:513",ErrorBusinessCode.TECHNICAL, "Invalid request %s. Error: %s!"), + INVALID_REQUEST(400,"SMP:513",ErrorBusinessCode.TECHNICAL, "Invalid request %s. Error: %s!"), INTERNAL_ERROR (500,"SMP:514",ErrorBusinessCode.TECHNICAL, "Internal error %s. Error: %s!"), CERTIFICATE_ERROR (500,"SMP:515",ErrorBusinessCode.TECHNICAL, "Certificate error %s. Error: %s!"), CONFIGURATION_ERROR (500,"SMP:516",ErrorBusinessCode.TECHNICAL, "Configuration error: %s!"), diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ConfigurationService.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ConfigurationService.java index c5b25fb48a368d632386d45394503c6f4f8be793..523f0b3de3af23564e8d7ed540c93071ae130291 100644 --- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ConfigurationService.java +++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ConfigurationService.java @@ -133,6 +133,10 @@ public class ConfigurationService { return (List<String>) configurationDAO.getCachedPropertyValue(CS_PARTICIPANTS); } + public Boolean getParticipantSchemeMandatory() { + return (Boolean) configurationDAO.getCachedPropertyValue(PARTC_SCH_MANDATORY); + } + public boolean isProxyEnabled() { String proxyHost = configurationDAO.getCachedProperty(HTTP_PROXY_HOST); return !StringUtils.isBlank(proxyHost); diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/PayloadValidatorService.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/PayloadValidatorService.java new file mode 100644 index 0000000000000000000000000000000000000000..17dc306ec188686f8635e42f6afd03646db1f673 --- /dev/null +++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/PayloadValidatorService.java @@ -0,0 +1,59 @@ +package eu.europa.ec.edelivery.smp.services; + +import eu.europa.ec.edelivery.smp.exceptions.ErrorCode; +import eu.europa.ec.edelivery.smp.exceptions.SMPRuntimeException; +import eu.europa.ec.edelivery.smp.logging.SMPLogger; +import eu.europa.ec.edelivery.smp.logging.SMPLoggerFactory; +import eu.europa.ec.smp.spi.PayloadValidatorSpi; +import eu.europa.ec.smp.spi.exceptions.PayloadValidatorSpiException; +import org.apache.commons.lang3.exception.ExceptionUtils; +import org.springframework.stereotype.Service; + +import java.io.InputStream; +import java.util.Collections; +import java.util.List; +import java.util.Optional; + + +/** + * @author Joze Rihtarsic + * @since 4.2 + * <p> + * PayloadValidatorService delegates validation to external (SPI) PayloadValidatorSpi implementations. + * This SPI interface is intended to allow antivirus validation using third-party antivirus software. + */ +@Service +public class PayloadValidatorService { + private static final SMPLogger LOG = SMPLoggerFactory.getLogger(PayloadValidatorService.class); + List<PayloadValidatorSpi> payloadValidatorSpiList; + + public PayloadValidatorService(Optional<List<PayloadValidatorSpi>> optPayloadValidatorSpiList) { + this.payloadValidatorSpiList = optPayloadValidatorSpiList.isPresent() ? optPayloadValidatorSpiList.get() : Collections.emptyList(); + } + + /** + * Validates the SMP payload with the registered PayloadValidatorSpi validators. + * + * @param payload The payload data to be validated + * @param mimeType The payload mime type + * @throws PayloadValidatorSpiException in case the validation does not pass + */ + public void validateUploadedContent(InputStream payload, String mimeType) { + if (payloadValidatorSpiList.isEmpty()) { + LOG.debug("No PayloadValidatorSpi registered. Skip validation!"); + return; + } + LOG.debug("Validate uploaded content"); + try { + for (PayloadValidatorSpi validatorSpi : payloadValidatorSpiList) { + LOG.debug("Validate payload with spi: [{}]!", validatorSpi); + validatorSpi.validatePayload(payload, mimeType); + } + } catch (PayloadValidatorSpiException e) { + throw new SMPRuntimeException(ErrorCode.INVALID_REQUEST, "Content validation failed", ExceptionUtils.getRootCauseMessage(e),e); + } + } + + ; + +} diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UITruststoreService.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UITruststoreService.java index 33977c8b6868e2c0b76dc9c5f26351d2c1e6192a..14b50758c79cac31fd7f2b532939464ed84ae85c 100644 --- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UITruststoreService.java +++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UITruststoreService.java @@ -139,7 +139,7 @@ public class UITruststoreService { try { x509Certificate.checkValidity(); } catch (CertificateExpiredException | CertificateNotYetValidException ex) { - LOG.warn("Certificate: '{}' from truststore is not valid anymore!"); + LOG.warn("Certificate: [{}] from truststore is not valid anymore!", alias); } } diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/utils/ExtLibraryClassLoader.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/utils/ExtLibraryClassLoader.java new file mode 100644 index 0000000000000000000000000000000000000000..faaeb1dba3c29516937994f282ab2ef6c465fcbc --- /dev/null +++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/utils/ExtLibraryClassLoader.java @@ -0,0 +1,60 @@ +package eu.europa.ec.edelivery.smp.utils; + +import com.google.common.collect.Lists; +import eu.europa.ec.edelivery.smp.logging.SMPLogger; +import eu.europa.ec.edelivery.smp.logging.SMPLoggerFactory; + +import java.io.File; +import java.net.MalformedURLException; +import java.net.URI; +import java.net.URL; +import java.net.URLClassLoader; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author Cosmin Baciu + * @author Joze Rihtarsic + * @since 4.2 + * + * ExtLibraryClassLoader extends URLClassLoader for loading the SMP's SPI extensions. + * The class loader implementation is heavily inspired by the Domibus PluginClassLoader. + */ +public class ExtLibraryClassLoader extends URLClassLoader { + + private static final SMPLogger LOG = SMPLoggerFactory.getLogger(ExtLibraryClassLoader.class); + + protected File libraryFolder; + + public ExtLibraryClassLoader(File libraryFolder, ClassLoader parent) throws MalformedURLException { + super(discoverLibraries(libraryFolder), parent); + this.libraryFolder = libraryFolder; + } + + /** + * discovery libraries in the folder to extract the jar files url. + * + * @param libraryDirectory with the SMP library extensions. + * @return the urls of the jar files. + * @throws MalformedURLException + */ + protected static URL[] discoverLibraries(File libraryDirectory) throws MalformedURLException { + + final List<URI> jarUris = Arrays.asList( + libraryDirectory.listFiles((dir, name) -> name.toLowerCase().endsWith(".jar"))) + .stream() + .map(File::toURI) + .collect(Collectors.toList()); + + final URL[] urls = new URL[jarUris.size()]; + for (int i = 0; i < jarUris.size(); i++) { + urls[i] = jarUris.get(i).toURL(); + LOG.info("Adding the following library to the classpath:[{}] ", urls[i]); + } + return urls; + } + + public File getLibraryFolder() { + return libraryFolder; + } +} diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/conversion/CaseSensitivityNormalizerTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/conversion/CaseSensitivityNormalizerTest.java index b336e07bc4164813efc82cbb4028deb2114a8dd6..65ac2052f913ef0d15c48f50a748f4cd57781067 100644 --- a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/conversion/CaseSensitivityNormalizerTest.java +++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/conversion/CaseSensitivityNormalizerTest.java @@ -38,9 +38,9 @@ public class CaseSensitivityNormalizerTest { @Before public void init() { - normalizer = new CaseSensitivityNormalizer(); ConfigurationService configurationService = Mockito.mock(ConfigurationService.class); - ReflectionTestUtils.setField(normalizer, "configurationService", configurationService); + normalizer = new CaseSensitivityNormalizer(configurationService); + Mockito.doReturn(asList(new String[]{"case-SENSITIVE-scheme-1", "Case-SENSITIVE-Scheme-2"})).when(configurationService).getCaseSensitiveDocumentScheme(); Mockito.doReturn(asList(new String[]{"case-sensitive-scheme-1", "Case-SENSITIVE-Scheme-2"})).when(configurationService).getCaseSensitiveParticipantScheme(); diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/conversion/SmlIdentifierConverterTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/conversion/SmlIdentifierConverterTest.java index c066be5f280f847c8bde29726a889a38d307be97..d7c5c23e70f205dcffe1f3956fdfb5618be95d14 100644 --- a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/conversion/SmlIdentifierConverterTest.java +++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/conversion/SmlIdentifierConverterTest.java @@ -18,6 +18,7 @@ import org.junit.Test; import org.oasis_open.docs.bdxr.ns.smp._2016._05.ParticipantIdentifierType; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; /** * Created by gutowpa on 08/01/2018. @@ -51,13 +52,17 @@ public class SmlIdentifierConverterTest { SmlIdentifierConverter.toBusdoxParticipantId(participantId, null); } - @Test(expected = IllegalStateException.class) - public void negativeCaseMissingScheme() { + @Test + public void positiveCaseWithNullScheme() { //given ParticipantIdentifierType participantId = new ParticipantIdentifierType(ID_VALUE, null); //when - SmlIdentifierConverter.toBusdoxParticipantId(participantId, SMP_ID); + ServiceMetadataPublisherServiceForParticipantType result = SmlIdentifierConverter.toBusdoxParticipantId(participantId, SMP_ID); + //then + assertEquals(SMP_ID, result.getServiceMetadataPublisherID()); + assertNull(result.getParticipantIdentifier().getScheme()); + assertEquals(ID_VALUE, result.getParticipantIdentifier().getValue()); } @Test(expected = IllegalStateException.class) diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/data/dao/ServiceGroupDaoIntegrationBase.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/data/dao/AbstractServiceGroupDaoIntegrationTest.java similarity index 97% rename from smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/data/dao/ServiceGroupDaoIntegrationBase.java rename to smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/data/dao/AbstractServiceGroupDaoIntegrationTest.java index 3dfa1a99a79a83abf22afcf3a9b3ecbdb6b1b7a1..ca22df9cfcd3772ac077178fcf1b9d9de82708e9 100644 --- a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/data/dao/ServiceGroupDaoIntegrationBase.java +++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/data/dao/AbstractServiceGroupDaoIntegrationTest.java @@ -22,7 +22,7 @@ import static eu.europa.ec.edelivery.smp.testutil.TestConstants.*; * @since 4.1 */ -public abstract class ServiceGroupDaoIntegrationBase extends AbstractBaseDao{ +public abstract class AbstractServiceGroupDaoIntegrationTest extends AbstractBaseDao{ @Autowired ServiceGroupDao testInstance; diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/data/dao/ServiceGroupDaoIntegrationTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/data/dao/ServiceGroupDaoIntegrationTest.java index f79eeb416d0382c89c4355665e7c2cde4f3a85ee..e12d044020dbece6571929dc469a29bda29612b9 100644 --- a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/data/dao/ServiceGroupDaoIntegrationTest.java +++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/data/dao/ServiceGroupDaoIntegrationTest.java @@ -3,15 +3,10 @@ package eu.europa.ec.edelivery.smp.data.dao; import eu.europa.ec.edelivery.smp.data.model.DBDomain; import eu.europa.ec.edelivery.smp.data.model.DBServiceGroup; import eu.europa.ec.edelivery.smp.data.model.DBUser; -import eu.europa.ec.edelivery.smp.data.ui.ServiceGroupRO; -import eu.europa.ec.edelivery.smp.data.ui.ServiceResult; import eu.europa.ec.edelivery.smp.services.ui.filters.ServiceGroupFilter; import eu.europa.ec.edelivery.smp.testutil.TestConstants; import eu.europa.ec.edelivery.smp.testutil.TestDBUtils; import org.junit.Test; -import org.junit.runner.RunWith; -import org.oasis_open.docs.bdxr.ns.smp._2016._05.ServiceMetadata; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import javax.transaction.Transactional; import java.util.Arrays; @@ -29,7 +24,7 @@ import static org.junit.Assert.*; * @author Joze Rihtarsic * @since 4.1 */ -public class ServiceGroupDaoIntegrationTest extends ServiceGroupDaoIntegrationBase { +public class ServiceGroupDaoIntegrationTest extends AbstractServiceGroupDaoIntegrationTest { @Test @Transactional @@ -54,6 +49,30 @@ public class ServiceGroupDaoIntegrationTest extends ServiceGroupDaoIntegrationBa assertEquals(1, res.getServiceGroupDomains().size()); // domain must be loaded assertEquals(d.getDomainCode(), res.getServiceGroupDomains().get(0).getDomain().getDomainCode()); // test loaded Domain + } + @Test + @Transactional + public void persistServiceGroupNullScheme() { + // given + DBDomain d = domainDao.getDomainByCode(TEST_DOMAIN_CODE_1).get(); + + DBServiceGroup sg = new DBServiceGroup(); + sg.setParticipantIdentifier(TEST_SG_ID_1); + sg.setParticipantScheme(null); + sg.addDomain(d); + + // when + testInstance.persistFlushDetach(sg); + + // then + DBServiceGroup res = testInstance.findServiceGroup(TEST_SG_ID_1, null).get(); + assertTrue(sg != res); // test different object instance + assertNotNull(res.getId()); + assertEquals(TEST_SG_ID_1, res.getParticipantIdentifier()); // test equal method - same entity + assertNull( res.getParticipantScheme()); // test equal method - same entity + assertEquals(1, res.getServiceGroupDomains().size()); // domain must be loaded + assertEquals(d.getDomainCode(), res.getServiceGroupDomains().get(0).getDomain().getDomainCode()); // test loaded Domain + } @Test diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/data/dao/ServiceGroupDaoMetadataIntegrationTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/data/dao/ServiceGroupDaoMetadataIntegrationTest.java index 86c1527ce90a32bcfe275603bf93bdf75bd1133a..df70cbf0e148f5b85fb8ce181f70edcef351df0a 100644 --- a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/data/dao/ServiceGroupDaoMetadataIntegrationTest.java +++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/data/dao/ServiceGroupDaoMetadataIntegrationTest.java @@ -5,8 +5,6 @@ import eu.europa.ec.edelivery.smp.data.model.DBServiceGroup; import eu.europa.ec.edelivery.smp.data.model.DBServiceMetadata; import eu.europa.ec.edelivery.smp.testutil.TestDBUtils; import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import javax.transaction.Transactional; import java.util.Arrays; @@ -23,7 +21,7 @@ import static org.junit.Assert.*; * @author Joze Rihtarsic * @since 4.1 */ -public class ServiceGroupDaoMetadataIntegrationTest extends ServiceGroupDaoIntegrationBase { +public class ServiceGroupDaoMetadataIntegrationTest extends AbstractServiceGroupDaoIntegrationTest { @Test diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/data/dao/ServiceGroupDaoOwnershipIntegrationTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/data/dao/ServiceGroupDaoOwnershipIntegrationTest.java index fce192d71160267ad5ad255480518617cf7e6728..5cc714d6a77ca33dabc674076f08d70de465b567 100644 --- a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/data/dao/ServiceGroupDaoOwnershipIntegrationTest.java +++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/data/dao/ServiceGroupDaoOwnershipIntegrationTest.java @@ -5,8 +5,6 @@ import eu.europa.ec.edelivery.smp.data.model.DBUser; import eu.europa.ec.edelivery.smp.testutil.TestConstants; import eu.europa.ec.edelivery.smp.testutil.TestDBUtils; import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import javax.transaction.Transactional; import java.util.Optional; @@ -22,7 +20,7 @@ import static org.junit.Assert.*; * @author Joze Rihtarsic * @since 4.1 */ -public class ServiceGroupDaoOwnershipIntegrationTest extends ServiceGroupDaoIntegrationBase { +public class ServiceGroupDaoOwnershipIntegrationTest extends AbstractServiceGroupDaoIntegrationTest { @Test diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/AbstractServiceIntegrationTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/AbstractServiceIntegrationTest.java index 305667ef7ade735447dd3f649879f7f4db887b75..1544e94e4d475cd6088585c6a2d25cd41e9f177e 100644 --- a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/AbstractServiceIntegrationTest.java +++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/AbstractServiceIntegrationTest.java @@ -126,6 +126,16 @@ public abstract class AbstractServiceIntegrationTest { sg2d1.getUsers().add(u1); sg2d1.addDomain(testDomain01); serviceGroupDao.update(sg2d1); + + + DBServiceGroup sg2NoScheme = TestDBUtils.createDBServiceGroup(TEST_SG_ID_NO_SCHEME, null); + DBServiceMetadata sg1mdNoScheme = TestDBUtils.createDBServiceMetadata(TEST_SG_ID_NO_SCHEME, null, + TEST_DOC_ID_1, TEST_DOC_SCHEMA_1); + sg2NoScheme.addDomain(testDomain01); + sg2NoScheme.getServiceGroupDomains().get(0).addServiceMetadata(sg1mdNoScheme); + sg2NoScheme.getUsers().add(u1); + sg2NoScheme.getUsers().add(u2); + serviceGroupDao.persistFlushDetach(sg2NoScheme); } /** diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/DomainServiceSMLTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/DomainServiceSMLTest.java index 2780710d4333f385dc73d74f7bf529b0f523f751..24bab3dac6eedc09cb83a2b916426768e1c86e5c 100644 --- a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/DomainServiceSMLTest.java +++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/DomainServiceSMLTest.java @@ -131,24 +131,26 @@ public class DomainServiceSMLTest extends AbstractServiceIntegrationTest { * Users: USERNAME_1, USER_CERT_2 * ServiceGroup1: TEST_SG_ID_1, TEST_SG_SCHEMA_1 * - Domain: TEST_DOMAIN_CODE_1 - * - Owners: USERNAME_1, USER_CERT_2 - * - Metadata: - * - TEST_DOC_ID_1, TEST_DOC_SCHEMA_1 - * - * * ServiceGroup2: TEST_SG_ID_2, TEST_SG_SCHEMA_2 * - Domain: TEST_DOMAIN_CODE_1 * - Owners: USERNAME_1 * - Metadata: / + * ServiceGroup3: TEST_SG_ID_NO_SCHEME, null + * - Domain: TEST_DOMAIN_CODE_1 + * - Owners: USERNAME_1, USER_CERT_2 + * - Metadata: / */ DBDomain testDomain01 = domainDao.getDomainByCode(TestConstants.TEST_DOMAIN_CODE_1).get(); DBServiceGroupDomain serviceGroupDomain = serviceGroupDao.findServiceGroupDomain( TEST_SG_ID_1, TEST_SG_SCHEMA_1, TEST_DOMAIN_CODE_1).get(); DBServiceGroupDomain serviceGroupDomain2 = serviceGroupDao .findServiceGroupDomain(TEST_SG_ID_2, TEST_SG_SCHEMA_2, TEST_DOMAIN_CODE_1).get(); + DBServiceGroupDomain serviceGroupDomain3 = serviceGroupDao + .findServiceGroupDomain(TEST_SG_ID_NO_SCHEME, null, TEST_DOMAIN_CODE_1).get(); assertFalse(testDomain01.isSmlRegistered()); assertFalse(serviceGroupDomain.isSmlRegistered()); assertFalse(serviceGroupDomain2.isSmlRegistered()); + assertFalse(serviceGroupDomain3.isSmlRegistered()); // when testInstance.registerDomainAndParticipants(testDomain01); @@ -158,20 +160,24 @@ public class DomainServiceSMLTest extends AbstractServiceIntegrationTest { TEST_SG_ID_1, TEST_SG_SCHEMA_1, TEST_DOMAIN_CODE_1).get(); serviceGroupDomain2 = serviceGroupDao .findServiceGroupDomain(TEST_SG_ID_2, TEST_SG_SCHEMA_2, TEST_DOMAIN_CODE_1).get(); + serviceGroupDomain3 = serviceGroupDao + .findServiceGroupDomain(TEST_SG_ID_NO_SCHEME, null, TEST_DOMAIN_CODE_1).get(); + assertTrue(testDomain01.isSmlRegistered()); assertTrue(serviceGroupDomain.isSmlRegistered()); assertTrue(serviceGroupDomain2.isSmlRegistered()); + assertTrue(serviceGroupDomain3.isSmlRegistered()); // one sml domain create and two participant create was called assertEquals(1, integrationMock.getSmpManagerClientMocks().size()); verify(integrationMock.getSmpManagerClientMocks().get(0)).create(any()); Mockito.verifyNoMoreInteractions(integrationMock.getSmpManagerClientMocks().toArray()); - assertEquals(2, integrationMock.getParticipantManagmentClientMocks().size()); + assertEquals(3, integrationMock.getParticipantManagmentClientMocks().size()); verify(integrationMock.getParticipantManagmentClientMocks().get(0)).create(any()); verify(integrationMock.getParticipantManagmentClientMocks().get(1)).create(any()); + verify(integrationMock.getParticipantManagmentClientMocks().get(2)).create(any()); Mockito.verifyNoMoreInteractions(integrationMock.getParticipantManagmentClientMocks().toArray()); - } @Test diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/SMLIntegrationServiceTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/SMLIntegrationServiceTest.java index 8dd0a457be3cf12f15a026fd0dbe7d6a372b009b..763004d0bc1e1bbb3d78205fc55cfa7bb74da8f2 100644 --- a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/SMLIntegrationServiceTest.java +++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/SMLIntegrationServiceTest.java @@ -139,6 +139,24 @@ public class SMLIntegrationServiceTest extends AbstractServiceIntegrationTest { } + @Test + public void registerParticipantNullScheme() throws NotFoundFault, UnauthorizedFault, InternalErrorFault, BadRequestFault { + /* given (init database - check setup) + * Domain: TEST_DOMAIN_CODE_1 + * Users: USERNAME_1, USER_CERT_2 + * ServiceGroup1: TEST_SG_ID_NO_SCHEME, null + * - Domain: TEST_DOMAIN_CODE_1 + */ + // when + testInstance.registerParticipant(TEST_SG_ID_NO_SCHEME,null,TEST_DOMAIN_CODE_1 ); + + //then -- expect on call + assertEquals(1, integrationMock.getParticipantManagmentClientMocks().size()); + verify(integrationMock.getParticipantManagmentClientMocks().get(0)).create(any()); + Mockito.verifyNoMoreInteractions(integrationMock.getParticipantManagmentClientMocks().toArray()); + + } + @Test public void unRegisterParticipant() throws NotFoundFault, UnauthorizedFault, InternalErrorFault, BadRequestFault { /* given (init database - check setup) diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ServiceGroupServiceSingleDomainIntegrationTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ServiceGroupServiceSingleDomainIntegrationTest.java index 94c52926f98b027a4af6e8e58cebd1626f63682b..8d450fa490127a7de350039bae9d7fc22a69c6e3 100644 --- a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ServiceGroupServiceSingleDomainIntegrationTest.java +++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ServiceGroupServiceSingleDomainIntegrationTest.java @@ -167,7 +167,7 @@ public class ServiceGroupServiceSingleDomainIntegrationTest extends AbstractServ expectedExeption.expect(SMPRuntimeException.class); expectedExeption.expectMessage(SG_NOT_EXISTS.getMessage("service-group", "not-existing")); // when-then - testInstance.getServiceGroup(asParticipantId("not-existing::service-group") ); + testInstance.getServiceGroup(asParticipantId("not-existing::service-group", false) ); } @Test diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/testutil/TestConstants.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/testutil/TestConstants.java index b2fc5ac75a30f75244e2d776879705f33c140ea2..c67dbbd7e990001f5d901918bc044544bd5f6c52 100644 --- a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/testutil/TestConstants.java +++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/testutil/TestConstants.java @@ -17,6 +17,7 @@ public class TestConstants { public static final String TEST_SG_ID_2 = "urn:eu:ncpb:utest"; public static final String TEST_SG_ID_3 = "0007:002:utest"; public static final String TEST_SG_ID_4 = "0007:004:utest"; + public static final String TEST_SG_ID_NO_SCHEME = "No-Scheme-Party-Id"; public static final String TEST_SG_ID_PL= "urn:poland:ncpb:utest"; public static final String TEST_SG_ID_PL2= "urn:Poland:ncpb"; @@ -51,7 +52,7 @@ public class TestConstants { public static final String SERVICE_METADATA_XML_PATH = "/examples/services/ServiceMetadataPoland.xml"; public static final String SIGNED_SERVICE_METADATA_XML_PATH = "/examples/services/SignedServiceMetadataPoland.xml"; - public static final ParticipantIdentifierType SERVICE_GROUP_ID = asParticipantId("participant-scheme-qns::urn:eu:ncpb"); + public static final ParticipantIdentifierType SERVICE_GROUP_ID = asParticipantId("participant-scheme-qns::urn:eu:ncpb",false); public static final String ADMIN_USERNAME = "test_admin"; public static final String CERT_USER="CN=common name,O=org,C=BE:0000000000000066"; diff --git a/smp-soapui-tests/soapui/SMP4.0-Generic-soapui-project.xml b/smp-soapui-tests/soapui/SMP4.0-Generic-soapui-project.xml index 6b6124f46aef4e723abe337e9870d10ee60dc7a8..c0b1e1a1435e6e7339ac4770f8f6f065589134ef 100644 --- a/smp-soapui-tests/soapui/SMP4.0-Generic-soapui-project.xml +++ b/smp-soapui-tests/soapui/SMP4.0-Generic-soapui-project.xml @@ -122,7 +122,10 @@ <Extension> <ex:Test xmlns:ex="http://test.eu">Test</ex:Test> </Extension> -</ServiceGroup>]]></con:request><con:credentials><con:username>user</con:username><con:password>user</con:password><con:selectedAuthProfile>Basic</con:selectedAuthProfile><con:addedBasicAuthenticationTypes>Basic</con:addedBasicAuthenticationTypes><con:preemptive>true</con:preemptive><con:authType>Preemptive</con:authType></con:credentials><con:jmsConfig JMSDeliveryMode="PERSISTENT"/><con:jmsPropertyConfig/><con:parameters/></con:request></con:method><con:method name="YYYZZZ-56-Delete" method="DELETE" id="f5889514-5798-4fbe-bf1d-c5aaa792566e"><con:settings/><con:parameters/><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="REQUEST"><con:mediaType>application/xml</con:mediaType><con:params/></con:representation><con:representation type="FAULT"><con:mediaType>text/html; charset=UTF-8</con:mediaType><con:status>500 401</con:status><con:params/><con:element>html</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType>text/plain</con:mediaType><con:status>404</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType xsi:nil="true"/><con:status>500</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType>text/xml</con:mediaType><con:status>500 400</con:status><con:params/><con:element xmlns:ec="ec:services:SMP:1.0">ec:ErrorResponse</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType>text/xml;charset=UTF-8</con:mediaType><con:status>400</con:status><con:params/><con:element xmlns:ec="ec:services:SMP:1.0">ec:ErrorResponse</con:element></con:representation><con:request name="Delete" mediaType="application/xml" id="a97cde56-8e9c-4d6f-b950-faf82b0268e9" postQueryString="false"><con:settings><con:setting id="com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers"><xml-fragment/></con:setting></con:settings><con:endpoint>${#Project#url}</con:endpoint><con:request/><con:credentials><con:username>user</con:username><con:password>user</con:password><con:selectedAuthProfile>Basic</con:selectedAuthProfile><con:addedBasicAuthenticationTypes>Basic</con:addedBasicAuthenticationTypes><con:preemptive>true</con:preemptive><con:authType>Preemptive</con:authType></con:credentials><con:jmsConfig JMSDeliveryMode="PERSISTENT"/><con:jmsPropertyConfig/><con:parameters/></con:request></con:method></con:resource><con:resource name="SignedServiceMetadataIDWrongFormat" path="/ehealth-actorid-qns%3A%3A0088%3A7770010100777/services/busdox-docid-qns%3Aurn%3Aoasis%3Anames%3Aspecification%3Aubl%3Aschema%3Axsd%3AInvoice-001%3AInvoice%23%23UBL-2.0" id="05ed7407-d19e-43be-97e0-969414c666fd"><con:settings/><con:parameters/><con:method name="YYYZZZ-57-Get" method="GET" id="6168176b-9b10-487e-bedb-5f48e97fd78a"><con:settings/><con:parameters/><con:representation type="RESPONSE"><con:mediaType>application/xml</con:mediaType><con:status>200</con:status><con:params/><con:element xmlns:ns="http://busdox.org/serviceMetadata/publishing/1.0/">ns:SignedServiceMetadata</con:element></con:representation><con:representation type="FAULT"><con:mediaType>text/plain</con:mediaType><con:status>500 404</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType>text/html;charset=utf-8</con:mediaType><con:status>404 500</con:status><con:params/><con:element>html</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType>text/xml</con:mediaType><con:status>200</con:status><con:params/><con:element xmlns:ns="http://busdox.org/serviceMetadata/publishing/1.0/">ns:SignedServiceMetadata</con:element></con:representation><con:representation type="FAULT"><con:mediaType>text/html; charset=UTF-8</con:mediaType><con:status>401</con:status><con:params/><con:element>html</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType>text/xml</con:mediaType><con:status>400</con:status><con:params/><con:element xmlns:ec="ec:services:SMP:1.0">ec:ErrorResponse</con:element></con:representation><con:representation type="FAULT"><con:mediaType>text/xml;charset=UTF-8</con:mediaType><con:status>400</con:status><con:params/><con:element xmlns:ec="ec:services:SMP:1.0">ec:ErrorResponse</con:element></con:representation><con:request name="Get" mediaType="application/xml" id="798e6729-3cf8-44b5-8fc7-f19165c82521"><con:settings><con:setting id="com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers"><xml-fragment/></con:setting></con:settings><con:endpoint>${#Project#url}</con:endpoint><con:request/><con:credentials><con:selectedAuthProfile>Basic</con:selectedAuthProfile><con:addedBasicAuthenticationTypes>Basic</con:addedBasicAuthenticationTypes><con:preemptive>true</con:preemptive><con:authType>Preemptive</con:authType></con:credentials><con:jmsConfig JMSDeliveryMode="PERSISTENT"/><con:jmsPropertyConfig/><con:parameters/></con:request></con:method><con:method name="YYYZZZ-58-Put" method="PUT" id="00044aac-b021-4ec0-8723-690887be30fe"><con:settings/><con:parameters/><con:representation type="FAULT"><con:mediaType>text/plain</con:mediaType><con:status>403</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="REQUEST"><con:mediaType>text/xml</con:mediaType><con:params/><con:element xmlns:ns="http://busdox.org/serviceMetadata/publishing/1.0/">ns:ServiceMetadata</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType>text/html;charset=utf-8</con:mediaType><con:status>400</con:status><con:params/><con:element>html</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType>text/html; charset=UTF-8</con:mediaType><con:status>500 401</con:status><con:params/><con:element>html</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType xsi:nil="true"/><con:status>404</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType xsi:nil="true"/><con:status>404</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType>text/xml</con:mediaType><con:status>400 500</con:status><con:params/><con:element xmlns:ec="ec:services:SMP:1.0">ec:ErrorResponse</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType>text/xml;charset=UTF-8</con:mediaType><con:status>400</con:status><con:params/><con:element xmlns:ec="ec:services:SMP:1.0">ec:ErrorResponse</con:element></con:representation><con:request name="Put" mediaType="text/xml" postQueryString="false" id="74cb305c-6d80-4836-a6eb-4c6cc61f0dab"><con:settings><con:setting id="com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers"><xml-fragment/></con:setting></con:settings><con:endpoint>${#Project#url}</con:endpoint><con:request><![CDATA[<ServiceMetadata xmlns="http://docs.oasis-open.org/bdxr/ns/SMP/2016/05"> +</ServiceGroup>]]></con:request><con:credentials><con:username>user</con:username><con:password>user</con:password><con:selectedAuthProfile>Basic</con:selectedAuthProfile><con:addedBasicAuthenticationTypes>Basic</con:addedBasicAuthenticationTypes><con:preemptive>true</con:preemptive><con:authType>Preemptive</con:authType></con:credentials><con:jmsConfig JMSDeliveryMode="PERSISTENT"/><con:jmsPropertyConfig/><con:parameters/></con:request></con:method><con:method name="YYYZZZ-56-Delete" method="DELETE" id="f5889514-5798-4fbe-bf1d-c5aaa792566e"><con:settings/><con:parameters/><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="REQUEST"><con:mediaType>application/xml</con:mediaType><con:params/></con:representation><con:representation type="FAULT"><con:mediaType>text/html; charset=UTF-8</con:mediaType><con:status>500 401</con:status><con:params/><con:element>html</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType>text/plain</con:mediaType><con:status>404</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType xsi:nil="true"/><con:status>500</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType>text/xml</con:mediaType><con:status>500 400</con:status><con:params/><con:element xmlns:ec="ec:services:SMP:1.0">ec:ErrorResponse</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType>text/xml;charset=UTF-8</con:mediaType><con:status>400</con:status><con:params/><con:element xmlns:ec="ec:services:SMP:1.0">ec:ErrorResponse</con:element></con:representation><con:request name="Delete" mediaType="application/xml" id="a97cde56-8e9c-4d6f-b950-faf82b0268e9" postQueryString="false"><con:settings><con:setting id="com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers"><xml-fragment/></con:setting></con:settings><con:endpoint>${#Project#url}</con:endpoint><con:request/><con:credentials><con:username>user</con:username><con:password>user</con:password><con:selectedAuthProfile>Basic</con:selectedAuthProfile><con:addedBasicAuthenticationTypes>Basic</con:addedBasicAuthenticationTypes><con:preemptive>true</con:preemptive><con:authType>Preemptive</con:authType></con:credentials><con:jmsConfig JMSDeliveryMode="PERSISTENT"/><con:jmsPropertyConfig/><con:parameters/></con:request></con:method></con:resource><con:resource name="SignedServiceMetadataIDWrongFormat" path="/{ParticipantIdentifierScheme}%3A{ParticipantIdentifier}/services/busdox-docid-qns%3Aurn%3Aoasis%3Anames%3Aspecification%3Aubl%3Aschema%3Axsd%3AInvoice-001%3AInvoice%23%23UBL-2.0" id="05ed7407-d19e-43be-97e0-969414c666fd"><con:settings/><con:parameters><con:parameter><con:name>ParticipantIdentifierScheme</con:name><con:value/><con:style>TEMPLATE</con:style><con:default/><con:description xsi:nil="true"/></con:parameter><con:parameter><con:name>ParticipantIdentifier</con:name><con:value/><con:style>TEMPLATE</con:style><con:default/><con:description xsi:nil="true"/></con:parameter></con:parameters><con:method name="YYYZZZ-57-Get" method="GET" id="6168176b-9b10-487e-bedb-5f48e97fd78a"><con:settings/><con:parameters/><con:representation type="RESPONSE"><con:mediaType>application/xml</con:mediaType><con:status>200</con:status><con:params/><con:element xmlns:ns="http://busdox.org/serviceMetadata/publishing/1.0/">ns:SignedServiceMetadata</con:element></con:representation><con:representation type="FAULT"><con:mediaType>text/plain</con:mediaType><con:status>500 404</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType>text/html;charset=utf-8</con:mediaType><con:status>404 500</con:status><con:params/><con:element>html</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType>text/xml</con:mediaType><con:status>200</con:status><con:params/><con:element xmlns:ns="http://busdox.org/serviceMetadata/publishing/1.0/">ns:SignedServiceMetadata</con:element></con:representation><con:representation type="FAULT"><con:mediaType>text/html; charset=UTF-8</con:mediaType><con:status>401</con:status><con:params/><con:element>html</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType>text/xml</con:mediaType><con:status>400</con:status><con:params/><con:element xmlns:ec="ec:services:SMP:1.0">ec:ErrorResponse</con:element></con:representation><con:representation type="FAULT"><con:mediaType>text/xml;charset=UTF-8</con:mediaType><con:status>400</con:status><con:params/><con:element xmlns:ec="ec:services:SMP:1.0">ec:ErrorResponse</con:element></con:representation><con:request name="Get" mediaType="application/xml" id="798e6729-3cf8-44b5-8fc7-f19165c82521"><con:settings><con:setting id="com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers"><xml-fragment/></con:setting></con:settings><con:endpoint>${#Project#url}</con:endpoint><con:request/><con:credentials><con:selectedAuthProfile>Basic</con:selectedAuthProfile><con:addedBasicAuthenticationTypes>Basic</con:addedBasicAuthenticationTypes><con:preemptive>true</con:preemptive><con:authType>Preemptive</con:authType></con:credentials><con:jmsConfig JMSDeliveryMode="PERSISTENT"/><con:jmsPropertyConfig/><con:parameters> + <con:entry key="ParticipantIdentifierScheme" value=""/> + <con:entry key="ParticipantIdentifier" value=""/> +</con:parameters><con:parameterOrder><con:entry>ParticipantIdentifierScheme</con:entry><con:entry>ParticipantIdentifier</con:entry></con:parameterOrder></con:request></con:method><con:method name="YYYZZZ-58-Put" method="PUT" id="00044aac-b021-4ec0-8723-690887be30fe"><con:settings/><con:parameters/><con:representation type="FAULT"><con:mediaType>text/plain</con:mediaType><con:status>403</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="REQUEST"><con:mediaType>text/xml</con:mediaType><con:params/><con:element xmlns:ns="http://busdox.org/serviceMetadata/publishing/1.0/">ns:ServiceMetadata</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType>text/html;charset=utf-8</con:mediaType><con:status>400</con:status><con:params/><con:element>html</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType>text/html; charset=UTF-8</con:mediaType><con:status>500 401</con:status><con:params/><con:element>html</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType xsi:nil="true"/><con:status>404</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType xsi:nil="true"/><con:status>404</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType>text/xml</con:mediaType><con:status>400 500</con:status><con:params/><con:element xmlns:ec="ec:services:SMP:1.0">ec:ErrorResponse</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType>text/xml;charset=UTF-8</con:mediaType><con:status>400</con:status><con:params/><con:element xmlns:ec="ec:services:SMP:1.0">ec:ErrorResponse</con:element></con:representation><con:request name="Put" mediaType="text/xml" postQueryString="false" id="74cb305c-6d80-4836-a6eb-4c6cc61f0dab"><con:settings><con:setting id="com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers"><xml-fragment/></con:setting></con:settings><con:endpoint>${#Project#url}</con:endpoint><con:request><![CDATA[<ServiceMetadata xmlns="http://docs.oasis-open.org/bdxr/ns/SMP/2016/05"> <ServiceInformation> <ParticipantIdentifier scheme="${=request.getProperty('ParticipantIdentifierScheme').getValue()}">${=request.getProperty('ParticipantIdentifier').getValue()}</ParticipantIdentifier> <DocumentIdentifier scheme="${=request.getProperty('DocTypeIdentifierScheme').getValue()}">${=request.getProperty('DocTypeIdentifier').getValue()}</DocumentIdentifier> @@ -143,7 +146,13 @@ </Process> </ProcessList> </ServiceInformation> -</ServiceMetadata>]]></con:request><con:credentials><con:username>user</con:username><con:password>user</con:password><con:selectedAuthProfile>Basic</con:selectedAuthProfile><con:addedBasicAuthenticationTypes>Basic</con:addedBasicAuthenticationTypes><con:preemptive>true</con:preemptive><con:authType>Preemptive</con:authType></con:credentials><con:jmsConfig JMSDeliveryMode="PERSISTENT"/><con:jmsPropertyConfig/><con:parameters/></con:request></con:method><con:method name="YYYZZZ-59-Delete" method="DELETE" id="cccbd073-0e3d-439b-a747-946a73f5b67c"><con:settings/><con:parameters/><con:representation type="FAULT"><con:mediaType>text/plain</con:mediaType><con:status>403 404</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType>text/html;charset=utf-8</con:mediaType><con:status>404 500</con:status><con:params/><con:element>html</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="REQUEST"><con:mediaType>application/xml</con:mediaType><con:params/></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType>text/html; charset=UTF-8</con:mediaType><con:status>500</con:status><con:params/><con:element>html</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType>text/xml</con:mediaType><con:status>401 400</con:status><con:params/><con:element xmlns:ec="ec:services:SMP:1.0">ec:ErrorResponse</con:element></con:representation><con:representation type="FAULT"><con:mediaType xsi:nil="true"/><con:status>400</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType xsi:nil="true"/><con:status>400</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType>text/xml;charset=UTF-8</con:mediaType><con:status>404 400</con:status><con:params/><con:element xmlns:ec="ec:services:SMP:1.0">ec:ErrorResponse</con:element></con:representation><con:request name="Delete" mediaType="application/xml" id="cfe391c2-9084-45a5-a637-fbbc25a25f27" postQueryString="false"><con:settings><con:setting id="com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers"><xml-fragment/></con:setting></con:settings><con:endpoint>${#Project#url}</con:endpoint><con:request/><con:credentials><con:username>user</con:username><con:password>user</con:password><con:selectedAuthProfile>Basic</con:selectedAuthProfile><con:addedBasicAuthenticationTypes>Basic</con:addedBasicAuthenticationTypes><con:preemptive>true</con:preemptive><con:authType>Preemptive</con:authType></con:credentials><con:jmsConfig JMSDeliveryMode="PERSISTENT"/><con:jmsPropertyConfig/><con:parameters/></con:request></con:method></con:resource><con:resource name="ServiceGroup Empty scheme" path="/::0088:7770010100777" id="2ff08415-f133-4c23-bf64-91204b94f5c1"><con:settings/><con:parameters/><con:method name="YYYZZZ-66-Get" method="GET" id="36ced4c8-0e92-4686-a5f4-e9c9870b721f"><con:settings/><con:parameters/><con:representation type="RESPONSE"><con:mediaType>application/xml</con:mediaType><con:status>200</con:status><con:params/><con:element xmlns:ns="http://busdox.org/serviceMetadata/publishing/1.0/">ns:ServiceGroup</con:element></con:representation><con:representation type="FAULT"><con:mediaType>text/plain</con:mediaType><con:status>404</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType>text/html;charset=utf-8</con:mediaType><con:status>404 500</con:status><con:params/><con:element>html</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType>text/xml</con:mediaType><con:status>200</con:status><con:params/><con:element xmlns:ns="http://busdox.org/serviceMetadata/publishing/1.0/">ns:ServiceGroup</con:element></con:representation><con:representation type="FAULT"><con:mediaType>text/html; charset=UTF-8</con:mediaType><con:status>401 500 404</con:status><con:params/><con:element>html</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType>text/xml</con:mediaType><con:status>404</con:status><con:params/></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType xsi:nil="true"/><con:status>404</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType>text/html; charset=utf-8</con:mediaType><con:status>403</con:status><con:params/><con:element>html</con:element></con:representation><con:representation type="FAULT"><con:mediaType xsi:nil="true"/><con:status>404</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType xsi:nil="true"/><con:status>404</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType xsi:nil="true"/><con:status>404</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType xsi:nil="true"/><con:status>404</con:status><con:params/><con:element>data</con:element></con:representation><con:request name="Get" mediaType="application/xml" id="a9f15369-89e3-4e53-a448-a9881605a8b0"><con:settings><con:setting id="com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers"><xml-fragment/></con:setting></con:settings><con:endpoint>${#Project#url}</con:endpoint><con:request/><con:originalUri>http://130.206.118.4/cipa-smp-full-webapp/iso6523-actorid-upis::0088:5798000000003</con:originalUri><con:credentials><con:selectedAuthProfile>Basic</con:selectedAuthProfile><con:addedBasicAuthenticationTypes>Basic</con:addedBasicAuthenticationTypes><con:preemptive>true</con:preemptive><con:authType>Preemptive</con:authType></con:credentials><con:jmsConfig JMSDeliveryMode="PERSISTENT"/><con:jmsPropertyConfig/><con:parameters/></con:request></con:method><con:method name="YYYZZZ-67-Put" method="PUT" id="951c948c-9ef6-494b-b569-389e1dd323ea"><con:settings/><con:parameters/><con:representation type="REQUEST"><con:mediaType>text/xml</con:mediaType><con:params/><con:element xmlns:ns="http://busdox.org/serviceMetadata/publishing/1.0/">ns:ServiceGroup</con:element></con:representation><con:representation type="FAULT"><con:mediaType>text/html;charset=utf-8</con:mediaType><con:status>400 403</con:status><con:params/><con:element>html</con:element></con:representation><con:representation type="FAULT"><con:mediaType>text/plain</con:mediaType><con:status>403</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType>text/html; charset=UTF-8</con:mediaType><con:status>401 403 500 400 404</con:status><con:params/><con:element>html</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType xsi:nil="true"/><con:status>404</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType xsi:nil="true"/><con:status>404</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType xsi:nil="true"/><con:status>404</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType xsi:nil="true"/><con:status>400</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType xsi:nil="true"/><con:status>400</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType xsi:nil="true"/><con:status>400</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType xsi:nil="true"/><con:status>400</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType xsi:nil="true"/><con:status>400</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType xsi:nil="true"/><con:status>400</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType>text/html; charset=utf-8</con:mediaType><con:status>407</con:status><con:params/><con:element>html</con:element></con:representation><con:representation type="FAULT"><con:mediaType xsi:nil="true"/><con:status>400</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType xsi:nil="true"/><con:status>400</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType xsi:nil="true"/><con:status>400</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType xsi:nil="true"/><con:status>400</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType xsi:nil="true"/><con:status>500</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType>text/xml</con:mediaType><con:status>500 400 401</con:status><con:params/><con:element xmlns:ec="ec:services:SMP:1.0">ec:ErrorResponse</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>201</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>201</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>201</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>201</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>201</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>201</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>201</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>201</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>201</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>201</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>201</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>201</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>201</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>201</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>201</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>201</con:status><con:params/><con:element>data</con:element></con:representation><con:request name="Put" mediaType="text/xml" postQueryString="false" id="e50d78e0-763f-4bfd-aa1c-f4dcc7595a2a"><con:settings><con:setting id="com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers"><xml-fragment/></con:setting></con:settings><con:endpoint>${#Project#url}</con:endpoint><con:request><![CDATA[<ServiceGroup xmlns="http://docs.oasis-open.org/bdxr/ns/SMP/2016/05"> +</ServiceMetadata>]]></con:request><con:credentials><con:username>user</con:username><con:password>user</con:password><con:selectedAuthProfile>Basic</con:selectedAuthProfile><con:addedBasicAuthenticationTypes>Basic</con:addedBasicAuthenticationTypes><con:preemptive>true</con:preemptive><con:authType>Preemptive</con:authType></con:credentials><con:jmsConfig JMSDeliveryMode="PERSISTENT"/><con:jmsPropertyConfig/><con:parameters> + <con:entry key="ParticipantIdentifierScheme" value="ehealth-actorid-qns"/> + <con:entry key="ParticipantIdentifier" value="0088:7770010100777"/> +</con:parameters><con:parameterOrder><con:entry>ParticipantIdentifierScheme</con:entry><con:entry>ParticipantIdentifier</con:entry></con:parameterOrder></con:request></con:method><con:method name="YYYZZZ-59-Delete" method="DELETE" id="cccbd073-0e3d-439b-a747-946a73f5b67c"><con:settings/><con:parameters/><con:representation type="FAULT"><con:mediaType>text/plain</con:mediaType><con:status>403 404</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType>text/html;charset=utf-8</con:mediaType><con:status>404 500</con:status><con:params/><con:element>html</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="REQUEST"><con:mediaType>application/xml</con:mediaType><con:params/></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType>text/html; charset=UTF-8</con:mediaType><con:status>500</con:status><con:params/><con:element>html</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType>text/xml</con:mediaType><con:status>401 400</con:status><con:params/><con:element xmlns:ec="ec:services:SMP:1.0">ec:ErrorResponse</con:element></con:representation><con:representation type="FAULT"><con:mediaType xsi:nil="true"/><con:status>400</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType xsi:nil="true"/><con:status>400</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType>text/xml;charset=UTF-8</con:mediaType><con:status>404 400</con:status><con:params/><con:element xmlns:ec="ec:services:SMP:1.0">ec:ErrorResponse</con:element></con:representation><con:request name="Delete" mediaType="application/xml" id="cfe391c2-9084-45a5-a637-fbbc25a25f27" postQueryString="false"><con:settings><con:setting id="com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers"><xml-fragment/></con:setting></con:settings><con:endpoint>${#Project#url}</con:endpoint><con:request/><con:credentials><con:username>user</con:username><con:password>user</con:password><con:selectedAuthProfile>Basic</con:selectedAuthProfile><con:addedBasicAuthenticationTypes>Basic</con:addedBasicAuthenticationTypes><con:preemptive>true</con:preemptive><con:authType>Preemptive</con:authType></con:credentials><con:jmsConfig JMSDeliveryMode="PERSISTENT"/><con:jmsPropertyConfig/><con:parameters> + <con:entry key="ParticipantIdentifierScheme" value=""/> + <con:entry key="ParticipantIdentifier" value=""/> +</con:parameters><con:parameterOrder><con:entry>ParticipantIdentifierScheme</con:entry><con:entry>ParticipantIdentifier</con:entry></con:parameterOrder></con:request></con:method></con:resource><con:resource name="ServiceGroup Empty scheme" path="/::0088:7770010100777" id="2ff08415-f133-4c23-bf64-91204b94f5c1"><con:settings/><con:parameters/><con:method name="YYYZZZ-66-Get" method="GET" id="36ced4c8-0e92-4686-a5f4-e9c9870b721f"><con:settings/><con:parameters/><con:representation type="RESPONSE"><con:mediaType>application/xml</con:mediaType><con:status>200</con:status><con:params/><con:element xmlns:ns="http://busdox.org/serviceMetadata/publishing/1.0/">ns:ServiceGroup</con:element></con:representation><con:representation type="FAULT"><con:mediaType>text/plain</con:mediaType><con:status>404</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType>text/html;charset=utf-8</con:mediaType><con:status>404 500</con:status><con:params/><con:element>html</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType>text/xml</con:mediaType><con:status>200</con:status><con:params/><con:element xmlns:ns="http://busdox.org/serviceMetadata/publishing/1.0/">ns:ServiceGroup</con:element></con:representation><con:representation type="FAULT"><con:mediaType>text/html; charset=UTF-8</con:mediaType><con:status>401 500 404</con:status><con:params/><con:element>html</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType>text/xml</con:mediaType><con:status>404</con:status><con:params/></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType xsi:nil="true"/><con:status>404</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType>text/html; charset=utf-8</con:mediaType><con:status>403</con:status><con:params/><con:element>html</con:element></con:representation><con:representation type="FAULT"><con:mediaType xsi:nil="true"/><con:status>404</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType xsi:nil="true"/><con:status>404</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType xsi:nil="true"/><con:status>404</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType xsi:nil="true"/><con:status>404</con:status><con:params/><con:element>data</con:element></con:representation><con:request name="Get" mediaType="application/xml" id="a9f15369-89e3-4e53-a448-a9881605a8b0"><con:settings><con:setting id="com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers"><xml-fragment/></con:setting></con:settings><con:endpoint>${#Project#url}</con:endpoint><con:request/><con:originalUri>http://130.206.118.4/cipa-smp-full-webapp/iso6523-actorid-upis::0088:5798000000003</con:originalUri><con:credentials><con:selectedAuthProfile>Basic</con:selectedAuthProfile><con:addedBasicAuthenticationTypes>Basic</con:addedBasicAuthenticationTypes><con:preemptive>true</con:preemptive><con:authType>Preemptive</con:authType></con:credentials><con:jmsConfig JMSDeliveryMode="PERSISTENT"/><con:jmsPropertyConfig/><con:parameters/></con:request></con:method><con:method name="YYYZZZ-67-Put" method="PUT" id="951c948c-9ef6-494b-b569-389e1dd323ea"><con:settings/><con:parameters/><con:representation type="REQUEST"><con:mediaType>text/xml</con:mediaType><con:params/><con:element xmlns:ns="http://busdox.org/serviceMetadata/publishing/1.0/">ns:ServiceGroup</con:element></con:representation><con:representation type="FAULT"><con:mediaType>text/html;charset=utf-8</con:mediaType><con:status>400 403</con:status><con:params/><con:element>html</con:element></con:representation><con:representation type="FAULT"><con:mediaType>text/plain</con:mediaType><con:status>403</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType>text/html; charset=UTF-8</con:mediaType><con:status>401 403 500 400 404</con:status><con:params/><con:element>html</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType xsi:nil="true"/><con:status>404</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType xsi:nil="true"/><con:status>404</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType xsi:nil="true"/><con:status>404</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType xsi:nil="true"/><con:status>400</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType xsi:nil="true"/><con:status>400</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType xsi:nil="true"/><con:status>400</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType xsi:nil="true"/><con:status>400</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType xsi:nil="true"/><con:status>400</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType xsi:nil="true"/><con:status>400</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType>text/html; charset=utf-8</con:mediaType><con:status>407</con:status><con:params/><con:element>html</con:element></con:representation><con:representation type="FAULT"><con:mediaType xsi:nil="true"/><con:status>400</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType xsi:nil="true"/><con:status>400</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType xsi:nil="true"/><con:status>400</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType xsi:nil="true"/><con:status>400</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType xsi:nil="true"/><con:status>500</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="FAULT"><con:mediaType>text/xml</con:mediaType><con:status>500 400 401</con:status><con:params/><con:element xmlns:ec="ec:services:SMP:1.0">ec:ErrorResponse</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>201</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>201</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>201</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>201</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>201</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>200</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>201</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>201</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>201</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>0</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>201</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>201</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>201</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>201</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>201</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>201</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>201</con:status><con:params/><con:element>data</con:element></con:representation><con:representation type="RESPONSE"><con:mediaType xsi:nil="true"/><con:status>201</con:status><con:params/><con:element>data</con:element></con:representation><con:request name="Put" mediaType="text/xml" postQueryString="false" id="e50d78e0-763f-4bfd-aa1c-f4dcc7595a2a"><con:settings><con:setting id="com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers"><xml-fragment/></con:setting></con:settings><con:endpoint>${#Project#url}</con:endpoint><con:request><![CDATA[<ServiceGroup xmlns="http://docs.oasis-open.org/bdxr/ns/SMP/2016/05"> <ParticipantIdentifier scheme="${=request.getProperty('ParticipantIdentifierScheme').getValue()}">${=request.getProperty('ParticipantIdentifier').getValue()}</ParticipantIdentifier> <ServiceMetadataReferenceCollection/> <Extension> @@ -2756,7 +2765,7 @@ testRunner.testCase.testSteps['Delete ServiceGroup'].run(testRunner, context); </con:parameters></con:restRequest></con:config></con:testStep><con:testStep type="restrequest" name="Get ServiceMetadata XSD_INVALID Certificate dataType" id="571834c8-c025-4211-8201-866ac58fcedd"><con:settings/><con:config service="SMP" resourcePath="/{ParticipantIdentifierScheme}::{ParticipantIdentifier}/services/{DocTypeIdentifierScheme}::{DocTypeIdentifier}" methodName="GET ServiceMetadata" xsi:type="con:RestRequestStep" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><con:restRequest name="Get ServiceMetadata XSD_INVALID Certificate dataType" mediaType="application/xml" id="798e6729-3cf8-44b5-8fc7-f19165c82521"><con:settings><con:setting id="com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers"><xml-fragment/></con:setting></con:settings><con:endpoint>${#Project#url}</con:endpoint><con:request/><con:originalUri>http://wltdgt02.cc.cec.eu.int/cipa-smp-full-webapp/ehealth-actorid-qns%3A%3A0088%3A7770010100777/services/busdox-docid-qns%3A%3Aurn%3Aoasis%3Anames%3Aspecification%3Aubl%3Aschema%3Axsd%3AInvoice-001%3A%3AInvoice%23%23UBL-2.0</con:originalUri><con:assertion type="Valid HTTP Status Codes" id="108aac0b-5f2d-4000-8678-31afca1f6816" name="Valid HTTP Status Codes"><con:configuration><codes>404</codes></con:configuration></con:assertion><con:assertion type="Simple Contains" id="d940f8e4-a88f-4a22-b82a-f5471ca77f38" name="Contains"><con:configuration><token>NOT_FOUND</token><ignoreCase>false</ignoreCase><useRegEx>false</useRegEx></con:configuration></con:assertion><con:credentials><con:selectedAuthProfile>Basic</con:selectedAuthProfile><con:addedBasicAuthenticationTypes>Basic</con:addedBasicAuthenticationTypes><con:preemptive>true</con:preemptive><con:authType>Preemptive</con:authType></con:credentials><con:jmsConfig JMSDeliveryMode="PERSISTENT"/><con:jmsPropertyConfig/><con:parameters> <con:entry key="ParticipantIdentifierScheme" value="${Put ServiceGroup#ParticipantIdentifierScheme}"/> <con:entry key="ParticipantIdentifier" value="${Put ServiceGroup#ParticipantIdentifier}"/> -</con:parameters></con:restRequest></con:config></con:testStep><con:testStep type="restrequest" name="TEST Put ServiceMetadata FORMAT_ERROR Delimiter" id="0c9d210a-6f55-4a9f-894a-95a85c804923"><con:settings/><con:config service="SMP" resourcePath="/ehealth-actorid-qns%3A%3A0088%3A7770010100777/services/busdox-docid-qns%3Aurn%3Aoasis%3Anames%3Aspecification%3Aubl%3Aschema%3Axsd%3AInvoice-001%3AInvoice%23%23UBL-2.0" methodName="YYYZZZ-58-Put" xsi:type="con:RestRequestStep" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><con:restRequest name="TEST Put ServiceMetadata FORMAT_ERROR Delimiter" mediaType="text/xml" postQueryString="false" id="74cb305c-6d80-4836-a6eb-4c6cc61f0dab"><con:settings><con:setting id="com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers"><xml-fragment/></con:setting></con:settings><con:endpoint>${#Project#url}</con:endpoint><con:request><![CDATA[<ServiceMetadata xmlns="http://docs.oasis-open.org/bdxr/ns/SMP/2016/05"> +</con:parameters></con:restRequest></con:config></con:testStep><con:testStep type="restrequest" name="TEST Put ServiceMetadata FORMAT_ERROR Delimiter" id="0c9d210a-6f55-4a9f-894a-95a85c804923"><con:settings/><con:config service="SMP" resourcePath="/{ParticipantIdentifierScheme}%3A{ParticipantIdentifier}/services/busdox-docid-qns%3Aurn%3Aoasis%3Anames%3Aspecification%3Aubl%3Aschema%3Axsd%3AInvoice-001%3AInvoice%23%23UBL-2.0" methodName="YYYZZZ-58-Put" xsi:type="con:RestRequestStep" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><con:restRequest name="TEST Put ServiceMetadata FORMAT_ERROR Delimiter" mediaType="text/xml" postQueryString="false" id="74cb305c-6d80-4836-a6eb-4c6cc61f0dab"><con:settings><con:setting id="com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers"><xml-fragment/></con:setting></con:settings><con:endpoint>${#Project#url}</con:endpoint><con:request><![CDATA[<ServiceMetadata xmlns="http://docs.oasis-open.org/bdxr/ns/SMP/2016/05"> <ServiceInformation> <ParticipantIdentifier scheme="${=request.getProperty('ParticipantIdentifierScheme').getValue()}">${=request.getProperty('ParticipantIdentifier').getValue()}</ParticipantIdentifier> <DocumentIdentifier scheme="${=request.getProperty('DocTypeIdentifierScheme').getValue()}">${=request.getProperty('DocTypeIdentifier').getValue()}</DocumentIdentifier> @@ -2777,7 +2786,10 @@ testRunner.testCase.testSteps['Delete ServiceGroup'].run(testRunner, context); </Process> </ProcessList> </ServiceInformation> -</ServiceMetadata>]]></con:request><con:originalUri>http://wltdgt02.cc.cec.eu.int/cipa-smp-full-webapp/ehealth-actorid-qns%3A%3A0088%3A7770010100777/services/busdox-docid-qns%3Aurn%3Aoasis%3Anames%3Aspecification%3Aubl%3Aschema%3Axsd%3AInvoice-001%3A%3AInvoice%23%23UBL-2.0</con:originalUri><con:assertion type="Valid HTTP Status Codes" id="0260622c-5e84-428b-85cc-e83213d6a623" name="Valid HTTP Status Codes"><con:configuration><codes>400</codes></con:configuration></con:assertion><con:assertion type="Simple Contains" id="72285da6-038e-40a6-b5cb-7c32f66bb10f" name="Contains"><con:configuration><token>FORMAT_ERROR</token><ignoreCase>false</ignoreCase><useRegEx>false</useRegEx></con:configuration></con:assertion><con:credentials><con:username>${#Project#adminSmp1Test}</con:username><con:password>${#Project#adminSmp1TestPassword}</con:password><con:selectedAuthProfile>Basic</con:selectedAuthProfile><con:addedBasicAuthenticationTypes>Basic</con:addedBasicAuthenticationTypes><con:preemptive>true</con:preemptive><con:authType>Preemptive</con:authType></con:credentials><con:jmsConfig JMSDeliveryMode="PERSISTENT"/><con:jmsPropertyConfig/><con:parameters/></con:restRequest></con:config></con:testStep><con:testStep type="restrequest" name="Get ServiceMetadata FORMAT_ERROR Delimiter" id="2d0c97e6-f731-4285-b6f3-ed973b113059"><con:settings/><con:config service="SMP" resourcePath="/{ParticipantIdentifierScheme}::{ParticipantIdentifier}/services/{DocTypeIdentifierScheme}::{DocTypeIdentifier}" methodName="GET ServiceMetadata" xsi:type="con:RestRequestStep" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><con:restRequest name="Get ServiceMetadata FORMAT_ERROR Delimiter" mediaType="application/xml" id="798e6729-3cf8-44b5-8fc7-f19165c82521"><con:settings><con:setting id="com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers"><xml-fragment/></con:setting></con:settings><con:endpoint>${#Project#url}</con:endpoint><con:request/><con:originalUri>http://wltdgt02.cc.cec.eu.int/cipa-smp-full-webapp/ehealth-actorid-qns%3A%3A0088%3A7770010100777/services/busdox-docid-qns%3A%3Aurn%3Aoasis%3Anames%3Aspecification%3Aubl%3Aschema%3Axsd%3AInvoice-001%3A%3AInvoice%23%23UBL-2.0</con:originalUri><con:assertion type="Valid HTTP Status Codes" id="108aac0b-5f2d-4000-8678-31afca1f6816" name="Valid HTTP Status Codes"><con:configuration><codes>404</codes></con:configuration></con:assertion><con:assertion type="Simple Contains" id="8c1aa453-119a-4b89-91c1-b9ea9ded6dd7" name="Contains"><con:configuration><token>NOT_FOUND</token><ignoreCase>false</ignoreCase><useRegEx>false</useRegEx></con:configuration></con:assertion><con:credentials><con:selectedAuthProfile>Basic</con:selectedAuthProfile><con:addedBasicAuthenticationTypes>Basic</con:addedBasicAuthenticationTypes><con:preemptive>true</con:preemptive><con:authType>Preemptive</con:authType></con:credentials><con:jmsConfig JMSDeliveryMode="PERSISTENT"/><con:jmsPropertyConfig/><con:parameters><entry key="ParticipantIdentifierScheme" value="${Put ServiceGroup#ParticipantIdentifierScheme}" xmlns="http://eviware.com/soapui/config"/></con:parameters></con:restRequest></con:config></con:testStep><con:testStep type="restrequest" name="TEST Put ServiceMetadata UNAUTHOR_FIELD" id="373b57d7-42a3-4575-8cf2-0d873d97dbd4" disabled="true"><con:settings/><con:config service="SMP" resourcePath="/{ParticipantIdentifierScheme}::{ParticipantIdentifier}/services/{DocTypeIdentifierScheme}::{DocTypeIdentifier}" methodName="PUT ServiceMetadata" xsi:type="con:RestRequestStep" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><con:restRequest name="TEST Put ServiceMetadata UNAUTHOR_FIELD" mediaType="text/xml" postQueryString="false" id="74cb305c-6d80-4836-a6eb-4c6cc61f0dab"><con:settings><con:setting id="com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers"><entry key="domain" value="${#Project#defaultDomainName}" xmlns="http://eviware.com/soapui/config"/></con:setting></con:settings><con:endpoint>${#Project#url}</con:endpoint><con:request><![CDATA[<ServiceMetadata xmlns="http://docs.oasis-open.org/bdxr/ns/SMP/2016/05"> +</ServiceMetadata>]]></con:request><con:originalUri>http://wltdgt02.cc.cec.eu.int/cipa-smp-full-webapp/ehealth-actorid-qns%3A%3A0088%3A7770010100777/services/busdox-docid-qns%3Aurn%3Aoasis%3Anames%3Aspecification%3Aubl%3Aschema%3Axsd%3AInvoice-001%3A%3AInvoice%23%23UBL-2.0</con:originalUri><con:assertion type="Valid HTTP Status Codes" id="0260622c-5e84-428b-85cc-e83213d6a623" name="Valid HTTP Status Codes"><con:configuration><codes>400</codes></con:configuration></con:assertion><con:assertion type="Simple Contains" id="72285da6-038e-40a6-b5cb-7c32f66bb10f" name="Contains"><con:configuration><token>FORMAT_ERROR</token><ignoreCase>false</ignoreCase><useRegEx>false</useRegEx></con:configuration></con:assertion><con:credentials><con:username>${#Project#adminSmp1Test}</con:username><con:password>${#Project#adminSmp1TestPassword}</con:password><con:selectedAuthProfile>Basic</con:selectedAuthProfile><con:addedBasicAuthenticationTypes>Basic</con:addedBasicAuthenticationTypes><con:preemptive>true</con:preemptive><con:authType>Preemptive</con:authType></con:credentials><con:jmsConfig JMSDeliveryMode="PERSISTENT"/><con:jmsPropertyConfig/><con:parameters> + <con:entry key="ParticipantIdentifierScheme" value="ehealth-actorid-qns"/> + <con:entry key="ParticipantIdentifier" value=""/> +</con:parameters><con:parameterOrder><con:entry>ParticipantIdentifierScheme</con:entry><con:entry>ParticipantIdentifier</con:entry></con:parameterOrder></con:restRequest></con:config></con:testStep><con:testStep type="restrequest" name="Get ServiceMetadata FORMAT_ERROR Delimiter" id="2d0c97e6-f731-4285-b6f3-ed973b113059"><con:settings/><con:config service="SMP" resourcePath="/{ParticipantIdentifierScheme}::{ParticipantIdentifier}/services/{DocTypeIdentifierScheme}::{DocTypeIdentifier}" methodName="GET ServiceMetadata" xsi:type="con:RestRequestStep" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><con:restRequest name="Get ServiceMetadata FORMAT_ERROR Delimiter" mediaType="application/xml" id="798e6729-3cf8-44b5-8fc7-f19165c82521"><con:settings><con:setting id="com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers"><xml-fragment/></con:setting></con:settings><con:endpoint>${#Project#url}</con:endpoint><con:request/><con:originalUri>http://wltdgt02.cc.cec.eu.int/cipa-smp-full-webapp/ehealth-actorid-qns%3A%3A0088%3A7770010100777/services/busdox-docid-qns%3A%3Aurn%3Aoasis%3Anames%3Aspecification%3Aubl%3Aschema%3Axsd%3AInvoice-001%3A%3AInvoice%23%23UBL-2.0</con:originalUri><con:assertion type="Valid HTTP Status Codes" id="108aac0b-5f2d-4000-8678-31afca1f6816" name="Valid HTTP Status Codes"><con:configuration><codes>404</codes></con:configuration></con:assertion><con:assertion type="Simple Contains" id="8c1aa453-119a-4b89-91c1-b9ea9ded6dd7" name="Contains"><con:configuration><token>NOT_FOUND</token><ignoreCase>false</ignoreCase><useRegEx>false</useRegEx></con:configuration></con:assertion><con:credentials><con:selectedAuthProfile>Basic</con:selectedAuthProfile><con:addedBasicAuthenticationTypes>Basic</con:addedBasicAuthenticationTypes><con:preemptive>true</con:preemptive><con:authType>Preemptive</con:authType></con:credentials><con:jmsConfig JMSDeliveryMode="PERSISTENT"/><con:jmsPropertyConfig/><con:parameters><entry key="ParticipantIdentifierScheme" value="${Put ServiceGroup#ParticipantIdentifierScheme}" xmlns="http://eviware.com/soapui/config"/></con:parameters></con:restRequest></con:config></con:testStep><con:testStep type="restrequest" name="TEST Put ServiceMetadata UNAUTHOR_FIELD" id="373b57d7-42a3-4575-8cf2-0d873d97dbd4" disabled="true"><con:settings/><con:config service="SMP" resourcePath="/{ParticipantIdentifierScheme}::{ParticipantIdentifier}/services/{DocTypeIdentifierScheme}::{DocTypeIdentifier}" methodName="PUT ServiceMetadata" xsi:type="con:RestRequestStep" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><con:restRequest name="TEST Put ServiceMetadata UNAUTHOR_FIELD" mediaType="text/xml" postQueryString="false" id="74cb305c-6d80-4836-a6eb-4c6cc61f0dab"><con:settings><con:setting id="com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers"><entry key="domain" value="${#Project#defaultDomainName}" xmlns="http://eviware.com/soapui/config"/></con:setting></con:settings><con:endpoint>${#Project#url}</con:endpoint><con:request><![CDATA[<ServiceMetadata xmlns="http://docs.oasis-open.org/bdxr/ns/SMP/2016/05"> <ServiceInformation> <ParticipantIdentifier scheme="${=request.getProperty('ParticipantIdentifierScheme').getValue()}">${=request.getProperty('ParticipantIdentifier').getValue()}</ParticipantIdentifier> <DocumentIdentifier scheme="${=request.getProperty('DocTypeIdentifierScheme').getValue()}">${=request.getProperty('DocTypeIdentifier').getValue()}</DocumentIdentifier> @@ -3425,7 +3437,10 @@ testRunner.testCase.testSteps['Delete ServiceGroup'].run(testRunner, context); </ServiceMetadata>]]></con:request><con:originalUri>http://wltdgt02.cc.cec.eu.int/cipa-smp-full-webapp/ehealth-actorid-qns%3A%3A0088%3A7770010100777/services/busdox-docid-qns%3A%3Aurn%3Aoasis%3Anames%3Aspecification%3Aubl%3Aschema%3Axsd%3AInvoice-001%3A%3AInvoice%23%23UBL-2.0</con:originalUri><con:assertion type="Valid HTTP Status Codes" id="9e0a9400-9bb6-42a7-9104-ef7c169997b9" name="Valid HTTP Status Codes"><con:configuration><codes>201</codes></con:configuration></con:assertion><con:credentials><con:username>${#Project#adminSmp1Test}</con:username><con:password>${#Project#adminSmp1TestPassword}</con:password><con:selectedAuthProfile>Basic</con:selectedAuthProfile><con:addedBasicAuthenticationTypes>Basic</con:addedBasicAuthenticationTypes><con:preemptive>true</con:preemptive><con:authType>Preemptive</con:authType></con:credentials><con:jmsConfig JMSDeliveryMode="PERSISTENT"/><con:jmsPropertyConfig/><con:parameters> <con:entry key="ParticipantIdentifierScheme" value="${Put ServiceGroup#ParticipantIdentifierScheme}"/> <con:entry key="ParticipantIdentifier" value="${Put ServiceGroup#ParticipantIdentifier}"/> -</con:parameters></con:restRequest></con:config></con:testStep><con:testStep type="restrequest" name="TEST Delete ServiceMetadata FORMAT_ERROR" id="ee2f4c33-8d90-4b08-8c8c-2a9ed564057b"><con:settings/><con:config service="SMP" resourcePath="/ehealth-actorid-qns%3A%3A0088%3A7770010100777/services/busdox-docid-qns%3Aurn%3Aoasis%3Anames%3Aspecification%3Aubl%3Aschema%3Axsd%3AInvoice-001%3AInvoice%23%23UBL-2.0" methodName="YYYZZZ-59-Delete" xsi:type="con:RestRequestStep" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><con:restRequest name="TEST Delete ServiceMetadata FORMAT_ERROR" mediaType="application/xml" id="cfe391c2-9084-45a5-a637-fbbc25a25f27" postQueryString="false"><con:settings><con:setting id="com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers"><xml-fragment/></con:setting></con:settings><con:endpoint>${#Project#url}</con:endpoint><con:request/><con:originalUri>http://wltdgt02.cc.cec.eu.int/cipa-smp-full-webapp/ehealth-actorid-qns%3A%3A0088%3A7770010100777/services/busdox-docid-qns%3Aurn%3Aoasis%3Anames%3Aspecification%3Aubl%3Aschema%3Axsd%3AInvoice-001%3AInvoice%23%23UBL-2.0</con:originalUri><con:assertion type="Valid HTTP Status Codes" id="c4033a08-4d2f-4db5-b7d2-dce1419c0401" name="Valid HTTP Status Codes"><con:configuration><codes>400</codes></con:configuration></con:assertion><con:assertion type="Simple Contains" id="abe0bedb-b702-4d19-8624-f62104ed3299" name="Contains"><con:configuration><token>FORMAT_ERROR</token><ignoreCase>false</ignoreCase><useRegEx>false</useRegEx></con:configuration></con:assertion><con:assertion type="Simple Contains" id="48703dfe-9df9-4ae9-854b-96b0dcb6be5e" name="Contains 2"><con:configuration><token>Malformed identifier, scheme and id should be delimited by double colon</token><ignoreCase>false</ignoreCase><useRegEx>false</useRegEx></con:configuration></con:assertion><con:credentials><con:username>${#Project#adminSmp1Test}</con:username><con:password>${#Project#adminSmp1TestPassword}</con:password><con:selectedAuthProfile>Basic</con:selectedAuthProfile><con:addedBasicAuthenticationTypes>Basic</con:addedBasicAuthenticationTypes><con:preemptive>true</con:preemptive><con:authType>Preemptive</con:authType></con:credentials><con:jmsConfig JMSDeliveryMode="PERSISTENT"/><con:jmsPropertyConfig/><con:parameters/></con:restRequest></con:config></con:testStep><con:testStep type="restrequest" name="Get ServiceMetadata FORMAT_ERROR" id="5b1270fb-7209-478e-a9ac-d08c51c230d2"><con:settings/><con:config service="SMP" resourcePath="/{ParticipantIdentifierScheme}::{ParticipantIdentifier}/services/{DocTypeIdentifierScheme}::{DocTypeIdentifier}" methodName="GET ServiceMetadata" xsi:type="con:RestRequestStep" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><con:restRequest name="Get ServiceMetadata FORMAT_ERROR" mediaType="application/xml" id="798e6729-3cf8-44b5-8fc7-f19165c82521"><con:settings><con:setting id="com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers"><xml-fragment/></con:setting></con:settings><con:endpoint>${#Project#url}</con:endpoint><con:request/><con:originalUri>http://wltdgt02.cc.cec.eu.int/cipa-smp-full-webapp/ehealth-actorid-qns%3A%3A0088%3A7770010100777/services/busdox-docid-qns%3A%3Aurn%3Aoasis%3Anames%3Aspecification%3Aubl%3Aschema%3Axsd%3AInvoice-001%3A%3AInvoice%23%23UBL-2.0</con:originalUri><con:assertion type="Valid HTTP Status Codes" id="108aac0b-5f2d-4000-8678-31afca1f6816" name="Valid HTTP Status Codes"><con:configuration><codes>200</codes></con:configuration></con:assertion><con:credentials><con:selectedAuthProfile>Basic</con:selectedAuthProfile><con:addedBasicAuthenticationTypes>Basic</con:addedBasicAuthenticationTypes><con:preemptive>true</con:preemptive><con:authType>Preemptive</con:authType></con:credentials><con:jmsConfig JMSDeliveryMode="PERSISTENT"/><con:jmsPropertyConfig/><con:parameters/></con:restRequest></con:config></con:testStep><con:testStep type="restrequest" name="Delete ServiceMetadata" id="03fa933f-9f7d-4302-86fc-edb188e88373" disabled="true"><con:settings/><con:config service="SMP" resourcePath="/{ParticipantIdentifierScheme}::{ParticipantIdentifier}/services/{DocTypeIdentifierScheme}::{DocTypeIdentifier}" methodName="DELETE ServiceMetadata" xsi:type="con:RestRequestStep" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><con:restRequest name="Delete ServiceMetadata" mediaType="application/xml" id="cfe391c2-9084-45a5-a637-fbbc25a25f27" postQueryString="false"><con:settings><con:setting id="com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers"><xml-fragment/></con:setting></con:settings><con:endpoint>${#Project#url}</con:endpoint><con:request/><con:originalUri>http://wltdgt02.cc.cec.eu.int/cipa-smp-full-webapp/ehealth-actorid-qns%3A%3A0088%3A7770010100777/services/busdox-docid-qns%3A%3Aurn%3Aoasis%3Anames%3Aspecification%3Aubl%3Aschema%3Axsd%3AInvoice-001%3A%3AInvoice%23%23UBL-2.0</con:originalUri><con:assertion type="Valid HTTP Status Codes" id="7e8b1492-e2f8-45aa-b293-f460e1662715" name="Valid HTTP Status Codes"><con:configuration><codes>200</codes></con:configuration></con:assertion><con:credentials><con:username>${#Project#adminSmp1Test}</con:username><con:password>${#Project#adminSmp1TestPassword}</con:password><con:selectedAuthProfile>Basic</con:selectedAuthProfile><con:addedBasicAuthenticationTypes>Basic</con:addedBasicAuthenticationTypes><con:preemptive>true</con:preemptive><con:authType>Preemptive</con:authType></con:credentials><con:jmsConfig JMSDeliveryMode="PERSISTENT"/><con:jmsPropertyConfig/><con:parameters/></con:restRequest></con:config></con:testStep><con:testStep type="restrequest" name="Delete ServiceGroup" id="dda84879-7c1e-4019-a75b-a1428c5d8a9c" disabled="true"><con:settings/><con:config service="SMP" resourcePath="/{ParticipantIdentifierScheme}::{ParticipantIdentifier}" methodName="DELETE ServiceGroup" xsi:type="con:RestRequestStep" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><con:restRequest name="Delete ServiceGroup" mediaType="application/xml" id="a97cde56-8e9c-4d6f-b950-faf82b0268e9" postQueryString="false"><con:settings><con:setting id="com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers"><xml-fragment/></con:setting></con:settings><con:endpoint>${#Project#url}</con:endpoint><con:request/><con:originalUri>http://wltdgt02.cc.cec.eu.int/cipa-smp-full-webapp/ehealth-actorid-qns::0088:7770010100777</con:originalUri><con:assertion type="Valid HTTP Status Codes" id="030a58c2-0ac3-4d98-9575-e70e57cec7ec" name="Valid HTTP Status Codes"><con:configuration><codes>200</codes></con:configuration></con:assertion><con:credentials><con:username>${#Project#adminSmp1Test}</con:username><con:password>${#Project#adminSmp1TestPassword}</con:password><con:selectedAuthProfile>Basic</con:selectedAuthProfile><con:addedBasicAuthenticationTypes>Basic</con:addedBasicAuthenticationTypes><con:preemptive>true</con:preemptive><con:authType>Preemptive</con:authType></con:credentials><con:jmsConfig JMSDeliveryMode="PERSISTENT"/><con:jmsPropertyConfig/><con:parameters> +</con:parameters></con:restRequest></con:config></con:testStep><con:testStep type="restrequest" name="TEST Delete ServiceMetadata FORMAT_ERROR" id="ee2f4c33-8d90-4b08-8c8c-2a9ed564057b"><con:settings/><con:config service="SMP" resourcePath="/{ParticipantIdentifierScheme}%3A{ParticipantIdentifier}/services/busdox-docid-qns%3Aurn%3Aoasis%3Anames%3Aspecification%3Aubl%3Aschema%3Axsd%3AInvoice-001%3AInvoice%23%23UBL-2.0" methodName="YYYZZZ-59-Delete" xsi:type="con:RestRequestStep" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><con:restRequest name="TEST Delete ServiceMetadata FORMAT_ERROR" mediaType="application/xml" id="cfe391c2-9084-45a5-a637-fbbc25a25f27" postQueryString="false"><con:settings><con:setting id="com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers"><xml-fragment/></con:setting></con:settings><con:endpoint>${#Project#url}</con:endpoint><con:request/><con:originalUri>http://wltdgt02.cc.cec.eu.int/cipa-smp-full-webapp/ehealth-actorid-qns%3A%3A0088%3A7770010100777/services/busdox-docid-qns%3Aurn%3Aoasis%3Anames%3Aspecification%3Aubl%3Aschema%3Axsd%3AInvoice-001%3AInvoice%23%23UBL-2.0</con:originalUri><con:assertion type="Valid HTTP Status Codes" id="c4033a08-4d2f-4db5-b7d2-dce1419c0401" name="Valid HTTP Status Codes"><con:configuration><codes>400</codes></con:configuration></con:assertion><con:assertion type="Simple Contains" id="abe0bedb-b702-4d19-8624-f62104ed3299" name="Contains"><con:configuration><token>FORMAT_ERROR</token><ignoreCase>false</ignoreCase><useRegEx>false</useRegEx></con:configuration></con:assertion><con:assertion type="Simple Contains" id="48703dfe-9df9-4ae9-854b-96b0dcb6be5e" name="Contains 2"><con:configuration><token>Malformed identifier, scheme and id should be delimited by double colon</token><ignoreCase>false</ignoreCase><useRegEx>false</useRegEx></con:configuration></con:assertion><con:credentials><con:username>${#Project#adminSmp1Test}</con:username><con:password>${#Project#adminSmp1TestPassword}</con:password><con:selectedAuthProfile>Basic</con:selectedAuthProfile><con:addedBasicAuthenticationTypes>Basic</con:addedBasicAuthenticationTypes><con:preemptive>true</con:preemptive><con:authType>Preemptive</con:authType></con:credentials><con:jmsConfig JMSDeliveryMode="PERSISTENT"/><con:jmsPropertyConfig/><con:parameters> + <con:entry key="ParticipantIdentifierScheme" value=""/> + <con:entry key="ParticipantIdentifier" value=""/> +</con:parameters><con:parameterOrder><con:entry>ParticipantIdentifierScheme</con:entry><con:entry>ParticipantIdentifier</con:entry></con:parameterOrder></con:restRequest></con:config></con:testStep><con:testStep type="restrequest" name="Get ServiceMetadata FORMAT_ERROR" id="5b1270fb-7209-478e-a9ac-d08c51c230d2"><con:settings/><con:config service="SMP" resourcePath="/{ParticipantIdentifierScheme}::{ParticipantIdentifier}/services/{DocTypeIdentifierScheme}::{DocTypeIdentifier}" methodName="GET ServiceMetadata" xsi:type="con:RestRequestStep" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><con:restRequest name="Get ServiceMetadata FORMAT_ERROR" mediaType="application/xml" id="798e6729-3cf8-44b5-8fc7-f19165c82521"><con:settings><con:setting id="com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers"><xml-fragment/></con:setting></con:settings><con:endpoint>${#Project#url}</con:endpoint><con:request/><con:originalUri>http://wltdgt02.cc.cec.eu.int/cipa-smp-full-webapp/ehealth-actorid-qns%3A%3A0088%3A7770010100777/services/busdox-docid-qns%3A%3Aurn%3Aoasis%3Anames%3Aspecification%3Aubl%3Aschema%3Axsd%3AInvoice-001%3A%3AInvoice%23%23UBL-2.0</con:originalUri><con:assertion type="Valid HTTP Status Codes" id="108aac0b-5f2d-4000-8678-31afca1f6816" name="Valid HTTP Status Codes"><con:configuration><codes>200</codes></con:configuration></con:assertion><con:credentials><con:selectedAuthProfile>Basic</con:selectedAuthProfile><con:addedBasicAuthenticationTypes>Basic</con:addedBasicAuthenticationTypes><con:preemptive>true</con:preemptive><con:authType>Preemptive</con:authType></con:credentials><con:jmsConfig JMSDeliveryMode="PERSISTENT"/><con:jmsPropertyConfig/><con:parameters/></con:restRequest></con:config></con:testStep><con:testStep type="restrequest" name="Delete ServiceMetadata" id="03fa933f-9f7d-4302-86fc-edb188e88373" disabled="true"><con:settings/><con:config service="SMP" resourcePath="/{ParticipantIdentifierScheme}::{ParticipantIdentifier}/services/{DocTypeIdentifierScheme}::{DocTypeIdentifier}" methodName="DELETE ServiceMetadata" xsi:type="con:RestRequestStep" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><con:restRequest name="Delete ServiceMetadata" mediaType="application/xml" id="cfe391c2-9084-45a5-a637-fbbc25a25f27" postQueryString="false"><con:settings><con:setting id="com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers"><xml-fragment/></con:setting></con:settings><con:endpoint>${#Project#url}</con:endpoint><con:request/><con:originalUri>http://wltdgt02.cc.cec.eu.int/cipa-smp-full-webapp/ehealth-actorid-qns%3A%3A0088%3A7770010100777/services/busdox-docid-qns%3A%3Aurn%3Aoasis%3Anames%3Aspecification%3Aubl%3Aschema%3Axsd%3AInvoice-001%3A%3AInvoice%23%23UBL-2.0</con:originalUri><con:assertion type="Valid HTTP Status Codes" id="7e8b1492-e2f8-45aa-b293-f460e1662715" name="Valid HTTP Status Codes"><con:configuration><codes>200</codes></con:configuration></con:assertion><con:credentials><con:username>${#Project#adminSmp1Test}</con:username><con:password>${#Project#adminSmp1TestPassword}</con:password><con:selectedAuthProfile>Basic</con:selectedAuthProfile><con:addedBasicAuthenticationTypes>Basic</con:addedBasicAuthenticationTypes><con:preemptive>true</con:preemptive><con:authType>Preemptive</con:authType></con:credentials><con:jmsConfig JMSDeliveryMode="PERSISTENT"/><con:jmsPropertyConfig/><con:parameters/></con:restRequest></con:config></con:testStep><con:testStep type="restrequest" name="Delete ServiceGroup" id="dda84879-7c1e-4019-a75b-a1428c5d8a9c" disabled="true"><con:settings/><con:config service="SMP" resourcePath="/{ParticipantIdentifierScheme}::{ParticipantIdentifier}" methodName="DELETE ServiceGroup" xsi:type="con:RestRequestStep" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><con:restRequest name="Delete ServiceGroup" mediaType="application/xml" id="a97cde56-8e9c-4d6f-b950-faf82b0268e9" postQueryString="false"><con:settings><con:setting id="com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers"><xml-fragment/></con:setting></con:settings><con:endpoint>${#Project#url}</con:endpoint><con:request/><con:originalUri>http://wltdgt02.cc.cec.eu.int/cipa-smp-full-webapp/ehealth-actorid-qns::0088:7770010100777</con:originalUri><con:assertion type="Valid HTTP Status Codes" id="030a58c2-0ac3-4d98-9575-e70e57cec7ec" name="Valid HTTP Status Codes"><con:configuration><codes>200</codes></con:configuration></con:assertion><con:credentials><con:username>${#Project#adminSmp1Test}</con:username><con:password>${#Project#adminSmp1TestPassword}</con:password><con:selectedAuthProfile>Basic</con:selectedAuthProfile><con:addedBasicAuthenticationTypes>Basic</con:addedBasicAuthenticationTypes><con:preemptive>true</con:preemptive><con:authType>Preemptive</con:authType></con:credentials><con:jmsConfig JMSDeliveryMode="PERSISTENT"/><con:jmsPropertyConfig/><con:parameters> <con:entry key="ParticipantIdentifierScheme" value="${Put ServiceGroup#ParticipantIdentifierScheme}"/> <con:entry key="ParticipantIdentifier" value="${Put ServiceGroup#ParticipantIdentifier}"/> </con:parameters></con:restRequest></con:config></con:testStep><con:tearDownScript>// Run clean test steps. @@ -3955,7 +3970,10 @@ testRunner.testCase.testSteps['Delete ServiceGroup'].run(testRunner, context); </ServiceMetadata>]]></con:request><con:originalUri>http://wltdgt02.cc.cec.eu.int/cipa-smp-full-webapp/ehealth-actorid-qns%3A%3A0088%3A7770010100777/services/busdox-docid-qns%3A%3Aurn%3Aoasis%3Anames%3Aspecification%3Aubl%3Aschema%3Axsd%3AInvoice-001%3A%3AInvoice%23%23UBL-2.0</con:originalUri><con:assertion type="Valid HTTP Status Codes" id="9e0a9400-9bb6-42a7-9104-ef7c169997b9" name="Valid HTTP Status Codes"><con:configuration><codes>201</codes></con:configuration></con:assertion><con:credentials><con:username>${#Project#adminSmp1Test}</con:username><con:password>${#Project#adminSmp1TestPassword}</con:password><con:selectedAuthProfile>Basic</con:selectedAuthProfile><con:addedBasicAuthenticationTypes>Basic</con:addedBasicAuthenticationTypes><con:preemptive>true</con:preemptive><con:authType>Preemptive</con:authType></con:credentials><con:jmsConfig JMSDeliveryMode="PERSISTENT"/><con:jmsPropertyConfig/><con:parameters> <con:entry key="ParticipantIdentifierScheme" value="${Put ServiceGroup#ParticipantIdentifierScheme}"/> <con:entry key="ParticipantIdentifier" value="${Put ServiceGroup#ParticipantIdentifier}"/> -</con:parameters></con:restRequest></con:config></con:testStep><con:testStep type="restrequest" name="TEST Get ServiceMetadata FORMAT_ERROR" id="9f92039e-3140-46d0-a73d-1e9c0a5e43a6"><con:settings/><con:config service="SMP" resourcePath="/ehealth-actorid-qns%3A%3A0088%3A7770010100777/services/busdox-docid-qns%3Aurn%3Aoasis%3Anames%3Aspecification%3Aubl%3Aschema%3Axsd%3AInvoice-001%3AInvoice%23%23UBL-2.0" methodName="YYYZZZ-57-Get" xsi:type="con:RestRequestStep" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><con:restRequest name="TEST Get ServiceMetadata FORMAT_ERROR" mediaType="application/xml" id="798e6729-3cf8-44b5-8fc7-f19165c82521"><con:settings><con:setting id="com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers"><xml-fragment/></con:setting></con:settings><con:endpoint>${#Project#url}</con:endpoint><con:request/><con:originalUri>http://wltdgt02.cc.cec.eu.int/cipa-smp-full-webapp/ehealth-actorid-qns%3A%3A0088%3A7770010100777/services/busdox-docid-qns%3Aurn%3Aoasis%3Anames%3Aspecification%3Aubl%3Aschema%3Axsd%3AInvoice-001%3AInvoice%23%23UBL-2.0</con:originalUri><con:assertion type="Valid HTTP Status Codes" id="5176ed28-5b42-4f89-852e-61a0051311f0" name="Valid HTTP Status Codes"><con:configuration><codes>400</codes></con:configuration></con:assertion><con:assertion type="Simple Contains" id="0380a46c-02f4-4470-8a90-8d4faf960ade" name="Contains"><con:configuration><token>FORMAT_ERROR</token><ignoreCase>false</ignoreCase><useRegEx>false</useRegEx></con:configuration></con:assertion><con:credentials><con:selectedAuthProfile>Basic</con:selectedAuthProfile><con:addedBasicAuthenticationTypes>Basic</con:addedBasicAuthenticationTypes><con:preemptive>true</con:preemptive><con:authType>Preemptive</con:authType></con:credentials><con:jmsConfig JMSDeliveryMode="PERSISTENT"/><con:jmsPropertyConfig/><con:parameters/></con:restRequest></con:config></con:testStep><con:testStep type="restrequest" name="Delete ServiceMetadata" id="2fdfef48-bd82-4dec-8d2f-b26c5ac93de0" disabled="true"><con:settings/><con:config service="SMP" resourcePath="/{ParticipantIdentifierScheme}::{ParticipantIdentifier}/services/{DocTypeIdentifierScheme}::{DocTypeIdentifier}" methodName="DELETE ServiceMetadata" xsi:type="con:RestRequestStep" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><con:restRequest name="Delete ServiceMetadata" mediaType="application/xml" id="cfe391c2-9084-45a5-a637-fbbc25a25f27" postQueryString="false"><con:settings><con:setting id="com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers"><xml-fragment/></con:setting></con:settings><con:endpoint>${#Project#url}</con:endpoint><con:request/><con:originalUri>http://wltdgt02.cc.cec.eu.int/cipa-smp-full-webapp/ehealth-actorid-qns%3A%3A0088%3A7770010100777/services/busdox-docid-qns%3A%3Aurn%3Aoasis%3Anames%3Aspecification%3Aubl%3Aschema%3Axsd%3AInvoice-001%3A%3AInvoice%23%23UBL-2.0</con:originalUri><con:assertion type="Valid HTTP Status Codes" id="e64de946-a13c-4510-99d9-8b7304955884" name="Valid HTTP Status Codes"><con:configuration><codes>200</codes></con:configuration></con:assertion><con:credentials><con:username>${#Project#adminSmp1Test}</con:username><con:password>${#Project#adminSmp1TestPassword}</con:password><con:selectedAuthProfile>Basic</con:selectedAuthProfile><con:addedBasicAuthenticationTypes>Basic</con:addedBasicAuthenticationTypes><con:preemptive>true</con:preemptive><con:authType>Preemptive</con:authType></con:credentials><con:jmsConfig JMSDeliveryMode="PERSISTENT"/><con:jmsPropertyConfig/><con:parameters/></con:restRequest></con:config></con:testStep><con:testStep type="restrequest" name="Delete ServiceGroup" id="5a0cc9a9-37cf-4570-8774-30d90a429b68" disabled="true"><con:settings/><con:config service="SMP" resourcePath="/{ParticipantIdentifierScheme}::{ParticipantIdentifier}" methodName="DELETE ServiceGroup" xsi:type="con:RestRequestStep" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><con:restRequest name="Delete ServiceGroup" mediaType="application/xml" id="a97cde56-8e9c-4d6f-b950-faf82b0268e9" postQueryString="false"><con:settings><con:setting id="com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers"><xml-fragment/></con:setting></con:settings><con:endpoint>${#Project#url}</con:endpoint><con:request/><con:originalUri>http://wltdgt02.cc.cec.eu.int/cipa-smp-full-webapp/ehealth-actorid-qns::0088:7770010100777</con:originalUri><con:assertion type="Valid HTTP Status Codes" id="3100cee0-5ab5-45d8-81ce-c8fc888e057b" name="Valid HTTP Status Codes"><con:configuration><codes>200</codes></con:configuration></con:assertion><con:credentials><con:username>${#Project#adminSmp1Test}</con:username><con:password>${#Project#adminSmp1TestPassword}</con:password><con:selectedAuthProfile>Basic</con:selectedAuthProfile><con:addedBasicAuthenticationTypes>Basic</con:addedBasicAuthenticationTypes><con:preemptive>true</con:preemptive><con:authType>Preemptive</con:authType></con:credentials><con:jmsConfig JMSDeliveryMode="PERSISTENT"/><con:jmsPropertyConfig/><con:parameters> +</con:parameters></con:restRequest></con:config></con:testStep><con:testStep type="restrequest" name="TEST Get ServiceMetadata FORMAT_ERROR" id="9f92039e-3140-46d0-a73d-1e9c0a5e43a6"><con:settings/><con:config service="SMP" resourcePath="/{ParticipantIdentifierScheme}%3A{ParticipantIdentifier}/services/busdox-docid-qns%3Aurn%3Aoasis%3Anames%3Aspecification%3Aubl%3Aschema%3Axsd%3AInvoice-001%3AInvoice%23%23UBL-2.0" methodName="YYYZZZ-57-Get" xsi:type="con:RestRequestStep" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><con:restRequest name="TEST Get ServiceMetadata FORMAT_ERROR" mediaType="application/xml" id="798e6729-3cf8-44b5-8fc7-f19165c82521"><con:settings><con:setting id="com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers"><xml-fragment/></con:setting></con:settings><con:endpoint>${#Project#url}</con:endpoint><con:request/><con:originalUri>http://wltdgt02.cc.cec.eu.int/cipa-smp-full-webapp/ehealth-actorid-qns%3A%3A0088%3A7770010100777/services/busdox-docid-qns%3Aurn%3Aoasis%3Anames%3Aspecification%3Aubl%3Aschema%3Axsd%3AInvoice-001%3AInvoice%23%23UBL-2.0</con:originalUri><con:assertion type="Valid HTTP Status Codes" id="5176ed28-5b42-4f89-852e-61a0051311f0" name="Valid HTTP Status Codes"><con:configuration><codes>400</codes></con:configuration></con:assertion><con:assertion type="Simple Contains" id="0380a46c-02f4-4470-8a90-8d4faf960ade" name="Contains"><con:configuration><token>FORMAT_ERROR</token><ignoreCase>false</ignoreCase><useRegEx>false</useRegEx></con:configuration></con:assertion><con:credentials><con:selectedAuthProfile>Basic</con:selectedAuthProfile><con:addedBasicAuthenticationTypes>Basic</con:addedBasicAuthenticationTypes><con:preemptive>true</con:preemptive><con:authType>Preemptive</con:authType></con:credentials><con:jmsConfig JMSDeliveryMode="PERSISTENT"/><con:jmsPropertyConfig/><con:parameters> + <con:entry key="ParticipantIdentifierScheme" value=""/> + <con:entry key="ParticipantIdentifier" value=""/> +</con:parameters><con:parameterOrder><con:entry>ParticipantIdentifierScheme</con:entry><con:entry>ParticipantIdentifier</con:entry></con:parameterOrder></con:restRequest></con:config></con:testStep><con:testStep type="restrequest" name="Delete ServiceMetadata" id="2fdfef48-bd82-4dec-8d2f-b26c5ac93de0" disabled="true"><con:settings/><con:config service="SMP" resourcePath="/{ParticipantIdentifierScheme}::{ParticipantIdentifier}/services/{DocTypeIdentifierScheme}::{DocTypeIdentifier}" methodName="DELETE ServiceMetadata" xsi:type="con:RestRequestStep" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><con:restRequest name="Delete ServiceMetadata" mediaType="application/xml" id="cfe391c2-9084-45a5-a637-fbbc25a25f27" postQueryString="false"><con:settings><con:setting id="com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers"><xml-fragment/></con:setting></con:settings><con:endpoint>${#Project#url}</con:endpoint><con:request/><con:originalUri>http://wltdgt02.cc.cec.eu.int/cipa-smp-full-webapp/ehealth-actorid-qns%3A%3A0088%3A7770010100777/services/busdox-docid-qns%3A%3Aurn%3Aoasis%3Anames%3Aspecification%3Aubl%3Aschema%3Axsd%3AInvoice-001%3A%3AInvoice%23%23UBL-2.0</con:originalUri><con:assertion type="Valid HTTP Status Codes" id="e64de946-a13c-4510-99d9-8b7304955884" name="Valid HTTP Status Codes"><con:configuration><codes>200</codes></con:configuration></con:assertion><con:credentials><con:username>${#Project#adminSmp1Test}</con:username><con:password>${#Project#adminSmp1TestPassword}</con:password><con:selectedAuthProfile>Basic</con:selectedAuthProfile><con:addedBasicAuthenticationTypes>Basic</con:addedBasicAuthenticationTypes><con:preemptive>true</con:preemptive><con:authType>Preemptive</con:authType></con:credentials><con:jmsConfig JMSDeliveryMode="PERSISTENT"/><con:jmsPropertyConfig/><con:parameters/></con:restRequest></con:config></con:testStep><con:testStep type="restrequest" name="Delete ServiceGroup" id="5a0cc9a9-37cf-4570-8774-30d90a429b68" disabled="true"><con:settings/><con:config service="SMP" resourcePath="/{ParticipantIdentifierScheme}::{ParticipantIdentifier}" methodName="DELETE ServiceGroup" xsi:type="con:RestRequestStep" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><con:restRequest name="Delete ServiceGroup" mediaType="application/xml" id="a97cde56-8e9c-4d6f-b950-faf82b0268e9" postQueryString="false"><con:settings><con:setting id="com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers"><xml-fragment/></con:setting></con:settings><con:endpoint>${#Project#url}</con:endpoint><con:request/><con:originalUri>http://wltdgt02.cc.cec.eu.int/cipa-smp-full-webapp/ehealth-actorid-qns::0088:7770010100777</con:originalUri><con:assertion type="Valid HTTP Status Codes" id="3100cee0-5ab5-45d8-81ce-c8fc888e057b" name="Valid HTTP Status Codes"><con:configuration><codes>200</codes></con:configuration></con:assertion><con:credentials><con:username>${#Project#adminSmp1Test}</con:username><con:password>${#Project#adminSmp1TestPassword}</con:password><con:selectedAuthProfile>Basic</con:selectedAuthProfile><con:addedBasicAuthenticationTypes>Basic</con:addedBasicAuthenticationTypes><con:preemptive>true</con:preemptive><con:authType>Preemptive</con:authType></con:credentials><con:jmsConfig JMSDeliveryMode="PERSISTENT"/><con:jmsPropertyConfig/><con:parameters> <con:entry key="ParticipantIdentifierScheme" value="${Put ServiceGroup#ParticipantIdentifierScheme}"/> <con:entry key="ParticipantIdentifier" value="${Put ServiceGroup#ParticipantIdentifier}"/> </con:parameters></con:restRequest></con:config></con:testStep><con:tearDownScript>// Run clean test steps. @@ -8384,4 +8402,4 @@ test.finalize();</scriptText></con:configuration></con:assertion><con:assertion </con:parameters></con:restRequest></con:config></con:testStep><con:tearDownScript>// Run clean test steps. testRunner.testCase.testSteps['Delete ServiceMetadata'].run(testRunner, context); testRunner.testCase.testSteps['Delete ServiceGroup'].run(testRunner, context); -//ExcelReporting.reportTestCase(testRunner, log)</con:tearDownScript><con:properties/><con:reportParameters/><con:breakPoints><con:testStepId>cda74952-fe52-42df-8643-8a59932a76f9</con:testStepId><con:status>NONE</con:status><con:properties/></con:breakPoints><con:breakPoints><con:testStepId>e84b7e54-b24e-491a-95b2-a12ff29eb5cc</con:testStepId><con:status>NONE</con:status><con:properties/></con:breakPoints><con:breakPoints><con:testStepId>46350f0e-d28d-4ed8-9a45-06d697f21192</con:testStepId><con:status>NONE</con:status><con:properties/></con:breakPoints><con:breakPoints><con:testStepId>3e085bb5-d0a1-4264-8e84-74bc84466c0e</con:testStepId><con:status>NONE</con:status><con:properties/></con:breakPoints></con:testCase><con:properties/><con:reportParameters/></con:testSuite><con:testSuite id="f2e20764-c52e-404a-87d9-65ac638ff0a9" name="DEV_BAMBOO_CANDIDATES"><con:settings/><con:runType>SEQUENTIAL</con:runType><con:properties/></con:testSuite><con:requirements/><con:properties><con:property><con:name>url</con:name><con:value>http://localhost:8981/smp</con:value></con:property><con:property><con:name>reportFilePath</con:name><con:value>C:\\ec\\soapui\\reports\\SMP_TEST_4.xlsx</con:value></con:property><con:property><con:name>updateReport</con:name><con:value>false</con:value></con:property><con:property><con:name>urlExt</con:name><con:value>https://edeltest5.westeurope.cloudapp.azure.com:8443/smp</con:value></con:property><con:property><con:name>defaultParticipantIdentifierScheme</con:name><con:value>ehealth-actorid-qns</con:value></con:property><con:property><con:name>defaultParticipantIdentifier</con:name><con:value>0088:7770010100777:test</con:value></con:property><con:property><con:name>defaultDocTypeIdentifierScheme</con:name><con:value>busdox-docid-qns</con:value></con:property><con:property><con:name>defaultDocTypeIdentifier</con:name><con:value>urn:oasis:names:specification:ubl:schema:xsd:Invoice-12::Invoice##urn:www.cenbii.eu:transaction:biicoretrdm010:ver1.0:#urn:www.peppol.eu:bis:peppol4a:ver1.0::2.0</con:value></con:property><con:property><con:name>secondDefaultParticipantIdentifierScheme</con:name><con:value>iso6523-actorid-upis</con:value></con:property><con:property><con:name>secondDefaultParticipantIdentifier</con:name><con:value>0088:777002abzz777:test</con:value></con:property><con:property><con:name>secondDefaultDocTypeIdentifierScheme</con:name><con:value>busdox-docid-qns</con:value></con:property><con:property><con:name>secondDefaultDocTypeIdentifier</con:name><con:value>urn:oasis:names:specification:ubl:schema:xsd:Invoice-001::Invoice##UBL-2.0</con:value></con:property><con:property><con:name>defaultDomainName</con:name><con:value>domain</con:value></con:property><con:property><con:name>testWithMultipleDomain</con:name><con:value>false</con:value></con:property><con:property><con:name>testDB</con:name><con:value>false</con:value></con:property><con:property><con:name>jdbc.url</con:name><con:value>jdbc:oracle:thin:@localhost:51521/xe</con:value></con:property><con:property><con:name>jdbc.driver</con:name><con:value>oracle.jdbc.OracleDriver</con:value></con:property><con:property><con:name>dbUser</con:name><con:value>user</con:value></con:property><con:property><con:name>dbPassword</con:name><con:value>password</con:value></con:property><con:property><con:name>adminSmp1Test</con:name><con:value>AdminSMP1TEST</con:value></con:property><con:property><con:name>adminSmp1TestPassword</con:name><con:value>adminsmp1test</con:value></con:property><con:property><con:name>adminSmp2Test</con:name><con:value>AdminSMP2TEST</con:value></con:property><con:property><con:name>adminSmp2TestPassword</con:name><con:value>adminsmp2test</con:value></con:property><con:property><con:name>ebCoreISO6523ParticipantIdentifierScheme</con:name><con:value>urn:oasis:names:tc:ebcore:partyid-type:iso6523:0088</con:value></con:property><con:property><con:name>ebCoreUnregisteredParticipantIdentifierScheme</con:name><con:value>urn:oasis:names:tc:ebcore:partyid-type:unregistered</con:value></con:property><con:property><con:name>ebCoreUnregisteredWithCatalogParticipantIdentifierScheme</con:name><con:value>urn:oasis:names:tc:ebcore:partyid-type:unregistered:domain</con:value></con:property><con:property><con:name>ebCoreISO6523ParticipantIdentifier</con:name><con:value>7770010100777</con:value></con:property></con:properties><con:wssContainer/><con:databaseConnectionContainer/><con:oAuth2ProfileContainer/><con:oAuth1ProfileContainer/><con:reporting><con:xmlTemplates/><con:parameters/></con:reporting><con:sensitiveInformation/></con:soapui-project> \ No newline at end of file +//ExcelReporting.reportTestCase(testRunner, log)</con:tearDownScript><con:properties/><con:reportParameters/><con:breakPoints><con:testStepId>cda74952-fe52-42df-8643-8a59932a76f9</con:testStepId><con:status>NONE</con:status><con:properties/></con:breakPoints><con:breakPoints><con:testStepId>e84b7e54-b24e-491a-95b2-a12ff29eb5cc</con:testStepId><con:status>NONE</con:status><con:properties/></con:breakPoints><con:breakPoints><con:testStepId>46350f0e-d28d-4ed8-9a45-06d697f21192</con:testStepId><con:status>NONE</con:status><con:properties/></con:breakPoints><con:breakPoints><con:testStepId>3e085bb5-d0a1-4264-8e84-74bc84466c0e</con:testStepId><con:status>NONE</con:status><con:properties/></con:breakPoints></con:testCase><con:properties/><con:reportParameters/></con:testSuite><con:testSuite id="f2e20764-c52e-404a-87d9-65ac638ff0a9" name="DEV_BAMBOO_CANDIDATES"><con:settings/><con:runType>SEQUENTIAL</con:runType><con:properties/></con:testSuite><con:requirements/><con:properties><con:property><con:name>url</con:name><con:value>http://localhost:8982/smp</con:value></con:property><con:property><con:name>reportFilePath</con:name><con:value>C:\\ec\\soapui\\reports\\SMP_TEST_4.xlsx</con:value></con:property><con:property><con:name>updateReport</con:name><con:value>false</con:value></con:property><con:property><con:name>urlExt</con:name><con:value>https://edeltest5.westeurope.cloudapp.azure.com:8443/smp</con:value></con:property><con:property><con:name>defaultParticipantIdentifierScheme</con:name><con:value>ehealth-actorid-qns</con:value></con:property><con:property><con:name>defaultParticipantIdentifier</con:name><con:value>0088:7770010100777:test</con:value></con:property><con:property><con:name>defaultDocTypeIdentifierScheme</con:name><con:value>busdox-docid-qns</con:value></con:property><con:property><con:name>defaultDocTypeIdentifier</con:name><con:value>urn:oasis:names:specification:ubl:schema:xsd:Invoice-12::Invoice##urn:www.cenbii.eu:transaction:biicoretrdm010:ver1.0:#urn:www.peppol.eu:bis:peppol4a:ver1.0::2.0</con:value></con:property><con:property><con:name>secondDefaultParticipantIdentifierScheme</con:name><con:value>iso6523-actorid-upis</con:value></con:property><con:property><con:name>secondDefaultParticipantIdentifier</con:name><con:value>0088:777002abzz777:test</con:value></con:property><con:property><con:name>secondDefaultDocTypeIdentifierScheme</con:name><con:value>busdox-docid-qns</con:value></con:property><con:property><con:name>secondDefaultDocTypeIdentifier</con:name><con:value>urn:oasis:names:specification:ubl:schema:xsd:Invoice-001::Invoice##UBL-2.0</con:value></con:property><con:property><con:name>defaultDomainName</con:name><con:value>domain</con:value></con:property><con:property><con:name>testWithMultipleDomain</con:name><con:value>false</con:value></con:property><con:property><con:name>testDB</con:name><con:value>false</con:value></con:property><con:property><con:name>jdbc.url</con:name><con:value>jdbc:oracle:thin:@localhost:51521/xe</con:value></con:property><con:property><con:name>jdbc.driver</con:name><con:value>oracle.jdbc.OracleDriver</con:value></con:property><con:property><con:name>dbUser</con:name><con:value>user</con:value></con:property><con:property><con:name>dbPassword</con:name><con:value>password</con:value></con:property><con:property><con:name>adminSmp1Test</con:name><con:value>AdminSMP1TEST</con:value></con:property><con:property><con:name>adminSmp1TestPassword</con:name><con:value>adminsmp1test</con:value></con:property><con:property><con:name>adminSmp2Test</con:name><con:value>AdminSMP2TEST</con:value></con:property><con:property><con:name>adminSmp2TestPassword</con:name><con:value>adminsmp2test</con:value></con:property><con:property><con:name>ebCoreISO6523ParticipantIdentifierScheme</con:name><con:value>urn:oasis:names:tc:ebcore:partyid-type:iso6523:0088</con:value></con:property><con:property><con:name>ebCoreUnregisteredParticipantIdentifierScheme</con:name><con:value>urn:oasis:names:tc:ebcore:partyid-type:unregistered</con:value></con:property><con:property><con:name>ebCoreUnregisteredWithCatalogParticipantIdentifierScheme</con:name><con:value>urn:oasis:names:tc:ebcore:partyid-type:unregistered:domain</con:value></con:property><con:property><con:name>ebCoreISO6523ParticipantIdentifier</con:name><con:value>7770010100777</con:value></con:property></con:properties><con:wssContainer/><con:databaseConnectionContainer/><con:oAuth2ProfileContainer/><con:oAuth1ProfileContainer/><con:reporting><con:xmlTemplates/><con:parameters/></con:reporting><con:sensitiveInformation/></con:soapui-project> \ No newline at end of file diff --git a/smp-spi/pom.xml b/smp-spi/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..ead4a25ebaf238872c2df608177fc60f3b7ad327 --- /dev/null +++ b/smp-spi/pom.xml @@ -0,0 +1,51 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + ~ Copyright 2017 European Commission | CEF eDelivery + ~ + ~ Licensed under the EUPL, Version 1.2 or – as soon they will be approved by the European Commission - subsequent versions of the EUPL (the "Licence"); + ~ You may not use this work except in compliance with the Licence. + ~ + ~ You may obtain a copy of the Licence attached in file: LICENCE-EUPL-v1.2.pdf + ~ + ~ Unless required by applicable law or agreed to in writing, software distributed under the Licence is distributed on an "AS IS" basis, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the Licence for the specific language governing permissions and limitations under the Licence. + --> + +<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>eu.europa.ec.edelivery</groupId> + <artifactId>smp-modules</artifactId> + <version>4.2-SNAPSHOT</version> + <relativePath>../pom.xml</relativePath> + </parent> + + <artifactId>smp-spi</artifactId> + <name>smp-spi</name> + <description>SMP Service provider interface (SPI). The SMP SPI is an application interface intended to be implemented or extended + by a third party as library. The libraries must be added to SMP library directory and are loaded at startup.</description> + <dependencies> + <dependency> + <groupId>ch.qos.logback</groupId> + <artifactId>logback-classic</artifactId> + </dependency> + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-api</artifactId> + </dependency> + <dependency> + <groupId>org.hamcrest</groupId> + <artifactId>hamcrest-junit</artifactId> + <scope>test</scope> + </dependency> + </dependencies> + <build> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-compiler-plugin</artifactId> + </plugin> + </plugins> + </build> +</project> diff --git a/smp-spi/src/main/java/eu/europa/ec/smp/spi/PayloadValidatorSpi.java b/smp-spi/src/main/java/eu/europa/ec/smp/spi/PayloadValidatorSpi.java new file mode 100644 index 0000000000000000000000000000000000000000..e82f676e8d407f17b031d327bc0a9962fa023829 --- /dev/null +++ b/smp-spi/src/main/java/eu/europa/ec/smp/spi/PayloadValidatorSpi.java @@ -0,0 +1,24 @@ +package eu.europa.ec.smp.spi; + +import eu.europa.ec.smp.spi.exceptions.PayloadValidatorSpiException; + +import java.io.InputStream; + +/** + * @author Joze Rihtarsic + * @since 4.2 + * + * SMP Service provider interface (SPI) for uploaded payload validation. + * This SPI interface is intended to allow antivirus validation using third-party antivirus software. + */ +public interface PayloadValidatorSpi { + + /** + * Validates the SMP payload. If the payload is invalid it throws PayloadValidatorSpiException + * + * @param payload The payload data to be validated + * @param mimeType The payload mime type + * @throws PayloadValidatorSpiException in case the validation does not pass + */ + void validatePayload(InputStream payload, String mimeType) throws PayloadValidatorSpiException; +} \ No newline at end of file diff --git a/smp-spi/src/main/java/eu/europa/ec/smp/spi/exceptions/PayloadValidatorSpiException.java b/smp-spi/src/main/java/eu/europa/ec/smp/spi/exceptions/PayloadValidatorSpiException.java new file mode 100644 index 0000000000000000000000000000000000000000..e68068e9044d4d1f41aac381dfea8b2c97bee864 --- /dev/null +++ b/smp-spi/src/main/java/eu/europa/ec/smp/spi/exceptions/PayloadValidatorSpiException.java @@ -0,0 +1,21 @@ +package eu.europa.ec.smp.spi.exceptions; + +/** + * @author Joze Rihtarsic + * @since 4.2 + * + * The external validation library throws the exception if the payload validation does not pass. + */ +public class PayloadValidatorSpiException extends Exception { + public PayloadValidatorSpiException(String message) { + super(message); + } + + public PayloadValidatorSpiException(String message, Throwable cause) { + super(message, cause); + } + + public PayloadValidatorSpiException(Throwable cause) { + super(cause); + } +} diff --git a/smp-ui-tests/src/main/java/pages/keystore/KeyStoreImportDialog.java b/smp-ui-tests/src/main/java/pages/keystore/KeyStoreImportDialog.java index 948398ecf44bfb2db0dbb05d2cb551ffcb05a220..9162566688ce3da2678e212925f8b9038a93b4ab 100644 --- a/smp-ui-tests/src/main/java/pages/keystore/KeyStoreImportDialog.java +++ b/smp-ui-tests/src/main/java/pages/keystore/KeyStoreImportDialog.java @@ -1,26 +1,24 @@ package pages.keystore; + import org.apache.log4j.Logger; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; -import org.openqa.selenium.interactions.Actions; import org.openqa.selenium.support.FindBy; import org.openqa.selenium.support.PageFactory; import org.openqa.selenium.support.pagefactory.AjaxElementLocatorFactory; import pages.components.baseComponents.PageComponent; import utils.PROPERTIES; -import java.awt.*; -import java.awt.datatransfer.StringSelection; -import java.awt.event.KeyEvent; import java.io.File; -import java.net.URL; -public class KeyStoreImportDialog extends PageComponent{ +public class KeyStoreImportDialog extends PageComponent { protected Logger log = Logger.getLogger(this.getClass()); + public KeyStoreImportDialog(WebDriver driver) { - super(driver); + super(driver); PageFactory.initElements(new AjaxElementLocatorFactory(driver, PROPERTIES.TIMEOUT), this); - } + } + @FindBy(xpath = "//span[text()='Import']") private WebElement importBtn; @@ -38,34 +36,35 @@ public class KeyStoreImportDialog extends PageComponent{ @FindBy(css = "#password_id") private WebElement passwordInput; - - public KeyStoreEditDialog clickImportBtn() - { + + public KeyStoreEditDialog clickImportBtn() { log.info("clicking import btn "); waitForElementToBeClickable(importBtn).click(); waitForElementToBeGone(importBtn); return new KeyStoreEditDialog(driver); - + } - public KeyStoreEditDialog clickCancelBtn(){ + + public KeyStoreEditDialog clickCancelBtn() { log.info("clicking import keystore"); waitForElementToBeClickable(cancelBtn).click(); waitForElementToBeGone(cancelBtn); return new KeyStoreEditDialog(driver); } - public KeyStoreEditDialog clickCloseBtn(){ + public KeyStoreEditDialog clickCloseBtn() { log.info("clicking close btn"); waitForElementToBeClickable(closeBtn).click(); waitForElementToBeGone(closeBtn); return new KeyStoreEditDialog(driver); } + public void chooseKeystoreFile(String relativePath) { - String path =new File(relativePath).getAbsolutePath() ; + String path = new File(relativePath).getAbsolutePath(); chooseKeystore.sendKeys(path); } - public void fillPassword(String password) - { + + public void fillPassword(String password) { waitForElementToBeVisible(passwordInput).sendKeys(password); } diff --git a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/auth/SMPAuthenticationProvider.java b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/auth/SMPAuthenticationProvider.java index 308882b2683373b905524ae7a6e5354479fc61d5..475a426d93a9409a844f3a944295d52a305a0397 100644 --- a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/auth/SMPAuthenticationProvider.java +++ b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/auth/SMPAuthenticationProvider.java @@ -228,11 +228,12 @@ public class SMPAuthenticationProvider implements AuthenticationProvider { return; } - if (user.getLastFailedLoginAttempt() == null) { + if (user.getLastTokenFailedLoginAttempt() == null) { LOG.warn("Access token [{}] has failed attempts [{}] but null last Failed login attempt!", user.getUsername(), user.getLastFailedLoginAttempt()); return; } - // check if the last failed attempt is already expired. If yes just clear the attepmts + + // check if the last failed attempt is already expired. If yes just clear the attempts if (configurationService.getAccessTokenLoginSuspensionTimeInSeconds() != null && configurationService.getAccessTokenLoginSuspensionTimeInSeconds() > 0 && ChronoUnit.SECONDS.between(OffsetDateTime.now(), user.getLastTokenFailedLoginAttempt()) > configurationService.getAccessTokenLoginSuspensionTimeInSeconds()) { LOG.warn("User [{}] suspension is expired! Clear failed login attempts and last failed login attempt", user.getUsername()); diff --git a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/auth/URLCsrfIgnoreMatcher.java b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/auth/URLCsrfIgnoreMatcher.java new file mode 100644 index 0000000000000000000000000000000000000000..5a5666e16c6472c42c79195a7174c0b6f507d5f4 --- /dev/null +++ b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/auth/URLCsrfIgnoreMatcher.java @@ -0,0 +1,72 @@ +package eu.europa.ec.edelivery.smp.auth; + +import eu.europa.ec.edelivery.smp.logging.SMPLoggerFactory; +import org.slf4j.Logger; +import org.springframework.http.HttpMethod; +import org.springframework.security.web.util.matcher.RegexRequestMatcher; +import org.springframework.security.web.util.matcher.RequestMatcher; + +import javax.servlet.http.HttpServletRequest; +import java.util.*; + +/** + * URLCsrfMatcher matches the request and validates if request can be ignored for CSRF. + * As example the non session requests (as SMP REST API) should now have the CSRF tokens. + * + * @author Joze Rihtarsic + * @since 4.2 + */ +public class URLCsrfIgnoreMatcher implements RequestMatcher { + + private static final Logger LOG = SMPLoggerFactory.getLogger( + URLCsrfIgnoreMatcher.class); + private List<RegexRequestMatcher> unprotectedMatcherList = new ArrayList<>(); + + public URLCsrfIgnoreMatcher() { + this(null, null); + } + + public URLCsrfIgnoreMatcher(List<String> regularExpressions, List<HttpMethod> methods) { + if (regularExpressions == null || regularExpressions.isEmpty()) { + return; + } + regularExpressions.forEach(regexp -> addIgnoreUrl(regexp, methods)); + } + + @Override + public boolean matches(HttpServletRequest request) { + Optional<RegexRequestMatcher> unprotectedMatcher = unprotectedMatcherList.stream().filter(requestMatcher -> requestMatcher.matches(request)).findFirst(); + if (unprotectedMatcher.isPresent()) { + LOG.debug("Ignore CSRF for: [{}] - [{}] with matcher [{}]!", request.getMethod(), request.getRequestURI(),unprotectedMatcher.get().toString()); + } + return !unprotectedMatcher.isPresent(); + } + + + /** + * Creates a case-sensitive {@code Pattern} instance to match against the request for http method(s). + * + * @param ignoreUrlPattern the regular expression to match ignore URLs. + * @param httpMethods the HTTP method(s) to match. May be null to match all methods. + */ + public void addIgnoreUrl(String ignoreUrlPattern, HttpMethod... httpMethods) { + addIgnoreUrl(ignoreUrlPattern, httpMethods == null || httpMethods.length == 0 ? null : Arrays.asList(httpMethods)); + } + + + /** + * Creates a case-sensitive {@code Pattern} instance to match against the request for http method(s). + * + * @param ignoreUrlPattern the regular expression to match ignore URLs. + * @param httpMethods list of the HTTP method(s) to match. May be null or empty to match all methods. + */ + public void addIgnoreUrl(String ignoreUrlPattern, List<HttpMethod> httpMethods) { + if (httpMethods == null || httpMethods.isEmpty()) { + unprotectedMatcherList.add(new RegexRequestMatcher(ignoreUrlPattern, null)); + } else { + httpMethods.forEach(httpMethod -> { + unprotectedMatcherList.add(new RegexRequestMatcher(ignoreUrlPattern, httpMethod.name())); + }); + } + } +} \ No newline at end of file diff --git a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/auth/URLCsrfMatcher.java b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/auth/URLCsrfMatcher.java deleted file mode 100644 index 3b68855f96780bd7e4be09d88c441ffc11570178..0000000000000000000000000000000000000000 --- a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/auth/URLCsrfMatcher.java +++ /dev/null @@ -1,50 +0,0 @@ -package eu.europa.ec.edelivery.smp.auth; - -import eu.europa.ec.edelivery.smp.logging.SMPLoggerFactory; -import org.slf4j.Logger; -import org.springframework.http.HttpMethod; -import org.springframework.security.web.util.matcher.RegexRequestMatcher; -import org.springframework.security.web.util.matcher.RequestMatcher; - -import javax.annotation.PostConstruct; -import javax.servlet.http.HttpServletRequest; -import java.util.*; -import java.util.regex.Matcher; - -/** - * URLCsrfMatcher matches the request and validates if request can be ignored for CSRF. - * As example the non session requests (as SMP REST API) should now have the CSRF tokens. - * - * @author Joze Rihtarsic - * @since 4.2 - */ -public class URLCsrfMatcher implements RequestMatcher { - - private static final Logger LOG = SMPLoggerFactory.getLogger(URLCsrfMatcher.class); - private List<RequestMatcher> unprotectedMatcherList = new ArrayList<>(); - - - - @Override - public boolean matches(HttpServletRequest request) { - Optional<RequestMatcher> unprotectedMatcher = unprotectedMatcherList.stream().filter(requestMatcher -> requestMatcher.matches(request)).findFirst(); - return !unprotectedMatcher.isPresent(); - } - - - /** - * Creates a case-sensitive {@code Pattern} instance to match against the request for http method(s). - * @param ignoreUrlPattern the regular expression to match ignore URLs. - * @param httpMethods the HTTP method(s) to match. May be null to match all methods. - */ - public void addIgnoreUrl(String ignoreUrlPattern, HttpMethod ... httpMethods) { - if (httpMethods==null || httpMethods.length ==0) { - unprotectedMatcherList.add(new RegexRequestMatcher(ignoreUrlPattern, null)); - } else { - Arrays.stream(httpMethods).forEach(httpMethod -> { - unprotectedMatcherList.add(new RegexRequestMatcher(ignoreUrlPattern, httpMethod.name())); - }); - } - - } -} \ No newline at end of file diff --git a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/config/MDCLogRequestFilter.java b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/config/MDCLogRequestFilter.java index bf7a8805045b3f12aeca99415c84b004fca94bed..12890f111780ff8df99a4e287ffa2c99a621800c 100644 --- a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/config/MDCLogRequestFilter.java +++ b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/config/MDCLogRequestFilter.java @@ -6,50 +6,39 @@ import eu.europa.ec.edelivery.smp.logging.SMPLoggerFactory; import eu.europa.ec.edelivery.smp.utils.SessionSecurityUtils; import org.slf4j.MDC; import org.springframework.web.filter.GenericFilterBean; -import org.springframework.web.filter.OncePerRequestFilter; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.UUID; +/** + * SMP MDC logging filter sets the LOG MDC context as user, request id and session id. + * + * @author Joze Rihtarsic + * @since 4.2 + */ public class MDCLogRequestFilter extends GenericFilterBean { private static final SMPLogger LOG = SMPLoggerFactory.getLogger(MDCLogRequestFilter.class); -/* - @Override - protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { - String username = SessionSecurityUtils.getAuthenticationName(); - String requestId = UUID.randomUUID().toString(); - String sessionId =request.getSession() != null ? request.getSession().getId() : null; - LOG.debug("Set request MDC data: user: [{}], request: [{}], session: [{}]!", username,requestId,sessionId); - - MDC.put(SMPLogger.MDC_USER, username); - MDC.put(SMPLogger.MDC_REQUEST_ID, UUID.randomUUID().toString()); - MDC.put(SMPLogger.MDC_SESSION_ID, request.getSession() != null ? request.getSession().getId() : null); - //filterChain.doFilter(request, response); - //MDC.clear(); - } -*/ @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { + LOG.debug("Set MDC context to request!"); String username = SessionSecurityUtils.getAuthenticationName(); String requestId = UUID.randomUUID().toString(); - String sessionId =null; - if (request instanceof HttpServletRequest){ + String sessionId = null; + if (request instanceof HttpServletRequest) { HttpServletRequest httpRequest = (HttpServletRequest) request; - sessionId =httpRequest.getSession() != null ? httpRequest.getSession().getId() : null; + sessionId = httpRequest.getSession() != null ? httpRequest.getSession().getId() : null; } MDC.put(SMPLogger.MDC_USER, username); MDC.put(SMPLogger.MDC_REQUEST_ID, requestId); MDC.put(SMPLogger.MDC_SESSION_ID, sessionId); //doFilter chain.doFilter(request, response); + LOG.debug("clear MDC context from request!"); MDC.clear(); - - } } \ No newline at end of file diff --git a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/config/PropertiesConfig.java b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/config/PropertiesConfig.java index 46385a701de665b55d6538bd4c0c5b020f30b2c6..ea0291c8fe00b65970671118149095c84c05da8b 100644 --- a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/config/PropertiesConfig.java +++ b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/config/PropertiesConfig.java @@ -24,15 +24,15 @@ import static eu.europa.ec.edelivery.smp.data.ui.enums.SMPPropertyEnum.CONFIGURA import static eu.europa.ec.edelivery.smp.data.ui.enums.SMPPropertyEnum.SMP_PROPERTY_REFRESH_CRON; /** - * Created by Flavio Santos - * Class read properties from configuration file if exists. Than it use datasource (default by JNDI - * if not defined in property file jdbc/smpDatasource) to read application properties. Because this class is - * invoked before datasource is initialized by default - it creates it's own database connection. - * Also it uses hibernate to handle dates for Configuration table. + * SMP application initializer. Purpose of the class is to set SMP application configuration, reads the smp properties + * and load classes from external libraries! + * + * @author Joze Rihtarsic + * @since 4.2 */ @Configuration @ComponentScan(basePackages = { - "eu.europa.ec.edelivery.smp"}) + "eu.europa.ec.edelivery.smp","eu.europa.ec.smp"}) @PropertySources({ @PropertySource(value = "classpath:application.properties", ignoreResourceNotFound = true) }) @@ -41,6 +41,7 @@ public class PropertiesConfig { private static PropertyInitialization PROP_INIT_TOOLS = new PropertyInitialization(); private static final SMPLogger LOG = SMPLoggerFactory.getLogger(PropertiesConfig.class); + @Bean public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() { PropertySourcesPlaceholderConfigurer propertiesConfig = new PropertySourcesPlaceholderConfigurer(); @@ -54,18 +55,10 @@ public class PropertiesConfig { // add properties from database - add override from the database properties fileProperties.putAll(prop); - // log application properties - PROP_INIT_TOOLS.logBuildProperties(); - // update log configuration - FileProperty.updateLogConfiguration(fileProperties.getProperty(FileProperty.PROPERTY_LOG_FOLDER), - fileProperties.getProperty(FileProperty.PROPERTY_LOG_PROPERTIES), prop.getProperty(CONFIGURATION_DIR.getProperty()) - ); propertiesConfig.setProperties(fileProperties); propertiesConfig.setLocalOverride(true); LOG.debug("Properties are initialized"); - - return propertiesConfig; } } diff --git a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/config/SMPInitializer.java b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/config/SMPInitializer.java new file mode 100644 index 0000000000000000000000000000000000000000..8a6e92192f70c44d7e8f443e80cce6516f55d2e4 --- /dev/null +++ b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/config/SMPInitializer.java @@ -0,0 +1,103 @@ +package eu.europa.ec.edelivery.smp.config; + +import eu.europa.ec.edelivery.smp.auth.URLCsrfIgnoreMatcher; +import eu.europa.ec.edelivery.smp.exceptions.ErrorCode; +import eu.europa.ec.edelivery.smp.exceptions.SMPRuntimeException; +import eu.europa.ec.edelivery.smp.logging.SMPLoggerFactory; +import eu.europa.ec.edelivery.smp.utils.ExtLibraryClassLoader; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.exception.ExceptionUtils; +import org.apache.commons.text.StringSubstitutor; +import org.slf4j.Logger; +import org.springframework.web.WebApplicationInitializer; + +import javax.servlet.ServletContext; +import javax.servlet.ServletException; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.net.MalformedURLException; +import java.util.Properties; + +import static eu.europa.ec.edelivery.smp.data.ui.enums.SMPPropertyEnum.CONFIGURATION_DIR; + + +public class SMPInitializer implements WebApplicationInitializer { + + private static final String FILE_APPLICATION_PROPERTIES = "/application.properties"; + + private static final String PROP_BUILD_NAME = "smp.artifact.name"; + private static final String PROP_BUILD_VERSION = "smp.artifact.version"; + private static final String PROP_BUILD_TIME = "smp.artifact.build.time"; + + + private static final Logger LOG = SMPLoggerFactory.getLogger( + SMPInitializer.class); + @Override + public void onStartup(ServletContext servletContext) throws ServletException { + Properties fileProperties = FileProperty.getFileProperties(); + logBuildProperties(); + + // load external libraries + String libraryFolderPath = StringUtils.trim(fileProperties.getProperty(FileProperty.PROPERTY_LIB_FOLDER, null)); + if (StringUtils.isNotBlank(libraryFolderPath)){ + File fLibraryDir = new File(libraryFolderPath); + ExtLibraryClassLoader pluginClassLoader = createLibraryClassLoader(fLibraryDir); + if (pluginClassLoader!=null){ + LOG.debug("Add libraries from the folder: [{}]!", libraryFolderPath); + Thread.currentThread().setContextClassLoader(pluginClassLoader); + } + } else { + LOG.info("Library folder is not set! No libraries are loaded!"); + } + } + + /** + * Method reads internal 'application.properties' file and prints the build version to the logs + */ + protected void logBuildProperties() { + InputStream is = PropertyInitialization.class.getResourceAsStream(FILE_APPLICATION_PROPERTIES); + if (is != null) { + Properties applProp = new Properties(); + try { + applProp.load(is); + LOG.info("*****************************************************************************************"); + LOG.info("Start application: name: {}, version: {}, build time: {}.", applProp.getProperty(PROP_BUILD_NAME) + , applProp.getProperty(PROP_BUILD_VERSION) + , applProp.getProperty(PROP_BUILD_TIME)); + LOG.info("*****************************************************************************************"); + } catch (IOException e) { + LOG.error("Error occurred while reading application properties. Is file " + FILE_APPLICATION_PROPERTIES + " included in war!", e); + } + } else { + LOG.error("Not found application build properties: {}!", FILE_APPLICATION_PROPERTIES); + } + } + + /** + * Method creates the ClassLoader for the external libraries places into the smpLibrary folder. + * + * @param smpLibraryFolder is the SMP library folder + * @return + */ + protected ExtLibraryClassLoader createLibraryClassLoader(File smpLibraryFolder) { + LOG.info("Load libraries from location [{}]", smpLibraryFolder); + if (!smpLibraryFolder.exists() ) { + LOG.warn("Library folder [{}] does not exist! No libraries are loaded!", smpLibraryFolder.getAbsolutePath()); + return null; + } + if (!smpLibraryFolder.isDirectory() ) { + LOG.warn("Library folder [{}] is not a folder! No libraries are loaded!", smpLibraryFolder.getAbsolutePath()); + return null; + } + + ExtLibraryClassLoader pluginClassLoader = null; + try { + pluginClassLoader = new ExtLibraryClassLoader(smpLibraryFolder, Thread.currentThread().getContextClassLoader()); + } catch (MalformedURLException e) { + LOG.error("MalformedURLException occurred while loading the external libraries from folder [{}] with error cause [{}]! No libraries are loaded!", + smpLibraryFolder.getAbsolutePath(), ExceptionUtils.getRootCauseMessage(e)); + } + return pluginClassLoader; + } +} diff --git a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/config/SmpWebAppConfig.java b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/config/SmpWebAppConfig.java index 5816ed719bb59b8f5bf1dcb6963777d9e1dd961a..38c38ead8397630779db4435f61bfc5820bf0264 100644 --- a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/config/SmpWebAppConfig.java +++ b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/config/SmpWebAppConfig.java @@ -49,7 +49,6 @@ public class SmpWebAppConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { - registry.addMapping("/**") .allowedOrigins("*") .allowedMethods("*"); diff --git a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/config/UISecurityConfigurerAdapter.java b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/config/UISecurityConfigurerAdapter.java index 25dc56e05c21d65380fb719c4d4178a4f83921c6..6d269ecaac38bf61ab677e2b92e1c8d5b061a494 100644 --- a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/config/UISecurityConfigurerAdapter.java +++ b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/config/UISecurityConfigurerAdapter.java @@ -2,12 +2,13 @@ package eu.europa.ec.edelivery.smp.config; import eu.europa.ec.edelivery.smp.auth.SMPAuthenticationProviderForUI; -import eu.europa.ec.edelivery.smp.auth.URLCsrfMatcher; +import eu.europa.ec.edelivery.smp.auth.URLCsrfIgnoreMatcher; import eu.europa.ec.edelivery.smp.data.ui.auth.SMPAuthority; import eu.europa.ec.edelivery.smp.error.SMPSecurityExceptionHandler; import eu.europa.ec.edelivery.smp.services.ConfigurationService; import eu.europa.ec.edelivery.smp.ui.ResourceConstants; import eu.europa.ec.edelivery.smp.utils.SMPCookieWriter; +import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -179,11 +180,11 @@ public class UISecurityConfigurerAdapter extends WebSecurityConfigurerAdapter { .maxAgeInSeconds(maxAge) .requestMatcher(AnyRequestMatcher.INSTANCE).and().and(); } -/* + String contentSecurityPolicy = configurationService.getHttpHeaderContentSecurityPolicy(); if (StringUtils.isNotBlank(contentSecurityPolicy)) { httpSecurity = httpSecurity.headers().contentSecurityPolicy(contentSecurityPolicy).and().and(); - }*/ + } } @Override @@ -223,19 +224,21 @@ public class UISecurityConfigurerAdapter extends WebSecurityConfigurerAdapter { @Bean public RequestMatcher csrfURLMatcher() { - URLCsrfMatcher requestMatcher = new URLCsrfMatcher(); + URLCsrfIgnoreMatcher requestMatcher = new URLCsrfIgnoreMatcher(); // init pages requestMatcher.addIgnoreUrl("^$", HttpMethod.GET); - requestMatcher.addIgnoreUrl("^(/smp)?/$", HttpMethod.GET); - requestMatcher.addIgnoreUrl("/favicon(-[0-9x]{2,7})?.(png|ico)$", HttpMethod.GET); + //ignore CSRF for SMP rest API + requestMatcher.addIgnoreUrl("^/(?!ui/)[^/]*(/services/.*)?$", HttpMethod.GET,HttpMethod.PUT,HttpMethod.DELETE,HttpMethod.POST); + + //requestMatcher.addIgnoreUrl("^(/smp)?/$", HttpMethod.GET); + //requestMatcher.addIgnoreUrl("/favicon(-[0-9x]{2,7})?.(png|ico)$", HttpMethod.GET); requestMatcher.addIgnoreUrl("^(/smp)?/(index.html|ui/(#/)?|)$", HttpMethod.GET); // Csrf ignore "SMP API 'stateless' calls! (each call is authenticated and session is not used!)" - requestMatcher.addIgnoreUrl("/.*:+.*(/services/?.*)?", HttpMethod.GET, HttpMethod.DELETE, HttpMethod.POST, HttpMethod.PUT); + //requestMatcher.addIgnoreUrl("/.*:+.*(/services/?.*)?", HttpMethod.GET, HttpMethod.DELETE, HttpMethod.POST, HttpMethod.PUT); // ignore for login and logout requestMatcher.addIgnoreUrl(ResourceConstants.CONTEXT_PATH_PUBLIC_SECURITY + "/authentication", HttpMethod.DELETE, HttpMethod.POST); - requestMatcher.addIgnoreUrl(SMP_SECURITY_PATH_CAS_AUTHENTICATE, HttpMethod.GET); - // allow all gets + // allow all gets except for rest services requestMatcher.addIgnoreUrl("/ui/.*", HttpMethod.GET); // monitor requestMatcher.addIgnoreUrl("/monitor/is-alive", HttpMethod.GET); diff --git a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/config/WSSecurityConfigurerAdapter.java b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/config/WSSecurityConfigurerAdapter.java index 24204d58c3d0c2a0d2cd7c41719e95e22fa99b44..35ad4ff583af732376647dc4d0cc47361ff274a6 100644 --- a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/config/WSSecurityConfigurerAdapter.java +++ b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/config/WSSecurityConfigurerAdapter.java @@ -206,8 +206,7 @@ public class WSSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter { clientCertAuthenticationFilter.setClientCertAuthenticationEnabled(configurationService.isExternalTLSAuthenticationWithClientCertHeaderEnabled()); } return clientCertAuthenticationFilter; - } - + } public EDeliveryX509AuthenticationFilter getEDeliveryX509AuthenticationFilter() throws Exception { if (x509AuthenticationFilter == null) { @@ -219,7 +218,6 @@ public class WSSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter { return x509AuthenticationFilter; } - public void setExternalTlsAuthenticationWithClientCertHeaderEnabled(boolean clientCertEnabled) { try { getClientCertAuthenticationFilter().setClientCertAuthenticationEnabled(clientCertEnabled); diff --git a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/controllers/ServiceGroupController.java b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/controllers/ServiceGroupController.java index 8ba71f1a4c9bff5b581634a57cae58b5cc8867e2..ce251bae57ff529fc9e8a2b17dfe0f5e4376919e 100644 --- a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/controllers/ServiceGroupController.java +++ b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/controllers/ServiceGroupController.java @@ -13,11 +13,13 @@ package eu.europa.ec.edelivery.smp.controllers; +import eu.europa.ec.edelivery.smp.conversion.CaseSensitivityNormalizer; import eu.europa.ec.edelivery.smp.data.ui.auth.SMPAuthority; import eu.europa.ec.edelivery.smp.conversion.ServiceGroupConverter; import eu.europa.ec.edelivery.smp.logging.SMPLogger; import eu.europa.ec.edelivery.smp.logging.SMPLoggerFactory; import eu.europa.ec.edelivery.smp.logging.SMPMessageCode; +import eu.europa.ec.edelivery.smp.services.PayloadValidatorService; import eu.europa.ec.edelivery.smp.services.ServiceGroupService; import eu.europa.ec.edelivery.smp.services.ServiceMetadataService; import eu.europa.ec.edelivery.smp.validation.ServiceGroupValidator; @@ -33,9 +35,11 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.security.access.annotation.Secured; import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.util.MimeTypeUtils; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; +import java.io.ByteArrayInputStream; import java.util.List; import static eu.europa.ec.edelivery.smp.controllers.WebConstans.HTTP_PARAM_DOMAIN; @@ -55,18 +59,26 @@ public class ServiceGroupController { private static final SMPLogger LOG = SMPLoggerFactory.getLogger(ServiceGroupController.class); - @Autowired - private ServiceGroupValidator serviceGroupValidator; - - @Autowired - private SmpUrlBuilder pathBuilder; - - @Autowired - private ServiceGroupService serviceGroupService; - - @Autowired - private ServiceMetadataService serviceMetadataService; - + protected final ServiceGroupValidator serviceGroupValidator; + protected final SmpUrlBuilder pathBuilder; + protected final ServiceGroupService serviceGroupService; + protected final ServiceMetadataService serviceMetadataService; + protected final CaseSensitivityNormalizer caseSensitivityNormalizer; + protected final PayloadValidatorService payloadValidatorService; + + public ServiceGroupController(ServiceGroupValidator serviceGroupValidator, + SmpUrlBuilder pathBuilder, + ServiceGroupService serviceGroupService, + ServiceMetadataService serviceMetadataService, + CaseSensitivityNormalizer caseSensitivityNormalizer, + PayloadValidatorService payloadValidatorService) { + this.serviceGroupValidator = serviceGroupValidator; + this.pathBuilder = pathBuilder; + this.serviceGroupService = serviceGroupService; + this.serviceMetadataService = serviceMetadataService; + this.caseSensitivityNormalizer = caseSensitivityNormalizer; + this.payloadValidatorService = payloadValidatorService; + } @GetMapping(produces = "text/xml; charset=UTF-8") public ServiceGroup getServiceGroup(HttpServletRequest httpReq, @PathVariable String serviceGroupId) { @@ -75,7 +87,8 @@ public class ServiceGroupController { String host = httpReq.getRemoteHost(); LOG.businessInfo(SMPMessageCode.BUS_HTTP_GET_SERVICE_GROUP, host, serviceGroupId); - ServiceGroup serviceGroup = serviceGroupService.getServiceGroup(asParticipantId(serviceGroupId)); + ParticipantIdentifierType participantIdentifierType = caseSensitivityNormalizer.normalizeParticipant(serviceGroupId); + ServiceGroup serviceGroup = serviceGroupService.getServiceGroup(participantIdentifierType); addReferences(serviceGroup); LOG.businessInfo(SMPMessageCode.BUS_HTTP_GET_END_SERVICE_GROUP, host, serviceGroupId); @@ -94,7 +107,8 @@ public class ServiceGroupController { String authentUser = SecurityContextHolder.getContext().getAuthentication().getName(); String host = getRemoteHost(httpReq); LOG.businessInfo(SMPMessageCode.BUS_HTTP_PUT_SERVICE_GROUP, authentUser, host, serviceGroupOwner, domain, serviceGroupId); - + // validate payload + payloadValidatorService.validateUploadedContent(new ByteArrayInputStream(body), MimeTypeUtils.APPLICATION_XML_VALUE); // Validations BdxSmpOasisValidator.validateXSD(body); final ServiceGroup serviceGroup = ServiceGroupConverter.unmarshal(body); @@ -114,9 +128,8 @@ public class ServiceGroupController { String host = getRemoteHost(httpReq); LOG.businessInfo(SMPMessageCode.BUS_HTTP_DELETE_SERVICE_GROUP, authentUser, host, serviceGroupId); - - final ParticipantIdentifierType aServiceGroupID = Identifiers.asParticipantId(serviceGroupId); - serviceGroupService.deleteServiceGroup(aServiceGroupID); + ParticipantIdentifierType participantIdentifierType = caseSensitivityNormalizer.normalizeParticipant(serviceGroupId); + serviceGroupService.deleteServiceGroup(participantIdentifierType); LOG.businessInfo(SMPMessageCode.BUS_HTTP_DELETE_END_SERVICE_GROUP, authentUser, host, serviceGroupId); return ok().build(); diff --git a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/controllers/ServiceMetadataController.java b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/controllers/ServiceMetadataController.java index ce0b0da9df0eac7a9f3cc598e45fd7031a120799..e0ae31ec5f150e5f65a422e2e26f7c1ebf5b30e3 100644 --- a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/controllers/ServiceMetadataController.java +++ b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/controllers/ServiceMetadataController.java @@ -13,23 +13,28 @@ package eu.europa.ec.edelivery.smp.controllers; +import eu.europa.ec.edelivery.smp.conversion.CaseSensitivityNormalizer; import eu.europa.ec.edelivery.smp.conversion.ServiceMetadataConverter; import eu.europa.ec.edelivery.smp.logging.SMPLogger; import eu.europa.ec.edelivery.smp.logging.SMPLoggerFactory; import eu.europa.ec.edelivery.smp.logging.SMPMessageCode; +import eu.europa.ec.edelivery.smp.services.PayloadValidatorService; import eu.europa.ec.edelivery.smp.services.ServiceMetadataService; import eu.europa.ec.edelivery.smp.validation.ServiceMetadataValidator; import eu.europa.ec.smp.api.exceptions.XmlInvalidAgainstSchemaException; import org.apache.commons.lang3.StringUtils; +import org.oasis_open.docs.bdxr.ns.smp._2016._05.ParticipantIdentifierType; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.util.MimeTypeUtils; import org.springframework.web.bind.annotation.*; import org.w3c.dom.Document; import javax.servlet.http.HttpServletRequest; import javax.xml.transform.TransformerException; +import java.io.ByteArrayInputStream; import java.io.UnsupportedEncodingException; import static eu.europa.ec.edelivery.smp.controllers.WebConstans.HTTP_PARAM_DOMAIN; @@ -47,15 +52,23 @@ public class ServiceMetadataController { private static final SMPLogger LOG = SMPLoggerFactory.getLogger(ServiceGroupController.class); - @Autowired - private ServiceMetadataValidator serviceMetadataValidator; - - @Autowired - private ServiceMetadataService serviceMetadataService; - - - @Autowired - private SmpUrlBuilder pathBuilder; + protected final ServiceMetadataValidator serviceMetadataValidator; + protected final ServiceMetadataService serviceMetadataService; + protected final SmpUrlBuilder pathBuilder; + protected final CaseSensitivityNormalizer caseSensitivityNormalizer; + protected final PayloadValidatorService payloadValidatorService; + + public ServiceMetadataController(ServiceMetadataValidator serviceMetadataValidator, + ServiceMetadataService serviceMetadataService, + SmpUrlBuilder pathBuilder, + CaseSensitivityNormalizer caseSensitivityNormalizer, + PayloadValidatorService payloadValidatorService) { + this.serviceMetadataValidator = serviceMetadataValidator; + this.serviceMetadataService = serviceMetadataService; + this.pathBuilder = pathBuilder; + this.caseSensitivityNormalizer = caseSensitivityNormalizer; + this.payloadValidatorService = payloadValidatorService; + } @GetMapping(produces = "text/xml; charset=UTF-8") public String getServiceMetadata(HttpServletRequest httpReq, @@ -64,8 +77,8 @@ public class ServiceMetadataController { String host = httpReq.getRemoteHost(); LOG.businessInfo(SMPMessageCode.BUS_HTTP_GET_SERVICE_METADATA, host, serviceGroupId, serviceMetadataId); - - Document serviceMetadata = serviceMetadataService.getServiceMetadataDocument(asParticipantId(serviceGroupId), asDocumentId(serviceMetadataId)); + ParticipantIdentifierType participantIdentifierType = caseSensitivityNormalizer.normalizeParticipant(serviceGroupId); + Document serviceMetadata = serviceMetadataService.getServiceMetadataDocument(participantIdentifierType, asDocumentId(serviceMetadataId)); LOG.businessInfo(SMPMessageCode.BUS_HTTP_GET_END_SERVICE_METADATA, host, serviceGroupId, serviceMetadataId); return ServiceMetadataConverter.toString(serviceMetadata); @@ -85,10 +98,12 @@ public class ServiceMetadataController { String authentUser = SecurityContextHolder.getContext().getAuthentication().getName(); String host = getRemoteHost(httpReq); LOG.businessInfo(SMPMessageCode.BUS_HTTP_PUT_SERVICE_METADATA, authentUser, host, domain, serviceGroupId, serviceMetadataId); + // validate payload + payloadValidatorService.validateUploadedContent(new ByteArrayInputStream(body), MimeTypeUtils.APPLICATION_XML_VALUE); serviceMetadataValidator.validate(serviceGroupId, serviceMetadataId, body); - - boolean newServiceMetadataCreated = serviceMetadataService.saveServiceMetadata(domain, asParticipantId(serviceGroupId), asDocumentId(serviceMetadataId), body); + ParticipantIdentifierType participantIdentifierType = caseSensitivityNormalizer.normalizeParticipant(serviceGroupId); + boolean newServiceMetadataCreated = serviceMetadataService.saveServiceMetadata(domain, participantIdentifierType, asDocumentId(serviceMetadataId), body); LOG.businessInfo(SMPMessageCode.BUS_HTTP_PUT_END_SERVICE_METADATA, authentUser, host, domain, serviceGroupId, serviceMetadataId, newServiceMetadataCreated); @@ -108,8 +123,8 @@ public class ServiceMetadataController { String authentUser = SecurityContextHolder.getContext().getAuthentication().getName(); String host = getRemoteHost(httpReq); LOG.businessInfo(SMPMessageCode.BUS_HTTP_DELETE_SERVICE_METADATA, authentUser, host, domain, serviceGroupId, serviceMetadataId); - - serviceMetadataService.deleteServiceMetadata(domain, asParticipantId(serviceGroupId), asDocumentId(serviceMetadataId)); + ParticipantIdentifierType participantIdentifierType = caseSensitivityNormalizer.normalizeParticipant(serviceGroupId); + serviceMetadataService.deleteServiceMetadata(domain, participantIdentifierType, asDocumentId(serviceMetadataId)); LOG.businessInfo(SMPMessageCode.BUS_HTTP_DELETE_END_SERVICE_METADATA, authentUser, host, domain, serviceGroupId, serviceMetadataId); return ok().build(); diff --git a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/error/AbstractErrorControllerAdvice.java b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/error/AbstractErrorControllerAdvice.java index 6d63882e10e9f96898bb366684fe17bd47c0ade6..9ed316716e90a752e44b4167e1f2dd5508c4fe0a 100644 --- a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/error/AbstractErrorControllerAdvice.java +++ b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/error/AbstractErrorControllerAdvice.java @@ -32,7 +32,7 @@ abstract class AbstractErrorControllerAdvice { AuthenticationException ex = (AuthenticationException)runtimeException; response = buildAndLog(UNAUTHORIZED, ErrorBusinessCode.UNAUTHORIZED, ex.getMessage(), ex); }else if (runtimeException instanceof AccessDeniedException){ - AuthenticationException ex = (AuthenticationException)runtimeException; + AccessDeniedException ex = (AccessDeniedException)runtimeException; response = buildAndLog(UNAUTHORIZED, ErrorBusinessCode.UNAUTHORIZED, ex.getMessage(), ex); } else { diff --git a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/external/TruststoreResource.java b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/external/TruststoreResource.java index 57459f62e8cd69f280a1da513f5448103f8402c7..99c6290e5f517aaf3dbedbec5a92e0130f891c82 100644 --- a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/external/TruststoreResource.java +++ b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/external/TruststoreResource.java @@ -7,6 +7,7 @@ import eu.europa.ec.edelivery.smp.data.ui.auth.SMPAuthority; import eu.europa.ec.edelivery.smp.exceptions.SMPRuntimeException; import eu.europa.ec.edelivery.smp.logging.SMPLogger; import eu.europa.ec.edelivery.smp.logging.SMPLoggerFactory; +import eu.europa.ec.edelivery.smp.services.PayloadValidatorService; import eu.europa.ec.edelivery.smp.services.ui.UITruststoreService; import eu.europa.ec.edelivery.smp.ui.ResourceConstants; import eu.europa.ec.edelivery.smp.utils.X509CertificateUtils; @@ -16,6 +17,7 @@ import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.util.MimeTypeUtils; import org.springframework.web.bind.annotation.*; +import java.io.ByteArrayInputStream; import java.io.IOException; import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; @@ -33,13 +35,20 @@ public class TruststoreResource { private static final SMPLogger LOG = SMPLoggerFactory.getLogger(TruststoreResource.class); - @Autowired - private UITruststoreService uiTruststoreService; + private final UITruststoreService uiTruststoreService; + private final PayloadValidatorService payloadValidatorService; + + public TruststoreResource(UITruststoreService uiTruststoreService, PayloadValidatorService payloadValidatorService) { + this.uiTruststoreService = uiTruststoreService; + this.payloadValidatorService = payloadValidatorService; + } @PreAuthorize("@smpAuthorizationService.systemAdministrator || @smpAuthorizationService.isCurrentlyLoggedIn(#userId)") @PostMapping(path = "/{user-id}/validate-certificate", consumes = MimeTypeUtils.APPLICATION_OCTET_STREAM_VALUE, produces = MimeTypeUtils.APPLICATION_JSON_VALUE) public CertificateRO validateCertificate(@PathVariable("user-id") String userId, @RequestBody byte[] data) { LOG.info("Got certificate data size: {}", data.length); + // validate uploaded content + payloadValidatorService.validateUploadedContent(new ByteArrayInputStream(data), MimeTypeUtils.APPLICATION_OCTET_STREAM_VALUE); return uiTruststoreService.getCertificateData(data, true); } diff --git a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/internal/ApplicationAdminResource.java b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/internal/ApplicationAdminResource.java index 302dbc8137095a2b5666b43f7681fa4d2a12c0ef..1c6eb4e42ded2ff33ed33ca1d5f4f0ece2bef6b5 100644 --- a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/internal/ApplicationAdminResource.java +++ b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/internal/ApplicationAdminResource.java @@ -2,21 +2,14 @@ package eu.europa.ec.edelivery.smp.ui.internal; import eu.europa.ec.edelivery.smp.data.ui.SmpConfigRO; -import eu.europa.ec.edelivery.smp.data.ui.SmpInfoRO; import eu.europa.ec.edelivery.smp.data.ui.auth.SMPAuthority; import eu.europa.ec.edelivery.smp.services.ConfigurationService; import eu.europa.ec.edelivery.smp.ui.ResourceConstants; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.core.env.Environment; import org.springframework.security.access.annotation.Secured; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; -import java.util.TimeZone; - /** * @author Joze Rihtarsic * @since 4.1 @@ -41,6 +34,7 @@ public class ApplicationAdminResource { info.setParticipantSchemaRegExp(configurationService.getParticipantIdentifierSchemeRexExpPattern()); info.setParticipantSchemaRegExpMessage(configurationService.getParticipantIdentifierSchemeRexExpMessage()); info.setConcatEBCorePartyId(configurationService.getForceConcatenateEBCorePartyId()); + info.setPartyIDSchemeMandatory(configurationService.getParticipantSchemeMandatory()); info.setPasswordValidationRegExp(configurationService.getPasswordPolicyRexExpPattern()); info.setPasswordValidationRegExpMessage(configurationService.getPasswordPolicyValidationMessage()); diff --git a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/internal/DomainAdminResource.java b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/internal/DomainAdminResource.java index 788c498b040799ed990961cb25d85bf552571d67..52db33b067200e97a969c0d80d16fac5835612fb 100644 --- a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/internal/DomainAdminResource.java +++ b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/internal/DomainAdminResource.java @@ -87,7 +87,7 @@ public class DomainAdminResource { @PreAuthorize("@smpAuthorizationService.systemAdministrator || @smpAuthorizationService.isCurrentlyLoggedIn(#userId)") @PutMapping(value = "/{user-id}/sml-register/{domain-code}") - public SMLIntegrationResult registerDomainAndParticipants(@PathVariable("user-id") Long userId, + public SMLIntegrationResult registerDomainAndParticipants(@PathVariable("user-id") String userId, @PathVariable("domain-code") String domainCode ) { LOG.info("SML register domain code: {}, user user-id {}", domainCode, userId); @@ -106,7 +106,7 @@ public class DomainAdminResource { @PreAuthorize("@smpAuthorizationService.systemAdministrator || @smpAuthorizationService.isCurrentlyLoggedIn(#userId)") @PutMapping(value = "/{user-id}/sml-unregister/{domain-code}") - public SMLIntegrationResult unregisterDomainAndParticipants(@PathVariable("user-id") Long userId, + public SMLIntegrationResult unregisterDomainAndParticipants(@PathVariable("user-id") String userId, @PathVariable("domain-code") String domainCode) { LOG.info("SML unregister domain code: {}, user id {}", domainCode, userId); // try to open keystore diff --git a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/internal/KeystoreResource.java b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/internal/KeystoreResource.java index 46c16f0f094200e70e59e685f8db5d6b93fc2528..7d8bb0ac8d7e7ecd8cabf75d2f34bc06a005c67f 100644 --- a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/internal/KeystoreResource.java +++ b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/internal/KeystoreResource.java @@ -6,6 +6,7 @@ import eu.europa.ec.edelivery.smp.data.ui.ServiceResult; import eu.europa.ec.edelivery.smp.data.ui.auth.SMPAuthority; import eu.europa.ec.edelivery.smp.logging.SMPLogger; import eu.europa.ec.edelivery.smp.logging.SMPLoggerFactory; +import eu.europa.ec.edelivery.smp.services.PayloadValidatorService; import eu.europa.ec.edelivery.smp.services.ui.UIKeystoreService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.annotation.Secured; @@ -36,8 +37,13 @@ public class KeystoreResource { private static final SMPLogger LOG = SMPLoggerFactory.getLogger(KeystoreResource.class); - @Autowired - private UIKeystoreService uiKeystoreService; + private final UIKeystoreService uiKeystoreService; + private final PayloadValidatorService payloadValidatorService; + + public KeystoreResource(UIKeystoreService uiKeystoreService, PayloadValidatorService payloadValidatorService) { + this.uiKeystoreService = uiKeystoreService; + this.payloadValidatorService = payloadValidatorService; + } @Secured({SMPAuthority.S_AUTHORITY_TOKEN_SYSTEM_ADMIN}) @GetMapping(produces = {MimeTypeUtils.APPLICATION_JSON_VALUE}) @@ -60,6 +66,8 @@ public class KeystoreResource { @PathVariable("password") String password, @RequestBody byte[] fileBytes) { LOG.info("Got keystore data size: {}, type {}, password length {}", fileBytes.length, keystoreType, password.length()); + // validate uploaded content + payloadValidatorService.validateUploadedContent(new ByteArrayInputStream(fileBytes), MimeTypeUtils.APPLICATION_OCTET_STREAM_VALUE); // try to open keystore KeystoreImportResult keystoreImportResult = new KeystoreImportResult(); KeyStore keyStore = null; diff --git a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/internal/TruststoreAdminResource.java b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/internal/TruststoreAdminResource.java index a830610cada7ef44bf14dfb1ee81b7a1b228bedf..59d138eb1292db5fb89b21a2696ba34dcf96d00e 100644 --- a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/internal/TruststoreAdminResource.java +++ b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/internal/TruststoreAdminResource.java @@ -7,15 +7,16 @@ import eu.europa.ec.edelivery.smp.data.ui.ServiceResult; import eu.europa.ec.edelivery.smp.exceptions.SMPRuntimeException; import eu.europa.ec.edelivery.smp.logging.SMPLogger; import eu.europa.ec.edelivery.smp.logging.SMPLoggerFactory; +import eu.europa.ec.edelivery.smp.services.PayloadValidatorService; import eu.europa.ec.edelivery.smp.services.ui.UITruststoreService; import eu.europa.ec.edelivery.smp.ui.ResourceConstants; import eu.europa.ec.edelivery.smp.utils.X509CertificateUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.annotation.Secured; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.util.MimeTypeUtils; import org.springframework.web.bind.annotation.*; +import java.io.ByteArrayInputStream; import java.io.IOException; import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; @@ -33,8 +34,14 @@ public class TruststoreAdminResource { private static final SMPLogger LOG = SMPLoggerFactory.getLogger(TruststoreAdminResource.class); - @Autowired - private UITruststoreService uiTruststoreService; + + private final UITruststoreService uiTruststoreService; + private final PayloadValidatorService payloadValidatorService; + + public TruststoreAdminResource(UITruststoreService uiTruststoreService, PayloadValidatorService payloadValidatorService) { + this.uiTruststoreService = uiTruststoreService; + this.payloadValidatorService = payloadValidatorService; + } @PutMapping(produces = {"application/json"}) @RequestMapping(method = RequestMethod.GET) @@ -57,7 +64,10 @@ public class TruststoreAdminResource { @PostMapping(value = "/{user-id}/upload-certificate", consumes = MimeTypeUtils.APPLICATION_OCTET_STREAM_VALUE, produces = MimeTypeUtils.APPLICATION_JSON_VALUE) public CertificateRO uploadCertificate(@PathVariable("user-id") String userId, @RequestBody byte[] fileBytes) { - LOG.info("Got truststore cert size: {}", fileBytes.length); + LOG.info("Got certificate cert size: {}", fileBytes.length); + + // validate content + payloadValidatorService.validateUploadedContent(new ByteArrayInputStream(fileBytes), MimeTypeUtils.APPLICATION_OCTET_STREAM_VALUE); X509Certificate x509Certificate; CertificateRO certificateRO=null; diff --git a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/validation/ServiceGroupValidator.java b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/validation/ServiceGroupValidator.java index 2e6c371ba890fdaae4c65dc19fa5c4380bba150c..21d4154f48378562e89508c19370ac36414f98d4 100644 --- a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/validation/ServiceGroupValidator.java +++ b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/validation/ServiceGroupValidator.java @@ -13,18 +13,16 @@ package eu.europa.ec.edelivery.smp.validation; +import eu.europa.ec.edelivery.smp.conversion.CaseSensitivityNormalizer; import eu.europa.ec.edelivery.smp.error.exceptions.BadRequestException; import eu.europa.ec.edelivery.smp.services.ConfigurationService; import eu.europa.ec.smp.api.Identifiers; import org.oasis_open.docs.bdxr.ns.smp._2016._05.ParticipantIdentifierType; import org.oasis_open.docs.bdxr.ns.smp._2016._05.ServiceGroup; import org.oasis_open.docs.bdxr.ns.smp._2016._05.ServiceMetadataReferenceCollectionType; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import java.util.regex.Pattern; -import java.util.regex.PatternSyntaxException; import static eu.europa.ec.edelivery.smp.exceptions.ErrorBusinessCode.WRONG_FIELD; import static org.springframework.util.CollectionUtils.isEmpty; @@ -36,22 +34,32 @@ import static org.springframework.util.CollectionUtils.isEmpty; @Component public class ServiceGroupValidator { - @Autowired - ConfigurationService configurationService; + + protected final ConfigurationService configurationService; + protected final CaseSensitivityNormalizer caseSensitivityNormalizer; + + public ServiceGroupValidator(ConfigurationService configurationService, + CaseSensitivityNormalizer caseSensitivityNormalizer) { + this.configurationService = configurationService; + this.caseSensitivityNormalizer = caseSensitivityNormalizer; + } public void validate(String serviceGroupId, ServiceGroup serviceGroup) { - final ParticipantIdentifierType participantId = Identifiers.asParticipantId(serviceGroupId); + final ParticipantIdentifierType participantId = caseSensitivityNormalizer.normalize( + Identifiers.asParticipantId(serviceGroupId, configurationService.getParticipantSchemeMandatory())); + final ParticipantIdentifierType serviceGroupParticipantId = caseSensitivityNormalizer.normalize( + serviceGroup.getParticipantIdentifier()); - if (!participantId.equals(serviceGroup.getParticipantIdentifier())) { + if (!participantId.equals(serviceGroupParticipantId)) { // Business identifier must equal path throw new BadRequestException(WRONG_FIELD, "Service Group Ids don't match between URL parameter and XML body"); } - String scheme = serviceGroup.getParticipantIdentifier().getScheme(); + String scheme = serviceGroupParticipantId.getScheme(); Pattern schemaPattern = configurationService.getParticipantIdentifierSchemeRexExp(); - if (!schemaPattern.matcher(scheme).matches()) { + if (!schemaPattern.matcher(scheme==null?"":scheme).matches()) { throw new BadRequestException(WRONG_FIELD, "Service Group scheme does not match allowed pattern: " + schemaPattern.pattern()); } diff --git a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/validation/ServiceMetadataValidator.java b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/validation/ServiceMetadataValidator.java index 202a26d9cc8d8b48c0bc5d5b06171fe35840f516..8ffd5d076c21ef1963f391dedf4f02ffa2243185 100644 --- a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/validation/ServiceMetadataValidator.java +++ b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/validation/ServiceMetadataValidator.java @@ -13,8 +13,10 @@ package eu.europa.ec.edelivery.smp.validation; +import eu.europa.ec.edelivery.smp.conversion.CaseSensitivityNormalizer; import eu.europa.ec.edelivery.smp.conversion.ServiceMetadataConverter; import eu.europa.ec.edelivery.smp.error.exceptions.BadRequestException; +import eu.europa.ec.edelivery.smp.services.ConfigurationService; import eu.europa.ec.smp.api.exceptions.XmlInvalidAgainstSchemaException; import eu.europa.ec.smp.api.validators.BdxSmpOasisValidator; import org.oasis_open.docs.bdxr.ns.smp._2016._05.*; @@ -28,7 +30,8 @@ import java.util.Set; import static eu.europa.ec.edelivery.smp.exceptions.ErrorBusinessCode.OUT_OF_RANGE; import static eu.europa.ec.edelivery.smp.exceptions.ErrorBusinessCode.WRONG_FIELD; -import static eu.europa.ec.smp.api.Identifiers.*; +import static eu.europa.ec.smp.api.Identifiers.asDocumentId; +import static eu.europa.ec.smp.api.Identifiers.asString; /** * Created by gutowpa on 11/09/2017. @@ -38,67 +41,65 @@ public class ServiceMetadataValidator { private static final Logger log = LoggerFactory.getLogger(ServiceMetadataValidator.class); + protected final ConfigurationService configurationService; + protected final CaseSensitivityNormalizer caseSensitivityNormalizer; + + public ServiceMetadataValidator(ConfigurationService configurationService, + CaseSensitivityNormalizer caseSensitivityNormalizer) { + this.configurationService = configurationService; + this.caseSensitivityNormalizer = caseSensitivityNormalizer; + } + public void validate(String serviceGroupIdStr, String serviceMetadataIdStr, byte[] serviceMetadataBody ) throws XmlInvalidAgainstSchemaException { - - BdxSmpOasisValidator.validateXSD(serviceMetadataBody); - - ParticipantIdentifierType serviceGroupId = asParticipantId(serviceGroupIdStr); + ServiceInformationType serviceInformation = validate(serviceGroupIdStr, serviceMetadataBody); DocumentIdentifier serviceMetadataId = asDocumentId(serviceMetadataIdStr); - ServiceMetadata serviceMetadata = ServiceMetadataConverter.unmarshal(serviceMetadataBody); - - ServiceInformationType serviceInformation = serviceMetadata.getServiceInformation(); - - if (serviceInformation == null) { - return; - } - if (!serviceGroupId.equals(serviceInformation.getParticipantIdentifier())) { - String errorMessage = String.format("Save service metadata was called with bad Participant ID parameters. Message body param: %s URL param: %s", - asString(serviceInformation.getParticipantIdentifier()), - asString(serviceGroupId)); - log.info(errorMessage); - throw new BadRequestException(WRONG_FIELD, errorMessage); - } - - if (!serviceMetadataId.equals(serviceInformation.getDocumentIdentifier())) { + if (serviceInformation != null && !serviceMetadataId.equals(serviceInformation.getDocumentIdentifier())) { String errorMessage = String.format("Save service metadata was called with bad Document ID parameters. Message body param: %s URL param: %s", asString(serviceInformation.getDocumentIdentifier()), asString(serviceMetadataId)); log.info(errorMessage); throw new BadRequestException(WRONG_FIELD, errorMessage); } - - validateServiceInformation(serviceInformation); } public ServiceInformationType validate(String serviceGroupIdStr, - byte[] serviceMetadataBody + byte[] serviceMetadataBody ) throws XmlInvalidAgainstSchemaException { BdxSmpOasisValidator.validateXSD(serviceMetadataBody); - ParticipantIdentifierType serviceGroupId = asParticipantId(serviceGroupIdStr); + final ParticipantIdentifierType serviceGroupId = caseSensitivityNormalizer.normalizeParticipant(serviceGroupIdStr); ServiceMetadata serviceMetadata = ServiceMetadataConverter.unmarshal(serviceMetadataBody); ServiceInformationType serviceInformation = serviceMetadata.getServiceInformation(); + + if (serviceInformation == null && serviceMetadata.getRedirect() != null) { + return null; + } + if (serviceInformation == null) { String errorMessage = "Missing service information"; throw new BadRequestException(WRONG_FIELD, errorMessage); } + final ParticipantIdentifierType serviceGroupParticipantId = caseSensitivityNormalizer.normalize( + serviceInformation.getParticipantIdentifier()); - if (!serviceGroupId.equals(serviceInformation.getParticipantIdentifier())) { + if (!serviceGroupId.equals(serviceGroupParticipantId)) { String errorMessage = String.format("Save service metadata was called with bad Participant ID parameters. Message body param: %s URL param: %s", asString(serviceInformation.getParticipantIdentifier()), asString(serviceGroupId)); log.info(errorMessage); throw new BadRequestException(WRONG_FIELD, errorMessage); } - validateServiceInformation(serviceInformation); + if (serviceInformation != null) { + validateServiceInformation(serviceInformation); + } return serviceInformation; } diff --git a/smp-webapp/src/main/resources/logback.xml b/smp-webapp/src/main/resources/logback.xml index e8c6bfdc10ee6c94c6f892b81122d2aed3f8dd2c..d338d52eeca409b8384ce43953e81fc820c1b715 100644 --- a/smp-webapp/src/main/resources/logback.xml +++ b/smp-webapp/src/main/resources/logback.xml @@ -38,6 +38,7 @@ </appender> <logger name="eu.europa.ec.edelivery" level="DEBUG" /> + <logger name="eu.europa.ec.smp" level="DEBUG" /> <logger name="org.springframework.security.cas" level="DEBUG" /> <root level="WARN"> <appender-ref ref="file"/> diff --git a/smp-webapp/src/main/smp-setup/database-scripts/mysql5innodb.ddl b/smp-webapp/src/main/smp-setup/database-scripts/mysql5innodb.ddl index c2af152431b342ff9407349f980c4a04e1bcfade..0a97e6890a6e4cd797e570c7cd7dcbd0434b7597 100644 --- a/smp-webapp/src/main/smp-setup/database-scripts/mysql5innodb.ddl +++ b/smp-webapp/src/main/smp-setup/database-scripts/mysql5innodb.ddl @@ -174,7 +174,7 @@ CREATED_ON datetime not null, LAST_UPDATED_ON datetime not null, PARTICIPANT_IDENTIFIER varchar(256) CHARACTER SET utf8 COLLATE utf8_bin not null, - PARTICIPANT_SCHEME varchar(256) CHARACTER SET utf8 COLLATE utf8_bin not null, + PARTICIPANT_SCHEME varchar(256) CHARACTER SET utf8 COLLATE utf8_bin, primary key (ID) ) comment='Service group data - Identifier and scheme' ENGINE=InnoDB DEFAULT CHARSET=utf8; diff --git a/smp-webapp/src/main/smp-setup/database-scripts/oracle10g.ddl b/smp-webapp/src/main/smp-setup/database-scripts/oracle10g.ddl index 85a1a110131b4236e28d040207ba72b9e8663e84..6b2ad5d38ef5e34d9fddbda4183a20856e790fdd 100644 --- a/smp-webapp/src/main/smp-setup/database-scripts/oracle10g.ddl +++ b/smp-webapp/src/main/smp-setup/database-scripts/oracle10g.ddl @@ -269,7 +269,7 @@ create sequence SMP_USER_SEQ start with 1 increment by 1; CREATED_ON timestamp not null, LAST_UPDATED_ON timestamp not null, PARTICIPANT_IDENTIFIER varchar2(256 char) not null, - PARTICIPANT_SCHEME varchar2(256 char) not null, + PARTICIPANT_SCHEME varchar2(256 char), primary key (ID) ); diff --git a/smp-webapp/src/test/java/eu/europa/ec/cipa/smp/server/security/SecurityConfigurationClientCertTest.java b/smp-webapp/src/test/java/eu/europa/ec/cipa/smp/server/security/SecurityConfigurationClientCertTest.java index 88c70545f46f2f3274add78065532cb8c0479682..5ebeca8a28c55ea006d491c811eedffb9ae3acad 100644 --- a/smp-webapp/src/test/java/eu/europa/ec/cipa/smp/server/security/SecurityConfigurationClientCertTest.java +++ b/smp-webapp/src/test/java/eu/europa/ec/cipa/smp/server/security/SecurityConfigurationClientCertTest.java @@ -15,6 +15,7 @@ package eu.europa.ec.cipa.smp.server.security; import eu.europa.ec.edelivery.smp.data.dao.ConfigurationDao; +import eu.europa.ec.edelivery.smp.data.ui.enums.SMPPropertyEnum; import eu.europa.ec.edelivery.smp.test.SmpTestWebAppConfig; import eu.europa.ec.edelivery.smp.test.testutils.MockMvcUtils; import eu.europa.ec.edelivery.smp.test.testutils.X509CertificateTestUtils; @@ -155,8 +156,10 @@ public class SecurityConfigurationClientCertTest { @Before public void setup() throws IOException { X509CertificateTestUtils.reloadKeystores(); - mvc = MockMvcUtils.initializeMockMvc(context); + + configurationDao.setPropertyToDatabase(SMPPropertyEnum.EXTERNAL_TLS_AUTHENTICATION_CLIENT_CERT_HEADER_ENABLED,"true", null); configurationDao.reloadPropertiesFromDatabase(); + mvc = MockMvcUtils.initializeMockMvc(context); } @Parameterized.Parameter() diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ServiceGroupBodyUtil.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ServiceGroupBodyUtil.java index 2af7bf6092689bbd5cb7d6811e8e14188dff206f..b95ba201713ffa971b93f5610be6a79a20f865d6 100644 --- a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ServiceGroupBodyUtil.java +++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ServiceGroupBodyUtil.java @@ -13,6 +13,8 @@ package eu.europa.ec.edelivery.smp; +import org.apache.commons.lang3.StringUtils; + import static java.lang.String.format; /** @@ -28,12 +30,13 @@ public class ServiceGroupBodyUtil { } public static String getSampleServiceGroupBody(String scheme, String identifier) { - return format("<ServiceGroup xmlns=\"http://docs.oasis-open.org/bdxr/ns/SMP/2016/05\">\n" + - " <ParticipantIdentifier scheme=\"%s\">%s</ParticipantIdentifier>\n" + + return "<ServiceGroup xmlns=\"http://docs.oasis-open.org/bdxr/ns/SMP/2016/05\">\n" + + " <ParticipantIdentifier"+(scheme!=null?" scheme=\""+scheme+"\"":"")+">"+identifier+"</ParticipantIdentifier>\n" + " <ServiceMetadataReferenceCollection/>\n" + - " </ServiceGroup>", scheme, identifier); + " </ServiceGroup>"; } + public static String generateServiceMetadata(String partcId, String partcSch, String docId, String docSch, String desc){ return String.format(SIMPLE_DOCUMENT_XML,partcSch, partcId,docSch, docId, desc); } diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/auth/URLCsrfMatcherTest.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/auth/URLCsrfMatcherTest.java new file mode 100644 index 0000000000000000000000000000000000000000..8cdec98307145cc8b873ddc0861b05da2ccdecf9 --- /dev/null +++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/auth/URLCsrfMatcherTest.java @@ -0,0 +1,57 @@ +package eu.europa.ec.edelivery.smp.auth; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.mockito.Mockito; +import org.springframework.http.HttpMethod; + +import javax.servlet.http.HttpServletRequest; +import java.util.Collection; +import java.util.List; + +import static java.util.Arrays.asList; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +@RunWith(Parameterized.class) +public class URLCsrfMatcherTest { + + @Parameterized.Parameters(name = "{index}: {0}") + public static Collection cookieWriterTestParameters() { + return asList(new Object[][]{ + {"/ui/", false, asList("/.*"), null}, + {"/ui/resource", true, asList("/!(ui/).*"), null}, + {"/test/resource", false, asList("^/(?!ui/).*"), null}, + {"/ui/resource", true, asList("^/(?!ui/).*"), null}, + + }); + } + + @Parameterized.Parameter(0) + public String patInfo; + + @Parameterized.Parameter(1) + public boolean notMatchResult; + + @Parameterized.Parameter(2) + public List<String> regExp; + + @Parameterized.Parameter(3) + public List<HttpMethod> httpMethods; + + + @Test + public void matches() { + URLCsrfIgnoreMatcher testInstance = new URLCsrfIgnoreMatcher(regExp, httpMethods); + + HttpServletRequest request = Mockito.mock(HttpServletRequest.class); + Mockito.doReturn(patInfo).when(request).getPathInfo(); + Mockito.doReturn("").when(request).getServletPath(); + + boolean result = testInstance.matches(request); + assertEquals(notMatchResult, result); + + + } +} \ No newline at end of file diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/controllers/ServiceGroupControllerTest.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/controllers/ServiceGroupControllerTest.java index 96f624a269d2ea41b53bf832078c3936244b2a4a..1168c49e54c0469d101e8928be171fa09d844f79 100644 --- a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/controllers/ServiceGroupControllerTest.java +++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/controllers/ServiceGroupControllerTest.java @@ -66,9 +66,11 @@ public class ServiceGroupControllerTest { private static final String DOCUMENT_ID = "invoice"; private static final String URL_PATH = format("/%s::%s", PARTICIPANT_SCHEME, PARTICIPANT_ID); + private static final String URL_PATH_NULL_SCHEME = format("/%s", PARTICIPANT_ID); private static final String URL_DOC_PATH = format("%s/services/%s::%s", URL_PATH, DOCUMENT_SCHEME, DOCUMENT_ID); - private static final String SERVICE_GROUP_INPUT_BODY = getSampleServiceGroupBodyWithScheme(PARTICIPANT_SCHEME); + private static final String SERVICE_GROUP_INPUT = getSampleServiceGroupBodyWithScheme(PARTICIPANT_SCHEME); + private static final String SERVICE_GROUP_INPUT_NULL_SCHEME = getSampleServiceGroupBodyWithScheme(null); private static final String HTTP_HEADER_KEY_DOMAIN = "Domain"; private static final String HTTP_HEADER_KEY_SERVICE_GROUP_OWNER = "ServiceGroup-Owner"; private static final String HTTP_DOMAIN_VALUE = "domain"; @@ -116,7 +118,19 @@ public class ServiceGroupControllerTest { .with(ADMIN_CREDENTIALS) .header(HTTP_HEADER_KEY_DOMAIN, HTTP_DOMAIN_VALUE) .contentType(APPLICATION_XML_VALUE) - .content(SERVICE_GROUP_INPUT_BODY)) + .content(SERVICE_GROUP_INPUT)) + .andExpect(status().isCreated()); + } + + @Test + public void adminCanCreateServiceGroupNullScheme() throws Exception { + // make sure identifiersBehaviour.scheme.allowNull is set to true in db script + // set identifiersBehaviour.scheme.mandatory to false + mvc.perform(put(URL_PATH_NULL_SCHEME) + .with(ADMIN_CREDENTIALS) + .header(HTTP_HEADER_KEY_DOMAIN, HTTP_DOMAIN_VALUE) + .contentType(APPLICATION_XML_VALUE) + .content(SERVICE_GROUP_INPUT_NULL_SCHEME)) .andExpect(status().isCreated()); } @@ -126,14 +140,14 @@ public class ServiceGroupControllerTest { .header(HTTP_HEADER_KEY_DOMAIN, HTTP_DOMAIN_VALUE) .with(ADMIN_CREDENTIALS) .contentType(APPLICATION_XML_VALUE) - .content(SERVICE_GROUP_INPUT_BODY)) + .content(SERVICE_GROUP_INPUT)) .andExpect(status().isCreated()); mvc.perform(put(URL_PATH) .with(ADMIN_CREDENTIALS) .header(HTTP_HEADER_KEY_DOMAIN, HTTP_DOMAIN_VALUE) .contentType(APPLICATION_XML_VALUE) - .content(SERVICE_GROUP_INPUT_BODY)) + .content(SERVICE_GROUP_INPUT)) .andExpect(status().isOk()); } @@ -143,11 +157,11 @@ public class ServiceGroupControllerTest { .with(ADMIN_CREDENTIALS) .header(HTTP_HEADER_KEY_DOMAIN, HTTP_DOMAIN_VALUE) .contentType(APPLICATION_XML_VALUE) - .content(SERVICE_GROUP_INPUT_BODY)) + .content(SERVICE_GROUP_INPUT)) .andExpect(status().isCreated()); mvc.perform(get(URL_PATH)) - .andExpect(content().xml(SERVICE_GROUP_INPUT_BODY)); + .andExpect(content().xml(SERVICE_GROUP_INPUT)); } @@ -317,7 +331,7 @@ public class ServiceGroupControllerTest { mvc.perform(put(URL_PATH) .header(HTTP_HEADER_KEY_DOMAIN, HTTP_DOMAIN_VALUE) .contentType(APPLICATION_XML_VALUE) - .content(SERVICE_GROUP_INPUT_BODY)) + .content(SERVICE_GROUP_INPUT)) .andExpect(status().isUnauthorized()); mvc.perform(get(URL_PATH)) @@ -330,7 +344,7 @@ public class ServiceGroupControllerTest { .with(ADMIN_CREDENTIALS) .header(HTTP_HEADER_KEY_DOMAIN, HTTP_DOMAIN_VALUE) .contentType(APPLICATION_XML_VALUE) - .content(SERVICE_GROUP_INPUT_BODY)) + .content(SERVICE_GROUP_INPUT)) .andExpect(status().isCreated()); mvc.perform(delete(URL_PATH) @@ -370,7 +384,7 @@ public class ServiceGroupControllerTest { .with(ADMIN_CREDENTIALS) .contentType(APPLICATION_XML_VALUE) .header(HTTP_HEADER_KEY_DOMAIN, "not-existing-domain") - .content(SERVICE_GROUP_INPUT_BODY)) + .content(SERVICE_GROUP_INPUT)) .andExpect(status().isBadRequest()) .andExpect(content().string(stringContainsInOrder("FORMAT_ERROR"))); } @@ -381,7 +395,7 @@ public class ServiceGroupControllerTest { .with(ADMIN_CREDENTIALS) .contentType(APPLICATION_XML_VALUE) .header(HTTP_HEADER_KEY_DOMAIN, "notExistingDomain") - .content(SERVICE_GROUP_INPUT_BODY)) + .content(SERVICE_GROUP_INPUT)) .andExpect(status().isNotFound()) .andExpect(content().string(stringContainsInOrder("NOT_FOUND"))); } @@ -393,7 +407,7 @@ public class ServiceGroupControllerTest { .header(HTTP_HEADER_KEY_DOMAIN, HTTP_DOMAIN_VALUE) .contentType(APPLICATION_XML_VALUE) .header(HTTP_HEADER_KEY_SERVICE_GROUP_OWNER, OTHER_OWNER_NAME_URL_ENCODED) - .content(SERVICE_GROUP_INPUT_BODY)) + .content(SERVICE_GROUP_INPUT)) .andExpect(status().isCreated()); } @@ -404,7 +418,7 @@ public class ServiceGroupControllerTest { .header(HTTP_HEADER_KEY_DOMAIN, HTTP_DOMAIN_VALUE) .contentType(APPLICATION_XML_VALUE) .header(HTTP_HEADER_KEY_SERVICE_GROUP_OWNER, "not-existing-user") - .content(SERVICE_GROUP_INPUT_BODY)) + .content(SERVICE_GROUP_INPUT)) .andExpect(status().isBadRequest()); } diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/internal/ApplicationAdminResourceIntegrationTest.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/internal/ApplicationAdminResourceIntegrationTest.java index 4666c7a0e89266d1aa99f23d0ad2a5d142b8ae07..af87c66f90419fe8864c167e09b53fd5a6f74da7 100644 --- a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/internal/ApplicationAdminResourceIntegrationTest.java +++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/internal/ApplicationAdminResourceIntegrationTest.java @@ -2,6 +2,7 @@ package eu.europa.ec.edelivery.smp.ui.internal; import com.fasterxml.jackson.databind.ObjectMapper; import eu.europa.ec.edelivery.smp.data.ui.SmpConfigRO; +import eu.europa.ec.edelivery.smp.data.ui.enums.SMPPropertyEnum; import eu.europa.ec.edelivery.smp.test.SmpTestWebAppConfig; import eu.europa.ec.edelivery.smp.ui.ResourceConstants; import org.junit.Before; @@ -125,8 +126,8 @@ public class ApplicationAdminResourceIntegrationTest { assertNotNull(res); assertEquals("Participant scheme must start with:urn:oasis:names:tc:ebcore:partyid-type:(iso6523:|unregistered:) OR must be up to 25 characters long with form [domain]-[identifierArea]-[identifierType] (ex.: 'busdox-actorid-upis') and may only contain the following characters: [a-z0-9].", res.getParticipantSchemaRegExpMessage()); - assertEquals("^((?!^.{26})([a-z0-9]+-[a-z0-9]+-[a-z0-9]+)|urn:oasis:names:tc:ebcore:partyid-type:(iso6523|unregistered)(:.+)?$)", res.getParticipantSchemaRegExp()); - assertTrue(res.isConcatEBCorePartyId()); + assertEquals("^$|^(?!^.{26})([a-z0-9]+-[a-z0-9]+-[a-z0-9]+)$|^urn:oasis:names:tc:ebcore:partyid-type:(iso6523|unregistered)(:.+)?$", res.getParticipantSchemaRegExp()); + assertEquals(SMPPropertyEnum.PARTC_EBCOREPARTYID_CONCATENATE.getDefValue(), res.isConcatEBCorePartyId()+""); assertFalse(res.isSmlIntegrationOn()); assertFalse(res.isSmlParticipantMultiDomainOn()); } diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/validation/ServiceGroupValidatorTest.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/validation/ServiceGroupValidatorTest.java index 6a61d0481b28c86c281c26458bb0df9f5ee490d9..109c6aa0b0157aa6f73b5f025e308637b3889262 100644 --- a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/validation/ServiceGroupValidatorTest.java +++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/validation/ServiceGroupValidatorTest.java @@ -13,84 +13,101 @@ package eu.europa.ec.edelivery.smp.validation; +import eu.europa.ec.edelivery.smp.conversion.CaseSensitivityNormalizer; import eu.europa.ec.edelivery.smp.error.exceptions.BadRequestException; import eu.europa.ec.edelivery.smp.services.ConfigurationService; +import eu.europa.ec.smp.api.exceptions.MalformedIdentifierException; +import org.hamcrest.CoreMatchers; +import org.hamcrest.MatcherAssert; +import org.junit.Assert; import org.junit.Before; import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; import org.mockito.Mockito; import org.oasis_open.docs.bdxr.ns.smp._2016._05.ParticipantIdentifierType; import org.oasis_open.docs.bdxr.ns.smp._2016._05.ServiceGroup; -import org.oasis_open.docs.bdxr.ns.smp._2016._05.ServiceMetadataReferenceCollectionType; -import org.oasis_open.docs.bdxr.ns.smp._2016._05.ServiceMetadataReferenceType; -import org.springframework.test.util.ReflectionTestUtils; +import java.util.Arrays; +import java.util.Collection; import java.util.regex.Pattern; import static eu.europa.ec.smp.api.Identifiers.asString; -import static java.util.Arrays.asList; /** * Created by gutowpa on 02/08/2017. */ +@RunWith(Parameterized.class) public class ServiceGroupValidatorTest { - private static final String ALLOWED_SCHEME_REGEXP = "^(?!^.{26})([a-z0-9]+-[a-z0-9]+-[a-z0-9]+)"; + private static final String ALLOWED_SCHEME_REGEXP = "^$|^(?!^.{26})([a-z0-9]+-[a-z0-9]+-[a-z0-9]+)$|^urn:oasis:names:tc:ebcore:partyid-type:(iso6523|unregistered)(:.+)?$"; private ServiceGroupValidator validator; + ConfigurationService configurationService = Mockito.mock(ConfigurationService.class); + CaseSensitivityNormalizer normalizer = new CaseSensitivityNormalizer(configurationService); + + @Parameterized.Parameters(name = "{index}: {0}") + public static Collection<Object[]> data() { + return Arrays.asList(new Object[][]{ + + {"Good peppol schema", "good6-scheme4-ok", "urn:poland:ncpb", false, true, null, null}, + {"Allowed null schema", null, "urn:poland:ncpb", false, false, null, null}, + {"Length exceeded", "ength-exceeeeeedsTheCharacters-25chars", "urn:poland:ncpb", true, true, BadRequestException.class, "Service Group scheme does not match allowed pattern:"}, + {"Too many parts", "too-many-segments-inside", "urn:poland:ncpb", true, true, BadRequestException.class, "Service Group scheme does not match allowed pattern:"}, + {"Missing parts", "only-two", "urn:poland:ncpb", true, true, BadRequestException.class, "Service Group scheme does not match allowed pattern:"}, + {"Null not allowed", null, "urn:poland:ncpb", true, true, MalformedIdentifierException.class, "Malformed identifier, scheme and id should be delimited by double colon"}, + {"EBCorePartyId Oasis", "urn:oasis:names:tc:ebcore:partyid-type:iso6523:0088", "123456", false, true, null, null}, + {"EBCorePartyId eDelivery", null, "urn:oasis:names:tc:ebcore:partyid-type:iso6523:0088:123456", false, true, null, null}, + }); + } @Before public void init() { - validator = new ServiceGroupValidator(); - ConfigurationService configurationService = Mockito.mock(ConfigurationService.class); - ReflectionTestUtils.setField(validator, "configurationService",configurationService ); Mockito.doReturn(Pattern.compile(ALLOWED_SCHEME_REGEXP)).when(configurationService).getParticipantIdentifierSchemeRexExp(); + validator = new ServiceGroupValidator(configurationService, normalizer); } - @Test - public void testPositiveGoodScheme() throws Throwable { - validateBadScheme("good6-scheme4-ok"); - } - - @Test(expected = BadRequestException.class) - public void testServiceGroupIdentifierSchemeValidationTooLong() throws Throwable { - validateBadScheme("length-exceeeeeeds-25chars"); - } + @Parameterized.Parameter + public String caseName; + @Parameterized.Parameter(1) + public String schema; + @Parameterized.Parameter(2) + public String value; + @Parameterized.Parameter(3) + public boolean expectedThrowError; + @Parameterized.Parameter(4) + public boolean mandatoryScheme; + @Parameterized.Parameter(5) + public Class errorClass; + @Parameterized.Parameter(6) + public String errorMessage; - @Test(expected = BadRequestException.class) - public void testServiceGroupIdentifierSchemeValidationNotBuiltWithThreeSegments() throws Throwable { - validateBadScheme("too-many-segments-inside"); - } - @Test(expected = BadRequestException.class) - public void testServiceGroupIdentifierSchemeValidationTooLittleSegments() throws Throwable { - validateBadScheme("only-two"); - } + @Test + public void testServiceGroupIdentifier() { + Mockito.doReturn(mandatoryScheme).when(configurationService).getParticipantSchemeMandatory(); - @Test(expected = BadRequestException.class) - public void testServiceGroupIdentifierSchemeValidationIllegalChar() throws Throwable { - validateBadScheme("illegal-char-here:"); + validateScheme(schema, value); } - private void validateBadScheme(String scheme) throws Throwable { + private void validateScheme(String scheme, String value) { ServiceGroup sg = new ServiceGroup(); - ParticipantIdentifierType id = new ParticipantIdentifierType("urn:poland:ncpb", scheme); + ParticipantIdentifierType id = new ParticipantIdentifierType(value, scheme); sg.setParticipantIdentifier(id); - validator.validate(asString(id), sg); + try { + validator.validate(asString(id), sg); + if (expectedThrowError) { + Assert.fail(); + } + } catch (RuntimeException exc) { + if (!expectedThrowError) { + Assert.fail(); + } + Assert.assertEquals(errorClass, exc.getClass()); + MatcherAssert.assertThat(exc.getMessage(), CoreMatchers.startsWith(errorMessage)); + } } - @Test(expected = BadRequestException.class) - public void testServiceGroupWithReference() throws Throwable { - //given - ServiceMetadataReferenceType ref = new ServiceMetadataReferenceType("http://poland.pl"); - ServiceMetadataReferenceCollectionType references = new ServiceMetadataReferenceCollectionType(asList(ref)); - - ParticipantIdentifierType id = new ParticipantIdentifierType("urn:poland:ncpb", "correct-scheme-ok"); - ServiceGroup sg = new ServiceGroup(); - sg.setServiceMetadataReferenceCollection(references); - sg.setParticipantIdentifier(id); - //when-then - validator.validate(asString(id), sg); - } } diff --git a/smp-webapp/src/test/resources/webapp_integration_test_data.sql b/smp-webapp/src/test/resources/webapp_integration_test_data.sql index d35399ce75f2f605b7d36f3895526c8b54bc3c24..69dffb3513d99c700803269af63cf90d080ba7f9 100644 --- a/smp-webapp/src/test/resources/webapp_integration_test_data.sql +++ b/smp-webapp/src/test/resources/webapp_integration_test_data.sql @@ -23,6 +23,8 @@ insert into SMP_CONFIGURATION (PROPERTY, VALUE, CREATED_ON, LAST_UPDATED_ON) VAL insert into SMP_CONFIGURATION (PROPERTY, VALUE, CREATED_ON, LAST_UPDATED_ON) VALUES ('bdmsl.integration.enabled', 'false',CURRENT_TIMESTAMP(), CURRENT_TIMESTAMP()); insert into SMP_CONFIGURATION (PROPERTY, VALUE, CREATED_ON, LAST_UPDATED_ON) VALUES ('smp.http.forwarded.headers.enabled', 'true',CURRENT_TIMESTAMP(), CURRENT_TIMESTAMP()); insert into SMP_CONFIGURATION (PROPERTY, VALUE, CREATED_ON, LAST_UPDATED_ON) VALUES ('smp.automation.authentication.external.tls.clientCert.enabled', 'true',CURRENT_TIMESTAMP(), CURRENT_TIMESTAMP()); +insert into SMP_CONFIGURATION (PROPERTY, VALUE, CREATED_ON, LAST_UPDATED_ON) VALUES ('identifiersBehaviour.scheme.mandatory', 'false',CURRENT_TIMESTAMP(), CURRENT_TIMESTAMP()); + insert into SMP_USER (ID, USERNAME, PASSWORD, ACCESS_TOKEN_ID, ACCESS_TOKEN, ROLE, ACTIVE, CREATED_ON, LAST_UPDATED_ON) values (1, 'smp_admin', '$2a$06$AXSSUDJlpzzq/gPZb7eIBeb8Mi0.PTKqDjzujZH.bWPwj5.ePEInW','pat_smp_admin', '$2a$10$bP44Ij/mE6U6OUo/QrKCvOb7ouSClKnyE0Ak6t58BLob9OTI534IO', 'SMP_ADMIN', 1,CURRENT_TIMESTAMP(),CURRENT_TIMESTAMP()); insert into SMP_USER (ID, USERNAME, PASSWORD, ACCESS_TOKEN_ID, ACCESS_TOKEN, ROLE, ACTIVE, CREATED_ON, LAST_UPDATED_ON) values (2, 'sg_admin', '$2a$06$AXSSUDJlpzzq/gPZb7eIBeb8Mi0.PTKqDjzujZH.bWPwj5.ePEInW', 'pat_sg_admin', '$2a$10$bP44Ij/mE6U6OUo/QrKCvOb7ouSClKnyE0Ak6t58BLob9OTI534IO', 'SERVICE_GROUP_ADMIN', 1,CURRENT_TIMESTAMP(),CURRENT_TIMESTAMP());