001 /**
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements. See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License. You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017 package org.apache.camel.component.jbi;
018
019 import org.apache.camel.Exchange;
020
021 import javax.jbi.messaging.MessageExchange;
022 import javax.jbi.messaging.MessageExchangeFactory;
023 import javax.jbi.messaging.MessagingException;
024 import javax.jbi.messaging.NormalizedMessage;
025 import javax.xml.transform.Source;
026 import javax.xml.transform.stream.StreamSource;
027 import java.io.StringReader;
028 import java.util.Map;
029 import java.util.Set;
030
031 /**
032 * The binding of how Camel messages get mapped to JBI and back again
033 *
034 * @version $Revision: 563665 $
035 */
036 public class JbiBinding {
037 /**
038 * Extracts the body from the given normalized message
039 */
040 public Object extractBodyFromJbi(JbiExchange exchange, NormalizedMessage normalizedMessage) {
041 // TODO we may wish to turn this into a POJO such as a JAXB/DOM
042 return normalizedMessage.getContent();
043 }
044
045 public MessageExchange makeJbiMessageExchange(Exchange camelExchange, MessageExchangeFactory exchangeFactory) throws MessagingException {
046 MessageExchange jbiExchange = createJbiMessageExchange(camelExchange, exchangeFactory);
047 NormalizedMessage normalizedMessage = jbiExchange.getMessage("in");
048 if (normalizedMessage == null) {
049 normalizedMessage = jbiExchange.createMessage();
050 jbiExchange.setMessage(normalizedMessage, "in");
051 }
052 normalizedMessage.setContent(getJbiInContent(camelExchange));
053 addJbiHeaders(jbiExchange, normalizedMessage, camelExchange);
054 return jbiExchange;
055 }
056
057 protected MessageExchange createJbiMessageExchange(Exchange camelExchange, MessageExchangeFactory exchangeFactory) throws MessagingException {
058 // TODO we should deal with other forms of MEP
059 return exchangeFactory.createInOnlyExchange();
060 }
061
062 protected Source getJbiInContent(Exchange camelExchange) {
063 // TODO this should be more smart
064 Object value = camelExchange.getIn().getBody();
065 if (value instanceof String) {
066 return new StreamSource(new StringReader(value.toString()));
067 }
068 return camelExchange.getIn().getBody(Source.class);
069 }
070
071 protected void addJbiHeaders(MessageExchange jbiExchange, NormalizedMessage normalizedMessage, Exchange camelExchange) {
072 Set<Map.Entry<String, Object>> entries = camelExchange.getIn().getHeaders().entrySet();
073 for (Map.Entry<String, Object> entry : entries) {
074 normalizedMessage.setProperty(entry.getKey(), entry.getValue());
075 }
076 }
077 }
078