blob: b7334a3d6a3b0cd3e75d6ad3ddf34853d6f98dee [file] [log] [blame]
/*
* Portions Copyright 2006 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Sun designates this
* particular file as subject to the "Classpath" exception as provided
* by Sun in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
package com.sun.xml.internal.ws.transport;
import com.sun.xml.internal.ws.pept.ept.EPTFactory;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.ByteBuffer;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.util.HashMap;
import com.sun.xml.internal.ws.client.ClientTransportException;
import com.sun.xml.internal.ws.spi.runtime.WSConnection;
/**
* Abstract class for WSConnection. All client-side and server-side
* transports should extend this class and override appropriate methods.
*
* @author WS Development Team
*/
public abstract class WSConnectionImpl implements WSConnection {
Map<String, List<String>> headers = null;
public OutputStream debugStream = null;
public OutputStream outputStream = null;
public InputStream inputStream = null;
int statusCode;
/** Creates a new instance of WSConnectionImpl */
public WSConnectionImpl () {
}
public int getStatus () {
return statusCode;
}
public void setStatus (int statusCode) {
this.statusCode = statusCode;
}
public OutputStream getDebug () {
return debugStream;
}
/**
* @return outputStream
*
* Returns the OutputStream on which the outbound message is written.
* Any stream or connection initialization, pre-processing is done here.
*/
public OutputStream getOutput() {
return outputStream;
}
/**
* @return inputStream
*
* Returns the InputStream on which the inbound message is received.
* Any post-processing of message is done here.
*/
public InputStream getInput() {
return inputStream;
}
public Map<String, List<String>> getHeaders () {
return headers;
}
public void setHeaders (Map<String, List<String>> headers) {
this.headers = headers;
}
/**
* Write connection headers in HTTP syntax using \r\n as a
* separator.
*/
public void writeHeaders(OutputStream os) {
try {
byte[] newLine = "\r\n".getBytes("us-ascii");
// Write all headers ala HTTP (only first list entry serialized)
Map<String, List<String>> headers = getHeaders();
for (String header : headers.keySet()) {
os.write((header + ":" +
headers.get(header).get(0)).getBytes("us-ascii"));
os.write(newLine);
}
// Write empty line as in HTTP
os.write(newLine);
}
catch (Exception ex) {
throw new ClientTransportException("local.client.failed",ex);
}
}
/**
* Read and consume connection headers in HTTP syntax using
* \r\n as a separator.
*/
public void readHeaders(InputStream is) {
try {
int c1, c2;
StringBuffer line = new StringBuffer();
if (headers == null) {
headers = new HashMap<String, List<String>>();
}
else {
headers.clear();
}
// Read headers until finding a \r\n line
while ((c1 = is.read()) != -1) {
if (c1 == '\r') {
c2 = is.read();
assert c2 != -1;
if (c2 == '\n') {
String s = line.toString();
if (s.length() == 0) {
break; // found \r\n line
}
else {
int k = s.indexOf(':');
assert k > 0;
ArrayList<String> value = new ArrayList<String>();
value.add(s.substring(k + 1));
headers.put(s.substring(0, k), value);
line.setLength(0); // clear line buffer
}
}
else {
line.append((char) c1).append((char) c2);
}
}
else {
line.append((char) c1);
}
}
}
catch (Exception ex) {
throw new ClientTransportException("local.client.failed",ex);
}
}
public void closeOutput() {
try {
if (outputStream != null) {
outputStream.flush();
outputStream.close();
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
public void closeInput() {
}
public void close() {
}
}