From 8f27e65bddd7d4b8515ce620fb485fdd78fcdf89 Mon Sep 17 00:00:00 2001 From: Constantin Jucovschi Date: Fri, 24 Apr 2009 07:20:22 -0400 Subject: Initial commit --- java/rasj/rnp/MD5.class | Bin 0 -> 7543 bytes java/rasj/rnp/MD5State.class | Bin 0 -> 791 bytes java/rasj/rnp/Makefile | 61 ++ java/rasj/rnp/Makefile.dep | 0 java/rasj/rnp/ParameterDouble64.class | Bin 0 -> 1595 bytes java/rasj/rnp/ParameterFloat32.class | Bin 0 -> 1590 bytes java/rasj/rnp/ParameterInt32.class | Bin 0 -> 1578 bytes java/rasj/rnp/ParameterOpaque.class | Bin 0 -> 1876 bytes java/rasj/rnp/ParameterString.class | Bin 0 -> 1959 bytes java/rasj/rnp/RasRNPImplementation.class | Bin 0 -> 30295 bytes java/rasj/rnp/RasRNPImplementation.java | 1761 ++++++++++++++++++++++++++++++ java/rasj/rnp/Rnp.class | Bin 0 -> 668 bytes java/rasj/rnp/Rnp.java | 54 + java/rasj/rnp/RnpBaseClientComm.class | Bin 0 -> 6519 bytes java/rasj/rnp/RnpBaseClientComm.java | 207 ++++ java/rasj/rnp/RnpDecoder.class | Bin 0 -> 3851 bytes java/rasj/rnp/RnpDecoder.java | 170 +++ java/rasj/rnp/RnpEncoder.class | Bin 0 -> 2439 bytes java/rasj/rnp/RnpEncoder.java | 102 ++ java/rasj/rnp/RnpException.class | Bin 0 -> 340 bytes java/rasj/rnp/RnpException.java | 44 + java/rasj/rnp/RnpFragment.class | Bin 0 -> 3779 bytes java/rasj/rnp/RnpFragment.java | 152 +++ java/rasj/rnp/RnpFragmentHeader.class | Bin 0 -> 1899 bytes java/rasj/rnp/RnpFragmentHeader.java | 93 ++ java/rasj/rnp/RnpMessage.class | Bin 0 -> 1902 bytes java/rasj/rnp/RnpMessage.java | 83 ++ java/rasj/rnp/RnpMessageHeader.class | Bin 0 -> 2701 bytes java/rasj/rnp/RnpMessageHeader.java | 150 +++ java/rasj/rnp/RnpParameter.class | Bin 0 -> 2965 bytes java/rasj/rnp/RnpParameter.java | 325 ++++++ java/rasj/rnp/test/Client.java | 104 ++ 32 files changed, 3306 insertions(+) create mode 100644 java/rasj/rnp/MD5.class create mode 100644 java/rasj/rnp/MD5State.class create mode 100644 java/rasj/rnp/Makefile create mode 100644 java/rasj/rnp/Makefile.dep create mode 100644 java/rasj/rnp/ParameterDouble64.class create mode 100644 java/rasj/rnp/ParameterFloat32.class create mode 100644 java/rasj/rnp/ParameterInt32.class create mode 100644 java/rasj/rnp/ParameterOpaque.class create mode 100644 java/rasj/rnp/ParameterString.class create mode 100644 java/rasj/rnp/RasRNPImplementation.class create mode 100644 java/rasj/rnp/RasRNPImplementation.java create mode 100644 java/rasj/rnp/Rnp.class create mode 100644 java/rasj/rnp/Rnp.java create mode 100644 java/rasj/rnp/RnpBaseClientComm.class create mode 100644 java/rasj/rnp/RnpBaseClientComm.java create mode 100644 java/rasj/rnp/RnpDecoder.class create mode 100644 java/rasj/rnp/RnpDecoder.java create mode 100644 java/rasj/rnp/RnpEncoder.class create mode 100644 java/rasj/rnp/RnpEncoder.java create mode 100644 java/rasj/rnp/RnpException.class create mode 100644 java/rasj/rnp/RnpException.java create mode 100644 java/rasj/rnp/RnpFragment.class create mode 100644 java/rasj/rnp/RnpFragment.java create mode 100644 java/rasj/rnp/RnpFragmentHeader.class create mode 100644 java/rasj/rnp/RnpFragmentHeader.java create mode 100644 java/rasj/rnp/RnpMessage.class create mode 100644 java/rasj/rnp/RnpMessage.java create mode 100644 java/rasj/rnp/RnpMessageHeader.class create mode 100644 java/rasj/rnp/RnpMessageHeader.java create mode 100644 java/rasj/rnp/RnpParameter.class create mode 100644 java/rasj/rnp/RnpParameter.java create mode 100644 java/rasj/rnp/test/Client.java (limited to 'java/rasj/rnp') diff --git a/java/rasj/rnp/MD5.class b/java/rasj/rnp/MD5.class new file mode 100644 index 0000000..03ef314 Binary files /dev/null and b/java/rasj/rnp/MD5.class differ diff --git a/java/rasj/rnp/MD5State.class b/java/rasj/rnp/MD5State.class new file mode 100644 index 0000000..0feea29 Binary files /dev/null and b/java/rasj/rnp/MD5State.class differ diff --git a/java/rasj/rnp/Makefile b/java/rasj/rnp/Makefile new file mode 100644 index 0000000..8597847 --- /dev/null +++ b/java/rasj/rnp/Makefile @@ -0,0 +1,61 @@ +# -*-Makefile-*- (for Emacs) +# +# 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 . # Top Level makefile. This points to the various modules that have to be build +# and/or deployed +# +# MAKEFILE FOR: +# package rasj/odmg +# +# COMMENTS: +# +################################################################## +######################### Definitions ############################ + +# standard include with general options +include $(RMANBASE)/Makefile.inc + +SRCS = RasRNPImplementation.java Rnp.java RnpBaseClientComm.java \ + RnpDecoder.java RnpEncoder.java RnpException.java RnpFragment.java\ + RnpFragmentHeader.java RnpMessage.java RnpMessageHeader.java \ + RnpParameter.java +OBJS = ${SRCS:%.java=%.class} +MISCCLEAN = *.class + +# directory where HTML documentation is created +DOCDIR := $(DOCBASE)/java/rasj/odmg + +########################### Targets ############################## + +# compile everything +.PHONY : all +all: $(OBJS) + +# delete all files +empty: + -rm -f $(SRCS) $(MISCCLEAN) + +############################ Dependencies ####################### + +# general rules +include $(RMANBASE)/Makefile.rel + + diff --git a/java/rasj/rnp/Makefile.dep b/java/rasj/rnp/Makefile.dep new file mode 100644 index 0000000..e69de29 diff --git a/java/rasj/rnp/ParameterDouble64.class b/java/rasj/rnp/ParameterDouble64.class new file mode 100644 index 0000000..3e9136b Binary files /dev/null and b/java/rasj/rnp/ParameterDouble64.class differ diff --git a/java/rasj/rnp/ParameterFloat32.class b/java/rasj/rnp/ParameterFloat32.class new file mode 100644 index 0000000..d231c42 Binary files /dev/null and b/java/rasj/rnp/ParameterFloat32.class differ diff --git a/java/rasj/rnp/ParameterInt32.class b/java/rasj/rnp/ParameterInt32.class new file mode 100644 index 0000000..40874de Binary files /dev/null and b/java/rasj/rnp/ParameterInt32.class differ diff --git a/java/rasj/rnp/ParameterOpaque.class b/java/rasj/rnp/ParameterOpaque.class new file mode 100644 index 0000000..df732e9 Binary files /dev/null and b/java/rasj/rnp/ParameterOpaque.class differ diff --git a/java/rasj/rnp/ParameterString.class b/java/rasj/rnp/ParameterString.class new file mode 100644 index 0000000..98dd4c3 Binary files /dev/null and b/java/rasj/rnp/ParameterString.class differ diff --git a/java/rasj/rnp/RasRNPImplementation.class b/java/rasj/rnp/RasRNPImplementation.class new file mode 100644 index 0000000..913fa64 Binary files /dev/null and b/java/rasj/rnp/RasRNPImplementation.class differ diff --git a/java/rasj/rnp/RasRNPImplementation.java b/java/rasj/rnp/RasRNPImplementation.java new file mode 100644 index 0000000..23baac2 --- /dev/null +++ b/java/rasj/rnp/RasRNPImplementation.java @@ -0,0 +1,1761 @@ +/* +* 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. +* +* 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 java.io.*; + +public class Rnp + { + public static final int rnpProtocolId = 0xc12d7f01; // this is swap(25112001); + + public static final int fgt_None = 0; + public static final int fgt_Command = 1; + public static final int fgt_OkAnswer = 2; + public static final int fgt_Error = 3; + public static final int fgt_DiscardedRequest = 4; + + public static final int dtt_None = 0; + public static final int dtt_Asciiz = 1; + public static final int dtt_Int32 = 2; + public static final int dtt_Float32 = 3; + public static final int dtt_Double64 = 4; + public static final int dtt_Opaque = 5; + } + diff --git a/java/rasj/rnp/RnpBaseClientComm.class b/java/rasj/rnp/RnpBaseClientComm.class new file mode 100644 index 0000000..0849f81 Binary files /dev/null and b/java/rasj/rnp/RnpBaseClientComm.class differ diff --git a/java/rasj/rnp/RnpBaseClientComm.java b/java/rasj/rnp/RnpBaseClientComm.java new file mode 100644 index 0000000..1da636f --- /dev/null +++ b/java/rasj/rnp/RnpBaseClientComm.java @@ -0,0 +1,207 @@ +/* +* 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.*; +import rasj.global.*; +import java.io.*; +import java.net.*; + + +public class RnpBaseClientComm + { + RnpEncoder encoder; + RnpDecoder decoder; + int serverID; + String rasServerHost; + int rasServerPort; + + public RnpBaseClientComm(int serverType) + { + Debug.enterVerbose( "RnpBaseClientComm.RnpBaseClientComm: start. serverType=" + serverType ); + encoder = new RnpEncoder(); + serverID = serverType; + Debug.leaveVerbose( "RnpBaseClientComm.RnpBaseClientComm: done." ); + } + + public void setConnectionParameters(String s, int p) + { + Debug.enterVerbose( "RnpBaseClientComm.setConnectionParameters: start. server=" + s + ", port=" + p ); + rasServerHost = s; + rasServerPort = p; + Debug.leaveVerbose( "RnpBaseClientComm.setConnectionParameters: done." ); + } + + public void startRequest(int commandCode) + { + Debug.enterVerbose( "RnpBaseClientComm.startRequest: start. cmdCode=" + commandCode ); + encoder.startMessage(serverID); + encoder.startFragment(Rnp.fgt_Command,commandCode); + Debug.leaveVerbose( "RnpBaseClientComm.startRequest: done." ); + } + + public void startMessage() + { + Debug.enterVerbose( "RnpBaseClientComm.startMessage: start." ); + encoder.startMessage(serverID); + Debug.leaveVerbose( "RnpBaseClientComm.startMessage: done." ); + } + + public void startFragment(int commandCode) + { + Debug.enterVerbose( "RnpBaseClientComm.startFragment: start. cmdCode=" + commandCode ); + encoder.startFragment(Rnp.fgt_Command,commandCode); + Debug.leaveVerbose( "RnpBaseClientComm.startFragment: done." ); + } + + public void endFragment() + { + Debug.enterVerbose( "RnpBaseClientComm.endFragment: start." ); + encoder.endFragment(); + Debug.leaveVerbose( "RnpBaseClientComm.endFragment: done." ); + } + + public void endMessage() + { + Debug.enterVerbose( "RnpBaseClientComm.endMessage: start." ); + encoder.endMessage(); + Debug.leaveVerbose( "RnpBaseClientComm.endMessage: done." ); + } + + public void turboSendRequestGetAnswer() + { + Debug.enterVerbose( "RnpBaseClientComm.turboSendRequestGetAnswer: start." ); + RnpMessage answer=communicate(rasServerHost,rasServerPort,encoder.message); + decoder = new RnpDecoder(answer); + Debug.leaveVerbose( "RnpBaseClientComm.turboSendRequestGetAnswer: done." ); + } + + public void sendRequestGetAnswer() + { + Debug.enterVerbose( "RnpBaseClientComm.sendRequestGetAnswer: start." ); + + encoder.endFragment(); + encoder.endMessage(); + RnpMessage answer=communicate(rasServerHost,rasServerPort,encoder.message); + decoder = new RnpDecoder(answer); + decoder.getFirstFragment(); + + Debug.leaveVerbose( "RnpBaseClientComm.sendRequestGetAnswer: done." ); + } + + public void checkForError() throws RasQueryExecutionFailedException + { + Debug.enterVerbose( "RnpBaseClientComm.checkForError: start." ); + if(decoder.getFragmentType() != Rnp.fgt_Error) + { + Debug.leaveVerbose( "RnpBaseClientComm.checkForError: done." ); + return; + } + decoder.getFirstParameter();// error type + int errorType = decoder.getParameterType(); + if(errorType == 3) //"ert_Other" + { + decoder.getNextParameter(); + String s = decoder.getDataAsString(); + Debug.leaveCritical( "RnpBaseClientComm.checkForError: done. query failed: " + s ); + throw new RasQueryExecutionFailedException(s); + } + else + { + Debug.leaveCritical( "RnpBaseClientComm.checkForError: done. query failed, unexpected error: " + errorType ); + throw new RasQueryExecutionFailedException(1000,0,0,""); + } + // we never get here + } + + public RnpMessage communicate(String server, int port, RnpMessage message) + { + Debug.enterVerbose( "RnpBaseClientComm.communicate: start. server=" + server + ", port=" + port ); + + Socket socket=null; + RnpMessage receivedMessage= null; + DataOutputStream dos = null; + + try + { + Debug.talkVerbose( "RnpBaseClientComm.communicate: server=" + server + ", port=" + port ); + socket=new Socket(server, port); + } + catch(UnknownHostException e11) + { + Debug.leaveCritical( "RnpBaseClientComm.communicate: error: socket target unknown: " + e11.getMessage() ); + throw new RasConnectionFailedException(RasGlobalDefs.MANAGER_CONN_FAILED,server); + } + catch(IOException e12) + { + Debug.leaveCritical( "RnpBaseClientComm.communicate: error: socket io exception: " + e12.getMessage() ); + throw new RasClientInternalException("RnpBaseClientComm","communicate()",e12.getMessage()); + } + + try + { + dos = new DataOutputStream(socket.getOutputStream()); + message.write(dos); + } + catch(IOException e2) + { + Debug.leaveCritical( "RnpBaseClientComm.communicate: error: cannot write to socket: " + e2.getMessage() ); + throw new RasClientInternalException("RnpBaseClientComm","communicate()",e2.getMessage()); + } + + try + { + DataInputStream dis = new DataInputStream(socket.getInputStream()); + receivedMessage = new RnpMessage(); + receivedMessage.read(dis); + //receivedMessage.print(); + dos.close(); + dis.close(); + } + catch(IOException e3) + { + Debug.leaveCritical( "RnpBaseClientComm.communicate: error: rcv io exception: " + e3.getMessage() ); + throw new RasClientInternalException("RnpBaseClientComm","communicate()", e3.getMessage() ); + } + catch(RnpException e4) + { + Debug.leaveCritical( "RnpBaseClientComm.communicate: error: RnpException: " + e4.getMessage() ); + throw new RasClientInternalException("RnpBaseClientComm","communicate()",e4.getMessage()); + } + + Debug.leaveVerbose( "RnpBaseClientComm.communicate: done. result=" + receivedMessage ); + return receivedMessage; + } + + } // RnpBaseClientComm + diff --git a/java/rasj/rnp/RnpDecoder.class b/java/rasj/rnp/RnpDecoder.class new file mode 100644 index 0000000..56ab0ef Binary files /dev/null and b/java/rasj/rnp/RnpDecoder.class differ diff --git a/java/rasj/rnp/RnpDecoder.java b/java/rasj/rnp/RnpDecoder.java new file mode 100644 index 0000000..5eea077 --- /dev/null +++ b/java/rasj/rnp/RnpDecoder.java @@ -0,0 +1,170 @@ +/* +* 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 java.io.*; + + +public class RnpDecoder + { + + public RnpMessage message; + private RnpFragment currentFragment; + private RnpParameter currentParameter; + private int fragmentIndex; + + + RnpDecoder(RnpMessage rnpmessage) + { + message=rnpmessage; + currentFragment = null; + currentParameter = null; + fragmentIndex = 0; + } + + void verify() throws RnpException + { + if(message.header.protocolId != Rnp.rnpProtocolId) + throw new RnpException("Not a RNP message"); + + if(message.header.messageEndianness != 0) + throw new RnpException("Incorrect endianness"); + + if(message.header.majorVersion != 1 || message.header.minorVersion != 0 || message.header.dataStart != RnpMessageHeader.length) + throw new RnpException("Incorrect message version"); + } + + int getServerType() + { + return message.header.serverType; + } + + byte getDesiredEndianness() + { + return message.header.desiredEndianness; + } + + byte getMessageEndianness() + { + return message.header.messageEndianness; + } + + int getMessageLength() + { + return message.header.totalMessageLength; + } + + int countFragments() + { + return message.header.nrFragments; + } + byte getMajorVersion() + { + return message.header.majorVersion; + } + byte getMinorVersion() + { + return message.header.minorVersion; + } + + RnpFragment getFirstFragment() + { + fragmentIndex = 0; + currentFragment = (RnpFragment)message.fragments.get(0); + return currentFragment; + } + + RnpFragment getNextFragment(RnpFragment fragment) + { + fragmentIndex++; + currentFragment = (RnpFragment)message.fragments.get(fragmentIndex); + return currentFragment; + } + + int getFragmentType() + { + //fgt_None, fgt_Command, fgt_OkAnswer, fgt_Error, fgt_DiscardedRequest + return currentFragment.getFragmentType(); + } + int countParameters() + { + return currentFragment.countParameters(); + } + RnpParameter getFirstParameter() + { + currentParameter = currentFragment.getFirstParameter(); + return currentParameter; + } + RnpParameter getNextParameter() + { + currentParameter = currentFragment.getNextParameter(); + return currentParameter; + } + int getParameterType() + { + return currentParameter.paramType; + } + int getDataLength() + { + return currentParameter.getDataLength(); + } + + int getDataType() + { + // dtt_None,dtt_Asciiz, dtt_Int32,dtt_Double64, dtt_Opaque + return currentParameter.dataType; + } + + int getDataAsInteger() + { + return ((ParameterInt32)currentParameter).data; + } + float getDataAsFloat() + { + return((ParameterFloat32)currentParameter).data; + } + double getDataAsDouble() + { + return((ParameterDouble64)currentParameter).data; + } + String getDataAsString() + { + return new String(((ParameterString)currentParameter).data); + } + byte[] getDataOpaque() + { + return((ParameterOpaque)currentParameter).data; + } + } + diff --git a/java/rasj/rnp/RnpEncoder.class b/java/rasj/rnp/RnpEncoder.class new file mode 100644 index 0000000..c4a9fdf Binary files /dev/null and b/java/rasj/rnp/RnpEncoder.class differ diff --git a/java/rasj/rnp/RnpEncoder.java b/java/rasj/rnp/RnpEncoder.java new file mode 100644 index 0000000..d27bfe2 --- /dev/null +++ b/java/rasj/rnp/RnpEncoder.java @@ -0,0 +1,102 @@ +/* +* 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 java.io.*; +import java.util.*; + +public class RnpEncoder + { + public int serverType = 0; + RnpMessage message = null; + + public void startMessage(int serverType) + { + message=new RnpMessage(); + message.header = new RnpMessageHeader(serverType); + message.fragments = new Vector(); + } + public void setEndianess() + { + } + public void startFragment(int fragmentType, int command) + { + message.currentFragment = new RnpFragment(fragmentType,command); + } + void addFragment(RnpFragmentHeader fHeader) + { + message.header.nrFragments++; + message.header.dataLength += fHeader.totalLength; + message.header.totalMessageLength += fHeader.totalLength; + } + + void addParameterInt32(int parameterType, int data) + { + message.currentFragment.addParameterInt32(parameterType,data); + } + + void addParameterFloat32(int parameterType, float data) + { + message.currentFragment.addParameterFloat32(parameterType,data); + } + + void addParameterDouble64(int parameterType, double data) + { + message.currentFragment.addParameterDouble64(parameterType,data); + } + + void addParameterString(int parameterType, String data) + { + message.currentFragment.addParameterString(parameterType,data); + } + + void addParameterOpaque(int parameterType, byte[] data) + { + message.currentFragment.addParameterOpaque(parameterType,data); + } + + void endFragment() + { + if(message.currentFragment == null) return; // correct "assert" + message.fragments.add(message.currentFragment); + addFragment(message.currentFragment.getHeader()); + message.currentFragment = null; + } + + void endMessage() + { + } + + } + diff --git a/java/rasj/rnp/RnpException.class b/java/rasj/rnp/RnpException.class new file mode 100644 index 0000000..8422a28 Binary files /dev/null and b/java/rasj/rnp/RnpException.class differ diff --git a/java/rasj/rnp/RnpException.java b/java/rasj/rnp/RnpException.java new file mode 100644 index 0000000..254c304 --- /dev/null +++ b/java/rasj/rnp/RnpException.java @@ -0,0 +1,44 @@ +/* +* 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; + + +public class RnpException extends Exception + { + public RnpException(String s) + { + super(s); + } + } + diff --git a/java/rasj/rnp/RnpFragment.class b/java/rasj/rnp/RnpFragment.class new file mode 100644 index 0000000..3927ada Binary files /dev/null and b/java/rasj/rnp/RnpFragment.class differ diff --git a/java/rasj/rnp/RnpFragment.java b/java/rasj/rnp/RnpFragment.java new file mode 100644 index 0000000..204744f --- /dev/null +++ b/java/rasj/rnp/RnpFragment.java @@ -0,0 +1,152 @@ +/* +* 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 java.util.*; +import java.io.*; + + +public class RnpFragment + { + RnpFragmentHeader header; + Vector parameters; + int parameterIndex = 0; + + RnpFragment(int fragmentType, int command) + { + header = new RnpFragmentHeader(fragmentType, command); + parameters = new Vector(); + } + + RnpFragmentHeader getHeader() + { + return header; + } + + void addParameterInt32(int parameterType, int data) + { + addParameter(new ParameterInt32(parameterType,data)); + } + + void addParameterFloat32(int parameterType, float data) + { + addParameter(new ParameterFloat32(parameterType,data)); + } + + void addParameterDouble64(int parameterType, double data) + { + addParameter(new ParameterDouble64(parameterType,data)); + } + void addParameterString(int parameterType, String data) + { + addParameter(new ParameterString(parameterType,data)); + } + + void addParameterOpaque(int parameterType, byte[] data) + { + addParameter(new ParameterOpaque(parameterType,data)); + } + + private void addParameter(RnpParameter param) + { + parameters.add(param); + header.addParameter(param.getTotalLength()); + } + + void write(DataOutputStream dataStream) throws IOException + { + header.write(dataStream); + for(int i=0; i < header.countParameters(); i++) + { + RnpParameter param = (RnpParameter)parameters.get(i); + param.write(dataStream); + } + } + + void read(DataInputStream dataStream) throws IOException, RnpException + { + header.read(dataStream); + for(int i=0; i < header.countParameters(); i++) + { + RnpParameter param = RnpParameter.constructFromStream(dataStream); + parameters.add(param); + } + } + + void print() + { + header.print(); + for(int i=0; i < header.countParameters(); i++) + { + System.out.print(" " + i+ " "); + RnpParameter param = (RnpParameter)parameters.get(i); + param.print(); + } + } + + + int getFragmentType() + { + return header.fragmType; + } + + int getCommand() + { + return header.command; + } + + int countParameters() + { + return header.nrParams; + } + + int getFragmentLength() + { + return header.totalLength; + } + + RnpParameter getFirstParameter() + { + parameterIndex = 0; + return (RnpParameter)parameters.get(0); + } + + RnpParameter getNextParameter() + { + parameterIndex++; + return (RnpParameter)parameters.get(parameterIndex); + } + + } + diff --git a/java/rasj/rnp/RnpFragmentHeader.class b/java/rasj/rnp/RnpFragmentHeader.class new file mode 100644 index 0000000..685e967 Binary files /dev/null and b/java/rasj/rnp/RnpFragmentHeader.class differ diff --git a/java/rasj/rnp/RnpFragmentHeader.java b/java/rasj/rnp/RnpFragmentHeader.java new file mode 100644 index 0000000..e18e0f4 --- /dev/null +++ b/java/rasj/rnp/RnpFragmentHeader.java @@ -0,0 +1,93 @@ +/* +* 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 java.util.*; +import java.io.*; + + +public class RnpFragmentHeader + { + int fragmType; //{FragmentType command, okAnswer, error} + int command; + int nrParams; + int totalLength; + + public static final int length = 16; + + RnpFragmentHeader(int fragmentType, int nCommand) + { + fragmType = fragmentType; + command = nCommand; + nrParams = 0; + totalLength = length; + } + + int countParameters() + { + return nrParams; + } + + void print() + { + System.out.print(" type=" + fragmType); + System.out.print(" Command=" + command); + System.out.print(" nrParams=" + nrParams); + System.out.print(" totalLength=" + totalLength); + System.out.println(); + } + + void write(DataOutputStream dataStream) throws IOException + { + dataStream.writeInt(fragmType); + dataStream.writeInt(command); + dataStream.writeInt(nrParams); + dataStream.writeInt(totalLength); + } + void read(DataInputStream dataStream) throws IOException + { + fragmType = dataStream.readInt(); + command = dataStream.readInt(); + nrParams = dataStream.readInt(); + totalLength = dataStream.readInt(); + } + + void addParameter(int size) + { + nrParams++; + totalLength += size; + } + } + + diff --git a/java/rasj/rnp/RnpMessage.class b/java/rasj/rnp/RnpMessage.class new file mode 100644 index 0000000..effbe2d Binary files /dev/null and b/java/rasj/rnp/RnpMessage.class differ diff --git a/java/rasj/rnp/RnpMessage.java b/java/rasj/rnp/RnpMessage.java new file mode 100644 index 0000000..5739ee7 --- /dev/null +++ b/java/rasj/rnp/RnpMessage.java @@ -0,0 +1,83 @@ +/* +* 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 java.util.*; +import java.io.*; + + +public class RnpMessage + { + public RnpMessageHeader header; + public Vector fragments; + public RnpFragment currentFragment = null; + + void write(DataOutputStream dataStream) throws IOException + { + header.write(dataStream); + for(int i=0; i < header.countFragments(); i++) + { + RnpFragment frag = (RnpFragment)fragments.get(i); + frag.write(dataStream); + } + } + + void read(DataInputStream dataStream) throws IOException, RnpException + { + header = new RnpMessageHeader(0); + header.read(dataStream); + fragments = new Vector(); + for(int i=0; i < header.countFragments(); i++) + { + currentFragment = new RnpFragment(0,0); + currentFragment.read(dataStream); + fragments.add(currentFragment); + } + currentFragment = null; + } + + void print() + { + header.print(); + for(int i=0; i < header.countFragments(); i++) + { + System.out.print("Fragment " + i + " "); + RnpFragment frag = (RnpFragment)fragments.get(i); + frag.print(); + } + } + + } + diff --git a/java/rasj/rnp/RnpMessageHeader.class b/java/rasj/rnp/RnpMessageHeader.class new file mode 100644 index 0000000..edd6cfc Binary files /dev/null and b/java/rasj/rnp/RnpMessageHeader.class differ diff --git a/java/rasj/rnp/RnpMessageHeader.java b/java/rasj/rnp/RnpMessageHeader.java new file mode 100644 index 0000000..5191940 --- /dev/null +++ b/java/rasj/rnp/RnpMessageHeader.java @@ -0,0 +1,150 @@ +/* +* 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 java.util.*; +import java.io.*; + + +public class RnpMessageHeader + { + int protocolId; + byte messageEndianness; + byte desiredEndianness; + byte majorVersion; + byte minorVersion; + int totalMessageLength; + int nrFragments; + int serverType; + int authInfoStart; + int authInfoLength; + int comprInfoStart; + int comprInfoLength; + int dataStart; + int dataLength; + //int _unused[5]; + + public static final int length = 64; + + RnpMessageHeader(int nServerType) + { + protocolId = Rnp.rnpProtocolId; + messageEndianness = 0; // big endianness + desiredEndianness = 0; // big also + majorVersion = 1; + minorVersion = 0; + totalMessageLength = length; + nrFragments = 0; + serverType = nServerType; + authInfoStart = 0; + authInfoLength = 0; + comprInfoStart = 0; + comprInfoLength = 0; + dataStart = length; + dataLength = 0; + } + + int countFragments() + { + return nrFragments; + } + + void print() + { + System.out.println("RNP Header"); + System.out.println(" totalLength=" + totalMessageLength); + System.out.println(" nrFragments=" + nrFragments); + System.out.println(" serverType=" + serverType); + System.out.println(" dataStart=" + dataStart); + System.out.println(" dataLength=" + dataLength); + System.out.println(""); + } + + void write(DataOutputStream dataStream) throws IOException + { + dataStream.writeInt(protocolId); + dataStream.writeByte(messageEndianness); + dataStream.writeByte(desiredEndianness); + dataStream.writeByte(majorVersion); + dataStream.writeByte(minorVersion); + + dataStream.writeInt(totalMessageLength); + dataStream.writeInt(nrFragments); + dataStream.writeInt(serverType); + dataStream.writeInt(authInfoStart); + dataStream.writeInt(authInfoLength); + dataStream.writeInt(comprInfoStart); + dataStream.writeInt(comprInfoLength); + dataStream.writeInt(dataStart); + dataStream.writeInt(dataLength); + + // the unused 5 ints + dataStream.writeInt(0); + dataStream.writeInt(0); + dataStream.writeInt(0); + dataStream.writeInt(0); + dataStream.writeInt(0); + + } + + void read(DataInputStream dataStream) throws IOException, RnpException + { + protocolId = dataStream.readInt(); + messageEndianness = dataStream.readByte(); + desiredEndianness = dataStream.readByte(); + majorVersion = dataStream.readByte(); + minorVersion = dataStream.readByte(); + + totalMessageLength = dataStream.readInt(); + nrFragments = dataStream.readInt(); + serverType = dataStream.readInt(); + authInfoStart = dataStream.readInt(); + authInfoLength = dataStream.readInt(); + comprInfoStart = dataStream.readInt(); + comprInfoLength = dataStream.readInt(); + dataStart = dataStream.readInt(); + dataLength = dataStream.readInt(); + + // the unused 5 ints + dataStream.readInt(); + dataStream.readInt(); + dataStream.readInt(); + dataStream.readInt(); + dataStream.readInt(); + + //verify(); + } + } + diff --git a/java/rasj/rnp/RnpParameter.class b/java/rasj/rnp/RnpParameter.class new file mode 100644 index 0000000..183302c Binary files /dev/null and b/java/rasj/rnp/RnpParameter.class differ diff --git a/java/rasj/rnp/RnpParameter.java b/java/rasj/rnp/RnpParameter.java new file mode 100644 index 0000000..01cba64 --- /dev/null +++ b/java/rasj/rnp/RnpParameter.java @@ -0,0 +1,325 @@ +/* +* 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 java.io.*; + +public abstract class RnpParameter + { + int paramType; + int dataType; + int dataLength; + int totalLength; + + public static final int headerSize = 16; + + protected RnpParameter(int pT, int dT, int dL,int tL) + { + paramType = pT; + dataType = dT; + dataLength = dL; + totalLength = tL; + } + + void print() + { + System.out.print(" Parameter type=" + paramType); + System.out.print(" data type=" + dataType); + System.out.print(" dataLength="+dataLength); + System.out.print(" totalLength=" + totalLength); + printSpecific(); + } + + void write(DataOutputStream dataStream) throws IOException + { + dataStream.writeInt(paramType); + dataStream.writeInt(dataType); + dataStream.writeInt(dataLength); + dataStream.writeInt(totalLength); + writeSpecific(dataStream); + } + + int getTotalLength() + { + return totalLength; + } + int getDataLength() + { + return dataLength; + } + int getPaddLength() + { + return totalLength - dataLength - headerSize; + } + + void computeTotalAlignedLength() + { + totalLength = (dataLength + headerSize + 3) & 0xFFFFFFFC; + } + + static RnpParameter constructFromStream(DataInputStream dataStream) throws IOException, RnpException + { + int paramType = dataStream.readInt(); + int dataType = dataStream.readInt(); + int dataLength = dataStream.readInt(); + int totalLength = dataStream.readInt(); + + RnpParameter result = null; + switch(dataType) + { + case Rnp.dtt_Int32: result = new ParameterInt32(paramType, dataType, dataLength, totalLength); + break; + case Rnp.dtt_Float32: result = new ParameterFloat32(paramType, dataType, dataLength, totalLength); + break; + case Rnp.dtt_Double64: result = new ParameterDouble64(paramType, dataType, dataLength, totalLength); + break; + case Rnp.dtt_Asciiz: result = new ParameterString(paramType, dataType, dataLength, totalLength); + break; + case Rnp.dtt_Opaque: result = new ParameterOpaque(paramType, dataType, dataLength, totalLength); + break; + default: throw new RnpException("Incorrect parameter data type: " + dataType); + } + result.readSpecific(dataStream); + //System.out.println("constructFromStream: "); result.print(); + return result; + } + + int getParameterType() { return paramType; } + int getDataType() { return dataType; } + + abstract void writeSpecific(DataOutputStream dataStream) throws IOException; + abstract void readSpecific(DataInputStream dataStream) throws IOException; + abstract void printSpecific(); + } + + + + class ParameterInt32 extends RnpParameter + { + int data; + public static final int length = 4; + + ParameterInt32(int parameterType, int nData) + { + super(parameterType,Rnp.dtt_Int32, length, length + headerSize); + data = nData; + } + + ParameterInt32(int pT, int dT, int dL, int tL) + { + super(pT, dT, dL,tL); + } + + void printSpecific() + { + System.out.println(" value=" + data); + } + + void writeSpecific(DataOutputStream dataStream) throws IOException + { + dataStream.writeInt(data); + } + + void readSpecific(DataInputStream dataStream) throws IOException + { + data = dataStream.readInt(); + } + + int getData() + { + return data; + } + } + + + class ParameterFloat32 extends RnpParameter + { + float data; + public static final int length = 4; + + ParameterFloat32(int parameterType, float nData) + { + super(parameterType,Rnp.dtt_Float32, length, length + headerSize); + data = nData; + } + + ParameterFloat32(int pT, int dT, int dL, int tL) + { + super(pT, dT, dL,tL); + } + + void printSpecific() + { + System.out.println(" value=" + data); + } + + void writeSpecific(DataOutputStream dataStream) throws IOException + { + dataStream.writeFloat(data); + } + + void readSpecific(DataInputStream dataStream) throws IOException + { + data = dataStream.readFloat(); + } + + float getData() + { + return data; + } + } + + + class ParameterDouble64 extends RnpParameter + { + double data; + public static final int length = 8; + + ParameterDouble64(int parameterType, double nData) + { + super(parameterType,Rnp.dtt_Double64, length, length + headerSize); + data = nData; + } + ParameterDouble64(int pT, int dT, int dL, int tL) + { + super(pT, dT, dL, tL); + } + + void printSpecific() + { + System.out.println(" value=" + data); + } + + void writeSpecific(DataOutputStream dataStream) throws IOException + { + dataStream.writeDouble(data); + } + + void readSpecific(DataInputStream dataStream) throws IOException + { + data = dataStream.readDouble(); + } + + double getData() + { + return data; + } + } + + class ParameterString extends RnpParameter + { + byte[] data; + + ParameterString(int parameterType, String nData) + { + super(parameterType,Rnp.dtt_Asciiz,0,0); + data = nData.getBytes(); + // do not forget: Strings are ASCIIZ in RNP!! + dataLength = data.length+1; + computeTotalAlignedLength(); + } + + ParameterString(int pT, int dT, int dL,int tL) + { + super(pT, dT, dL,tL); + } + + void printSpecific() + { + System.out.println(" value=" + getData()); + } + + void writeSpecific(DataOutputStream dataStream) throws IOException + { + dataStream.write(data,0,dataLength - 1); + dataStream.writeByte(0); + + for(int i=0;i. +* +* Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009 Peter Baumann / +rasdaman GmbH. +* +* For more information please see +* or contact Peter Baumann via . +*/ +/** *********************************************************** + *
+ *
+ * PURPOSE: 
+ * test socket communication.
+ *
+ *
+ * COMMENTS:
+ *
+ * 
+ *********************************************************** */ + +import java.io.*; +import java.net.*; +import java.lang.*; +import java.util.*; + +public class Client +{ + private static final String DEFAULT_SERVER = "localhost"; + private static final int DEFAULT_PORT = 7001; + + private static String server = DEFAULT_SERVER; + private static int port = DEFAULT_PORT; + + private static void communicate() + { + System.out.println( "server=" + server + ", port=" + port ); + + try + { + Socket socket = new Socket( server, port ); + + PrintStream ps = new PrintStream(socket.getOutputStream()); + ps.print("Hello " + server + " at port " + port + " !\n" ); + ps.flush(); + + BufferedReader ds = new BufferedReader(new InputStreamReader(socket.getInputStream())); + System.out.println( "server delivered: '" + ds.readLine() ); + + ps.close(); + ds.close(); + socket.close(); + System.out.println( "socket closed." ); + } + catch(UnknownHostException e2) + { + System.out.println( "host unknown: " + e2.getMessage() ); + } + catch(IOException e1) + { + System.out.println( "io exception: " + e1.getMessage() ); + } + } + + public static void main( String args[] ) + { + System.out.println( "Socket test started." ); + + if (args.length != 0 && args.length != 2) + System.out.println( "usage: java Client [server port]" ); + else if (args.length == 2) + { + server = args[0]; + try + { + port = Integer.parseInt( args[1] ); + } + catch(NumberFormatException e) + { + System.err.println( "Error: illegal port parameter: " + args[1] ); + return; + } + } + + communicate(); + + System.out.println( "Socket test done." ); + } +} + + -- cgit