package org.jacorb.ir; /* * 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 org.slf4j.Logger; import org.omg.CORBA.TCKind; import org.omg.CORBA.TypeCode; import org.omg.PortableServer.POA; /** * Base class and factory for anonymous IDLType objects * * Direct instances of this class are only used as place holders * in recursive types */ public class IDLType extends IRObject implements org.omg.CORBA.IDLTypeOperations { protected org.omg.CORBA.TypeCode type; public org.omg.CORBA.TypeCode type() { return type; } public void define() {} public void destroy() {} protected IDLType() { } private IDLType( TypeCode tc, org.omg.CORBA.Repository ir ) { type = tc; } /** * Factory method for IDLType objects */ public static org.omg.CORBA.IDLType create( TypeCode tc, org.omg.CORBA.Repository ir, Logger logger, POA poa ) { return create( tc, ir, false, logger, poa ); } public static org.omg.CORBA.IDLType create( TypeCode tc, org.omg.CORBA.Repository ir, boolean define, Logger logger, POA poa) { if (logger.isDebugEnabled()) { logger.debug("IDLType create for tc kind " + tc.kind().value()); } if( tc == null ) // PIDLs return null; if(tc.kind ().value () == -1 || tc.kind ().value () == 0xFFFFFFFF) { logger.debug("Placeholder for recursive sequence"); try { return org.omg.CORBA.IDLTypeHelper.narrow( poa.servant_to_reference( new org.omg.CORBA.IDLTypePOATie( new IDLType( tc,ir )))); } catch( Exception e ) { logger.error("Caught Exception", e); } } int kind = tc.kind().value(); switch (kind) { case TCKind._tk_null: case TCKind._tk_void: case TCKind._tk_short: case TCKind._tk_long: case TCKind._tk_ushort: case TCKind._tk_ulong: case TCKind._tk_float: case TCKind._tk_double: case TCKind._tk_boolean: case TCKind._tk_char: case TCKind._tk_longlong: case TCKind._tk_ulonglong: case TCKind._tk_longdouble: case TCKind._tk_wchar: case TCKind._tk_octet: case TCKind._tk_any: case TCKind._tk_TypeCode: case TCKind._tk_Principal: try { PrimitiveDef pd = new PrimitiveDef( tc ); return org.omg.CORBA.PrimitiveDefHelper.narrow( poa.servant_to_reference( new org.omg.CORBA.PrimitiveDefPOATie( pd ))); } catch( Exception e ) { logger.error("Caught Exception", e); return null; } case TCKind._tk_alias: case TCKind._tk_struct: case TCKind._tk_except: case TCKind._tk_union: case TCKind._tk_enum: try { return org.omg.CORBA.IDLTypeHelper.narrow( ir.lookup_id( tc.id() )); } catch( Exception e ) { // does not happen here logger.error("Caught Exception", e); return null; } case TCKind._tk_string: try { if( tc.length() == 0) { return org.omg.CORBA.PrimitiveDefHelper.narrow( poa.servant_to_reference( new org.omg.CORBA.PrimitiveDefPOATie( new PrimitiveDef( tc )))); } else { return org.omg.CORBA.StringDefHelper.narrow( poa.servant_to_reference( new org.omg.CORBA.StringDefPOATie( new StringDef( tc )))); } } catch( Exception e ) { logger.error("Caught Exception", e); return null; } case TCKind._tk_wstring: try { if( tc.length() == 0) { return org.omg.CORBA.PrimitiveDefHelper.narrow( poa.servant_to_reference( new org.omg.CORBA.PrimitiveDefPOATie( new PrimitiveDef( tc )))); } else { return org.omg.CORBA.WstringDefHelper.narrow( poa.servant_to_reference( new org.omg.CORBA.WstringDefPOATie( new WstringDef( tc )))); } } catch( Exception e ) { logger.error("Caught Exception", e); return null; } case TCKind._tk_fixed: try { return org.omg.CORBA.FixedDefHelper.narrow( poa.servant_to_reference( new org.omg.CORBA.FixedDefPOATie( new FixedDef( tc )))); } catch( Exception e ) { logger.error("Caught Exception", e); return null; } case TCKind._tk_objref: { try { if (logger.isDebugEnabled()) { logger.debug("IDLType create for " + tc.id()); } if( tc.id().equals("IDL:omg.org/CORBA/Object:1.0")) { return org.omg.CORBA.PrimitiveDefHelper.narrow( poa.servant_to_reference( new org.omg.CORBA.PrimitiveDefPOATie( new PrimitiveDef( tc )))); } else { return org.omg.CORBA.IDLTypeHelper.narrow( ir.lookup_id( tc.id() ) ); } } catch( Exception e ) { logger.error("Caught Exception", e); return null; } } case TCKind._tk_sequence: try { SequenceDef sd = new SequenceDef( tc, ir, logger, poa ); if( define ) sd.define(); return org.omg.CORBA.SequenceDefHelper.narrow( poa.servant_to_reference( new org.omg.CORBA.SequenceDefPOATie( sd ))); } catch( Exception e ) { logger.error("Caught Exception", e); return null; } case TCKind._tk_array: try { ArrayDef ad = new ArrayDef( tc, ir, logger, poa ); if( define ) ad.define(); return org.omg.CORBA.ArrayDefHelper.narrow( poa.servant_to_reference( new org.omg.CORBA.ArrayDefPOATie( ad ))); } catch( Exception e ) { logger.error("Caught Exception", e); return null; } default: logger.warn("IDL type returns null for tc kind " + kind ); return null; } } }