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