package si.ijs.acs.objectexplorer.engine.BACI; import java.util.ArrayList; import java.util.HashMap; import java.util.Stack; import java.util.StringTokenizer; import org.omg.CORBA.Any; import org.omg.CORBA.AttributeDescription; import org.omg.CORBA.AttributeMode; import org.omg.CORBA.Bounds; import org.omg.CORBA.Contained; import org.omg.CORBA.DefinitionKind; import org.omg.CORBA.EnumDef; import org.omg.CORBA.EnumDefHelper; import org.omg.CORBA.IRObject; import org.omg.CORBA.InterfaceDef; import org.omg.CORBA.InterfaceDefHelper; import org.omg.CORBA.OperationDescription; import org.omg.CORBA.ParameterDescription; import org.omg.CORBA.ParameterMode; import org.omg.CORBA.Request; import org.omg.CORBA.StructDef; import org.omg.CORBA.StructDefHelper; import org.omg.CORBA.StructMember; import org.omg.CORBA.TCKind; import org.omg.CORBA.TypeCode; import org.omg.DynamicAny.DynAny; import org.omg.DynamicAny.DynArray; import org.omg.DynamicAny.DynEnum; import org.omg.DynamicAny.DynSequence; import org.omg.DynamicAny.DynStruct; import org.omg.DynamicAny.NameDynAnyPair; import alma.acs.gui.util.DataFormatter; import si.ijs.acs.objectexplorer.engine.DataElement; import si.ijs.acs.objectexplorer.engine.DataEnum; import si.ijs.acs.objectexplorer.engine.DataException; import si.ijs.acs.objectexplorer.engine.DataStruct; import si.ijs.acs.objectexplorer.engine.DataType; import si.ijs.acs.objectexplorer.engine.IntrospectionInconsistentException; import si.ijs.acs.objectexplorer.engine.Operation; import si.ijs.acs.objectexplorer.engine.RemoteCall; import si.ijs.acs.objectexplorer.engine.RemoteException; /** * Insert the type's description here. * Creation date: (1.11.2000 20:57:03) * @author: */ public class BACIIntrospector { /*********** INNER CLASSES BEGIN HERE ***************/ public class InvocationObjectHolder { public org.omg.CORBA.Object ref = null; public String id = null; public InvocationObjectHolder(org.omg.CORBA.Object ref, String id) { this.id = id; this.ref = ref; } } private BACIRemoteAccess ra = null; private HashMap IDLtoJavaMapping = new HashMap(); private Stack structs; public static final String ID_CORBA_OBJECT ="IDL:omg.org/CORBA/Object:1.0"; public static final String ID_PROPERTY = "IDL:alma/ACS/Property:1.0"; public static final String ID_CALLBACK = "IDL:alma/ACS/Callback:1.0"; public static final String ID_DEVICE = "IDL:alma/ACS/ACSComponent:1.0"; public static final String ID_SUBSCRIPTION = "IDL:alma/ACS/Subscription:1.0"; public static final String ID_CBDESCIN = "IDL:alma/ACS/CBDescIn:1.0"; public static final String METHOD_DONE = "done"; public static final String METHOD_DESTROY = "destroy"; public static final String IDL_PACKAGE_PREFIX = "alma."; public static final String BACI_PACKAGE_PREFIX = "alma.ACS."; /** * BACIIntrospector constructor comment. */ public BACIIntrospector(BACIRemoteAccess ra) { super(); if (ra == null) throw new NullPointerException("ra"); this.ra = ra; structs = new Stack(); } /** * Insert the method's description here. * Creation date: (13.11.2000 0:58:40) * @return java.lang.String * @param arg java.lang.String */ public static String addIDLPackagePrefix(String arg) { if (arg == null) throw new NullPointerException("arg"); //return IDL_PACKAGE_PREFIX + arg; return arg; } /** * Insert the method's description here. * Creation date: (17.11.2000 2:02:35) * @return java.lang.String * @param name java.lang.String */ public static String addJavaPackagePrefix(String name) { if (name == null) throw new NullPointerException("name"); //return BACI_PACKAGE_PREFIX + name; return name; } /** * Insert the method's description here. * Creation date: (2.11.2000 0:04:34) * @return java.lang.String * @param propertyName java.lang.String */ public static String attributeNameToMethodName(String propertyName) { if (propertyName == null) throw new NullPointerException("propertyName"); return "_get_" + propertyName; } /** * Insert the method's description here. * Creation date: (7.11.2000 21:47:04) * @param invoc si.ijs.acs.objectexplorer.engine.Invocation[] */ public static void destroyInvocation(BACIInvocation invoc) { if (invoc == null) throw new NullPointerException("invoc"); if (invoc.isDestroyed()) return; Operation[] ops = invoc.getOperations(); Operation dest = null; for (int i = 0; i < ops.length; i++) { if (METHOD_DESTROY.equals(ops[i].getName())) { dest = ops[i]; if (dest.getParameterTypes().length != 0) throw new IntrospectionInconsistentException("Operation " + METHOD_DESTROY + "' on a 'Subscription' instance '" + invoc + "' must take exactly 0 parameters."); break; } } if (dest == null) throw new IntrospectionInconsistentException("'Subscription' instance for invocation '" + invoc + "' does not declare a 'destroy()' method."); invoc.ra.invoke(invoc, (BACIOperation)dest, new java.lang.Object[0], null); } public Any insertAny(Any argument, java.lang.Object obj) { if (argument == null) throw new NullPointerException("argument"); if (obj == null) throw new NullPointerException("obj"); return insertAny(argument.type(),argument,obj); } public Any insertAny(TypeCode tc, Any argument, java.lang.Object obj) { if (tc == null) throw new NullPointerException("tc"); if (argument == null) throw new NullPointerException("argument"); if (obj == null) throw new NullPointerException("obj"); int value = tc.kind().value(); switch (value) { case TCKind._tk_objref : argument.insert_Object((org.omg.CORBA.Object) obj); break; case TCKind._tk_struct : return insertTypedef(tc, obj); case TCKind._tk_enum : DynEnum en; try { en = (DynEnum) ra.getDynFact().create_dyn_any_from_type_code(tc); } catch(org.omg.DynamicAny.DynAnyFactoryPackage.InconsistentTypeCode e) { e.printStackTrace(); return null; } //return en.get_as_string(); try { en.set_as_ulong(((DataEnum)obj).get()); } catch(org.omg.DynamicAny.DynAnyPackage.InvalidValue e) { e.printStackTrace(); return null; } return en.to_any(); case TCKind._tk_double : argument.insert_double(((Double) obj).doubleValue()); break; case TCKind._tk_float : argument.insert_float(((Float) obj).floatValue()); break; case TCKind._tk_octet : argument.insert_octet(((Byte) obj).byteValue()); break; case TCKind._tk_longlong : argument.insert_longlong(((Long) obj).longValue()); break; case TCKind._tk_ulonglong : argument.insert_ulonglong(((Long) obj).longValue()); break; case TCKind._tk_long : argument.insert_long(((Integer) obj).intValue()); break; case TCKind._tk_ulong : argument.insert_ulong(((Integer) obj).intValue()); break; case TCKind._tk_short : argument.insert_short(((Short) obj).shortValue()); break; case TCKind._tk_ushort : argument.insert_ushort(((Short) obj).shortValue()); break; case TCKind._tk_string : argument.insert_string((String) obj); break; case TCKind._tk_char : argument.insert_char(((Character) obj).charValue()); break; case TCKind._tk_boolean : argument.insert_boolean(((Boolean) obj).booleanValue()); break; case TCKind._tk_sequence : case TCKind._tk_array : return insertSequence(tc, argument, obj); case TCKind._tk_alias : try { return insertAny(tc.content_type(), argument, obj); } catch (org.omg.CORBA.TypeCodePackage.BadKind e) { e.printStackTrace(); return null; } default : throw new IllegalArgumentException("Argument typecode '"+value+"' is not supported."); } return argument; } public Any insertTypedef(TypeCode tc, java.lang.Object obj) { DynAny dany; try { dany = ra.getDynFact().create_dyn_any_from_type_code(tc); } catch(org.omg.DynamicAny.DynAnyFactoryPackage.InconsistentTypeCode e) { e.printStackTrace(); return null; } //Class<?> cl = getClassType(tc); DynStruct str = (DynStruct) dany; NameDynAnyPair[] mems = str.get_members_as_dyn_any(); try { if(tc.kind() == TCKind.tk_struct) { DataStruct ds = (DataStruct) obj; for(int i = 0; i < mems.length; i++) { mems[i].value.from_any(insertAny(mems[i].value.to_any(), ds.get(mems[i].id))); } } else { DataException de = (DataException) obj; for(int i = 0; i < mems.length; i++) { mems[i].value.from_any(insertAny(mems[i].value.to_any(), de.get(mems[i].id))); } } str.set_members_as_dyn_any(mems); } catch (org.omg.DynamicAny.DynAnyPackage.TypeMismatch e) { e.printStackTrace(); return null; } catch (org.omg.DynamicAny.DynAnyPackage.InvalidValue e) { e.printStackTrace(); return null; } //displayAny(dany.to_any()); return dany.to_any(); } public Any insertSequence(TypeCode tc, Any argument, java.lang.Object obj) { if (argument == null) throw new NullPointerException("argument"); if (obj == null) throw new NullPointerException("obj"); if (!obj.getClass().isArray()) throw new IllegalArgumentException("The parameter obj has to be a sequence"); java.lang.Object[] objs; if (obj.getClass().getComponentType().isPrimitive()) objs = DataFormatter.convertPrimitiveArray(obj); else objs = (java.lang.Object[]) obj; DynAny dany; try { dany = ra.getDynFact().create_dyn_any_from_type_code(tc); } catch(org.omg.DynamicAny.DynAnyFactoryPackage.InconsistentTypeCode e) { e.printStackTrace(); return null; } Any[] els = new Any[objs.length]; try { for(int i = 0; i < els.length; i++) { DynAny dany2; try { dany2 = ra.getDynFact().create_dyn_any_from_type_code(tc.content_type()); } catch(org.omg.DynamicAny.DynAnyFactoryPackage.InconsistentTypeCode e) { e.printStackTrace(); return null; } els[i] = dany2.to_any(); els[i] = insertAny(tc.content_type(),els[i],objs[i]); } if(tc.kind() == TCKind.tk_sequence) { ((DynSequence) dany).set_elements(els); ((DynSequence) dany).set_length(els.length); } else if(tc.kind() == TCKind.tk_array) ((DynArray) dany).set_elements(els); } catch(org.omg.DynamicAny.DynAnyPackage.TypeMismatch e) { e.printStackTrace(); } catch(org.omg.DynamicAny.DynAnyPackage.InvalidValue e) { e.printStackTrace(); } catch(org.omg.CORBA.TypeCodePackage.BadKind e) { e.printStackTrace(); } return dany.to_any(); } /** * Insert the method's description here. * Creation date: (3.11.2000 0:38:21) */ public java.lang.Object extractAny(Any argument) { if (argument == null) throw new NullPointerException("argument"); return extractAny(argument.type(), argument); } /** * Insert the method's description here. * Creation date: (3.11.2000 0:38:21) */ public java.lang.Object extractAny(TypeCode tc, Any argument) { if (argument == null) throw new NullPointerException("argument"); if (tc == null) throw new NullPointerException("tc"); switch(tc.kind().value()) { case TCKind._tk_any: return extractAny(argument.extract_any()); case TCKind._tk_void: case TCKind._tk_null: return null; case TCKind._tk_objref: return argument.extract_Object(); case TCKind._tk_struct: case TCKind._tk_except: return extractTypedef(argument); case TCKind._tk_alias: try { return extractAny(tc.content_type(),argument); } catch(org.omg.CORBA.TypeCodePackage.BadKind e) { e.printStackTrace(); return null; } case TCKind._tk_enum: DynEnum en; try { en = (DynEnum) ra.getDynFact().create_dyn_any(argument); } catch(org.omg.DynamicAny.DynAnyFactoryPackage.InconsistentTypeCode e) { e.printStackTrace(); return null; } //return en.get_as_string(); DataEnum de = (DataEnum) getDef(tc); de.set(en.get_as_ulong()); return de; case TCKind._tk_sequence: case TCKind._tk_array: return extractSequence(tc, argument); case TCKind._tk_double: return new Double(argument.extract_double()); case TCKind._tk_float: return new Float(argument.extract_float()); case TCKind._tk_octet: //return new Byte(argument.extract_octet()); // use short to get unsigned value return new Short((short)(argument.extract_octet() & 0xFF)); case TCKind._tk_longlong: return new Long(argument.extract_longlong()); case TCKind._tk_ulonglong: return new Long(argument.extract_ulonglong()); case TCKind._tk_long: return new Integer(argument.extract_long()); case TCKind._tk_ulong: return new Integer(argument.extract_ulong()); case TCKind._tk_short: return new Short(argument.extract_short()); case TCKind._tk_ushort: return new Short(argument.extract_ushort()); case TCKind._tk_string: return argument.extract_string(); case TCKind._tk_char: return new Character(argument.extract_char()); case TCKind._tk_boolean: return new Boolean(argument.extract_boolean()); default: throw new IllegalArgumentException("Argument typecode '" + argument.type().kind().value() + "' is not supported."); } } /** * Insert the method's description here. * Creation date: (7.11.2000 1:00:12) * @return java.lang.Object * @param argument org.omg.CORBA.Any */ public java.lang.Object extractTypedef(TypeCode tc, Any argument) { if (argument == null) throw new NullPointerException("argument"); DynAny dany; try { dany = ra.getDynFact().create_dyn_any(argument); } catch(org.omg.DynamicAny.DynAnyFactoryPackage.InconsistentTypeCode e) { e.printStackTrace(); return null; } DynStruct str = (DynStruct) dany; try { if(tc.kind() == TCKind.tk_struct) { DataStruct ds = new DataStruct(dany.type().id()); for(int i = 0; i < str.component_count(); i++) { ds.add(str.current_member_name(), extractAny(str.current_component().to_any())); str.next(); } return ds; } else { DataException de = new DataException(dany.type().id()); for(int i = 0; i < str.component_count(); i++) { de.add(str.current_member_name(), extractAny(str.current_component().to_any())); str.next(); } return de; } } catch (org.omg.DynamicAny.DynAnyPackage.TypeMismatch e) { e.printStackTrace(); return null; } catch (org.omg.DynamicAny.DynAnyPackage.InvalidValue e) { e.printStackTrace(); return null; } catch (org.omg.CORBA.TypeCodePackage.BadKind e) { e.printStackTrace(); return null; } } public java.lang.Object extractSequence(TypeCode tc, Any argument) { if (tc == null) throw new NullPointerException("tc"); if (argument == null) throw new NullPointerException("argument"); DynAny dany; try { dany = ra.getDynFact().create_dyn_any(argument); } catch(org.omg.DynamicAny.DynAnyFactoryPackage.InconsistentTypeCode e) { e.printStackTrace(); return null; } Class<?> cl = getClassType(argument.type()); Any[] els; if(tc.kind() == TCKind.tk_sequence) els = ((DynSequence) dany).get_elements(); else if(tc.kind() == TCKind.tk_array) els = ((DynArray) dany).get_elements(); else { return null; } java.lang.Object array = java.lang.reflect.Array.newInstance(cl.getComponentType(), els.length); java.lang.Object[] objs; if (cl.getComponentType().isPrimitive()) objs = DataFormatter.convertPrimitiveArray(array); else objs = (java.lang.Object[]) array; for(int i = 0; i < els.length; i++) { objs[i] = extractAny(els[i]); } return objs; } /** * Insert the method's description here. * Creation date: (10.11.2000 0:07:59) * @return org.omg.CORBA.Object * @param call si.ijs.acs.objectexplorer.engine.RemoteCall */ public InvocationObjectHolder extractInvocationObject(RemoteCall call) { if (call == null) throw new NullPointerException("call"); if (!(call.getSyncReturnValue() instanceof org.omg.CORBA.Object)) return new InvocationObjectHolder(null, null); org.omg.CORBA.Object retVal = (org.omg.CORBA.Object)call.getSyncReturnValue(); if (!retVal._is_a(ID_SUBSCRIPTION)) throw new IntrospectionInconsistentException("Remote call '" + call.getSN() + "' that produced an 'Invocation' returns a CORBA object, which does not implement 'Subscription' interface."); try { return new InvocationObjectHolder(retVal, ((BACIOperation)call.getOperation()).getOperationDesc().result.id()); } catch (org.omg.CORBA.TypeCodePackage.BadKind bk) { throw new RemoteException("CORBA BadKind exception thrown while analysing typecode for 'Subscription' descendant. Should be a valid IDL operation."); } } /** * Insert the method's description here. * Creation date: (3.11.2000 13:25:37) * @return java.lang.Object[] * @param req org.omg.CORBA.Request */ public java.lang.Object[] extractOuts(Request req, OperationDescription desc) { if (req == null) throw new NullPointerException("req"); if (desc == null) throw new NullPointerException("desc"); java.lang.Object[] retVal = new java.lang.Object[desc.parameters.length]; for (int i = 0; i < desc.parameters.length; i++) { if (!(desc.parameters[i].mode == ParameterMode.PARAM_IN)) { try { retVal[i] = extractAny(req.arguments().item(i).value()); } catch (Bounds be) { throw new IntrospectionInconsistentException("Request object and operation description object for operation '" + desc.name + "' declare different number of arguments to remote function."); } } else retVal[i] = null; } return retVal; } /** * Insert the method's description here. * Creation date: (7.11.2000 1:00:12) * @return java.lang.Object * @param argumentType org.omg.CORBA.TypeCode * @param argument org.omg.CORBA.Any */ public java.lang.Object extractTypedef(Any argument) { if (argument == null) throw new NullPointerException("argument"); return extractTypedef(argument.type(), argument); } /** * Insert the method's description here. * Creation date: (17.3.2001 19:36:18) * @return java.lang.String * @param fullType java.lang.String */ public static String fullTypeToType(String fullType) { if (fullType == null) throw new NullPointerException("fullType"); int index1 = fullType.lastIndexOf('/'); int index2 = fullType.lastIndexOf(':'); if (index1 == -1 || index2 == -1 || index1 > index2) throw new IntrospectionInconsistentException("Type '" + fullType + "' is not a valid IDL ID, beginning with IDL: and ending with :1.0"); return fullType.substring(index1 + 1, index2); } /** * Insert the method's description here. * Creation date: (7.11.2000 22:47:14) * @return si.ijs.acs.objectexplorer.engine.BACI.BACIAttribute[] * @param desc org.omg.CORBA.AttributeDescription[] */ public BACIAttribute[] getAttributes(BACIRemote target) { if (target == null) throw new NullPointerException("target"); AttributeDescription[] desc = target.getIFDesc().attributes; ArrayList<BACIAttribute> temp = new ArrayList<BACIAttribute>(); for (int i = 0; i < desc.length; i++) { if (isProperty(desc[i])) continue; Class<?> type = getClassType(desc[i].type); temp.add(new BACIAttribute(ra, target, desc[i], new BACIDataType(type))); } BACIAttribute[] retVal = new BACIAttribute[temp.size()]; temp.toArray(retVal); return retVal; } /** * Insert the method's description here. * Creation date: (9.11.2000 0:23:33) * @return java.lang.Object[] * @param params java.lang.Object[] * @param cb si.ijs.acs.objectexplorer.engine.RemoteResponseCallback */ public int getCallbackLocation(Operation op) { if (op == null) throw new NullPointerException("op"); DataType[] args = op.getParameterTypes(); int count = -1; for (int i = 0; i < args.length; i++) { if (alma.ACS.Callback.class.isAssignableFrom(args[i].getType())) { if (count != -1) throw new IntrospectionInconsistentException("Operation '" + op + "' declares more than one parameter that extends 'Callback'"); count = i; if (i == args.length-1 && ra.isStrict()) throw new IntrospectionInconsistentException("Operation '" + op + "' takes callback as its last parameter, but takes no 'CBDescIn' parameter."); if (ra.isStrict() && !args[i+1].equals(alma.ACS.CBDescIn.class)) throw new IntrospectionInconsistentException("Operation '" + op + "' does not take a 'CBDescIn' parameter after 'Callback' parameter."); } } return count; } /** * Insert the method's description here. * Creation date: (2.11.2000 0:44:52) */ public BACIOperation[] getOperations(BACIRemote target) { if (target == null) throw new NullPointerException("target"); OperationDescription[] operations = target.getIFDesc().operations; ArrayList<BACIOperation> tempList = new ArrayList<BACIOperation>(); for (int i = 0; i < operations.length; i++) { ra.getNotifier().reportDebug("BACIIntrospector::getOperations", "Analysing operation '" + operations[i].name + "'."); ParameterDescription[] ps = operations[i].parameters; String[] names = new String[ps.length]; //Class[] types = new Class[ps.length]; DataType[] types = new DataType[ps.length]; boolean[] mask = new boolean[ps.length]; int cb = -1; boolean unsupportedOperation = false; for (int j = 0; j < ps.length; j++) { try { names[j] = ps[j].name; types[j] = new BACIDataType(getClassType(ps[j].type)); types[j].setElement(getDef(ps[j].type)); types[j].setArrayType(getArrayType(ps[j].type)); if (isOfType(ps[j].type, ID_CALLBACK)) { if (cb != -1) throw new IntrospectionInconsistentException("Operation '" + operations[i].name + "' declares more than one callback parameter."); cb = j; if (cb == ps.length-1 && ra.isStrict()) throw new IntrospectionInconsistentException("A callback parameter for operation '" + operations[i].name + "' must be followed by a 'CBDescIn' parameter."); } if (ps[j].mode == ParameterMode.PARAM_OUT || cb == j) { mask[j] = false; } else mask[j] = true; if (cb != -1 && j == cb+1) { try { if (ID_CBDESCIN.equals(ps[j].type.id())) { mask[j] = false; } else if (ra.isStrict()) throw new IntrospectionInconsistentException("A callback parameter for opration '" + operations[i].name + "' must be followed by a 'CBDescIn' parameter."); } catch (Exception bk) { throw new RemoteException("Exception while analyzing typecode (getting typecode name raises exception). Exception: " + bk); } } } catch (Exception e) { ra.getNotifier().reportDebug("BACIIntrospector::getOperations", "Failed to analyse parameter '" + ps[j].name + "' for operation '" + operations[i].name + "'. Removing it from operation list... Exception:" + e); e.printStackTrace(); unsupportedOperation = true; break; } } if (!unsupportedOperation) tempList.add(new BACIOperation(ra, operations[i], target, names, types, mask, !(cb == -1), false)); } BACIOperation[] retVal = new BACIOperation[tempList.size()]; tempList.toArray(retVal); return retVal; } /** * Insert the method's description here. * Creation date: (1.11.2000 22:47:50) * @return java.lang.String[] * @param descs org.omg.CORBA.AttributeDescription[] */ public AttributeDescription[] getProperties(AttributeDescription[] attributes) { if (attributes == null) throw new NullPointerException("attributes"); ArrayList<AttributeDescription> tempList = new ArrayList<AttributeDescription>(); for (int i = 0; i < attributes.length; i++) { if (isProperty(attributes[i])) { tempList.add(attributes[i]); } } AttributeDescription[] retVal = new AttributeDescription[tempList.size()]; tempList.toArray(retVal); return retVal; } /** * Insert the method's description here. * Creation date: (13.11.2000 0:59:30) * @return java.lang.String * @param ID java.lang.String */ public String IDtoClassName(String ID) { if (ID == null) throw new NullPointerException("ID"); String retVal = (String)IDLtoJavaMapping.get(ID); if (retVal != null) return retVal; else { int index1 = 0; int index2 = 0; index1 = ID.indexOf(':'); index2 = ID.lastIndexOf(':'); if (index1 == index2) throw new IntrospectionInconsistentException("IDL ID '" + ID + "' is not well-formed because it contains only one ':' character"); String partial = ID.substring(index1 + 1, index2); index1 = partial.lastIndexOf('/'); index2 = partial.indexOf('/'); if (index1 == -1 || index2 == -1) throw new IntrospectionInconsistentException("IDL ID '" + ID + "' is not well-formed because it does not contain module separators '/'."); if (index1 == index2) return addIDLPackagePrefix(partial.replace('/', '.')); String lookup = "IDL:" + partial.substring(0, index1) + ":1.0"; if (index1 != index2) { // reverse order of pragma prefix final String delimiter = "."; StringTokenizer stringTokenizer = new StringTokenizer(partial.substring(0, index2), delimiter); String reversedPragma = stringTokenizer.nextToken(); while (stringTokenizer.hasMoreTokens()) reversedPragma = stringTokenizer.nextToken() + delimiter + reversedPragma; partial = reversedPragma + partial.substring(index2); } ra.getNotifier().reportDebug("BACIIntrospector::IDtoClassName", "Analysing IDL to Java mapping of type '" + ID + "'. Querying IR for parent container '" + lookup + "'."); IRObject ctd = ra.lookupId(lookup); if (ctd == null) throw new IntrospectionInconsistentException("Repository does not contain container '" + lookup + "' of child '" + ID + "'."); if (ctd.def_kind() == DefinitionKind.dk_Module) retVal = addIDLPackagePrefix(partial.replace('/', '.')); else retVal = addIDLPackagePrefix(partial.substring(0, index1).replace('/', '.') + "Package." + partial.substring(index1 + 1)); IDLtoJavaMapping.put(ID, retVal); return retVal; } } public String classNameToId(String name) { String prefix = "IDL:alma/"; String suffix = ":1.0"; String cName = name.substring(name.lastIndexOf(".")+1).replace("AcsJ",""); String module = name.substring(name.indexOf(".")+1); module = module.substring(0,module.indexOf(".")); String id = prefix + module + "/" + cName + suffix; return id; } /** * Insert the method's description here. * Creation date: (1.11.2000 21:26:59) * @return boolean * @param remote org.omg.CORBA.Object */ public boolean isDevice(org.omg.CORBA.Object remote) { if (remote == null) throw new NullPointerException("remote"); return remote._is_a(ID_DEVICE); } /** * Insert the method's description here. * Creation date: (14.11.2000 0:34:32) * @return boolean * @param operation java.lang.String */ public boolean isInvocationDestroyMethod(String operation) { if (operation == null) throw new NullPointerException("operation"); return METHOD_DESTROY.equals(operation); } /** * Insert the method's description here. * Creation date: (14.11.2000 0:34:32) * @return boolean * @param operation java.lang.String */ public boolean isInvocationDoneMethod(String operation) { if (operation == null) throw new NullPointerException("operation"); return METHOD_DONE.equals(operation); } /** * Insert the method's description here. * Creation date: (13.11.2000 18:44:35) * @return boolean * @param tc org.omg.CORBA.TypeCode * @param baciType java.lang.String */ private boolean isOfType(TypeCode tc, String type) { switch(tc.kind().value()) { case TCKind._tk_objref: break; case TCKind._tk_alias: try { return isOfType(tc.content_type(), type); } catch (org.omg.CORBA.TypeCodePackage.BadKind bk) { throw new RemoteException("Exception while analyzing typecode (getting typecode name raises exception). Exception: " + bk); } default: return false; } try { ra.getNotifier().reportDebug("BACIIntrospector::isOfType", "Checking if '" + tc.id() + "' implements '" + type + "'."); if (tc.id().equals(ID_CORBA_OBJECT)) if (type.equals(ID_CORBA_OBJECT)) return true; else return false; /* Class c = Class.forName(IDtoClassName(tc.id())); Class c1 = null; try { c1 = Class.forName(addJavaPackagePrefix(baciType)); } catch (Exception e) { throw new JavaIDLIntrospectionException("Introspection error while loading property class '" + addJavaPackagePrefix(baciType) + "'."); } if (c1.isAssignableFrom(c)) return true;*/ InterfaceDef idef = InterfaceDefHelper.narrow(ra.lookupId(tc.id())); if (idef.is_a(type)) return true; } catch (org.omg.CORBA.TypeCodePackage.BadKind bk) { throw new RemoteException("Exception while analyzing typecode (getting typecode name raises exception). Exception: " + bk); } catch (Exception e) { e.printStackTrace(); return false; } return false; } /** * Insert the method's description here. * Creation date: (7.11.2000 1:20:04) * @return boolean * @param desc org.omg.CORBA.AttributeDescription */ private boolean isProperty(AttributeDescription desc) { if (desc == null) throw new NullPointerException("desc"); if (desc.mode == AttributeMode.ATTR_NORMAL) return false; if (desc.type.kind() == TCKind.tk_objref && isOfType(desc.type, ID_PROPERTY)) { return true; } return false; } /** * Insert the method's description here. * Creation date: (3.11.2000 0:25:31) * @return java.lang.Object[] * @param desc org.omg.CORBA.OperationDescription */ public java.lang.Object[] prepareDIIparameters(OperationDescription desc, java.lang.Object[] params) { return params; } public Class<?> getClassType(TypeCode tc) { switch(tc.kind().value()) { case TCKind._tk_objref: try { return Class.forName(IDtoClassName(tc.id())); } catch(org.omg.CORBA.TypeCodePackage.BadKind e) { e.printStackTrace(); return null; } catch(java.lang.ClassNotFoundException e) { return org.omg.CORBA.Object.class; } case TCKind._tk_enum: //return String.class; return DataEnum.class; case TCKind._tk_struct: case TCKind._tk_except: //Special try { //return Class.forName(IDtoClassName(tc.id())); return Class.forName("holi"+IDtoClassName(tc.id())); } catch(org.omg.CORBA.TypeCodePackage.BadKind e) { e.printStackTrace(); return null; } catch(java.lang.ClassNotFoundException e) { //Class doesn't exist, try to create it. if(tc.kind().value() == TCKind._tk_struct) return DataStruct.class; else return DataException.class; } case TCKind._tk_sequence: case TCKind._tk_array: Class<?> content; try { content = getClassType(tc.content_type()); } catch(org.omg.CORBA.TypeCodePackage.BadKind e) { return null; } return java.lang.reflect.Array.newInstance(content, 0).getClass(); case TCKind._tk_alias: try { return getClassType(tc.content_type()); } catch(org.omg.CORBA.TypeCodePackage.BadKind e) { return null; } case TCKind._tk_void: return Void.TYPE; case TCKind._tk_short: return Short.TYPE; case TCKind._tk_long: return Integer.TYPE; case TCKind._tk_ushort: return Short.TYPE; case TCKind._tk_ulong: return Integer.TYPE; case TCKind._tk_float: return Float.TYPE; case TCKind._tk_double: return Double.TYPE; case TCKind._tk_boolean: return Boolean.TYPE; case TCKind._tk_char: case TCKind._tk_wchar: return Character.TYPE; case TCKind._tk_octet: return Byte.TYPE; case TCKind._tk_string: case TCKind._tk_wstring: return String.class; case TCKind._tk_longlong: return Long.TYPE; case TCKind._tk_ulonglong: return Long.TYPE; case TCKind._tk_union: case TCKind._tk_longdouble: case TCKind._tk_fixed: case TCKind._tk_value: case TCKind._tk_value_box: case TCKind._tk_native: case TCKind._tk_TypeCode: case TCKind._tk_Principal: case TCKind._tk_abstract_interface: case TCKind._tk_any: case TCKind._tk_null: default: throw new IllegalArgumentException("Argument typecode '" + tc.kind().value() + "' is not supported."); } } private DataElement getDef(TypeCode tc) { int value = tc.kind().value(); switch(value) { case TCKind._tk_struct: try { if(structs.search(tc.id()) != -1) return null; structs.push(tc.id()); DataElement ret = getStructDef(tc); structs.pop(); return ret; } catch (org.omg.CORBA.TypeCodePackage.BadKind e) { e.printStackTrace(); return null; } case TCKind._tk_enum: return getEnumDef(tc); case TCKind._tk_alias: case TCKind._tk_sequence: case TCKind._tk_array: try { return getDef(tc.content_type()); } catch(org.omg.CORBA.TypeCodePackage.BadKind e) { e.printStackTrace(); return null; } default: //Other types should have no Definition DataElement. //System.out.println("Definition not supported: "+value); return null; } } private DataStruct getStructDef(TypeCode tc) { if(tc.kind() != TCKind.tk_struct) return null; try { DataStruct ds = new DataStruct(tc.id()); Contained ctd = ra.lookupId(tc.id()); StructDef sd = StructDefHelper.narrow(ctd); StructMember[] mems = sd.members(); for(int i = 0; i < mems.length; i++) { DataType dt = new BACIDataType(getClassType(mems[i].type)); dt.setElement(getDef(mems[i].type)); ds.add(mems[i].name,dt); } return ds; } catch(org.omg.CORBA.TypeCodePackage.BadKind e) { e.printStackTrace(); return null; } } private DataEnum getEnumDef(TypeCode tc) { if(tc.kind() != TCKind.tk_enum) return null; try { DataEnum de = new DataEnum(tc.id()); Contained ctd = ra.lookupId(tc.id()); EnumDef ed = EnumDefHelper.narrow(ctd); String[] mems = ed.members(); for(int i = 0; i < mems.length; i++) de.add(i,mems[i]); return de; } catch(org.omg.CORBA.TypeCodePackage.BadKind e) { e.printStackTrace(); return null; } } private String getArrayType(TypeCode tc) { int value = tc.kind().value(); switch(value) { case TCKind._tk_alias: try { return getArrayType(tc.content_type()); } catch(org.omg.CORBA.TypeCodePackage.BadKind e) { e.printStackTrace(); return null; } case TCKind._tk_sequence: try { if(tc.length() == 0) return "U"; else return ("B"+tc.length()); } catch(org.omg.CORBA.TypeCodePackage.BadKind e) { e.printStackTrace(); return null; } case TCKind._tk_array: try { return ("A"+tc.length()); } catch(org.omg.CORBA.TypeCodePackage.BadKind e) { e.printStackTrace(); return null; } default: //Other types should have no array type. //System.out.println("Type not supported: "+value); return null; } } public void displayAny(Any argument) { if (argument == null) throw new NullPointerException("argument"); displayAny(argument.type(), argument); } public void displayAny(TypeCode tc, Any argument) { if (argument == null) throw new NullPointerException("argument"); switch(tc.kind().value()) { case TCKind._tk_any: displayAny(argument.extract_any()); break; case TCKind._tk_void: case TCKind._tk_null: System.out.println("NULL!!!"); break; case TCKind._tk_objref: System.out.println(argument.extract_Object()); break; case TCKind._tk_struct: case TCKind._tk_except: System.out.println("Struct!!!"); displayTypedef(tc,argument); break; case TCKind._tk_alias: try { displayAny(tc.content_type(),argument); } catch(org.omg.CORBA.TypeCodePackage.BadKind e) { e.printStackTrace(); } break; case TCKind._tk_enum: DynEnum en; try { en = (DynEnum) ra.getDynFact().create_dyn_any(argument); System.out.println(en.get_as_string()); } catch(org.omg.DynamicAny.DynAnyFactoryPackage.InconsistentTypeCode e) { e.printStackTrace(); } break; case TCKind._tk_sequence: case TCKind._tk_array: System.out.println("Sequence!!!"); displaySequence(tc,argument); break; case TCKind._tk_double: System.out.println(new Double(argument.extract_double())); break; case TCKind._tk_float: System.out.println(new Float(argument.extract_float())); break; case TCKind._tk_octet: //return new Byte(argument.extract_octet()); // use short to get unsigned value System.out.println(new Short((short)(argument.extract_octet() & 0xFF))); break; case TCKind._tk_longlong: System.out.println(new Long(argument.extract_longlong())); break; case TCKind._tk_ulonglong: System.out.println(new Long(argument.extract_ulonglong())); break; case TCKind._tk_long: System.out.println(new Integer(argument.extract_long())); break; case TCKind._tk_ulong: System.out.println(new Integer(argument.extract_ulong())); break; case TCKind._tk_short: System.out.println(new Short(argument.extract_short())); break; case TCKind._tk_ushort: System.out.println(new Short(argument.extract_ushort())); break; case TCKind._tk_string: System.out.println(argument.extract_string()); break; case TCKind._tk_char: System.out.println(new Character(argument.extract_char())); break; case TCKind._tk_boolean: System.out.println(new Boolean(argument.extract_boolean())); break; default: throw new IllegalArgumentException("Argument typecode '" + argument.type().kind().value() + "' is not supported."); } } public void displayTypedef(TypeCode tc, Any argument) { if (argument == null) throw new NullPointerException("argument"); if (tc == null) throw new NullPointerException("tc"); DynAny dany = null; try { dany = ra.getDynFact().create_dyn_any(argument); } catch(org.omg.DynamicAny.DynAnyFactoryPackage.InconsistentTypeCode e) { e.printStackTrace(); } DynStruct str = (DynStruct) dany; try { if(tc.kind() == TCKind.tk_struct) { for(int i = 0; i < str.component_count(); i++) { displayAny(str.current_component().to_any()); str.next(); } } else { for(int i = 0; i < str.component_count(); i++) { displayAny(str.current_component().to_any()); str.next(); } } } catch (org.omg.DynamicAny.DynAnyPackage.TypeMismatch e) { e.printStackTrace(); } } public void displaySequence(TypeCode tc, Any argument) { if (tc == null) throw new NullPointerException("tc"); if (argument == null) throw new NullPointerException("argument"); DynAny dany = null; try { dany = ra.getDynFact().create_dyn_any(argument); } catch(org.omg.DynamicAny.DynAnyFactoryPackage.InconsistentTypeCode e) { e.printStackTrace(); } //Class<?> cl = getClassType(argument.type()); Any[] els; if(tc.kind() == TCKind.tk_sequence) els = ((DynSequence) dany).get_elements(); else if(tc.kind() == TCKind.tk_array) els = ((DynArray) dany).get_elements(); else els = new Any[0]; for(int i = 0; i < els.length; i++) { displayAny(els[i]); } } }