Merge branch '4.0.x'

Closes gh-1538
This commit is contained in:
Stéphane Nicoll
2025-04-19 11:56:44 +02:00
11 changed files with 74 additions and 53 deletions

View File

@@ -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"));

View File

@@ -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<String> 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");
}

View File

@@ -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 {

View File

@@ -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(',');

View File

@@ -75,6 +75,7 @@ class NonCachingPayload extends AbstractPayload {
private boolean payloadAdded = false;
@SuppressWarnings("deprecation")
private DelegatingStreamWriter() {
try {
this.delegate = StAXUtils.createXMLStreamWriter(this.baos);

View File

@@ -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();

View File

@@ -118,7 +118,7 @@ public class WebServiceTemplateTests {
WebServiceMessageCallback requestCallback = mock(WebServiceMessageCallback.class);
requestCallback.doWithMessage(isA(WebServiceMessage.class));
WebServiceMessageExtractor extractorMock = mock(WebServiceMessageExtractor.class);
WebServiceMessageExtractor<Object> 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<Object> 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<Object> 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<Object> 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<Object> 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<Object> 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<Object> 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<Object> 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<Object> 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<Object> extractorMock = mockWebServiceMessageExtractor();
reset(this.connectionMock);
@@ -600,6 +600,14 @@ public class WebServiceTemplateTests {
assertThat(result).isNull();
}
private static WebServiceMessageExtractor<Object> mockWebServiceMessageExtractor() {
return mock(WebServiceMessageExtractor.class);
}
private static SourceExtractor<Object> mockSourceExtractor() {
return mock(SourceExtractor.class);
}
private static class NoOpClientInterceptor
implements ClientInterceptor, AssertProvider<NoOpClientInterceptorAssert> {

View File

@@ -61,7 +61,7 @@ public class NonCachingPayloadTests {
streamWriter.flush();
StringWriter writer = new StringWriter();
this.body.serialize(writer);
this.body.serialize(writer, true);
String expected = "<soapenv:Body xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/'>"
+ "<root xmlns='http://springframework.org/spring-ws'>" + "<child>text</child>"
@@ -85,7 +85,7 @@ public class NonCachingPayloadTests {
streamWriter.flush();
StringWriter writer = new StringWriter();
this.body.serialize(writer);
this.body.serialize(writer, true);
String expected = "<soapenv:Body xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/'>"
+ "<root xmlns='http://springframework.org/spring-ws'>" + "<child>text</child>"
@@ -107,7 +107,7 @@ public class NonCachingPayloadTests {
streamWriter.flush();
StringWriter writer = new StringWriter();
this.body.serialize(writer);
this.body.serialize(writer, true);
String expected = "<soapenv:Body xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/'>"
+ "<root xmlns='http://springframework.org/spring-ws'>" + "<child />" + "</root></soapenv:Body>";

View File

@@ -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();

View File

@@ -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();
}
}

View File

@@ -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")