FileDocCategorySizeDatePackage
ValueUtility.javaAPI DocJava SE 5 API16023Fri Aug 26 14:54:22 BST 2005com.sun.corba.se.impl.io

ValueUtility

public class ValueUtility extends Object
Holds utility methods for converting from ObjectStreamClass to FullValueDescription and generating typecodes from ObjectStreamClass.

(Omit source code)

Fields Summary
public static final short
PRIVATE_MEMBER
public static final short
PUBLIC_MEMBER
private static final String[]
primitiveConstants
Constructors Summary
Methods Summary
public static org.omg.CORBA.TypeCodecreateTypeCodeForClass(org.omg.CORBA.ORB orb, java.lang.Class c, javax.rmi.CORBA.ValueHandler vh)

        // Maps classes to repositoryIDs strings. This is used to detect recursive types.
        IdentityKeyValueStack createdIDs = new IdentityKeyValueStack();
        // Stores all types created for resolving indirect types at the end. 
        TypeCode tc = createTypeCodeForClassInternal(orb, c, vh, createdIDs);
        return tc;
    
private static org.omg.CORBA.TypeCodecreateTypeCodeForClassInternal(org.omg.CORBA.ORB orb, java.lang.Class c, javax.rmi.CORBA.ValueHandler vh, com.sun.corba.se.impl.io.ValueUtility$IdentityKeyValueStack createdIDs)

        // This wrapper method is the protection against infinite recursion.
        TypeCode tc = null;
        String id = (String)createdIDs.get(c);
        if (id != null) {
            return orb.create_recursive_tc(id);
        } else {
            id = vh.getRMIRepositoryID(c);
            if (id == null) id = "";
            // cache the rep id BEFORE creating a new typecode.
            // so that recursive tc can look up the rep id.
            createdIDs.push(c, id);
            tc = createTypeCodeInternal(orb, c, vh, id, createdIDs);
            createdIDs.pop();
            return tc;
        }
    
private static org.omg.CORBA.TypeCodecreateTypeCodeInternal(org.omg.CORBA.ORB orb, java.lang.Class c, javax.rmi.CORBA.ValueHandler vh, java.lang.String id, com.sun.corba.se.impl.io.ValueUtility$IdentityKeyValueStack createdIDs)

        if ( c.isArray() ) {
	    // Arrays - may recurse for multi-dimensional arrays
	    Class componentClass = c.getComponentType();
	    TypeCode embeddedType;
	    if ( componentClass.isPrimitive() ){
		embeddedType 
                    = ValueUtility.getPrimitiveTypeCodeForClass(orb, 
                                                                componentClass,
                                                                vh);
	    } else {
		embeddedType = createTypeCodeForClassInternal(orb, componentClass, vh,
                                                              createdIDs);
	    }
	    TypeCode t = orb.create_sequence_tc (0, embeddedType);
	    return orb.create_value_box_tc (id, "Sequence", t);
	} else if ( c == java.lang.String.class ) {
	    // Strings
	    TypeCode t = orb.create_string_tc (0);
	    return orb.create_value_box_tc (id, "StringValue", t);
	} else if (java.rmi.Remote.class.isAssignableFrom(c)) {
	    return orb.get_primitive_tc(TCKind.tk_objref);
	} else if (org.omg.CORBA.Object.class.isAssignableFrom(c)) {
	    return orb.get_primitive_tc(TCKind.tk_objref);
	} 
		
	// Anything else

        ObjectStreamClass osc = ObjectStreamClass.lookup(c);

        if (osc == null) {
            return orb.create_value_box_tc (id, "Value", orb.get_primitive_tc (TCKind.tk_value));
        }

        // type modifier
        // REVISIT truncatable and abstract?
        short modifier = (osc.isCustomMarshaled() ? org.omg.CORBA.VM_CUSTOM.value : org.omg.CORBA.VM_NONE.value);

        // concrete base
        TypeCode base = null;
        Class superClass = c.getSuperclass();
        if (superClass != null && java.io.Serializable.class.isAssignableFrom(superClass)) {
            base = createTypeCodeForClassInternal(orb, superClass, vh, createdIDs);
        }

        // members
        ValueMember[] members = translateMembers (orb, osc, vh, createdIDs);

        return orb.create_value_tc(id, c.getName(), modifier, base, members);
    
private static booleanexists(java.lang.String str, java.lang.String[] strs)

	for (int i = 0; i < strs.length; i++)
	    if (str.equals(strs[i]))
		return true;
		
	return false;
    
public static org.omg.CORBA.TypeCodegetPrimitiveTypeCodeForClass(org.omg.CORBA.ORB orb, java.lang.Class c, javax.rmi.CORBA.ValueHandler vh)

		
	if (c == Integer.TYPE) {
	    return orb.get_primitive_tc (TCKind.tk_long);
	} else if (c == Byte.TYPE) {
	    return orb.get_primitive_tc (TCKind.tk_octet);
	} else if (c == Long.TYPE) {
	    return orb.get_primitive_tc (TCKind.tk_longlong);
	} else if (c == Float.TYPE) {
	    return orb.get_primitive_tc (TCKind.tk_float);
	} else if (c == Double.TYPE) {
	    return orb.get_primitive_tc (TCKind.tk_double);
	} else if (c == Short.TYPE) {
	    return orb.get_primitive_tc (TCKind.tk_short);
	} else if (c == Character.TYPE) {
            return orb.get_primitive_tc (((ValueHandlerImpl)vh).getJavaCharTCKind());
	} else if (c == Boolean.TYPE) {
	    return orb.get_primitive_tc (TCKind.tk_boolean);
	} else {
	    // _REVISIT_ Not sure if this is right.
	    return orb.get_primitive_tc (TCKind.tk_any);
	}
    
public static java.lang.StringgetSignature(org.omg.CORBA.ValueMember member)


        
	  

        // REVISIT.  Can the type be something that is
        // non-primitive yet not a value_box, value, or objref?
        // If so, should use ObjectStreamClass or throw
        // exception.

	if (member.type.kind().value() == TCKind._tk_value_box ||
            member.type.kind().value() == TCKind._tk_value ||
            member.type.kind().value() == TCKind._tk_objref) {
	    Class c = RepositoryId.cache.getId(member.id).getClassFromType();
            return ObjectStreamClass.getSignature(c);

	} else {

	    return primitiveConstants[member.type.kind().value()];
	}
		
    
public static booleanisAssignableFrom(java.lang.String clzRepositoryId, com.sun.org.omg.CORBA.ValueDefPackage.FullValueDescription type, com.sun.org.omg.SendingContext.CodeBase sender)

		
	if (exists(clzRepositoryId, type.supported_interfaces))
	    return true;

	if (clzRepositoryId.equals(type.id))
	    return true;
		
	if ((type.base_value != null) &&
	    (!type.base_value.equals(""))) {
	    FullValueDescription parent = sender.meta(type.base_value);
			
	    return isAssignableFrom(clzRepositoryId, parent, sender);
	}

	return false;

    
public static com.sun.org.omg.CORBA.ValueDefPackage.FullValueDescriptiontranslate(org.omg.CORBA.ORB orb, ObjectStreamClass osc, javax.rmi.CORBA.ValueHandler vh)

		
	// Create FullValueDescription
	FullValueDescription result = new FullValueDescription();
	Class className = osc.forClass();

        ValueHandlerImpl vhandler = (com.sun.corba.se.impl.io.ValueHandlerImpl) vh;
        String repId = vhandler.createForAnyType(className);

	// Set FVD name
	result.name = vhandler.getUnqualifiedName(repId);
        if (result.name == null)
            result.name = "";

	// Set FVD id _REVISIT_ : Manglings
	result.id = vhandler.getRMIRepositoryID(className);
        if (result.id == null)
            result.id = "";

	// Set FVD is_abstract
	result.is_abstract = ObjectStreamClassCorbaExt.isAbstractInterface(className);
		
	// Set FVD is_custom
	result.is_custom = osc.hasWriteObject() || osc.isExternalizable();

	// Set FVD defined_in _REVISIT_ : Manglings
	result.defined_in = vhandler.getDefinedInId(repId);
        if (result.defined_in == null)
            result.defined_in = "";

	// Set FVD version 
	result.version = vhandler.getSerialVersionUID(repId);
        if (result.version == null)
            result.version = "";

	// Skip FVD operations - N/A
	result.operations = new OperationDescription[0];

	// Skip FVD attributed - N/A
	result.attributes = new AttributeDescription[0];

	// Set FVD members
        // Maps classes to repositoryIDs strings. This is used to detect recursive types.
        IdentityKeyValueStack createdIDs = new IdentityKeyValueStack();
        // Stores all types created for resolving indirect types at the end. 
	result.members = translateMembers(orb, osc, vh, createdIDs);
		
	// Skip FVD initializers - N/A
	result.initializers = new Initializer[0];
		
	Class interfaces[] = osc.forClass().getInterfaces();
	int abstractCount = 0;

	// Skip FVD supported_interfaces
	result.supported_interfaces =  new String[interfaces.length];
	for (int interfaceIndex = 0; interfaceIndex < interfaces.length;
	     interfaceIndex++) {
	    result.supported_interfaces[interfaceIndex] =
		vhandler.createForAnyType(interfaces[interfaceIndex]);
			
	    if ((!(java.rmi.Remote.class.isAssignableFrom(interfaces[interfaceIndex]))) ||
		(!Modifier.isPublic(interfaces[interfaceIndex].getModifiers())))
		abstractCount++;
	}
		
	// Skip FVD abstract_base_values - N/A
	result.abstract_base_values = new String[abstractCount];
	for (int interfaceIndex = 0; interfaceIndex < interfaces.length;
	     interfaceIndex++) {
	    if ((!(java.rmi.Remote.class.isAssignableFrom(interfaces[interfaceIndex]))) ||
		(!Modifier.isPublic(interfaces[interfaceIndex].getModifiers())))
		result.abstract_base_values[interfaceIndex] =
		    vhandler.createForAnyType(interfaces[interfaceIndex]);
		
	}
		
	result.is_truncatable = false;
		
	// Set FVD base_value
	Class superClass = osc.forClass().getSuperclass();
	if (java.io.Serializable.class.isAssignableFrom(superClass))
	    result.base_value = vhandler.getRMIRepositoryID(superClass);
	else 
	    result.base_value = "";
		
	// Set FVD type
	//result.type = createTypeCodeForClass(orb, osc.forClass());
	result.type = orb.get_primitive_tc(TCKind.tk_value); //11638

	return result;
		
    
private static org.omg.CORBA.ValueMember[]translateMembers(org.omg.CORBA.ORB orb, ObjectStreamClass osc, javax.rmi.CORBA.ValueHandler vh, com.sun.corba.se.impl.io.ValueUtility$IdentityKeyValueStack createdIDs)

        ValueHandlerImpl vhandler = (com.sun.corba.se.impl.io.ValueHandlerImpl) vh;
	ObjectStreamField fields[] = osc.getFields();
	int fieldsLength = fields.length;
	ValueMember[] members = new ValueMember[fieldsLength];
	// Note : fields come out of ObjectStreamClass in correct order for
	// writing.  So, we will create the same order in the members array.
	for (int i = 0; i < fieldsLength; i++) {
	    String valRepId = vhandler.getRMIRepositoryID(fields[i].getClazz());
	    members[i] = new ValueMember();
	    members[i].name = fields[i].getName();
	    members[i].id = valRepId; // _REVISIT_ : Manglings
	    members[i].defined_in = vhandler.getDefinedInId(valRepId);// _REVISIT_ : Manglings
	    members[i].version = "1.0";
	    members[i].type_def = new _IDLTypeStub(); // _REVISIT_ : IDLType implementation missing 

            if (fields[i].getField() == null) {
                // When using serialPersistentFields, the class may
                // no longer have an actual Field that corresponds
                // to one of the items.  The Java to IDL spec
                // ptc-00-01-06 1.3.5.6 says that the IDL field
                // should be private in this case.
                members[i].access = PRIVATE_MEMBER;
            } else {
                int m = fields[i].getField().getModifiers();
                if (Modifier.isPublic(m))
                    members[i].access = PUBLIC_MEMBER;
                else
                    members[i].access = PRIVATE_MEMBER;
            }

	    switch (fields[i].getTypeCode()) {
	    case 'B":
		members[i].type = orb.get_primitive_tc(TCKind.tk_octet); //11638
		break;
	    case 'C":
		members[i].type 
                    = orb.get_primitive_tc(vhandler.getJavaCharTCKind()); // 11638
		break;
	    case 'F":
		members[i].type = orb.get_primitive_tc(TCKind.tk_float); //11638
		break;
	    case 'D" :
		members[i].type = orb.get_primitive_tc(TCKind.tk_double); //11638
		break;
	    case 'I":
		members[i].type = orb.get_primitive_tc(TCKind.tk_long); //11638
		break;
	    case 'J":
		members[i].type = orb.get_primitive_tc(TCKind.tk_longlong); //11638
		break;
	    case 'S":
		members[i].type = orb.get_primitive_tc(TCKind.tk_short); //11638
		break;
	    case 'Z":
		members[i].type = orb.get_primitive_tc(TCKind.tk_boolean); //11638
		break;
        // case '[':
        //	members[i].type = orb.get_primitive_tc(TCKind.tk_value_box); //11638
        //	members[i].id = RepositoryId.createForAnyType(fields[i].getType());
        //	break;
	    default:
		members[i].type = createTypeCodeForClassInternal(orb, fields[i].getClazz(), vhandler,
                                  createdIDs);
		members[i].id = vhandler.createForAnyType(fields[i].getType());
		break;
	    } // end switch

	} // end for loop

	return members;