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