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 }