/*
* Copyright (c) 2000, 2003, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package com.sun.corba.se.impl.dynamicany;
import org.omg.CORBA.TypeCode;
import org.omg.CORBA.Any;
import org.omg.CORBA.BAD_OPERATION;
import org.omg.CORBA.INTERNAL;
import org.omg.CORBA.TypeCodePackage.BadKind;
import org.omg.CORBA.TypeCodePackage.Bounds;
import org.omg.DynamicAny.*;
import org.omg.DynamicAny.DynAnyPackage.*;
import com.sun.corba.se.spi.orb.ORB ;
import com.sun.corba.se.spi.logging.CORBALogDomains ;
import com.sun.corba.se.impl.logging.ORBUtilSystemException ;
public class DynEnumImpl extends DynAnyBasicImpl implements DynEnum
{
//
// Instance variables
//
// This int and the any value are kept in sync at all times
int currentEnumeratorIndex = NO_INDEX;
//
// Constructors
//
private DynEnumImpl() {
this(null, (Any)null, false);
}
// The current position of a DynEnum is always -1.
protected DynEnumImpl(ORB orb, Any anAny, boolean copyValue) {
super(orb, anAny, copyValue);
index = NO_INDEX;
// The any doesn't have to be initialized. We have a default value in this case.
try {
currentEnumeratorIndex = any.extract_long();
} catch (BAD_OPERATION e) {
// _REVISIT_: Fix Me
currentEnumeratorIndex = 0;
any.type(any.type());
any.insert_long(0);
}
}
// Sets the current position to -1 and sets the value of the enumerator
// to the first enumerator value indicated by the TypeCode.
protected DynEnumImpl(ORB orb, TypeCode typeCode) {
super(orb, typeCode);
index = NO_INDEX;
currentEnumeratorIndex = 0;
any.insert_long(0);
}
//
// Utility methods
//
private int memberCount() {
int memberCount = 0;
try {
memberCount = any.type().member_count();
} catch (BadKind bad) {
}
return memberCount;
}
private String memberName(int i) {
String memberName = null;
try {
memberName = any.type().member_name(i);
} catch (BadKind bad) {
} catch (Bounds bounds) {
}
return memberName;
}
private int computeCurrentEnumeratorIndex(String value) {
int memberCount = memberCount();
for (int i=0; i<memberCount; i++) {
if (memberName(i).equals(value)) {
return i;
}
}
return NO_INDEX;
}
//
// DynAny interface methods
//
// Returns always 0 for DynEnum
public int component_count() {
return 0;
}
// Calling current_component on a DynAny that cannot have components,
// such as a DynEnum or an empty exception, raises TypeMismatch.
public org.omg.DynamicAny.DynAny current_component()
throws org.omg.DynamicAny.DynAnyPackage.TypeMismatch
{
if (status == STATUS_DESTROYED) {
throw wrapper.dynAnyDestroyed() ;
}
throw new TypeMismatch();
}
//
// DynEnum interface methods
//
// Returns the value of the DynEnum as an IDL identifier.
public String get_as_string () {
if (status == STATUS_DESTROYED) {
throw wrapper.dynAnyDestroyed() ;
}
return memberName(currentEnumeratorIndex);
}
// Sets the value of the DynEnum to the enumerated value
// whose IDL identifier is passed in the value parameter.
// If value contains a string that is not a valid IDL identifier
// for the corresponding enumerated type, the operation raises InvalidValue.
public void set_as_string (String value)
throws org.omg.DynamicAny.DynAnyPackage.InvalidValue
{
if (status == STATUS_DESTROYED) {
throw wrapper.dynAnyDestroyed() ;
}
int newIndex = computeCurrentEnumeratorIndex(value);
if (newIndex == NO_INDEX) {
throw new InvalidValue();
}
currentEnumeratorIndex = newIndex;
any.insert_long(newIndex);
}
// Returns the value of the DynEnum as the enumerated values ordinal value.
// Enumerators have ordinal values 0 to n-1,
// as they appear from left to right in the corresponding IDL definition.
public int get_as_ulong () {
if (status == STATUS_DESTROYED) {
throw wrapper.dynAnyDestroyed() ;
}
return currentEnumeratorIndex;
}
// Sets the value of the DynEnum as the enumerated values ordinal value.
// If value contains a value that is outside the range of ordinal values
// for the corresponding enumerated type, the operation raises InvalidValue.
public void set_as_ulong (int value)
throws org.omg.DynamicAny.DynAnyPackage.InvalidValue
{
if (status == STATUS_DESTROYED) {
throw wrapper.dynAnyDestroyed() ;
}
if (value < 0 || value >= memberCount()) {
throw new InvalidValue();
}
currentEnumeratorIndex = value;
any.insert_long(value);
}
}