| /** |
| * 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.feature; |
| |
| import org.apache.camel.component.cxf.interceptors.OneWayOutgoingChainInterceptor; |
| import org.apache.camel.component.cxf.interceptors.RawMessageContentRedirectInterceptor; |
| import org.apache.camel.component.cxf.interceptors.RawMessageWSDLGetInterceptor; |
| import org.apache.cxf.Bus; |
| import org.apache.cxf.endpoint.Client; |
| import org.apache.cxf.endpoint.Server; |
| import org.apache.cxf.interceptor.Interceptor; |
| import org.apache.cxf.interceptor.LoggingOutInterceptor; |
| import org.apache.cxf.interceptor.OneWayProcessorInterceptor; |
| import org.apache.cxf.message.Message; |
| import org.apache.cxf.phase.Phase; |
| import org.slf4j.Logger; |
| import org.slf4j.LoggerFactory; |
| |
| /** |
| * <p> |
| * MessageDataFormatFeature sets up the CXF endpoint interceptor for handling the |
| * Message in Message data format. Only the interceptors of these phases are |
| * <b>preserved</b>: |
| * </p> |
| * <p> |
| * In phases: {Phase.RECEIVE , Phase.INVOKE, Phase.POST_INVOKE} |
| * </p> |
| * <p> |
| * Out phases: {Phase.PREPARE_SEND, Phase.WRITE, Phase.SEND, Phase.PREPARE_SEND_ENDING} |
| * </p> |
| */ |
| public class RAWDataFormatFeature extends AbstractDataFormatFeature { |
| private static final Logger LOG = LoggerFactory.getLogger(RAWDataFormatFeature.class); |
| |
| // filter the unused in phase interceptor |
| private static final String[] REMAINING_IN_PHASES = {Phase.RECEIVE, Phase.USER_STREAM, |
| Phase.INVOKE, Phase.POST_INVOKE}; |
| // filter the unused in phase interceptor |
| private static final String[] REMAINING_OUT_PHASES = {Phase.PREPARE_SEND, Phase.USER_STREAM, |
| Phase.WRITE, Phase.SEND, Phase.PREPARE_SEND_ENDING}; |
| |
| private boolean oneway; |
| |
| @Override |
| public void initialize(Client client, Bus bus) { |
| //check if there is logging interceptor |
| removeInterceptorWhichIsOutThePhases(client.getInInterceptors(), REMAINING_IN_PHASES, getInInterceptorNames()); |
| removeInterceptorWhichIsOutThePhases(client.getEndpoint().getInInterceptors(), REMAINING_IN_PHASES, getInInterceptorNames()); |
| client.getEndpoint().getBinding().getInInterceptors().clear(); |
| |
| //we need to keep the LoggingOutputInterceptor |
| getOutInterceptorNames().add(LoggingOutInterceptor.class.getName()); |
| removeInterceptorWhichIsOutThePhases(client.getOutInterceptors(), REMAINING_OUT_PHASES, getOutInterceptorNames()); |
| removeInterceptorWhichIsOutThePhases(client.getEndpoint().getOutInterceptors(), REMAINING_OUT_PHASES, getOutInterceptorNames()); |
| client.getEndpoint().getBinding().getOutInterceptors().clear(); |
| client.getEndpoint().getOutInterceptors().add(new RawMessageContentRedirectInterceptor()); |
| } |
| |
| @Override |
| public void initialize(Server server, Bus bus) { |
| // currently we do not filter the bus |
| // remove the interceptors |
| |
| removeInterceptorWhichIsOutThePhases(server.getEndpoint().getService().getInInterceptors(), REMAINING_IN_PHASES, getInInterceptorNames()); |
| removeInterceptorWhichIsOutThePhases(server.getEndpoint().getInInterceptors(), REMAINING_IN_PHASES, getInInterceptorNames()); |
| |
| |
| //we need to keep the LoggingOutputInterceptor |
| getOutInterceptorNames().add(LoggingOutInterceptor.class.getName()); |
| |
| // Do not using the binding interceptor any more |
| server.getEndpoint().getBinding().getInInterceptors().clear(); |
| |
| removeInterceptorWhichIsOutThePhases(server.getEndpoint().getService().getOutInterceptors(), REMAINING_OUT_PHASES, getOutInterceptorNames()); |
| removeInterceptorWhichIsOutThePhases(server.getEndpoint().getOutInterceptors(), REMAINING_OUT_PHASES, getOutInterceptorNames()); |
| |
| // Do not use the binding interceptor any more |
| server.getEndpoint().getBinding().getOutInterceptors().clear(); |
| server.getEndpoint().getOutInterceptors().add(new RawMessageContentRedirectInterceptor()); |
| |
| // setup the RawMessageWSDLGetInterceptor |
| server.getEndpoint().getInInterceptors().add(RawMessageWSDLGetInterceptor.INSTANCE); |
| // Oneway with RAW message |
| if (isOneway()) { |
| Interceptor<? extends Message> toRemove = null; |
| for (Interceptor<? extends Message> i : server.getEndpoint().getService().getInInterceptors()) { |
| if (i.getClass().getName().equals("org.apache.cxf.interceptor.OutgoingChainInterceptor")) { |
| toRemove = i; |
| } |
| } |
| server.getEndpoint().getService().getInInterceptors().remove(toRemove); |
| server.getEndpoint().getInInterceptors().add(new OneWayOutgoingChainInterceptor()); |
| server.getEndpoint().getInInterceptors().add(new OneWayProcessorInterceptor()); |
| } |
| } |
| |
| @Override |
| protected Logger getLogger() { |
| return LOG; |
| } |
| |
| public boolean isOneway() { |
| return oneway; |
| } |
| |
| public void setOneway(boolean oneway) { |
| this.oneway = oneway; |
| } |
| |
| |
| } |