/* * This file is part of rasdaman community. * * Rasdaman community is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Rasdaman community 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 for more details. * * You should have received a copy of the GNU General Public License * along with rasdaman community. If not, see . * * Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009 Peter Baumann / rasdaman GmbH. * * For more information please see * or contact Peter Baumann via . */ /** *********************************************************** *
 *
 * 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