DynAnyBasicImpl.java revision 608:7e06bf1dcb09
1/*
2 * Copyright (c) 2000, 2003, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.  Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26package com.sun.corba.se.impl.dynamicany;
27
28import org.omg.CORBA.Any;
29import org.omg.CORBA.TypeCode;
30import org.omg.CORBA.TypeCodePackage.BadKind;
31import org.omg.CORBA.TCKind;
32
33import org.omg.DynamicAny.*;
34import org.omg.DynamicAny.DynAnyPackage.TypeMismatch;
35import org.omg.DynamicAny.DynAnyPackage.InvalidValue;
36import org.omg.DynamicAny.DynAnyFactoryPackage.InconsistentTypeCode;
37
38import com.sun.corba.se.spi.orb.ORB ;
39import com.sun.corba.se.spi.logging.CORBALogDomains ;
40import com.sun.corba.se.impl.logging.ORBUtilSystemException ;
41
42public class DynAnyBasicImpl extends DynAnyImpl
43{
44    //
45    // Constructors
46    //
47
48    private DynAnyBasicImpl() {
49        this(null, (Any)null, false);
50    }
51
52    protected DynAnyBasicImpl(ORB orb, Any any, boolean copyValue) {
53        super(orb, any, copyValue);
54        // set the current position to 0 if any has components, otherwise to -1.
55        index = NO_INDEX;
56    }
57
58    protected DynAnyBasicImpl(ORB orb, TypeCode typeCode) {
59        super(orb, typeCode);
60        // set the current position to 0 if any has components, otherwise to -1.
61        index = NO_INDEX;
62    }
63
64    //
65    // DynAny interface methods
66    //
67
68    public void assign (org.omg.DynamicAny.DynAny dyn_any)
69        throws org.omg.DynamicAny.DynAnyPackage.TypeMismatch
70    {
71        if (status == STATUS_DESTROYED) {
72            throw wrapper.dynAnyDestroyed() ;
73        }
74        super.assign(dyn_any);
75        index = NO_INDEX;
76    }
77
78    public void from_any (org.omg.CORBA.Any value)
79        throws org.omg.DynamicAny.DynAnyPackage.TypeMismatch,
80               org.omg.DynamicAny.DynAnyPackage.InvalidValue
81    {
82        if (status == STATUS_DESTROYED) {
83            throw wrapper.dynAnyDestroyed() ;
84        }
85        super.from_any(value);
86        index = NO_INDEX;
87    }
88
89    // Spec: Returns a copy of the internal Any
90    public org.omg.CORBA.Any to_any() {
91        if (status == STATUS_DESTROYED) {
92            throw wrapper.dynAnyDestroyed() ;
93        }
94        return DynAnyUtil.copy(any, orb);
95    }
96
97    public boolean equal (org.omg.DynamicAny.DynAny dyn_any) {
98        if (status == STATUS_DESTROYED) {
99            throw wrapper.dynAnyDestroyed() ;
100        }
101        if (dyn_any == this) {
102            return true;
103        }
104        // If the other DynAny is a constructed one we don't want it to have
105        // to create its Any representation just for this test.
106        if ( ! any.type().equal(dyn_any.type())) {
107            return false;
108        }
109        //System.out.println("Comparing anys");
110        return any.equal(getAny(dyn_any));
111    }
112
113    public void destroy() {
114        if (status == STATUS_DESTROYED) {
115            throw wrapper.dynAnyDestroyed() ;
116        }
117        if (status == STATUS_DESTROYABLE) {
118            status = STATUS_DESTROYED;
119        }
120    }
121
122    public org.omg.DynamicAny.DynAny copy() {
123        if (status == STATUS_DESTROYED) {
124            throw wrapper.dynAnyDestroyed() ;
125        }
126        // The flag "true" indicates copying the Any value
127        try {
128            return DynAnyUtil.createMostDerivedDynAny(any, orb, true);
129        } catch (InconsistentTypeCode ictc) {
130            return null; // impossible
131        }
132    }
133
134    public org.omg.DynamicAny.DynAny current_component()
135        throws org.omg.DynamicAny.DynAnyPackage.TypeMismatch
136    {
137        return null;
138    }
139
140    public int component_count() {
141        return 0;
142    }
143
144    public boolean next() {
145        return false;
146    }
147
148    public boolean seek(int index) {
149        return false;
150    }
151
152    public void rewind() {
153    }
154
155    public void insert_boolean(boolean value)
156        throws org.omg.DynamicAny.DynAnyPackage.TypeMismatch,
157               org.omg.DynamicAny.DynAnyPackage.InvalidValue
158    {
159        if (status == STATUS_DESTROYED) {
160            throw wrapper.dynAnyDestroyed() ;
161        }
162        if (any.type().kind().value() != TCKind._tk_boolean)
163            throw new TypeMismatch();
164        any.insert_boolean(value);
165    }
166
167    public void insert_octet(byte value)
168        throws org.omg.DynamicAny.DynAnyPackage.TypeMismatch,
169               org.omg.DynamicAny.DynAnyPackage.InvalidValue
170    {
171        if (status == STATUS_DESTROYED) {
172            throw wrapper.dynAnyDestroyed() ;
173        }
174        if (any.type().kind().value() != TCKind._tk_octet)
175            throw new TypeMismatch();
176        any.insert_octet(value);
177    }
178
179    public void insert_char(char value)
180        throws org.omg.DynamicAny.DynAnyPackage.TypeMismatch,
181               org.omg.DynamicAny.DynAnyPackage.InvalidValue
182    {
183        if (status == STATUS_DESTROYED) {
184            throw wrapper.dynAnyDestroyed() ;
185        }
186        if (any.type().kind().value() != TCKind._tk_char)
187            throw new TypeMismatch();
188        any.insert_char(value);
189    }
190
191    public void insert_short(short value)
192        throws org.omg.DynamicAny.DynAnyPackage.TypeMismatch,
193               org.omg.DynamicAny.DynAnyPackage.InvalidValue
194    {
195        if (status == STATUS_DESTROYED) {
196            throw wrapper.dynAnyDestroyed() ;
197        }
198        if (any.type().kind().value() != TCKind._tk_short)
199            throw new TypeMismatch();
200        any.insert_short(value);
201    }
202
203    public void insert_ushort(short value)
204        throws org.omg.DynamicAny.DynAnyPackage.TypeMismatch,
205               org.omg.DynamicAny.DynAnyPackage.InvalidValue
206    {
207        if (status == STATUS_DESTROYED) {
208            throw wrapper.dynAnyDestroyed() ;
209        }
210        if (any.type().kind().value() != TCKind._tk_ushort)
211            throw new TypeMismatch();
212        any.insert_ushort(value);
213    }
214
215    public void insert_long(int value)
216        throws org.omg.DynamicAny.DynAnyPackage.TypeMismatch,
217               org.omg.DynamicAny.DynAnyPackage.InvalidValue
218    {
219        if (status == STATUS_DESTROYED) {
220            throw wrapper.dynAnyDestroyed() ;
221        }
222        if (any.type().kind().value() != TCKind._tk_long)
223            throw new TypeMismatch();
224        any.insert_long(value);
225    }
226
227    public void insert_ulong(int value)
228        throws org.omg.DynamicAny.DynAnyPackage.TypeMismatch,
229               org.omg.DynamicAny.DynAnyPackage.InvalidValue
230    {
231        if (status == STATUS_DESTROYED) {
232            throw wrapper.dynAnyDestroyed() ;
233        }
234        if (any.type().kind().value() != TCKind._tk_ulong)
235            throw new TypeMismatch();
236        any.insert_ulong(value);
237    }
238
239    public void insert_float(float value)
240        throws org.omg.DynamicAny.DynAnyPackage.TypeMismatch,
241               org.omg.DynamicAny.DynAnyPackage.InvalidValue
242    {
243        if (status == STATUS_DESTROYED) {
244            throw wrapper.dynAnyDestroyed() ;
245        }
246        if (any.type().kind().value() != TCKind._tk_float)
247            throw new TypeMismatch();
248        any.insert_float(value);
249    }
250
251    public void insert_double(double value)
252        throws org.omg.DynamicAny.DynAnyPackage.TypeMismatch,
253               org.omg.DynamicAny.DynAnyPackage.InvalidValue
254    {
255        if (status == STATUS_DESTROYED) {
256            throw wrapper.dynAnyDestroyed() ;
257        }
258        if (any.type().kind().value() != TCKind._tk_double)
259            throw new TypeMismatch();
260        any.insert_double(value);
261    }
262
263    public void insert_string(String value)
264        throws org.omg.DynamicAny.DynAnyPackage.TypeMismatch,
265               org.omg.DynamicAny.DynAnyPackage.InvalidValue
266    {
267        if (status == STATUS_DESTROYED) {
268            throw wrapper.dynAnyDestroyed() ;
269        }
270        if (any.type().kind().value() != TCKind._tk_string)
271            throw new TypeMismatch();
272        if (value == null)
273            throw new InvalidValue();
274        // Throw InvalidValue if this is a bounded string and the length is exceeded
275        try {
276            if (any.type().length() > 0 && any.type().length() < value.length())
277                throw new InvalidValue();
278        } catch (BadKind bad) { // impossible
279        }
280        any.insert_string(value);
281    }
282
283    public void insert_reference(org.omg.CORBA.Object value)
284        throws org.omg.DynamicAny.DynAnyPackage.TypeMismatch,
285               org.omg.DynamicAny.DynAnyPackage.InvalidValue
286    {
287        if (status == STATUS_DESTROYED) {
288            throw wrapper.dynAnyDestroyed() ;
289        }
290        if (any.type().kind().value() != TCKind._tk_objref)
291            throw new TypeMismatch();
292        any.insert_Object(value);
293    }
294
295    public void insert_typecode(org.omg.CORBA.TypeCode value)
296        throws org.omg.DynamicAny.DynAnyPackage.TypeMismatch,
297               org.omg.DynamicAny.DynAnyPackage.InvalidValue
298    {
299        if (status == STATUS_DESTROYED) {
300            throw wrapper.dynAnyDestroyed() ;
301        }
302        if (any.type().kind().value() != TCKind._tk_TypeCode)
303            throw new TypeMismatch();
304        any.insert_TypeCode(value);
305    }
306
307    public void insert_longlong(long value)
308        throws org.omg.DynamicAny.DynAnyPackage.TypeMismatch,
309               org.omg.DynamicAny.DynAnyPackage.InvalidValue
310    {
311        if (status == STATUS_DESTROYED) {
312            throw wrapper.dynAnyDestroyed() ;
313        }
314        if (any.type().kind().value() != TCKind._tk_longlong)
315            throw new TypeMismatch();
316        any.insert_longlong(value);
317    }
318
319    public void insert_ulonglong(long value)
320        throws org.omg.DynamicAny.DynAnyPackage.TypeMismatch,
321               org.omg.DynamicAny.DynAnyPackage.InvalidValue
322    {
323        if (status == STATUS_DESTROYED) {
324            throw wrapper.dynAnyDestroyed() ;
325        }
326        if (any.type().kind().value() != TCKind._tk_ulonglong)
327            throw new TypeMismatch();
328        any.insert_ulonglong(value);
329    }
330
331    public void insert_wchar(char value)
332        throws org.omg.DynamicAny.DynAnyPackage.TypeMismatch,
333               org.omg.DynamicAny.DynAnyPackage.InvalidValue
334    {
335        if (status == STATUS_DESTROYED) {
336            throw wrapper.dynAnyDestroyed() ;
337        }
338        if (any.type().kind().value() != TCKind._tk_wchar)
339            throw new TypeMismatch();
340        any.insert_wchar(value);
341    }
342
343    public void insert_wstring(String value)
344        throws org.omg.DynamicAny.DynAnyPackage.TypeMismatch,
345               org.omg.DynamicAny.DynAnyPackage.InvalidValue
346    {
347        if (status == STATUS_DESTROYED) {
348            throw wrapper.dynAnyDestroyed() ;
349        }
350        if (any.type().kind().value() != TCKind._tk_wstring)
351            throw new TypeMismatch();
352        if (value == null)
353            throw new InvalidValue();
354        // Throw InvalidValue if this is a bounded string and the length is exceeded
355        try {
356            if (any.type().length() > 0 && any.type().length() < value.length())
357                throw new InvalidValue();
358        } catch (BadKind bad) { // impossible
359        }
360        any.insert_wstring(value);
361    }
362
363    public void insert_any(org.omg.CORBA.Any value)
364        throws org.omg.DynamicAny.DynAnyPackage.TypeMismatch,
365               org.omg.DynamicAny.DynAnyPackage.InvalidValue
366    {
367        if (status == STATUS_DESTROYED) {
368            throw wrapper.dynAnyDestroyed() ;
369        }
370        if (any.type().kind().value() != TCKind._tk_any)
371            throw new TypeMismatch();
372        any.insert_any(value);
373    }
374
375    public void insert_dyn_any (org.omg.DynamicAny.DynAny value)
376        throws org.omg.DynamicAny.DynAnyPackage.TypeMismatch,
377               org.omg.DynamicAny.DynAnyPackage.InvalidValue
378    {
379        if (status == STATUS_DESTROYED) {
380            throw wrapper.dynAnyDestroyed() ;
381        }
382        if (any.type().kind().value() != TCKind._tk_any)
383            throw new TypeMismatch();
384        // _REVISIT_ Copy value here?
385        any.insert_any(value.to_any());
386    }
387
388    public void insert_val(java.io.Serializable value)
389        throws org.omg.DynamicAny.DynAnyPackage.TypeMismatch,
390               org.omg.DynamicAny.DynAnyPackage.InvalidValue
391    {
392        if (status == STATUS_DESTROYED) {
393            throw wrapper.dynAnyDestroyed() ;
394        }
395        int kind = any.type().kind().value();
396        if (kind != TCKind._tk_value && kind != TCKind._tk_value_box)
397            throw new TypeMismatch();
398        any.insert_Value(value);
399    }
400
401    public java.io.Serializable get_val()
402        throws org.omg.DynamicAny.DynAnyPackage.TypeMismatch,
403               org.omg.DynamicAny.DynAnyPackage.InvalidValue
404    {
405        if (status == STATUS_DESTROYED) {
406            throw wrapper.dynAnyDestroyed() ;
407        }
408        int kind = any.type().kind().value();
409        if (kind != TCKind._tk_value && kind != TCKind._tk_value_box)
410            throw new TypeMismatch();
411        return any.extract_Value();
412    }
413
414    public boolean get_boolean()
415        throws org.omg.DynamicAny.DynAnyPackage.TypeMismatch,
416               org.omg.DynamicAny.DynAnyPackage.InvalidValue
417    {
418        if (status == STATUS_DESTROYED) {
419            throw wrapper.dynAnyDestroyed() ;
420        }
421        if (any.type().kind().value() != TCKind._tk_boolean)
422            throw new TypeMismatch();
423        return any.extract_boolean();
424    }
425
426    public byte get_octet()
427        throws org.omg.DynamicAny.DynAnyPackage.TypeMismatch,
428               org.omg.DynamicAny.DynAnyPackage.InvalidValue
429    {
430        if (status == STATUS_DESTROYED) {
431            throw wrapper.dynAnyDestroyed() ;
432        }
433        if (any.type().kind().value() != TCKind._tk_octet)
434            throw new TypeMismatch();
435        return any.extract_octet();
436    }
437
438    public char get_char()
439        throws org.omg.DynamicAny.DynAnyPackage.TypeMismatch,
440               org.omg.DynamicAny.DynAnyPackage.InvalidValue
441    {
442        if (status == STATUS_DESTROYED) {
443            throw wrapper.dynAnyDestroyed() ;
444        }
445        if (any.type().kind().value() != TCKind._tk_char)
446            throw new TypeMismatch();
447        return any.extract_char();
448    }
449
450    public short get_short()
451        throws org.omg.DynamicAny.DynAnyPackage.TypeMismatch,
452               org.omg.DynamicAny.DynAnyPackage.InvalidValue
453    {
454        if (status == STATUS_DESTROYED) {
455            throw wrapper.dynAnyDestroyed() ;
456        }
457        if (any.type().kind().value() != TCKind._tk_short)
458            throw new TypeMismatch();
459        return any.extract_short();
460    }
461
462    public short get_ushort()
463        throws org.omg.DynamicAny.DynAnyPackage.TypeMismatch,
464               org.omg.DynamicAny.DynAnyPackage.InvalidValue
465    {
466        if (status == STATUS_DESTROYED) {
467            throw wrapper.dynAnyDestroyed() ;
468        }
469        if (any.type().kind().value() != TCKind._tk_ushort)
470            throw new TypeMismatch();
471        return any.extract_ushort();
472    }
473
474    public int get_long()
475        throws org.omg.DynamicAny.DynAnyPackage.TypeMismatch,
476               org.omg.DynamicAny.DynAnyPackage.InvalidValue
477    {
478        if (status == STATUS_DESTROYED) {
479            throw wrapper.dynAnyDestroyed() ;
480        }
481        if (any.type().kind().value() != TCKind._tk_long)
482            throw new TypeMismatch();
483        return any.extract_long();
484    }
485
486    public int get_ulong()
487        throws org.omg.DynamicAny.DynAnyPackage.TypeMismatch,
488               org.omg.DynamicAny.DynAnyPackage.InvalidValue
489    {
490        if (status == STATUS_DESTROYED) {
491            throw wrapper.dynAnyDestroyed() ;
492        }
493        if (any.type().kind().value() != TCKind._tk_ulong)
494            throw new TypeMismatch();
495        return any.extract_ulong();
496    }
497
498    public float get_float()
499        throws org.omg.DynamicAny.DynAnyPackage.TypeMismatch,
500               org.omg.DynamicAny.DynAnyPackage.InvalidValue
501    {
502        if (status == STATUS_DESTROYED) {
503            throw wrapper.dynAnyDestroyed() ;
504        }
505        if (any.type().kind().value() != TCKind._tk_float)
506            throw new TypeMismatch();
507        return any.extract_float();
508    }
509
510    public double get_double()
511        throws org.omg.DynamicAny.DynAnyPackage.TypeMismatch,
512               org.omg.DynamicAny.DynAnyPackage.InvalidValue
513    {
514        if (status == STATUS_DESTROYED) {
515            throw wrapper.dynAnyDestroyed() ;
516        }
517        if (any.type().kind().value() != TCKind._tk_double)
518            throw new TypeMismatch();
519        return any.extract_double();
520    }
521
522    public String get_string()
523        throws org.omg.DynamicAny.DynAnyPackage.TypeMismatch,
524               org.omg.DynamicAny.DynAnyPackage.InvalidValue
525    {
526        if (status == STATUS_DESTROYED) {
527            throw wrapper.dynAnyDestroyed() ;
528        }
529        if (any.type().kind().value() != TCKind._tk_string)
530            throw new TypeMismatch();
531        return any.extract_string();
532    }
533
534    public org.omg.CORBA.Object get_reference()
535        throws org.omg.DynamicAny.DynAnyPackage.TypeMismatch,
536               org.omg.DynamicAny.DynAnyPackage.InvalidValue
537    {
538        if (status == STATUS_DESTROYED) {
539            throw wrapper.dynAnyDestroyed() ;
540        }
541        if (any.type().kind().value() != TCKind._tk_objref)
542            throw new TypeMismatch();
543        return any.extract_Object();
544    }
545
546    public org.omg.CORBA.TypeCode get_typecode()
547        throws org.omg.DynamicAny.DynAnyPackage.TypeMismatch,
548               org.omg.DynamicAny.DynAnyPackage.InvalidValue
549    {
550        if (status == STATUS_DESTROYED) {
551            throw wrapper.dynAnyDestroyed() ;
552        }
553        if (any.type().kind().value() != TCKind._tk_TypeCode)
554            throw new TypeMismatch();
555        return any.extract_TypeCode();
556    }
557
558    public long get_longlong()
559        throws org.omg.DynamicAny.DynAnyPackage.TypeMismatch,
560               org.omg.DynamicAny.DynAnyPackage.InvalidValue
561    {
562        if (status == STATUS_DESTROYED) {
563            throw wrapper.dynAnyDestroyed() ;
564        }
565        if (any.type().kind().value() != TCKind._tk_longlong)
566            throw new TypeMismatch();
567        return any.extract_longlong();
568    }
569
570    public long get_ulonglong()
571        throws org.omg.DynamicAny.DynAnyPackage.TypeMismatch,
572               org.omg.DynamicAny.DynAnyPackage.InvalidValue
573    {
574        if (status == STATUS_DESTROYED) {
575            throw wrapper.dynAnyDestroyed() ;
576        }
577        if (any.type().kind().value() != TCKind._tk_ulonglong)
578            throw new TypeMismatch();
579        return any.extract_ulonglong();
580    }
581
582    public char get_wchar()
583        throws org.omg.DynamicAny.DynAnyPackage.TypeMismatch,
584               org.omg.DynamicAny.DynAnyPackage.InvalidValue
585    {
586        if (status == STATUS_DESTROYED) {
587            throw wrapper.dynAnyDestroyed() ;
588        }
589        if (any.type().kind().value() != TCKind._tk_wchar)
590            throw new TypeMismatch();
591        return any.extract_wchar();
592    }
593
594    public String get_wstring()
595        throws org.omg.DynamicAny.DynAnyPackage.TypeMismatch,
596               org.omg.DynamicAny.DynAnyPackage.InvalidValue
597    {
598        if (status == STATUS_DESTROYED) {
599            throw wrapper.dynAnyDestroyed() ;
600        }
601        if (any.type().kind().value() != TCKind._tk_wstring)
602            throw new TypeMismatch();
603        return any.extract_wstring();
604    }
605
606    public org.omg.CORBA.Any get_any()
607        throws org.omg.DynamicAny.DynAnyPackage.TypeMismatch,
608               org.omg.DynamicAny.DynAnyPackage.InvalidValue
609    {
610        if (status == STATUS_DESTROYED) {
611            throw wrapper.dynAnyDestroyed() ;
612        }
613        if (any.type().kind().value() != TCKind._tk_any)
614            throw new TypeMismatch();
615        return any.extract_any();
616    }
617
618    public org.omg.DynamicAny.DynAny get_dyn_any()
619        throws org.omg.DynamicAny.DynAnyPackage.TypeMismatch,
620               org.omg.DynamicAny.DynAnyPackage.InvalidValue
621    {
622        if (status == STATUS_DESTROYED) {
623            throw wrapper.dynAnyDestroyed() ;
624        }
625        if (any.type().kind().value() != TCKind._tk_any)
626            throw new TypeMismatch();
627        // _REVISIT_ Copy value here?
628        try {
629            return DynAnyUtil.createMostDerivedDynAny(any.extract_any(), orb, true);
630        } catch (InconsistentTypeCode ictc) {
631            // The spec doesn't allow us to throw back this exception
632            // incase the anys any if of type Principal, native or abstract interface.
633            return null;
634        }
635    }
636}
637