| /* |
| * 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.axis2.transport.local; |
| |
| import org.apache.axiom.om.OMXMLBuilderFactory; |
| import org.apache.axiom.soap.SOAPEnvelope; |
| import org.apache.axis2.AxisFault; |
| import org.apache.axis2.Constants; |
| import org.apache.axis2.addressing.EndpointReference; |
| import org.apache.axis2.context.ConfigurationContext; |
| import org.apache.axis2.context.MessageContext; |
| import org.apache.axis2.description.TransportInDescription; |
| import org.apache.axis2.description.TransportOutDescription; |
| import org.apache.axis2.engine.AxisEngine; |
| import org.apache.axis2.transport.http.HTTPConstants; |
| import org.apache.axis2.util.MessageContextBuilder; |
| |
| import java.io.InputStream; |
| import java.io.InputStreamReader; |
| import java.io.OutputStream; |
| |
| public class LocalTransportReceiver { |
| public static ConfigurationContext CONFIG_CONTEXT; |
| private ConfigurationContext confContext; |
| private MessageContext inMessageContext; |
| |
| public LocalTransportReceiver(ConfigurationContext configContext) { |
| confContext = configContext; |
| } |
| |
| public LocalTransportReceiver(LocalTransportSender sender) { |
| this(CONFIG_CONTEXT); |
| } |
| |
| public void processMessage(MessageContext inMessageContext, |
| InputStream in, |
| OutputStream response) throws AxisFault { |
| if (this.confContext == null) { |
| this.confContext = inMessageContext.getConfigurationContext(); |
| } |
| this.inMessageContext = inMessageContext; |
| EndpointReference to = inMessageContext.getTo(); |
| String action = inMessageContext.getOptions().getAction(); |
| processMessage(in, to, action, response); |
| } |
| |
| public void processMessage(ConfigurationContext configurationContext, |
| InputStream in, |
| EndpointReference to, |
| String action, |
| OutputStream response) throws AxisFault { |
| if (this.confContext == null) { |
| this.confContext = configurationContext; |
| } |
| processMessage(in, to, action, response); |
| } |
| |
| public void processMessage(InputStream in, EndpointReference to, String action, |
| OutputStream response) |
| throws AxisFault { |
| MessageContext msgCtx = confContext.createMessageContext(); |
| if (inMessageContext != null) { |
| msgCtx.setProperty(HTTPConstants.MC_HTTP_SERVLETREQUEST, |
| inMessageContext.getProperty(HTTPConstants.MC_HTTP_SERVLETREQUEST)); |
| msgCtx.setProperty(MessageContext.REMOTE_ADDR, |
| inMessageContext.getProperty(MessageContext.REMOTE_ADDR)); |
| |
| } |
| |
| TransportInDescription tIn = confContext.getAxisConfiguration().getTransportIn( |
| Constants.TRANSPORT_LOCAL); |
| TransportOutDescription tOut = confContext.getAxisConfiguration().getTransportOut( |
| Constants.TRANSPORT_LOCAL); |
| |
| // CAUTION : When using Local Transport of Axis2, class LocalTransportReceiver changed the name of LocalTransportSender's class in configContext. |
| // We escaped this problem by the following code. |
| LocalResponseTransportOutDescription localTransportResOut = new LocalResponseTransportOutDescription( |
| tOut); |
| localTransportResOut.setSender(new LocalResponder(response)); |
| |
| try { |
| msgCtx.setIncomingTransportName(Constants.TRANSPORT_LOCAL); |
| msgCtx.setTransportIn(tIn); |
| msgCtx.setTransportOut(localTransportResOut); |
| msgCtx.setProperty(MessageContext.TRANSPORT_OUT, response); |
| |
| Object headers = inMessageContext.getProperty(MessageContext.TRANSPORT_HEADERS); |
| if (headers != null) { |
| msgCtx.setProperty(MessageContext.TRANSPORT_HEADERS, headers); |
| } |
| |
| msgCtx.setTo(to); |
| msgCtx.setWSAAction(action); |
| msgCtx.setServerSide(true); |
| |
| InputStreamReader streamReader = new InputStreamReader(in); |
| SOAPEnvelope envelope = OMXMLBuilderFactory.createSOAPModelBuilder(streamReader).getSOAPEnvelope(); |
| |
| msgCtx.setEnvelope(envelope); |
| |
| AxisEngine.receive(msgCtx); |
| } catch (AxisFault e) { |
| // write the fault back. |
| try { |
| MessageContext faultContext = |
| MessageContextBuilder.createFaultMessageContext(msgCtx, e); |
| faultContext.setTransportOut(localTransportResOut); |
| faultContext.setProperty(MessageContext.TRANSPORT_OUT, response); |
| |
| AxisEngine.sendFault(faultContext); |
| } catch (AxisFault axisFault) { |
| // can't handle this, so just throw it |
| throw axisFault; |
| } |
| } |
| } |
| } |