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