private void writeValueBase(org.omg.CORBA.portable.ValueBase object, Class clazz) { // _REVISIT_ could check to see whether chunking really needed mustChunk = true; // Write value_tag int indirection = writeValueTag(true, true, Util.getCodebase(clazz)); // Get rep id String repId = ((ValueBase)object)._truncatable_ids()[0]; // Write rep id write_repositoryId(repId); // Add indirection for object to indirection table updateIndirectionTable(indirection, object, object); // Write Value chunk start_block(); end_flag--; chunkedValueNestingLevel--; writeIDLValue(object, repId); end_block(); // Write end tag writeEndTag(true); }
private java.lang.Object readIDLValue(int indirection, String repId, Class clazz, String codebase) { ValueFactory factory ; // Always try to find a ValueFactory first, as required by the spec. // There are some complications here in the IDL 3.0 mapping (see 1.13.8), // but basically we must always be able to override the DefaultFactory // or Helper mappings that are also used. This appears to be the case // even in the boxed value cases. The original code only did the lookup // in the case of class implementing either StreamableValue or CustomValue, // but abstract valuetypes only implement ValueBase, and really require // the use of the repId to find a factory (including the DefaultFactory). try { // use new-style OBV support (factory object) factory = Utility.getFactory(clazz, codebase, orb, repId); } catch (MARSHAL marshal) { // XXX log marshal at one of the INFO levels // Could not get a factory, so try alternatives if (!StreamableValue.class.isAssignableFrom(clazz) && !CustomValue.class.isAssignableFrom(clazz) && ValueBase.class.isAssignableFrom(clazz)) { // use old-style OBV support (helper object) BoxedValueHelper helper = Utility.getHelper(clazz, codebase, repId); if (helper instanceof ValueHelper) return readIDLValueWithHelper((ValueHelper)helper, indirection); else return helper.read_value(parent); } else { // must be a boxed IDLEntity, so make a reflective call to the // helper's static read method... return readBoxedIDLEntity(clazz, codebase); } } // If there was no error in getting the factory, use it. valueIndirection = indirection; // for callback return factory.read_value(parent); }
public static boolean isAbstractBase(Class clazz) { return (clazz.isInterface() && IDLEntity.class.isAssignableFrom(clazz) && (!ValueBase.class.isAssignableFrom(clazz)) && (!org.omg.CORBA.Object.class.isAssignableFrom(clazz))); }
/** * Writes an abstract interface to the stream. An abstract interface can be * eithe CORBA object or value type and is written as a union with the boolean * discriminator (false for objects, true for value types). * * The object from value is separated by fact that all values implement the * {@link ValueBase} interface. Also, the passed parameter is treated as value * it it does not implement CORBA Object. * * @param an_interface an abstract interface to write. */ public void write_abstract_interface(java.lang.Object an_interface) { boolean isObject = !(an_interface instanceof ValueBase) && an_interface instanceof org.omg.CORBA.Object; write_boolean(isObject); if (isObject) write_Object((org.omg.CORBA.Object) an_interface); else write_value((Serializable) an_interface); }
/** * Convert the class name to IDL or RMI name (repository id). If the class * inherits from IDLEntity, ValueBase or SystemException, returns repository * Id in the IDL:(..) form. If it does not, returns repository Id in the * RMI:(..) form. * * @param cx the class for that the name must be computed. * * @return the idl or rmi name. */ public static synchronized String getRepositoryId(Class cx) { String name = (String) m_names.get(cx); if (name != null) return name; String cn = cx.getName(); if (!(IDLEntity.class.isAssignableFrom(cx) || ValueBase.class.isAssignableFrom(cx) || SystemException.class.isAssignableFrom(cx))) { // Not an IDL entity. name = Util.createValueHandler().getRMIRepositoryID(cx); } else { if (cn.startsWith(JAVA_PREFIX)) cn = OMG_PREFIX + cn.substring(JAVA_PREFIX.length()).replace('.', '/'); else if (cn.startsWith(CLASSPATH_PREFIX)) cn = OMG_PREFIX + cn.substring(CLASSPATH_PREFIX.length()).replace('.', '/'); name = "IDL:" + cn + ":1.0"; } m_names.put(cx, name); return name; }