summaryrefslogtreecommitdiff
path: root/jurt/com/sun/star/uno/AnyConverter.java
blob: bef10f2b4ebc0e5f5d0f8820f1b6c93feeee5c29 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
package com.sun.star.uno;
import com.sun.star.lang.IllegalArgumentException;

/** This class provides static methods which aim at exploring the contents of an
 * Any and extracting its value. All public methods take an Object argument that
 * either is the immediate object, such as Boolean, Type, interface implementation,
 * or an Any that contains an object. <br>The methods which extract the value do a
 * widening conversion. See the method comments for the respective conversions.
 */
public class AnyConverter
{
    /** checks if the any contains the idl type <code>void</code>.
        @param object the object to check
        @return true when the any is void, false otherwise
     */
    static public boolean isVoid( Object object){
        return containsType( TypeClass.VOID, object);
    }

    /** checks if the any contains a value of the idl type <code>char</code>.
        @param object the object to check
        @return true when the any contains a char, false otherwise.
     */
    static public boolean isChar(Object object){
        return containsType( TypeClass.CHAR, object);
    }

    /** checks if the any contains a value of the idl type <code>boolean</code>.
        @param object the object to check
        @return true when the any contains a boolean, false otherwise.
     */
    static public boolean isBoolean(Object object){
        return containsType( TypeClass.BOOLEAN, object);
    }

    /** checks if the any contains a value of the idl type <code>byte</code>.
        @param object the object to check
        @return true when the any contains a byte, false otherwise.
     */
    static public boolean isByte(Object object){
        return containsType( TypeClass.BYTE, object);
    }

    /** checks if the any contains a value of the idl type <code>short</code>.
        @param object the object to check
        @return true when the any contains a short, false otherwise.
     */
    static public boolean isShort(Object object){
        return containsType( TypeClass.SHORT, object);
    }

    /** checks if the any contains a value of the idl type <code>long</code> (which maps to a java-int).
        @param object the object to check
        @return true when the any contains a int, false otherwise.
     */
    static public boolean isInt(Object object){
        return containsType( TypeClass.LONG, object);
    }

    /** checks if the any contains a value of the idl type <code>hyper</code> (which maps to a java-long).
        @param object the object to check
        @return true when the any contains a long, false otherwise.
     */
    static public boolean isLong(Object object){
        return containsType( TypeClass.HYPER, object);
    }

    /** checks if the any contains a value of the idl type <code>float</code>.
        @param object the object to check
        @return true when the any contains a float, false otherwise.
     */
    static public boolean isFloat(Object object){
        return containsType( TypeClass.FLOAT, object);
    }

    /** checks if the any contains a value of the idl type <code>double</code>.
        @param object the object to check
        @return true when the any contains a double, false otherwise.
     */
    static public boolean isDouble(Object object){
        return containsType( TypeClass.DOUBLE, object);
    }

    /** checks if the any contains a value of the idl type <code>string</code>.
        @param object the object to check
        @return true when the any contains a string, false otherwise.
     */
    static public boolean isString(Object object){
        return containsType( TypeClass.STRING, object);
    }


    /** checks if the any contains a value of the idl type <code>type</code>.
        @param object the object to check
        @return true when the any contains a type, false otherwise.
     */
    static public boolean isType(Object object){
        return containsType( TypeClass.TYPE, object);
    }

    /** checks if the any contains a value which implements interfaces.
        @param object the object to check
        @return true when the any contains an object which implements interfaces, false otherwise.
     */
    static public boolean isObject(Object object){
        boolean retVal= false;
        if( object.getClass().getInterfaces().length > 0)
            retVal= true;
        else
        {
            Type _t= new Type( object.getClass());
            if( _t.getTypeClass() == TypeClass.ANY)
            {
                Any _any= (Any)object;
                if( _any.getType().getTypeClass() == TypeClass.INTERFACE)
                    retVal= true;
            }
        }
        return retVal;
    }

    /** checks if the any contains UNO idl sequence value ( meaning a java array
        containing elements which are values of UNO idl types).
        @param object the object to check
        @return true when the any contains an object which implements interfaces, false otherwise.
     */
    static public boolean isArray( Object object){
        return containsType( TypeClass.SEQUENCE, object);
    }

    /** converts an Char object or an Any object containing a Char object into a simple char.
        @param object the object to convert
        @return the char contained within the object
        @throws com.sun.star.lang.IllegalArgumentException in case no char is contained within object
        @see #isChar
    */
    static public char  toChar(Object object) throws  com.sun.star.lang.IllegalArgumentException{
        Character ret=(Character) convertSimple( TypeClass.CHAR, null, object);
        return ret.charValue();
    }

    /** converts an Boolean object or an Any object containing a Boolean object into a simple boolean.
        @param object the object to convert
        @return the boolean contained within the object
        @throws com.sun.star.lang.IllegalArgumentException in case no boolean is contained within object
        @see #isBoolean
    */
    static public boolean toBoolean(Object object) throws  com.sun.star.lang.IllegalArgumentException{
        Boolean ret= (Boolean)  convertSimple( TypeClass.BOOLEAN, null, object);
        return ret.booleanValue();
    }

    /** converts an Byte object or an Any object containing a Byte object into a simple byte.
        @param object the object to convert
        @return the boolean contained within the object
        @throws com.sun.star.lang.IllegalArgumentException in case no byte is contained within object
        @see #isBoolean
    */
    static public byte toByte(Object object) throws   com.sun.star.lang.IllegalArgumentException{
        Byte ret= (Byte) convertSimple( TypeClass.BYTE, null, object);
        return ret.byteValue();
    }

    /** converts a number object into a simple short and allows widening conversions.
        Allowed argument types are Byte, Short or Any containing these types.
        @param object the object to convert
        @throws com.sun.star.lang.IllegalArgumentException in case no short or byte is contained within object
        @return the short contained within the object
     */
    static public short toShort(Object object) throws   com.sun.star.lang.IllegalArgumentException{
        Short ret= (Short) convertSimple( TypeClass.SHORT, null, object);
        return ret.shortValue();
    }

    /** converts a number object into a simple int and allows widening conversions.
        Allowed argument types are Byte, Short, Integer or Any containing these types.
        @param object the object to convert
        @throws com.sun.star.lang.IllegalArgumentException in case no short, byte or int is contained within object.
        @return the int contained within the object
     */
    static public int toInt(Object object) throws  com.sun.star.lang.IllegalArgumentException{
        Integer ret= (Integer) convertSimple( TypeClass.LONG, null, object);
        return ret.intValue();
    }

    /** converts a number object into a simple long and allows widening conversions.
        Allowed argument types are Byte, Short, Integer, Long or Any containing these types.
        @param object the object to convert
        @throws com.sun.star.lang.IllegalArgumentException in case no short, byte, int or long
                is contained within object.
        @return the long contained within the object
     */
    static public long toLong(Object object) throws   com.sun.star.lang.IllegalArgumentException{
        Long ret= (Long) convertSimple( TypeClass.HYPER, null, object);
        return ret.longValue();
    }

    /** converts a number object into a simple float and allows widening conversions.
        Allowed argument types are Byte, Short, Float or Any containing these types.
        @param object the object to convert
        @throws com.sun.star.lang.IllegalArgumentException in case no byte, short or float
                is contained within object.
        @return the float contained within the object
     */
    static public float toFloat(Object object) throws com.sun.star.lang.IllegalArgumentException{
        Float ret= (Float) convertSimple( TypeClass.FLOAT,null, object);
        return ret.floatValue();
    }

    /** converts a number object into a simple double and allows widening conversions.
        Allowed argument types are Byte, Short, Int, Float, Double or Any containing these types.
        @param object the object to convert
        @throws com.sun.star.lang.IllegalArgumentException in case no byte, short, int, float
                or double is contained within object.
        @return the double contained within the object
     */
    static public double toDouble(Object object) throws com.sun.star.lang.IllegalArgumentException {
        Double ret= (Double) convertSimple( TypeClass.DOUBLE, null, object);
        return ret.doubleValue();
    }

    /** converts a string or an any containing a string into a string.
        @param object the object to convert
        @throws com.sun.star.lang.IllegalArgumentException in case no string is contained within object.
        @return the string contained within the object
     */
    static public String toString(Object object) throws com.sun.star.lang.IllegalArgumentException {
        return (String) convertSimple( TypeClass.STRING, null, object);
    }

    /** converts a Type or an any containing a Type into a Type.
        @param object the object to convert
        @throws com.sun.star.lang.IllegalArgumentException in case no type is contained within object.
        @return the type contained within the object
     */
    static public Type toType(Object object) throws com.sun.star.lang.IllegalArgumentException {
        return (Type) convertSimple( TypeClass.TYPE, null, object);
    }

    /** converts a UNO object an any containing a UNO object into a UNO object.
        @param object the object to convert
        @throws com.sun.star.lang.IllegalArgumentException in case no UNO object is contained within object.
        @return the object contained within the object
     */
    static public Object toObject(Type type, Object object)
        throws com.sun.star.lang.IllegalArgumentException{
        return convertSimple( TypeClass.ANY,  type, object);
    }

    /** converts an array or an any containing an array into an array.
        @param object the object to convert
        @throws com.sun.star.lang.IllegalArgumentException in case no array is contained within object.
        @return the array contained within the object
     */
    static public Object toArray( Object object) throws com.sun.star.lang.IllegalArgumentException {
        return convertSimple( TypeClass.SEQUENCE, null, object);
    }

    /**
       Examines the argument |object| if is correspond to the type in argument |what|.
       |object| is either matched directly against the type or if it is an any then the
       contained object is matched against the type.
    */
    static private boolean containsType( TypeClass what, Object object){
        boolean retVal= false;
        Type _t= new Type( object.getClass());

        if( _t.getTypeClass() == TypeClass.ANY)
        {
            Any _any= (Any)object;
            if( _any.getType().getTypeClass().getValue() == what.getValue())
                retVal= true;
        }
        else if( _t.getTypeClass().getValue() == what.getValue())
            retVal= true;
        return retVal;
    }

    static private Object convertSimple( TypeClass destTClass, Type destType, Object src)
        throws com.sun.star.lang.IllegalArgumentException {

        Type srcType= new Type( src.getClass());
        Object _src= src;
        int srcTypeValue=0;
        // If |src| is an Any then we check if the  Any's Type matches the type
        // of the contained object and obtain the object which is processed further on.
        if( Any.class.isAssignableFrom( src.getClass()))
        {
            Any _any = (Any)src;
            _src= _any.getObject();
            srcType= new Type( _src.getClass());
            // If the Any's type in an interface then check if the Any's object member
            // implements interfaces
            if( _any.getType().getTypeClass() == TypeClass.INTERFACE)
            {
                if( _src.getClass().getInterfaces().length ==  0)
                    throw new com.sun.star.lang.IllegalArgumentException(
                        "The argument does not implement interfaces");
                else
                    srcTypeValue= TypeClass.ANY.getValue();
            }
            else if( srcType.getTypeClass().getValue() != _any.getType().getTypeClass().getValue())
                // The Type of the object in the any must match the type in the any
                throw new com.sun.star.lang.IllegalArgumentException(
                    "The Type in the Any does not fit the Any's data");
            else
                srcTypeValue= srcType.getTypeClass().getValue();
        }
        else
        {
            // if we have an object
            if( destTClass == TypeClass.ANY)
            {
                if( _src.getClass().getInterfaces().length == 0)
                    throw new com.sun.star.lang.IllegalArgumentException(
                        "The argument does not implement interfaces");
                else
                    srcTypeValue= TypeClass.ANY.getValue();
            }
            else
                srcTypeValue= srcType.getTypeClass().getValue();
        }

        switch( destTClass.getValue())
        {
        case TypeClass.CHAR_value:
            if( srcTypeValue == TypeClass.CHAR_value)
                return _src;
            break;
        case TypeClass.BOOLEAN_value:
            if( srcTypeValue == TypeClass.BOOLEAN_value)
                return _src;
            break;
        case TypeClass.BYTE_value:
            if( srcTypeValue == TypeClass.BYTE_value)
                return _src;
            break;
        case TypeClass.SHORT_value:
            switch( srcTypeValue)
            {
            case TypeClass.BYTE_value:
                return new Short( ((Byte)_src).byteValue());
            case TypeClass.SHORT_value:
                return _src;
            }
            break;
        case TypeClass.LONG_value:
            switch( srcTypeValue)
            {
            case TypeClass.BYTE_value:
                return new Integer( ((Byte)_src).byteValue());
            case TypeClass.SHORT_value:
                return new Integer( ((Short)_src).shortValue());
            case TypeClass.LONG_value:
                return _src;
            }
            break;
        case TypeClass.HYPER_value:
            switch( srcTypeValue)
            {
            case TypeClass.BYTE_value:
                return new Long( ((Byte)_src).byteValue());
            case TypeClass.SHORT_value:
                return new Long( ((Short)_src).shortValue());
            case TypeClass.LONG_value:
                return new Long( ((Integer)_src).intValue());
            case TypeClass.HYPER_value:
                return _src;
            }
            break;
        case TypeClass.FLOAT_value:
            switch( srcTypeValue)
            {
            case TypeClass.BYTE_value:
                return new Float( ((Byte)_src).byteValue());
            case TypeClass.SHORT_value:
                return new Float( ((Short)_src).shortValue());
            case TypeClass.FLOAT_value:
                return _src;
            }
            break;
        case TypeClass.DOUBLE_value:
            switch( srcTypeValue)
            {
            case TypeClass.BYTE_value:
                return new Double( ((Byte)_src).byteValue());
            case TypeClass.SHORT_value:
                return new Double( ((Short)_src).shortValue());
            case TypeClass.LONG_value:
                return new Double( ((Integer)_src).intValue());
            case TypeClass.FLOAT_value:
                return new Double( ((Float)_src).floatValue());
            case TypeClass.DOUBLE_value:
                return _src;
            }
            break;
        case TypeClass.STRING_value:
            if( srcTypeValue == TypeClass.STRING_value)
                return _src;
            break;

        case TypeClass.TYPE_value:
            if( srcTypeValue == TypeClass.TYPE_value)
                return _src;
            break;
        case TypeClass.ANY_value:
            if( srcTypeValue == TypeClass.ANY_value)
                return UnoRuntime.queryInterface( destType, _src);
            break;
        case TypeClass.SEQUENCE_value:
            if( srcTypeValue == TypeClass.SEQUENCE_value)
                return _src;
            break;

        }

        throw new com.sun.star.lang.IllegalArgumentException(
            "The Argument did not hold the proper type");
    }
}