1*b1cdbd2cSJim Jagielski /************************************************************** 2*b1cdbd2cSJim Jagielski * 3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one 4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file 5*b1cdbd2cSJim Jagielski * distributed with this work for additional information 6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file 7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the 8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance 9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at 10*b1cdbd2cSJim Jagielski * 11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0 12*b1cdbd2cSJim Jagielski * 13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing, 14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an 15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the 17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations 18*b1cdbd2cSJim Jagielski * under the License. 19*b1cdbd2cSJim Jagielski * 20*b1cdbd2cSJim Jagielski *************************************************************/ 21*b1cdbd2cSJim Jagielski 22*b1cdbd2cSJim Jagielski package com.sun.star.uno; 23*b1cdbd2cSJim Jagielski 24*b1cdbd2cSJim Jagielski /** This class provides static methods which aim at exploring the contents of an 25*b1cdbd2cSJim Jagielski * Any and extracting its value. All public methods take an Object argument that 26*b1cdbd2cSJim Jagielski * either is the immediate object, such as Boolean, Type, interface implementation, 27*b1cdbd2cSJim Jagielski * or an Any that contains an object. <br>The methods which extract the value do a 28*b1cdbd2cSJim Jagielski * widening conversion. See the method comments for the respective conversions. 29*b1cdbd2cSJim Jagielski */ 30*b1cdbd2cSJim Jagielski public class AnyConverter 31*b1cdbd2cSJim Jagielski { 32*b1cdbd2cSJim Jagielski /** Determines the type of an any object. 33*b1cdbd2cSJim Jagielski 34*b1cdbd2cSJim Jagielski @param object any object 35*b1cdbd2cSJim Jagielski @return type object 36*b1cdbd2cSJim Jagielski */ getType( Object object )37*b1cdbd2cSJim Jagielski static public Type getType( Object object ) 38*b1cdbd2cSJim Jagielski { 39*b1cdbd2cSJim Jagielski Type t; 40*b1cdbd2cSJim Jagielski if (null == object) 41*b1cdbd2cSJim Jagielski { 42*b1cdbd2cSJim Jagielski t = m_XInterface_type; 43*b1cdbd2cSJim Jagielski } 44*b1cdbd2cSJim Jagielski else if (object instanceof Any) 45*b1cdbd2cSJim Jagielski { 46*b1cdbd2cSJim Jagielski t = ((Any)object).getType(); 47*b1cdbd2cSJim Jagielski // nested any 48*b1cdbd2cSJim Jagielski if (TypeClass.ANY_value == t.getTypeClass().getValue()) 49*b1cdbd2cSJim Jagielski return getType( ((Any)object).getObject() ); 50*b1cdbd2cSJim Jagielski } 51*b1cdbd2cSJim Jagielski else 52*b1cdbd2cSJim Jagielski { 53*b1cdbd2cSJim Jagielski t = new Type( object.getClass() ); 54*b1cdbd2cSJim Jagielski } 55*b1cdbd2cSJim Jagielski return t; 56*b1cdbd2cSJim Jagielski } 57*b1cdbd2cSJim Jagielski 58*b1cdbd2cSJim Jagielski /** checks if the any contains the idl type <code>void</code>. 59*b1cdbd2cSJim Jagielski @param object the object to check 60*b1cdbd2cSJim Jagielski @return true when the any is void, false otherwise 61*b1cdbd2cSJim Jagielski */ isVoid(Object object)62*b1cdbd2cSJim Jagielski static public boolean isVoid(Object object){ 63*b1cdbd2cSJim Jagielski return containsType(TypeClass.VOID, object); 64*b1cdbd2cSJim Jagielski } 65*b1cdbd2cSJim Jagielski 66*b1cdbd2cSJim Jagielski /** checks if the any contains a value of the idl type <code>char</code>. 67*b1cdbd2cSJim Jagielski @param object the object to check 68*b1cdbd2cSJim Jagielski @return true when the any contains a char, false otherwise. 69*b1cdbd2cSJim Jagielski */ isChar(Object object)70*b1cdbd2cSJim Jagielski static public boolean isChar(Object object){ 71*b1cdbd2cSJim Jagielski return containsType(TypeClass.CHAR, object); 72*b1cdbd2cSJim Jagielski } 73*b1cdbd2cSJim Jagielski 74*b1cdbd2cSJim Jagielski /** checks if the any contains a value of the idl type <code>boolean</code>. 75*b1cdbd2cSJim Jagielski @param object the object to check 76*b1cdbd2cSJim Jagielski @return true when the any contains a boolean, false otherwise. 77*b1cdbd2cSJim Jagielski */ isBoolean(Object object)78*b1cdbd2cSJim Jagielski static public boolean isBoolean(Object object){ 79*b1cdbd2cSJim Jagielski return containsType(TypeClass.BOOLEAN, object); 80*b1cdbd2cSJim Jagielski } 81*b1cdbd2cSJim Jagielski 82*b1cdbd2cSJim Jagielski /** checks if the any contains a value of the idl type <code>byte</code>. 83*b1cdbd2cSJim Jagielski @param object the object to check 84*b1cdbd2cSJim Jagielski @return true when the any contains a byte, false otherwise. 85*b1cdbd2cSJim Jagielski */ isByte(Object object)86*b1cdbd2cSJim Jagielski static public boolean isByte(Object object){ 87*b1cdbd2cSJim Jagielski return containsType(TypeClass.BYTE, object); 88*b1cdbd2cSJim Jagielski } 89*b1cdbd2cSJim Jagielski 90*b1cdbd2cSJim Jagielski /** checks if the any contains a value of the idl type <code>short</code>. 91*b1cdbd2cSJim Jagielski @param object the object to check 92*b1cdbd2cSJim Jagielski @return true when the any contains a short, false otherwise. 93*b1cdbd2cSJim Jagielski */ isShort(Object object)94*b1cdbd2cSJim Jagielski static public boolean isShort(Object object){ 95*b1cdbd2cSJim Jagielski return containsType(TypeClass.SHORT, object); 96*b1cdbd2cSJim Jagielski } 97*b1cdbd2cSJim Jagielski 98*b1cdbd2cSJim Jagielski /** checks if the any contains a value of the idl type <code>long</code> (which maps to a java-int). 99*b1cdbd2cSJim Jagielski @param object the object to check 100*b1cdbd2cSJim Jagielski @return true when the any contains a int, false otherwise. 101*b1cdbd2cSJim Jagielski */ isInt(Object object)102*b1cdbd2cSJim Jagielski static public boolean isInt(Object object){ 103*b1cdbd2cSJim Jagielski return containsType(TypeClass.LONG, object); 104*b1cdbd2cSJim Jagielski } 105*b1cdbd2cSJim Jagielski 106*b1cdbd2cSJim Jagielski /** checks if the any contains a value of the idl type <code>hyper</code> (which maps to a java-long). 107*b1cdbd2cSJim Jagielski @param object the object to check 108*b1cdbd2cSJim Jagielski @return true when the any contains a long, false otherwise. 109*b1cdbd2cSJim Jagielski */ isLong(Object object)110*b1cdbd2cSJim Jagielski static public boolean isLong(Object object){ 111*b1cdbd2cSJim Jagielski return containsType(TypeClass.HYPER, object); 112*b1cdbd2cSJim Jagielski } 113*b1cdbd2cSJim Jagielski 114*b1cdbd2cSJim Jagielski /** checks if the any contains a value of the idl type <code>float</code>. 115*b1cdbd2cSJim Jagielski @param object the object to check 116*b1cdbd2cSJim Jagielski @return true when the any contains a float, false otherwise. 117*b1cdbd2cSJim Jagielski */ isFloat(Object object)118*b1cdbd2cSJim Jagielski static public boolean isFloat(Object object){ 119*b1cdbd2cSJim Jagielski return containsType(TypeClass.FLOAT, object); 120*b1cdbd2cSJim Jagielski } 121*b1cdbd2cSJim Jagielski 122*b1cdbd2cSJim Jagielski /** checks if the any contains a value of the idl type <code>double</code>. 123*b1cdbd2cSJim Jagielski @param object the object to check 124*b1cdbd2cSJim Jagielski @return true when the any contains a double, false otherwise. 125*b1cdbd2cSJim Jagielski */ isDouble(Object object)126*b1cdbd2cSJim Jagielski static public boolean isDouble(Object object){ 127*b1cdbd2cSJim Jagielski return containsType(TypeClass.DOUBLE, object); 128*b1cdbd2cSJim Jagielski } 129*b1cdbd2cSJim Jagielski 130*b1cdbd2cSJim Jagielski /** checks if the any contains a value of the idl type <code>string</code>. 131*b1cdbd2cSJim Jagielski @param object the object to check 132*b1cdbd2cSJim Jagielski @return true when the any contains a string, false otherwise. 133*b1cdbd2cSJim Jagielski */ isString(Object object)134*b1cdbd2cSJim Jagielski static public boolean isString(Object object){ 135*b1cdbd2cSJim Jagielski return containsType(TypeClass.STRING, object); 136*b1cdbd2cSJim Jagielski } 137*b1cdbd2cSJim Jagielski 138*b1cdbd2cSJim Jagielski /** checks if the any contains a value of the idl type <code>enum</code>. 139*b1cdbd2cSJim Jagielski @param object the object to check 140*b1cdbd2cSJim Jagielski @return true if the any contains an enum, false otherwise 141*b1cdbd2cSJim Jagielski */ isEnum(Object object)142*b1cdbd2cSJim Jagielski static public boolean isEnum(Object object) 143*b1cdbd2cSJim Jagielski { 144*b1cdbd2cSJim Jagielski return containsType(TypeClass.ENUM, object); 145*b1cdbd2cSJim Jagielski } 146*b1cdbd2cSJim Jagielski 147*b1cdbd2cSJim Jagielski /** checks if the any contains a value of the idl type <code>type</code>. 148*b1cdbd2cSJim Jagielski @param object the object to check 149*b1cdbd2cSJim Jagielski @return true when the any contains a type, false otherwise. 150*b1cdbd2cSJim Jagielski */ isType(Object object)151*b1cdbd2cSJim Jagielski static public boolean isType(Object object){ 152*b1cdbd2cSJim Jagielski return containsType(TypeClass.TYPE, object); 153*b1cdbd2cSJim Jagielski } 154*b1cdbd2cSJim Jagielski 155*b1cdbd2cSJim Jagielski /** checks if the any contains an interface, struct, exception, sequence or enum. 156*b1cdbd2cSJim Jagielski If <em>object</em> is an any with an interface type, then true is also returned if 157*b1cdbd2cSJim Jagielski the any contains a null reference. This is because interfaces are allowed to have 158*b1cdbd2cSJim Jagielski a null value contrary to other UNO types. 159*b1cdbd2cSJim Jagielski @param object the object to check 160*b1cdbd2cSJim Jagielski @return true if the any contains an object 161*b1cdbd2cSJim Jagielski */ isObject(Object object)162*b1cdbd2cSJim Jagielski static public boolean isObject(Object object) 163*b1cdbd2cSJim Jagielski { 164*b1cdbd2cSJim Jagielski int tc = getType(object).getTypeClass().getValue(); 165*b1cdbd2cSJim Jagielski return (TypeClass.INTERFACE_value == tc || 166*b1cdbd2cSJim Jagielski TypeClass.STRUCT_value == tc || 167*b1cdbd2cSJim Jagielski TypeClass.EXCEPTION_value == tc || 168*b1cdbd2cSJim Jagielski TypeClass.SEQUENCE_value == tc || 169*b1cdbd2cSJim Jagielski TypeClass.ENUM_value == tc); 170*b1cdbd2cSJim Jagielski } 171*b1cdbd2cSJim Jagielski 172*b1cdbd2cSJim Jagielski /** checks if the any contains UNO idl sequence value (meaning a java array 173*b1cdbd2cSJim Jagielski containing elements which are values of UNO idl types). 174*b1cdbd2cSJim Jagielski @param object the object to check 175*b1cdbd2cSJim Jagielski @return true when the any contains an object which implements interfaces, false otherwise. 176*b1cdbd2cSJim Jagielski */ isArray(Object object)177*b1cdbd2cSJim Jagielski static public boolean isArray(Object object){ 178*b1cdbd2cSJim Jagielski return containsType(TypeClass.SEQUENCE, object); 179*b1cdbd2cSJim Jagielski } 180*b1cdbd2cSJim Jagielski 181*b1cdbd2cSJim Jagielski /** converts an Char object or an Any object containing a Char object into a simple char. 182*b1cdbd2cSJim Jagielski @param object the object to convert 183*b1cdbd2cSJim Jagielski @return the char contained within the object 184*b1cdbd2cSJim Jagielski @throws com.sun.star.lang.IllegalArgumentException in case no char is contained within object 185*b1cdbd2cSJim Jagielski @see #isChar 186*b1cdbd2cSJim Jagielski */ toChar(Object object)187*b1cdbd2cSJim Jagielski static public char toChar(Object object) throws com.sun.star.lang.IllegalArgumentException{ 188*b1cdbd2cSJim Jagielski Character ret= (Character)convertSimple(TypeClass.CHAR, null, object); 189*b1cdbd2cSJim Jagielski return ret.charValue(); 190*b1cdbd2cSJim Jagielski } 191*b1cdbd2cSJim Jagielski 192*b1cdbd2cSJim Jagielski /** converts an Boolean object or an Any object containing a Boolean object into a simple boolean. 193*b1cdbd2cSJim Jagielski @param object the object to convert 194*b1cdbd2cSJim Jagielski @return the boolean contained within the object 195*b1cdbd2cSJim Jagielski @throws com.sun.star.lang.IllegalArgumentException in case no boolean is contained within object 196*b1cdbd2cSJim Jagielski @see #isBoolean 197*b1cdbd2cSJim Jagielski */ toBoolean(Object object)198*b1cdbd2cSJim Jagielski static public boolean toBoolean(Object object) throws com.sun.star.lang.IllegalArgumentException{ 199*b1cdbd2cSJim Jagielski Boolean ret= (Boolean)convertSimple(TypeClass.BOOLEAN, null, object); 200*b1cdbd2cSJim Jagielski return ret.booleanValue(); 201*b1cdbd2cSJim Jagielski } 202*b1cdbd2cSJim Jagielski 203*b1cdbd2cSJim Jagielski /** converts an Byte object or an Any object containing a Byte object into a simple byte. 204*b1cdbd2cSJim Jagielski @param object the object to convert 205*b1cdbd2cSJim Jagielski @return the boolean contained within the object 206*b1cdbd2cSJim Jagielski @throws com.sun.star.lang.IllegalArgumentException in case no byte is contained within object 207*b1cdbd2cSJim Jagielski @see #isBoolean 208*b1cdbd2cSJim Jagielski */ toByte(Object object)209*b1cdbd2cSJim Jagielski static public byte toByte(Object object) throws com.sun.star.lang.IllegalArgumentException{ 210*b1cdbd2cSJim Jagielski Byte ret= (Byte)convertSimple(TypeClass.BYTE, null, object); 211*b1cdbd2cSJim Jagielski return ret.byteValue(); 212*b1cdbd2cSJim Jagielski } 213*b1cdbd2cSJim Jagielski 214*b1cdbd2cSJim Jagielski /** converts a number object into a simple short and allows widening conversions. 215*b1cdbd2cSJim Jagielski Allowed argument types are Byte, Short or Any containing these types. 216*b1cdbd2cSJim Jagielski @param object the object to convert 217*b1cdbd2cSJim Jagielski @throws com.sun.star.lang.IllegalArgumentException in case no short or byte is contained within object 218*b1cdbd2cSJim Jagielski @return the short contained within the object 219*b1cdbd2cSJim Jagielski */ toShort(Object object)220*b1cdbd2cSJim Jagielski static public short toShort(Object object) throws com.sun.star.lang.IllegalArgumentException{ 221*b1cdbd2cSJim Jagielski Short ret= (Short)convertSimple(TypeClass.SHORT, null, object); 222*b1cdbd2cSJim Jagielski return ret.shortValue(); 223*b1cdbd2cSJim Jagielski } 224*b1cdbd2cSJim Jagielski /** converts a number object into an idl unsigned short and allows widening conversions. 225*b1cdbd2cSJim Jagielski Allowed argument types are Anies containing idl unsigned short values. 226*b1cdbd2cSJim Jagielski @param object the object to convert 227*b1cdbd2cSJim Jagielski @throws com.sun.star.lang.IllegalArgumentException 228*b1cdbd2cSJim Jagielski in case no idl unsigned short is contained within Any 229*b1cdbd2cSJim Jagielski @return an (unsigned) short 230*b1cdbd2cSJim Jagielski */ toUnsignedShort(Object object)231*b1cdbd2cSJim Jagielski static public short toUnsignedShort(Object object) 232*b1cdbd2cSJim Jagielski throws com.sun.star.lang.IllegalArgumentException 233*b1cdbd2cSJim Jagielski { 234*b1cdbd2cSJim Jagielski Short ret= (Short)convertSimple(TypeClass.UNSIGNED_SHORT, null, object); 235*b1cdbd2cSJim Jagielski return ret.shortValue(); 236*b1cdbd2cSJim Jagielski } 237*b1cdbd2cSJim Jagielski 238*b1cdbd2cSJim Jagielski /** converts a number object into a simple int and allows widening conversions. 239*b1cdbd2cSJim Jagielski Allowed argument types are Byte, Short, Integer or Any containing these types. 240*b1cdbd2cSJim Jagielski @param object the object to convert 241*b1cdbd2cSJim Jagielski @throws com.sun.star.lang.IllegalArgumentException in case no short, byte or int is contained within object. 242*b1cdbd2cSJim Jagielski @return the int contained within the object 243*b1cdbd2cSJim Jagielski */ toInt(Object object)244*b1cdbd2cSJim Jagielski static public int toInt(Object object) throws com.sun.star.lang.IllegalArgumentException{ 245*b1cdbd2cSJim Jagielski Integer ret= (Integer) convertSimple( TypeClass.LONG, null, object); 246*b1cdbd2cSJim Jagielski return ret.intValue(); 247*b1cdbd2cSJim Jagielski } 248*b1cdbd2cSJim Jagielski /** converts a number object into an idl unsigned long and allows widening conversions. 249*b1cdbd2cSJim Jagielski Allowed argument types are Anies containing idl unsigned short or unsigned long values. 250*b1cdbd2cSJim Jagielski @param object the object to convert 251*b1cdbd2cSJim Jagielski @throws com.sun.star.lang.IllegalArgumentException 252*b1cdbd2cSJim Jagielski in case no idl unsigned short nor unsigned long is contained within Any 253*b1cdbd2cSJim Jagielski @return an (unsigned) int 254*b1cdbd2cSJim Jagielski */ toUnsignedInt(Object object)255*b1cdbd2cSJim Jagielski static public int toUnsignedInt(Object object) 256*b1cdbd2cSJim Jagielski throws com.sun.star.lang.IllegalArgumentException 257*b1cdbd2cSJim Jagielski { 258*b1cdbd2cSJim Jagielski Integer ret = (Integer)convertSimple(TypeClass.UNSIGNED_LONG, null, object); 259*b1cdbd2cSJim Jagielski return ret.intValue(); 260*b1cdbd2cSJim Jagielski } 261*b1cdbd2cSJim Jagielski 262*b1cdbd2cSJim Jagielski /** converts a number object into a simple long and allows widening conversions. 263*b1cdbd2cSJim Jagielski Allowed argument types are Byte, Short, Integer, Long or Any containing these types. 264*b1cdbd2cSJim Jagielski @param object the object to convert 265*b1cdbd2cSJim Jagielski @throws com.sun.star.lang.IllegalArgumentException in case no short, byte, int or long 266*b1cdbd2cSJim Jagielski is contained within object. 267*b1cdbd2cSJim Jagielski @return the long contained within the object 268*b1cdbd2cSJim Jagielski */ toLong(Object object)269*b1cdbd2cSJim Jagielski static public long toLong(Object object) throws com.sun.star.lang.IllegalArgumentException{ 270*b1cdbd2cSJim Jagielski Long ret= (Long) convertSimple( TypeClass.HYPER, null, object); 271*b1cdbd2cSJim Jagielski return ret.longValue(); 272*b1cdbd2cSJim Jagielski } 273*b1cdbd2cSJim Jagielski /** converts a number object into an idl unsigned hyper and allows widening conversions. 274*b1cdbd2cSJim Jagielski Allowed argument types are Anies containing idl unsigned short, unsigned long or 275*b1cdbd2cSJim Jagielski unsigned hyper values. 276*b1cdbd2cSJim Jagielski @param object the object to convert 277*b1cdbd2cSJim Jagielski @throws com.sun.star.lang.IllegalArgumentException 278*b1cdbd2cSJim Jagielski in case no idl unsigned short, nor unsigned long nor unsigned hyper 279*b1cdbd2cSJim Jagielski is contained within object. 280*b1cdbd2cSJim Jagielski @return an (unsigned) long 281*b1cdbd2cSJim Jagielski */ toUnsignedLong(Object object)282*b1cdbd2cSJim Jagielski static public long toUnsignedLong(Object object) 283*b1cdbd2cSJim Jagielski throws com.sun.star.lang.IllegalArgumentException 284*b1cdbd2cSJim Jagielski { 285*b1cdbd2cSJim Jagielski Long ret = (Long)convertSimple(TypeClass.UNSIGNED_HYPER, null, object); 286*b1cdbd2cSJim Jagielski return ret.longValue(); 287*b1cdbd2cSJim Jagielski } 288*b1cdbd2cSJim Jagielski 289*b1cdbd2cSJim Jagielski /** converts a number object into a simple float and allows widening conversions. 290*b1cdbd2cSJim Jagielski Allowed argument types are Byte, Short, Float or Any containing these types. 291*b1cdbd2cSJim Jagielski @param object the object to convert 292*b1cdbd2cSJim Jagielski @throws com.sun.star.lang.IllegalArgumentException in case no byte, short or float 293*b1cdbd2cSJim Jagielski is contained within object. 294*b1cdbd2cSJim Jagielski @return the float contained within the object 295*b1cdbd2cSJim Jagielski */ toFloat(Object object)296*b1cdbd2cSJim Jagielski static public float toFloat(Object object) throws com.sun.star.lang.IllegalArgumentException{ 297*b1cdbd2cSJim Jagielski Float ret= (Float) convertSimple( TypeClass.FLOAT,null, object); 298*b1cdbd2cSJim Jagielski return ret.floatValue(); 299*b1cdbd2cSJim Jagielski } 300*b1cdbd2cSJim Jagielski 301*b1cdbd2cSJim Jagielski /** converts a number object into a simple double and allows widening conversions. 302*b1cdbd2cSJim Jagielski Allowed argument types are Byte, Short, Int, Float, Double or Any containing these types. 303*b1cdbd2cSJim Jagielski @param object the object to convert 304*b1cdbd2cSJim Jagielski @throws com.sun.star.lang.IllegalArgumentException in case no byte, short, int, float 305*b1cdbd2cSJim Jagielski or double is contained within object. 306*b1cdbd2cSJim Jagielski @return the double contained within the object 307*b1cdbd2cSJim Jagielski */ toDouble(Object object)308*b1cdbd2cSJim Jagielski static public double toDouble(Object object) throws com.sun.star.lang.IllegalArgumentException { 309*b1cdbd2cSJim Jagielski Double ret= (Double) convertSimple( TypeClass.DOUBLE, null, object); 310*b1cdbd2cSJim Jagielski return ret.doubleValue(); 311*b1cdbd2cSJim Jagielski } 312*b1cdbd2cSJim Jagielski 313*b1cdbd2cSJim Jagielski /** converts a string or an any containing a string into a string. 314*b1cdbd2cSJim Jagielski @param object the object to convert 315*b1cdbd2cSJim Jagielski @throws com.sun.star.lang.IllegalArgumentException in case no string is contained within object. 316*b1cdbd2cSJim Jagielski @return the string contained within the object 317*b1cdbd2cSJim Jagielski */ toString(Object object)318*b1cdbd2cSJim Jagielski static public String toString(Object object) throws com.sun.star.lang.IllegalArgumentException { 319*b1cdbd2cSJim Jagielski return (String) convertSimple( TypeClass.STRING, null, object); 320*b1cdbd2cSJim Jagielski } 321*b1cdbd2cSJim Jagielski 322*b1cdbd2cSJim Jagielski /** converts a Type or an any containing a Type into a Type. 323*b1cdbd2cSJim Jagielski @param object the object to convert 324*b1cdbd2cSJim Jagielski @throws com.sun.star.lang.IllegalArgumentException in case no type is contained within object. 325*b1cdbd2cSJim Jagielski @return the type contained within the object 326*b1cdbd2cSJim Jagielski */ toType(Object object)327*b1cdbd2cSJim Jagielski static public Type toType(Object object) throws com.sun.star.lang.IllegalArgumentException { 328*b1cdbd2cSJim Jagielski return (Type) convertSimple( TypeClass.TYPE, null, object); 329*b1cdbd2cSJim Jagielski } 330*b1cdbd2cSJim Jagielski 331*b1cdbd2cSJim Jagielski /** converts a UNO object (struct, exception, sequence, enum or interface) or an Any containing 332*b1cdbd2cSJim Jagielski * these types into an UNO object of a specified destination type. 333*b1cdbd2cSJim Jagielski * For interfaces, the argument <em>object</em> is queried for the interface specified 334*b1cdbd2cSJim Jagielski * by the <em>type</em> argument. That query (UnoRuntime.queryInterface) might return null, 335*b1cdbd2cSJim Jagielski * if the interface is not implemented or a null-ref or a VOID any is given. 336*b1cdbd2cSJim Jagielski * 337*b1cdbd2cSJim Jagielski * @param type type of the returned value 338*b1cdbd2cSJim Jagielski * @param object the object that is to be converted 339*b1cdbd2cSJim Jagielski * @return destination object 340*b1cdbd2cSJim Jagielski * @throws com.sun.star.lang.IllegalArgumentException 341*b1cdbd2cSJim Jagielski * in case conversion is not possible 342*b1cdbd2cSJim Jagielski */ toObject(Type type, Object object)343*b1cdbd2cSJim Jagielski static public Object toObject(Type type, Object object) 344*b1cdbd2cSJim Jagielski throws com.sun.star.lang.IllegalArgumentException 345*b1cdbd2cSJim Jagielski { 346*b1cdbd2cSJim Jagielski return convertSimple( type.getTypeClass(), type, object ); 347*b1cdbd2cSJim Jagielski } 348*b1cdbd2cSJim Jagielski /** converts a UNO object (struct, exception, sequence, enum or interface) or an Any containing 349*b1cdbd2cSJim Jagielski * these types into an UNO object of a specified destination type. 350*b1cdbd2cSJim Jagielski * For interfaces, the argument <em>object</em> is queried for the interface specified 351*b1cdbd2cSJim Jagielski * by the <em>type</em> argument. That query (UnoRuntime.queryInterface) might return null, 352*b1cdbd2cSJim Jagielski * if the interface is not implemented or a null-ref or a VOID any is given. 353*b1cdbd2cSJim Jagielski * 354*b1cdbd2cSJim Jagielski * @param clazz class of the returned value 355*b1cdbd2cSJim Jagielski * @param object the object that is to be converted 356*b1cdbd2cSJim Jagielski * @return destination object 357*b1cdbd2cSJim Jagielski * @throws com.sun.star.lang.IllegalArgumentException 358*b1cdbd2cSJim Jagielski * in case conversion is not possible 359*b1cdbd2cSJim Jagielski */ toObject(Class clazz, Object object)360*b1cdbd2cSJim Jagielski static public Object toObject(Class clazz, Object object) 361*b1cdbd2cSJim Jagielski throws com.sun.star.lang.IllegalArgumentException 362*b1cdbd2cSJim Jagielski { 363*b1cdbd2cSJim Jagielski return toObject( new Type( clazz ), object ); 364*b1cdbd2cSJim Jagielski } 365*b1cdbd2cSJim Jagielski 366*b1cdbd2cSJim Jagielski /** converts an array or an any containing an array into an array. 367*b1cdbd2cSJim Jagielski @param object the object to convert 368*b1cdbd2cSJim Jagielski @throws com.sun.star.lang.IllegalArgumentException in case no array is contained within object. 369*b1cdbd2cSJim Jagielski @return the array contained within the object 370*b1cdbd2cSJim Jagielski */ toArray( Object object)371*b1cdbd2cSJim Jagielski static public Object toArray( Object object) throws com.sun.star.lang.IllegalArgumentException { 372*b1cdbd2cSJim Jagielski return convertSimple( TypeClass.SEQUENCE, null, object); 373*b1cdbd2cSJim Jagielski } 374*b1cdbd2cSJim Jagielski 375*b1cdbd2cSJim Jagielski /** 376*b1cdbd2cSJim Jagielski Examines the argument <em>object</em> if is correspond to the type in argument <em>what</em>. 377*b1cdbd2cSJim Jagielski <em>object</em> is either matched directly against the type or if it is an any then the 378*b1cdbd2cSJim Jagielski contained object is matched against the type. 379*b1cdbd2cSJim Jagielski */ containsType( TypeClass what, Object object)380*b1cdbd2cSJim Jagielski static private boolean containsType( TypeClass what, Object object){ 381*b1cdbd2cSJim Jagielski return (getType(object).getTypeClass().getValue() == what.getValue()); 382*b1cdbd2cSJim Jagielski } 383*b1cdbd2cSJim Jagielski 384*b1cdbd2cSJim Jagielski static private final Type m_XInterface_type = new Type( XInterface.class ); 385*b1cdbd2cSJim Jagielski convertSimple( TypeClass destTClass, Type destType, Object object_ )386*b1cdbd2cSJim Jagielski static private Object convertSimple( TypeClass destTClass, Type destType, Object object_ ) 387*b1cdbd2cSJim Jagielski throws com.sun.star.lang.IllegalArgumentException 388*b1cdbd2cSJim Jagielski { 389*b1cdbd2cSJim Jagielski Object object; 390*b1cdbd2cSJim Jagielski Type type; 391*b1cdbd2cSJim Jagielski if (object_ instanceof Any) 392*b1cdbd2cSJim Jagielski { 393*b1cdbd2cSJim Jagielski // unbox 394*b1cdbd2cSJim Jagielski Any a = (Any)object_; 395*b1cdbd2cSJim Jagielski object = a.getObject(); 396*b1cdbd2cSJim Jagielski type = a.getType(); 397*b1cdbd2cSJim Jagielski // nested any 398*b1cdbd2cSJim Jagielski if (TypeClass.ANY_value == type.getTypeClass().getValue()) 399*b1cdbd2cSJim Jagielski return convertSimple( destTClass, destType, object ); 400*b1cdbd2cSJim Jagielski } 401*b1cdbd2cSJim Jagielski else 402*b1cdbd2cSJim Jagielski { 403*b1cdbd2cSJim Jagielski object = object_; 404*b1cdbd2cSJim Jagielski type = (null == object ? m_XInterface_type : new Type( object.getClass() )); 405*b1cdbd2cSJim Jagielski } 406*b1cdbd2cSJim Jagielski 407*b1cdbd2cSJim Jagielski int tc = type.getTypeClass().getValue(); 408*b1cdbd2cSJim Jagielski int dest_tc = destTClass.getValue(); 409*b1cdbd2cSJim Jagielski 410*b1cdbd2cSJim Jagielski if (null == object) 411*b1cdbd2cSJim Jagielski { 412*b1cdbd2cSJim Jagielski // special for interfaces 413*b1cdbd2cSJim Jagielski if (TypeClass.INTERFACE_value == tc && dest_tc == tc) 414*b1cdbd2cSJim Jagielski return null; 415*b1cdbd2cSJim Jagielski } 416*b1cdbd2cSJim Jagielski else 417*b1cdbd2cSJim Jagielski { 418*b1cdbd2cSJim Jagielski switch (dest_tc) 419*b1cdbd2cSJim Jagielski { 420*b1cdbd2cSJim Jagielski case TypeClass.CHAR_value: 421*b1cdbd2cSJim Jagielski if (tc == TypeClass.CHAR_value) 422*b1cdbd2cSJim Jagielski return object; 423*b1cdbd2cSJim Jagielski break; 424*b1cdbd2cSJim Jagielski case TypeClass.BOOLEAN_value: 425*b1cdbd2cSJim Jagielski if (tc == TypeClass.BOOLEAN_value) 426*b1cdbd2cSJim Jagielski return object; 427*b1cdbd2cSJim Jagielski break; 428*b1cdbd2cSJim Jagielski case TypeClass.BYTE_value: 429*b1cdbd2cSJim Jagielski if (tc == TypeClass.BYTE_value) 430*b1cdbd2cSJim Jagielski return object; 431*b1cdbd2cSJim Jagielski break; 432*b1cdbd2cSJim Jagielski case TypeClass.SHORT_value: 433*b1cdbd2cSJim Jagielski switch (tc) 434*b1cdbd2cSJim Jagielski { 435*b1cdbd2cSJim Jagielski case TypeClass.BYTE_value: 436*b1cdbd2cSJim Jagielski return new Short( ((Byte)object).byteValue() ); 437*b1cdbd2cSJim Jagielski case TypeClass.SHORT_value: 438*b1cdbd2cSJim Jagielski return object; 439*b1cdbd2cSJim Jagielski } 440*b1cdbd2cSJim Jagielski break; 441*b1cdbd2cSJim Jagielski case TypeClass.UNSIGNED_SHORT_value: 442*b1cdbd2cSJim Jagielski switch (tc) 443*b1cdbd2cSJim Jagielski { 444*b1cdbd2cSJim Jagielski case TypeClass.UNSIGNED_SHORT_value: 445*b1cdbd2cSJim Jagielski return object; 446*b1cdbd2cSJim Jagielski } 447*b1cdbd2cSJim Jagielski break; 448*b1cdbd2cSJim Jagielski case TypeClass.LONG_value: 449*b1cdbd2cSJim Jagielski switch (tc) 450*b1cdbd2cSJim Jagielski { 451*b1cdbd2cSJim Jagielski case TypeClass.BYTE_value: 452*b1cdbd2cSJim Jagielski return new Integer( ((Byte)object).byteValue() ); 453*b1cdbd2cSJim Jagielski case TypeClass.SHORT_value: 454*b1cdbd2cSJim Jagielski case TypeClass.UNSIGNED_SHORT_value: 455*b1cdbd2cSJim Jagielski return new Integer( ((Short)object).shortValue() ); 456*b1cdbd2cSJim Jagielski case TypeClass.LONG_value: 457*b1cdbd2cSJim Jagielski return object; 458*b1cdbd2cSJim Jagielski } 459*b1cdbd2cSJim Jagielski break; 460*b1cdbd2cSJim Jagielski case TypeClass.UNSIGNED_LONG_value: 461*b1cdbd2cSJim Jagielski switch (tc) 462*b1cdbd2cSJim Jagielski { 463*b1cdbd2cSJim Jagielski case TypeClass.UNSIGNED_SHORT_value: 464*b1cdbd2cSJim Jagielski return new Integer( ((Short)object).shortValue() ); 465*b1cdbd2cSJim Jagielski case TypeClass.UNSIGNED_LONG_value: 466*b1cdbd2cSJim Jagielski return object; 467*b1cdbd2cSJim Jagielski } 468*b1cdbd2cSJim Jagielski break; 469*b1cdbd2cSJim Jagielski case TypeClass.HYPER_value: 470*b1cdbd2cSJim Jagielski switch (tc) 471*b1cdbd2cSJim Jagielski { 472*b1cdbd2cSJim Jagielski case TypeClass.BYTE_value: 473*b1cdbd2cSJim Jagielski return new Long( ((Byte)object).byteValue() ); 474*b1cdbd2cSJim Jagielski case TypeClass.SHORT_value: 475*b1cdbd2cSJim Jagielski case TypeClass.UNSIGNED_SHORT_value: 476*b1cdbd2cSJim Jagielski return new Long( ((Short)object).shortValue() ); 477*b1cdbd2cSJim Jagielski case TypeClass.LONG_value: 478*b1cdbd2cSJim Jagielski case TypeClass.UNSIGNED_LONG_value: 479*b1cdbd2cSJim Jagielski return new Long( ((Integer)object).intValue() ); 480*b1cdbd2cSJim Jagielski case TypeClass.HYPER_value: 481*b1cdbd2cSJim Jagielski return object; 482*b1cdbd2cSJim Jagielski } 483*b1cdbd2cSJim Jagielski break; 484*b1cdbd2cSJim Jagielski case TypeClass.UNSIGNED_HYPER_value: 485*b1cdbd2cSJim Jagielski switch (tc) 486*b1cdbd2cSJim Jagielski { 487*b1cdbd2cSJim Jagielski case TypeClass.UNSIGNED_SHORT_value: 488*b1cdbd2cSJim Jagielski return new Long( ((Short)object).shortValue() ); 489*b1cdbd2cSJim Jagielski case TypeClass.UNSIGNED_LONG_value: 490*b1cdbd2cSJim Jagielski return new Long( ((Integer)object).intValue() ); 491*b1cdbd2cSJim Jagielski case TypeClass.UNSIGNED_HYPER_value: 492*b1cdbd2cSJim Jagielski return object; 493*b1cdbd2cSJim Jagielski } 494*b1cdbd2cSJim Jagielski break; 495*b1cdbd2cSJim Jagielski case TypeClass.FLOAT_value: 496*b1cdbd2cSJim Jagielski switch (tc) 497*b1cdbd2cSJim Jagielski { 498*b1cdbd2cSJim Jagielski case TypeClass.BYTE_value: 499*b1cdbd2cSJim Jagielski return new Float( ((Byte)object).byteValue() ); 500*b1cdbd2cSJim Jagielski case TypeClass.SHORT_value: 501*b1cdbd2cSJim Jagielski return new Float( ((Short)object).shortValue() ); 502*b1cdbd2cSJim Jagielski case TypeClass.FLOAT_value: 503*b1cdbd2cSJim Jagielski return object; 504*b1cdbd2cSJim Jagielski } 505*b1cdbd2cSJim Jagielski break; 506*b1cdbd2cSJim Jagielski case TypeClass.DOUBLE_value: 507*b1cdbd2cSJim Jagielski switch (tc) 508*b1cdbd2cSJim Jagielski { 509*b1cdbd2cSJim Jagielski case TypeClass.BYTE_value: 510*b1cdbd2cSJim Jagielski return new Double( ((Byte)object).byteValue() ); 511*b1cdbd2cSJim Jagielski case TypeClass.SHORT_value: 512*b1cdbd2cSJim Jagielski return new Double( ((Short)object).shortValue() ); 513*b1cdbd2cSJim Jagielski case TypeClass.LONG_value: 514*b1cdbd2cSJim Jagielski return new Double( ((Integer)object).intValue() ); 515*b1cdbd2cSJim Jagielski case TypeClass.FLOAT_value: 516*b1cdbd2cSJim Jagielski return new Double( ((Float)object).floatValue() ); 517*b1cdbd2cSJim Jagielski case TypeClass.DOUBLE_value: 518*b1cdbd2cSJim Jagielski return object; 519*b1cdbd2cSJim Jagielski } 520*b1cdbd2cSJim Jagielski break; 521*b1cdbd2cSJim Jagielski case TypeClass.ENUM_value: 522*b1cdbd2cSJim Jagielski if (tc == TypeClass.ENUM_value && 523*b1cdbd2cSJim Jagielski (null == destTClass || destType.equals( type ) /* optional destType */)) 524*b1cdbd2cSJim Jagielski { 525*b1cdbd2cSJim Jagielski return object; 526*b1cdbd2cSJim Jagielski } 527*b1cdbd2cSJim Jagielski break; 528*b1cdbd2cSJim Jagielski case TypeClass.STRING_value: 529*b1cdbd2cSJim Jagielski if (tc == TypeClass.STRING_value) 530*b1cdbd2cSJim Jagielski return object; 531*b1cdbd2cSJim Jagielski break; 532*b1cdbd2cSJim Jagielski case TypeClass.TYPE_value: 533*b1cdbd2cSJim Jagielski if (tc == TypeClass.TYPE_value) 534*b1cdbd2cSJim Jagielski return object; 535*b1cdbd2cSJim Jagielski break; 536*b1cdbd2cSJim Jagielski case TypeClass.INTERFACE_value: 537*b1cdbd2cSJim Jagielski // Because object is a class, not an interface, it is 538*b1cdbd2cSJim Jagielski // controversial what kind of Type "new Type(object.class)" 539*b1cdbd2cSJim Jagielski // above should return (UNKNOWN or INTERFACE), so that we should 540*b1cdbd2cSJim Jagielski // not check here for "tc == TypeClass.INTERFACE_value". 541*b1cdbd2cSJim Jagielski // Instead, we check whether object (indirectly) derives from 542*b1cdbd2cSJim Jagielski // XInterface: 543*b1cdbd2cSJim Jagielski if (object instanceof XInterface) 544*b1cdbd2cSJim Jagielski return UnoRuntime.queryInterface( destType, object ); 545*b1cdbd2cSJim Jagielski break; 546*b1cdbd2cSJim Jagielski case TypeClass.STRUCT_value: 547*b1cdbd2cSJim Jagielski case TypeClass.EXCEPTION_value: 548*b1cdbd2cSJim Jagielski if (destType.isSupertypeOf(type)) { 549*b1cdbd2cSJim Jagielski return object; 550*b1cdbd2cSJim Jagielski } 551*b1cdbd2cSJim Jagielski break; 552*b1cdbd2cSJim Jagielski case TypeClass.SEQUENCE_value: 553*b1cdbd2cSJim Jagielski if (tc == TypeClass.SEQUENCE_value && 554*b1cdbd2cSJim Jagielski (null == destType || destType.equals( type ) /* optional destType */)) 555*b1cdbd2cSJim Jagielski { 556*b1cdbd2cSJim Jagielski return object; 557*b1cdbd2cSJim Jagielski } 558*b1cdbd2cSJim Jagielski break; 559*b1cdbd2cSJim Jagielski } 560*b1cdbd2cSJim Jagielski } 561*b1cdbd2cSJim Jagielski throw new com.sun.star.lang.IllegalArgumentException( 562*b1cdbd2cSJim Jagielski "The Argument did not hold the proper type"); 563*b1cdbd2cSJim Jagielski } 564*b1cdbd2cSJim Jagielski } 565