diff options
Diffstat (limited to 'plugins/org.eclipse.jem.proxy/remoteCommon/org/eclipse/jem/internal/proxy/common')
7 files changed, 0 insertions, 2106 deletions
diff --git a/plugins/org.eclipse.jem.proxy/remoteCommon/org/eclipse/jem/internal/proxy/common/remote/CommandErrorException.java b/plugins/org.eclipse.jem.proxy/remoteCommon/org/eclipse/jem/internal/proxy/common/remote/CommandErrorException.java deleted file mode 100644 index 49979b982..000000000 --- a/plugins/org.eclipse.jem.proxy/remoteCommon/org/eclipse/jem/internal/proxy/common/remote/CommandErrorException.java +++ /dev/null @@ -1,76 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2001, 2005 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.jem.internal.proxy.common.remote; -/* - - - */ - -import org.eclipse.jem.internal.proxy.common.CommandException; -/** - * An error return from a command. This is clean return in that - * the connection is still valid and alive. - * After it has been processed the data will be the value retrieved - * out of the valueobject and made into a proxy. - */ -public class CommandErrorException extends CommandException { - /** - * Comment for <code>serialVersionUID</code> - * - * @since 1.1.0 - */ - private static final long serialVersionUID = 1701752035606593305L; - private final Object fErrorObject; - private final int fErrorCode; - - public CommandErrorException(int errorCode, Commands.ValueObject errorData) { - super(errorData.clone()); // Clone it because typically these get reused and cleared out. This way we have our own. - fErrorObject = null; - fErrorCode = errorCode; - } - - public CommandErrorException(String msg, int errorCode, Commands.ValueObject errorData, Object errorObject) { - super(msg, errorData.clone()); - fErrorObject = errorObject; - fErrorCode = errorCode; - } - - public Commands.ValueObject getValue() { - return (Commands.ValueObject) getExceptionData(); - } - - public boolean isRecoverable() { - return true; // Command errors are recoverable. - } - - /** - * Return the error code. - */ - public int getErrorCode() { - return fErrorCode; - } - - /** - * Return the error object after conversion to proxy format. - */ - public Object getErrorObject() { - return fErrorObject; - } - - - /* (non-Javadoc) - * @see java.lang.Object#toString() - */ - public String toString() { - return super.toString() + "-- Error code:"+getErrorCode() + (getValue() != null ? " Value data:\"" + getValue().getAsObject() + "\"" : " ") + (fErrorObject != null ? " Error object:\""+fErrorObject.toString()+"\"" : " "); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ - } - -} diff --git a/plugins/org.eclipse.jem.proxy/remoteCommon/org/eclipse/jem/internal/proxy/common/remote/Commands.java b/plugins/org.eclipse.jem.proxy/remoteCommon/org/eclipse/jem/internal/proxy/common/remote/Commands.java deleted file mode 100644 index d8469252c..000000000 --- a/plugins/org.eclipse.jem.proxy/remoteCommon/org/eclipse/jem/internal/proxy/common/remote/Commands.java +++ /dev/null @@ -1,1450 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2001, 2005 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.jem.internal.proxy.common.remote; -/* - - - */ - -import java.io.*; - -import org.eclipse.jem.internal.proxy.common.CommandException; -/** - * The commands that can be passed back and forth between - * client and server. And other constants. - * - * - Contains helper methods for reading/writing commands. - */ -public class Commands { - // The commands will be written in writeByte format . - public final static byte - GET_CLASS = 1, // Get the class object, - VALUE = 2, // Returning a value - QUIT_CONNECTION = 4, // Close this connection - TERMINATE_SERVER = 5, // Terminate the entire server. - ERROR = 6, // Returning an error - RELEASE_OBJECT = 7, // An object is no longer needed on the client side, so - // it can be removed from the server id table and released. - GET_CLASS_RETURN = 8, // The return command from GET_CLASS - // Obsolete, not used anymore GET_METHOD = 9, // Return the id for a method - // Obsolete, not used anymore GET_CTOR = 10, // Return the id for a constructor - NEW_INIT_STRING = 11, // Create a new bean using the init string - GET_CLASS_FROM_ID = 12, // We have an ID, return the class info for this id. - GET_CLASS_ID_RETURN = 13, // The return command from GET_CLASS_FROM_ID - GET_OBJECT_DATA = 14, // We have an ID, but we don't have the info, return it. This is a - // corrective command only. This would happen if for some strange - // reason the proxy has been removed but has not been released. This - // really shouldn't happen except as a possible race condition between - // GC and returning id from the server. - INVOKE = 15, // Invoke a method. - - - // These commands are to the Master Server thread in the IDE. - ALIVE = 16, // Are you alive? - REMOTE_STARTED = 17, // Remote VM has started. - ATTACH_CALLBACK = 18, // Attach to a callback thread on the IDE side. The remote vm will use its socket as the callback socket. - // it will return boolean <code>true</code> if attach worked or <code>false</code> if it failed. - - // These are more regular commands. They were historically added after the master server thread commands, so - // they are shown here after them and with numbers greater than them. - EXPRESSION_TREE_COMMAND = 19, // An expression tree subcommand has come in. - INVOKE_WITH_METHOD_PASSED = 20, // Invoke where the description of the method is passed in with the command. - GET_ARRAY_CONTENTS = 21; // Get the first dimension contents as an array of ids and send them back. - - - // Callback commands - public final static byte - CALLBACK = (byte) 255, // A callback has come in. - CALLBACK_DONE = (byte) 254, // A callback done command, sent to the remote vm upon callback completion. - CALLBACK_STREAM = (byte) 253, // A callback for a byte stream has come in. - // This is a special callback. When this comes in a special - // input stream will be created that will take over control of - // the connection until the stream is terminated on the remote - // side. At this time the connection will be returned. - CALLBACK_STREAM_TERMINATE = (byte) 252; // A callback stream is asked to terminate early. - - // The error values from the command on the server. - public final static int - NO_ERROR = 0, // No error status. - UNKNOWN_COMMAND_SENT = 1, // An unknown command was sent to the server. Value is void. - GET_CLASS_NOT_FOUND = 2, // The class was not found in GetClass. Value is void. - CANNOT_EVALUATE_STRING = 3, // Evaluator couldn't evaluate the init string. Too complicated. Value is a throwable of the wrappered Init string error. - CLASS_CAST_EXCEPTION = 4, // The result is not assignable to the expected type. Value is void. - GET_METHOD_NOT_FOUND = 5, // Method requested wasn't found. Value is void. - THROWABLE_SENT = 6, // A Throwable is being sent back as the error, not as just data for the error. Value is the Throwable. - CALLBACK_RUNTIME_EXCEPTION = 7, // A runtime exception occurred during a callback. The data is the message. - CALLBACK_NOT_REGISTERED = 8, - MAX_ERROR_CODE = CALLBACK_NOT_REGISTERED; // This is just the max code. Not actually sent. Used as a flag. - - // Predefined standard id's for standard classes/objects. Both sides will assume these id's have been assigned - // to these classes/types/objects - public final static int - NOT_AN_ID = -1, // This value means it is not an id. It is never a valid id. - VOID_TYPE = 0, - BOOLEAN_TYPE = 1, - BOOLEAN_CLASS = 2, - INTEGER_TYPE = 3, - INTEGER_CLASS = 4, - BYTE_TYPE = 5, - BYTE_CLASS = 6, - CHARACTER_TYPE = 7, - CHARACTER_CLASS = 8, - DOUBLE_TYPE = 9, - DOUBLE_CLASS = 10, - FLOAT_TYPE = 11, - FLOAT_CLASS = 12, - SHORT_TYPE = 13, - SHORT_CLASS = 14, - LONG_TYPE = 15, - LONG_CLASS = 16, - STRING_CLASS = 17, - BIG_DECIMAL_CLASS = 18, - BIG_INTEGER_CLASS = 19, - NUMBER_CLASS = 20, - THROWABLE_CLASS = 21, - CLASS_CLASS = 22, - OBJECT_CLASS = 23, - ACCESSIBLEOBJECT_CLASS = 24, - METHOD_CLASS = 25, - FIELD_CLASS = 26, - CONSTRUCTOR_CLASS = 27, - GET_METHOD_ID = 28, // Class.getMethod(...) predefined id. - IVMSERVER_CLASS = 29, // IVMServer.class - ICALLBACK_CLASS = 30, // ICallback.class - REMOTESERVER_ID = 31, // id of RemoteVMServerThread instance. - REMOTEVMSERVER_CLASS = 32, // RemoteVMServer.class - INITIALIZECALLBACK_METHOD_ID = 33, // ICallback.initializeCallback method. - THREAD_CLASS = 34, - EXPRESSIONPROCESSERCONTROLLER_CLASS = 35, - FIRST_FREE_ID = 36; - - // The type flags written in writeByte format - public final static byte - VOID = VOID_TYPE, // null - nothing follows - BYTE = BYTE_TYPE, // byte - writeByte - L_BYTE = BYTE_CLASS, // java.lang.Byte - writeByte - CHAR = CHARACTER_TYPE, // char - writeChar - L_CHAR = CHARACTER_CLASS, // java.lang.Character - writeChar - DOUBLE = DOUBLE_TYPE, // double - writeDouble - L_DOUBLE = DOUBLE_CLASS, // java.lang.Double - writeDouble - FLOAT = FLOAT_TYPE, // float - writeFloat - L_FLOAT = FLOAT_CLASS, // java.lang.Float - writeFloat - INT = INTEGER_TYPE, // int - writeInt - L_INT = INTEGER_CLASS, // java.lang.Integer - writeInt - LONG = LONG_TYPE, // long - writeLong - L_LONG = LONG_CLASS, // java.lang.Long - writeLong - SHORT = SHORT_TYPE, // short - writeShort - L_SHORT = SHORT_CLASS, // java.lang.Short - writeShort - BOOL = BOOLEAN_TYPE, // boolean - writeBoolean - L_BOOL = BOOLEAN_CLASS, // java.lang.Boolean - writeBoolean - STRING = STRING_CLASS, // java.lang.String - writeUTF - OBJECT = OBJECT_CLASS, // Object - special, see below (Object can be used to return an array (except if the array contains any object_ids, that has a special type) - OBJECT_ID = 50, // Object identity key - writeInt - NEW_OBJECT_ID = 51, // New Object identity (this is a new object that didn't exist before) - THROW = 52, // An exception occured. The value is a throwable, it is of the same format as NEW_OBJECT_ID. - ARRAY_IDS = 53, // An array of values, where there are at least one ID in the array. If there were no - // ID's (i.e. all just values), then use OBJECT type intead and have it written as - // writeObject. - FLAG = 54; // The value is a flag int. If this is allowed on a read, the anInt field will contain the flag value. - - - - // Unless specified below, the commands are one byte long. - // Also, unless specified below, the commands do not return a confirmation response. - // - // NOTE: VERY IMPORTANT, after every command, flush() should be used so that the - // the data is immediately sent to the server. - // - // n means int (e.g. 1) - // nb means byte (e.g. 1b) - // 'x' means Unicode char (i.e. writeChar()) - // "xxx" means UTF8 string (i.e. writeUTF) - // bool means a one byte boolean value - // - // The commas aren't actually written, they are used as separaters in the comments below - // - // GET_CLASS: 1b, "classname" - // Will return on the output stream GET_CLASS_RETURN command: - // 8b, n1, bool1, bool2, "superclassname" - // The "n1" is the class id. - // The bool1 is whether this class is an interface (true if it is). - // The bool2 is whether this class is abstract (true if it is). - // The "superclassname" is the class name of the super class (0 length if no superclass) - // If the class is not found, then it will return an error with a value for the error. - // - // GET_CLASS_FROM_ID: 12b, n - // Where "n" is the class id. - // Will return on the output stream GET_CLASS_ID_RETURN command: - // 13b, "classname", bool1, bool2, "superclassname" - // The bool1 is whether this class is an interface (true if it is). - // The bool2 is whether this class is abstract (true if it is). - // - // VALUE: 2b, tb, value - // Where tb is the type in byte, and value is the appropriate value shown in - // table above. - // OBJECT_ID: 50b, n - // Where "n" is the object id. - // NEW_OBJECT_ID: 51b, n1, n2 - // Where "n1" is class ObjectID of the object that the object_id ("n2") is made of. - // OBJECT: 19b, n, writeObject - // Where "n" is the classObjectID of the class of the type of the object. - // NOTE: Object should be used only very rarely. Identity is lost, i.e. - // a copy is made each time and it can't be referenced back on the remote - // VM. - // ARRAY_IDS: 52b, id, n, [tb, value, ...] - // This is a very special array. It contains at least one ID. Therefor all of the - // First level entries are value objects. - // "id" is the id of the component type of the array(e.g. id for Object, or if multi-dimensional String[] (this will produce String[][]). - // "n" is the number of entries in the array. Followed by the values, one of the - // values could be an ARRAY_IDS too. The reading/writing of these are special because - // there is a callback mechanism to process the individual entries. This is so that - // temp arrays of ValueObjects won't need to be created to handle this, so it can - // go directly from the array to/from the stream. - // - // RELEASE_OBJECT: 7b, n - // Where the n is the object id to release. There is no confirmation to read back. - // - // ERROR: 6b, n, tb, ... - // n is the error code for this error. - // tb is a type flag, followed by the value. The value is dependent upon - // the command that this is error is from. If a THROW, then the THROW is ALWAYS a new - // ID, it can never be an existing id. - // - // - // TO_BEAN_STRING: 9b, n - // Where n is the object id to produce the bean string for. - // It will return a VALUE command where the type is String. - // - // NEW_INSTANCE: 10b, n - // Where n is the class object id of the class to create a new instance of using the default ctor. - // It will return either a VALUE command containing the new value (of type OBJECT_ID/NEW_OBJECT_ID if not - // one of the constant types with the true classID in it) or an ERROR command. (The ERROR could - // be a THROW type). If the object created is not assignable to the type passed in, then - // an ERROR is returned with CLASS_CAST_EXCEPTION flag. - // - // NEW_INIT_STRING: 11b, n, "initstring" - // Where n is the class object id of the class this initstring is supposed to create for. - // It will return either a VALUE command containing the new value (of type OBJECT_ID/NEW_OBJECT_ID if not - // one of the constant types with the true classID in it) or an ERROR command. (The ERROR could - // be a THROW type). The error could also be CANNOT_EVALUATE_STRING. This means that the string was too - // complicated for the evaluator and needs to be compiled and tried again. (TBD) - // If the object created is not assignable to the type passed in, then - // an ERROR is returned with CLASS_CAST_EXCEPTION flag. - // - // GET_OBJECT_DATA: 14b, n - // Where n is the id of the object being requested. It will return a NEW_OBJECT_ID value with the info. - // - // GET_METHOD: 9b, classId, "methodName", n1, [n2]... - // Where classID is the id of the class the method should be found in. - // Where n1 is the number of parm types following, and n2 is replicated that many times, - // each entry is the id of class for the parm type. (0 is valid which means there are no parms). - // The return will be a VALUE command containing the OBJECT_ID of the method. - // - // GET_CTOR: 10b, classId, n1, [n2]... - // Where classID is the id of the class the method should be found in. - // Where n1 is the number of parm types following, and n2 is replicated that many times, - // each entry is the id of class for the parm type. (0 is valid which means there are no parms). - // The return will be a VALUE command containing the OBJECT_ID of the method. - // - // GET_FIELD: - // - // GET_CTOR: - // - // INVOKE: 15b, n1, tb, value1, value2 - // Where "n1" is the id of the method to invoke. - // tb, value1 is the value of who to invoke against (it is usually an OBJECT_ID for tb) - // value2 is an ARRAY_IDS type or an OBJECT array of values if all constants. - // What is returned is a VALUE command containing the return value, (the value will be null (VOID) if - // there is no return type (i.e. the method was void). So null can be returned either if the value - // was null or if the return type was void. - // - // EXPRESSION_TREE_COMMAND: 20b, n, b - // Receiving an expression tree subcommand. Where "n" is a unique id number of the - // expression being processed. Where "b" is byte code, defined in ExpressionCommands, that - // determines the type of expression tree commands. - // There can be more data following, but it is read by the - // ExpressionProcesserController, not by the connection. See the controller for the subcommands. - // - // The id number is the id of the expression being processed. This allows more than one expression - // to be processed at a time from this connection. - // - // @see ExpressionCommands - // @see ExpressionProcessController - // - // INVOKE_WITH_METHOD_PASSED: 20b, classId, "methodName", value0, tb, value1, value2 - // Where classID is the id of the class the method should be found in. - // value0 is an ARRAY_IDS type for the type of the parms, or null type for no parms. - // tb, value1 is the value of who to invoke against (it is usually an OBJECT_ID for tb) - // value2 is an ARRAY_IDS type or an OBJECT array of values if all constants. - // What is returned is a VALUE command containing the return value, (the value will be null (VOID) if - // there is no return type (i.e. the method was void). So null can be returned either if the value - // was null or if the return type was void. - // - // GET_ARRAY_CONTENTS: 21b, arrayId - // Where arrayID is the id of the array to get the contents of. What is returned is a value command - // containing an array of ids of the first dimension contents. - // - // Callback commands: - // - // CALLBACK: 255b, n1, n2, value1 - // Where - // "n1" is the id of callback type (these are registered with the callback server) - // "n2" is the msgId for the callback (These are entirely callback dependent and are maintained by the callback developer) - // value1 is an ARRAY_IDS type or an OBJECT array of values if all constants. These are - // parms to send to the callback msg. - // It will return a CALLBACK_DONE. - // - // CALLBACK_DONE: 254b, value command. - // What comes back is a value command (i.e. Commands.VALUE followed by value). This allows - // ERRORS to be sent back too. - // - // CALLBACK_STREAM: 253b, n1, n2 - // Where - // "n1" is the id of callback type (these are registered with the callback server) - // "n2" is the msgId for the callback (These are entirely callback dependent and are maintained by the callback developer) - // It will create a CallbackInputStream and notify the registered callback that the - // stream is available. It will send a callback_done when it has accepted the request - // but before it notifies the registered callback with the stream. This lets the remote - // vm know that it can start sending data. - - - // To the MasterServer socket: - // The MasterServer socket will expect input in DataInputStream format, and DataOutputStream for return. - // The socket will be short-lived. It will be for one transaction only. Each request will return a new socket. - // - // ALIVE: 16b, n1 - // Where - // "n1" is the id of the registry this is asking to test for aliveness - // Will return bool, where false if registry is not alive, true if it is alive. - // REMOTE_STARTED: 17b, n1, n2 - // Where - // "n1" is the id of the registry this is telling that it is started - // "n2" is the serversocket port number of the server socket in this remote vm. - // Will return bool, where false if registry is not alive, true if it is alive. If false, then terminate the server because nothing to talk to. - // GET_CALLBACK_PORT: 18b, n1 - // Where - // "n1" is the id of the registry this is asking for the callback server port. - // Will return int, where the value is the callback server port number. -1 if there is no callback server port. - - /** - * This class is the return from a read value. It contains the - * type of the value and the value itself. Since primitives can be - * returned also, there is a slot for each one and the type should - * be checked to see which one is set. - * - * Also, if the type is OBJECT, then the anObject has the object in it, AND - * the classID field has the object_id of the class of the object so that the - * appropriate beantypeproxy can be found to use that object. Also, only - * IREMConstantBeanTypeProxies can be of type OBJECT. That is because those - * are the only ones that know how to take the value object and interpret it. - * - * If the type is OBJECT_ID or NEW_OBJECT_ID, then the objectID field will be set with - * the id. - * If the type is NEW_OBJECT_ID, then the classID field will - * have the class objectID of the class of the object for which object_id proxies. - * - * THROW is treated like NEW_OBJECT_ID in what fields are set since it is a new object. - * - * Note: so as not to create unnecessary objects, if the Object type of the primitive is being - * sent, then the primitive field will be set instead, though the type - * will still be the Object type (i.e. if type = L_BYTE, the aByte will - * have the value in it). - * - * Note: Also flags can be send back. The type will be FLAG and the anInt field will be the - * flag value. This is used to indicate special things that aren't values. Most useful in - * arrays where one of the entries is not a value. This can only be used if readValue - * is passed a flag indicating flags are valid, otherwise it will be treated as not valie. - */ - public static class ValueObject implements Cloneable { - public byte type; // Same as the types above - public byte aByte; - public char aChar; - public double aDouble; - public float aFloat; - public int anInt; - public short aShort; - public long aLong; - public boolean aBool; - public int objectID; // The object id for either OBJECT_ID or NEW_OBJECT_ID. - public int classID; // The class object id of the value in Object if the type is Object - public Object anObject; // String also will be in here - - public ValueObject() { - type = VOID; - } - - public Object clone() { - try { - return super.clone(); - } catch (CloneNotSupportedException e) { - return null; - } - } - - /** - * Return whether the value stored here is a primitive. - * - * @return <code>true</code> if value is a primitive type. - * - * @since 1.0.0 - */ - public boolean isPrimitive() { - return getPrimitiveType().isPrimitive(); - } - - /** - * Get the primitive type of the value. - * @return The primitive type, or if not primitive, it returns simply <code>Object.class</code>. - * - * @since 1.0.0 - */ - public Class getPrimitiveType() { - switch (type) { - case BYTE: - return Byte.TYPE; - case CHAR: - return Character.TYPE; - case DOUBLE: - return Double.TYPE; - case FLOAT: - return Float.TYPE; - case INT: - return Integer.TYPE; - case SHORT: - return Short.TYPE; - case LONG: - return Long.TYPE; - case BOOL: - return Boolean.TYPE; - default: - return Object.class; - } - - } - - /** - * Get the type as one of the valid Commands.Types. VOID, BYTE, L_BYTE, etc. - * @return - * - * @since 1.1.0 - */ - public int getType() { - return type; - } - - /** - * Special getter to get the type as an Object, this is used by invoke for example. - */ - public Object getAsObject() { - switch (type) { - case VOID: - return null; - case BYTE: - case L_BYTE: - return new Byte(aByte); - case CHAR: - case L_CHAR: - return new Character(aChar); - case DOUBLE: - case L_DOUBLE: - return new Double(aDouble); - case FLOAT: - case L_FLOAT: - return new Float(aFloat); - case INT: - case L_INT: - return new Integer(anInt); - case SHORT: - case L_SHORT: - return new Short(aShort); - case LONG: - case L_LONG: - return new Long(aLong); - case BOOL: - case L_BOOL: - return aBool ? Boolean.TRUE : Boolean.FALSE; - case STRING: - return anObject; - case OBJECT: - return anObject; - - default: - return null; // Can't handle others. Those need to be checked before calling. - } - } - - /** - * Special setter to set the value depending upon the type. - */ - public void setAsObject(Object value, int valueClassID) { - switch (valueClassID) { - case VOID: - set(); - break; - case BYTE_CLASS: - set((Byte) value); - break; - case CHARACTER_CLASS: - set((Character) value); - break; - case DOUBLE_CLASS: - set((Double) value); - break; - case FLOAT_CLASS: - set((Float) value); - break; - case INTEGER_CLASS: - set((Integer) value); - break; - case SHORT_CLASS: - set((Short) value); - break; - case LONG_CLASS: - set((Long) value); - break; - case BOOLEAN_CLASS: - set((Boolean) value); - break; - case STRING_CLASS: - set((String) value); - break; - default: - set(value, valueClassID); - break; - } - } - - public void set() { - type = VOID; - anObject = null; - } - - public void setFlag(int flag) { - type = FLAG; - anInt = flag; - } - - public void set(byte value) { - type = BYTE; - aByte = value; - anObject = null; - } - public void set(Byte value) { - if (value != null) { - type = L_BYTE; - aByte = value.byteValue(); - anObject = null; - } else - set(); - } - public void set(char value) { - type = CHAR; - aChar = value; - anObject = null; - } - public void set(Character value) { - if (value != null) { - type = L_CHAR; - aChar = value.charValue(); - anObject = null; - } else - set(); - } - public void set(double value) { - type = DOUBLE; - aDouble = value; - anObject = null; - } - public void set(Double value) { - if (value != null) { - type = L_DOUBLE; - aDouble = value.doubleValue(); - anObject = null; - } else - set(); - } - public void set(float value) { - type = FLOAT; - aFloat = value; - anObject = null; - } - public void set(Float value) { - if (value != null) { - type = L_FLOAT; - aFloat = value.floatValue(); - anObject = null; - } else - set(); - } - public void set(int value) { - type = INT; - anInt = value; - anObject = null; - } - public void set(Integer value) { - if (value != null) { - type = L_INT; - anInt = value.intValue(); - anObject = null; - } else - set(); - } - public void set(short value) { - type = SHORT; - aShort = value; - anObject = null; - } - public void set(Short value) { - if (value != null) { - type = L_SHORT; - aShort = value.shortValue(); - anObject = null; - } else - set(); - } - public void set(long value) { - type = LONG; - aLong = value; - anObject = null; - } - public void set(Long value) { - type = L_LONG; - aLong = value.longValue(); - anObject = null; - } - public void set(boolean value) { - type = BOOL; - aBool = value; - anObject = null; - } - public void set(Boolean value) { - if (value != null) { - type = L_BOOL; - aBool = value.booleanValue(); - anObject = null; - } else - set(); - } - public void set(String value) { - if (value != null) { - type = STRING; - anObject = value; - } else - set(); - } - public void set(Object value, int classObjectID) { - if (value != null) { - type = OBJECT; - classID = classObjectID; - anObject = value; - } else - set(); - } - public void setObjectID(int value) { - type = OBJECT_ID; - objectID = value; - anObject = null; - } - - // Use this if the object is an array containing IDs. The retriever - // will be used to get the next value to write to the stream. - public void setArrayIDS(ValueRetrieve retriever, int arraySize, int componentType) { - type = ARRAY_IDS; - classID = componentType; - anInt = arraySize; - anObject = retriever; - } - - - // Use this if this is a new object so that we can get the correct class type. - public void setObjectID(int value, int classObjectID) { - type = NEW_OBJECT_ID; - objectID = value; - classID = classObjectID; - anObject = null; - } - - // Use this to indicate an exception occured. - public void setException(int throwID, int throwClassID) { - type = THROW; - objectID = throwID; - classID = throwClassID; - anObject = null; - } - } - - /************************ - * Helpful commands. - * - If a command throws any exception except CommandErrorException, or - * UnexpectedCommandException with recoverable true, then the connection is in a bad state - * and needs to be closed. - ************************/ - - /** - * Use this to read a value (inputstream should be pointing to the type byte as the next byte to read). - * The primitive fields of "value" will not be changed if they are not the - * type of the value being read. However, anObject will be set to null. - */ - - /** - * Error flags for UnexpectedCommandExceptions that can be thrown. - */ - public static final Object UNKNOWN_READ_TYPE = "UNKNOWN_READ_TYPE"; // The read type byte was not a valid type //$NON-NLS-1$ - public static final Object UNKNOWN_WRITE_TYPE = "UNKNOWN_WRITE_TYPE"; // The write type byte was not a valid type //$NON-NLS-1$ - public static final Object TYPE_INVALID_FOR_COMMAND = "TYPE_INVALID_FOR_COMMAND"; // The data type read is not valid for this command //$NON-NLS-1$ - public static final Object UNKNOWN_COMMAND = "UNKNOWN_COMMAND"; // The command flag is unknown //$NON-NLS-1$ - public static final Object SOME_UNEXPECTED_EXCEPTION = "SOME_UNEXPECTED_EXCEPTION"; // There was some kind of exception that wasn't expected. The data will be the exception. //$NON-NLS-1$ - public static final Object TOO_MANY_BYTES = "TOO_MANY_BYTES"; // Too many bytes were sent on a writeBytes. It was //$NON-NLS-1$ - // more than could be read into the buffer. The data will be the size sent. - - /** - * Read a value from the stream into the value object. It will not allow values of type FLAG. - * - * @param is - * @param value - * @param allowFlag - * @return the value object sent in. This allows <code>value = Commands.readValue(is, new Commands.ValueObject());</code> - * @throws CommandException - * - * - * @since 1.0.0 - */ - public static ValueObject readValue(DataInputStream is, ValueObject value) throws CommandException { - readValue(is, value, false); - return value; - } - - /** - * Read a value from the stream into the value object. It will allow values of type FLAG if allowFlag is true. - * @param is - * @param value - * @param allowFlag <code>true</code> if values of type flag are allow. - * @throws CommandException - * - * @since 1.1.0 - */ - public static void readValue(DataInputStream is, ValueObject value, boolean allowFlag) throws CommandException { - try { - value.anObject = null; - value.type = is.readByte(); - switch (value.type) { - case BYTE: - case L_BYTE: - value.aByte = is.readByte(); - break; - case CHAR: - case L_CHAR: - value.aChar = is.readChar(); - break; - case DOUBLE: - case L_DOUBLE: - value.aDouble = is.readDouble(); - break; - case FLOAT: - case L_FLOAT: - value.aFloat = is.readFloat(); - break; - case INT: - case L_INT: - value.anInt = is.readInt(); - break; - case OBJECT_ID: - value.objectID = is.readInt(); - break; - case NEW_OBJECT_ID: - value.classID = is.readInt(); - value.objectID = is.readInt(); - break; - case THROW: - value.classID = is.readInt(); - value.objectID = is.readInt(); - break; - case SHORT: - case L_SHORT: - value.aShort = is.readShort(); - break; - case LONG: - case L_LONG: - value.aLong = is.readLong(); - break; - case BOOL: - case L_BOOL: - value.aBool = is.readBoolean(); - break; - case STRING: - value.anObject = readStringData(is); - break; - case OBJECT: - value.classID = is.readInt(); // Read the class id - ObjectInputStream oi = new ObjectInputStream(is); - value.anObject = oi.readObject(); // Read the object itself - oi = null; // Don't close it, that would close the stream itself. - break; - case ARRAY_IDS: - // The header for an array of ids. - value.classID = is.readInt(); // The component type of the array - value.anInt = is.readInt(); // The size of the array. - // At this point, it is the responsibility of the caller to use readArray to read in the array. - break; - case VOID: - break; - case FLAG: - if (allowFlag) { - value.anInt = is.readInt(); - break; - } - // Flags not allowed, so drop into default. - default: - throw new UnexpectedCommandException(UNKNOWN_READ_TYPE, false, new Byte(value.type)); - } - } catch (CommandException e) { - // rethrow this exception since we want these to go on out. - throw e; - } catch (Exception e) { - // Wrapper this one. - throw new UnexpectedExceptionCommandException(false, e); - } - } - - /** - * Special interface used to read back arrays. It will be called when - */ - public static interface ValueSender { - /** - * This is called for each entry from the array. It is assumed that the ValueSender has - * the array that is being built. - * @param value - * - * @since 1.1.0 - */ - public void sendValue(ValueObject value); - - /** - * This is called when an ARRAY_IDS is found within the reading of the array (i.e. nested arrays) - * It is asking for a new ValueSender to use while this nested array. The arrayValue contains - * the valueobject for the array header (i.e. the class id of the array and the number of elements). - * It is the responsibility of the ValueSender to store this array in the array that is being built. - * @param arrayValue - * @return - * - * @since 1.1.0 - */ - public ValueSender nestedArray(ValueObject arrayValue); - - /** - * Called to initialize the sender with the given array header. This is not always called, each usage - * knows whether it can be called or not. For example the implementation of nestedArray may not need to call initialize. - * @param arrayHeader - * - * @since 1.1.0 - */ - public void initialize(ValueObject arrayHeader); - - } - - /* - * NOTE: It is important that on the IDE side that this is called within a transaction. - * If not, there could be some corruption if proxy cleanup occurs in the middle. - */ - public static void readArray(DataInputStream is, int arraySize, ValueSender valueSender, ValueObject value, boolean allowFlag) throws CommandException { - // Anything exception other than a CommandException, we will try to flush the input so that - // it can continue with the next command and not close the connection. - RuntimeException exception = null; - for (int i=0; i<arraySize; i++) { - readValue(is, value, allowFlag); - if (exception == null) - try { - if (value.type != ARRAY_IDS) - valueSender.sendValue(value); - else { - // We have a nested array. - ValueSender nestedSender = null; - try { - nestedSender = valueSender.nestedArray(value); - } catch (RuntimeException e) { - // We still need to read in the array to flush. Create - // a dummy sender that accepts everything sent to it. - exception = e; - nestedSender = new ValueSender() { - public void sendValue(ValueObject value) { - } - public ValueSender nestedArray(ValueObject arrayValue) { - return this; - } - public void initialize(ValueObject arrayHeader) { - } - }; - } - readArray(is, value.anInt, nestedSender, value, allowFlag); - if (exception != null) - throw exception; // An exception ocurred in new sender request. - } - } catch (RuntimeException e) { - // We want to flush the queue, so save the exception for later. - exception = e; - } - } - if (exception != null) - throw exception; - } - - - /** - * Special interface to handle writing the ARRAY_IDS type. - * An instance of this object will be in the valueObject sent to writeValue when the type of the value - * is ARRAY_IDS. Then write value will know to call this interface to write out the values. - * - * @since 1.1.0 - */ - public static interface ValueRetrieve { - /** - * Returns the next value object to send. It will be called the number of times that the size of - * the array was set to be send. - * @return The value object to send. - * @throws EOFException - * - * @since 1.1.0 - */ - public ValueObject nextValue() throws EOFException; - } - - public static void writeValue(DataOutputStream os, ValueObject value, boolean asValueCommand) throws CommandException { - writeValue(os, value, asValueCommand, asValueCommand ? true : false); - } - - public static void writeValue(DataOutputStream os, ValueObject value, boolean asValueCommand, boolean flush) throws CommandException { - try { - if (asValueCommand) - os.writeByte(VALUE); - switch (value.type) { - case BYTE: - case L_BYTE: - os.writeByte(value.type); - os.writeByte(value.aByte); - break; - case CHAR: - case L_CHAR: - os.writeByte(value.type); - os.writeChar(value.aChar); - break; - case DOUBLE: - case L_DOUBLE: - os.writeByte(value.type); - os.writeDouble(value.aDouble); - break; - case FLOAT: - case L_FLOAT: - os.writeByte(value.type); - os.writeFloat(value.aFloat); - break; - case INT: - case L_INT: - os.writeByte(value.type); - os.writeInt(value.anInt); - break; - case OBJECT_ID: - os.writeByte(value.type); - os.writeInt(value.objectID); - break; - case NEW_OBJECT_ID: - os.writeByte(value.type); - os.writeInt(value.classID); - os.writeInt(value.objectID); - break; - case THROW: - os.writeByte(value.type); - os.writeInt(value.classID); - os.writeInt(value.objectID); - break; - case SHORT: - case L_SHORT: - os.writeByte(value.type); - os.writeShort(value.aShort); - break; - case LONG: - case L_LONG: - os.writeByte(value.type); - os.writeLong(value.aLong); - break; - case BOOL: - case L_BOOL: - os.writeByte(value.type); - os.writeBoolean(value.aBool); - break; - case STRING: - os.writeByte(value.type); - sendStringData(os, (String) value.anObject); - break; - case OBJECT: - os.writeByte(value.type); - os.writeInt(value.classID); // Write the class ID. - ObjectOutputStream oos = new ObjectOutputStream(os); - oos.writeObject(value.anObject); - oos.flush(); - oos = null; // Don't close it, that would close the stream itself. - break; - case ARRAY_IDS: - // We are writing out an array with ID's in it. The fields of the vale object will be: - // classID: The class id of the component type of the array. - // anObject: Contains the ValueRetriever to get the next value. - os.writeByte(ARRAY_IDS); - os.writeInt(value.classID); - os.writeInt(value.anInt); // The size of the array. - // Now comes the kludgy part, writing the values. - ValueRetrieve retriever = (ValueRetrieve) value.anObject; - int len = value.anInt; - while (len-- > 0) - writeValue(os, retriever.nextValue(), false); - break; - case VOID: - os.writeByte(value.type); - break; - case FLAG: - os.writeByte(FLAG); - os.writeInt(value.anInt); - break; - default: - os.writeByte(VOID); - throw new UnexpectedCommandException(UNKNOWN_WRITE_TYPE, true, value); - } - if (flush) - os.flush(); - } catch (CommandException e) { - // rethrow this exception since we want these to go on out. - throw e; - } catch (Exception e) { - // Wrapper this one. - throw new UnexpectedExceptionCommandException(false, e); - } - } - - /** - * For reading a large number of bytes. This is a value type, not a command. The command - * needs to be handled separately. It returns the number of bytes read. -1 if there - * is no more data to send and the stream should closed. If read something but not all, - * then just what it could read will be returned. The next read will return -1 for EOF. - * - * It will read from the format: - * int - number of bytes to read (retrieved from the stream). - * bytes - the actual bytes. - * - * Note: A command exception will be thrown if the number of bytes to read - * is larger than the size of the byte array. - */ - public static int readBytes(DataInputStream is, byte[] bytes) throws CommandException { - try { - int bytesToRead = -1; - try { - bytesToRead = is.readInt(); - } catch (EOFException e) { - } - if (bytesToRead == -1) - return -1; - if (bytesToRead > bytes.length) - throw new UnexpectedCommandException(TOO_MANY_BYTES, false, new Integer(bytesToRead)); - int start = 0; - int toRead = bytesToRead; - while (toRead > 0) { - int bytesRead = is.read(bytes, start, toRead); - if (bytesRead == -1) - return bytesToRead != toRead ? bytesToRead-toRead : -1; // Actual number read, or if none read, then EOF - start+=bytesRead; - toRead-=bytesRead; - } - return bytesToRead; - } catch (CommandException e) { - // rethrow this exception since we want these to go on out. - throw e; - } catch (Exception e) { - // Wrapper this one. - throw new UnexpectedExceptionCommandException(false, e); - } - } - - /** - * For writing a large number of bytes. This is a value type, not a command. The command - * needs to be handled separately. - * - * It will write it in the format: - * int - number of bytes - * bytes - the actual bytes. - * - */ - public static void writeBytes(DataOutputStream os, byte[] bytes, int bytesToWrite) throws CommandException { - try { - os.writeInt(bytesToWrite); - os.write(bytes, 0, bytesToWrite); - } catch (Exception e) { - // Wrapper this one. - throw new UnexpectedExceptionCommandException(false, e); - } - } - - /************************ - * Send command helpers - ************************/ - - public static void sendQuitCommand(DataOutputStream os) throws IOException { - os.writeByte(QUIT_CONNECTION); - os.flush(); - - } - - public static void sendTerminateCommand(DataOutputStream os) throws IOException { - os.writeByte(TERMINATE_SERVER); - os.flush(); - } - - - public static void releaseObjectCommand(DataOutputStream os, int id) throws IOException { - os.writeByte(Commands.RELEASE_OBJECT); - os.writeInt(id); - os.flush(); - } - - /** - * Send a callback request. The value is to be send separately. - */ - public static void sendCallbackCommand(DataOutputStream os, int callbackID, int msgID) throws CommandException { - try { - os.writeByte(CALLBACK); - os.writeInt(callbackID); - os.writeInt(msgID); - } catch (Exception e) { - // Wrapper this one. - throw new UnexpectedExceptionCommandException(false, e); - } - } - - public static void sendCallbackDoneCommand(DataOutputStream os, ValueObject value, int errorCode) throws CommandException { - try { - os.writeByte(CALLBACK_DONE); - if (errorCode == NO_ERROR) { - writeValue(os, value, true); - os.flush(); - } else - sendErrorCommand(os, errorCode, value); - } catch (CommandException e) { - // rethrow this exception since we want these to go on out. - throw e; - } catch (Exception e) { - // Wrapper this one. - throw new UnexpectedExceptionCommandException(false, e); - } - } - - /** - * Send a start callback stream request. The data will be written separately. - * There will not be a callback done command. It will return as soon as the command - * is sent. - */ - public static void sendCallbackStreamCommand(DataOutputStream os, int callbackID, int msgID) throws CommandException { - try { - os.writeByte(CALLBACK_STREAM); - os.writeInt(callbackID); - os.writeInt(msgID); - } catch (Exception e) { - // Wrapper this one. - throw new UnexpectedExceptionCommandException(false, e); - } - } - - protected static final byte STRING_NOT_CHUNKED = 0; - protected static final byte STRING_CHUNKED = 1; - protected static final byte MORE_CHUNKS = 2; - protected static final byte LAST_CHUNK = 3; - protected static final int CHUNK_SIZE = 65000/3; - - /** - * Send string data. This is for general string data. It makes sure that if the string is too big (there is a UTF-8 limit) - * that it will send it in chunks. Use the corresponding <code>readStringData</code> to read such data in. - * @param os - * @param string - * @throws IOException - * - * @since 1.0.0 - */ - public static void sendStringData(DataOutputStream os, String string) throws IOException { - // UTF-8 can take up to three bytes for each char. To be on safe side we will - // not send a string larger than 65K/3 as one chunk. - if (string.length() <= CHUNK_SIZE) { - // Less than the limit, send byte to indicate not chunked. - os.writeByte(STRING_NOT_CHUNKED); - os.writeUTF(string); - } else { - // Over limit, need to chunk it. - // send byte to indicate chunked, then send true length so that other side knows how big to create. - os.writeByte(STRING_CHUNKED); - os.writeInt(string.length()); - // Now send first chunk - for(int i=0; i<string.length(); i+=CHUNK_SIZE) { - int endIndex = i+CHUNK_SIZE; - if (i == 0) { - // The first chunk is just written as is. We know endIndex will be ok because we wouldn't get here unless LARGER than chunksize. - os.writeUTF(string.substring(i, endIndex)); - } else { - // Following chunks have either byte MORE_CHUNKS or LAST_CHUNK - if (endIndex >= string.length()) { - // This is last chunk. - os.writeByte(LAST_CHUNK); - os.writeUTF(string.substring(i)); - } else { - // This is an intermediate chunk. - os.writeByte(MORE_CHUNKS); - os.writeUTF(string.substring(i, endIndex)); - } - } - } - } - } - - /** - * Read a string that was sent using the sendStringData command. - * @param in - * @return - * @throws IOException - * - * @since 1.0.0 - */ - public static String readStringData(DataInputStream is) throws IOException { - byte chunked = is.readByte(); - if (chunked == STRING_NOT_CHUNKED) - return is.readUTF(); // Not chunk, just read it. - else { - // It is chunked. - int totalLength = is.readInt(); // Get the total length. - StringBuffer sbr = new StringBuffer(totalLength); - while(true) { - sbr.append(is.readUTF()); - if (chunked != LAST_CHUNK) - chunked = is.readByte(); - else - break; - } - return sbr.toString(); - } - } - - /** - * Read back command, expecting either a VALUE or an ERROR. You can request that - * it be of a specific type (if any type can be accepted then enter -1 for the type). - */ - public static final byte NO_TYPE_CHECK = -1; - public static void readBackValue(DataInputStream is, ValueObject value, byte expectedType) throws CommandException { - try { - byte v = is.readByte(); - switch (v) { - case VALUE: - readValue(is, value); - if (expectedType != NO_TYPE_CHECK && - !(expectedType == value.type || (expectedType == Commands.OBJECT_ID && value.type == NEW_OBJECT_ID))) - throw new UnexpectedCommandException(TYPE_INVALID_FOR_COMMAND, true, value); - break; - case ERROR: - int code = is.readInt(); - readValue(is, value); - throw new CommandErrorException(code, value); - default: - throw new UnexpectedCommandException(UNKNOWN_COMMAND, false, new Byte(v)); - } - } catch (CommandException e) { - // rethrow this exception since we want these to go on out. - throw e; - } catch (Exception e) { - // Wrapper this one. - throw new UnexpectedExceptionCommandException(false, e); - } - } - - - /** - * GetClass command returns a GetClassReturn object. - */ - public static class GetClassReturn { - public int classID; - public boolean isInterface; - public boolean isAbstract; - public String superClassname; - } - - public static GetClassReturn sendGetClassCommand(DataOutputStream os, DataInputStream is, String className) throws CommandException { - try { - os.writeByte(GET_CLASS); - os.writeUTF(className); - os.flush(); - - GetClassReturn ret = new GetClassReturn(); - byte v = is.readByte(); - switch (v) { - case GET_CLASS_RETURN: - ret.classID = is.readInt(); // Get the new class id. - ret.isInterface = is.readBoolean(); // Get the isInterface flag - ret.isAbstract = is.readBoolean(); // Get the isAbstract flag. - ret.superClassname = is.readUTF(); // Get the super class name. - return ret; - case ERROR: - int code = is.readInt(); - ValueObject value = new ValueObject(); - readValue(is, value); - throw new CommandErrorException(code, value); - default: - throw new UnexpectedCommandException(UNKNOWN_COMMAND, false, new Byte(v)); - } - } catch (CommandException e) { - // rethrow this exception since we want these to go on out. - throw e; - } catch (Exception e) { - // Wrapper this one. - throw new UnexpectedExceptionCommandException(false, e); - } - } - - /** - * GetClassFromID command returns a GetClassIDReturn object. - */ - public static class GetClassIDReturn { - public String className; - public boolean isInterface; - public boolean isAbstract; - public String superClassname; - } - - public static GetClassIDReturn sendGetClassFromIDCommand(DataOutputStream os, DataInputStream is, int classID) throws CommandException { - try { - os.writeByte(GET_CLASS_FROM_ID); - os.writeInt(classID); - os.flush(); - - GetClassIDReturn ret = new GetClassIDReturn(); - byte v = is.readByte(); - switch (v) { - case GET_CLASS_ID_RETURN: - ret.className = is.readUTF(); // Get the new class name. - ret.isInterface = is.readBoolean(); // Get the isInterface flag - ret.isAbstract = is.readBoolean(); // Get the isAbstract flag. - ret.superClassname = is.readUTF(); // Get the super class name. - return ret; - case ERROR: - int code = is.readInt(); - ValueObject value = new ValueObject(); - readValue(is, value); - throw new CommandErrorException(code, value); - default: - throw new UnexpectedCommandException(UNKNOWN_COMMAND, false, new Byte(v)); - } - } catch (CommandException e) { - // rethrow this exception since we want these to go on out. - throw e; - } catch (Exception e) { - // Wrapper this one. - throw new UnexpectedExceptionCommandException(false, e); - } - } - - public static void sendGetObjectData(DataOutputStream os, DataInputStream is, int objectID, ValueObject valueReturn) throws CommandException { - try { - os.writeByte(GET_OBJECT_DATA); - os.writeInt(objectID); - os.flush(); - readBackValue(is, valueReturn, NEW_OBJECT_ID); - } catch (CommandException e) { - // rethrow this exception since we want these to go on out. - throw e; - } catch (Exception e) { - // Wrapper this one. - throw new UnexpectedExceptionCommandException(false, e); - } - } - - public static void sendErrorCommand(DataOutputStream os, int code, ValueObject errorValue) throws CommandException { - try { - os.writeByte(ERROR); - os.writeInt(code); - writeValue(os, errorValue, false); - os.flush(); - } catch (Exception e) { - // Wrapper this one. - throw new UnexpectedExceptionCommandException(false, e); - } - } - - public static void sendNewInstance(DataOutputStream os, DataInputStream is, int classId, String initializationString, ValueObject newValueReturn) throws CommandException { - try { - os.writeByte(NEW_INIT_STRING); - os.writeInt(classId); - os.writeUTF(initializationString); - os.flush(); - readBackValue(is, newValueReturn, NO_TYPE_CHECK); - } catch (CommandException e) { - // rethrow this exception since we want these to go on out. - throw e; - } catch (Exception e) { - // Wrapper this one. - throw new UnexpectedExceptionCommandException(false, e); - } - } - - - public static void sendInvokeMethodCommand(DataOutputStream os, DataInputStream is, int methodID, ValueObject invokeOn, ValueObject parms, ValueObject valueReturn) throws CommandException { - try { - os.writeByte(INVOKE); - os.writeInt(methodID); - writeValue(os, invokeOn, false); - writeValue(os, parms, false); - os.flush(); - readBackValue(is, valueReturn, NO_TYPE_CHECK); - } catch (CommandException e) { - // rethrow this exception since we want these to go on out. - throw e; - } catch (Exception e) { - // Wrapper this one. - throw new UnexpectedExceptionCommandException(false, e); - } - } - - public static void sendInvokeMethodCommand(DataOutputStream os, DataInputStream is, ValueObject classType, String methodName, ValueObject parmTypes, ValueObject invokeOn, ValueObject parms, ValueObject valueReturn) throws CommandException { - try { - os.writeByte(INVOKE_WITH_METHOD_PASSED); - writeValue(os, classType, false); - os.writeUTF(methodName); - writeValue(os, parmTypes, false); - writeValue(os, invokeOn, false); - writeValue(os, parms, false); - os.flush(); - readBackValue(is, valueReturn, NO_TYPE_CHECK); - } catch (CommandException e) { - // rethrow this exception since we want these to go on out. - throw e; - } catch (Exception e) { - // Wrapper this one. - throw new UnexpectedExceptionCommandException(false, e); - } - } - - public static void sendGetArrayContentsCommand(DataOutputStream os, DataInputStream is, int arrayID, ValueObject valueReturn) throws CommandException { - try { - os.writeByte(GET_ARRAY_CONTENTS); - os.writeInt(arrayID); - os.flush(); - readBackValue(is, valueReturn, NO_TYPE_CHECK); - } catch (CommandException e) { - // rethrow this exception since we want these to go on out. - throw e; - } catch (Exception e) { - // Wrapper this one. - throw new UnexpectedExceptionCommandException(false, e); - } - } - - private Commands() { - // Never intended to be instantiated. - } -} diff --git a/plugins/org.eclipse.jem.proxy/remoteCommon/org/eclipse/jem/internal/proxy/common/remote/ExpressionCommands.java b/plugins/org.eclipse.jem.proxy/remoteCommon/org/eclipse/jem/internal/proxy/common/remote/ExpressionCommands.java deleted file mode 100644 index 4337086fb..000000000 --- a/plugins/org.eclipse.jem.proxy/remoteCommon/org/eclipse/jem/internal/proxy/common/remote/ExpressionCommands.java +++ /dev/null @@ -1,345 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2004, 2005 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -/* - - - */ -package org.eclipse.jem.internal.proxy.common.remote; - -import java.io.*; - -import org.eclipse.jem.internal.proxy.common.CommandException; - - -/** - * - * @since 1.0.0 - */ -public class ExpressionCommands { - - // These are the sub-commands under EXPRESSION_TREE_COMMANDS that can be send. - public static final byte - START_EXPRESSION_TREE_PROCESSING = 0, - PUSH_EXPRESSION = 1, - END_EXPRESSION_TREE_PROCESSING = 2, - SYNC_REQUEST = 3, - PULL_VALUE_REQUEST = 4, - TRANSFER_EXPRESSION_REQUEST = 5, - RESUME_EXPRESSION_REQUEST = 6; - - // These are the expression specific error codes (it can also send back general ones. See SYNC_REQUEST docs lower down). - public static final int - EXPRESSION_NOEXPRESSIONVALUE_EXCEPTION = Commands.MAX_ERROR_CODE+1; // No expression value occurred. - - // These are the flag values sent in proxy resolution when doesn't resolve to proxy. - public static final int - EXPRESSIONPROXY_VOIDTYPE = 0, // Expression proxy resolves to void type. - EXPRESSIONPROXY_NOTRESOLVED = 1; // Expression proxy not resolved. - - // These are the trace values sent in START_EXPRESSION_TREE_PROCESSING - public static final byte - TRACE_DEFAULT = -1, - TRACE_OFF = 0, - TRACE_ON = 1; - - public static final String EXPRESSIONTRACE = "proxyvm.expressionTrace"; // The system property for turning on expression tracing. //$NON-NLS-1$ - public static final String EXPRESSIONTRACE_TIMER_THRESHOLD = "proxyvm.expressionTraceTimerThreshold"; // The system property for timer threshold. //$NON-NLS-1$ - - /* - * The format of the commands are: - * Note: Most of the commands will not being doing a os.flush() at the end. We are just going to - * be streaming the data over the line. At the end we will flush and then catch up. That way - * we aren't waiting for the other side as we send the data. - * - * START_EXPRESSION_TREE_PROCESSING: 0b, trace - * Start processing. - * byte(trace): -1 : do default - * 0 : no trace - * 1 : do trace - * - * PUSH_EXPRESSION: 1b, b - * Push an expression. Where "b" is the expression type from IInternalExpressionConstants. - * The actual data that follows is expression type dependent and will be - * sent in a following call to ExpressionCommands as it builds up the actual command. - * See REMExpression and each type of push call method within it to see the actual - * sent data. - * - * END_EXPRESSION_TREE_PROCESSING: 2b - * End the processing and clean up. - * - * SYNC_REQUEST: 3b - * This will return the current status. The reason it is called sync is because the - * IDE will wait for it to complete and read back the value. It will send back: - * 1: VALUE command with boolean true as the value. - * 2: ERROR command with code of ExpressionClassNotFound, with value of String with message from exception. - * 3: ERROR command with code of EXPRESSION_NOEXPRESSIONVALUE_EXCEPTION, with value of String with message from exception. - * 4: THROWABLE command with the actual exception that occurred. - * - * - * PULL_VALUE_REQUEST: 4b - * This will do a sync up and return the value from the expression. - * IDE will wait for it to compleate and read back the value. It will send back: - * 1: VALUE command with the result as the value. - * 2: ERROR or EXCEPTION if there were errors, see SYNC_REQUEST with the format they are sent back. - * - * TRANSFER_EXPRESSION_REQUEST: 5b - * This will do a sync up, and return the ExpressionProcessorController that the request is for. And remove - * the controller from its list of active expression controllers. - * - * RESUME_EXPRESSION_REQUEST: 6b, anExpressionProcessorController - * This will take the given controller and add it to the list of controllers this connection is handling. It returns nothing. - * - * @see org.eclipse.jem.internal.proxy.initParser.tree.IInternalExpressionConstants - * @see org.eclipse.jem.internal.proxy.remote.REMExpression - * - */ - - /** - * Send the start expression processing command. - * @param expressionID - * @param trace - * @param os - * - * @throws IOException - * - * @since 1.0.0 - */ - public static void sendStartExpressionProcessingCommand(int expressionID, byte trace, DataOutputStream os) throws IOException { - os.writeByte(Commands.EXPRESSION_TREE_COMMAND); - os.writeInt(expressionID); - os.writeByte(START_EXPRESSION_TREE_PROCESSING); - os.writeByte(trace); - } - - /** - * Send the end expression processing command. - * @param expressionID - * @param os - * - * @throws IOException - * - * @since 1.0.0 - */ - public static void sendEndExpressionProcessingCommand(int expressionID, DataOutputStream os) throws IOException { - os.writeByte(Commands.EXPRESSION_TREE_COMMAND); - os.writeInt(expressionID); - os.writeByte(END_EXPRESSION_TREE_PROCESSING); - os.flush(); // Flushing because we are done and want to make sure everything goes out. - } - - /** - * Send an expression subcommand. - * @param expressionID - * @param os - * @param subcommand - * - * @throws IOException - * - * @since 1.0.0 - */ - public static void sendExpressionCommand(int expressionID, DataOutputStream os, byte subcommand) throws IOException { - os.writeByte(Commands.EXPRESSION_TREE_COMMAND); - os.writeInt(expressionID); - os.writeByte(PUSH_EXPRESSION); - os.writeByte(subcommand); - } - - /** - * Send just a byte. - * - * @param os - * @param aByte - * @throws IOException - * - * @since 1.0.0 - */ - public static void sendByte(DataOutputStream os, byte aByte) throws IOException { - os.writeByte(aByte); - } - - /** - * Send just an int. - * - * @param os - * @param anInt - * @throws IOException - * - * @since 1.0.0 - */ - public static void sendInt(DataOutputStream os, int anInt) throws IOException { - os.writeInt(anInt); - } - - /** - * Send just a string. - * - * @param os - * @param aString - * @throws IOException - * - * @since 1.0.0 - */ - public static void sendString(DataOutputStream os, String aString) throws IOException { - Commands.sendStringData(os, aString); - } - - /** - * Send just a boolean. - * - * @param os - * @param aBool - * @throws IOException - * - * @since 1.0.0 - */ - public static void sendBoolean(DataOutputStream os, boolean aBool) throws IOException { - os.writeBoolean(aBool); - } - - /** - * Send the pull value command. After processing the proxies, caller should call getFinalValue() to get the value. - * @param expressionID - * @param os - * @param is - * @param proxyids if not <code>null</code>, then this is the list of expression proxy ids that need to be returned as rendered. - * @param sender sender used to process the resolved proxy ids, or <code>null</code> if no proxy ids. - * @throws CommandException - * - * @since 1.0.0 - */ - public static void sendPullValueCommand(int expressionID, DataOutputStream os, DataInputStream is, Commands.ValueObject proxyids, Commands.ValueSender sender) throws CommandException { - try { - os.writeByte(Commands.EXPRESSION_TREE_COMMAND); - os.writeInt(expressionID); - os.writeByte(PULL_VALUE_REQUEST); - sendProxyIDs(os, proxyids); - os.flush(); - if (proxyids != null) { - Commands.readBackValue(is, proxyids, Commands.ARRAY_IDS); // Read the array header. - sender.initialize(proxyids); - Commands.readArray(is, proxyids.anInt, sender, proxyids, true); // Read the array. - } - } catch (CommandException e) { - // rethrow this exception since we want these to go on out. - throw e; - } catch (IOException e) { - // Wrapper this one. - throw new UnexpectedExceptionCommandException(false, e); - } - } - - /** - * Send a sync command. This does a synchronize with the remote expression processor. It makes sure that the - * stream is caught and doesn't return until everything on the stream has been processed. Should then call - * getFinalValue() to verify the expression is valid. - * @param expressionID - * @param os - * @param is - * @param proxyids if not <code>null</code>, then this is the list of expression proxy ids that need to be returned as rendered. - * @param sender the sender used for reading back the proxyid resolutions, or <code>null</code> if no proxy ids. - * - * @throws CommandException - * - * @since 1.0.0 - */ - public static void sendSyncCommand(int expressionID, DataOutputStream os, DataInputStream is, Commands.ValueObject proxyids, Commands.ValueSender sender) throws CommandException { - try { - os.writeByte(Commands.EXPRESSION_TREE_COMMAND); - os.writeInt(expressionID); - os.writeByte(SYNC_REQUEST); - sendProxyIDs(os, proxyids); - os.flush(); - if (proxyids != null) { - Commands.readBackValue(is, proxyids, Commands.ARRAY_IDS); // Read the array header. - sender.initialize(proxyids); - Commands.readArray(is, proxyids.anInt, sender, proxyids, true); // Read the array. - } - } catch (CommandException e) { - // rethrow this exception since we want these to go on out. - throw e; - } catch (Exception e) { - // Wrapper this one. - throw new UnexpectedExceptionCommandException(false, e); - } - } - - /** - * Send the proxyids (if not null) as part of a command. Used by sync and pullValue. - * @param os - * @param proxyids <code>null</code> if not requesting proxy ids. - * @throws IOException - * @throws CommandException - * - * @since 1.1.0 - */ - private static void sendProxyIDs(DataOutputStream os, Commands.ValueObject proxyids) throws IOException, CommandException { - if (proxyids != null) { - os.writeBoolean(true); // Indicates proxy ids being sent. - Commands.writeValue(os, proxyids, false, false); - } else - os.writeBoolean(false); // No proxyids being sent. - } - - /** - * Send the transfer expression command and receive back the expression processor controller. - * - * @param expressionID - * @param os - * @param is - * @param expressionProcesserController - * @throws CommandException - * - * @since 1.1.0 - */ - public static void sendTransferExpressionCommand(int expressionID, DataOutputStream os, DataInputStream is, Commands.ValueObject expressionProcesserController) throws CommandException { - try { - os.writeByte(Commands.EXPRESSION_TREE_COMMAND); - os.writeInt(expressionID); - os.writeByte(TRANSFER_EXPRESSION_REQUEST); - os.flush(); - Commands.readBackValue(is, expressionProcesserController, Commands.NO_TYPE_CHECK); // Read the expression processor controller - } catch (CommandException e) { - throw e; - } catch (Exception e) { - // Wrapper this one. - throw new UnexpectedExceptionCommandException(false, e); - } - } - - /** - * Send the resume expression command with given expression processor controller. - * - * @param expressionID - * @param os - * @param expressionProcessorController - * @throws CommandException - * - * @since 1.1.0 - */ - public static void sendResumeExpressionCommand(int expressionID, DataOutputStream os, Commands.ValueObject expressionProcessorController) throws CommandException { - try { - os.writeByte(Commands.EXPRESSION_TREE_COMMAND); - os.writeInt(expressionID); - os.writeByte(RESUME_EXPRESSION_REQUEST); - Commands.writeValue(os, expressionProcessorController, false, false); - } catch (CommandException e) { - throw e; - } catch (Exception e) { - // Wrapper this one. - throw new UnexpectedExceptionCommandException(false, e); - } - } - - private ExpressionCommands() { - // Never intended to be instantiated. - } - -} diff --git a/plugins/org.eclipse.jem.proxy/remoteCommon/org/eclipse/jem/internal/proxy/common/remote/IOCommandException.java b/plugins/org.eclipse.jem.proxy/remoteCommon/org/eclipse/jem/internal/proxy/common/remote/IOCommandException.java deleted file mode 100644 index eb51a70ea..000000000 --- a/plugins/org.eclipse.jem.proxy/remoteCommon/org/eclipse/jem/internal/proxy/common/remote/IOCommandException.java +++ /dev/null @@ -1,60 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2001, 2005 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.jem.internal.proxy.common.remote; -/* - - - */ - -import java.io.IOException; -import org.eclipse.jem.internal.proxy.common.CommandException; - -/** - * A command exception occured while processing an io request - * in a callback stream. This exception wrappers the command exception. - */ - -public class IOCommandException extends IOException { - /** - * Comment for <code>serialVersionUID</code> - * - * @since 1.1.0 - */ - private static final long serialVersionUID = -2308947195164382779L; - protected CommandException fException; - - public IOCommandException(CommandException e) { - fException = e; - } - - public CommandException getException() { - return fException; - } - - public String getMessage() { - return fException.getMessage(); - } - - public void printStackTrace() { - fException.printStackTrace(); - } - - public void printStackTrace(java.io.PrintStream p) { - fException.printStackTrace(p); - } - - public void printStackTrace(java.io.PrintWriter p) { - fException.printStackTrace(p); - } - -} - - diff --git a/plugins/org.eclipse.jem.proxy/remoteCommon/org/eclipse/jem/internal/proxy/common/remote/TransmitableArray.java b/plugins/org.eclipse.jem.proxy/remoteCommon/org/eclipse/jem/internal/proxy/common/remote/TransmitableArray.java deleted file mode 100644 index a6c4271ee..000000000 --- a/plugins/org.eclipse.jem.proxy/remoteCommon/org/eclipse/jem/internal/proxy/common/remote/TransmitableArray.java +++ /dev/null @@ -1,36 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2001, 2005 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.jem.internal.proxy.common.remote; -/* - - - */ - - -/** - * A value can be a TransmitableArray. This means this value is an array that - * needs to have a ValueRetriever created for it. This is used if the array has ID's in - * it and is not an existing array on the server or all constant values. - * - * NOTE: It is assumed that all IBeanTypeProxies of the parms have already been retrieved. - * It should still work, but it could be asking for them in the middle of the request - * if they are not first gotton. And this could throw a non-recoverable exception if not found. - */ -public final class TransmitableArray { - public int componentTypeID; // The id of the type of the component type of the array. - public Object[] array; // The array it self. - public TransmitableArray(int typeID, Object[] anArray) { - componentTypeID = typeID; - array = anArray; - } -} - - diff --git a/plugins/org.eclipse.jem.proxy/remoteCommon/org/eclipse/jem/internal/proxy/common/remote/UnexpectedCommandException.java b/plugins/org.eclipse.jem.proxy/remoteCommon/org/eclipse/jem/internal/proxy/common/remote/UnexpectedCommandException.java deleted file mode 100644 index 3afd47877..000000000 --- a/plugins/org.eclipse.jem.proxy/remoteCommon/org/eclipse/jem/internal/proxy/common/remote/UnexpectedCommandException.java +++ /dev/null @@ -1,72 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2001, 2005 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.jem.internal.proxy.common.remote; -/* - - - */ - -import org.eclipse.jem.internal.proxy.common.CommandException; -/** - * This is an exception that is thrown when the processing - * of data was invalid for the command. - * There will be a flag indicting error type, and a flag - * indicating whether the connection is recoverable or not. - * If not recoverable, then the connection needs to be closed. - * - */ -public class UnexpectedCommandException extends CommandException { - /** - * Comment for <code>serialVersionUID</code> - * - * @since 1.1.0 - */ - private static final long serialVersionUID = 7097693384453243113L; - private final Object fErrorType; - private final boolean fRecoverable; - - public UnexpectedCommandException(Object errorType, boolean recoverable) { - fErrorType = errorType; - fRecoverable = recoverable; - } - - public UnexpectedCommandException(Object errorType, boolean recoverable, Object data) { - super(data); - fErrorType = errorType; - fRecoverable = recoverable; - } - - public UnexpectedCommandException(Object errorType, boolean recoverable, String msg, Object data) { - super(msg, data); - fErrorType = errorType; - fRecoverable = recoverable; - } - - public Object getErrorType() { - return fErrorType; - } - - public boolean isRecoverable() { - return fRecoverable; - } - - public String getMessage() { - String m = super.getMessage(); - if (fErrorType != null) { - String dataMsg = getExceptionData() != null ? " Errordata="+getExceptionData().toString() : ""; //$NON-NLS-1$ //$NON-NLS-2$ - if (m == null) - return "Errortype="+fErrorType.toString() + dataMsg; //$NON-NLS-1$ - else - return m + ':' + "Errortype="+fErrorType.toString() + dataMsg; //$NON-NLS-1$ - } else - return m; - } -} diff --git a/plugins/org.eclipse.jem.proxy/remoteCommon/org/eclipse/jem/internal/proxy/common/remote/UnexpectedExceptionCommandException.java b/plugins/org.eclipse.jem.proxy/remoteCommon/org/eclipse/jem/internal/proxy/common/remote/UnexpectedExceptionCommandException.java deleted file mode 100644 index dc0316a3e..000000000 --- a/plugins/org.eclipse.jem.proxy/remoteCommon/org/eclipse/jem/internal/proxy/common/remote/UnexpectedExceptionCommandException.java +++ /dev/null @@ -1,67 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2001, 2005 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.jem.internal.proxy.common.remote; -/* - - - */ - -/** - * Wrapper an unexpected exception in a Command Exception. - */ -public class UnexpectedExceptionCommandException extends UnexpectedCommandException { - - /** - * Comment for <code>serialVersionUID</code> - * - * @since 1.1.0 - */ - private static final long serialVersionUID = -1654134370115650969L; - - public UnexpectedExceptionCommandException(boolean recoverable, Throwable data) { - super(Commands.SOME_UNEXPECTED_EXCEPTION, recoverable, data); - } - - public UnexpectedExceptionCommandException(boolean recoverable, String msg, Throwable data) { - super(Commands.SOME_UNEXPECTED_EXCEPTION, recoverable, msg, data); - } - - public Throwable getException() { - return (Throwable) getExceptionData(); - } - - public String getMessage() { - String localMsg = super.getMessage(); - if (getException() != null) - if (localMsg == null || localMsg.length() == 0) - return getException().getLocalizedMessage(); - else - return localMsg + ": " + getException().getLocalizedMessage(); //$NON-NLS-1$ - return - localMsg; - } - - public void printExceptionStackTrace() { - getException().printStackTrace(); - } - - public void printStackTrace() { - printExceptionStackTrace(); - } - - public void printStackTrace(java.io.PrintStream p) { - getException().printStackTrace(p); - } - - public void printStackTrace(java.io.PrintWriter p) { - getException().printStackTrace(p); - } -} |