/* * @(#)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; } }