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 }