/** * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.camel.component.cxf; import java.io.IOException; import java.util.List; import java.util.Map; import org.apache.camel.AsyncCallback; import org.apache.camel.Exchange; import org.apache.cxf.endpoint.ClientCallback; import org.apache.cxf.endpoint.ConduitSelector; import org.apache.cxf.helpers.CastUtils; import org.apache.cxf.message.Message; import org.apache.cxf.service.model.BindingOperationInfo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class CxfClientCallback extends ClientCallback { private static final Logger LOG = LoggerFactory.getLogger(CxfClientCallback.class); private final AsyncCallback camelAsyncCallback; private final Exchange camelExchange; private final org.apache.cxf.message.Exchange cxfExchange; private final BindingOperationInfo boi; private final CxfEndpoint endpoint; public CxfClientCallback(AsyncCallback callback, Exchange camelExchange, org.apache.cxf.message.Exchange cxfExchange, BindingOperationInfo boi, CxfEndpoint endpoint) { this.camelAsyncCallback = callback; this.camelExchange = camelExchange; this.cxfExchange = cxfExchange; this.boi = boi; this.endpoint = endpoint; } public void handleResponse(Map<String, Object> ctx, Object[] res) { try { super.handleResponse(ctx, res); } finally { // add cookies to the cookie store if (endpoint.getCookieHandler() != null) { try { Map<String, List<String>> cxfHeaders = CastUtils.cast((Map<?, ?>)cxfExchange.getInMessage().get(Message.PROTOCOL_HEADERS)); endpoint.getCookieHandler().storeCookies(camelExchange, endpoint.getRequestUri(camelExchange), cxfHeaders); } catch (IOException e) { LOG.error("Cannot store cookies", e); } } // bind the CXF response to Camel exchange and // call camel callback // for one way messages callback is already called in // process method of org.apache.camel.component.cxf.CxfProducer if (!boi.getOperationInfo().isOneWay()) { endpoint.getCxfBinding().populateExchangeFromCxfResponse(camelExchange, cxfExchange, ctx); camelAsyncCallback.done(false); } if (LOG.isDebugEnabled()) { LOG.debug("{} calling handleResponse", Thread.currentThread().getName()); } } } public void handleException(Map<String, Object> ctx, Throwable ex) { try { super.handleException(ctx, ex); // need to call the conduitSelector complete method to enable the fail over feature ConduitSelector conduitSelector = cxfExchange.get(ConduitSelector.class); if (conduitSelector != null) { conduitSelector.complete(cxfExchange); ex = cxfExchange.getOutMessage().getContent(Exception.class); if (ex == null && cxfExchange.getInMessage() != null) { ex = cxfExchange.getInMessage().getContent(Exception.class); } if (ex != null) { camelExchange.setException(ex); } } else { camelExchange.setException(ex); } } finally { // add cookies to the cookie store if (endpoint.getCookieHandler() != null) { try { Map<String, List<String>> cxfHeaders = CastUtils.cast((Map<?, ?>)cxfExchange.getInMessage().get(Message.PROTOCOL_HEADERS)); endpoint.getCookieHandler().storeCookies(camelExchange, endpoint.getRequestUri(camelExchange), cxfHeaders); } catch (IOException e) { LOG.error("Cannot store cookies", e); } } // copy the context information and // call camel callback // for one way messages callback is already called in // process method of org.apache.camel.component.cxf.CxfProducer if (!boi.getOperationInfo().isOneWay()) { endpoint.getCxfBinding().populateExchangeFromCxfResponse(camelExchange, cxfExchange, ctx); camelAsyncCallback.done(false); } if (LOG.isDebugEnabled()) { LOG.debug("{} calling handleException", Thread.currentThread().getName()); } } } }