diff --git a/spring-integration-core/src/main/java/org/springframework/integration/aop/MessagePublishingInterceptor.java b/spring-integration-core/src/main/java/org/springframework/integration/aop/MessagePublishingInterceptor.java
index 75c719a037..172d90ee23 100644
--- a/spring-integration-core/src/main/java/org/springframework/integration/aop/MessagePublishingInterceptor.java
+++ b/spring-integration-core/src/main/java/org/springframework/integration/aop/MessagePublishingInterceptor.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2002-2016 the original author or authors.
+ * Copyright 2002-2018 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -29,13 +29,10 @@ import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.core.LocalVariableTableParameterNameDiscoverer;
import org.springframework.core.ParameterNameDiscoverer;
-import org.springframework.expression.EvaluationException;
import org.springframework.expression.Expression;
-import org.springframework.expression.ExpressionParser;
-import org.springframework.expression.ParseException;
-import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;
import org.springframework.integration.core.MessagingTemplate;
+import org.springframework.integration.expression.ExpressionEvalMap;
import org.springframework.integration.expression.ExpressionUtils;
import org.springframework.integration.support.AbstractIntegrationMessageBuilder;
import org.springframework.integration.support.DefaultMessageBuilderFactory;
@@ -45,7 +42,6 @@ import org.springframework.messaging.Message;
import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.core.DestinationResolver;
import org.springframework.util.Assert;
-import org.springframework.util.StringUtils;
/**
* A {@link MethodInterceptor} that publishes Messages to a channel. The
@@ -56,14 +52,13 @@ import org.springframework.util.StringUtils;
* @author Mark Fisher
* @author Artem Bilan
* @author Gary Russell
+ *
* @since 2.0
*/
public class MessagePublishingInterceptor implements MethodInterceptor, BeanFactoryAware {
private final MessagingTemplate messagingTemplate = new MessagingTemplate();
- private final ExpressionParser parser = new SpelExpressionParser();
-
private volatile PublisherMetadataSource metadataSource;
private volatile DestinationResolver channelResolver;
@@ -119,14 +114,13 @@ public class MessagePublishingInterceptor implements MethodInterceptor, BeanFact
@Override
public final Object invoke(final MethodInvocation invocation) throws Throwable {
- Assert.notNull(this.metadataSource, "PublisherMetadataSource is required.");
final StandardEvaluationContext context = ExpressionUtils.createStandardEvaluationContext(this.beanFactory);
Class> targetClass = AopUtils.getTargetClass(invocation.getThis());
final Method method = AopUtils.getMostSpecificMethod(invocation.getMethod(), targetClass);
String[] argumentNames = this.resolveArgumentNames(method);
context.setVariable(PublisherMetadataSource.METHOD_NAME_VARIABLE_NAME, method.getName());
if (invocation.getArguments().length > 0 && argumentNames != null) {
- Map
*
* @author Artem Bilan
+ *
* @since 3.0
*/
public final class ExpressionEvalMap extends AbstractMap {
- public static final EvaluationCallback SIMPLE_CALLBACK = expression -> expression.getValue();
+ public static final EvaluationCallback SIMPLE_CALLBACK = Expression::getValue;
private final Map original;
@@ -100,9 +102,20 @@ public final class ExpressionEvalMap extends AbstractMap {
return null;
}
+ @Override
+ public Set> entrySet() {
+ return this.original.entrySet()
+ .stream()
+ .map(e -> new SimpleImmutableEntry<>(e.getKey(), get(e.getKey())))
+ .collect(Collectors.toSet());
+ }
+
@Override
public Collection values() {
- throw new UnsupportedOperationException();
+ return this.original.values()
+ .stream()
+ .map(this::get)
+ .collect(Collectors.toList());
}
@Override
@@ -136,8 +149,8 @@ public final class ExpressionEvalMap extends AbstractMap {
}
@Override
- public Set> entrySet() {
- throw new UnsupportedOperationException();
+ public String toString() {
+ return this.original.toString();
}
@Override
@@ -165,10 +178,6 @@ public final class ExpressionEvalMap extends AbstractMap {
throw new UnsupportedOperationException();
}
- @Override
- public String toString() {
- return this.original.toString();
- }
public static ExpressionEvalMapBuilder from(Map expressions) {
Assert.notNull(expressions, "'expressions' must not be null.");
diff --git a/spring-integration-core/src/test/java/org/springframework/integration/aop/MessagePublishingInterceptorTests.java b/spring-integration-core/src/test/java/org/springframework/integration/aop/MessagePublishingInterceptorTests.java
index 7ec4b95650..4fff07bd91 100644
--- a/spring-integration-core/src/test/java/org/springframework/integration/aop/MessagePublishingInterceptorTests.java
+++ b/spring-integration-core/src/test/java/org/springframework/integration/aop/MessagePublishingInterceptorTests.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2002-2016 the original author or authors.
+ * Copyright 2002-2018 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -28,6 +28,7 @@ import org.junit.Test;
import org.springframework.aop.framework.ProxyFactory;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
+import org.springframework.expression.Expression;
import org.springframework.integration.channel.QueueChannel;
import org.springframework.integration.support.channel.BeanFactoryChannelResolver;
import org.springframework.messaging.Message;
@@ -37,6 +38,8 @@ import org.springframework.messaging.core.DestinationResolver;
/**
* @author Mark Fisher
* @author Oleg Zhurakousky
+ * @author Artem Bilan
+ *
* @since 2.0
*/
public class MessagePublishingInterceptorTests {
@@ -124,19 +127,33 @@ public class MessagePublishingInterceptorTests {
}
@Override
+ @Deprecated
public String getPayloadExpression(Method method) {
- return "'test-' + #return";
+ return getExpressionForPayload(method)
+ .getExpressionString();
}
@Override
+ public Expression getExpressionForPayload(Method method) {
+ return EXPRESSION_PARSER.parseExpression("'test-' + #return");
+ }
+
+ @Override
+ @Deprecated
public Map getHeaderExpressions(Method method) {
return null;
}
+ @Override
+ public Map getExpressionsForHeaders(Method method) {
+ return null;
+ }
+
@Override
public String getChannelName(Method method) {
return "c";
}
+
}
}
diff --git a/spring-integration-core/src/test/java/org/springframework/integration/aop/MethodAnnotationPublisherMetadataSourceTests.java b/spring-integration-core/src/test/java/org/springframework/integration/aop/MethodAnnotationPublisherMetadataSourceTests.java
index 43b4756710..858392fa84 100644
--- a/spring-integration-core/src/test/java/org/springframework/integration/aop/MethodAnnotationPublisherMetadataSourceTests.java
+++ b/spring-integration-core/src/test/java/org/springframework/integration/aop/MethodAnnotationPublisherMetadataSourceTests.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2002-2016 the original author or authors.
+ * Copyright 2002-2018 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -27,12 +27,15 @@ import java.util.Map;
import org.junit.Test;
import org.springframework.core.annotation.AliasFor;
+import org.springframework.expression.Expression;
import org.springframework.integration.annotation.Publisher;
import org.springframework.messaging.handler.annotation.Header;
import org.springframework.messaging.handler.annotation.Payload;
/**
* @author Mark Fisher
+ * @author Artem Bilan
+ *
* @since 2.0
*/
public class MethodAnnotationPublisherMetadataSourceTests {
@@ -44,26 +47,26 @@ public class MethodAnnotationPublisherMetadataSourceTests {
public void channelNameAndExplicitReturnValuePayload() {
Method method = getMethod("methodWithChannelAndExplicitReturnAsPayload");
String channelName = source.getChannelName(method);
- String payloadExpression = source.getPayloadExpression(method);
+ Expression payloadExpression = source.getExpressionForPayload(method);
assertEquals("foo", channelName);
- assertEquals("#return", payloadExpression);
+ assertEquals("#return", payloadExpression.getExpressionString());
}
@Test
public void channelNameAndEmptyPayloadAnnotation() {
Method method = getMethod("methodWithChannelAndEmptyPayloadAnnotation");
String channelName = source.getChannelName(method);
- String payloadExpression = source.getPayloadExpression(method);
+ Expression payloadExpression = source.getExpressionForPayload(method);
assertEquals("foo", channelName);
- assertEquals("#return", payloadExpression);
+ assertEquals("#return", payloadExpression.getExpressionString());
}
@Test
public void payloadButNoHeaders() {
Method method = getMethod("methodWithPayloadAnnotation", String.class, int.class);
- String expressionString = source.getPayloadExpression(method);
+ String expressionString = source.getExpressionForPayload(method).getExpressionString();
assertEquals("testExpression1", expressionString);
- Map headerMap = source.getHeaderExpressions(method);
+ Map headerMap = source.getExpressionsForHeaders(method);
assertNotNull(headerMap);
assertEquals(0, headerMap.size());
}
@@ -71,20 +74,20 @@ public class MethodAnnotationPublisherMetadataSourceTests {
@Test
public void payloadAndHeaders() {
Method method = getMethod("methodWithHeaderAnnotations", String.class, String.class, String.class);
- String expressionString = source.getPayloadExpression(method);
+ String expressionString = source.getExpressionForPayload(method).getExpressionString();
assertEquals("testExpression2", expressionString);
- Map headerMap = source.getHeaderExpressions(method);
+ Map headerMap = source.getExpressionsForHeaders(method);
assertNotNull(headerMap);
assertEquals(2, headerMap.size());
- assertEquals("#args[1]", headerMap.get("foo"));
- assertEquals("#args[2]", headerMap.get("bar"));
+ assertEquals("#args[1]", headerMap.get("foo").getExpressionString());
+ assertEquals("#args[2]", headerMap.get("bar").getExpressionString());
}
@Test
public void voidReturnWithValidPayloadExpression() {
Method method = getMethod("methodWithVoidReturnAndMethodNameAsPayload");
String channelName = source.getChannelName(method);
- String payloadExpression = source.getPayloadExpression(method);
+ String payloadExpression = source.getExpressionForPayload(method).getExpressionString();
assertEquals("foo", channelName);
assertEquals("#method", payloadExpression);
}
@@ -92,20 +95,20 @@ public class MethodAnnotationPublisherMetadataSourceTests {
@Test(expected = IllegalArgumentException.class)
public void voidReturnWithInvalidPayloadExpression() {
Method method = getMethod("methodWithVoidReturnAndReturnValueAsPayload");
- source.getPayloadExpression(method);
+ source.getExpressionForPayload(method);
}
@Test
public void voidReturnAndParameterPayloadAnnotation() {
Method method = getMethod("methodWithVoidReturnAndParameterPayloadAnnotation", String.class);
- String payloadExpression = source.getPayloadExpression(method);
+ String payloadExpression = source.getExpressionForPayload(method).getExpressionString();
assertEquals("#args[0]", payloadExpression);
}
@Test(expected = IllegalArgumentException.class)
public void voidReturnAndNoPayloadAnnotation() {
Method method = getMethod("methodWithVoidReturnAndNoPayloadAnnotation", String.class);
- source.getPayloadExpression(method);
+ source.getExpressionForPayload(method);
}
@Test
@@ -184,8 +187,10 @@ public class MethodAnnotationPublisherMetadataSourceTests {
@Publisher
@Retention(RetentionPolicy.RUNTIME)
public @interface CustomPublisher {
+
@AliasFor(annotation = Publisher.class, attribute = "channel")
String custom();
+
}
@CustomPublisher(custom = "foo")
@@ -194,8 +199,10 @@ public class MethodAnnotationPublisherMetadataSourceTests {
@CustomPublisher(custom = "bar")
public class TestClass {
+
public void methodWithAnnotationOnTheDeclaringClass() {
}
+
}
}