diff --git a/.github/stale.yml b/.github/stale.yml new file mode 100644 index 0000000..d9f6563 --- /dev/null +++ b/.github/stale.yml @@ -0,0 +1,17 @@ +# Number of days of inactivity before an issue becomes stale +daysUntilStale: 60 +# Number of days of inactivity before a stale issue is closed +daysUntilClose: 7 +# Issues with these labels will never be considered stale +exemptLabels: + - pinned + - security +# Label to use when marking an issue as stale +staleLabel: wontfix +# Comment to post when marking an issue as stale. Set to `false` to disable +markComment: > + This issue has been automatically marked as stale because it has not had + recent activity. It will be closed if no further activity occurs. Thank you + for your contributions. +# Comment to post when closing a stale issue. Set to `false` to disable +closeComment: false \ No newline at end of file diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..d4201ef --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,28 @@ +name: CI + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v2 + - name: Setup JDK + uses: actions/setup-java@v2 + with: + java-version: 21 + distribution: zulu + - name: Setup Maven + uses: stCarolas/setup-maven@v4.2 + - name: Setup Maven caching + uses: actions/cache@v2 + with: + path: ~/.m2/** + key: maven_deps + - name: Build and test + run: mvn clean test diff --git a/CHANGELOG.md b/CHANGELOG.md index 830840c..005083e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,46 +1,46 @@ # Changelog -## [0.2.0](https://github.com/sokomishalov/jackson-dataformat-soap/tree/0.2.0) (2022-04-17) +## [0.2.0](https://github.com/sokomishalov/jackson-datatype-soap/tree/0.2.0) (2022-04-17) -[Full Changelog](https://github.com/sokomishalov/jackson-dataformat-soap/compare/0.1.1...0.2.0) +[Full Changelog](https://github.com/sokomishalov/jackson-datatype-soap/compare/0.1.1...0.2.0) **Closed issues:** -- does not run with jackson-module-jaxb-annotations 2.13. [\#37](https://github.com/sokomishalov/jackson-dataformat-soap/issues/37) -- Support multiple header classes [\#36](https://github.com/sokomishalov/jackson-dataformat-soap/issues/36) +- does not run with jackson-module-jaxb-annotations 2.13. [\#37](https://github.com/sokomishalov/jackson-datatype-soap/issues/37) +- Support multiple header classes [\#36](https://github.com/sokomishalov/jackson-datatype-soap/issues/36) **Merged pull requests:** -- fix \#36 [\#40](https://github.com/sokomishalov/jackson-dataformat-soap/pull/40) ([sokomishalov](https://github.com/sokomishalov)) -- Fix \#37 [\#39](https://github.com/sokomishalov/jackson-dataformat-soap/pull/39) ([sokomishalov](https://github.com/sokomishalov)) -- Bump dokka-maven-plugin from 1.5.0 to 1.5.30 [\#16](https://github.com/sokomishalov/jackson-dataformat-soap/pull/16) ([dependabot[bot]](https://github.com/apps/dependabot)) -- Bump maven-javadoc-plugin from 3.3.0 to 3.3.1 [\#15](https://github.com/sokomishalov/jackson-dataformat-soap/pull/15) ([dependabot[bot]](https://github.com/apps/dependabot)) -- Bump jackson-bom from 2.12.4 to 2.12.5 [\#14](https://github.com/sokomishalov/jackson-dataformat-soap/pull/14) ([dependabot[bot]](https://github.com/apps/dependabot)) -- Bump kotlin.version from 1.5.21 to 1.5.30 [\#13](https://github.com/sokomishalov/jackson-dataformat-soap/pull/13) ([dependabot[bot]](https://github.com/apps/dependabot)) -- Bump kotlin.version from 1.5.20 to 1.5.21 [\#12](https://github.com/sokomishalov/jackson-dataformat-soap/pull/12) ([dependabot[bot]](https://github.com/apps/dependabot)) -- Bump dokka-maven-plugin from 1.4.32 to 1.5.0 [\#11](https://github.com/sokomishalov/jackson-dataformat-soap/pull/11) ([dependabot[bot]](https://github.com/apps/dependabot)) -- Bump jackson-bom from 2.12.3 to 2.12.4 [\#10](https://github.com/sokomishalov/jackson-dataformat-soap/pull/10) ([dependabot[bot]](https://github.com/apps/dependabot)) -- Bump kotlin.version from 1.5.10 to 1.5.20 [\#9](https://github.com/sokomishalov/jackson-dataformat-soap/pull/9) ([dependabot[bot]](https://github.com/apps/dependabot)) +- fix \#36 [\#40](https://github.com/sokomishalov/jackson-datatype-soap/pull/40) ([sokomishalov](https://github.com/sokomishalov)) +- Fix \#37 [\#39](https://github.com/sokomishalov/jackson-datatype-soap/pull/39) ([sokomishalov](https://github.com/sokomishalov)) +- Bump dokka-maven-plugin from 1.5.0 to 1.5.30 [\#16](https://github.com/sokomishalov/jackson-datatype-soap/pull/16) ([dependabot[bot]](https://github.com/apps/dependabot)) +- Bump maven-javadoc-plugin from 3.3.0 to 3.3.1 [\#15](https://github.com/sokomishalov/jackson-datatype-soap/pull/15) ([dependabot[bot]](https://github.com/apps/dependabot)) +- Bump jackson-bom from 2.12.4 to 2.12.5 [\#14](https://github.com/sokomishalov/jackson-datatype-soap/pull/14) ([dependabot[bot]](https://github.com/apps/dependabot)) +- Bump kotlin.version from 1.5.21 to 1.5.30 [\#13](https://github.com/sokomishalov/jackson-datatype-soap/pull/13) ([dependabot[bot]](https://github.com/apps/dependabot)) +- Bump kotlin.version from 1.5.20 to 1.5.21 [\#12](https://github.com/sokomishalov/jackson-datatype-soap/pull/12) ([dependabot[bot]](https://github.com/apps/dependabot)) +- Bump dokka-maven-plugin from 1.4.32 to 1.5.0 [\#11](https://github.com/sokomishalov/jackson-datatype-soap/pull/11) ([dependabot[bot]](https://github.com/apps/dependabot)) +- Bump jackson-bom from 2.12.3 to 2.12.4 [\#10](https://github.com/sokomishalov/jackson-datatype-soap/pull/10) ([dependabot[bot]](https://github.com/apps/dependabot)) +- Bump kotlin.version from 1.5.10 to 1.5.20 [\#9](https://github.com/sokomishalov/jackson-datatype-soap/pull/9) ([dependabot[bot]](https://github.com/apps/dependabot)) -## [0.1.1](https://github.com/sokomishalov/jackson-dataformat-soap/tree/0.1.1) (2021-06-21) +## [0.1.1](https://github.com/sokomishalov/jackson-datatype-soap/tree/0.1.1) (2021-06-21) -[Full Changelog](https://github.com/sokomishalov/jackson-dataformat-soap/compare/0.1.0...0.1.1) +[Full Changelog](https://github.com/sokomishalov/jackson-datatype-soap/compare/0.1.0...0.1.1) **Merged pull requests:** -- remove collection setters [\#8](https://github.com/sokomishalov/jackson-dataformat-soap/pull/8) ([sokomishalov](https://github.com/sokomishalov)) -- Bump maven-gpg-plugin from 1.6 to 3.0.1 [\#4](https://github.com/sokomishalov/jackson-dataformat-soap/pull/4) ([dependabot[bot]](https://github.com/apps/dependabot)) +- remove collection setters [\#8](https://github.com/sokomishalov/jackson-datatype-soap/pull/8) ([sokomishalov](https://github.com/sokomishalov)) +- Bump maven-gpg-plugin from 1.6 to 3.0.1 [\#4](https://github.com/sokomishalov/jackson-datatype-soap/pull/4) ([dependabot[bot]](https://github.com/apps/dependabot)) -## [0.1.0](https://github.com/sokomishalov/jackson-dataformat-soap/tree/0.1.0) (2021-06-09) +## [0.1.0](https://github.com/sokomishalov/jackson-datatype-soap/tree/0.1.0) (2021-06-09) -[Full Changelog](https://github.com/sokomishalov/jackson-dataformat-soap/compare/e943b1bc112c28c6c04f09ccecbfc6e8d20f294b...0.1.0) +[Full Changelog](https://github.com/sokomishalov/jackson-datatype-soap/compare/e943b1bc112c28c6c04f09ccecbfc6e8d20f294b...0.1.0) **Merged pull requests:** -- Bump cxf-codegen-plugin from 3.4.3 to 3.4.4 [\#7](https://github.com/sokomishalov/jackson-dataformat-soap/pull/7) ([dependabot[bot]](https://github.com/apps/dependabot)) -- Bump kotlin.version from 1.4.32 to 1.5.10 [\#6](https://github.com/sokomishalov/jackson-dataformat-soap/pull/6) ([dependabot[bot]](https://github.com/apps/dependabot)) -- Bump maven-javadoc-plugin from 3.2.0 to 3.3.0 [\#5](https://github.com/sokomishalov/jackson-dataformat-soap/pull/5) ([dependabot[bot]](https://github.com/apps/dependabot)) -- Bump cxf-codegen-plugin from 3.3.7 to 3.4.3 [\#3](https://github.com/sokomishalov/jackson-dataformat-soap/pull/3) ([dependabot[bot]](https://github.com/apps/dependabot)) +- Bump cxf-codegen-plugin from 3.4.3 to 3.4.4 [\#7](https://github.com/sokomishalov/jackson-datatype-soap/pull/7) ([dependabot[bot]](https://github.com/apps/dependabot)) +- Bump kotlin.version from 1.4.32 to 1.5.10 [\#6](https://github.com/sokomishalov/jackson-datatype-soap/pull/6) ([dependabot[bot]](https://github.com/apps/dependabot)) +- Bump maven-javadoc-plugin from 3.2.0 to 3.3.0 [\#5](https://github.com/sokomishalov/jackson-datatype-soap/pull/5) ([dependabot[bot]](https://github.com/apps/dependabot)) +- Bump cxf-codegen-plugin from 3.3.7 to 3.4.3 [\#3](https://github.com/sokomishalov/jackson-datatype-soap/pull/3) ([dependabot[bot]](https://github.com/apps/dependabot)) diff --git a/README.md b/README.md index f5ab94d..7b69753 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,10 @@ -jackson-dataformat-soap +jackson-datatype-soap ======== +~~Here should be some fancy logo~~ [![Apache License 2](https://img.shields.io/badge/license-ASF2-blue.svg)](https://choosealicense.com/licenses/apache-2.0/) -[![](https://img.shields.io/maven-central/v/ru.sokomishalov.jackson/jackson-dataformat-soap)](https://mvnrepository.com/artifact/ru.sokomishalov.jackson/jackson-dataformat-soap) -[![](https://img.shields.io/jitpack/v/github/sokomishalov/jackson-dataformat-soap)](https://jitpack.io/#sokomishalov/jackson-dataformat-soap) +[![](https://img.shields.io/maven-central/v/ru.sokomishalov.jackson/jackson-datatype-soap)](https://mvnrepository.com/artifact/ru.sokomishalov.jackson/jackson-datatype-soap-jakarta) +[![](https://img.shields.io/jitpack/v/github/sokomishalov/jackson-datatype-soap)](https://jitpack.io/#sokomishalov/jackson-datatype-soap) ## Overview @@ -14,10 +15,18 @@ Jackson SOAP implementation over jackson-dataformat-xml Maven: ```xml - + + + ru.sokomishalov.jackson + jackson-datatype-soap-jaxb + x.y.z + +``` +```xml + ru.sokomishalov.jackson - jackson-dataformat-soap + jackson-datatype-soap-jakarta x.y.z ``` @@ -25,7 +34,10 @@ Maven: Gradle kotlin dsl: ```kotlin -implementation("ru.sokomishalov.jackson:jackson-dataformat-soap:x.y.z") +// Legacy (JAXB) artifact +implementation("ru.sokomishalov.jackson:jackson-datatype-soap-jaxb:x.y.z") +// New (Jakarta) artifact +implementation("ru.sokomishalov.jackson:jackson-datatype-soap-jakarta:x.y.z") ``` ## Usage diff --git a/jackson-datatype-soap-common/pom.xml b/jackson-datatype-soap-common/pom.xml new file mode 100644 index 0000000..bbad402 --- /dev/null +++ b/jackson-datatype-soap-common/pom.xml @@ -0,0 +1,66 @@ + + + 4.0.0 + + + ru.sokomishalov.jackson + jackson-datatype-soap-parent + ${revision} + + + jackson-datatype-soap-common + ${revision} + + + + + org.jetbrains.kotlin + kotlin-stdlib + + + com.fasterxml.jackson.dataformat + jackson-dataformat-xml + + + + + ${project.basedir}/src/main/kotlin + + + org.jetbrains.kotlin + kotlin-maven-plugin + ${kotlin.version} + + + org.jetbrains.kotlin + kotlin-maven-allopen + ${kotlin.version} + + + + ${java.version} + + + + compile + process-sources + + compile + + + + test-compile + test-compile + + test-compile + + + + + + + + + \ No newline at end of file diff --git a/src/main/kotlin/ru/sokomishalov/jackson/dataformat/soap/SoapAddressingHeaders.kt b/jackson-datatype-soap-common/src/main/kotlin/ru/sokomishalov/jackson/datatype/soap/SoapAddressingHeaders.kt similarity index 95% rename from src/main/kotlin/ru/sokomishalov/jackson/dataformat/soap/SoapAddressingHeaders.kt rename to jackson-datatype-soap-common/src/main/kotlin/ru/sokomishalov/jackson/datatype/soap/SoapAddressingHeaders.kt index 8b6e73b..6481be4 100644 --- a/src/main/kotlin/ru/sokomishalov/jackson/dataformat/soap/SoapAddressingHeaders.kt +++ b/jackson-datatype-soap-common/src/main/kotlin/ru/sokomishalov/jackson/datatype/soap/SoapAddressingHeaders.kt @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package ru.sokomishalov.jackson.dataformat.soap +package ru.sokomishalov.jackson.datatype.soap /** * @author sokomishalov diff --git a/src/main/kotlin/ru/sokomishalov/jackson/dataformat/soap/SoapConstants.kt b/jackson-datatype-soap-common/src/main/kotlin/ru/sokomishalov/jackson/datatype/soap/SoapConstants.kt similarity index 95% rename from src/main/kotlin/ru/sokomishalov/jackson/dataformat/soap/SoapConstants.kt rename to jackson-datatype-soap-common/src/main/kotlin/ru/sokomishalov/jackson/datatype/soap/SoapConstants.kt index 71a797a..eab7308 100644 --- a/src/main/kotlin/ru/sokomishalov/jackson/dataformat/soap/SoapConstants.kt +++ b/jackson-datatype-soap-common/src/main/kotlin/ru/sokomishalov/jackson/datatype/soap/SoapConstants.kt @@ -18,7 +18,7 @@ "HttpUrlsUsage" ) -package ru.sokomishalov.jackson.dataformat.soap +package ru.sokomishalov.jackson.datatype.soap /** * @author sokomishalov diff --git a/src/main/kotlin/ru/sokomishalov/jackson/dataformat/soap/SoapEnvelope.kt b/jackson-datatype-soap-common/src/main/kotlin/ru/sokomishalov/jackson/datatype/soap/SoapEnvelope.kt similarity index 95% rename from src/main/kotlin/ru/sokomishalov/jackson/dataformat/soap/SoapEnvelope.kt rename to jackson-datatype-soap-common/src/main/kotlin/ru/sokomishalov/jackson/datatype/soap/SoapEnvelope.kt index a3714bf..4c79093 100644 --- a/src/main/kotlin/ru/sokomishalov/jackson/dataformat/soap/SoapEnvelope.kt +++ b/jackson-datatype-soap-common/src/main/kotlin/ru/sokomishalov/jackson/datatype/soap/SoapEnvelope.kt @@ -15,7 +15,7 @@ */ @file:Suppress("unused") -package ru.sokomishalov.jackson.dataformat.soap +package ru.sokomishalov.jackson.datatype.soap /** * @author sokomishalov diff --git a/src/main/kotlin/ru/sokomishalov/jackson/dataformat/soap/SoapFault.kt b/jackson-datatype-soap-common/src/main/kotlin/ru/sokomishalov/jackson/datatype/soap/SoapFault.kt similarity index 94% rename from src/main/kotlin/ru/sokomishalov/jackson/dataformat/soap/SoapFault.kt rename to jackson-datatype-soap-common/src/main/kotlin/ru/sokomishalov/jackson/datatype/soap/SoapFault.kt index d6321e5..811e73f 100644 --- a/src/main/kotlin/ru/sokomishalov/jackson/dataformat/soap/SoapFault.kt +++ b/jackson-datatype-soap-common/src/main/kotlin/ru/sokomishalov/jackson/datatype/soap/SoapFault.kt @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package ru.sokomishalov.jackson.dataformat.soap +package ru.sokomishalov.jackson.datatype.soap /** * @author sokomishalov diff --git a/src/main/kotlin/ru/sokomishalov/jackson/dataformat/soap/SoapMultipleHeaders.kt b/jackson-datatype-soap-common/src/main/kotlin/ru/sokomishalov/jackson/datatype/soap/SoapMultipleHeaders.kt similarity index 94% rename from src/main/kotlin/ru/sokomishalov/jackson/dataformat/soap/SoapMultipleHeaders.kt rename to jackson-datatype-soap-common/src/main/kotlin/ru/sokomishalov/jackson/datatype/soap/SoapMultipleHeaders.kt index 69df47c..fd81f3d 100644 --- a/src/main/kotlin/ru/sokomishalov/jackson/dataformat/soap/SoapMultipleHeaders.kt +++ b/jackson-datatype-soap-common/src/main/kotlin/ru/sokomishalov/jackson/datatype/soap/SoapMultipleHeaders.kt @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package ru.sokomishalov.jackson.dataformat.soap +package ru.sokomishalov.jackson.datatype.soap /** * @author sokomishalov diff --git a/jackson-datatype-soap-jakarta/pom.xml b/jackson-datatype-soap-jakarta/pom.xml new file mode 100644 index 0000000..7a9ca42 --- /dev/null +++ b/jackson-datatype-soap-jakarta/pom.xml @@ -0,0 +1,140 @@ + + + 4.0.0 + + + ru.sokomishalov.jackson + jackson-datatype-soap-parent + ${revision} + + + jackson-datatype-soap-jakarta + ${revision} + + + + + ru.sokomishalov.jackson + jackson-datatype-soap-common + ${revision} + + + com.fasterxml.jackson.module + jackson-module-jakarta-xmlbind-annotations + + + + + jakarta.xml.ws + jakarta.xml.ws-api + 4.0.1 + test + + + org.glassfish.jaxb + jaxb-runtime + 4.0.4 + test + + + org.jetbrains.kotlin + kotlin-test-junit5 + test + + + org.jeasy + easy-random-core + ${jeasy-random.version} + test + + + + + ${project.basedir}/src/main/kotlin + ${project.basedir}/src/test/kotlin + + + org.jetbrains.kotlin + kotlin-maven-plugin + ${kotlin.version} + + + org.jetbrains.kotlin + kotlin-maven-allopen + ${kotlin.version} + + + + ${java.version} + + + + compile + process-sources + + compile + + + + test-compile + test-compile + + test-compile + + + + + + org.apache.cxf + cxf-codegen-plugin + 4.0.3 + + + generate-test-sources + generate-test-sources + + src/test/resources/wsdl + ${project.build.directory}/generated-test-sources/cxf + + + ${project.basedir}/src/test/resources/wsdl/PersonService.wsdl + + + ${project.basedir}/src/test/resources/wsdl/issue-36.wsdl + + + + + wsdl2java + + + + + + org.codehaus.mojo + build-helper-maven-plugin + 3.5.0 + + + add-test-sources + generate-test-sources + + add-test-source + + + + ${project.build.directory}/generated-test-sources/cxf + + + + + + + maven-surefire-plugin + 2.22.2 + + + + \ No newline at end of file diff --git a/jackson-datatype-soap-jakarta/src/main/kotlin/ru/sokomishalov/jackson/datatype/soap/SoapJaxbAnnotationIntrospector.kt b/jackson-datatype-soap-jakarta/src/main/kotlin/ru/sokomishalov/jackson/datatype/soap/SoapJaxbAnnotationIntrospector.kt new file mode 100644 index 0000000..7868aeb --- /dev/null +++ b/jackson-datatype-soap-jakarta/src/main/kotlin/ru/sokomishalov/jackson/datatype/soap/SoapJaxbAnnotationIntrospector.kt @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2021-present Mikhael Sokolov + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +@file:Suppress("MemberVisibilityCanBePrivate") + +package ru.sokomishalov.jackson.datatype.soap + +import com.fasterxml.jackson.databind.PropertyName +import com.fasterxml.jackson.databind.PropertyName.NO_NAME +import com.fasterxml.jackson.databind.cfg.MapperConfig +import com.fasterxml.jackson.databind.introspect.Annotated +import com.fasterxml.jackson.databind.type.TypeFactory +import com.fasterxml.jackson.databind.util.ClassUtil +import com.fasterxml.jackson.module.jakarta.xmlbind.JakartaXmlBindAnnotationIntrospector +import jakarta.xml.bind.annotation.XmlAttribute +import jakarta.xml.bind.annotation.XmlElement +import jakarta.xml.bind.annotation.XmlElementWrapper +import ru.sokomishalov.jackson.datatype.soap.ser.SoapEnvelopeSerializers +import ru.sokomishalov.jackson.datatype.soap.util.NamespaceCache +import java.lang.reflect.Field +import java.lang.reflect.Method + +open class SoapJaxbAnnotationIntrospector : JakartaXmlBindAnnotationIntrospector(TypeFactory.defaultInstance()) { + + override fun findNamespace(config: MapperConfig<*>?, ann: Annotated?): String? = ann?.rawType?.let { t -> + val annotationNamespace = ann.annotated.getAnnotation(XmlElement::class.java)?.namespace + + when { + // present namespace + annotationNamespace != null && annotationNamespace != MARKER_FOR_DEFAULT -> annotationNamespace + + // attributes do not have namespaces + ann.annotated.isAnnotationPresent(XmlAttribute::class.java) -> "" + + // fields with primitives or collections have parent namespaces + ann.annotated is Field || ann.annotated is Method || ClassUtil.isJDKClass(t) -> ann.parentNamespace + + // other classes have their own namespaces + else -> t.namespace + } + } + + override fun findNullSerializer(ann: Annotated?): Any? = when { + isOutputAsAttribute(null, ann) == true -> null + else -> SoapEnvelopeSerializers.XsiNilSerializer + } + + override fun findWrapperName(ann: Annotated): PropertyName? = when { + ann.type.isCollectionLikeType && !ann.hasAnnotation(XmlElementWrapper::class.java) -> NO_NAME + else -> super.findWrapperName(ann) + } + + protected val Annotated.parentNamespace: String get() = when (val annotatedElement = annotated) { + is Field -> annotatedElement.declaringClass.namespace + is Method -> annotatedElement.declaringClass.namespace + else -> "" + } + protected val Class<*>.namespace: String get() = NamespaceCache.getNamespace(this) +} \ No newline at end of file diff --git a/src/main/kotlin/ru/sokomishalov/jackson/dataformat/soap/SoapMapper.kt b/jackson-datatype-soap-jakarta/src/main/kotlin/ru/sokomishalov/jackson/datatype/soap/SoapMapper.kt similarity index 96% rename from src/main/kotlin/ru/sokomishalov/jackson/dataformat/soap/SoapMapper.kt rename to jackson-datatype-soap-jakarta/src/main/kotlin/ru/sokomishalov/jackson/datatype/soap/SoapMapper.kt index 3efb2c6..fdc45fb 100644 --- a/src/main/kotlin/ru/sokomishalov/jackson/dataformat/soap/SoapMapper.kt +++ b/jackson-datatype-soap-jakarta/src/main/kotlin/ru/sokomishalov/jackson/datatype/soap/SoapMapper.kt @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package ru.sokomishalov.jackson.dataformat.soap +package ru.sokomishalov.jackson.datatype.soap import com.fasterxml.jackson.databind.JavaType import com.fasterxml.jackson.dataformat.xml.XmlMapper diff --git a/src/main/kotlin/ru/sokomishalov/jackson/dataformat/soap/SoapMapperExtensions.kt b/jackson-datatype-soap-jakarta/src/main/kotlin/ru/sokomishalov/jackson/datatype/soap/SoapMapperExtensions.kt similarity index 95% rename from src/main/kotlin/ru/sokomishalov/jackson/dataformat/soap/SoapMapperExtensions.kt rename to jackson-datatype-soap-jakarta/src/main/kotlin/ru/sokomishalov/jackson/datatype/soap/SoapMapperExtensions.kt index e3e0250..9505110 100644 --- a/src/main/kotlin/ru/sokomishalov/jackson/dataformat/soap/SoapMapperExtensions.kt +++ b/jackson-datatype-soap-jakarta/src/main/kotlin/ru/sokomishalov/jackson/datatype/soap/SoapMapperExtensions.kt @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package ru.sokomishalov.jackson.dataformat.soap +package ru.sokomishalov.jackson.datatype.soap /** diff --git a/jackson-datatype-soap-jakarta/src/main/kotlin/ru/sokomishalov/jackson/datatype/soap/SoapModule.kt b/jackson-datatype-soap-jakarta/src/main/kotlin/ru/sokomishalov/jackson/datatype/soap/SoapModule.kt new file mode 100644 index 0000000..07a043d --- /dev/null +++ b/jackson-datatype-soap-jakarta/src/main/kotlin/ru/sokomishalov/jackson/datatype/soap/SoapModule.kt @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2021-present Mikhael Sokolov + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +@file:Suppress( + "CanBeParameter" +) + +package ru.sokomishalov.jackson.datatype.soap + +import com.ctc.wstx.stax.WstxOutputFactory +import com.fasterxml.jackson.databind.DeserializationFeature.* +import com.fasterxml.jackson.databind.MapperFeature.ACCEPT_CASE_INSENSITIVE_ENUMS +import com.fasterxml.jackson.databind.MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES +import com.fasterxml.jackson.databind.ObjectMapper +import com.fasterxml.jackson.databind.SerializationFeature.FAIL_ON_EMPTY_BEANS +import com.fasterxml.jackson.databind.SerializationFeature.WRITE_DATES_AS_TIMESTAMPS +import com.fasterxml.jackson.dataformat.xml.XmlFactory +import com.fasterxml.jackson.module.jakarta.xmlbind.JakartaXmlBindAnnotationModule +import ru.sokomishalov.jackson.datatype.soap.SoapConstants.SOAP_11_ENVELOPE_NAMESPACE +import ru.sokomishalov.jackson.datatype.soap.deser.SoapEnvelopeDeserializers +import ru.sokomishalov.jackson.datatype.soap.ser.SoapEnvelopeSerializers +import ru.sokomishalov.jackson.datatype.soap.util.AlwaysUseNamespacesXmlSerializerProvider + +/** + * @author sokomishalov + */ +open class SoapModule @JvmOverloads constructor( + private val namespacePrefix: String = "ns", + private val soapEnvelopeNamespace: String = SOAP_11_ENVELOPE_NAMESPACE +) : JakartaXmlBindAnnotationModule(SoapJaxbAnnotationIntrospector()) { + + override fun setupModule(context: SetupContext) { + with(context) { + addSerializers(SoapEnvelopeSerializers(soapEnvelopeNamespace)) + addDeserializers(SoapEnvelopeDeserializers()) + getOwner().apply { + setSerializerProvider(AlwaysUseNamespacesXmlSerializerProvider()) + enable(ACCEPT_SINGLE_VALUE_AS_ARRAY, ACCEPT_FLOAT_AS_INT) + enable(ACCEPT_CASE_INSENSITIVE_PROPERTIES, ACCEPT_CASE_INSENSITIVE_ENUMS) + disable(FAIL_ON_EMPTY_BEANS, WRITE_DATES_AS_TIMESTAMPS) + disable(FAIL_ON_UNKNOWN_PROPERTIES, FAIL_ON_READING_DUP_TREE_KEY) + ((factory as? XmlFactory)?.xmlOutputFactory as? WstxOutputFactory)?.apply { config.automaticNsPrefix = namespacePrefix } + } + super.setupModule(this) + } + } +} \ No newline at end of file diff --git a/jackson-datatype-soap-jakarta/src/main/kotlin/ru/sokomishalov/jackson/datatype/soap/deser/SoapEnvelopeDeserializers.kt b/jackson-datatype-soap-jakarta/src/main/kotlin/ru/sokomishalov/jackson/datatype/soap/deser/SoapEnvelopeDeserializers.kt new file mode 100644 index 0000000..953ca1c --- /dev/null +++ b/jackson-datatype-soap-jakarta/src/main/kotlin/ru/sokomishalov/jackson/datatype/soap/deser/SoapEnvelopeDeserializers.kt @@ -0,0 +1,166 @@ +/* + * Copyright (c) 2021-present Mikhael Sokolov + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +@file:Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE") + +package ru.sokomishalov.jackson.datatype.soap.deser + +import com.fasterxml.jackson.core.JsonParser +import com.fasterxml.jackson.databind.* +import com.fasterxml.jackson.databind.deser.Deserializers +import com.fasterxml.jackson.databind.deser.std.StdDeserializer +import com.fasterxml.jackson.dataformat.xml.XmlMapper +import com.fasterxml.jackson.dataformat.xml.deser.FromXmlParser +import jakarta.xml.bind.JAXBElement +import ru.sokomishalov.jackson.datatype.soap.SoapAddressingHeaders +import ru.sokomishalov.jackson.datatype.soap.SoapEnvelope +import ru.sokomishalov.jackson.datatype.soap.SoapFault +import javax.xml.namespace.QName +import javax.xml.stream.XMLStreamConstants.* +import javax.xml.stream.XMLStreamReader + +/** + * @author sokomishalov + */ +internal class SoapEnvelopeDeserializers : Deserializers.Base() { + + override fun findBeanDeserializer( + type: JavaType, + config: DeserializationConfig, + beanDesc: BeanDescription + ): JsonDeserializer<*>? = when { + SoapEnvelope::class.java.isAssignableFrom(type.rawClass) -> SoapEnvelopeDeserializer(type) + JAXBElement::class.java.isAssignableFrom(type.rawClass) -> JaxbElementDeserializer(type) + else -> super.findBeanDeserializer(type, config, beanDesc) + } + + internal class SoapEnvelopeDeserializer(type: JavaType) : StdDeserializer>(type) { + + override fun deserialize(parser: JsonParser, context: DeserializationContext): SoapEnvelope<*, *> { + val (headerClass, bodyClass) = valueType + .bindings + .typeParameters + .let { it.getOrNull(0)?.rawClass to it.getOrNull(1)?.rawClass } + + val sr = (parser as FromXmlParser).staxReader + + var header: Any? = null + var body: Any? = null + + while (sr.hasNext()) { + val type = sr.eventType + if (type == START_ELEMENT) { + when (sr.localName) { + "Header" -> { + header = when (headerClass) { + null, Nothing::class.java -> null + SoapAddressingHeaders::class.java -> parser.clone(sr).readValueAs(headerClass) + else -> if (sr.next() != END_ELEMENT) parser.clone(sr).readValueAs(headerClass) else null + } + } + "Fault" -> { + sr.soapFault() + } + "Body" -> { + when { + sr.nextTag() == START_ELEMENT && sr.localName == "Fault" -> { + sr.soapFault() + } + bodyClass != null && bodyClass != Nothing::class.java && bodyClass != Void::class.java -> { + body = parser.readValueAs(bodyClass) + } + } + } + } + } + try { + sr.next() + } catch (e: NoSuchElementException) { + break + } + } + + return SoapEnvelope( + header = header, + body = body + ) + } + + private fun XMLStreamReader.soapFault() { + var message: String? = null + var code: String? = null + + while (hasNext()) { + if (next() == START_ELEMENT) { + when (localName) { + "faultstring" -> { + if (next() == CHARACTERS) message = text + } + "faultcode" -> { + if (next() == CHARACTERS) code = text + } + "Reason" -> { + while (hasNext()) { + if (next() == START_ELEMENT && localName == "Text") { + if (next() == CHARACTERS) message = text + break + } + } + } + "Code" -> { + while (hasNext()) { + if (next() == START_ELEMENT && localName == "Value") { + if (next() == CHARACTERS) code = text + break + } + } + } + } + } + } + + throw SoapFault( + message = message, + code = code + ) + } + + private fun JsonParser.clone(sr: XMLStreamReader): JsonParser = when (codec) { + is XmlMapper -> (codec as XmlMapper).factory.createParser(sr) + else -> this + } + + override fun isCachable(): Boolean = true + } + + internal class JaxbElementDeserializer(type: JavaType) : StdDeserializer>(type) { + + override fun deserialize(parser: JsonParser, ctxt: DeserializationContext): JAXBElement<*> { + val contentType = wrappedClass() + val res = parser.readValueAs(contentType) + return JAXBElement(QName(parser.currentName), contentType, res) + } + + override fun getNullValue(ctxt: DeserializationContext): JAXBElement<*> { + val contentType = wrappedClass() + return JAXBElement(QName(ctxt.parser.currentName), contentType, null) + } + + override fun isCachable(): Boolean = true + + @Suppress("UNCHECKED_CAST") + private fun wrappedClass(): Class = valueType.bindings.typeParameters[0].rawClass as Class + } +} \ No newline at end of file diff --git a/jackson-datatype-soap-jakarta/src/main/kotlin/ru/sokomishalov/jackson/datatype/soap/ser/SoapEnvelopeSerializers.kt b/jackson-datatype-soap-jakarta/src/main/kotlin/ru/sokomishalov/jackson/datatype/soap/ser/SoapEnvelopeSerializers.kt new file mode 100644 index 0000000..39e9482 --- /dev/null +++ b/jackson-datatype-soap-jakarta/src/main/kotlin/ru/sokomishalov/jackson/datatype/soap/ser/SoapEnvelopeSerializers.kt @@ -0,0 +1,151 @@ +/* + * Copyright (c) 2021-present Mikhael Sokolov + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package ru.sokomishalov.jackson.datatype.soap.ser + +import com.fasterxml.jackson.core.JsonGenerator +import com.fasterxml.jackson.databind.* +import com.fasterxml.jackson.databind.ser.Serializers +import com.fasterxml.jackson.databind.ser.std.StdSerializer +import com.fasterxml.jackson.dataformat.xml.ser.ToXmlGenerator +import jakarta.xml.bind.JAXBElement +import jakarta.xml.bind.annotation.XmlRootElement +import ru.sokomishalov.jackson.datatype.soap.SoapAddressingHeaders +import ru.sokomishalov.jackson.datatype.soap.SoapConstants.SOAP_ADDRESSING_NAMESPACE +import ru.sokomishalov.jackson.datatype.soap.SoapConstants.XML_SCHEMA_NAMESPACE +import ru.sokomishalov.jackson.datatype.soap.SoapEnvelope +import ru.sokomishalov.jackson.datatype.soap.util.NamespaceCache +import javax.xml.namespace.QName + +/** + * @author sokomishalov + */ +internal class SoapEnvelopeSerializers(private val ns: String) : Serializers.Base() { + + override fun findSerializer( + config: SerializationConfig, + type: JavaType, + beanDesc: BeanDescription + ): JsonSerializer<*>? = when { + SoapEnvelope::class.java.isAssignableFrom(type.rawClass) -> SoapEnvelopeSerializer(ns) + JAXBElement::class.java.isAssignableFrom(type.rawClass) -> JaxbElementSerializer + else -> super.findSerializer(config, type, beanDesc) + } + + internal class SoapEnvelopeSerializer(private val ns: String) : StdSerializer>(SoapEnvelope::class.java) { + + override fun serialize(envelope: SoapEnvelope<*, *>?, gen: JsonGenerator, provider: SerializerProvider) { + if (envelope != null && gen is ToXmlGenerator) { + with(gen) { + setNextName(QName(ns, "Envelope")) + writeStartObject() + staxWriter.writeNamespace("xsi", XML_SCHEMA_NAMESPACE) + serializeElement(localPart = "Header", element = envelope.header, isHeader = true) + serializeElement(localPart = "Body", element = envelope.body, isHeader = false) + writeEndObject() + } + } + } + + private fun ToXmlGenerator.serializeElement(localPart: String, element: Any?, isHeader: Boolean) { + with(this) { + setNextName(QName(ns, localPart)) + writeFieldName(localPart) + + val annotation = element?.javaClass?.getAnnotation(XmlRootElement::class.java) + when { + isHeader && element is SoapAddressingHeaders -> { + writeStartObject() + staxWriter.writeNamespace("wsa", SOAP_ADDRESSING_NAMESPACE) + + writeSoapAddressingField("Action", element.action) + writeSoapAddressingField("MessageID", element.messageId) + writeSoapAddressingField("From", element.from) + writeSoapAddressingField("To", element.to) + + writeSoapAddressingEndpoint("ReplyTo", element.replyTo) + writeSoapAddressingEndpoint("FaultTo", element.faultTo) + + writeEndObject() + } + isHeader && element is Iterable<*> -> { + writeStartObject() + element.forEach { + if (it != null) { + setNextName(QName(NamespaceCache.getNamespace(it.javaClass), annotation?.name ?: it.javaClass.simpleName)) + writeFieldName(annotation?.name ?: it.javaClass.simpleName) + writeObject(it) + } + } + writeEndObject() + } + annotation != null -> { + writeStartObject() + setNextName(QName(NamespaceCache.getNamespace(element.javaClass), annotation.name)) + writeFieldName(annotation.name) + writeObject(element) + writeEndObject() + } + else -> writeObject(element) + } + } + } + + private fun ToXmlGenerator.writeSoapAddressingEndpoint( + name: String, + endpoint: SoapAddressingHeaders.Endpoint? + ) { + if (endpoint != null) { + setNextName(QName(SOAP_ADDRESSING_NAMESPACE, name)) + writeFieldName(name) + writeStartObject() + writeSoapAddressingField("Address", endpoint.address) + writeSoapAddressingField("ServiceName", endpoint.serviceName) + writeEndObject() + } + } + + private fun ToXmlGenerator.writeSoapAddressingField(name: String, value: String?) { + if (value != null) { + setNextName(QName(SOAP_ADDRESSING_NAMESPACE, name)) + writeFieldName(name) + writeRawValue(value) + } + } + } + + internal object JaxbElementSerializer : StdSerializer>(JAXBElement::class.java) { + override fun serialize(value: JAXBElement<*>?, gen: JsonGenerator, provider: SerializerProvider) { + when { + value != null && !value.isNil -> gen.writeObject(value.value) + else -> gen.writeNull() + } + } + } + + internal object XsiNilSerializer : JsonSerializer() { + override fun serialize(value: Any?, gen: JsonGenerator?, provider: SerializerProvider?) { + when (gen) { + is ToXmlGenerator -> with(gen) { + writeStartObject() + staxWriter.writeNamespace("xsi", XML_SCHEMA_NAMESPACE) + staxWriter.writeAttribute("xsi:nil", "true") + writeEndObject() + } + else -> gen?.writeNull() + } + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/ru/sokomishalov/jackson/dataformat/soap/AlwaysUseNamespacesXmlSerializerProvider.kt b/jackson-datatype-soap-jakarta/src/main/kotlin/ru/sokomishalov/jackson/datatype/soap/util/AlwaysUseNamespacesXmlSerializerProvider.kt similarity index 95% rename from src/main/kotlin/ru/sokomishalov/jackson/dataformat/soap/AlwaysUseNamespacesXmlSerializerProvider.kt rename to jackson-datatype-soap-jakarta/src/main/kotlin/ru/sokomishalov/jackson/datatype/soap/util/AlwaysUseNamespacesXmlSerializerProvider.kt index 9fe489e..a09e47b 100644 --- a/src/main/kotlin/ru/sokomishalov/jackson/dataformat/soap/AlwaysUseNamespacesXmlSerializerProvider.kt +++ b/jackson-datatype-soap-jakarta/src/main/kotlin/ru/sokomishalov/jackson/datatype/soap/util/AlwaysUseNamespacesXmlSerializerProvider.kt @@ -1,4 +1,4 @@ -package ru.sokomishalov.jackson.dataformat.soap +package ru.sokomishalov.jackson.datatype.soap.util import com.fasterxml.jackson.databind.SerializationConfig import com.fasterxml.jackson.databind.ser.DefaultSerializerProvider diff --git a/jackson-datatype-soap-jakarta/src/main/kotlin/ru/sokomishalov/jackson/datatype/soap/util/NamespaceCache.kt b/jackson-datatype-soap-jakarta/src/main/kotlin/ru/sokomishalov/jackson/datatype/soap/util/NamespaceCache.kt new file mode 100644 index 0000000..10f21b2 --- /dev/null +++ b/jackson-datatype-soap-jakarta/src/main/kotlin/ru/sokomishalov/jackson/datatype/soap/util/NamespaceCache.kt @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2021-present Mikhael Sokolov + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package ru.sokomishalov.jackson.datatype.soap.util + +import jakarta.xml.bind.annotation.XmlSchema +import java.util.concurrent.ConcurrentHashMap + +/** + * @author sokomishalov + */ +internal object NamespaceCache { + private val typeCache: MutableMap, String> = ConcurrentHashMap() + + internal fun getNamespace(clazz: Class<*>): String = typeCache.getOrPut(clazz) { + clazz.getPackage().getAnnotation(XmlSchema::class.java)?.namespace.orEmpty() + } +} \ No newline at end of file diff --git a/jackson-datatype-soap-jakarta/src/main/resources/META-INF/services/com.fasterxml.jackson.databind.ObjectMapper b/jackson-datatype-soap-jakarta/src/main/resources/META-INF/services/com.fasterxml.jackson.databind.ObjectMapper new file mode 100644 index 0000000..7770dee --- /dev/null +++ b/jackson-datatype-soap-jakarta/src/main/resources/META-INF/services/com.fasterxml.jackson.databind.ObjectMapper @@ -0,0 +1 @@ +ru.sokomishalov.jackson.datatype.soap.SoapMapper diff --git a/jackson-datatype-soap-jakarta/src/test/kotlin/ru/sokomishalov/jackson/datatype/soap/SoapMapperTest.kt b/jackson-datatype-soap-jakarta/src/test/kotlin/ru/sokomishalov/jackson/datatype/soap/SoapMapperTest.kt new file mode 100644 index 0000000..baeeb9c --- /dev/null +++ b/jackson-datatype-soap-jakarta/src/test/kotlin/ru/sokomishalov/jackson/datatype/soap/SoapMapperTest.kt @@ -0,0 +1,183 @@ +/* + * Copyright (c) 2021-present Mikhael Sokolov + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package ru.sokomishalov.jackson.datatype.soap + +import com.oracle.xmlns.apps.mdm.customer.GetPersonOutput +import de.addmore.grouplist.grouplist_001.AppMonDetailsStrict +import de.addmore.grouplist.grouplist_001.ControllObject +import de.addmore.grouplist.grouplist_001.GetGroupListRequest +import jakarta.xml.bind.JAXBContext +import jakarta.xml.bind.JAXBElement +import org.jeasy.random.EasyRandom +import org.jeasy.random.EasyRandomParameters +import org.junit.jupiter.api.Test +import javax.xml.namespace.QName +import javax.xml.stream.XMLInputFactory +import kotlin.test.* + + +class SoapMapperTest { + + private val mapper = SoapMapper() + + @Test + fun `Serialize pojo`() { + val header = random() + val body = random().apply { + listOfSwiPersonIO.contact.forEach { it.id = JAXBElement(QName("id"), String::class.java, "1500232321") } + } + + val envelope = SoapEnvelope(body = body, header = header) + + val result = mapper.writeValueAsString(envelope).also { println(it) } + + assertFalse { result.isNullOrBlank() } + + listOf( + ":Action>", + ":To>", + ":From>", + ":ReplyTo>", + ":FaultTo>", + ":Address>", + ":Envelope", + ":Contact>", + ":Id>", + ":Body>", + "ExternalSystemId=", + "ExternalSystemName=", + ":ListOfSwiPersonIO", + ":FirstName>", + ":LastName>" + ).forEach { + assertTrue("$it is not present") { it in result } + } + + val xif = XMLInputFactory.newFactory() + val xsr = xif.createXMLStreamReader(result.byteInputStream()) + while (runCatching { xsr.name.localPart != "getPerson_Output" }.getOrElse { true }) { + xsr.next() + } + + val unmarshaller = JAXBContext.newInstance(GetPersonOutput::class.java).createUnmarshaller() + val unmarshalled = unmarshaller.unmarshal(xsr) as GetPersonOutput + + assertEquals(body.listOfSwiPersonIO.externalSystemId, unmarshalled.listOfSwiPersonIO.externalSystemId) + assertEquals(body.listOfSwiPersonIO.language, unmarshalled.listOfSwiPersonIO.language) + assertEquals(body.listOfSwiPersonIO.contact.size, unmarshalled.listOfSwiPersonIO.contact.size) + assertEquals(body.listOfSwiPersonIO.contact[0].lastName, unmarshalled.listOfSwiPersonIO.contact[0].lastName) + } + + @Test + fun `Deserialize pojo`() { + val content = readResource("/example/get_person_output_ws_addr.xml") + val soapEnvelope = mapper.readValue(content) + + mapper.writeValueAsString(soapEnvelope).also { println(it) } + assertNotNull(soapEnvelope) + + assertNotNull(soapEnvelope.header) + assertNotNull(soapEnvelope.header?.action) + assertNotNull(soapEnvelope.header?.messageId) + assertNotNull(soapEnvelope.header?.from) + assertNotNull(soapEnvelope.header?.to) + assertNotNull(soapEnvelope.header?.replyTo) + assertNotNull(soapEnvelope.header?.faultTo) + + assertNotNull(soapEnvelope.body) + val pojo = soapEnvelope.body + assertNotNull(pojo) + assertNotNull(pojo.listOfSwiPersonIO) + assertEquals(2, pojo.listOfSwiPersonIO?.contact?.size) + pojo.listOfSwiPersonIO.contact.forEach { + assertFalse { it.id.value.isNullOrBlank() } + assertFalse { it.firstName.isNullOrBlank() } + assertFalse { it.lastName.isNullOrBlank() } + } + } + + @Test + fun `Deserialize soap 1_1 fault`() { + val content = readResource("/example/soap_fault_1_1.xml") + val soapFault = assertFailsWith { mapper.readValueBody(content) } + + mapper.writeValueAsString(soapFault).also { println(it) } + assertNotNull(soapFault) + assertNotNull(soapFault) + assertFalse { soapFault.message.isNullOrBlank() } + assertFalse { soapFault.code.isNullOrBlank() } + } + + @Test + fun `Deserialize soap 1_2 fault`() { + val content = readResource("/example/soap_fault_1_2.xml") + val soapFault = assertFailsWith { mapper.readValueBody(content) } + + mapper.writeValueAsString(soapFault).also { println(it) } + assertNotNull(soapFault) + assertNotNull(soapFault) + assertFalse { soapFault.message.isNullOrBlank() } + assertFalse { soapFault.code.isNullOrBlank() } + } + + @Test + fun `GH-36`() { + val first = AppMonDetailsStrict().apply { + bpId = random() + bpName = random() + } + val second = ControllObject().apply { + timeout = random() + } + + val header = SoapMultipleHeaders(first, second) + val body = random() + + val envelope = SoapEnvelope(body = body, header = header) + + val result = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(envelope).also { println(it) } + + listOf( + ":AppMonDetailsStrict", + ":ControllObject", + ":bpId", + ":bpName", + ":timeout", + ).forEach { + assertTrue("$it is not present") { it in result } + } + } + + private fun readResource(path: String) = javaClass.getResource(path)?.readText().orEmpty() + private inline fun random(): T = RANDOM.nextObject(T::class.java) + + companion object { + private val RANDOM: EasyRandom = EasyRandom( + EasyRandomParameters() + .charset(Charsets.UTF_8) + .collectionSizeRange(1, 2) + .stringLengthRange(5, 20) + .scanClasspathForConcreteTypes(true) + .overrideDefaultInitialization(false) + .ignoreRandomizationErrors(true) + .excludeField { it.name in NULL_FIELDS } + ) + + @JvmField + val NULL_FIELDS: List = listOf("language", "locale") + } + +} \ No newline at end of file diff --git a/src/test/resources/example/get_person_output_ws_addr.xml b/jackson-datatype-soap-jakarta/src/test/resources/example/get_person_output_ws_addr.xml similarity index 100% rename from src/test/resources/example/get_person_output_ws_addr.xml rename to jackson-datatype-soap-jakarta/src/test/resources/example/get_person_output_ws_addr.xml diff --git a/src/test/resources/example/soap_fault_1_1.xml b/jackson-datatype-soap-jakarta/src/test/resources/example/soap_fault_1_1.xml similarity index 100% rename from src/test/resources/example/soap_fault_1_1.xml rename to jackson-datatype-soap-jakarta/src/test/resources/example/soap_fault_1_1.xml diff --git a/src/test/resources/example/soap_fault_1_2.xml b/jackson-datatype-soap-jakarta/src/test/resources/example/soap_fault_1_2.xml similarity index 100% rename from src/test/resources/example/soap_fault_1_2.xml rename to jackson-datatype-soap-jakarta/src/test/resources/example/soap_fault_1_2.xml diff --git a/src/test/resources/wsdl/PersonService.wsdl b/jackson-datatype-soap-jakarta/src/test/resources/wsdl/PersonService.wsdl similarity index 100% rename from src/test/resources/wsdl/PersonService.wsdl rename to jackson-datatype-soap-jakarta/src/test/resources/wsdl/PersonService.wsdl diff --git a/src/test/resources/wsdl/issue-36.wsdl b/jackson-datatype-soap-jakarta/src/test/resources/wsdl/issue-36.wsdl similarity index 100% rename from src/test/resources/wsdl/issue-36.wsdl rename to jackson-datatype-soap-jakarta/src/test/resources/wsdl/issue-36.wsdl diff --git a/jackson-datatype-soap-jaxb/pom.xml b/jackson-datatype-soap-jaxb/pom.xml new file mode 100644 index 0000000..c908eb5 --- /dev/null +++ b/jackson-datatype-soap-jaxb/pom.xml @@ -0,0 +1,141 @@ + + + 4.0.0 + + + ru.sokomishalov.jackson + jackson-datatype-soap-parent + ${revision} + + + jackson-datatype-soap-jaxb + ${revision} + + + + + ru.sokomishalov.jackson + jackson-datatype-soap-common + ${revision} + + + com.fasterxml.jackson.module + jackson-module-jaxb-annotations + + + + + jakarta.xml.ws + jakarta.xml.ws-api + 2.3.3 + test + + + org.glassfish.jaxb + jaxb-runtime + 2.3.9 + test + + + org.jetbrains.kotlin + kotlin-test-junit5 + test + + + org.jeasy + easy-random-core + ${jeasy-random.version} + test + + + + + ${project.basedir}/src/main/kotlin + ${project.basedir}/src/test/kotlin + + + org.jetbrains.kotlin + kotlin-maven-plugin + ${kotlin.version} + + + org.jetbrains.kotlin + kotlin-maven-allopen + ${kotlin.version} + + + + ${java.version} + + + + compile + process-sources + + compile + + + + test-compile + test-compile + + test-compile + + + + + + org.apache.cxf + cxf-codegen-plugin + 3.5.7 + + + generate-test-sources + generate-test-sources + + src/test/resources/wsdl + ${project.build.directory}/generated-test-sources/cxf + + + ${project.basedir}/src/test/resources/wsdl/PersonService.wsdl + + + ${project.basedir}/src/test/resources/wsdl/issue-36.wsdl + + + + + wsdl2java + + + + + + org.codehaus.mojo + build-helper-maven-plugin + 3.5.0 + + + add-test-sources + generate-test-sources + + add-test-source + + + + ${project.build.directory}/generated-test-sources/cxf + + + + + + + maven-surefire-plugin + 2.22.2 + + + + + \ No newline at end of file diff --git a/src/main/kotlin/ru/sokomishalov/jackson/dataformat/soap/SoapJaxbAnnotationIntrospector.kt b/jackson-datatype-soap-jaxb/src/main/kotlin/ru/sokomishalov/jackson/datatype/soap/SoapJaxbAnnotationIntrospector.kt similarity index 93% rename from src/main/kotlin/ru/sokomishalov/jackson/dataformat/soap/SoapJaxbAnnotationIntrospector.kt rename to jackson-datatype-soap-jaxb/src/main/kotlin/ru/sokomishalov/jackson/datatype/soap/SoapJaxbAnnotationIntrospector.kt index 5e83069..21bbaae 100644 --- a/src/main/kotlin/ru/sokomishalov/jackson/dataformat/soap/SoapJaxbAnnotationIntrospector.kt +++ b/jackson-datatype-soap-jaxb/src/main/kotlin/ru/sokomishalov/jackson/datatype/soap/SoapJaxbAnnotationIntrospector.kt @@ -15,7 +15,7 @@ */ @file:Suppress("MemberVisibilityCanBePrivate") -package ru.sokomishalov.jackson.dataformat.soap +package ru.sokomishalov.jackson.datatype.soap import com.fasterxml.jackson.databind.PropertyName import com.fasterxml.jackson.databind.PropertyName.NO_NAME @@ -24,8 +24,8 @@ import com.fasterxml.jackson.databind.introspect.Annotated import com.fasterxml.jackson.databind.type.TypeFactory import com.fasterxml.jackson.databind.util.ClassUtil import com.fasterxml.jackson.module.jaxb.JaxbAnnotationIntrospector -import ru.sokomishalov.jackson.dataformat.soap.ser.SoapEnvelopeSerializers -import ru.sokomishalov.jackson.dataformat.soap.util.NamespaceCache +import ru.sokomishalov.jackson.datatype.soap.ser.SoapEnvelopeSerializers +import ru.sokomishalov.jackson.datatype.soap.util.NamespaceCache import java.lang.reflect.Field import java.lang.reflect.Method import javax.xml.bind.annotation.XmlAttribute diff --git a/jackson-datatype-soap-jaxb/src/main/kotlin/ru/sokomishalov/jackson/datatype/soap/SoapMapper.kt b/jackson-datatype-soap-jaxb/src/main/kotlin/ru/sokomishalov/jackson/datatype/soap/SoapMapper.kt new file mode 100644 index 0000000..fdc45fb --- /dev/null +++ b/jackson-datatype-soap-jaxb/src/main/kotlin/ru/sokomishalov/jackson/datatype/soap/SoapMapper.kt @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2021-present Mikhael Sokolov + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package ru.sokomishalov.jackson.datatype.soap + +import com.fasterxml.jackson.databind.JavaType +import com.fasterxml.jackson.dataformat.xml.XmlMapper + + +/** + * @author sokomishalov + */ +class SoapMapper : XmlMapper() { + init { + registerModule(SoapModule()) + } + + @JvmOverloads + fun readValue(envelope: String, bodyClass: Class, headerClass: Class? = null): SoapEnvelope { + return readValue(envelope, createGenericSoapEnvelope(headerClass, bodyClass)) + } + + private fun createGenericSoapEnvelope(headerClass: Class?, bodyClass: Class): JavaType { + return typeFactory.constructParametricType(SoapEnvelope::class.java, headerClass ?: Nothing::class.java, bodyClass) + } +} \ No newline at end of file diff --git a/jackson-datatype-soap-jaxb/src/main/kotlin/ru/sokomishalov/jackson/datatype/soap/SoapMapperExtensions.kt b/jackson-datatype-soap-jaxb/src/main/kotlin/ru/sokomishalov/jackson/datatype/soap/SoapMapperExtensions.kt new file mode 100644 index 0000000..9505110 --- /dev/null +++ b/jackson-datatype-soap-jaxb/src/main/kotlin/ru/sokomishalov/jackson/datatype/soap/SoapMapperExtensions.kt @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2021-present Mikhael Sokolov + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package ru.sokomishalov.jackson.datatype.soap + + +/** + * @author sokomishalov + */ + +inline fun SoapMapper.readValue(envelope: String): SoapEnvelope { + return readValue( + envelope = envelope, + bodyClass = B::class.java, + headerClass = H::class.java + ) +} + +inline fun SoapMapper.readValueBody(envelope: String): B? { + return readValue( + envelope = envelope, + bodyClass = B::class.java, + headerClass = Nothing::class.java + ).body +} \ No newline at end of file diff --git a/src/main/kotlin/ru/sokomishalov/jackson/dataformat/soap/SoapModule.kt b/jackson-datatype-soap-jaxb/src/main/kotlin/ru/sokomishalov/jackson/datatype/soap/SoapModule.kt similarity index 86% rename from src/main/kotlin/ru/sokomishalov/jackson/dataformat/soap/SoapModule.kt rename to jackson-datatype-soap-jaxb/src/main/kotlin/ru/sokomishalov/jackson/datatype/soap/SoapModule.kt index ca89233..cc511fb 100644 --- a/src/main/kotlin/ru/sokomishalov/jackson/dataformat/soap/SoapModule.kt +++ b/jackson-datatype-soap-jaxb/src/main/kotlin/ru/sokomishalov/jackson/datatype/soap/SoapModule.kt @@ -17,7 +17,7 @@ "CanBeParameter" ) -package ru.sokomishalov.jackson.dataformat.soap +package ru.sokomishalov.jackson.datatype.soap import com.ctc.wstx.stax.WstxOutputFactory import com.fasterxml.jackson.databind.DeserializationFeature.* @@ -28,9 +28,10 @@ import com.fasterxml.jackson.databind.SerializationFeature.FAIL_ON_EMPTY_BEANS import com.fasterxml.jackson.databind.SerializationFeature.WRITE_DATES_AS_TIMESTAMPS import com.fasterxml.jackson.dataformat.xml.XmlFactory import com.fasterxml.jackson.module.jaxb.JaxbAnnotationModule -import ru.sokomishalov.jackson.dataformat.soap.SoapConstants.SOAP_11_ENVELOPE_NAMESPACE -import ru.sokomishalov.jackson.dataformat.soap.deser.SoapEnvelopeDeserializers -import ru.sokomishalov.jackson.dataformat.soap.ser.SoapEnvelopeSerializers +import ru.sokomishalov.jackson.datatype.soap.SoapConstants.SOAP_11_ENVELOPE_NAMESPACE +import ru.sokomishalov.jackson.datatype.soap.deser.SoapEnvelopeDeserializers +import ru.sokomishalov.jackson.datatype.soap.ser.SoapEnvelopeSerializers +import ru.sokomishalov.jackson.datatype.soap.util.AlwaysUseNamespacesXmlSerializerProvider /** * @author sokomishalov diff --git a/src/main/kotlin/ru/sokomishalov/jackson/dataformat/soap/deser/SoapEnvelopeDeserializers.kt b/jackson-datatype-soap-jaxb/src/main/kotlin/ru/sokomishalov/jackson/datatype/soap/deser/SoapEnvelopeDeserializers.kt similarity index 95% rename from src/main/kotlin/ru/sokomishalov/jackson/dataformat/soap/deser/SoapEnvelopeDeserializers.kt rename to jackson-datatype-soap-jaxb/src/main/kotlin/ru/sokomishalov/jackson/datatype/soap/deser/SoapEnvelopeDeserializers.kt index 3d0dfe1..5a4adbf 100644 --- a/src/main/kotlin/ru/sokomishalov/jackson/dataformat/soap/deser/SoapEnvelopeDeserializers.kt +++ b/jackson-datatype-soap-jaxb/src/main/kotlin/ru/sokomishalov/jackson/datatype/soap/deser/SoapEnvelopeDeserializers.kt @@ -13,7 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package ru.sokomishalov.jackson.dataformat.soap.deser +@file:Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE") + +package ru.sokomishalov.jackson.datatype.soap.deser import com.fasterxml.jackson.core.JsonParser import com.fasterxml.jackson.databind.* @@ -21,9 +23,9 @@ import com.fasterxml.jackson.databind.deser.Deserializers import com.fasterxml.jackson.databind.deser.std.StdDeserializer import com.fasterxml.jackson.dataformat.xml.XmlMapper import com.fasterxml.jackson.dataformat.xml.deser.FromXmlParser -import ru.sokomishalov.jackson.dataformat.soap.SoapAddressingHeaders -import ru.sokomishalov.jackson.dataformat.soap.SoapEnvelope -import ru.sokomishalov.jackson.dataformat.soap.SoapFault +import ru.sokomishalov.jackson.datatype.soap.SoapAddressingHeaders +import ru.sokomishalov.jackson.datatype.soap.SoapEnvelope +import ru.sokomishalov.jackson.datatype.soap.SoapFault import javax.xml.bind.JAXBElement import javax.xml.namespace.QName import javax.xml.stream.XMLStreamConstants.* diff --git a/src/main/kotlin/ru/sokomishalov/jackson/dataformat/soap/ser/SoapEnvelopeSerializers.kt b/jackson-datatype-soap-jaxb/src/main/kotlin/ru/sokomishalov/jackson/datatype/soap/ser/SoapEnvelopeSerializers.kt similarity index 93% rename from src/main/kotlin/ru/sokomishalov/jackson/dataformat/soap/ser/SoapEnvelopeSerializers.kt rename to jackson-datatype-soap-jaxb/src/main/kotlin/ru/sokomishalov/jackson/datatype/soap/ser/SoapEnvelopeSerializers.kt index 5b72c20..54fa21a 100644 --- a/src/main/kotlin/ru/sokomishalov/jackson/dataformat/soap/ser/SoapEnvelopeSerializers.kt +++ b/jackson-datatype-soap-jaxb/src/main/kotlin/ru/sokomishalov/jackson/datatype/soap/ser/SoapEnvelopeSerializers.kt @@ -13,18 +13,18 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package ru.sokomishalov.jackson.dataformat.soap.ser +package ru.sokomishalov.jackson.datatype.soap.ser import com.fasterxml.jackson.core.JsonGenerator import com.fasterxml.jackson.databind.* import com.fasterxml.jackson.databind.ser.Serializers import com.fasterxml.jackson.databind.ser.std.StdSerializer import com.fasterxml.jackson.dataformat.xml.ser.ToXmlGenerator -import ru.sokomishalov.jackson.dataformat.soap.SoapAddressingHeaders -import ru.sokomishalov.jackson.dataformat.soap.SoapConstants.SOAP_ADDRESSING_NAMESPACE -import ru.sokomishalov.jackson.dataformat.soap.SoapConstants.XML_SCHEMA_NAMESPACE -import ru.sokomishalov.jackson.dataformat.soap.SoapEnvelope -import ru.sokomishalov.jackson.dataformat.soap.util.NamespaceCache +import ru.sokomishalov.jackson.datatype.soap.SoapAddressingHeaders +import ru.sokomishalov.jackson.datatype.soap.SoapConstants.SOAP_ADDRESSING_NAMESPACE +import ru.sokomishalov.jackson.datatype.soap.SoapConstants.XML_SCHEMA_NAMESPACE +import ru.sokomishalov.jackson.datatype.soap.SoapEnvelope +import ru.sokomishalov.jackson.datatype.soap.util.NamespaceCache import javax.xml.bind.JAXBElement import javax.xml.bind.annotation.XmlRootElement import javax.xml.namespace.QName diff --git a/jackson-datatype-soap-jaxb/src/main/kotlin/ru/sokomishalov/jackson/datatype/soap/util/AlwaysUseNamespacesXmlSerializerProvider.kt b/jackson-datatype-soap-jaxb/src/main/kotlin/ru/sokomishalov/jackson/datatype/soap/util/AlwaysUseNamespacesXmlSerializerProvider.kt new file mode 100644 index 0000000..a09e47b --- /dev/null +++ b/jackson-datatype-soap-jaxb/src/main/kotlin/ru/sokomishalov/jackson/datatype/soap/util/AlwaysUseNamespacesXmlSerializerProvider.kt @@ -0,0 +1,25 @@ +package ru.sokomishalov.jackson.datatype.soap.util + +import com.fasterxml.jackson.databind.SerializationConfig +import com.fasterxml.jackson.databind.ser.DefaultSerializerProvider +import com.fasterxml.jackson.databind.ser.SerializerFactory +import com.fasterxml.jackson.dataformat.xml.ser.ToXmlGenerator +import com.fasterxml.jackson.dataformat.xml.ser.XmlSerializerProvider +import com.fasterxml.jackson.dataformat.xml.util.XmlRootNameLookup +import javax.xml.XMLConstants.NULL_NS_URI +import javax.xml.namespace.QName + +internal class AlwaysUseNamespacesXmlSerializerProvider : XmlSerializerProvider { + + internal constructor() : super(XmlRootNameLookup()) + internal constructor(src: XmlSerializerProvider, config: SerializationConfig?, f: SerializerFactory?) : super(src, config, f) + + override fun createInstance(config: SerializationConfig?, jsf: SerializerFactory?): DefaultSerializerProvider { + return AlwaysUseNamespacesXmlSerializerProvider(this, config, jsf) + } + + override fun _initWithRootName(xgen: ToXmlGenerator, rootName: QName?) { + super._initWithRootName(xgen, rootName) + xgen.staxWriter.setDefaultNamespace(NULL_NS_URI) + } +} \ No newline at end of file diff --git a/src/main/kotlin/ru/sokomishalov/jackson/dataformat/soap/util/NamespaceCache.kt b/jackson-datatype-soap-jaxb/src/main/kotlin/ru/sokomishalov/jackson/datatype/soap/util/NamespaceCache.kt similarity index 95% rename from src/main/kotlin/ru/sokomishalov/jackson/dataformat/soap/util/NamespaceCache.kt rename to jackson-datatype-soap-jaxb/src/main/kotlin/ru/sokomishalov/jackson/datatype/soap/util/NamespaceCache.kt index c1d90ca..cd41b94 100644 --- a/src/main/kotlin/ru/sokomishalov/jackson/dataformat/soap/util/NamespaceCache.kt +++ b/jackson-datatype-soap-jaxb/src/main/kotlin/ru/sokomishalov/jackson/datatype/soap/util/NamespaceCache.kt @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package ru.sokomishalov.jackson.dataformat.soap.util +package ru.sokomishalov.jackson.datatype.soap.util import java.util.concurrent.ConcurrentHashMap import javax.xml.bind.annotation.XmlSchema diff --git a/jackson-datatype-soap-jaxb/src/main/resources/META-INF/services/com.fasterxml.jackson.databind.ObjectMapper b/jackson-datatype-soap-jaxb/src/main/resources/META-INF/services/com.fasterxml.jackson.databind.ObjectMapper new file mode 100644 index 0000000..7770dee --- /dev/null +++ b/jackson-datatype-soap-jaxb/src/main/resources/META-INF/services/com.fasterxml.jackson.databind.ObjectMapper @@ -0,0 +1 @@ +ru.sokomishalov.jackson.datatype.soap.SoapMapper diff --git a/src/test/kotlin/ru/sokomishalov/jackson/dataformat/soap/SoapMapperTest.kt b/jackson-datatype-soap-jaxb/src/test/kotlin/ru/sokomishalov/jackson/dataformat/soap/SoapMapperTest.kt similarity index 99% rename from src/test/kotlin/ru/sokomishalov/jackson/dataformat/soap/SoapMapperTest.kt rename to jackson-datatype-soap-jaxb/src/test/kotlin/ru/sokomishalov/jackson/dataformat/soap/SoapMapperTest.kt index 40decf8..3081866 100644 --- a/src/test/kotlin/ru/sokomishalov/jackson/dataformat/soap/SoapMapperTest.kt +++ b/jackson-datatype-soap-jaxb/src/test/kotlin/ru/sokomishalov/jackson/dataformat/soap/SoapMapperTest.kt @@ -22,6 +22,7 @@ import de.addmore.grouplist.grouplist_001.GetGroupListRequest import org.jeasy.random.EasyRandom import org.jeasy.random.EasyRandomParameters import org.junit.jupiter.api.Test +import ru.sokomishalov.jackson.datatype.soap.* import javax.xml.bind.JAXBContext import javax.xml.bind.JAXBElement import javax.xml.namespace.QName diff --git a/jackson-datatype-soap-jaxb/src/test/resources/example/get_person_output_ws_addr.xml b/jackson-datatype-soap-jaxb/src/test/resources/example/get_person_output_ws_addr.xml new file mode 100644 index 0000000..4d13106 --- /dev/null +++ b/jackson-datatype-soap-jaxb/src/test/resources/example/get_person_output_ws_addr.xml @@ -0,0 +1,36 @@ + + + GetPerson + uuid:6B29FC40-CA47-1067-B31D-00DD010662DA + http://www.w3.org/2005/08/addressing/anonymous + http://www.w3.org/2005/08/addressing/anonymous + + http://www.w3.org/2005/08/addressing/anonymous + + + http://www.w3.org/2005/08/addressing/anonymous + + + + + + + 1 + 01/01/1970 + Ivan + Ivanov + 1 + + + + 2 + 01/01/1970 + Petr + Petrov + 1 + + + + + + \ No newline at end of file diff --git a/jackson-datatype-soap-jaxb/src/test/resources/example/soap_fault_1_1.xml b/jackson-datatype-soap-jaxb/src/test/resources/example/soap_fault_1_1.xml new file mode 100644 index 0000000..5acbb08 --- /dev/null +++ b/jackson-datatype-soap-jaxb/src/test/resources/example/soap_fault_1_1.xml @@ -0,0 +1,9 @@ + + + + soap:VersionMismatch + Message was not SOAP 1.1 compliant + http://sample.org.ocm/jws/authnticator + + + \ No newline at end of file diff --git a/jackson-datatype-soap-jaxb/src/test/resources/example/soap_fault_1_2.xml b/jackson-datatype-soap-jaxb/src/test/resources/example/soap_fault_1_2.xml new file mode 100644 index 0000000..d1cbcb5 --- /dev/null +++ b/jackson-datatype-soap-jaxb/src/test/resources/example/soap_fault_1_2.xml @@ -0,0 +1,15 @@ + + + + + env:Sender + + rpc:BadArguments + + + + Processing error + + + + \ No newline at end of file diff --git a/jackson-datatype-soap-jaxb/src/test/resources/wsdl/PersonService.wsdl b/jackson-datatype-soap-jaxb/src/test/resources/wsdl/PersonService.wsdl new file mode 100644 index 0000000..ec2b259 --- /dev/null +++ b/jackson-datatype-soap-jaxb/src/test/resources/wsdl/PersonService.wsdl @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/jackson-datatype-soap-jaxb/src/test/resources/wsdl/issue-36.wsdl b/jackson-datatype-soap-jaxb/src/test/resources/wsdl/issue-36.wsdl new file mode 100644 index 0000000..c1a1607 --- /dev/null +++ b/jackson-datatype-soap-jaxb/src/test/resources/wsdl/issue-36.wsdl @@ -0,0 +1,104 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index 156cb28..c5646fc 100644 --- a/pom.xml +++ b/pom.xml @@ -5,54 +5,30 @@ 4.0.0 ru.sokomishalov.jackson - jackson-dataformat-soap + jackson-datatype-soap-parent ${revision} + pom - 0.2.1-SNAPSHOT + 0.3.0-SNAPSHOT 1.8 1.9.20 2.16.1 4.3.0 - ${java.version} ${java.version} - jackson-dataformat-soap - Jackson SOAP - https://github.com/sokomishalov/jackson-dataformat-soap/ - - - - - org.jetbrains.kotlin - kotlin-stdlib - ${kotlin.version} - - - com.fasterxml.jackson.module - jackson-module-jaxb-annotations - - - com.fasterxml.jackson.dataformat - jackson-dataformat-xml - + + jackson-datatype-soap-common + jackson-datatype-soap-jaxb + jackson-datatype-soap-jakarta + - - - org.jetbrains.kotlin - kotlin-test-junit5 - test - - - org.jeasy - easy-random-core - ${jeasy-random.version} - test - - + jackson-datatype-soap + Jackson SOAP + https://github.com/sokomishalov/jackson-datatype-soap/ @@ -90,72 +66,15 @@ - https://github.com/sokomishalov/jackson-dataformat-soap - scm:git:git://github.com/sokomishalov/jackson-dataformat-soap.git - scm:git:ssh://github.com/sokomishalov/jackson-dataformat-soap.git + https://github.com/sokomishalov/jackson-datatype-soap + scm:git:git://github.com/sokomishalov/jackson-datatype-soap.git + scm:git:ssh://github.com/sokomishalov/jackson-datatype-soap.git ${project.basedir}/src/main/kotlin ${project.basedir}/src/test/kotlin - - org.jetbrains.kotlin - kotlin-maven-plugin - ${kotlin.version} - - - org.jetbrains.kotlin - kotlin-maven-allopen - ${kotlin.version} - - - - ${java.version} - - - - compile - process-sources - - compile - - - - test-compile - test-compile - - test-compile - - - - - - org.apache.cxf - cxf-codegen-plugin - 3.5.7 - - - generate-sources - generate-sources - - src/main/resources/wsdl - ${project.build.directory}/generated-sources/cxf - - - ${project.basedir}/src/test/resources/wsdl/PersonService.wsdl - - - ${project.basedir}/src/test/resources/wsdl/issue-36.wsdl - - - - - wsdl2java - - - - org.codehaus.mojo flatten-maven-plugin diff --git a/release.sh b/release.sh index 02f729b..0d9651f 100644 --- a/release.sh +++ b/release.sh @@ -16,7 +16,7 @@ git add pom.xml docker run -it --rm -e CHANGELOG_GITHUB_TOKEN -v "$(pwd)":/usr/local/src/your-app \ githubchangeloggenerator/github-changelog-generator \ -u sokomishalov \ - -p jackson-dataformat-soap \ + -p jackson-datatype-soap \ --unreleased false \ --future-release "$NEW_VERSION" git add CHANGELOG.md diff --git a/src/main/resources/META-INF/services/com.fasterxml.jackson.databind.ObjectMapper b/src/main/resources/META-INF/services/com.fasterxml.jackson.databind.ObjectMapper deleted file mode 100644 index ca30812..0000000 --- a/src/main/resources/META-INF/services/com.fasterxml.jackson.databind.ObjectMapper +++ /dev/null @@ -1 +0,0 @@ -ru.sokomishalov.jackson.dataformat.soap.SoapMapper