.
*/
/** ***********************************************************
*
*
* PURPOSE:
*
* COMMENTS:
*
*
*********************************************************** */
package rasj.rnp;
import rasj.odmg.*;
import rasj.*;
import rasj.global.*;
import rasj.clientcommhttp.*;
import org.odmg.*;
import rasj.odmg.RasOQLQuery;
import java.io.*;
import java.net.*;
import java.lang.*;
import java.util.*;
public class RasRNPImplementation extends RnpBaseClientComm implements RasImplementationInterface, RasCommDefs,RasGlobalDefs
{
public static final int pmt_none = 0;
public static final int pmt_clientid = 1;
public static final int pmt_rErrorString = 2;
public static final int pmt_dbname = 3;
public static final int pmt_accesmode = 4;
public static final int pmt_queryString = 5;
public static final int pmt_httpqanswer = 6;
public static final int pmt_oidstring = 7;
public static final int pmt_capability = 8;
public static final int pmt_transstatus = 9;
public static final int pmt_objecttype =10;
public static final int cmd_none = 0;
public static final int cmd_connect = 1;
public static final int cmd_disconnect = 2;
public static final int cmd_opendb = 3;
public static final int cmd_closedb = 4;
public static final int cmd_beginta = 5;
public static final int cmd_committa = 6;
public static final int cmd_abortta = 7;
public static final int cmd_istaopen = 8;
public static final int cmd_queryhttp = 9;
public static final int cmd_getnewoid =10;
public static final int rasServerId = 3072002;
private String rasServer = "";
private String rasMgr = "";
private int rasMgrPort = 7001;
private String userIdentification = "rasguest:8e70a429be359b6dace8b5b2500dedb0";
private String databaseName = "";
private String capability = "dummy";
private int maxRetry = 5; // was 120; -- PB 2003-nov-20
private RasTransaction transaction = null;
private RasDatabase database = null;
private RasOQLQuery query = null;
private int accessMode = 0;
private boolean readWrite = false;
private int dbIsOpen = 0;
private int taIsOpen = 0;
private int clientID = 0;
private String errorStatus = "";
public static boolean useTurbo = true; // whenever possible pack multiple requests into one call
public RasRNPImplementation(String server)
{
super(rasServerId);
Debug.enterVerbose( "RasRNPImplementation.RasRNPImplementation start. server=" + server );
try
{
StringTokenizer t=new StringTokenizer (server,"/");
String xxx=t.nextToken();
rasMgr =t.nextToken("/:");
String portStr = t.nextToken(":");
rasMgrPort = Integer.parseInt(portStr);
}
catch(NoSuchElementException e)
{
Debug.talkCritical( "RasRNPImplementation.RasRNPImplementation: " + e.getMessage() );
Debug.leaveVerbose( "RasRNPImplementation.RasRNPImplementation done: " + e.getMessage() );
throw new RasConnectionFailedException(RasGlobalDefs.URL_FORMAT_ERROR, server);
}
Debug.leaveVerbose( "RasRNPImplementation.RasRNPImplementation done." );
} // RasRNPImplementation()
public String getErrorStatus()
{
Debug.talkSparse( "RasRNPImplementation.getErrorStatus: " + errorStatus );
return errorStatus;
}
public String getRasServer()
{
Debug.talkSparse( "RasRNPImplementation.getRasServer: " + rasServer );
return rasServer;
}
public int dbIsOpen()
{
Debug.talkSparse( "RasRNPImplementation.dbIsOpen: " + dbIsOpen );
return dbIsOpen;
}
public int getClientID()
{
Debug.talkSparse( "RasRNPImplementation.getClientID: " + clientID );
return clientID;
}
public int getAccessMode()
{
Debug.talkSparse( "RasRNPImplementation.getAccessMode: " + accessMode );
return accessMode;
}
public Transaction newTransaction()
{
transaction = new RasTransaction(this);
Debug.talkSparse( "RasRNPImplementation.newTransaction." );
return transaction;
}
public Transaction currentTransaction()
{
Debug.talkSparse( "RasRNPImplementation.currentTransaction." );
return transaction;
}
public Database newDatabase()
{
database=new RasDatabase(this);
Debug.talkSparse( "RasRNPImplementation.newDatabase." );
return database;
}
public OQLQuery newOQLQuery()
{
query=new RasOQLQuery(this);
Debug.talkSparse( "RasRNPImplementation.newOQLQuery." );
return query;
}
public DList newDList()
{
Debug.talkSparse( "RasRNPImplementation.newDList." );
return new RasList();
}
public DBag newDBag()
{
Debug.talkSparse( "RasRNPImplementation.newDBag." );
return new RasBag();
}
public DSet newDSet()
{
Debug.talkSparse( "RasRNPImplementation.newDSet." );
return new RasSet();
}
public DArray newDArray()
{
Debug.talkCritical( "RasRNPImplementation.newDArray: not yet implemented." );
throw new NotImplementedException();
}
public DMap newDMap()
{
Debug.talkCritical( "RasRNPImplementation.newDMap: not yet implemented." );
throw new NotImplementedException();
}
public Database getDatabase(Object obj)
{
Debug.talkCritical( "RasRNPImplementation.getDatabase: not yet implemented." );
throw new NotImplementedException();
}
public String getObjectId(Object obj)
{
Debug.enterVerbose( "RasRNPImplementation.getObjectId start." );
String oid = null;
if (obj instanceof RasObject)
{
RasOID roid = ((RasObject)obj).getOID();
oid = roid.toString();
if (!((RasObject)obj).getOID().isValid())
{
roid = executeGetNewObjectId();
oid = roid.toString();
((RasObject)obj).setOID(roid);
}
else
{
Debug.leaveCritical( "RasRNPImplementation.getObjectId done. not yet implemented." );
throw new NotImplementedException();
}
}
Debug.leaveVerbose( "RasRNPImplementation.getObjectId done. oid=" + oid );
return oid;
}
public void setMaxRetry(int newRetry)
{
Debug.talkVerbose( "RasRNPImplementation.setMaxRetry: setting to " + newRetry );
maxRetry = newRetry;
}
public int getMaxRetry()
{
Debug.talkVerbose( "RasRNPImplementation.getMaxRetry: is " + maxRetry );
return maxRetry;
}
public void openDB(String name, int accessMode) throws ODMGException
{
Debug.enterVerbose( "RasRNPImplementation.openDB start. db=" + name + ", accessMode=" + accessMode );
databaseName = name;
this.accessMode = accessMode;
readWrite = (accessMode != Database.OPEN_READ_ONLY) ? true:false;
getFreeServer(false); // fake server
// "turbo" doesn't work because connect delivers the client id needed for later calls
// if(useTurbo==false)
// {
executeConnect();
executeOpenDB(databaseName);
executeCloseDB();
executeDisconnect();
// }
// else executeTurboOpen(name);
dbIsOpen = 1;
Debug.leaveVerbose( "RasRNPImplementation.openDB done." );
}
public void closeDB() throws ODMGException
{
Debug.talkVerbose( "RasRNPImplementation.closeDB." );
dbIsOpen = 0;
}
public void beginTA()
{
Debug.enterVerbose( "RasRNPImplementation.beginTA start." );
if(useTurbo==false)
{
try
{
getFreeServer(true);
executeConnect();
executeOpenDB(databaseName);
executeBeginTA();
}
catch(ODMGException e)
{
errorStatus = e.getMessage();
Debug.talkCritical( "RasRNPImplementation.beginTA: " + errorStatus );
}
}
else
{
try
{
getFreeServer(true);
executeTurboBegin(databaseName);
}
catch(ODMGException e)
{
errorStatus = e.getMessage();
Debug.talkCritical( "RasRNPImplementation.beginTA: " + errorStatus );
}
}
Debug.leaveVerbose( "RasRNPImplementation.beginTA done." );
}
public boolean isOpenTA()
{
Debug.enterVerbose( "RasRNPImplementation.isOpenTA start." );
boolean result = false;
try
{
if(executeIsOpenTA()!=0)
result = true;
}
catch(ODMGException e)
{
errorStatus = e.getMessage();
Debug.talkCritical( "RasRNPImplementation.isOpenTA: " + errorStatus );
}
Debug.leaveVerbose( "RasRNPImplementation.isOpenTA done. result=" + result );
return result;
}
public void commitTA()
{
Debug.enterVerbose( "RasRNPImplementation.commitTA start." );
if(useTurbo==false)
{
try
{
executeCommitTA();
executeCloseDB();
executeDisconnect();
}
catch(ODMGException e)
{
errorStatus = e.getMessage();
Debug.talkCritical( "RasRNPImplementation.commitTA: " + errorStatus );
}
}
else
{
try
{
executeTurboCommit();
}
catch(ODMGException e)
{
errorStatus = e.getMessage();
Debug.talkCritical( "RasRNPImplementation.commitTA: " + errorStatus );
}
}
Debug.leaveVerbose( "RasRNPImplementation.commitTA done." );
}
public void abortTA()
{
Debug.enterVerbose( "RasRNPImplementation.abortTA done." );
if (useTurbo==false)
{
try
{
executeAbortTA();
executeCloseDB();
executeDisconnect();
}
catch(ODMGException e)
{
errorStatus = e.getMessage();
Debug.talkCritical( "RasRNPImplementation.abortTA: " + errorStatus );
}
}
else
{
try
{
executeTurboAbort();
}
catch(ODMGException e)
{
errorStatus = e.getMessage();
Debug.talkCritical( "RasRNPImplementation.abortTA: " + errorStatus );
}
}
Debug.leaveVerbose( "RasRNPImplementation.abortTA done." );
}
public Object queryRequest(String parameters) throws RasQueryExecutionFailedException
{
Debug.talkVerbose( "RasRNPImplementation.queryRequest." );
return executeQueryRequest(parameters);
}
private void executeTurboOpen(String name) throws ODMGException
{
Debug.enterVerbose( "RasRNPImplementation.executeTurboOpen start. name=" + name );
clientID = 0;
startMessage();
//connect
startFragment(cmd_connect);
encoder.addParameterInt32(pmt_clientid,clientID);
encoder.addParameterString(pmt_capability,capability);
endFragment();
//opendb
startFragment(cmd_opendb);
encoder.addParameterInt32(pmt_clientid,clientID);
encoder.addParameterString(pmt_dbname,name);
endFragment();
//close db
startFragment(cmd_closedb);
encoder.addParameterInt32(pmt_clientid,clientID);
endFragment();
//disconnect
startFragment(cmd_disconnect);
encoder.addParameterInt32(pmt_clientid,clientID);
endFragment();
endMessage();
//send message and receive answer
turboSendRequestGetAnswer();
// connect answer
RnpFragment fragment=decoder.getFirstFragment();
checkForError();
decoder.getFirstParameter();
clientID=decoder.getDataAsInteger();
//opendb answer
fragment=decoder.getNextFragment(fragment);
checkForError();
//closedb answer
fragment=decoder.getNextFragment(fragment);
checkForError();
//disconnect answer
decoder.getNextFragment(fragment);
checkForError();
clientID = 0;
Debug.leaveVerbose( "RasRNPImplementation.executeTurboOpen done." );
}
private void executeTurboBegin(String name) throws ODMGException
{
Debug.enterVerbose( "RasRNPImplementation.executeTurboBegin start. name=" + name );
clientID = 0;
startMessage();
//connect
startFragment(cmd_connect);
encoder.addParameterInt32(pmt_clientid,clientID);
encoder.addParameterString(pmt_capability,capability);
endFragment();
//opendb
startFragment(cmd_opendb);
encoder.addParameterInt32(pmt_clientid,clientID);
encoder.addParameterString(pmt_dbname,name);
endFragment();
// begin ta
startFragment(cmd_beginta);
encoder.addParameterInt32(pmt_clientid,clientID);
encoder.addParameterInt32(pmt_accesmode, readWrite ? 1:0);
endFragment();
endMessage();
//send message and receive answer
turboSendRequestGetAnswer();
// connect answer
RnpFragment fragment=decoder.getFirstFragment();
checkForError();
decoder.getFirstParameter();
clientID=decoder.getDataAsInteger();
//opendb answer
fragment=decoder.getNextFragment(fragment);
checkForError();
// begin ta answer
decoder.getNextFragment(fragment);
checkForError();
Debug.leaveVerbose( "RasRNPImplementation.executeTurboBegin done." );
}
private void executeTurboCommit() throws ODMGException
{
Debug.enterVerbose( "RasRNPImplementation.executeTurboCommit start." );
startMessage();
//commit
startFragment(cmd_committa);
encoder.addParameterInt32(pmt_clientid,clientID);
endFragment();
//close
startFragment(cmd_closedb);
encoder.addParameterInt32(pmt_clientid,clientID);
endFragment();
//disconnect
startFragment(cmd_disconnect);
encoder.addParameterInt32(pmt_clientid,clientID);
endFragment();
endMessage();
//send message and receive answer
turboSendRequestGetAnswer();
//commit answer
RnpFragment fragment=decoder.getFirstFragment();
checkForError();
//close answer
fragment=decoder.getNextFragment(fragment);
checkForError();
//disconnect answer
decoder.getNextFragment(fragment);
checkForError();
clientID = 0;
Debug.leaveVerbose( "RasRNPImplementation.executeTurboCommit done." );
}
private void executeTurboAbort() throws ODMGException
{
Debug.enterVerbose( "RasRNPImplementation.executeTurboAbort start." );
startMessage();
//abort
startFragment(cmd_abortta);
encoder.addParameterInt32(pmt_clientid,clientID);
endFragment();
//close
startFragment(cmd_closedb);
encoder.addParameterInt32(pmt_clientid,clientID);
endFragment();
//disconnect
startFragment(cmd_disconnect);
encoder.addParameterInt32(pmt_clientid,clientID);
endFragment();
endMessage();
//send message and receive answer
turboSendRequestGetAnswer();
//abort answer
RnpFragment fragment=decoder.getFirstFragment();
checkForError();
//close answer
fragment=decoder.getNextFragment(fragment);
checkForError();
//disconnect answer
decoder.getNextFragment(fragment);
checkForError();
clientID = 0;
Debug.leaveVerbose( "RasRNPImplementation.executeTurboAbort done." );
}
private RasOID executeGetNewObjectId()
{
Debug.enterVerbose( "RasRNPImplementation.executeGetNewObjectId start." );
startRequest(cmd_getnewoid);
encoder.addParameterInt32(pmt_clientid,clientID);
encoder.addParameterInt32(pmt_objecttype,1);
sendRequestGetAnswer();
decoder.getFirstParameter();
RasOID result = new RasOID(decoder.getDataAsString());
Debug.leaveVerbose( "RasRNPImplementation.executeGetNewObjectId done." );
return result;
}
private int executeIsOpenTA()throws ODMGException
{
startRequest(cmd_istaopen);
encoder.addParameterInt32(pmt_clientid,clientID);
sendRequestGetAnswer();
decoder.getFirstParameter();
int result = decoder.getDataAsInteger();
Debug.leaveVerbose( "RasRNPImplementation.executeIsOpenTA done. result=" + result );
return result;
}
//######## These functions are kept only for testing purpose, we will emove them soon ####
private void executeConnect() throws ODMGException
{
startRequest(cmd_connect);
encoder.addParameterInt32(pmt_clientid,clientID);
encoder.addParameterString(pmt_capability,capability);
sendRequestGetAnswer();
checkForError();
decoder.getFirstParameter();
clientID=decoder.getDataAsInteger();
}
private void executeDisconnect() throws ODMGException
{
startRequest(cmd_disconnect);
encoder.addParameterInt32(pmt_clientid,clientID);
sendRequestGetAnswer();
checkForError();
}
private void executeOpenDB(String name) throws ODMGException
{
startRequest(cmd_opendb);
encoder.addParameterInt32(pmt_clientid,clientID);
encoder.addParameterString(pmt_dbname,name);
sendRequestGetAnswer();
checkForError();
}
private void executeCloseDB() throws ODMGException
{
startRequest(cmd_closedb);
encoder.addParameterInt32(pmt_clientid,clientID);
sendRequestGetAnswer();
checkForError();
}
private void executeBeginTA() throws ODMGException
{
startRequest(cmd_beginta);
encoder.addParameterInt32(pmt_clientid,clientID);
encoder.addParameterInt32(pmt_accesmode, readWrite ? 1:0);
sendRequestGetAnswer();
checkForError();
}
private void executeCommitTA()throws ODMGException
{
startRequest(cmd_committa);
encoder.addParameterInt32(pmt_clientid,clientID);
sendRequestGetAnswer();
checkForError();
}
private void executeAbortTA()throws ODMGException
{
startRequest(cmd_abortta);
encoder.addParameterInt32(pmt_clientid,clientID);
sendRequestGetAnswer();
checkForError();
}
//################################################################################
public void getFreeServer(boolean realServer)throws RasQueryExecutionFailedException, RasConnectionFailedException
{
Debug.enterVerbose( "RasRNPImplementation.getFreeServer start. realServer=" + realServer );
String uniqueID = uniqueRequestID();
for (int retryCount = 0; ;retryCount++)
{
try
{
executeGetFreeServer(realServer,uniqueID);
break;
}
catch(RasConnectionFailedException e)
{
int errno = e.getErrorNo();
// FIXME: adapt algorithm to that of http, see RasODMGImplementation.java
if ( ( errno==RasGlobalDefs.MANAGER_BUSY
// || errno==RasGlobalDefs.NO_ACTIVE_SERVERS // if server doesn't run waiting won't help -- PB 2003-nov-20
|| errno==RasGlobalDefs.WRITE_TRANS_IN_PROGRESS)
&& retryCount < maxRetry)
{
int millisec = 50 * retryCount + 50;
if(millisec > 1000)
millisec = 1000;
Debug.talkVerbose( "RasRNPImplementation.getFreeServer: retry #" + retryCount + ", sleeping " + millisec + "msecs" );
try
{
Thread.sleep(millisec);
}
catch(InterruptedException intex)
{
// wake up
}
}
else
{
Debug.talkCritical( "RasRNPImplementation.getFreeServer: " + e.getMessage() );
Debug.leaveVerbose( "RasRNPImplementation.getFreeServer done: " + e.getMessage() );
throw(e);
}
} // catch
} // for
Debug.leaveVerbose( "RasRNPImplementation.getFreeServer done." );
} // getFreeServer
private void executeGetFreeServer(boolean realServer, String uniqueID)
throws RasQueryExecutionFailedException, RasConnectionFailedException
{
Debug.enterVerbose( "RasRNPImplementation.executeGetFreeServer start. realServer=" + realServer + ", uniqueID=" + uniqueID );
try
{
Debug.talkVerbose( "RasRNPImplementation.executeGetFreeServer: rasmgr=" + rasMgr + ", port=" + rasMgrPort );
Socket socket = new Socket(rasMgr,rasMgrPort);
Debug.talkVerbose( "RasRNPImplementation.executeGetFreeServer: socket=" + socket );
PrintStream ps = new PrintStream(socket.getOutputStream());
String accessFlag = (accessMode == Database.OPEN_READ_ONLY ? "ro":"rw");
String body = databaseName + " RNP " + accessFlag + ' ' + uniqueID + " \0";
if (realServer)
ps.print("POST getfreeserver RNP/1.1\r\nAccept: text/plain\r\nContent-type: text/plain\r\n"
+ "User-Agent: RasDaMan Java Client1.0\r\nAuthorization: ras " + userIdentification
+ "\r\nContent length: " + body.length()+"\r\n\r\n" + body);
else
ps.print("POST getfreeserver2 RNP/1.1\r\nAccept: text/plain\r\nContent-type: text/plain\r\n"
+ "User-Agent: RasDaMan Java Client1.0\r\nAuthorization: ras " + userIdentification
+ "\r\nContent length: " + body.length()+"\r\n\r\n" + body);
ps.flush();
BufferedReader ds = new BufferedReader(new InputStreamReader(socket.getInputStream()));
int resultCode = getResultCode(ds);
String bodyLine = getBodyLine(ds);
Debug.talkVerbose( "RasRNPImplementation.executeGetFreeServer: bodyLine: " + bodyLine );
ps.close();
ds.close();
socket.close();
Debug.talkVerbose( "RasRNPImplementation.executeGetFreeServer: socket closed: " + socket );
if (resultCode==200)
{
StringTokenizer t=new StringTokenizer(bodyLine," ");
String host=t.nextToken();
String port=t.nextToken(" ");
capability=t.nextToken(" \t\r\n\0");
rasServer="http://" + host + ":" + port;
setConnectionParameters(host,Integer.parseInt(port));
}
else
{
StringTokenizer t=new StringTokenizer(bodyLine," ");
String errorStr = t.nextToken();
int errorCode = Integer.parseInt(errorStr);
if( resultCode < 1000 )
{
Debug.talkCritical( "RasRNPImplementation.executeGetFreeServer: " + errorCode );
Debug.leaveVerbose( "RasRNPImplementation.executeGetFreeServer: done. errorcode=" + errorCode );
throw new RasConnectionFailedException(errorCode,null);
}
else
{
Debug.talkCritical( "RasRNPImplementation.executeGetFreeServer: " + errorCode );
Debug.leaveVerbose( "RasRNPImplementation.executeGetFreeServer: done. errorcode=" + errorCode );
throw new RasConnectionFailedException(RasGlobalDefs.REQUEST_FORMAT_ERROR," code=" + errorCode);
}
}
}
catch(MalformedURLException e)
{
Debug.talkCritical( "RasRNPImplementation.executeGetFreeServer: " + e.getMessage() );
Debug.leaveVerbose( "RasRNPImplementation.executeGetFreeServer: done. " + e.getMessage() );
throw new RasConnectionFailedException(RasGlobalDefs.MANAGER_CONN_FAILED,rasMgr);
}
catch(IOException e)
{
Debug.talkCritical( "RasRNPImplementation.executeGetFreeServer: " + e.getMessage() );
Debug.leaveVerbose( "RasRNPImplementation.executeGetFreeServer: done. " + e.getMessage() );
throw new RasClientInternalException("RasODMGImplementation","getFreeServer()",e.getMessage());
}
catch(NumberFormatException e)
{
Debug.talkCritical( "RasRNPImplementation.executeGetFreeServer: cannot decode integer: " + e.getMessage() );
Debug.leaveVerbose( "RasRNPImplementation.executeGetFreeServer: done. " + e.getMessage() );
throw new RasClientInternalException("RasODMGImplementation","getFreeServer()",e.getMessage());
}
Debug.leaveVerbose( "RasRNPImplementation.executeGetFreeServer done." );
}
public int getResultCode(BufferedReader ds) throws IOException
{
Debug.enterVerbose( "RasRNPImplementation.getResultCode: start." );
String s = ds.readLine();
StringTokenizer t = new StringTokenizer(s," ");
String http = t.nextToken(); // FIXME: never used
String resultString = t.nextToken(" ");
int result = 0;
try
{
result = Integer.parseInt(resultString);
}
catch(NumberFormatException e)
{
Debug.talkCritical( "RasRNPImplementation.getResultCode: cannot decode integer: " + e.getMessage() );
result = 0; // FIXME: set to some real error code
}
Debug.leaveVerbose( "RasRNPImplementation.getResultCode: done. result=" + result );
return result;
}
public String getBodyLine(BufferedReader ds)throws IOException
{
Debug.enterVerbose( "RasRNPImplementation.getBodyLine: start." );
// obviously we are searching for what follows an empty line:
for(;;)
{
String s=ds.readLine();
if(s==null)
{
Debug.talkCritical( "RasRNPImplementation.getBodyLine: done. Unexpected EOF in rasmgr answer." );
Debug.leaveVerbose( "RasRNPImplementation.getBodyLine: done, with eof exception." );
throw new IOException("Unexpected EOF in rasmgr answer.");
}
if(s.length()==0)
break;
}
String result = ds.readLine();
Debug.leaveVerbose( "RasRNPImplementation.getBodyLine: done. result=" + result );
return result;
}
private Object executeQueryRequest(String parameters) throws RasQueryExecutionFailedException
{
Debug.enterVerbose( "RasRNPImplementation.executeQueryRequest: start. parameters=" + parameters );
startRequest(cmd_queryhttp);
encoder.addParameterInt32(pmt_clientid,clientID);
try
{
encoder.addParameterOpaque(pmt_queryString,parameters.getBytes("8859_1"));
}
catch(UnsupportedEncodingException e)
{
Debug.talkCritical( "RasRNPImplementation.executeQueryRequest: " + e.getMessage() );
Debug.leaveVerbose( "RasRNPImplementation.executeQueryRequest: done, " + e.getMessage() );
throw new RasClientInternalException("RasRNPImplementation","executeQueryRequest()",e.getMessage());
}
sendRequestGetAnswer();
checkForError();
decoder.getFirstParameter();
Object result= getResponse(decoder.getDataOpaque());
Debug.leaveVerbose( "RasRNPImplementation.executeQueryRequest: done. result=" + result );
return result;
}
private Object getResponse(byte[] opaqueAnswer)
throws RasQueryExecutionFailedException
{
Debug.enterVerbose( "RasRNPImplementation.getResponse: start." );
Object result=null;
DataInputStream in =new DataInputStream(new ByteArrayInputStream(opaqueAnswer));
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;
try
{
in.read(b1);
int resultType = b1[0];
switch( resultType )
{
case RESPONSE_OK:
case RESPONSE_OK_NEGATIVE:
//Nothing todo
break;
// +++++++++++++++++++++++++++++++++++++++++++++++++
case RESPONSE_MDDS:
// read Endianess
while(in.read(b1) == 0);
endianess = b1[0];
// read Collection Type
collType = RasUtils.readString(in);
// read NumberOfResults
while(in.available() < 4);
in.read(b4);
numberOfResults = RasUtils.ubytesToInt(b4,endianess);
// 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++)
{
//read mddBaseType
mddBaseType = RasUtils.readString(in);
// read spatialDomain
domain = RasUtils.readString(in);
// read OID
oid = RasUtils.readString(in);
roid = new RasOID(oid);
// read size of binData
while(in.available() < 4);
in.read(b4);
dataSize = RasUtils.ubytesToInt(b4,endianess);
// read binData
binData = new byte[dataSize];
readBytes = 0;
readBytesTmp = 0;
while( (readBytesTmp != -1) && (readBytes < dataSize) )
{
readBytesTmp = in.read(binData,readBytes,dataSize-readBytes);
readBytes += readBytesTmp;
}
RasType rType = RasType.getAnyType(mddBaseType);
RasBaseType rb = null;
if(rType.getClass().getName().equals("rasj.RasMArrayType"))
{
RasMArrayType tmp = (RasMArrayType)rType;
rb = tmp.getBaseType();
}
else
{
Debug.talkCritical( "RasRNPImplementation.getResponse: collection element is no MArray." );
Debug.leaveVerbose( "RasRNPImplementation.getResponse: done, with exception." );
throw new RasClientInternalException("RasHttpRequest","execute()","element of MDD Collection is no MArray");
}
if(rb.isBaseType())
{
if(rb.isStructType())
{
RasStructureType sType = (RasStructureType)rb;
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;
switch(pType.getTypeID())
{
case RAS_BOOLEAN:
case RAS_BYTE:
case RAS_CHAR:
res = new RasMArrayByte(new RasMInterval(domain));
break;
case RAS_SHORT:
res = new RasMArrayShort(new RasMInterval(domain));
break;
case RAS_USHORT:
byte[] tmData = new byte[dataSize*2];
for(int i=0;i