Merge branch '4.0.x'
Closes gh-1517
This commit is contained in:
@@ -112,6 +112,26 @@ public abstract class AbstractEndpointMapping extends ApplicationObjectSupport i
|
||||
*/
|
||||
@Override
|
||||
public final EndpointInvocationChain getEndpoint(MessageContext messageContext) throws Exception {
|
||||
Object endpoint = resoleEndpoint(messageContext);
|
||||
if (endpoint == null) {
|
||||
return null;
|
||||
}
|
||||
List<EndpointInterceptor> interceptors = new ArrayList<>();
|
||||
if (this.interceptors != null) {
|
||||
interceptors.addAll(Arrays.stream(this.interceptors)
|
||||
.filter(interceptor -> shouldIntercept(interceptor, messageContext, endpoint))
|
||||
.toList());
|
||||
}
|
||||
if (this.smartInterceptors != null) {
|
||||
interceptors.addAll(Arrays.stream(this.smartInterceptors)
|
||||
.filter(interceptor -> shouldIntercept(interceptor, messageContext, endpoint))
|
||||
.toList());
|
||||
}
|
||||
return createEndpointInvocationChain(messageContext, endpoint,
|
||||
interceptors.toArray(new EndpointInterceptor[0]));
|
||||
}
|
||||
|
||||
private Object resoleEndpoint(MessageContext messageContext) throws Exception {
|
||||
Object endpoint = getEndpointInternal(messageContext);
|
||||
if (endpoint == null) {
|
||||
endpoint = this.defaultEndpoint;
|
||||
@@ -125,22 +145,14 @@ public abstract class AbstractEndpointMapping extends ApplicationObjectSupport i
|
||||
return null;
|
||||
}
|
||||
}
|
||||
return endpoint;
|
||||
}
|
||||
|
||||
List<EndpointInterceptor> interceptors = new ArrayList<>();
|
||||
if (this.interceptors != null) {
|
||||
interceptors.addAll(Arrays.asList(this.interceptors));
|
||||
private boolean shouldIntercept(EndpointInterceptor interceptor, MessageContext messageContext, Object endpoint) {
|
||||
if (interceptor instanceof SmartEndpointInterceptor smartEndpointInterceptor) {
|
||||
return smartEndpointInterceptor.shouldIntercept(messageContext, endpoint);
|
||||
}
|
||||
|
||||
if (this.smartInterceptors != null) {
|
||||
for (SmartEndpointInterceptor smartInterceptor : this.smartInterceptors) {
|
||||
if (smartInterceptor.shouldIntercept(messageContext, endpoint)) {
|
||||
interceptors.add(smartInterceptor);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return createEndpointInvocationChain(messageContext, endpoint,
|
||||
interceptors.toArray(new EndpointInterceptor[0]));
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -25,10 +25,14 @@ import org.springframework.ws.context.DefaultMessageContext;
|
||||
import org.springframework.ws.context.MessageContext;
|
||||
import org.springframework.ws.server.EndpointInterceptor;
|
||||
import org.springframework.ws.server.EndpointInvocationChain;
|
||||
import org.springframework.ws.server.SmartEndpointInterceptor;
|
||||
import org.springframework.ws.server.endpoint.interceptor.DelegatingSmartEndpointInterceptor;
|
||||
import org.springframework.ws.server.endpoint.interceptor.EndpointInterceptorAdapter;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.mockito.BDDMockito.given;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.verify;
|
||||
|
||||
/**
|
||||
* Test case for {@link AbstractEndpointMapping}.
|
||||
@@ -124,6 +128,55 @@ public class EndpointMappingTest {
|
||||
assertThat(result.getInterceptors()[1]).isInstanceOf(MySmartEndpointInterceptor.class);
|
||||
}
|
||||
|
||||
@Test
|
||||
void smartEndpointInterceptorAddedOnlyIfNecessary() throws Exception {
|
||||
StaticApplicationContext applicationContext = new StaticApplicationContext();
|
||||
Object endpoint = new Object();
|
||||
SmartEndpointInterceptor firstInterceptor = mock(SmartEndpointInterceptor.class);
|
||||
given(firstInterceptor.shouldIntercept(this.messageContext, endpoint)).willReturn(false);
|
||||
applicationContext.registerBean("first", SmartEndpointInterceptor.class, () -> firstInterceptor);
|
||||
SmartEndpointInterceptor secondInterceptor = mock(SmartEndpointInterceptor.class);
|
||||
given(secondInterceptor.shouldIntercept(this.messageContext, endpoint)).willReturn(true);
|
||||
applicationContext.registerBean("second", SmartEndpointInterceptor.class, () -> secondInterceptor);
|
||||
|
||||
AbstractEndpointMapping mapping = new AbstractEndpointMapping() {
|
||||
@Override
|
||||
protected Object getEndpointInternal(MessageContext givenRequest) {
|
||||
assertThat(givenRequest).isEqualTo(EndpointMappingTest.this.messageContext);
|
||||
return endpoint;
|
||||
}
|
||||
};
|
||||
mapping.setApplicationContext(applicationContext);
|
||||
EndpointInvocationChain result = mapping.getEndpoint(this.messageContext);
|
||||
assertThat(result).isNotNull();
|
||||
assertThat(result.getInterceptors()).singleElement().isSameAs(secondInterceptor);
|
||||
verify(firstInterceptor).shouldIntercept(this.messageContext, endpoint);
|
||||
verify(secondInterceptor).shouldIntercept(this.messageContext, endpoint);
|
||||
}
|
||||
|
||||
@Test
|
||||
void smartEndpointInterceptorSetAsInterceptorAreHandled() throws Exception {
|
||||
Object endpoint = new Object();
|
||||
SmartEndpointInterceptor firstInterceptor = mock(SmartEndpointInterceptor.class);
|
||||
given(firstInterceptor.shouldIntercept(this.messageContext, endpoint)).willReturn(false);
|
||||
SmartEndpointInterceptor secondInterceptor = mock(SmartEndpointInterceptor.class);
|
||||
given(secondInterceptor.shouldIntercept(this.messageContext, endpoint)).willReturn(true);
|
||||
|
||||
AbstractEndpointMapping mapping = new AbstractEndpointMapping() {
|
||||
@Override
|
||||
protected Object getEndpointInternal(MessageContext givenRequest) {
|
||||
assertThat(givenRequest).isEqualTo(EndpointMappingTest.this.messageContext);
|
||||
return endpoint;
|
||||
}
|
||||
};
|
||||
mapping.setInterceptors(new EndpointInterceptor[] { firstInterceptor, secondInterceptor });
|
||||
EndpointInvocationChain result = mapping.getEndpoint(this.messageContext);
|
||||
assertThat(result).isNotNull();
|
||||
assertThat(result.getInterceptors()).singleElement().isSameAs(secondInterceptor);
|
||||
verify(firstInterceptor).shouldIntercept(this.messageContext, endpoint);
|
||||
verify(secondInterceptor).shouldIntercept(this.messageContext, endpoint);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void endpointBeanName() throws Exception {
|
||||
|
||||
|
||||
Reference in New Issue
Block a user