📄 valuehandlerimpl.java
字号:
out.write_octet_array(array, 0, length); } else if (type == Long.TYPE) { long[] array = (long[])((Object)obj); length = array.length; out.write_ulong(length); out.write_longlong_array(array, 0, length); } else if (type == Float.TYPE) { float[] array = (float[])((Object)obj); length = array.length; out.write_ulong(length); out.write_float_array(array, 0, length); } else if (type == Double.TYPE) { double[] array = (double[])((Object)obj); length = array.length; out.write_ulong(length); out.write_double_array(array, 0, length); } else if (type == Short.TYPE) { short[] array = (short[])((Object)obj); length = array.length; out.write_ulong(length); out.write_short_array(array, 0, length); } else if (type == Character.TYPE) { char[] array = (char[])((Object)obj); length = array.length; out.write_ulong(length); writeCharArray(out, array, 0, length); } else if (type == Boolean.TYPE) { boolean[] array = (boolean[])((Object)obj); length = array.length; out.write_ulong(length); out.write_boolean_array(array, 0, length); } else { throw new Error("Invalid primitive type : " + obj.getClass().getName()); } } else if (type == java.lang.Object.class) { Object[] array = (Object[])((Object)obj); length = array.length; out.write_ulong(length); for (i = 0; i < length; i++) { Util.writeAny(out, array[i]); } } else { Object[] array = (Object[])((Object)obj); length = array.length; out.write_ulong(length); int callType = kValueType; if (type.isInterface()) { String className = type.getName(); if (java.rmi.Remote.class.isAssignableFrom(type)) { // RMI Object reference... callType = kRemoteType; } else if (org.omg.CORBA.Object.class.isAssignableFrom(type)){ // IDL Object reference... callType = kRemoteType; } else if (RepositoryId.isAbstractBase(type)) { // IDL Abstract Object reference... callType = kAbstractType; } else if (ObjectStreamClassCorbaExt.isAbstractInterface(type)) { callType = kAbstractType; } } for (i = 0; i < length; i++) { switch (callType) { case kRemoteType: Util.writeRemoteObject(out, array[i]); break; case kAbstractType: Util.writeAbstractObject(out,array[i]); break; case kValueType: try{ out.write_value((java.io.Serializable)array[i]); } catch(ClassCastException cce){ if (array[i] instanceof java.io.Serializable) throw cce; else { Utility.throwNotSerializableForCorba(array[i].getClass().getName()); } } break; } } } } /** * Encapsulates reading of Java char arrays so that the 1.3 subclass * can override it without exposing internals across packages. This * is a fix for bug 4367783. */ protected void readCharArray(org.omg.CORBA_2_3.portable.InputStream in, char[] array, int offset, int length) { in.read_wchar_array(array, offset, length); } private java.lang.Object read_Array(IIOPInputStream bridge, org.omg.CORBA_2_3.portable.InputStream in, Class sequence, com.sun.org.omg.SendingContext.CodeBase sender, int offset) { try { // Read length of coming array int length = in.read_ulong(); int i; Class type = null; if (sequence == null) { for (i = 0; i < length; i++) in.read_value(); return null; } type = sequence.getComponentType(); if (type.isPrimitive()) { if (type == Integer.TYPE) { int[] array = new int[length]; in.read_long_array(array, 0, length); return ((java.io.Serializable)((Object)array)); } else if (type == Byte.TYPE) { byte[] array = new byte[length]; in.read_octet_array(array, 0, length); return ((java.io.Serializable)((Object)array)); } else if (type == Long.TYPE) { long[] array = new long[length]; in.read_longlong_array(array, 0, length); return ((java.io.Serializable)((Object)array)); } else if (type == Float.TYPE) { float[] array = new float[length]; in.read_float_array(array, 0, length); return ((java.io.Serializable)((Object)array)); } else if (type == Double.TYPE) { double[] array = new double[length]; in.read_double_array(array, 0, length); return ((java.io.Serializable)((Object)array)); } else if (type == Short.TYPE) { short[] array = new short[length]; in.read_short_array(array, 0, length); return ((java.io.Serializable)((Object)array)); } else if (type == Character.TYPE) { char[] array = new char[length]; readCharArray(in, array, 0, length); return ((java.io.Serializable)((Object)array)); } else if (type == Boolean.TYPE) { boolean[] array = new boolean[length]; in.read_boolean_array(array, 0, length); return ((java.io.Serializable)((Object)array)); } else { throw new Error("Invalid primitive type : " + sequence.getName()); } } else if (type == java.lang.Object.class) { Object[] array = (Object[])java.lang.reflect.Array.newInstance(type, length); // Store this object and its beginning position // since there might be indirections to it while // it's been unmarshalled. bridge.activeRecursionMgr.addObject(offset, array); for (i = 0; i < length; i++) { Object objectValue = null; try { objectValue = Util.readAny(in); } catch(IndirectionException cdrie) { try { // The CDR stream had never seen the given offset before, // so check the recursion manager (it will throw an // IOException if it doesn't have a reference, either). objectValue = bridge.activeRecursionMgr.getObject(cdrie.offset); } catch (IOException ie) { // Translate to a MARSHAL exception since // ValueHandlers aren't allowed to throw // IOExceptions throw new MARSHAL("Invalid indirection to offset " + cdrie.offset, MinorCodes.INVALID_INDIRECTION, CompletionStatus.COMPLETED_NO); } } array[i] = objectValue; } return ((java.io.Serializable)((Object)array)); } else { Object[] array = (Object[])java.lang.reflect.Array.newInstance(type, length); // Store this object and its beginning position // since there might be indirections to it while // it's been unmarshalled. bridge.activeRecursionMgr.addObject(offset, array); // Decide what method call to make based on the type. If // it is a type for which we need to load a stub, convert // the type to the correct stub type. int callType = kValueType; boolean narrow = false; if (type.isInterface()) { boolean loadStubClass = false; // String className = type.getName(); if (java.rmi.Remote.class.isAssignableFrom(type)) { // RMI Object reference... // className = Utility.stubName(className); callType = kRemoteType; // for better performance, load the stub class once // instead of for each element of the array loadStubClass = true; } else if (org.omg.CORBA.Object.class.isAssignableFrom(type)){ // IDL Object reference... // className = Utility.idlStubName(className); callType = kRemoteType; loadStubClass = true; } else if (RepositoryId.isAbstractBase(type)) { // IDL Abstract Object reference... // className = Utility.idlStubName(className); callType = kAbstractType; loadStubClass = true; } else if (ObjectStreamClassCorbaExt.isAbstractInterface(type)) { // RMI Abstract Object reference... // type = null; callType = kAbstractType; } if (loadStubClass) { try { String codebase = Util.getCodebase(type); String repID = RepositoryId.createForAnyType(type); type = Utility.loadStubClass(repID, codebase, type); //d11638 } catch (ClassNotFoundException e) { narrow = true; } } else { narrow = true; } } for (i = 0; i < length; i++) { try { switch (callType) { case kRemoteType: if (!narrow) array[i] = (Object)in.read_Object(type); else { array[i] = Utility.readObjectAndNarrow(in, type); } break; case kAbstractType: if (!narrow) array[i] = (Object)in.read_abstract_interface(type); else { array[i] = Utility.readAbstractAndNarrow(in, type); } break; case kValueType: array[i] = (Object)in.read_value(type); break; } } catch(IndirectionException cdrie) { // The CDR stream had never seen the given offset before, // so check the recursion manager (it will throw an // IOException if it doesn't have a reference, either). try { array[i] = bridge.activeRecursionMgr.getObject(cdrie.offset); } catch (IOException ioe) { // Translate to a MARSHAL exception since // ValueHandlers aren't allowed to throw // IOExceptions throw new MARSHAL("Invalid indirection to offset " + cdrie.offset, MinorCodes.INVALID_INDIRECTION, CompletionStatus.COMPLETED_NO); } } } return ((java.io.Serializable)((Object)array)); } } finally { // We've completed deserializing this object. Any // future indirections will be handled correctly at the // CDR level. The ActiveRecursionManager only deals with // objects currently being deserialized. bridge.activeRecursionMgr.removeObject(offset); } } private boolean isArray(String repId){ return RepositoryId.cache.getId(repId).isSequence(); } protected String getOutputStreamClassName() { return "com.sun.corba.se.internal.io.IIOPOutputStream"; } private com.sun.corba.se.internal.io.IIOPOutputStream createOutputStream() { return (com.sun.corba.se.internal.io.IIOPOutputStream)AccessController.doPrivileged(new StreamFactory(getOutputStreamClassName())); } protected String getInputStreamClassName() { return "com.sun.corba.se.internal.io.IIOPInputStream"; } private com.sun.corba.se.internal.io.IIOPInputStream createInputStream() { return (com.sun.corba.se.internal.io.IIOPInputStream)AccessController.doPrivileged(new StreamFactory(getInputStreamClassName())); } /** * Instantiates a class of the given name using the system ClassLoader * as part of a PrivilegedAction. * * It's private final so hopefully people can't grab it outside of * this class. * * If you're worried that someone could subclass ValueHandlerImpl, * install his own streams, and snoop what's on the wire: * Someone can do that only if he's allowed to use the feature * of installing his own javax.rmi.CORBA.Util delegate (via a * JVM property or orb.properties file, read the first time the * Util class is used). If he can do that, he can snoop * anything on the wire, anyway, without abusing the * StreamFactory class. */ private static final class StreamFactory implements PrivilegedAction { private String className; public StreamFactory (String _className) { className = _className; } public Object run() { try { // Note: We must use the system ClassLoader here // since we want to load classes outside of the // core JDK when running J2EE Pure ORB and // talking to Kestrel. ClassLoader cl = Thread.currentThread().getContextClassLoader(); if (cl == null) cl = ClassLoader.getSystemClassLoader(); Class streamClass = cl.loadClass(className); // Since the ClassLoader should cache the class, this isn't // as expensive as it looks. return streamClass.newInstance(); } catch(Throwable t) { throw new InternalError("Error loading " + className + ": " + t.getClass().getName() + ": " + t.getMessage()); } } } /** * Our JDK 1.3 and JDK 1.3.1 behavior subclasses override this. * The correct behavior is for a Java char to map to a CORBA wchar, * but our older code mapped it to a CORBA char. */ protected TCKind getJavaCharTCKind() { return TCKind.tk_wchar; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -