/*
* Copyright 2002-2017 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.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.integration.jms.config;
import static org.junit.Assert.assertEquals;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.StringTokenizer;
import org.junit.Test;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.integration.history.MessageHistory;
import org.springframework.integration.jms.DefaultJmsHeaderMapper;
import org.springframework.integration.support.context.NamedComponent;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessageHeaders;
import org.springframework.messaging.MessagingException;
import org.springframework.messaging.PollableChannel;
import org.springframework.messaging.support.GenericMessage;
/**
* @author Oleg Zhurakousky
* @author Mark Fisher
* @since 2.0
*/
public class JmsMessageHistoryTests {
@Test
public void testInboundAdapter() throws Exception {
ActiveMqTestUtils.prepare();
ConfigurableApplicationContext applicationContext =
new ClassPathXmlApplicationContext("MessageHistoryTests-context.xml", JmsMessageHistoryTests.class);
SampleGateway gateway = applicationContext.getBean("sampleGateway", SampleGateway.class);
PollableChannel jmsInputChannel = applicationContext.getBean("jmsInputChannel", PollableChannel.class);
gateway.send("hello");
Message<?> message = jmsInputChannel.receive(5000);
Iterator<Properties> historyIterator = message.getHeaders()
.get(MessageHistory.HEADER_NAME, MessageHistory.class)
.iterator();
Properties event1 = historyIterator.next();
assertEquals("jms:inbound-channel-adapter", event1.getProperty(MessageHistory.TYPE_PROPERTY));
assertEquals("sampleJmsInboundAdapter", event1.getProperty(MessageHistory.NAME_PROPERTY));
Properties event2 = historyIterator.next();
assertEquals("channel", event2.getProperty(MessageHistory.TYPE_PROPERTY));
assertEquals("jmsInputChannel", event2.getProperty(MessageHistory.NAME_PROPERTY));
applicationContext.close();
}
public interface SampleGateway {
void send(String value);
Message<?> echo(String value);
}
public static class SampleService {
public Message<?> echoMessage(String value) {
return new GenericMessage<String>(value);
}
}
public static class SampleHeaderMapper extends DefaultJmsHeaderMapper {
public void fromHeaders(MessageHeaders headers, javax.jms.Message jmsMessage) {
super.fromHeaders(headers, jmsMessage);
String messageHistory = headers.get(MessageHistory.HEADER_NAME, MessageHistory.class).toString();
try {
jmsMessage.setStringProperty("outbound_history", messageHistory);
}
catch (Exception e) {
throw new MessagingException("Problem setting JMS properties", e);
}
}
public Map<String, Object> toHeaders(javax.jms.Message jmsMessage) {
Map<String, Object> headers = super.toHeaders(jmsMessage);
List<Properties> history = new ArrayList<Properties>();
String outboundHistory = (String) headers.get("outbound_history");
StringTokenizer outerTok = new StringTokenizer(outboundHistory, "[]");
while (outerTok.hasMoreTokens()) {
String historyItem = outerTok.nextToken();
StringTokenizer innerTok = new StringTokenizer(historyItem, ",{} ");
Properties historyEvent = new Properties();
while (innerTok.hasMoreTokens()) {
String prop = innerTok.nextToken();
String[] keyAndValue = prop.split("=");
historyEvent.setProperty(keyAndValue[0], keyAndValue[1]);
}
history.add(historyEvent);
}
headers.put(MessageHistory.HEADER_NAME, history);
headers.remove("outbound_history");
return headers;
}
}
public static class SampleComponent implements NamedComponent {
private String name;
private String type;
public SampleComponent(String name, String type) {
this.name = name;
this.type = type;
}
public String getComponentName() {
return name;
}
public String getComponentType() {
return type;
}
}
}