- /*
- * @(#)DynAnyImpl.java 1.15 03/06/25
- *
- * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
- * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
- */
-
- package com.sun.corba.se.impl.dynamicany;
-
- import org.omg.CORBA.Any;
- import org.omg.CORBA.TypeCode;
- import org.omg.CORBA.TCKind;
- import org.omg.CORBA.LocalObject;
- import org.omg.CORBA.ORBPackage.InvalidName;
- import org.omg.CORBA.portable.OutputStream;
-
- import org.omg.DynamicAny.*;
- import org.omg.DynamicAny.DynAnyPackage.TypeMismatch;
- import org.omg.DynamicAny.DynAnyPackage.InvalidValue;
-
- import com.sun.corba.se.impl.orbutil.ORBConstants ;
-
- import com.sun.corba.se.spi.orb.ORB ;
- import com.sun.corba.se.spi.logging.CORBALogDomains ;
- import com.sun.corba.se.impl.logging.ORBUtilSystemException ;
-
- abstract class DynAnyImpl extends org.omg.CORBA.LocalObject implements DynAny
- {
- protected static final int NO_INDEX = -1;
- // A DynAny is destroyable if it is the root of a DynAny hierarchy.
- protected static final byte STATUS_DESTROYABLE = 0;
- // A DynAny is undestroyable if it is a node in a DynAny hierarchy other than the root.
- protected static final byte STATUS_UNDESTROYABLE = 1;
- // A DynAny is destroyed if its root has been destroyed.
- protected static final byte STATUS_DESTROYED = 2;
-
- //
- // Instance variables
- //
-
- protected ORB orb = null;
- protected ORBUtilSystemException wrapper ;
-
- // An Any is used internally to implement the basic DynAny.
- // It stores the DynAnys TypeCode.
- // For primitive types it is the only representation.
- // For complex types it is the streamed representation.
- protected Any any = null;
- // Destroyable is the default status for free standing DynAnys.
- protected byte status = STATUS_DESTROYABLE;
- protected int index = NO_INDEX;
-
- //
- // Constructors
- //
-
- protected DynAnyImpl() {
- wrapper = ORBUtilSystemException.get(
- CORBALogDomains.RPC_PRESENTATION ) ;
- }
-
- protected DynAnyImpl(ORB orb, Any any, boolean copyValue) {
- this.orb = orb;
- wrapper = ORBUtilSystemException.get( orb,
- CORBALogDomains.RPC_PRESENTATION ) ;
- if (copyValue)
- this.any = DynAnyUtil.copy(any, orb);
- else
- this.any = any;
- // set the current position to 0 if any has components, otherwise to -1.
- index = NO_INDEX;
- }
-
- protected DynAnyImpl(ORB orb, TypeCode typeCode) {
- this.orb = orb;
- wrapper = ORBUtilSystemException.get( orb,
- CORBALogDomains.RPC_PRESENTATION ) ;
- this.any = DynAnyUtil.createDefaultAnyOfType(typeCode, orb);
- }
-
- protected DynAnyFactory factory() {
- try {
- return (DynAnyFactory)orb.resolve_initial_references(
- ORBConstants.DYN_ANY_FACTORY_NAME );
- } catch (InvalidName in) {
- throw new RuntimeException("Unable to find DynAnyFactory");
- }
- }
-
- protected Any getAny() {
- return any;
- }
-
- // Uses getAny() if this is our implementation, otherwise uses to_any()
- // which copies the Any.
- protected Any getAny(DynAny dynAny) {
- if (dynAny instanceof DynAnyImpl)
- return ((DynAnyImpl)dynAny).getAny();
- else
- // _REVISIT_ Nothing we can do about copying at this point
- // if this is not our implementation of DynAny.
- // To prevent this we would need another representation,
- // one where component DynAnys are initialized but not the component Anys.
- return dynAny.to_any();
- }
-
- protected void writeAny(OutputStream out) {
- //System.out.println(this + " writeAny of type " + type().kind().value());
- any.write_value(out);
- }
-
- protected void setStatus(byte newStatus) {
- status = newStatus;
- }
-
- protected void clearData() {
- // This clears the data part of the Any while keeping the TypeCode info.
- any.type(any.type());
- }
-
- //
- // DynAny interface methods
- //
-
- public org.omg.CORBA.TypeCode type() {
- if (status == STATUS_DESTROYED) {
- throw wrapper.dynAnyDestroyed() ;
- }
- return any.type();
- }
-
- // Makes a copy of the Any value inside the parameter
- public void assign (org.omg.DynamicAny.DynAny dyn_any)
- throws org.omg.DynamicAny.DynAnyPackage.TypeMismatch
- {
- if (status == STATUS_DESTROYED) {
- throw wrapper.dynAnyDestroyed() ;
- }
- if ((any != null) && (! any.type().equal(dyn_any.type()))) {
- throw new TypeMismatch();
- }
- any = dyn_any.to_any();
- }
-
- // Makes a copy of the Any parameter
- public void from_any (org.omg.CORBA.Any value)
- throws org.omg.DynamicAny.DynAnyPackage.TypeMismatch,
- org.omg.DynamicAny.DynAnyPackage.InvalidValue
- {
- if (status == STATUS_DESTROYED) {
- throw wrapper.dynAnyDestroyed() ;
- }
- if ((any != null) && (! any.type().equal(value.type()))) {
- throw new TypeMismatch();
- }
- // If the passed Any does not contain a legal value
- // (such as a null string), the operation raises InvalidValue.
- Any tempAny = null;
- try {
- tempAny = DynAnyUtil.copy(value, orb);
- } catch (Exception e) {
- throw new InvalidValue();
- }
- if ( ! DynAnyUtil.isInitialized(tempAny)) {
- throw new InvalidValue();
- }
- any = tempAny;
- }
-
- public abstract org.omg.CORBA.Any to_any();
- public abstract boolean equal (org.omg.DynamicAny.DynAny dyn_any);
- public abstract void destroy();
- public abstract org.omg.DynamicAny.DynAny copy();
-
- // Needed for org.omg.CORBA.Object
-
- private String[] __ids = { "IDL:omg.org/DynamicAny/DynAny:1.0" };
-
- public String[] _ids() {
- return __ids;
- }
- }