From 9754d59f62f78a92ab0ac6208c38a75235028dd0 Mon Sep 17 00:00:00 2001 From: Artem Bilan Date: Mon, 7 Apr 2014 19:19:49 +0300 Subject: [PATCH] INT-3358: Make `MutableMessage` package protected JIRA: https://jira.spring.io/browse/INT-3358 --- .../{message => support}/MutableMessage.java | 8 ++-- .../support/MutableMessageBuilder.java | 1 - .../configuration/EnableIntegrationTests.java | 5 +-- .../expression/ParentContextTests.java | 6 +-- .../message/MessageBuilderAtConfigTests.java | 5 +-- .../message/MessageBuilderTests.java | 4 +- .../mongodb/store/MongoDbMessageStore.java | 39 +++++++++++++++---- .../AbstractMongoDbMessageStoreTests.java | 6 +-- .../store/RedisChannelMessageStoreTests.java | 14 +++---- 9 files changed, 53 insertions(+), 35 deletions(-) rename spring-integration-core/src/main/java/org/springframework/integration/{message => support}/MutableMessage.java (94%) diff --git a/spring-integration-core/src/main/java/org/springframework/integration/message/MutableMessage.java b/spring-integration-core/src/main/java/org/springframework/integration/support/MutableMessage.java similarity index 94% rename from spring-integration-core/src/main/java/org/springframework/integration/message/MutableMessage.java rename to spring-integration-core/src/main/java/org/springframework/integration/support/MutableMessage.java index a9ec6fcc9d..e6af32ab84 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/message/MutableMessage.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/support/MutableMessage.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.integration.message; +package org.springframework.integration.support; import java.io.Serializable; import java.util.Map; @@ -39,7 +39,7 @@ import org.springframework.util.ObjectUtils; * @since 4.0 * */ -public class MutableMessage implements Message, Serializable { +class MutableMessage implements Message, Serializable { private static final long serialVersionUID = -636635024258737500L; @@ -49,12 +49,12 @@ public class MutableMessage implements Message, Serializable { private final Map rawHeaders; - public MutableMessage(T payload) { + MutableMessage(T payload) { this(payload, null); } @SuppressWarnings("unchecked") - public MutableMessage(T payload, Map headers) { + MutableMessage(T payload, Map headers) { Assert.notNull(payload, "payload must not be null"); this.headers = new MessageHeaders(headers); this.payload = payload; diff --git a/spring-integration-core/src/main/java/org/springframework/integration/support/MutableMessageBuilder.java b/spring-integration-core/src/main/java/org/springframework/integration/support/MutableMessageBuilder.java index e15dd77120..66c2a57ae5 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/support/MutableMessageBuilder.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/support/MutableMessageBuilder.java @@ -21,7 +21,6 @@ import java.util.Map; import java.util.Map.Entry; import org.springframework.integration.IntegrationMessageHeaderAccessor; -import org.springframework.integration.message.MutableMessage; import org.springframework.messaging.Message; import org.springframework.util.Assert; import org.springframework.util.PatternMatchUtils; diff --git a/spring-integration-core/src/test/java/org/springframework/integration/configuration/EnableIntegrationTests.java b/spring-integration-core/src/test/java/org/springframework/integration/configuration/EnableIntegrationTests.java index 728d4920c0..fe400f0af2 100644 --- a/spring-integration-core/src/test/java/org/springframework/integration/configuration/EnableIntegrationTests.java +++ b/spring-integration-core/src/test/java/org/springframework/integration/configuration/EnableIntegrationTests.java @@ -55,7 +55,6 @@ import org.springframework.integration.annotation.ServiceActivator; import org.springframework.integration.annotation.Transformer; import org.springframework.integration.channel.AbstractMessageChannel; import org.springframework.integration.channel.DirectChannel; -import org.springframework.integration.channel.FixedSubscriberChannel; import org.springframework.integration.channel.NullChannel; import org.springframework.integration.channel.QueueChannel; import org.springframework.integration.channel.interceptor.WireTap; @@ -66,8 +65,8 @@ import org.springframework.integration.config.GlobalChannelInterceptor; import org.springframework.integration.config.IntegrationConverter; import org.springframework.integration.history.MessageHistory; import org.springframework.integration.history.MessageHistoryConfigurer; -import org.springframework.integration.message.MutableMessage; import org.springframework.integration.support.MessageBuilder; +import org.springframework.integration.support.MutableMessageBuilder; import org.springframework.integration.test.util.TestUtils; import org.springframework.messaging.Message; import org.springframework.messaging.MessageChannel; @@ -214,7 +213,7 @@ public class EnableIntegrationTests { assertThat(this.testConverter.getInvoked(), Matchers.greaterThan(0)); assertTrue(this.bytesChannel.send(new GenericMessage("foo".getBytes()))); - assertTrue(this.bytesChannel.send(new GenericMessage>(new MutableMessage("")))); + assertTrue(this.bytesChannel.send(new GenericMessage>(MutableMessageBuilder.withPayload("").build()))); } diff --git a/spring-integration-core/src/test/java/org/springframework/integration/expression/ParentContextTests.java b/spring-integration-core/src/test/java/org/springframework/integration/expression/ParentContextTests.java index 71cdecc66d..8926bb05af 100644 --- a/spring-integration-core/src/test/java/org/springframework/integration/expression/ParentContextTests.java +++ b/spring-integration-core/src/test/java/org/springframework/integration/expression/ParentContextTests.java @@ -42,7 +42,7 @@ import org.springframework.integration.channel.QueueChannel; import org.springframework.integration.config.IntegrationEvaluationContextFactoryBean; import org.springframework.integration.context.IntegrationContextUtils; import org.springframework.integration.json.JsonPathUtils; -import org.springframework.integration.message.MutableMessage; +import org.springframework.integration.support.MutableMessageBuilder; import org.springframework.integration.test.util.TestUtils; import org.springframework.messaging.Message; import org.springframework.messaging.MessageChannel; @@ -138,7 +138,7 @@ public class ParentContextTests { Message out = child.getBean("output", QueueChannel.class).receive(0); assertNotNull(out); assertEquals("foobar", out.getPayload()); - child.getBean("parentIn", MessageChannel.class).send(new MutableMessage("bar")); + child.getBean("parentIn", MessageChannel.class).send(MutableMessageBuilder.withPayload("bar").build()); out = child.getBean("parentOut", QueueChannel.class).receive(0); assertNotNull(out); assertThat(out, instanceOf(GenericMessage.class)); @@ -158,7 +158,7 @@ public class ParentContextTests { parent.getBean("fromParentToChild", MessageChannel.class).send(new GenericMessage("foo")); out = child.getBean("output", QueueChannel.class).receive(0); assertNotNull(out); - assertThat(out, instanceOf(MutableMessage.class)); + assertEquals("org.springframework.integration.support.MutableMessage", out.getClass().getName()); assertEquals("FOO", out.getPayload()); child.close(); diff --git a/spring-integration-core/src/test/java/org/springframework/integration/message/MessageBuilderAtConfigTests.java b/spring-integration-core/src/test/java/org/springframework/integration/message/MessageBuilderAtConfigTests.java index 2bb1788c33..9c1beb705a 100644 --- a/spring-integration-core/src/test/java/org/springframework/integration/message/MessageBuilderAtConfigTests.java +++ b/spring-integration-core/src/test/java/org/springframework/integration/message/MessageBuilderAtConfigTests.java @@ -16,10 +16,9 @@ package org.springframework.integration.message; -import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; -import org.hamcrest.Matchers; import org.junit.Test; import org.junit.runner.RunWith; @@ -64,7 +63,7 @@ public class MessageBuilderAtConfigTests { in.send(new GenericMessage("foo")); Message m1 = out.receive(0); Message m2 = out.receive(0); - assertThat(m1, Matchers.instanceOf(MutableMessage.class)); + assertEquals("org.springframework.integration.support.MutableMessage", m1.getClass().getName()); assertTrue(m1 == m2); } diff --git a/spring-integration-core/src/test/java/org/springframework/integration/message/MessageBuilderTests.java b/spring-integration-core/src/test/java/org/springframework/integration/message/MessageBuilderTests.java index f03f58935c..68eb30b396 100644 --- a/spring-integration-core/src/test/java/org/springframework/integration/message/MessageBuilderTests.java +++ b/spring-integration-core/src/test/java/org/springframework/integration/message/MessageBuilderTests.java @@ -20,7 +20,6 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotSame; import static org.junit.Assert.assertSame; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import java.util.Date; @@ -28,7 +27,6 @@ import java.util.HashMap; import java.util.Map; import java.util.UUID; -import org.hamcrest.Matchers; import org.junit.Test; import org.junit.runner.RunWith; @@ -151,7 +149,7 @@ public class MessageBuilderTests { in.send(new GenericMessage("foo")); Message m1 = out.receive(0); Message m2 = out.receive(0); - assertThat(m1, Matchers.instanceOf(MutableMessage.class)); + assertEquals("org.springframework.integration.support.MutableMessage", m1.getClass().getName()); assertTrue(m1 == m2); } diff --git a/spring-integration-mongodb/src/main/java/org/springframework/integration/mongodb/store/MongoDbMessageStore.java b/spring-integration-mongodb/src/main/java/org/springframework/integration/mongodb/store/MongoDbMessageStore.java index 24d5643fde..e050d6782f 100644 --- a/spring-integration-mongodb/src/main/java/org/springframework/integration/mongodb/store/MongoDbMessageStore.java +++ b/spring-integration-mongodb/src/main/java/org/springframework/integration/mongodb/store/MongoDbMessageStore.java @@ -23,10 +23,12 @@ import static org.springframework.integration.history.MessageHistory.TYPE_PROPER import java.util.ArrayList; import java.util.HashMap; +import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Properties; +import java.util.Set; import java.util.UUID; import org.springframework.beans.BeansException; @@ -35,7 +37,9 @@ import org.springframework.beans.factory.BeanClassLoaderAware; import org.springframework.beans.factory.InitializingBean; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; +import org.springframework.core.convert.TypeDescriptor; import org.springframework.core.convert.converter.Converter; +import org.springframework.core.convert.converter.GenericConverter; import org.springframework.core.serializer.support.DeserializingConverter; import org.springframework.core.serializer.support.SerializingConverter; import org.springframework.data.annotation.Id; @@ -55,12 +59,12 @@ import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Update; import org.springframework.integration.history.MessageHistory; import org.springframework.integration.message.AdviceMessage; -import org.springframework.integration.message.MutableMessage; import org.springframework.integration.store.AbstractMessageGroupStore; import org.springframework.integration.store.MessageGroup; import org.springframework.integration.store.MessageGroupStore; import org.springframework.integration.store.MessageStore; import org.springframework.integration.store.SimpleMessageGroup; +import org.springframework.integration.support.MutableMessageBuilder; import org.springframework.jmx.export.annotation.ManagedAttribute; import org.springframework.messaging.Message; import org.springframework.messaging.MessageHeaders; @@ -357,7 +361,7 @@ public class MongoDbMessageStore extends AbstractMessageGroupStore @Override public void afterPropertiesSet() { - List> customConverters = new ArrayList>(); + List customConverters = new ArrayList(); customConverters.add(new UuidToDBObjectConverter()); customConverters.add(new DBObjectToUUIDConverter()); customConverters.add(new MessageHistoryToDBObjectConverter()); @@ -537,16 +541,35 @@ public class MongoDbMessageStore extends AbstractMessageGroupStore } - private class DBObjectToMutableMessageConverter implements Converter> { + private class DBObjectToMutableMessageConverter implements GenericConverter { - @Override - public MutableMessage convert(DBObject source) { - @SuppressWarnings("unchecked") - Map headers = MongoDbMessageStore.this.converter.normalizeHeaders((Map) source.get("headers")); + private final Class mutableMessageClass; - return new MutableMessage(MongoDbMessageStore.this.converter.extractPayload(source), headers); + private DBObjectToMutableMessageConverter() { + try { + this.mutableMessageClass = ClassUtils.forName("org.springframework.integration.support.MutableMessage", + MongoDbMessageStore.this.classLoader); + } + catch (ClassNotFoundException e) { + throw new IllegalStateException(e); + } } + @Override + public Set getConvertibleTypes() { + Set convertiblePairs = new HashSet(); + convertiblePairs.add(new ConvertiblePair(DBObject.class, this.mutableMessageClass)); + return convertiblePairs; + } + + @Override + public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType) { + DBObject dbObject = (DBObject) source; + @SuppressWarnings("unchecked") + Map headers = MongoDbMessageStore.this.converter.normalizeHeaders((Map) dbObject.get("headers")); + + return MutableMessageBuilder.withPayload(MongoDbMessageStore.this.converter.extractPayload(dbObject)).copyHeaders(headers).build(); + } } private class DBObjectToAdviceMessageConverter implements Converter { diff --git a/spring-integration-mongodb/src/test/java/org/springframework/integration/mongodb/store/AbstractMongoDbMessageStoreTests.java b/spring-integration-mongodb/src/test/java/org/springframework/integration/mongodb/store/AbstractMongoDbMessageStoreTests.java index ad5bf40b34..8a4e429020 100644 --- a/spring-integration-mongodb/src/test/java/org/springframework/integration/mongodb/store/AbstractMongoDbMessageStoreTests.java +++ b/spring-integration-mongodb/src/test/java/org/springframework/integration/mongodb/store/AbstractMongoDbMessageStoreTests.java @@ -32,11 +32,11 @@ import org.springframework.data.mongodb.core.SimpleMongoDbFactory; import org.springframework.integration.channel.DirectChannel; import org.springframework.integration.history.MessageHistory; import org.springframework.integration.message.AdviceMessage; -import org.springframework.integration.message.MutableMessage; import org.springframework.integration.mongodb.rules.MongoDbAvailable; import org.springframework.integration.mongodb.rules.MongoDbAvailableTests; import org.springframework.integration.store.MessageStore; import org.springframework.integration.support.MessageBuilder; +import org.springframework.integration.support.MutableMessageBuilder; import org.springframework.messaging.Message; import org.springframework.messaging.MessagingException; import org.springframework.messaging.support.ErrorMessage; @@ -222,11 +222,11 @@ public abstract class AbstractMongoDbMessageStoreTests extends MongoDbAvailableT Person p = new Person(); p.setFname("John"); p.setLname("Doe"); - Message messageToStore = new GenericMessage>(new MutableMessage(p)); + Message messageToStore = new GenericMessage>(MutableMessageBuilder.withPayload(p).build()); store.addMessage(messageToStore); Message retrievedMessage = store.getMessage(messageToStore.getHeaders().getId()); assertNotNull(retrievedMessage); - assertTrue(retrievedMessage.getPayload() instanceof MutableMessage); + assertEquals("org.springframework.integration.support.MutableMessage", retrievedMessage.getPayload().getClass().getName()); assertEquals(messageToStore.getPayload(), retrievedMessage.getPayload()); assertEquals(messageToStore.getHeaders(), retrievedMessage.getHeaders()); assertEquals(((Message) messageToStore.getPayload()).getPayload(), p); diff --git a/spring-integration-redis/src/test/java/org/springframework/integration/redis/store/RedisChannelMessageStoreTests.java b/spring-integration-redis/src/test/java/org/springframework/integration/redis/store/RedisChannelMessageStoreTests.java index 3aebfe9369..78852eb290 100644 --- a/spring-integration-redis/src/test/java/org/springframework/integration/redis/store/RedisChannelMessageStoreTests.java +++ b/spring-integration-redis/src/test/java/org/springframework/integration/redis/store/RedisChannelMessageStoreTests.java @@ -27,10 +27,10 @@ import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.integration.IntegrationMessageHeaderAccessor; -import org.springframework.integration.message.MutableMessage; import org.springframework.integration.redis.rules.RedisAvailable; import org.springframework.integration.redis.rules.RedisAvailableTests; import org.springframework.integration.support.MessageBuilder; +import org.springframework.integration.support.MutableMessageBuilder; import org.springframework.messaging.Message; import org.springframework.messaging.PollableChannel; import org.springframework.messaging.support.GenericMessage; @@ -82,7 +82,7 @@ public class RedisChannelMessageStoreTests extends RedisAvailableTests { assertEquals(10, this.cms.messageGroupSize("cms:testChannel1")); assertEquals(10, this.cms.getMessageGroup("cms:testChannel1").size()); for (int i = 0; i < 10; i++) { - this.testChannel2.send(new MutableMessage(i)); + this.testChannel2.send(MutableMessageBuilder.withPayload(i).build()); } assertEquals(2, this.cms.getMessageGroupCount()); assertEquals(10, this.cms.messageGroupSize("cms:testChannel2")); @@ -91,13 +91,13 @@ public class RedisChannelMessageStoreTests extends RedisAvailableTests { for (int i = 0; i < 10; i++) { Message out = this.testChannel1.receive(0); assertThat(out, Matchers.instanceOf(GenericMessage.class)); - assertEquals(Integer.valueOf(i), out.getPayload()); + assertEquals(i, out.getPayload()); } assertNull(this.testChannel1.receive(0)); for (int i = 0; i < 10; i++) { Message out = this.testChannel2.receive(0); - assertThat(out, Matchers.instanceOf(MutableMessage.class)); - assertEquals(Integer.valueOf(i), out.getPayload()); + assertEquals("org.springframework.integration.support.MutableMessage", out.getClass().getName()); + assertEquals(i, out.getPayload()); } assertNull(this.testChannel2.receive(0)); assertEquals(0, this.cms.getMessageGroupCount()); @@ -143,11 +143,11 @@ public class RedisChannelMessageStoreTests extends RedisAvailableTests { Message m = this.testChannel3.receive(0); assertNotNull(m); assertEquals(Integer.valueOf(199), new IntegrationMessageHeaderAccessor(m).getPriority()); - assertEquals(Integer.valueOf(99), m.getPayload()); + assertEquals(99, m.getPayload()); m = this.testChannel3.receive(0); assertNotNull(m); assertNull(new IntegrationMessageHeaderAccessor(m).getPriority()); - assertEquals(Integer.valueOf(98), m.getPayload()); + assertEquals(98, m.getPayload()); assertEquals(0, this.priorityCms.messageGroupSize("priorityCms:testChannel3")); m = this.testChannel4.receive(0);