* * PURPOSE: * * * COMMENTS: * - not part of the standard systemtest, because it does not use std * interface but copies internal ras/clientcomm code ************************************************************ */ import rasj.*; import rasj.odmg.*; import org.odmg.*; import rasj.global.*; import java.io.*; import java.util.*; import java.lang.*; import java.net.*; import rasj.clientcommhttp.*; /** * This class handles a HTTP-request to the RasDaMan server. * The specified RasDaMan server is contacted, the specified command is sent to * the server, and the result of the query is retrieved and stored in a byte array. * The specification of the communication protocol is given below. *
*
* @version $Revision: 1.1 $
*/
public class TestHttp implements RasCommDefs, RasGlobalDefs
{
static final String rcsid = "@(#)Package rasj.test, class TestHttp: $Header: /home/rasdev/CVS-repository/rasdaman/java/rasj/test/TestHttp.java,v 1.1 2003/12/19 16:05:43 rasdev Exp $";
/**
* The type of this client
*/
private String client = "RASCLIENT";
/**
* The result type ( MDD Collection, Skalar Collection, Error, Integer ). This field is set
* automatically when a query has been executed, so there's no setResultType method.
*/
private static byte resultType = 0;
/**
* The result of the query
**/
private static Object result = null;
/**
* This method sends a query to the RasDaMan Server and retrieves the results.
*
* @param con server connection
* @param parameters the parameters for the request as name/value pairs (for example "clientID=4354351&queryString=select img from test")
*/
public static void execute( String serverURL, String parameters )
throws RasQueryExecutionFailedException, RasConnectionFailedException
{
System.out.println( "RasHttpRequest.execute: start. parameters=" + parameters );
BenchmarkTimer httpTimer = new BenchmarkTimer("httpRequest direct");
BenchmarkTimer rcvTimer = new BenchmarkTimer("receive direct");
try
{
URL url = new URL( serverURL );
System.out.println( "RasHttpRequest.execute: sending to " + url + " POST request=" + parameters );
httpTimer.startTimer();
BenchmarkTimer sendTimer = new BenchmarkTimer("send direct");
sendTimer.startTimer();
// Send the query
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setRequestProperty("Content-type","application/octet-stream");
con.setRequestProperty("User-Agent","RasDaMan Java Client");
con.setRequestProperty("Version","1.0");
con.setRequestMethod("POST");
con.setDoInput(true);
con.setDoOutput(true);
con.setUseCaches(false);
OutputStreamWriter out = new OutputStreamWriter(con.getOutputStream(),"8859_1");
out.write(parameters,0,parameters.length());
out.flush();
out.close();
sendTimer.stopTimer();
sendTimer.print();
rcvTimer.startTimer();
// Read response
BenchmarkTimer getInputTimer = new BenchmarkTimer("getInputStream direct");
getInputTimer.startTimer();
DataInputStream in = new DataInputStream(con.getInputStream());
System.out.println("RasHttpRequest.execute: received " + in );
getInputTimer.stopTimer();
getInputTimer.print();
// read binData
// binData = new byte[dataSize];
// readBytes = 0;
// readBytesTmp = 0;
// while( (readBytesTmp != -1) && (readBytes < dataSize) )
// {
// readBytesTmp = in.read(binData,readBytes,dataSize-readBytes);
// readBytes += readBytesTmp;
// System.out.println("Read " + readBytesTmp +" Bytes:" + binData);
// }
// in.close();
// con.disconnect();
/* variables for later use */
byte[] b1 = new byte[1];
byte[] b4 = new byte[4];
byte endianess = 0;
String collType = null;
int numberOfResults = 0;
int dataSize = 0;
byte[] binData = null;
int readBytes = 0;
int readBytesTmp = 0;
DBag resultBag;
RasGMArray res = null;
in.read(b1);
resultType = b1[0];
Debug.talkVerbose("RasHttpRequest.execute: resultType=" + resultType );
switch( resultType )
{
case RESPONSE_OK:
case RESPONSE_OK_NEGATIVE:
//Nothing todo
break;
// +++++++++++++++++++++++++++++++++++++++++++++++++
case RESPONSE_MDDS:
Debug.talkVerbose("RasHttpRequest.execute: result type is MDD." );
// read Endianess
while(in.read(b1) == 0)
;
endianess = b1[0];
// read Collection Type
collType = RasUtils.readString(in);
Debug.talkVerbose("RasHttpRequest.execute: colltype=" + collType);
// read NumberOfResults
while(in.available() < 4)
;
in.read(b4);
numberOfResults = RasUtils.ubytesToInt(b4,endianess);
Debug.talkVerbose("RasHttpRequest.execute: number of results: " + numberOfResults);
// Initialize return-set and parameters
resultBag = new RasBag();
String mddBaseType = null;
String domain = null;
String oid = "";
RasOID roid = null;
// do this for each result
for(int x = 0; x < numberOfResults; x++)
{
Debug.talkVerbose("RasHttpRequest.execute: handling result #" + (x+1) );
//read mddBaseType
mddBaseType = RasUtils.readString(in);
// read spatialDomain
domain = RasUtils.readString(in);
// read OID
oid = RasUtils.readString(in);
//System.err.println("OID is " + oid);
roid = new RasOID(oid);
// read size of binData
while(in.available() < 4)
;
in.read(b4);
dataSize = RasUtils.ubytesToInt(b4,endianess);
Debug.talkVerbose("RasHttpRequest.execute: mddBaseType is " + mddBaseType + ", spatialDomain=" + domain + ", size of BinData=" + dataSize );
// read binData
binData = new byte[dataSize];
readBytes = 0;
readBytesTmp = 0;
while( (readBytesTmp != -1) && (readBytes < dataSize) )
{
readBytesTmp = in.read(binData,readBytes,dataSize-readBytes);
readBytes += readBytesTmp;
}
Debug.talkVerbose("RasHttpRequest.execute: read " + readBytes + " bytes.");
RasType rType = RasType.getAnyType(mddBaseType);
//System.out.println(rType);
RasBaseType rb = null;
if(rType.getClass().getName().equals("rasj.RasMArrayType"))
{
RasMArrayType tmp = (RasMArrayType)rType;
rb = tmp.getBaseType();
}
else
{
Debug.talkCritical("RasHttpRequest.execute: exception: element of MDD Collection is no MArray" );
throw new RasClientInternalException("RasHttpRequest","execute()","element of MDD Collection is no MArray");
}
if(rb.isBaseType())
{
if(rb.isStructType())
{
// It is a structType
//System.err.println("It is a structType");
RasStructureType sType = (RasStructureType)rb;
//System.out.println(sType);
res = new RasGMArray(new RasMInterval(domain), 0);
res.setTypeLength(rb.getSize());
res.setArraySize(dataSize);
res.setArray(binData);
//insert into result set
resultBag.add(res);
break;
} else
{
// It is a primitiveType
RasPrimitiveType pType = (RasPrimitiveType)rb;
//System.err.println("It's a primitive type: " + pType);
switch(pType.getTypeID())
{
case RAS_BOOLEAN:
case RAS_BYTE:
case RAS_CHAR:
//System.err.println("It's a byte array!");
res = new RasMArrayByte(new RasMInterval(domain));
break;
case RAS_SHORT:
//System.err.println("It's a short array!");
res = new RasMArrayShort(new RasMInterval(domain));
break;
case RAS_USHORT:
//System.err.println("It's a ushort array!");
byte[] tmData = new byte[dataSize*2];
for(int i=0;i