diff --git a/gradle/plugins/conventions-plugin/src/main/java/org/springframework/ws/gradle/conventions/CheckstyleConventions.java b/gradle/plugins/conventions-plugin/src/main/java/org/springframework/ws/gradle/conventions/CheckstyleConventions.java index 23949656..8634d96a 100644 --- a/gradle/plugins/conventions-plugin/src/main/java/org/springframework/ws/gradle/conventions/CheckstyleConventions.java +++ b/gradle/plugins/conventions-plugin/src/main/java/org/springframework/ws/gradle/conventions/CheckstyleConventions.java @@ -40,8 +40,10 @@ public class CheckstyleConventions { public void apply(Project project) { project.getPlugins().withType(JavaPlugin.class, (java) -> { project.getPlugins().apply(CheckstylePlugin.class); - project.getTasks().withType(Checkstyle.class).forEach(checkstyle -> checkstyle.getMaxHeapSize().set("1g")); - project.getTasks().named("checkstyleTest").configure(task -> task.setEnabled(false)); + project.getTasks() + .withType(Checkstyle.class) + .forEach((checkstyle) -> checkstyle.getMaxHeapSize().set("1g")); + project.getTasks().named("checkstyleTest").configure((task) -> task.setEnabled(false)); CheckstyleExtension checkstyle = project.getExtensions().getByType(CheckstyleExtension.class); checkstyle.setToolVersion("10.21.1"); checkstyle.getConfigDirectory().set(project.getRootProject().file("src/checkstyle")); diff --git a/gradle/plugins/conventions-plugin/src/main/java/org/springframework/ws/gradle/conventions/JavaPluginConventions.java b/gradle/plugins/conventions-plugin/src/main/java/org/springframework/ws/gradle/conventions/JavaPluginConventions.java index 93042830..d9c8ad71 100644 --- a/gradle/plugins/conventions-plugin/src/main/java/org/springframework/ws/gradle/conventions/JavaPluginConventions.java +++ b/gradle/plugins/conventions-plugin/src/main/java/org/springframework/ws/gradle/conventions/JavaPluginConventions.java @@ -16,6 +16,8 @@ package org.springframework.ws.gradle.conventions; +import java.util.Arrays; +import java.util.List; import java.util.Map; import java.util.TreeMap; @@ -29,6 +31,7 @@ import org.gradle.api.plugins.JavaPlugin; import org.gradle.api.plugins.JavaPluginExtension; import org.gradle.api.tasks.SourceSet; import org.gradle.api.tasks.bundling.Jar; +import org.gradle.api.tasks.compile.JavaCompile; import org.gradle.api.tasks.testing.Test; import org.gradle.jvm.toolchain.JavaLanguageVersion; @@ -43,6 +46,7 @@ class JavaPluginConventions { void apply(Project project) { project.getPlugins().apply(SpringJavaFormatPlugin.class); + configureJavaConventions(project); JavaPluginExtension java = project.getExtensions().getByType(JavaPluginExtension.class); enableSourceAndJavadocJars(java); configureSourceAndTargetCompatibility(java); @@ -53,7 +57,22 @@ class JavaPluginConventions { configureJUnitPlatform(project); } - + private void configureJavaConventions(Project project) { + project.getTasks().withType(JavaCompile.class, (compile) -> { + compile.getOptions().setEncoding("UTF-8"); + List args = compile.getOptions().getCompilerArgs(); + if (!args.contains("-parameters")) { + args.add("-parameters"); + } + boolean buildWithJava17 = !project.hasProperty("toolchainVersion") + && JavaVersion.current() == JavaVersion.VERSION_17; + if (buildWithJava17) { + args.addAll(Arrays.asList("-Werror", "-Xlint:unchecked", "-Xlint:deprecation", "-Xlint:rawtypes", + "-Xlint:varargs")); + } + }); + project.getDependencies().add("compileOnly", "com.google.code.findbugs:jsr305"); + } private void enableSourceAndJavadocJars(JavaPluginExtension java) { java.withSourcesJar(); @@ -111,6 +130,7 @@ class JavaPluginConventions { private void configureJUnitPlatform(Project project) { project.getTasks().withType(Test.class).configureEach((task) -> task.useJUnitPlatform()); + project.getDependencies().add("testImplementation", "org.apiguardian:apiguardian-api"); project.getDependencies().add("testRuntimeOnly", "org.junit.platform:junit-platform-launcher"); } diff --git a/spring-ws-core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapMessage.java b/spring-ws-core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapMessage.java index a9370bf5..862d050f 100644 --- a/spring-ws-core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapMessage.java +++ b/spring-ws-core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapMessage.java @@ -294,12 +294,7 @@ public class AxiomSoapMessage extends AbstractSoapMessage implements StreamingWe writeSwAMessage(outputStream, outputFormat); } else { - if (this.payloadCaching) { - this.axiomMessage.serialize(outputStream, outputFormat); - } - else { - this.axiomMessage.serializeAndConsume(outputStream, outputFormat); - } + this.axiomMessage.serialize(outputStream, outputFormat, this.payloadCaching); } outputStream.flush(); } @@ -347,11 +342,11 @@ public class AxiomSoapMessage extends AbstractSoapMessage implements StreamingWe throws XMLStreamException, UnsupportedEncodingException { StringWriter writer = new StringWriter(); SOAPEnvelope envelope = this.axiomMessage.getSOAPEnvelope(); - if (this.payloadCaching) { - envelope.serialize(writer, format); + try { + envelope.serialize(writer, format, this.payloadCaching); } - else { - envelope.serializeAndConsume(writer, format); + catch (IOException ex) { + throw new XMLStreamException(ex); } try { diff --git a/spring-ws-core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapMessageFactory.java b/spring-ws-core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapMessageFactory.java index cca56fcb..eb124884 100644 --- a/spring-ws-core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapMessageFactory.java +++ b/spring-ws-core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapMessageFactory.java @@ -31,13 +31,10 @@ import org.apache.axiom.om.OMAbstractFactory; import org.apache.axiom.om.OMException; import org.apache.axiom.om.OMXMLBuilderFactory; import org.apache.axiom.om.impl.MTOMConstants; -import org.apache.axiom.soap.SOAP11Constants; -import org.apache.axiom.soap.SOAP11Version; -import org.apache.axiom.soap.SOAP12Constants; -import org.apache.axiom.soap.SOAP12Version; import org.apache.axiom.soap.SOAPFactory; import org.apache.axiom.soap.SOAPMessage; import org.apache.axiom.soap.SOAPModelBuilder; +import org.apache.axiom.soap.SOAPVersion; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -316,19 +313,6 @@ public class AxiomSoapMessageFactory implements SoapMessageFactory, Initializing this.langAttributeOnSoap11FaultString); } - private String getSoapEnvelopeNamespace(String contentType) { - if (contentType.contains(SOAP11Constants.SOAP_11_CONTENT_TYPE)) { - return SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI; - } - else if (contentType.contains(SOAP12Constants.SOAP_12_CONTENT_TYPE)) { - return SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI; - } - else { - throw new AxiomSoapMessageCreationException("Unknown content type '" + contentType + "'"); - } - - } - /** * Returns the character set from the given content type. Mostly copied * @return the character set encoding @@ -385,10 +369,10 @@ public class AxiomSoapMessageFactory implements SoapMessageFactory, Initializing public String toString() { StringBuilder builder = new StringBuilder("AxiomSoapMessageFactory["); - if (this.soapFactory.getSOAPVersion() == SOAP11Version.getSingleton()) { + if (this.soapFactory.getSOAPVersion() == SOAPVersion.SOAP11) { builder.append("SOAP 1.1"); } - else if (this.soapFactory.getSOAPVersion() == SOAP12Version.getSingleton()) { + else if (this.soapFactory.getSOAPVersion() == SOAPVersion.SOAP12) { builder.append("SOAP 1.2"); } builder.append(','); diff --git a/spring-ws-core/src/main/java/org/springframework/ws/soap/axiom/NonCachingPayload.java b/spring-ws-core/src/main/java/org/springframework/ws/soap/axiom/NonCachingPayload.java index b72cf431..2573c50b 100644 --- a/spring-ws-core/src/main/java/org/springframework/ws/soap/axiom/NonCachingPayload.java +++ b/spring-ws-core/src/main/java/org/springframework/ws/soap/axiom/NonCachingPayload.java @@ -75,6 +75,7 @@ class NonCachingPayload extends AbstractPayload { private boolean payloadAdded = false; + @SuppressWarnings("deprecation") private DelegatingStreamWriter() { try { this.delegate = StAXUtils.createXMLStreamWriter(this.baos); diff --git a/spring-ws-core/src/main/java/org/springframework/ws/soap/axiom/support/AxiomUtils.java b/spring-ws-core/src/main/java/org/springframework/ws/soap/axiom/support/AxiomUtils.java index c8df77a2..28bd3523 100644 --- a/spring-ws-core/src/main/java/org/springframework/ws/soap/axiom/support/AxiomUtils.java +++ b/spring-ws-core/src/main/java/org/springframework/ws/soap/axiom/support/AxiomUtils.java @@ -29,6 +29,7 @@ import org.apache.axiom.om.OMContainer; import org.apache.axiom.om.OMElement; import org.apache.axiom.om.OMException; import org.apache.axiom.om.OMNamespace; +import org.apache.axiom.om.OMOutputFormat; import org.apache.axiom.om.OMXMLBuilderFactory; import org.apache.axiom.soap.SOAPEnvelope; import org.w3c.dom.Document; @@ -50,6 +51,8 @@ import org.springframework.xml.DocumentBuilderFactoryUtils; @SuppressWarnings("Since15") public abstract class AxiomUtils { + private static final OMOutputFormat DEFAULT_OUTPUT_FORMAT = new OMOutputFormat(); + /** * Converts a {@code javax.xml.namespace.QName} to a * {@code org.apache.axiom.om.OMNamespace}. A {@code OMElement} is used to resolve the @@ -116,7 +119,7 @@ public abstract class AxiomUtils { else { ByteArrayOutputStream bos = new ByteArrayOutputStream(); envelope.build(); - envelope.serialize(bos); + envelope.serialize(bos, DEFAULT_OUTPUT_FORMAT, true); ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray()); DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactoryUtils.newInstance(); diff --git a/spring-ws-core/src/test/java/org/springframework/ws/client/core/WebServiceTemplateTests.java b/spring-ws-core/src/test/java/org/springframework/ws/client/core/WebServiceTemplateTests.java index 74889ffb..c1c17f00 100644 --- a/spring-ws-core/src/test/java/org/springframework/ws/client/core/WebServiceTemplateTests.java +++ b/spring-ws-core/src/test/java/org/springframework/ws/client/core/WebServiceTemplateTests.java @@ -118,7 +118,7 @@ public class WebServiceTemplateTests { WebServiceMessageCallback requestCallback = mock(WebServiceMessageCallback.class); requestCallback.doWithMessage(isA(WebServiceMessage.class)); - WebServiceMessageExtractor extractorMock = mock(WebServiceMessageExtractor.class); + WebServiceMessageExtractor extractorMock = mockWebServiceMessageExtractor(); Object extracted = new Object(); when(extractorMock.extractData(isA(WebServiceMessage.class))).thenReturn(extracted); @@ -136,7 +136,7 @@ public class WebServiceTemplateTests { @Test public void testSendAndReceiveMessageNoResponse() throws Exception { - WebServiceMessageExtractor extractorMock = mock(WebServiceMessageExtractor.class); + WebServiceMessageExtractor extractorMock = mock(WebServiceMessageExtractor.class); this.connectionMock.send(isA(WebServiceMessage.class)); when(this.connectionMock.hasError()).thenReturn(false); @@ -151,7 +151,7 @@ public class WebServiceTemplateTests { @Test public void testSendAndReceiveMessageFault() throws Exception { - WebServiceMessageExtractor extractorMock = mock(WebServiceMessageExtractor.class); + WebServiceMessageExtractor extractorMock = mockWebServiceMessageExtractor(); FaultMessageResolver faultMessageResolverMock = mock(FaultMessageResolver.class); this.template.setFaultMessageResolver(faultMessageResolverMock); @@ -174,7 +174,7 @@ public class WebServiceTemplateTests { @Test public void testSendAndReceiveConnectionError() throws Exception { - WebServiceMessageExtractor extractorMock = mock(WebServiceMessageExtractor.class); + WebServiceMessageExtractor extractorMock = mockWebServiceMessageExtractor(); this.template.setFaultMessageResolver(null); @@ -193,7 +193,7 @@ public class WebServiceTemplateTests { @Test public void testSendAndReceiveSourceResponse() throws Exception { - SourceExtractor extractorMock = mock(SourceExtractor.class); + SourceExtractor extractorMock = mockSourceExtractor(); Object extracted = new Object(); when(extractorMock.extractData(isA(Source.class))).thenReturn(extracted); @@ -211,7 +211,7 @@ public class WebServiceTemplateTests { @Test public void testSendAndReceiveSourceNoResponse() throws Exception { - SourceExtractor extractorMock = mock(SourceExtractor.class); + SourceExtractor extractorMock = mockSourceExtractor(); this.connectionMock.send(isA(WebServiceMessage.class)); when(this.connectionMock.hasError()).thenReturn(false); @@ -330,7 +330,7 @@ public class WebServiceTemplateTests { WebServiceMessageCallback requestCallback = mock(WebServiceMessageCallback.class); requestCallback.doWithMessage(isA(WebServiceMessage.class)); - WebServiceMessageExtractor extractorMock = mock(WebServiceMessageExtractor.class); + WebServiceMessageExtractor extractorMock = mockWebServiceMessageExtractor(); Object extracted = new Object(); when(extractorMock.extractData(isA(WebServiceMessage.class))).thenReturn(extracted); @@ -361,7 +361,7 @@ public class WebServiceTemplateTests { WebServiceMessageCallback requestCallback = mock(WebServiceMessageCallback.class); requestCallback.doWithMessage(isA(WebServiceMessage.class)); - WebServiceMessageExtractor extractorMock = mock(WebServiceMessageExtractor.class); + WebServiceMessageExtractor extractorMock = mockWebServiceMessageExtractor(); Object extracted = new Object(); when(extractorMock.extractData(isA(WebServiceMessage.class))).thenReturn(extracted); @@ -390,7 +390,7 @@ public class WebServiceTemplateTests { WebServiceMessageCallback requestCallback = mock(WebServiceMessageCallback.class); requestCallback.doWithMessage(messageContext.getRequest()); - WebServiceMessageExtractor extractorMock = mock(WebServiceMessageExtractor.class); + WebServiceMessageExtractor extractorMock = mockWebServiceMessageExtractor(); Object result = this.template.doSendAndReceive(messageContext, this.connectionMock, requestCallback, extractorMock); @@ -415,7 +415,7 @@ public class WebServiceTemplateTests { WebServiceMessageCallback requestCallback = mock(WebServiceMessageCallback.class); requestCallback.doWithMessage(messageContext.getRequest()); - WebServiceMessageExtractor extractorMock = mock(WebServiceMessageExtractor.class); + WebServiceMessageExtractor extractorMock = mockWebServiceMessageExtractor(); Object extracted = new Object(); when(extractorMock.extractData(messageContext.getResponse())).thenReturn(extracted); @@ -585,7 +585,7 @@ public class WebServiceTemplateTests { } }); - WebServiceMessageExtractor extractorMock = mock(WebServiceMessageExtractor.class); + WebServiceMessageExtractor extractorMock = mockWebServiceMessageExtractor(); reset(this.connectionMock); @@ -600,6 +600,14 @@ public class WebServiceTemplateTests { assertThat(result).isNull(); } + private static WebServiceMessageExtractor mockWebServiceMessageExtractor() { + return mock(WebServiceMessageExtractor.class); + } + + private static SourceExtractor mockSourceExtractor() { + return mock(SourceExtractor.class); + } + private static class NoOpClientInterceptor implements ClientInterceptor, AssertProvider { diff --git a/spring-ws-core/src/test/java/org/springframework/ws/soap/axiom/NonCachingPayloadTests.java b/spring-ws-core/src/test/java/org/springframework/ws/soap/axiom/NonCachingPayloadTests.java index 141a2ee4..1875dc0a 100644 --- a/spring-ws-core/src/test/java/org/springframework/ws/soap/axiom/NonCachingPayloadTests.java +++ b/spring-ws-core/src/test/java/org/springframework/ws/soap/axiom/NonCachingPayloadTests.java @@ -61,7 +61,7 @@ public class NonCachingPayloadTests { streamWriter.flush(); StringWriter writer = new StringWriter(); - this.body.serialize(writer); + this.body.serialize(writer, true); String expected = "" + "" + "text" @@ -85,7 +85,7 @@ public class NonCachingPayloadTests { streamWriter.flush(); StringWriter writer = new StringWriter(); - this.body.serialize(writer); + this.body.serialize(writer, true); String expected = "" + "" + "text" @@ -107,7 +107,7 @@ public class NonCachingPayloadTests { streamWriter.flush(); StringWriter writer = new StringWriter(); - this.body.serialize(writer); + this.body.serialize(writer, true); String expected = "" + "" + "" + ""; diff --git a/spring-ws-core/src/test/java/org/springframework/ws/soap/axiom/support/AxiomUtilsTests.java b/spring-ws-core/src/test/java/org/springframework/ws/soap/axiom/support/AxiomUtilsTests.java index 6ecc9c30..4a838fb1 100644 --- a/spring-ws-core/src/test/java/org/springframework/ws/soap/axiom/support/AxiomUtilsTests.java +++ b/spring-ws-core/src/test/java/org/springframework/ws/soap/axiom/support/AxiomUtilsTests.java @@ -147,7 +147,7 @@ public class AxiomUtilsTests { SOAPEnvelope envelope = AxiomUtils.toEnvelope(document); StringWriter writer = new StringWriter(); - envelope.serialize(writer); + envelope.serialize(writer, true); String result = writer.toString(); XmlAssert.assertThat(result).and(expected).ignoreWhitespace().areIdentical(); diff --git a/spring-ws-core/src/test/java/org/springframework/ws/wsdl/wsdl11/provider/InliningXsdSchemaTypesProviderTests.java b/spring-ws-core/src/test/java/org/springframework/ws/wsdl/wsdl11/provider/InliningXsdSchemaTypesProviderTests.java index cda3a074..f51956aa 100644 --- a/spring-ws-core/src/test/java/org/springframework/ws/wsdl/wsdl11/provider/InliningXsdSchemaTypesProviderTests.java +++ b/spring-ws-core/src/test/java/org/springframework/ws/wsdl/wsdl11/provider/InliningXsdSchemaTypesProviderTests.java @@ -16,6 +16,8 @@ package org.springframework.ws.wsdl.wsdl11.provider; +import java.util.List; + import javax.wsdl.Definition; import javax.wsdl.Types; import javax.wsdl.extensions.schema.Schema; @@ -65,9 +67,9 @@ public class InliningXsdSchemaTypesProviderTests { Types types = this.definition.getTypes(); assertThat(types).isNotNull(); - assertThat(types.getExtensibilityElements()).hasSize(1); + assertThat(getExtensibilityElements(types)).hasSize(1); - Schema wsdlSchema = (Schema) types.getExtensibilityElements().get(0); + Schema wsdlSchema = (Schema) getExtensibilityElements(types).get(0); assertThat(wsdlSchema.getElement()).isNotNull(); } @@ -93,15 +95,19 @@ public class InliningXsdSchemaTypesProviderTests { Types types = this.definition.getTypes(); assertThat(types).isNotNull(); - assertThat(types.getExtensibilityElements()).hasSize(2); + assertThat(getExtensibilityElements(types)).hasSize(2); - Schema wsdlSchema = (Schema) types.getExtensibilityElements().get(0); + Schema wsdlSchema = (Schema) getExtensibilityElements(types).get(0); assertThat(wsdlSchema.getElement()).isNotNull(); - wsdlSchema = (Schema) types.getExtensibilityElements().get(1); + wsdlSchema = (Schema) getExtensibilityElements(types).get(1); assertThat(wsdlSchema.getElement()).isNotNull(); } + private static List getExtensibilityElements(Types types) { + return types.getExtensibilityElements(); + } + } diff --git a/spring-ws-platform/build.gradle b/spring-ws-platform/build.gradle index 624feba3..1bbefb3c 100644 --- a/spring-ws-platform/build.gradle +++ b/spring-ws-platform/build.gradle @@ -17,6 +17,7 @@ dependencies { api(platform("org.springframework.security:spring-security-bom:6.5.0-SNAPSHOT")) constraints { api("com.fasterxml.woodstox:woodstox-core:6.5.1") + api("com.google.code.findbugs:jsr305:3.0.2") api("com.icegreen:greenmail:2.0.1") api("com.icegreen:greenmail-junit5:2.0.1") api("com.icegreen:greenmail-spring:2.0.1") @@ -42,6 +43,7 @@ dependencies { api("org.apache.ws.commons.axiom:axiom-impl:2.0.0") api("org.apache.ws.commons.axiom:axiom-legacy-attachments:2.0.0") api("org.apache.ws.xmlschema:xmlschema-core:2.3.1") + api("org.apiguardian:apiguardian-api:1.1.2") api("org.aspectj:aspectjrt:1.9.22") api("org.aspectj:aspectjweaver:1.9.22") api("org.assertj:assertj-core:3.25.3")