DynArrayImpl.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.TypeCode;
29import org.omg.CORBA.Any;
30import org.omg.CORBA.BAD_OPERATION;
31import org.omg.CORBA.TypeCodePackage.BadKind;
32import org.omg.CORBA.TypeCodePackage.Bounds;
33import org.omg.CORBA.portable.InputStream;
34import org.omg.DynamicAny.*;
35import org.omg.DynamicAny.DynAnyPackage.TypeMismatch;
36import org.omg.DynamicAny.DynAnyPackage.InvalidValue;
37import org.omg.DynamicAny.DynAnyFactoryPackage.InconsistentTypeCode;
38
39import com.sun.corba.se.spi.orb.ORB ;
40import com.sun.corba.se.spi.logging.CORBALogDomains ;
41import com.sun.corba.se.impl.logging.ORBUtilSystemException ;
42
43public class DynArrayImpl extends DynAnyCollectionImpl implements DynArray
44{
45    //
46    // Constructors
47    //
48
49    private DynArrayImpl() {
50        this(null, (Any)null, false);
51    }
52
53    protected DynArrayImpl(ORB orb, Any any, boolean copyValue) {
54        super(orb, any, copyValue);
55    }
56
57    protected DynArrayImpl(ORB orb, TypeCode typeCode) {
58        super(orb, typeCode);
59    }
60
61    // Initializes components and anys representation
62    // from the Any representation
63    protected boolean initializeComponentsFromAny() {
64        // This typeCode is of kind tk_array.
65        TypeCode typeCode = any.type();
66        int length = getBound();
67        TypeCode contentType = getContentType();
68        InputStream input;
69
70        try {
71            input = any.create_input_stream();
72        } catch (BAD_OPERATION e) {
73            return false;
74        }
75
76        components = new DynAny[length];
77        anys = new Any[length];
78
79        for (int i=0; i<length; i++) {
80            // _REVISIT_ Could use read_xxx_array() methods on InputStream for efficiency
81            // but only for primitive types
82            anys[i] = DynAnyUtil.extractAnyFromStream(contentType, input, orb);
83            try {
84                // Creates the appropriate subtype without copying the Any
85                components[i] = DynAnyUtil.createMostDerivedDynAny(anys[i], orb, false);
86            } catch (InconsistentTypeCode itc) { // impossible
87            }
88        }
89        return true;
90    }
91
92    // Initializes components and anys representation
93    // from the internal TypeCode information with default values.
94    // This is not done recursively, only one level.
95    // More levels are initialized lazily, on demand.
96    protected boolean initializeComponentsFromTypeCode() {
97        // This typeCode is of kind tk_array.
98        TypeCode typeCode = any.type();
99        int length = getBound();
100        TypeCode contentType = getContentType();
101
102        components = new DynAny[length];
103        anys = new Any[length];
104
105        for (int i=0; i<length; i++) {
106            createDefaultComponentAt(i, contentType);
107        }
108        return true;
109    }
110
111    //
112    // DynArray interface methods
113    //
114
115    // Initializes the elements of the array.
116    // If value does not contain the same number of elements as the array dimension,
117    // the operation raises InvalidValue.
118    // If one or more elements have a type that is inconsistent with the DynArrays TypeCode,
119    // the operation raises TypeMismatch.
120    // This operation does not change the current position.
121/*
122    public void set_elements (org.omg.CORBA.Any[] value)
123        throws org.omg.DynamicAny.DynAnyPackage.TypeMismatch,
124               org.omg.DynamicAny.DynAnyPackage.InvalidValue;
125*/
126
127    //
128    // Utility methods
129    //
130
131    protected void checkValue(Object[] value)
132        throws org.omg.DynamicAny.DynAnyPackage.InvalidValue
133    {
134        if (value == null || value.length != getBound()) {
135            throw new InvalidValue();
136        }
137    }
138}
139