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.cxfbean;
018    
019    import java.util.List;
020    import java.util.Map;
021    
022    import org.apache.camel.Exchange;
023    import org.apache.camel.component.cxf.util.CxfMessageHelper;
024    import org.apache.camel.spi.HeaderFilterStrategy;
025    import org.apache.commons.logging.Log;
026    import org.apache.commons.logging.LogFactory;
027    import org.apache.cxf.helpers.CastUtils;
028    import org.apache.cxf.message.Message;
029    
030    /**
031     *
032     * @version $Revision: 18266 $
033     */
034    public class DefaultCxfBeanBinding implements CxfBeanBinding {
035        private static final Log LOG = LogFactory.getLog(DefaultCxfBeanBinding.class);
036    
037        public Message createCxfMessageFromCamelExchange(Exchange camelExchange, 
038                HeaderFilterStrategy headerFilterStrategy) {
039            
040            org.apache.camel.Message camelMessage = camelExchange.getIn();
041    
042            // request content types
043            String requestContentType = getRequestContentType(camelMessage); 
044            
045            // accept content types
046            String acceptContentTypes = camelMessage.getHeader("Accept", String.class);
047            if (acceptContentTypes == null) {
048                acceptContentTypes = "*/*";
049            }
050            
051            String enc = getCharacterEncoding(camelMessage); 
052            
053            // path
054            String path = getPath(camelMessage);
055    
056            // base path
057            String basePath = getBasePath(camelExchange);
058            
059            // verb
060            String verb = getVerb(camelMessage);
061            
062            if (LOG.isTraceEnabled()) {
063                LOG.trace("Processing " + camelExchange + ", requestContentType = " + requestContentType 
064                        + ", acceptContentTypes = " + acceptContentTypes + ", encoding = " + enc
065                        + ", path = " + path + ", basePath = " + basePath + ", verb = " + verb); 
066            }
067            
068        
069            org.apache.cxf.message.Message answer = 
070                CxfMessageHelper.getCxfInMessage(headerFilterStrategy, camelExchange, false);
071            
072            answer.put(org.apache.cxf.message.Message.REQUEST_URI, path);
073            answer.put(org.apache.cxf.message.Message.BASE_PATH, basePath);
074            answer.put(org.apache.cxf.message.Message.HTTP_REQUEST_METHOD, verb);
075            answer.put(org.apache.cxf.message.Message.PATH_INFO, path);
076            answer.put(org.apache.cxf.message.Message.CONTENT_TYPE, requestContentType);
077            answer.put(org.apache.cxf.message.Message.ACCEPT_CONTENT_TYPE, acceptContentTypes);
078            answer.put(org.apache.cxf.message.Message.ENCODING, enc);
079            
080            // TODO propagate security context
081    
082            return answer;
083        }
084        
085        public void propagateResponseHeadersToCamel(Message cxfMessage, Exchange exchange,
086                                                    HeaderFilterStrategy strategy) {
087    
088            if (LOG.isTraceEnabled()) {
089                LOG.trace("Propagating response headers from CXF message " + cxfMessage);
090            }
091            
092            if (strategy == null) {
093                return;
094            }
095    
096            Map<String, Object> camelHeaders = exchange.getOut().getHeaders();
097            
098            Map<String, List<String>> cxfHeaders =
099                CastUtils.cast((Map)cxfMessage.get(Message.PROTOCOL_HEADERS));
100                          
101            if (cxfHeaders != null) {
102                for (Map.Entry<String, List<String>> entry : cxfHeaders.entrySet()) {
103                    if (!strategy.applyFilterToExternalHeaders(entry.getKey(), entry.getValue(), exchange)) {
104                        camelHeaders.put(entry.getKey(), entry.getValue().get(0));
105                        
106                        if (LOG.isTraceEnabled()) {
107                            LOG.trace("Populate header from CXF header=" + entry.getKey() + " value="
108                                    + entry.getValue());
109                        }
110                    }
111                }
112            }
113    
114            
115            // propagate HTTP RESPONSE_CODE
116            String key = Message.RESPONSE_CODE;
117            Object value = cxfMessage.get(key);
118            if (value != null && !strategy.applyFilterToExternalHeaders(key, value, exchange)) {
119                camelHeaders.put(Exchange.HTTP_RESPONSE_CODE, value);
120                if (LOG.isTraceEnabled()) {
121                    LOG.trace("Populate header from CXF header=" + key + " value=" + value
122                              + " as " + Exchange.HTTP_RESPONSE_CODE);
123                } 
124            }
125            
126            // propagate HTTP CONTENT_TYPE
127            if (cxfMessage.get(Message.CONTENT_TYPE) != null) {
128                camelHeaders.put(Exchange.CONTENT_TYPE, cxfMessage.get(Message.CONTENT_TYPE));
129            }
130            
131        }
132    
133        protected String getPath(org.apache.camel.Message camelMessage) {
134            String answer = camelMessage.getHeader(Exchange.HTTP_PATH, String.class);
135            return answer;
136        }
137        
138        protected String getBasePath(Exchange camelExchange) {
139            String answer = camelExchange.getIn().getHeader(Exchange.HTTP_BASE_URI, String.class);
140    
141            if (answer == null) {
142                answer = camelExchange.getFromEndpoint().getEndpointUri();
143            }
144            
145            return answer;
146        }
147    
148        protected String getVerb(org.apache.camel.Message camelMessage) {
149            String answer = camelMessage.getHeader(Exchange.HTTP_METHOD, String.class);
150            return answer;
151        }
152    
153        protected String getCharacterEncoding(org.apache.camel.Message camelMessage) {
154            String answer = camelMessage.getHeader(Exchange.HTTP_CHARACTER_ENCODING, String.class);
155            if (answer == null) {
156                answer = camelMessage.getHeader(Exchange.CHARSET_NAME, String.class);
157            }
158            return answer;
159    
160        }
161    
162        protected String getRequestContentType(org.apache.camel.Message camelMessage) {
163            String answer = camelMessage.getHeader(Exchange.CONTENT_TYPE, String.class);
164            if (answer != null) {
165                return answer;
166            }        
167            // return default
168            return "*/*";
169        }
170    
171    }