DynEnumImpl.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.INTERNAL;
32import org.omg.CORBA.TypeCodePackage.BadKind;
33import org.omg.CORBA.TypeCodePackage.Bounds;
34import org.omg.DynamicAny.*;
35import org.omg.DynamicAny.DynAnyPackage.*;
36
37import com.sun.corba.se.spi.orb.ORB ;
38import com.sun.corba.se.spi.logging.CORBALogDomains ;
39import com.sun.corba.se.impl.logging.ORBUtilSystemException ;
40
41public class DynEnumImpl extends DynAnyBasicImpl implements DynEnum
42{
43    //
44    // Instance variables
45    //
46
47    // This int and the any value are kept in sync at all times
48    int currentEnumeratorIndex = NO_INDEX;
49
50    //
51    // Constructors
52    //
53
54    private DynEnumImpl() {
55        this(null, (Any)null, false);
56    }
57
58    // The current position of a DynEnum is always -1.
59    protected DynEnumImpl(ORB orb, Any anAny, boolean copyValue) {
60        super(orb, anAny, copyValue);
61        index = NO_INDEX;
62        // The any doesn't have to be initialized. We have a default value in this case.
63        try {
64            currentEnumeratorIndex = any.extract_long();
65        } catch (BAD_OPERATION e) {
66            // _REVISIT_: Fix Me
67            currentEnumeratorIndex = 0;
68            any.type(any.type());
69            any.insert_long(0);
70        }
71    }
72
73    // Sets the current position to -1 and sets the value of the enumerator
74    // to the first enumerator value indicated by the TypeCode.
75    protected DynEnumImpl(ORB orb, TypeCode typeCode) {
76        super(orb, typeCode);
77        index = NO_INDEX;
78        currentEnumeratorIndex = 0;
79        any.insert_long(0);
80    }
81
82    //
83    // Utility methods
84    //
85
86    private int memberCount() {
87        int memberCount = 0;
88        try {
89            memberCount = any.type().member_count();
90        } catch (BadKind bad) {
91        }
92        return memberCount;
93    }
94
95    private String memberName(int i) {
96        String memberName = null;
97        try {
98            memberName = any.type().member_name(i);
99        } catch (BadKind bad) {
100        } catch (Bounds bounds) {
101        }
102        return memberName;
103    }
104
105    private int computeCurrentEnumeratorIndex(String value) {
106        int memberCount = memberCount();
107        for (int i=0; i<memberCount; i++) {
108            if (memberName(i).equals(value)) {
109                return i;
110            }
111        }
112        return NO_INDEX;
113    }
114
115    //
116    // DynAny interface methods
117    //
118
119    // Returns always 0 for DynEnum
120    public int component_count() {
121        return 0;
122    }
123
124    // Calling current_component on a DynAny that cannot have components,
125    // such as a DynEnum or an empty exception, raises TypeMismatch.
126    public org.omg.DynamicAny.DynAny current_component()
127        throws org.omg.DynamicAny.DynAnyPackage.TypeMismatch
128    {
129        if (status == STATUS_DESTROYED) {
130            throw wrapper.dynAnyDestroyed() ;
131        }
132        throw new TypeMismatch();
133    }
134
135    //
136    // DynEnum interface methods
137    //
138
139    // Returns the value of the DynEnum as an IDL identifier.
140    public String get_as_string () {
141        if (status == STATUS_DESTROYED) {
142            throw wrapper.dynAnyDestroyed() ;
143        }
144        return memberName(currentEnumeratorIndex);
145    }
146
147    // Sets the value of the DynEnum to the enumerated value
148    // whose IDL identifier is passed in the value parameter.
149    // If value contains a string that is not a valid IDL identifier
150    // for the corresponding enumerated type, the operation raises InvalidValue.
151    public void set_as_string (String value)
152        throws org.omg.DynamicAny.DynAnyPackage.InvalidValue
153    {
154        if (status == STATUS_DESTROYED) {
155            throw wrapper.dynAnyDestroyed() ;
156        }
157        int newIndex = computeCurrentEnumeratorIndex(value);
158        if (newIndex == NO_INDEX) {
159            throw new InvalidValue();
160        }
161        currentEnumeratorIndex = newIndex;
162        any.insert_long(newIndex);
163    }
164
165    // Returns the value of the DynEnum as the enumerated values ordinal value.
166    // Enumerators have ordinal values 0 to n-1,
167    // as they appear from left to right in the corresponding IDL definition.
168    public int get_as_ulong () {
169        if (status == STATUS_DESTROYED) {
170            throw wrapper.dynAnyDestroyed() ;
171        }
172        return currentEnumeratorIndex;
173    }
174
175    // Sets the value of the DynEnum as the enumerated values ordinal value.
176    // If value contains a value that is outside the range of ordinal values
177    // for the corresponding enumerated type, the operation raises InvalidValue.
178    public void set_as_ulong (int value)
179        throws org.omg.DynamicAny.DynAnyPackage.InvalidValue
180    {
181        if (status == STATUS_DESTROYED) {
182            throw wrapper.dynAnyDestroyed() ;
183        }
184        if (value < 0 || value >= memberCount()) {
185            throw new InvalidValue();
186        }
187        currentEnumeratorIndex = value;
188        any.insert_long(value);
189    }
190}
191