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.cxf;
018    
019    import org.apache.cxf.message.Message;
020    import org.apache.cxf.message.MessageImpl;
021    
022    import java.io.InputStream;
023    import java.util.Set;
024    
025    /**
026     * The binding of how Camel messages get mapped to Apache CXF and back again
027     *
028     * @version $Revision: 563822 $
029     */
030    public class CxfBinding {
031        public Object extractBodyFromCxf(CxfExchange exchange, Message message) {
032            //  TODO how do we choose a format?
033            return getBody(message);
034        }
035    
036        protected Object getBody(Message message) {
037            Set<Class<?>> contentFormats = message.getContentFormats();
038            for (Class<?> contentFormat : contentFormats) {
039                Object answer = message.getContent(contentFormat);
040                if (answer != null) {
041                    return answer;
042                }
043            }
044            return null;
045        }
046    
047        public MessageImpl createCxfMessage(CxfExchange exchange) {
048            MessageImpl answer = (MessageImpl) exchange.getInMessage();
049    
050            // CXF uses the stax which is based on the stream API to parser the XML, so
051            // the CXF transport is also based on the stream API.
052            // And the interceptors are also based on the stream API,
053            // so lets use an InputStream to host the CXF on wire message.
054            CxfMessage in = exchange.getIn();
055            Object body = in.getBody(InputStream.class);
056            if (body == null) {
057                body = in.getBody();
058            }
059            answer.setContent(InputStream.class, body);
060    
061            // no need to process headers as we reuse the CXF message
062            /*
063            // set the headers
064            Set<Map.Entry<String, Object>> entries = in.getHeaders().entrySet();
065            for (Map.Entry<String, Object> entry : entries) {
066                answer.put(entry.getKey(), entry.getValue());
067            }
068            */
069            return answer;
070        }
071    
072        public void storeCxfResponse(CxfExchange exchange, Message response) {
073            // no need to process headers as we use the CXF message
074            CxfMessage out = exchange.getOut();
075            if (response != null) {
076                out.setMessage(response);
077                out.setBody(getBody(response));
078            }
079        }
080    
081        public void storeCxfResponse(CxfExchange exchange, Object response) {
082            CxfMessage out = exchange.getOut();
083            if (response != null) {
084                out.setBody(response);
085            }
086        }
087    }