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 java.util.HashMap; import java.util.Map; import org.slf4j.Logger; import org.jacorb.orb.TypeCode; import org.omg.CORBA.TCKind; import org.omg.CORBA.ORBSingleton; /** * @author Gerald Brose, FU Berlin */ public class TypeCodeUtil { private static final Map cache = new HashMap(); static { cache.put( "java.lang.String", ORBSingleton.init ().get_primitive_tc (TCKind.tk_string)); cache.put( "org.omg.CORBA.String", ORBSingleton.init ().get_primitive_tc (TCKind.tk_string)); cache.put( "java.lang.Void", ORBSingleton.init ().get_primitive_tc (TCKind.tk_void )); cache.put( "java.lang.Long",ORBSingleton.init ().get_primitive_tc (TCKind.tk_longlong )); cache.put( "java.lang.Integer",ORBSingleton.init ().get_primitive_tc (TCKind.tk_long )); cache.put( "java.lang.Short",ORBSingleton.init ().get_primitive_tc (TCKind.tk_short )); cache.put( "java.lang.Float",ORBSingleton.init ().get_primitive_tc (TCKind.tk_float )); cache.put( "java.lang.Double",ORBSingleton.init ().get_primitive_tc (TCKind.tk_double )); cache.put( "java.lang.Boolean",ORBSingleton.init ().get_primitive_tc (TCKind.tk_boolean )); cache.put( "java.lang.Byte" ,ORBSingleton.init ().get_primitive_tc (TCKind.tk_octet )); cache.put( "org.omg.CORBA.Any", ORBSingleton.init ().get_primitive_tc (TCKind.tk_any)); cache.put( "java.lang.Character",ORBSingleton.init ().get_primitive_tc (TCKind.tk_char)); cache.put( "org.omg.CORBA.TypeCode",ORBSingleton.init ().get_primitive_tc (TCKind.tk_TypeCode)); // Principal deprecated and removed. cache.put( "org.omg.CORBA.Object", ORBSingleton.init ().get_primitive_tc (TCKind.tk_objref)); } /** * get a TypeCode for Class c. An object o of this class is needed * in order to get at nested types, as e.g. in array of arrays of arrays */ public static org.omg.CORBA.TypeCode getTypeCode( Class c, java.lang.Object o, Logger logger ) throws ClassNotFoundException { return getTypeCode( c, null, o, null, logger ); } /** * get a TypeCode for Class c. An object o of this class is needed * in order to get at nested types, as e.g. in array of arrays of arrays */ public static org.omg.CORBA.TypeCode getTypeCode( Class c, ClassLoader classLoader, java.lang.Object o, String idlName, Logger logger ) throws ClassNotFoundException { String typeName = c.getName(); if (logger.isDebugEnabled()) { logger.debug("TypeCodes.getTypeCode for class : " + typeName + " idlName: " + idlName); } ClassLoader loader; if( classLoader != null ) loader = classLoader; else loader = c.getClassLoader(); // important for ir // debug: //System.out.println("- TypeCodes.getTypeCode for class : " + c.getName() + " and primitive " + c.isPrimitive() + " and idl name " + idlName); org.omg.CORBA.TypeCode _tc = (org.omg.CORBA.TypeCode)cache.get( typeName ); if( _tc != null ) { //System.out.println("[ cached TypeCode ]"); return _tc; } if( idlName != null ) { _tc = (org.omg.CORBA.TypeCode)cache.get( idlName ); if( _tc != null ) { //System.out.println("[ cached TypeCode ]"); return _tc; } } if( c.isPrimitive() ) { if( typeName.equals("void")) return ORBSingleton.init ().get_primitive_tc (TCKind.tk_void ); if( typeName.equals("int")) return ORBSingleton.init ().get_primitive_tc (TCKind.tk_long ); if( typeName.equals("long")) return ORBSingleton.init ().get_primitive_tc (TCKind.tk_longlong ); if( typeName.equals("short")) return ORBSingleton.init ().get_primitive_tc (TCKind.tk_short ); if( typeName.equals("float")) return ORBSingleton.init ().get_primitive_tc (TCKind.tk_float ); if( typeName.equals("double")) return ORBSingleton.init ().get_primitive_tc (TCKind.tk_double ); if( typeName.equals("boolean")) return ORBSingleton.init ().get_primitive_tc (TCKind.tk_boolean ); if( typeName.equals("byte") ) return ORBSingleton.init ().get_primitive_tc (TCKind.tk_octet ); if( typeName.equals("char") ) return ORBSingleton.init ().get_primitive_tc (TCKind.tk_char ); if( typeName.equals("wchar") ) return ORBSingleton.init ().get_primitive_tc (TCKind.tk_wchar ); else { System.err.println("- TypeCode.getTypeCode, primitive class not found " + typeName ); return null; } } /* else */ Class tcClass = null; Class idlEntity = null; try { tcClass = Class.forName("org.omg.CORBA.TypeCode", true, loader ); idlEntity = Class.forName("org.omg.CORBA.portable.IDLEntity", true, loader); } catch ( ClassNotFoundException ce ) { logger.error("Can't load org.jacorb base classes!", ce); throw ce; } int field_size = 0; if ( tcClass.isAssignableFrom(c)) { return ORBSingleton.init ().get_primitive_tc (TCKind.tk_TypeCode ); } else { if( idlName != null && idlName.length() > 0 ) { try { if( idlName.equals( "java.lang.String")) return ORBSingleton.init ().get_primitive_tc (TCKind.tk_string); else if( idlName.equals( "org.omg.CORBA.Boolean")) return ORBSingleton.init ().get_primitive_tc (TCKind.tk_boolean); else if( idlName.equals( "org.omg.CORBA.Byte")) return ORBSingleton.init ().get_primitive_tc (TCKind.tk_octet); else if( idlName.equals( "org.omg.CORBA.Short")) return ORBSingleton.init ().get_primitive_tc (TCKind.tk_short); else if( idlName.equals( "org.omg.CORBA.Long")) return ORBSingleton.init ().get_primitive_tc (TCKind.tk_longlong); else if( idlName.equals( "org.omg.CORBA.Int")) return ORBSingleton.init ().get_primitive_tc (TCKind.tk_long); else if( idlName.equals( "org.omg.CORBA.String")) return ORBSingleton.init ().get_primitive_tc (TCKind.tk_string); else if( idlName.equals( "org.omg.CORBA.Char")) return ORBSingleton.init ().get_primitive_tc (TCKind.tk_char); else if( idlName.equals( "org.omg.CORBA.Float")) return ORBSingleton.init ().get_primitive_tc (TCKind.tk_float); else if( idlName.equals( "org.omg.CORBA.Double")) return ORBSingleton.init ().get_primitive_tc (TCKind.tk_double); else if( idlName.equals( "org.omg.CORBA.Any")) return ORBSingleton.init ().get_primitive_tc (TCKind.tk_any); else if( idlName.equals( "org.omg.CORBA.Object")) return ORBSingleton.init ().get_primitive_tc (TCKind.tk_objref); else if( idlName.equals( "org.omg.CORBA.TypeCode")) return ORBSingleton.init ().get_primitive_tc (TCKind.tk_TypeCode); Class type = Class.forName( idlName + "Helper", true, loader); return (org.omg.CORBA.TypeCode)type.getDeclaredMethod( "type", (Class[]) null).invoke( null, (Object[]) null ); } catch( ClassNotFoundException cnfe ) { logger.debug("Caught Exception", cnfe ); throw new RuntimeException("Could not create TypeCode for: " + c.getName() + ", no helper class for " + idlName ); } catch( Exception e ) { logger.error("Caught Exception", e ); } } if( idlEntity.isAssignableFrom(c)) { try { Class resultHelperClass = Class.forName( c.getName()+ "Helper", true, loader); return (org.omg.CORBA.TypeCode) resultHelperClass.getDeclaredMethod( "type", (Class[]) null).invoke( null, (Object[]) null ); } catch( Exception cnfe ) { logger.error("Caught Exception", cnfe); throw new RuntimeException("Could not create TypeCode for: " + c.getName() ); } } else { throw new RuntimeException("Could not create TypeCode for: " + c.getName() + ", not an IDLEntity" ); } } } }