001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one
003: * or more contributor license agreements. See the NOTICE file
004: * distributed with this work for additional information
005: * regarding copyright ownership. The ASF licenses this file
006: * to you under the Apache License, Version 2.0 (the
007: * "License"); you may not use this file except in compliance
008: * with the License. You may obtain a copy of the License at
009: *
010: * http://www.apache.org/licenses/LICENSE-2.0
011: *
012: * Unless required by applicable law or agreed to in writing,
013: * software distributed under the License is distributed on an
014: * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015: * KIND, either express or implied. See the License for the
016: * specific language governing permissions and limitations
017: * under the License.
018: */
019:
020: package org.apache.axis2.transport.tcp;
021:
022: import org.apache.axiom.om.OMXMLParserWrapper;
023: import org.apache.axiom.soap.SOAPEnvelope;
024: import org.apache.axis2.AxisFault;
025: import org.apache.axis2.Constants;
026: import org.apache.axis2.builder.BuilderUtil;
027: import org.apache.axis2.context.ConfigurationContext;
028: import org.apache.axis2.context.MessageContext;
029: import org.apache.axis2.description.TransportInDescription;
030: import org.apache.axis2.description.TransportOutDescription;
031: import org.apache.axis2.engine.AxisConfiguration;
032: import org.apache.axis2.engine.AxisEngine;
033: import org.apache.axis2.i18n.Messages;
034: import org.apache.axis2.util.MessageContextBuilder;
035: import org.apache.commons.logging.Log;
036: import org.apache.commons.logging.LogFactory;
037:
038: import java.io.IOException;
039: import java.io.InputStreamReader;
040: import java.io.OutputStream;
041: import java.io.Reader;
042: import java.net.Socket;
043:
044: /**
045: * This Class is the work hoarse of the TCP request, this process the incomming SOAP Message.
046: */
047: public class TCPWorker implements Runnable {
048: private static final Log log = LogFactory.getLog(TCPWorker.class);
049: private ConfigurationContext configurationContext;
050: private Socket socket;
051:
052: public TCPWorker(ConfigurationContext configurationContext,
053: Socket socket) {
054: this .configurationContext = configurationContext;
055: this .socket = socket;
056: }
057:
058: public void run() {
059: MessageContext msgContext = null;
060:
061: try {
062: AxisEngine engine = new AxisEngine(configurationContext);
063: AxisConfiguration axisConf = configurationContext
064: .getAxisConfiguration();
065: TransportOutDescription transportOut = axisConf
066: .getTransportOut(Constants.TRANSPORT_TCP);
067: TransportInDescription transportIn = axisConf
068: .getTransportIn(Constants.TRANSPORT_TCP);
069:
070: if ((transportOut != null) && (transportIn != null)) {
071:
072: // create the Message Context and fill in the values
073: msgContext = configurationContext
074: .createMessageContext();
075: msgContext
076: .setIncomingTransportName(Constants.TRANSPORT_TCP);
077: msgContext.setTransportIn(transportIn);
078: msgContext.setTransportOut(transportOut);
079: msgContext.setServerSide(true);
080:
081: OutputStream out = socket.getOutputStream();
082:
083: msgContext.setProperty(MessageContext.TRANSPORT_OUT,
084: out);
085:
086: // create the SOAP Envelope
087: Reader in = new InputStreamReader(socket
088: .getInputStream());
089: OMXMLParserWrapper builder = BuilderUtil.getBuilder(in);
090: SOAPEnvelope envelope = (SOAPEnvelope) builder
091: .getDocumentElement();
092:
093: msgContext.setEnvelope(envelope);
094: engine.receive(msgContext);
095: } else {
096: throw new AxisFault(Messages.getMessage(
097: "unknownTransport", Constants.TRANSPORT_TCP));
098: }
099: } catch (Throwable e) {
100: log.error(e.getMessage(), e);
101: try {
102: AxisEngine engine = new AxisEngine(configurationContext);
103:
104: if (msgContext != null) {
105: msgContext.setProperty(
106: MessageContext.TRANSPORT_OUT, socket
107: .getOutputStream());
108:
109: MessageContext faultContext = MessageContextBuilder
110: .createFaultMessageContext(msgContext, e);
111:
112: engine.sendFault(faultContext);
113: }
114: } catch (Exception e1) {
115: log.error(e1.getMessage(), e1);
116: }
117: } finally {
118: if (socket != null) {
119: try {
120: this .socket.close();
121: } catch (IOException e1) {
122: // Do nothing
123: }
124: }
125: }
126: }
127: }
|