001: package org.mandarax.jdbc.client.http;
002:
003: /*
004: * Copyright (C) 1999-2004 <a href="mailto:mandarax@jbdietrich.com">Jens Dietrich</a>
005: *
006: * This library is free software; you can redistribute it and/or
007: * modify it under the terms of the GNU Lesser General Public
008: * License as published by the Free Software Foundation; either
009: * version 2 of the License, or (at your option) any later version.
010: *
011: * This library is distributed in the hope that it will be useful,
012: * but WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: * Lesser General Public License for more details.
015: *
016: * You should have received a copy of the GNU Lesser General Public
017: * License along with this library; if not, write to the Free Software
018: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
019: */
020:
021: import java.io.*;
022:
023: import org.mandarax.jdbc.JDBCUtils;
024: import org.mandarax.jdbc.rpc.*;
025: import org.apache.commons.httpclient.*;
026: import org.apache.commons.httpclient.methods.*;
027:
028: /**
029: * A transport implementation based on http.
030: * @author <A HREF="mailto:mandarax@jbdietrich.com">Jens Dietrich</A>
031: * @version 3.3.2 <29 December 2004>
032: * @since 3.0
033: */
034: public class HttpTransport implements Transport {
035: private Serializer serializer = new XMLSerializer();
036: private String url = null;
037: private String serverUrl = null;
038: HttpClient client = new HttpClient();
039:
040: /**
041: * Constructor.
042: * @param url the url of the server (like http://localhost/mandarax/jdbcserver - this url must be mapped to the server servlet)
043: */
044: public HttpTransport(String url) throws IOException {
045: super ();
046: this .url = url;
047: serverUrl = JDBCUtils.getServerPart(url);
048: if (serverUrl == null)
049: throw new IOException(
050: "Cannot extract server address from url " + url
051: + " , check syntax");
052: }
053:
054: /**
055: * Invoke a call.
056: * @param call a call
057: * @throws CallException
058: * @throws java.io.IOException
059: */
060: public Object perform(Call call, String url) throws CallException {
061: try {
062: // create a new post method
063: // when trying to re-use one method (and recycling it) the cookie is
064: // rejected and we cannot keep the session
065: // TODO more research - this would certainly improve the performance
066: PostMethod post = new PostMethod(url);
067:
068: // serialize, use a byte buffer
069: ByteArrayOutputStream out = new ByteArrayOutputStream();
070: serializer.write(call, out);
071: out.close();
072:
073: // set body using an input stream
074: byte[] data = out.toByteArray();
075: InputStream in = new ByteArrayInputStream(data);
076: post.setRequestHeader("Content-type", serializer
077: .getContentType());
078: post.setRequestBody(in);
079:
080: int response = client.executeMethod(post);
081: String responseAsString = String.valueOf(response);
082: // check response codes - 200 ok
083: if (!responseAsString.startsWith("2")) {
084: if (responseAsString.startsWith("3")) {
085: // 300 code - try redirect
086: String redirectLocation;
087: Header locationHeader = post
088: .getResponseHeader("location");
089: if (locationHeader != null) {
090: redirectLocation = locationHeader.getValue();
091: return perform(call, redirectLocation);
092: } else {
093: throw new CallException(
094: "Cannot find redirect location in header");
095: }
096: } else
097: throw new CallException("Http exception "
098: + response + " - "
099: + HttpStatus.getStatusText(response));
100: }
101: in = post.getResponseBodyAsStream();
102: CallResult receivedResult = (CallResult) serializer
103: .read(in);
104: in.close();
105: post.releaseConnection();
106:
107: if (receivedResult instanceof ExceptionResult) {
108: throw new CallException(
109: ((ExceptionResult) receivedResult).getMessage());
110: } else if (receivedResult instanceof ReturnValue) {
111: return ((ReturnValue) receivedResult).getValue();
112: }
113: return null;
114:
115: } catch (IOException x) {
116: throw new CallException(x.getMessage());
117: }
118: }
119:
120: /**
121: * Invoke a call.
122: * @param call a call
123: * @throws CallException
124: * @throws java.io.IOException
125: */
126: public Object perform(Call call) throws CallException {
127: return perform(call, serverUrl);
128: }
129:
130: }
|