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.axis2.AxisFault;
023: import org.apache.axis2.Constants;
024: import org.apache.axis2.addressing.EndpointReference;
025: import org.apache.axis2.context.ConfigurationContext;
026: import org.apache.axis2.context.MessageContext;
027: import org.apache.axis2.description.TransportOutDescription;
028: import org.apache.axis2.handlers.AbstractHandler;
029: import org.apache.axis2.i18n.Messages;
030: import org.apache.axis2.transport.TransportSender;
031: import org.apache.axis2.transport.TransportUtils;
032: import org.apache.axis2.transport.http.HTTPTransportUtils;
033: import org.apache.axis2.util.URL;
034:
035: import java.io.IOException;
036: import java.io.OutputStream;
037: import java.io.Writer;
038: import java.net.InetSocketAddress;
039: import java.net.MalformedURLException;
040: import java.net.Socket;
041: import java.net.SocketAddress;
042:
043: public class TCPTransportSender extends AbstractHandler implements
044: TransportSender {
045: protected Writer out;
046: private Socket socket;
047:
048: public void init(ConfigurationContext confContext,
049: TransportOutDescription transportOut) throws AxisFault {
050: }
051:
052: public void stop() {
053: }
054:
055: public void cleanup(MessageContext msgContext) throws AxisFault {
056: try {
057: if (socket != null) {
058: socket.close();
059: socket = null;
060: }
061: } catch (IOException e) {
062: // TODO: Log this?
063: }
064: }
065:
066: /**
067: * Method invoke
068: *
069: * @param msgContext
070: * @throws AxisFault
071: */
072: public InvocationResponse invoke(MessageContext msgContext)
073: throws AxisFault {
074:
075: // Check for the REST behaviour, if you desire rest beahaviour
076: // put a <parameter name="doREST" value="true"/> at the axis2.xml
077: msgContext.setDoingMTOM(HTTPTransportUtils
078: .doWriteMTOM(msgContext));
079: msgContext.setDoingSwA(HTTPTransportUtils
080: .doWriteSwA(msgContext));
081:
082: OutputStream out;
083: EndpointReference epr = null;
084:
085: if (msgContext.getTo() != null
086: && !msgContext.getTo().hasAnonymousAddress()) {
087: epr = msgContext.getTo();
088: }
089:
090: if (epr != null) {
091: if (!epr.hasNoneAddress()) {
092: out = openTheConnection(epr, msgContext);
093: TransportUtils.writeMessage(msgContext, out);
094: try {
095: socket.shutdownOutput();
096: msgContext.setProperty(MessageContext.TRANSPORT_IN,
097: socket.getInputStream());
098: } catch (IOException e) {
099: throw AxisFault.makeFault(e);
100: }
101: }
102: } else {
103: out = (OutputStream) msgContext
104: .getProperty(MessageContext.TRANSPORT_OUT);
105:
106: if (out != null) {
107: TransportUtils.writeMessage(msgContext, out);
108: } else {
109: throw new AxisFault(
110: "Both the TO and Property MessageContext.TRANSPORT_OUT is Null, No where to send");
111: }
112: }
113:
114: TransportUtils.setResponseWritten(msgContext, true);
115:
116: return InvocationResponse.CONTINUE;
117: }
118:
119: protected OutputStream openTheConnection(EndpointReference toURL,
120: MessageContext msgContext) throws AxisFault {
121: if (toURL != null) {
122: try {
123: URL url = new URL(toURL.getAddress());
124: SocketAddress add = new InetSocketAddress(
125: url.getHost(), (url.getPort() == -1) ? 80 : url
126: .getPort());
127:
128: socket = new Socket();
129: socket.connect(add);
130:
131: return socket.getOutputStream();
132: } catch (MalformedURLException e) {
133: throw AxisFault.makeFault(e);
134: } catch (IOException e) {
135: throw AxisFault.makeFault(e);
136: }
137: } else {
138: throw new AxisFault(Messages.getMessage("canNotBeNull",
139: "End point reference"));
140: }
141: }
142: }
|