/** * * Copyright 2004-2005 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.geronimo.interop.rmi.iiop; import org.omg.CORBA.TCKind; /** * * An implementation of CORBA 'any'. */ public class Any extends org.omg.CORBA.Any { private org.omg.CORBA.TypeCode _type; private byte[] _data; /** * @param tk * @param what */ private void extract_type(TCKind tk, String what) { if (_type.kind().value() != tk.value()) { throw new org.omg.CORBA.BAD_TYPECODE("org.apache.geronimo.interop.rmi.iiop.Any.extract_" + what + ": type = " + _type); } } /** * */ public Any() { _type = TypeCode.NULL; } /** * @param a * @return */ public boolean equal(org.omg.CORBA.Any a) { if (!_type.equal(a.type())) { return false; } if (a instanceof org.apache.geronimo.interop.rmi.iiop.Any) { org.apache.geronimo.interop.rmi.iiop.Any _that = (org.apache.geronimo.interop.rmi.iiop.Any) a; String x = org.apache.geronimo.interop.util.Base16Binary.toString(this._data); String y = org.apache.geronimo.interop.util.Base16Binary.toString(_that._data); return x.equals(y); } else { // TODO: implement equality testing with other ORB's 'any' values throw new org.omg.CORBA.NO_IMPLEMENT("org.apache.geronimo.interop.rmi.iiop.Any.equal(" + a.getClass().getName() + ")"); } } /** * @return */ public org.omg.CORBA.TypeCode type() { return _type; } /** * @param type */ public void type(org.omg.CORBA.TypeCode type) { _type = type; } /** * @param input * @param type */ public void read_value(org.omg.CORBA.portable.InputStream input, org.omg.CORBA.TypeCode type) { byte[] buffer = ((CdrInputStream) input)._buffer; int length = ((CdrInputStream) input)._length; _type = type; _data = new byte[length]; System.arraycopy(buffer, 0, _data, 0, length); } /** * @param output */ public void write_value(org.omg.CORBA.portable.OutputStream output) { // A no-op in this implementation. } /** * @return */ public org.omg.CORBA.portable.OutputStream create_output_stream() { _data = null; return CdrOutputStream.getInstance(); } /** * @return */ public org.omg.CORBA.portable.InputStream create_input_stream() { if (_data == null) { throw new org.omg.CORBA.BAD_OPERATION( "org.apache.geronimo.interop.rmi.Any.create_input_stream"); } return CdrInputStream.getInstance(); } /** * @return */ public short extract_short() { extract_type(TCKind.tk_short, "short"); return create_input_stream().read_short(); } /** * @param value */ public void insert_short(short value) { org.omg.CORBA.portable.OutputStream output = create_output_stream(); output.write_short(value); read_value(null, TypeCode.SHORT); } /** * @return */ public int extract_long() { extract_type(TCKind.tk_long, "long"); return create_input_stream().read_long(); } /** * @param value */ public void insert_long(int value) { org.omg.CORBA.portable.OutputStream output = create_output_stream(); output.write_long(value); read_value(null, TypeCode.LONG); } /** * @return */ public long extract_longlong() { extract_type(TCKind.tk_longlong, "longlong"); return create_input_stream().read_longlong(); } /** * @param value */ public void insert_longlong(long value) { org.omg.CORBA.portable.OutputStream output = create_output_stream(); output.write_longlong(value); read_value(null, TypeCode.LONGLONG); } /** * @return */ public short extract_ushort() { extract_type(TCKind.tk_ushort, "ushort"); return create_input_stream().read_ushort(); } /** * @param value */ public void insert_ushort(short value) { org.omg.CORBA.portable.OutputStream output = create_output_stream(); output.write_ushort(value); read_value(null, TypeCode.USHORT); } /** * @return */ public int extract_ulong() { extract_type(TCKind.tk_ulong, "ulong"); return create_input_stream().read_ulong(); } /** * @param value */ public void insert_ulong(int value) { org.omg.CORBA.portable.OutputStream output = create_output_stream(); output.write_ulong(value); read_value(null, TypeCode.ULONG); } /** * @return */ public long extract_ulonglong() { extract_type(TCKind.tk_ulonglong, "ulonglong"); return create_input_stream().read_ulonglong(); } /** * @param value */ public void insert_ulonglong(long value) { org.omg.CORBA.portable.OutputStream output = create_output_stream(); output.write_ulonglong(value); read_value(null, TypeCode.ULONGLONG); } /** * @return */ public float extract_float() { extract_type(TCKind.tk_float, "float"); return create_input_stream().read_float(); } /** * @param value */ public void insert_float(float value) { org.omg.CORBA.portable.OutputStream output = create_output_stream(); output.write_float(value); read_value(null, TypeCode.FLOAT); } /** * @return */ public double extract_double() { extract_type(TCKind.tk_double, "double"); return create_input_stream().read_double(); } /** * @param value */ public void insert_double(double value) { org.omg.CORBA.portable.OutputStream output = create_output_stream(); output.write_double(value); read_value(null, TypeCode.DOUBLE); } /** * @return */ public boolean extract_boolean() { extract_type(TCKind.tk_boolean, "boolean"); return create_input_stream().read_boolean(); } /** * @param value */ public void insert_boolean(boolean value) { org.omg.CORBA.portable.OutputStream output = create_output_stream(); output.write_boolean(value); read_value(null, TypeCode.BOOLEAN); } /** * @return */ public char extract_char() { extract_type(TCKind.tk_char, "char"); return create_input_stream().read_char(); } /** * @param value */ public void insert_char(char value) { org.omg.CORBA.portable.OutputStream output = create_output_stream(); output.write_char(value); read_value(null, TypeCode.CHAR); } /** * @return */ public char extract_wchar() { extract_type(TCKind.tk_wchar, "wchar"); return create_input_stream().read_wchar(); } /** * @param value */ public void insert_wchar(char value) { org.omg.CORBA.portable.OutputStream output = create_output_stream(); output.write_wchar(value); read_value(null, TypeCode.WCHAR); } /** * @return */ public byte extract_octet() { extract_type(TCKind.tk_octet, "octet"); return create_input_stream().read_octet(); } /** * @param value */ public void insert_octet(byte value) { org.omg.CORBA.portable.OutputStream output = create_output_stream(); output.write_octet(value); read_value(null, TypeCode.OCTET); } /** * @return */ public org.omg.CORBA.Any extract_any() { extract_type(TCKind.tk_any, "any"); return create_input_stream().read_any(); } /** * @param value */ public void insert_any(org.omg.CORBA.Any value) { org.omg.CORBA.portable.OutputStream output = create_output_stream(); output.write_any(value); read_value(null, TypeCode.ANY); } /** * @return */ public org.omg.CORBA.Object extract_Object() { extract_type(TCKind.tk_objref, "Object"); org.omg.CORBA.Object obj = create_input_stream().read_Object(); return obj; } /** * @param value */ public void insert_Object(org.omg.CORBA.Object value) { org.omg.CORBA.portable.OutputStream output = create_output_stream(); output.write_Object(value); read_value(null, TypeCode.OBJREF); } /** * @param value * @param type */ public void insert_Object(org.omg.CORBA.Object value, org.omg.CORBA.TypeCode type) { org.omg.CORBA.portable.OutputStream output = create_output_stream(); output.write_Object(value); read_value(null, type); } /** * @return */ public java.io.Serializable extract_Value() { throw new org.omg.CORBA.NO_IMPLEMENT(); } /** * @param v */ public void insert_Value(java.io.Serializable v) { throw new org.omg.CORBA.NO_IMPLEMENT(); } /** * @param v * @param t */ public void insert_Value(java.io.Serializable v, org.omg.CORBA.TypeCode t) { throw new org.omg.CORBA.NO_IMPLEMENT(); } /** * @return */ public String extract_string() { extract_type(TCKind.tk_string, "string"); return create_input_stream().read_string(); } /** * @param value */ public void insert_string(String value) { org.omg.CORBA.portable.OutputStream output = create_output_stream(); output.write_string(value); read_value(null, TypeCode.STRING); } /** * @return */ public String extract_wstring() { extract_type(TCKind.tk_wstring, "wstring"); return create_input_stream().read_wstring(); } /** * @param value */ public void insert_wstring(String value) { org.omg.CORBA.portable.OutputStream output = create_output_stream(); output.write_wstring(value); read_value(null, TypeCode.WSTRING); } /** * @return */ public org.omg.CORBA.TypeCode extract_TypeCode() { extract_type(TCKind.tk_TypeCode, "TypeCode"); return create_input_stream().read_TypeCode(); } /** * @param value */ public void insert_TypeCode(org.omg.CORBA.TypeCode value) { org.omg.CORBA.portable.OutputStream output = create_output_stream(); output.write_TypeCode(value); read_value(null, TypeCode.TYPECODE); } /** * @return */ public org.omg.CORBA.Principal extract_Principal() { throw new org.omg.CORBA.NO_IMPLEMENT( "org.apache.geronimo.interop.rmi.iiop.Any.extract_Principal"); } public void insert_Principal(org.omg.CORBA.Principal value) { throw new org.omg.CORBA.NO_IMPLEMENT( "org.apache.geronimo.interop.rmi.iiop.Any.insert_Principal"); } // Don't implement insert_Streamable and extract_Streamable since from // a TypeCode it appears to be impossible to determine the holder class // name (in the general case) in order to construct a Streamable object // for return from extract_Streamable. /** * @return * @throws org.omg.CORBA.BAD_INV_ORDER */ public org.omg.CORBA.portable.Streamable extract_Streamable() throws org.omg.CORBA.BAD_INV_ORDER { throw new org.omg.CORBA.NO_IMPLEMENT(); } /** * @param s */ public void insert_Streamable(org.omg.CORBA.portable.Streamable s) { throw new org.omg.CORBA.NO_IMPLEMENT(); } /** * * Construct an Any from a TypeCode and a String value * * (supported for boolean and numeric primitive IDL types only). */ /** * @param type * @param value */ public Any(org.omg.CORBA.TypeCode type, String value) { try { _type = type; switch (_type.kind().value()) { case TCKind._tk_boolean: if (value.equals("0")) { insert_boolean(false); } else if (value.equals("1")) { insert_boolean(true); } else { insert_boolean(Boolean.valueOf(value).booleanValue()); } break; case TCKind._tk_octet: // Don't use class Byte as it isn't present in JDK 1.0.2 insert_octet((byte) parse(value, 0, 255)); break; case TCKind._tk_short: // Don't use class Short as it isn't present in JDK 1.0.2 insert_short((short) parse(value, -32768, 32767)); break; case TCKind._tk_ushort: // Don't use class Short as it isn't present in JDK 1.0.2 insert_ushort((short) parse(value, 0, 65535)); break; case TCKind._tk_long: insert_long((int) parse(value, -2147483648, 2147483647)); break; case TCKind._tk_ulong: insert_ulong((int) parse(value, 0, 4294967295L)); break; case TCKind._tk_longlong: insert_longlong(Long.parseLong(value)); break; case TCKind._tk_ulonglong: // Note: doesn't handle "unsigned long" values >= 2^63. Fix // this if reported by customers. insert_ulonglong(Long.parseLong(value)); break; case TCKind._tk_float: insert_float(Float.valueOf(value).floatValue()); break; case TCKind._tk_double: insert_double(Double.valueOf(value).doubleValue()); break; default: throw new org.omg.CORBA.BAD_PARAM(value); } } catch (NumberFormatException nfe) { throw new org.omg.CORBA.BAD_PARAM(value + " - " + nfe.toString()); } } /** * @param value * @param min * @param max * @return * @throws NumberFormatException */ private long parse(String value, long min, long max) throws NumberFormatException { long n = Long.parseLong(value); if (n < min || n > max) { throw new NumberFormatException(value + " is not in range [" + min + ".." + max + "]"); } return n; } /** * @return */ public String toString() { switch (_type.kind().value()) { case TCKind._tk_any: case TCKind._tk_boolean: case TCKind._tk_char: case TCKind._tk_wchar: case TCKind._tk_octet: case TCKind._tk_short: case TCKind._tk_ushort: case TCKind._tk_long: case TCKind._tk_ulong: case TCKind._tk_longlong: case TCKind._tk_ulonglong: case TCKind._tk_float: case TCKind._tk_double: case TCKind._tk_string: case TCKind._tk_wstring: case TCKind._tk_objref: return value(); default: // TODO: traverse structure to produce printable output return _type.toString(); } } /** * @return */ private String value() { switch (_type.kind().value()) { case TCKind._tk_any: return "" + extract_any(); case TCKind._tk_boolean: return extract_boolean() ? "TRUE" : "FALSE"; case TCKind._tk_char: return "'" + extract_char() + "'"; case TCKind._tk_wchar: return "'" + extract_wchar() + "'"; case TCKind._tk_octet: return "" + extract_octet(); case TCKind._tk_short: return "" + extract_short(); case TCKind._tk_ushort: return "" + extract_ushort(); case TCKind._tk_long: return "" + extract_long(); case TCKind._tk_ulong: return "" + extract_ulong(); case TCKind._tk_longlong: return "" + extract_longlong(); case TCKind._tk_ulonglong: return "" + extract_ulonglong(); case TCKind._tk_float: return "" + extract_float(); case TCKind._tk_double: return "" + extract_double(); case TCKind._tk_string: return "\"" + extract_string() + "\""; case TCKind._tk_wstring: return "\"" + extract_wstring() + "\""; case TCKind._tk_objref: return extract_Object().toString(); case TCKind._tk_TypeCode: return "" + extract_TypeCode(); default: return "?"; } } }