package org.jacorb.orb.dynany;
/*
* JacORB - a free Java ORB
*
* Copyright (C) 1997-2014 Gerald Brose / The JacORB Team.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library 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
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
import java.io.IOException;
import org.jacorb.orb.TypeCode;
import org.omg.CORBA.BAD_INV_ORDER;
import org.omg.CORBA.INTERNAL;
import org.omg.CORBA.NO_IMPLEMENT;
import org.omg.CORBA.OBJECT_NOT_EXIST;
import org.omg.CORBA.TCKind;
import org.omg.CORBA.portable.InputStream;
import org.omg.DynamicAny.DynAnyPackage.InvalidValue;
import org.omg.DynamicAny.DynAnyPackage.TypeMismatch;
import org.slf4j.Logger;
/**
* CORBA DynAny
*
* @author Gerald Brose
*/
public class DynAny
extends org.omg.CORBA.LocalObject
implements org.omg.DynamicAny.DynAny
{
protected org.omg.CORBA.TypeCode typeCode;
protected int pos = -1;
protected int limit = 0;
protected final org.omg.DynamicAny.DynAnyFactory dynFactory;
protected final org.jacorb.orb.ORB orb;
protected final Logger logger;
/**
* our representation of a primitive type any is the any itself
*/
protected org.omg.CORBA.Any anyRepresentation;
protected DynAny(org.omg.DynamicAny.DynAnyFactory factory, org.jacorb.orb.ORB orb, Logger logger)
{
super();
this.orb = orb;
this.dynFactory = factory;
this.logger = logger;
}
DynAny( org.omg.DynamicAny.DynAnyFactory dynFactory,
org.omg.CORBA.TypeCode type,
org.jacorb.orb.ORB orb,
Logger logger)
throws TypeMismatch
{
this(dynFactory, orb, logger);
typeCode = TypeCode.originalType( type );
anyRepresentation = defaultValue( typeCode );
}
public org.omg.CORBA.TypeCode type()
{
checkDestroyed ();
return typeCode;
}
public void assign(org.omg.DynamicAny.DynAny dyn_any)
throws TypeMismatch
{
checkDestroyed ();
if( dyn_any.type().equivalent( this.type()))
{
try
{
from_any( dyn_any.to_any() );
}
catch( InvalidValue iv )
{
throw unexpectedException(iv);
}
}
else
{
throw new TypeMismatch();
}
}
public boolean equal( org.omg.DynamicAny.DynAny dyn_any )
{
checkDestroyed ();
if ( getRepresentation() == null )
{
throw new BAD_INV_ORDER ("DynAny not initialized");
}
return dyn_any.to_any().equal( getRepresentation() );
}
public void from_any(org.omg.CORBA.Any value)
throws InvalidValue, TypeMismatch
{
from_any_internal(false, value);
}
void from_any_internal (boolean useCurrentRepresentation, org.omg.CORBA.Any value)
throws InvalidValue, TypeMismatch
{
checkDestroyed ();
if( ! value.type().equivalent( type()) )
{
throw new TypeMismatch();
}
typeCode = TypeCode.originalType( value.type() );
if (useCurrentRepresentation)
{
anyRepresentation = value;
}
else
{
try
{
anyRepresentation = (org.jacorb.orb.Any)orb.create_any();
anyRepresentation.read_value( value.create_input_stream(), type());
}
catch( Exception e)
{
throw new InvalidValue(e.toString());
}
}
}
public org.omg.CORBA.Any to_any()
{
checkDestroyed ();
final org.omg.CORBA.Any out_any = orb.create_any();
out_any.type( type());
final InputStream in = getRepresentation().create_input_stream();
try
{
out_any.read_value( in, type());
return out_any;
}
finally
{
try
{
in.close();
} catch (IOException e)
{
logger.error("unable to close stream", e);
}
}
}
public void destroy()
{
checkDestroyed ();
anyRepresentation = null;
typeCode = null;
}
public org.omg.DynamicAny.DynAny copy()
{
checkDestroyed ();
try
{
return dynFactory.create_dyn_any( to_any() );
}
catch( org.omg.DynamicAny.DynAnyFactoryPackage.InconsistentTypeCode tm )
{
throw unexpectedException(tm);
}
}
/**
* returns the DynAny's internal any representation,
* overwritten in subclasses that represent constructed
* types and need to traverse structures.
*/
protected org.omg.CORBA.Any getRepresentation()
{
return anyRepresentation;
}
public void insert_boolean( boolean value )
throws TypeMismatch
{
checkDestroyed ();
org.omg.CORBA.Any any = getRepresentation();
if( any.type().kind() != org.omg.CORBA.TCKind.tk_boolean)
{
throw new TypeMismatch ();
}
any.insert_boolean(value);
}
public void insert_octet( byte value )
throws TypeMismatch
{
checkDestroyed ();
org.omg.CORBA.Any any = getRepresentation();
if( any.type().kind() != org.omg.CORBA.TCKind.tk_octet)
{
throw new TypeMismatch ();
}
any.insert_octet(value);
}
public void insert_char(char value)
throws TypeMismatch
{
checkDestroyed ();
org.omg.CORBA.Any any = getRepresentation();
if( any.type().kind() != org.omg.CORBA.TCKind.tk_char)
{
throw new TypeMismatch ();
}
any.insert_char(value);
}
public void insert_short(short value)
throws TypeMismatch
{
checkDestroyed ();
org.omg.CORBA.Any any = getRepresentation();
if( any.type().kind() != org.omg.CORBA.TCKind.tk_short)
{
throw new TypeMismatch ();
}
any.insert_short(value);
}
public void insert_ushort(short value)
throws TypeMismatch
{
checkDestroyed ();
org.omg.CORBA.Any any = getRepresentation();
if( any.type().kind() != org.omg.CORBA.TCKind.tk_ushort)
{
throw new TypeMismatch ();
}
any.insert_ushort(value);
}
public void insert_long(int value)
throws TypeMismatch
{
checkDestroyed ();
org.omg.CORBA.Any any = getRepresentation();
if( any.type().kind() != org.omg.CORBA.TCKind.tk_long)
{
throw new TypeMismatch ();
}
any.insert_long(value);
}
public void insert_ulong(int value)
throws TypeMismatch
{
checkDestroyed ();
org.omg.CORBA.Any any = getRepresentation();
if( any.type().kind() != org.omg.CORBA.TCKind.tk_ulong)
{
throw new TypeMismatch ();
}
any.insert_ulong(value);
}
public void insert_float(float value)
throws TypeMismatch
{
checkDestroyed ();
org.omg.CORBA.Any any = getRepresentation();
if( any.type().kind() != org.omg.CORBA.TCKind.tk_float)
{
throw new TypeMismatch ();
}
any.insert_float(value);
}
public void insert_double(double value)
throws TypeMismatch
{
checkDestroyed ();
org.omg.CORBA.Any any = getRepresentation();
if( any.type().kind() != org.omg.CORBA.TCKind.tk_double)
{
throw new TypeMismatch ();
}
any.insert_double(value);
}
public void insert_string(java.lang.String value)
throws TypeMismatch
{
checkDestroyed ();
org.omg.CORBA.Any any = getRepresentation();
if( any.type().kind() != org.omg.CORBA.TCKind.tk_string)
{
throw new TypeMismatch ();
}
any.insert_string(value);
}
public void insert_reference(org.omg.CORBA.Object value)
throws TypeMismatch
{
checkDestroyed ();
org.omg.CORBA.Any any = getRepresentation();
if( any.type().kind() != org.omg.CORBA.TCKind.tk_objref)
{
throw new TypeMismatch ();
}
any.insert_Object(value);
}
public void insert_typecode(org.omg.CORBA.TypeCode value)
throws TypeMismatch
{
checkDestroyed ();
org.omg.CORBA.Any any = getRepresentation();
if( any.type().kind() != org.omg.CORBA.TCKind.tk_TypeCode)
{
throw new TypeMismatch ();
}
any.insert_TypeCode(value);
}
public void insert_longlong(long value)
throws TypeMismatch
{
checkDestroyed ();
org.omg.CORBA.Any any = getRepresentation();
if( any.type().kind() != org.omg.CORBA.TCKind.tk_longlong)
{
throw new TypeMismatch ();
}
any.insert_longlong(value);
}
public void insert_ulonglong(long value)
throws TypeMismatch
{
checkDestroyed ();
org.omg.CORBA.Any any = getRepresentation();
if( any.type().kind() != org.omg.CORBA.TCKind.tk_ulonglong)
{
throw new TypeMismatch ();
}
any.insert_ulonglong(value);
}
public void insert_wchar(char value)
throws TypeMismatch
{
checkDestroyed ();
org.omg.CORBA.Any any = getRepresentation();
if( any.type().kind() != org.omg.CORBA.TCKind.tk_wchar)
{
throw new TypeMismatch ();
}
any.insert_wchar(value);
}
public void insert_wstring(java.lang.String value)
throws TypeMismatch
{
checkDestroyed ();
org.omg.CORBA.Any any = getRepresentation();
if( any.type().kind() != org.omg.CORBA.TCKind.tk_wstring)
{
throw new TypeMismatch ();
}
any.insert_wstring(value);
}
public void insert_any(org.omg.CORBA.Any value)
throws TypeMismatch
{
checkDestroyed ();
org.omg.CORBA.Any any = getRepresentation();
if( any.type().kind() != org.omg.CORBA.TCKind.tk_any)
{
throw new TypeMismatch ();
}
any.insert_any(value);
}
public void insert_dyn_any(org.omg.DynamicAny.DynAny value)
throws TypeMismatch
{
checkDestroyed ();
insert_any (value.to_any ());
}
public boolean get_boolean() throws TypeMismatch
{
checkDestroyed ();
org.omg.CORBA.Any any = getRepresentation();
try
{
return any.extract_boolean();
}
catch( org.omg.CORBA.BAD_OPERATION b )
{
throw new TypeMismatch();
}
}
public byte get_octet() throws TypeMismatch
{
checkDestroyed ();
org.omg.CORBA.Any any = getRepresentation();
try
{
return any.extract_octet();
}
catch( org.omg.CORBA.BAD_OPERATION b )
{
throw new TypeMismatch();
}
}
public char get_char() throws TypeMismatch
{
checkDestroyed ();
org.omg.CORBA.Any any = getRepresentation();
try
{
return any.extract_char();
}
catch( org.omg.CORBA.BAD_OPERATION b )
{
throw new TypeMismatch();
}
}
public short get_short() throws TypeMismatch
{
checkDestroyed ();
org.omg.CORBA.Any any = getRepresentation();
try
{
return any.extract_short();
}
catch( org.omg.CORBA.BAD_OPERATION b )
{
throw new TypeMismatch();
}
}
public short get_ushort() throws TypeMismatch
{
checkDestroyed ();
org.omg.CORBA.Any any = getRepresentation();
try
{
return any.extract_ushort();
}
catch( org.omg.CORBA.BAD_OPERATION b )
{
throw new TypeMismatch();
}
}
public int get_long() throws TypeMismatch
{
checkDestroyed ();
org.omg.CORBA.Any any = getRepresentation();
try
{
return any.extract_long();
}
catch( org.omg.CORBA.BAD_OPERATION b )
{
throw new TypeMismatch();
}
}
public int get_ulong() throws TypeMismatch
{
checkDestroyed ();
org.omg.CORBA.Any any = getRepresentation();
try
{
return any.extract_ulong();
}
catch( org.omg.CORBA.BAD_OPERATION b )
{
throw new TypeMismatch();
}
}
public float get_float() throws TypeMismatch
{
checkDestroyed ();
org.omg.CORBA.Any any = getRepresentation();
try
{
return any.extract_float();
}
catch( org.omg.CORBA.BAD_OPERATION b )
{
throw new TypeMismatch();
}
}
public double get_double() throws TypeMismatch
{
checkDestroyed ();
org.omg.CORBA.Any any = getRepresentation();
try
{
return any.extract_double();
}
catch( org.omg.CORBA.BAD_OPERATION b )
{
throw new TypeMismatch();
}
}
public java.lang.String get_string() throws TypeMismatch
{
checkDestroyed ();
org.omg.CORBA.Any any = getRepresentation();
try
{
return any.extract_string();
}
catch( org.omg.CORBA.BAD_OPERATION b )
{
throw new TypeMismatch();
}
}
public org.omg.CORBA.Object get_reference() throws TypeMismatch
{
checkDestroyed ();
org.omg.CORBA.Any any = getRepresentation();
try
{
return any.extract_Object();
}
catch( org.omg.CORBA.BAD_OPERATION b )
{
throw new TypeMismatch();
}
}
public org.omg.CORBA.TypeCode get_typecode() throws TypeMismatch
{
checkDestroyed ();
org.omg.CORBA.Any any = getRepresentation();
try
{
return any.extract_TypeCode();
}
catch( org.omg.CORBA.BAD_OPERATION b )
{
throw new TypeMismatch();
}
}
public long get_longlong() throws TypeMismatch
{
checkDestroyed ();
org.omg.CORBA.Any any = getRepresentation();
try
{
return any.extract_longlong();
}
catch( org.omg.CORBA.BAD_OPERATION b )
{
throw new TypeMismatch();
}
}
public long[] get_longlong_seq() throws InvalidValue, TypeMismatch
{
throw new NO_IMPLEMENT("DynAny::get_longlong_seq not implemented.");
}
public long[] get_ulonglong_seq() throws InvalidValue, TypeMismatch
{
throw new NO_IMPLEMENT("DynAny::get_ulonglong_seq not implemented.");
}
public double[] get_longdouble_seq() throws InvalidValue, TypeMismatch
{
throw new NO_IMPLEMENT("DynAny::get_longdouble_seq not implemented.");
}
public double[] get_double_seq() throws InvalidValue, TypeMismatch
{
throw new NO_IMPLEMENT("DynAny::get_double_seq not implemented.");
}
public long get_ulonglong() throws TypeMismatch
{
checkDestroyed ();
org.omg.CORBA.Any any = getRepresentation();
try
{
return any.extract_ulonglong();
}
catch( org.omg.CORBA.BAD_OPERATION b )
{
throw new TypeMismatch();
}
}
public char get_wchar() throws TypeMismatch
{
checkDestroyed ();
org.omg.CORBA.Any any = getRepresentation();
try
{
return any.extract_wchar();
}
catch( org.omg.CORBA.BAD_OPERATION b )
{
throw new TypeMismatch();
}
}
public char[] get_wchar_seq() throws InvalidValue, TypeMismatch
{
throw new NO_IMPLEMENT("DynAny::get_wchar_seq not implemented.");
}
public java.lang.String get_wstring() throws TypeMismatch
{
checkDestroyed ();
org.omg.CORBA.Any any = getRepresentation();
try
{
return any.extract_wstring();
}
catch( org.omg.CORBA.BAD_OPERATION b )
{
throw new TypeMismatch();
}
}
public org.omg.CORBA.Any get_any() throws TypeMismatch
{
checkDestroyed ();
org.omg.CORBA.Any any = getRepresentation();
try
{
return any.extract_any();
}
catch( org.omg.CORBA.BAD_OPERATION b )
{
throw new TypeMismatch();
}
}
public org.omg.DynamicAny.DynAny get_dyn_any() throws TypeMismatch
{
checkDestroyed ();
try
{
return dynFactory.create_dyn_any( get_any () );
}
catch( org.omg.DynamicAny.DynAnyFactoryPackage.InconsistentTypeCode tm )
{
throw unexpectedException(tm);
}
}
public int component_count()
{
checkDestroyed ();
return limit;
}
public org.omg.DynamicAny.DynAny current_component()
throws TypeMismatch
{
checkDestroyed ();
throw new TypeMismatch();
}
public boolean next()
{
checkDestroyed ();
if( pos < limit-1 )
{
pos++;
return true;
}
pos = -1;
return false;
}
public boolean seek(int index)
{
checkDestroyed ();
if( index < 0 )
{
pos = -1;
return false;
}
if( index < limit )
{
pos = index;
return true;
}
pos = -1;
return false;
}
public void rewind()
{
checkDestroyed ();
seek(0);
}
protected void checkDestroyed ()
{
if (anyRepresentation == null && typeCode == null)
{
throw new OBJECT_NOT_EXIST ();
}
}
private org.omg.CORBA.Any defaultValue(org.omg.CORBA.TypeCode type)
throws org.omg.DynamicAny.DynAnyPackage.TypeMismatch
{
org.omg.CORBA.Any _any = orb.create_any();
_any.type( type );
switch( type.kind().value() )
{
case TCKind._tk_boolean :
_any.insert_boolean(false);
break;
case TCKind._tk_short:
_any.insert_short( (short)0 );
break;
case TCKind._tk_ushort:
_any.insert_ushort( (short)0 );
break;
case TCKind._tk_long:
_any.insert_long( 0 );
break;
case TCKind._tk_double:
_any.insert_double( 0 );
break;
case TCKind._tk_ulong:
_any.insert_ulong( 0 );
break;
case TCKind._tk_longlong:
_any.insert_longlong(0);
break;
case TCKind._tk_ulonglong:
_any.insert_ulonglong(0);
break;
case TCKind._tk_float:
_any.insert_float(0);
break;
case TCKind._tk_char:
_any.insert_char((char)0);
break;
case TCKind._tk_wchar:
_any.insert_wchar((char)0);
break;
case TCKind._tk_octet:
_any.insert_octet((byte)0);
break;
case TCKind._tk_string:
_any.insert_string("");
break;
case TCKind._tk_wstring:
_any.insert_wstring("");
break;
case TCKind._tk_objref:
_any.insert_Object(null);
break;
case TCKind._tk_TypeCode:
_any.insert_TypeCode( orb.get_primitive_tc( TCKind.tk_null ) );
break;
case TCKind._tk_any:
org.jacorb.orb.Any any = (org.jacorb.orb.Any)orb.create_any();
any.type( orb.get_primitive_tc( TCKind.tk_null ));
_any.insert_any(any);
break;
case TCKind._tk_null:
case TCKind._tk_void:
// legal TypeCodes that have no associated value
break;
default:
throw new TypeMismatch();
}
return _any;
}
// methods below suggested by <Philippe.Merle@lifl.fr>,
// to allow compilation on J2SDK 1.4.2
public void insert_val(java.io.Serializable value)
{
throw new NO_IMPLEMENT("DynAny::insert_val not implemented.");
}
public java.io.Serializable get_val()
{
throw new NO_IMPLEMENT("DynAny::get_val not implemented");
}
protected final INTERNAL unexpectedException(Exception cause)
{
logger.debug("An unexpected error occured", cause);
return new INTERNAL(cause.toString());
}
public boolean[] get_boolean_seq () throws InvalidValue, TypeMismatch
{
throw new NO_IMPLEMENT ("NYI");
}
public char[] get_char_seq () throws InvalidValue, TypeMismatch
{
throw new NO_IMPLEMENT ("NYI");
}
public float[] get_float_seq () throws InvalidValue, TypeMismatch
{
throw new NO_IMPLEMENT ("NYI");
}
public int[] get_long_seq () throws InvalidValue, TypeMismatch
{
throw new NO_IMPLEMENT ("NYI");
}
public double get_longdouble () throws InvalidValue, TypeMismatch
{
throw new NO_IMPLEMENT ("NYI");
}
public byte[] get_octet_seq () throws InvalidValue, TypeMismatch
{
throw new NO_IMPLEMENT ("NYI");
}
public short[] get_short_seq () throws InvalidValue, TypeMismatch
{
throw new NO_IMPLEMENT ("NYI");
}
public int[] get_ulong_seq () throws InvalidValue, TypeMismatch
{
throw new NO_IMPLEMENT ("NYI");
}
public short[] get_ushort_seq () throws InvalidValue, TypeMismatch
{
throw new NO_IMPLEMENT ("NYI");
}
public void insert_boolean_seq (boolean[] value) throws InvalidValue, TypeMismatch
{
throw new NO_IMPLEMENT ("NYI");
}
public void insert_char_seq (char[] value) throws InvalidValue, TypeMismatch
{
throw new NO_IMPLEMENT ("NYI");
}
public void insert_double_seq (double[] value) throws InvalidValue, TypeMismatch
{
throw new NO_IMPLEMENT ("NYI");
}
public void insert_float_seq (float[] value) throws InvalidValue, TypeMismatch
{
throw new NO_IMPLEMENT ("NYI");
}
public void insert_long_seq (int[] value) throws InvalidValue, TypeMismatch
{
throw new NO_IMPLEMENT ("NYI");
}
public void insert_longdouble (double value) throws InvalidValue, TypeMismatch
{
throw new NO_IMPLEMENT ("NYI");
}
public void insert_longdouble_seq (double[] value) throws InvalidValue, TypeMismatch
{
throw new NO_IMPLEMENT ("NYI");
}
public void insert_longlong_seq (long[] value) throws InvalidValue, TypeMismatch
{
throw new NO_IMPLEMENT ("NYI");
}
public void insert_octet_seq (byte[] value) throws InvalidValue, TypeMismatch
{
throw new NO_IMPLEMENT ("NYI");
}
public void insert_short_seq (short[] value) throws InvalidValue, TypeMismatch
{
throw new NO_IMPLEMENT ("NYI");
}
public void insert_ulong_seq (int[] value) throws InvalidValue, TypeMismatch
{
throw new NO_IMPLEMENT ("NYI");
}
public void insert_ulonglong_seq (long[] value) throws InvalidValue, TypeMismatch
{
throw new NO_IMPLEMENT ("NYI");
}
public void insert_ushort_seq (short[] value) throws InvalidValue, TypeMismatch
{
throw new NO_IMPLEMENT ("NYI");
}
public void insert_wchar_seq (char[] value) throws InvalidValue, TypeMismatch
{
throw new NO_IMPLEMENT ("NYI");
}
}