View Javadoc
1   /*
2    * Copyright 2002-2014 the original author or authors.
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *      http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  
17  package org.springframework.jms.support.converter;
18  
19  import java.util.Map;
20  import javax.jms.JMSException;
21  import javax.jms.Session;
22  
23  import org.springframework.beans.factory.InitializingBean;
24  import org.springframework.jms.support.JmsHeaderMapper;
25  import org.springframework.jms.support.SimpleJmsHeaderMapper;
26  import org.springframework.messaging.Message;
27  import org.springframework.messaging.support.MessageBuilder;
28  import org.springframework.util.Assert;
29  
30  /**
31   * Convert a {@link Message} from the messaging abstraction to and from a
32   * {@link javax.jms.Message} using an underlying {@link MessageConverter}
33   * for the payload and a {@link org.springframework.jms.support.JmsHeaderMapper}
34   * to map the JMS headers to and from standard message headers.
35   *
36   * @author Stephane Nicoll
37   * @since 4.1
38   */
39  public class MessagingMessageConverter implements MessageConverter, InitializingBean {
40  
41  	private MessageConverter payloadConverter;
42  
43  	private JmsHeaderMapper headerMapper;
44  
45  
46  	/**
47  	 * Create an instance with a default payload converter.
48  	 * @see org.springframework.jms.support.converter.SimpleMessageConverter
49  	 * @see org.springframework.jms.support.SimpleJmsHeaderMapper
50  	 */
51  	public MessagingMessageConverter() {
52  		this(new SimpleMessageConverter(), new SimpleJmsHeaderMapper());
53  	}
54  
55  	/**
56  	 * Create an instance with the specified payload converter and
57  	 * header mapper.
58  	 */
59  	public MessagingMessageConverter(MessageConverter payloadConverter, JmsHeaderMapper headerMapper) {
60  		Assert.notNull(payloadConverter, "PayloadConverter must not be null");
61  		Assert.notNull(headerMapper, "HeaderMapper must not be null");
62  		this.payloadConverter = payloadConverter;
63  		this.headerMapper = headerMapper;
64  	}
65  
66  
67  	/**
68  	 * Set the {@link MessageConverter} to use to convert the payload.
69  	 */
70  	public void setPayloadConverter(MessageConverter payloadConverter) {
71  		this.payloadConverter = payloadConverter;
72  	}
73  
74  	/**
75  	 * Set the {@link JmsHeaderMapper} to use to map JMS headers to and from
76  	 * standard message headers.
77  	 */
78  	public void setHeaderMapper(JmsHeaderMapper headerMapper) {
79  		this.headerMapper = headerMapper;
80  	}
81  
82  	@Override
83  	public void afterPropertiesSet() {
84  		Assert.notNull(this.payloadConverter, "Property 'payloadConverter' is required");
85  		Assert.notNull(this.headerMapper, "Property 'headerMapper' is required");
86  	}
87  
88  
89  	@Override
90  	public javax.jms.Message toMessage(Object object, Session session) throws JMSException, MessageConversionException {
91  		if (!(object instanceof Message)) {
92  			throw new IllegalArgumentException("Could not convert [" + object + "] - only [" +
93  					Message.class.getName() + "] is handled by this converter");
94  		}
95  		Message<?> input = (Message<?>) object;
96  		javax.jms.Message reply = this.payloadConverter.toMessage(input.getPayload(), session);
97  		this.headerMapper.fromHeaders(input.getHeaders(), reply);
98  		return reply;
99  	}
100 
101 	@SuppressWarnings("unchecked")
102 	@Override
103 	public Object fromMessage(javax.jms.Message message) throws JMSException, MessageConversionException {
104 		if (message == null) {
105 			return null;
106 		}
107 		Map<String, Object> mappedHeaders = this.headerMapper.toHeaders(message);
108 		Object convertedObject = extractPayload(message);
109 		MessageBuilder<Object> builder = (convertedObject instanceof org.springframework.messaging.Message) ?
110 				MessageBuilder.fromMessage((org.springframework.messaging.Message<Object>) convertedObject) :
111 				MessageBuilder.withPayload(convertedObject);
112 		return builder.copyHeadersIfAbsent(mappedHeaders).build();
113 	}
114 
115 	/**
116 	 * Extract the payload of the specified {@link javax.jms.Message}.
117 	 */
118 	protected Object extractPayload(javax.jms.Message message) throws JMSException {
119 		return this.payloadConverter.fromMessage(message);
120 	}
121 
122 }