# HG changeset patch # User lana # Date 1289371702 28800 # Node ID fa3579325f8ba5e5a2516753f480168114cc58ea # Parent a3eb55dde85a5017a29a9dd66649e81b2f586eb8# Parent acac1ff40f589cf342ccbae852cfcbc0d1b8096a Merge diff -r a3eb55dde85a -r fa3579325f8b corba/make/com/sun/corba/minclude/com_sun_corba_se_impl_io.jmk --- a/corba/make/com/sun/corba/minclude/com_sun_corba_se_impl_io.jmk Thu Nov 04 15:54:15 2010 -0700 +++ b/corba/make/com/sun/corba/minclude/com_sun_corba_se_impl_io.jmk Tue Nov 09 22:48:22 2010 -0800 @@ -34,7 +34,7 @@ com/sun/corba/se/impl/io/ObjectStreamField.java \ com/sun/corba/se/impl/io/OptionalDataException.java \ com/sun/corba/se/impl/io/ValueHandlerImpl.java \ - com/sun/corba/se/impl/io/IIOPInputStream.java \ + com/sun/corba/se/impl/io/IIOPInputStream.java \ com/sun/corba/se/impl/io/IIOPOutputStream.java \ com/sun/corba/se/impl/io/TypeMismatchException.java \ com/sun/corba/se/impl/io/InputStreamHook.java \ diff -r a3eb55dde85a -r fa3579325f8b corba/src/share/classes/com/sun/corba/se/impl/io/IIOPInputStream.java --- a/corba/src/share/classes/com/sun/corba/se/impl/io/IIOPInputStream.java Thu Nov 04 15:54:15 2010 -0700 +++ b/corba/src/share/classes/com/sun/corba/se/impl/io/IIOPInputStream.java Tue Nov 09 22:48:22 2010 -0800 @@ -2553,8 +2553,8 @@ bridge.putObject( o, key, v ) ; } catch (Exception e) { throw utilWrapper.errorSetObjectField( e, fieldName, - ObjectUtility.compactObjectToString( o ), - ObjectUtility.compactObjectToString( v )) ; + o.toString(), + v.toString() ) ; } } @@ -2566,7 +2566,7 @@ bridge.putBoolean( o, key, v ) ; } catch (Exception e) { throw utilWrapper.errorSetBooleanField( e, fieldName, - ObjectUtility.compactObjectToString( o ), + o.toString(), new Boolean(v) ) ; } } @@ -2579,7 +2579,7 @@ bridge.putByte( o, key, v ) ; } catch (Exception e) { throw utilWrapper.errorSetByteField( e, fieldName, - ObjectUtility.compactObjectToString( o ), + o.toString(), new Byte(v) ) ; } } @@ -2592,7 +2592,7 @@ bridge.putChar( o, key, v ) ; } catch (Exception e) { throw utilWrapper.errorSetCharField( e, fieldName, - ObjectUtility.compactObjectToString( o ), + o.toString(), new Character(v) ) ; } } @@ -2605,7 +2605,7 @@ bridge.putShort( o, key, v ) ; } catch (Exception e) { throw utilWrapper.errorSetShortField( e, fieldName, - ObjectUtility.compactObjectToString( o ), + o.toString(), new Short(v) ) ; } } @@ -2618,7 +2618,7 @@ bridge.putInt( o, key, v ) ; } catch (Exception e) { throw utilWrapper.errorSetIntField( e, fieldName, - ObjectUtility.compactObjectToString( o ), + o.toString(), new Integer(v) ) ; } } @@ -2631,7 +2631,7 @@ bridge.putLong( o, key, v ) ; } catch (Exception e) { throw utilWrapper.errorSetLongField( e, fieldName, - ObjectUtility.compactObjectToString( o ), + o.toString(), new Long(v) ) ; } } @@ -2644,7 +2644,7 @@ bridge.putFloat( o, key, v ) ; } catch (Exception e) { throw utilWrapper.errorSetFloatField( e, fieldName, - ObjectUtility.compactObjectToString( o ), + o.toString(), new Float(v) ) ; } } @@ -2657,7 +2657,7 @@ bridge.putDouble( o, key, v ) ; } catch (Exception e) { throw utilWrapper.errorSetDoubleField( e, fieldName, - ObjectUtility.compactObjectToString( o ), + o.toString(), new Double(v) ) ; } } diff -r a3eb55dde85a -r fa3579325f8b corba/src/share/classes/com/sun/corba/se/impl/io/ValueHandlerImpl.java --- a/corba/src/share/classes/com/sun/corba/se/impl/io/ValueHandlerImpl.java Thu Nov 04 15:54:15 2010 -0700 +++ b/corba/src/share/classes/com/sun/corba/se/impl/io/ValueHandlerImpl.java Tue Nov 09 22:48:22 2010 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -32,32 +32,22 @@ package com.sun.corba.se.impl.io; import javax.rmi.CORBA.Util; -import javax.rmi.PortableRemoteObject; import java.util.Hashtable; -import java.util.Stack; import java.io.IOException; -import java.util.EmptyStackException; -import com.sun.corba.se.impl.util.Utility; -import com.sun.corba.se.impl.io.IIOPInputStream; -import com.sun.corba.se.impl.io.IIOPOutputStream; import com.sun.corba.se.impl.util.RepositoryId; import com.sun.corba.se.impl.util.Utility; import org.omg.CORBA.TCKind; -import org.omg.CORBA.MARSHAL; -import org.omg.CORBA.BAD_PARAM; -import org.omg.CORBA.CompletionStatus; import org.omg.CORBA.portable.IndirectionException; import com.sun.org.omg.SendingContext.CodeBase; import com.sun.org.omg.SendingContext.CodeBaseHelper; import java.security.AccessController; import java.security.PrivilegedAction; - -import com.sun.corba.se.impl.io.IIOPInputStream.ActiveRecursionManager; +import java.security.PrivilegedExceptionAction; import com.sun.corba.se.spi.logging.CORBALogDomains; import com.sun.corba.se.impl.logging.OMGSystemException; @@ -809,65 +799,163 @@ return "com.sun.corba.se.impl.io.IIOPOutputStream"; } - private com.sun.corba.se.impl.io.IIOPOutputStream createOutputStream() { - return (com.sun.corba.se.impl.io.IIOPOutputStream)AccessController.doPrivileged( - new StreamFactory(getOutputStreamClassName())); + private IIOPOutputStream createOutputStream() { + final String name = getOutputStreamClassName(); + try { + IIOPOutputStream stream = createOutputStreamBuiltIn(name); + if (stream != null) { + return stream; + } + return createCustom(IIOPOutputStream.class, name); + } catch (Throwable t) { + // Throw exception under the carpet. + InternalError ie = new InternalError( + "Error loading " + name + ); + ie.initCause(t); + throw ie; + } + } + + /** + * Construct a built in implementation with priveleges. + * Returning null indicates a non-built is specified. + */ + private IIOPOutputStream createOutputStreamBuiltIn( + final String name + ) throws Throwable { + try { + return AccessController.doPrivileged( + new PrivilegedExceptionAction() { + public IIOPOutputStream run() throws IOException { + return createOutputStreamBuiltInNoPriv(name); + } + } + ); + } catch (java.security.PrivilegedActionException exc) { + throw exc.getCause(); + } + } + + /** + * Returning null indicates a non-built is specified. + */ + private IIOPOutputStream createOutputStreamBuiltInNoPriv( + final String name + ) throws IOException { + return + name.equals( + IIOPOutputStream + .class.getName() + ) ? + new IIOPOutputStream() : + + name.equals( + com.sun.corba.se.impl.orbutil.IIOPOutputStream_1_3 + .class.getName() + ) ? + new com.sun.corba.se.impl.orbutil.IIOPOutputStream_1_3() : + + name.equals( + com.sun.corba.se.impl.orbutil.IIOPOutputStream_1_3_1 + .class.getName() + ) ? + new com.sun.corba.se.impl.orbutil.IIOPOutputStream_1_3_1() : + + null; } protected String getInputStreamClassName() { return "com.sun.corba.se.impl.io.IIOPInputStream"; } - private com.sun.corba.se.impl.io.IIOPInputStream createInputStream() { - return (com.sun.corba.se.impl.io.IIOPInputStream)AccessController.doPrivileged( - new StreamFactory(getInputStreamClassName())); + private IIOPInputStream createInputStream() { + final String name = getInputStreamClassName(); + try { + IIOPInputStream stream = createInputStreamBuiltIn(name); + if (stream != null) { + return stream; + } + return createCustom(IIOPInputStream.class, name); + } catch (Throwable t) { + // Throw exception under the carpet. + InternalError ie = new InternalError( + "Error loading " + name + ); + ie.initCause(t); + throw ie; + } } /** - * 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. + * Construct a built in implementation with priveleges. + * Returning null indicates a non-built is specified. */ - private static final class StreamFactory implements PrivilegedAction { - private String className; - - public StreamFactory (String _className) { - className = _className; - } + private IIOPInputStream createInputStreamBuiltIn( + final String name + ) throws Throwable { + try { + return AccessController.doPrivileged( + new PrivilegedExceptionAction() { + public IIOPInputStream run() throws IOException { + return createInputStreamBuiltInNoPriv(name); + } + } + ); + } catch (java.security.PrivilegedActionException exc) { + throw exc.getCause(); + } + } - 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. + /** + * Returning null indicates a non-built is specified. + */ + private IIOPInputStream createInputStreamBuiltInNoPriv( + final String name + ) throws IOException { + return + name.equals( + IIOPInputStream + .class.getName() + ) ? + new IIOPInputStream() : + + name.equals( + com.sun.corba.se.impl.orbutil.IIOPInputStream_1_3 + .class.getName() + ) ? + new com.sun.corba.se.impl.orbutil.IIOPInputStream_1_3() : + + name.equals( + com.sun.corba.se.impl.orbutil.IIOPInputStream_1_3_1 + .class.getName() + ) ? + new com.sun.corba.se.impl.orbutil.IIOPInputStream_1_3_1() : + + null; + } + + /** + * Create a custom implementation without privileges. + */ + private T createCustom( + final Class type, final String className + ) throws Throwable { + // Note: We use the thread context or 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); + Class clazz = cl.loadClass(className); + Class streamClass = clazz.asSubclass(type); // Since the ClassLoader should cache the class, this isn't // as expensive as it looks. return streamClass.newInstance(); - } catch(Throwable t) { - InternalError ie = new InternalError( "Error loading " + className ) ; - ie.initCause( t ) ; - throw ie ; - } - } } /** diff -r a3eb55dde85a -r fa3579325f8b corba/src/share/classes/com/sun/corba/se/impl/orb/PrefixParserAction.java --- a/corba/src/share/classes/com/sun/corba/se/impl/orb/PrefixParserAction.java Thu Nov 04 15:54:15 2010 -0700 +++ b/corba/src/share/classes/com/sun/corba/se/impl/orb/PrefixParserAction.java Tue Nov 09 22:48:22 2010 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -110,7 +110,7 @@ throw wrapper.couldNotSetArray( thr, getPropertyName(), new Integer(ctr), componentType, new Integer(size), - ObjectUtility.compactObjectToString( obj )) ; + obj.toString() ) ; } ctr++ ; } diff -r a3eb55dde85a -r fa3579325f8b corba/src/share/classes/com/sun/corba/se/impl/orbutil/ObjectUtility.java --- a/corba/src/share/classes/com/sun/corba/se/impl/orbutil/ObjectUtility.java Thu Nov 04 15:54:15 2010 -0700 +++ b/corba/src/share/classes/com/sun/corba/se/impl/orbutil/ObjectUtility.java Tue Nov 09 22:48:22 2010 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -50,103 +50,8 @@ import java.math.BigDecimal ; public final class ObjectUtility { - private boolean useToString ; - private boolean isIndenting ; - private int initialLevel ; - private int increment ; - private ClassMap classToPrinter = new ClassMap() ; - - private static ObjectUtility standard = new ObjectUtility( false, true, - 0, 4 ) ; - private static ObjectUtility compact = new ObjectUtility( true, false, - 0, 4 ) ; - - private ObjectUtility( boolean useToString, boolean isIndenting, - int initialLevel, int increment ) - { - this.useToString = useToString ; - this.isIndenting = isIndenting ; - this.initialLevel = initialLevel ; - this.increment = increment ; - classToPrinter.put( Properties.class, propertiesPrinter ) ; - classToPrinter.put( Collection.class, collectionPrinter ) ; - classToPrinter.put( Map.class, mapPrinter ) ; - } - - /** Construct an Utility instance with the desired objectToString - * behavior. - */ - public static ObjectUtility make( boolean useToString, boolean isIndenting, - int initialLevel, int increment ) - { - return new ObjectUtility( useToString, isIndenting, initialLevel, - increment ) ; - } - - /** Construct an Utility instance with the desired objectToString - * behavior. - */ - public static ObjectUtility make( boolean useToString, boolean isIndenting ) - { - return new ObjectUtility( useToString, isIndenting, 0, 4 ) ; - } - - /** Get the standard Utility object that supports objectToString with - * indented display and no use of toString() methods. - */ - public static ObjectUtility make() - { - return standard ; - } + private ObjectUtility() {} - /** A convenience method that gives the default behavior: use indenting - * to display the object's structure and do not use built-in toString - * methods. - */ - public static String defaultObjectToString( java.lang.Object object ) - { - return standard.objectToString( object ) ; - } - - public static String compactObjectToString( java.lang.Object object ) - { - return compact.objectToString( object ) ; - } - - /** objectToString handles display of arbitrary objects. It correctly - * handles objects whose elements form an arbitrary graph. It uses - * reflection to display the contents of any kind of object. - * An object's toString() method may optionally be used, but the default - * is to ignore all toString() methods except for those defined for - * primitive types, primitive type wrappers, and strings. - */ - public String objectToString(java.lang.Object obj) - { - IdentityHashMap printed = new IdentityHashMap() ; - ObjectWriter result = ObjectWriter.make( isIndenting, initialLevel, - increment ) ; - objectToStringHelper( printed, result, obj ) ; - return result.toString() ; - } - - // Perform a deep structural equality comparison of the two objects. - // This handles all arrays, maps, and sets specially, otherwise - // it just calls the object's equals() method. - public static boolean equals( java.lang.Object obj1, java.lang.Object obj2 ) - { - // Set of pairs of objects that have been (or are being) considered for - // equality. Such pairs are presumed to be equals. If they are not, - // this will be detected eventually and the equals method will return - // false. - Set considered = new HashSet() ; - - // Map that gives the corresponding component of obj2 for a component - // of obj1. This is used to check for the same aliasing and use of - // equal objects in both objects. - Map counterpart = new IdentityHashMap() ; - - return equalsHelper( counterpart, considered, obj1, obj2 ) ; - } /** If arr1 and arr2 are both arrays of the same component type, * return an array of that component type that consists of the @@ -179,544 +84,4 @@ return result ; } -//=========================================================================== -// Implementation -//=========================================================================== - - private void objectToStringHelper( IdentityHashMap printed, - ObjectWriter result, java.lang.Object obj) - { - if (obj==null) { - result.append( "null" ) ; - result.endElement() ; - } else { - Class cls = obj.getClass() ; - result.startObject( obj ) ; - - if (printed.keySet().contains( obj )) { - result.endObject( "*VISITED*" ) ; - } else { - printed.put( obj, null ) ; - - if (mustUseToString(cls)) { - result.endObject( obj.toString() ) ; - } else { - // First, handle any classes that have special printer - // methods defined. This is useful when the class - // overrides toString with something that - // is not sufficiently detailed. - ObjectPrinter printer = (ObjectPrinter)(classToPrinter.get( - cls )) ; - if (printer != null) { - printer.print( printed, result, obj ) ; - result.endObject() ; - } else { - Class compClass = cls.getComponentType() ; - - if (compClass == null) - // handleObject always calls endObject - handleObject( printed, result, obj ) ; - else { - handleArray( printed, result, obj ) ; - result.endObject() ; - } - } - } - } - } - } - - private static interface ObjectPrinter { - void print( IdentityHashMap printed, ObjectWriter buff, - java.lang.Object obj ) ; - } - - private ObjectPrinter propertiesPrinter = new ObjectPrinter() { - public void print( IdentityHashMap printed, ObjectWriter buff, - java.lang.Object obj ) - { - if (!(obj instanceof Properties)) - throw new Error() ; - - Properties props = (Properties)obj ; - Enumeration keys = props.propertyNames() ; - while (keys.hasMoreElements()) { - String key = (String)(keys.nextElement()) ; - String value = props.getProperty( key ) ; - buff.startElement() ; - buff.append( key ) ; - buff.append( "=" ) ; - buff.append( value ) ; - buff.endElement() ; - } - } - } ; - - private ObjectPrinter collectionPrinter = new ObjectPrinter() { - public void print( IdentityHashMap printed, ObjectWriter buff, - java.lang.Object obj ) - { - if (!(obj instanceof Collection)) - throw new Error() ; - - Collection coll = (Collection)obj ; - Iterator iter = coll.iterator() ; - while (iter.hasNext()) { - java.lang.Object element = iter.next() ; - buff.startElement() ; - objectToStringHelper( printed, buff, element ) ; - buff.endElement() ; - } - } - } ; - - private ObjectPrinter mapPrinter = new ObjectPrinter() { - public void print( IdentityHashMap printed, ObjectWriter buff, - java.lang.Object obj ) - { - if (!(obj instanceof Map)) - throw new Error() ; - - Map map = (Map)obj ; - Iterator iter = map.entrySet().iterator() ; - while (iter.hasNext()) { - Entry entry = (Entry)(iter.next()) ; - buff.startElement() ; - objectToStringHelper( printed, buff, entry.getKey() ) ; - buff.append( "=>" ) ; - objectToStringHelper( printed, buff, entry.getValue() ) ; - buff.endElement() ; - } - } - } ; - - private static class ClassMap { - ArrayList data ; - - public ClassMap() - { - data = new ArrayList() ; - } - - /** Return the first element of the ClassMap that is assignable to cls. - * The order is determined by the order in which the put method was - * called. Returns null if there is no match. - */ - public java.lang.Object get( Class cls ) - { - Iterator iter = data.iterator() ; - while (iter.hasNext()) { - java.lang.Object[] arr = (java.lang.Object[])(iter.next()) ; - Class key = (Class)(arr[0]) ; - if (key.isAssignableFrom( cls )) - return arr[1] ; - } - - return null ; - } - - /** Add obj to the map with key cls. Note that order matters, - * as the first match is returned. - */ - public void put( Class cls, java.lang.Object obj ) - { - java.lang.Object[] pair = { cls, obj } ; - data.add( pair ) ; - } - } - - private boolean mustUseToString( Class cls ) - { - // These probably never occur - if (cls.isPrimitive()) - return true ; - - // We must use toString for all primitive wrappers, since - // otherwise the code recurses endlessly (access value field - // inside Integer, returns another Integer through reflection). - if ((cls == Integer.class) || - (cls == BigInteger.class) || - (cls == BigDecimal.class) || - (cls == String.class) || - (cls == StringBuffer.class) || - (cls == Long.class) || - (cls == Short.class) || - (cls == Byte.class) || - (cls == Character.class) || - (cls == Float.class) || - (cls == Double.class) || - (cls == Boolean.class)) - return true ; - - if (useToString) { - try { - cls.getDeclaredMethod( "toString", (Class[])null ) ; - return true ; - } catch (Exception exc) { - return false ; - } - } - - return false ; - } - - private void handleObject( IdentityHashMap printed, ObjectWriter result, - java.lang.Object obj ) - { - Class cls = obj.getClass() ; - - try { - Field[] fields; - SecurityManager security = System.getSecurityManager(); - if (security != null && !Modifier.isPublic(cls.getModifiers())) { - fields = new Field[0]; - } else { - fields = cls.getDeclaredFields(); - } - - for (int ctr=0; ctr: " + this); } if (selectionKey.isAcceptable()) { - AccessController.doPrivileged(new PrivilegedAction() { - public java.lang.Object run() { accept(); - return null; - } - }); } else { if (orb.transportDebugFlag) { dprint(".doWork: ! selectionKey.isAcceptable: " + this); diff -r a3eb55dde85a -r fa3579325f8b corba/src/share/classes/com/sun/corba/se/spi/orb/OperationFactory.java --- a/corba/src/share/classes/com/sun/corba/se/spi/orb/OperationFactory.java Thu Nov 04 15:54:15 2010 -0700 +++ b/corba/src/share/classes/com/sun/corba/se/spi/orb/OperationFactory.java Tue Nov 09 22:48:22 2010 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,6 +25,7 @@ package com.sun.corba.se.spi.orb ; import java.util.StringTokenizer ; +import java.util.Arrays ; import java.lang.reflect.Array ; @@ -446,7 +447,7 @@ public String toString() { return "sequenceAction(separator=\"" + sep + "\",actions=" + - ObjectUtility.compactObjectToString(actions) + ")" ; + Arrays.toString(actions) + ")" ; } } @@ -533,7 +534,7 @@ public String toString() { return "mapSequenceAction(" + - ObjectUtility.compactObjectToString(op) + ")" ; + Arrays.toString(op) + ")" ; } } diff -r a3eb55dde85a -r fa3579325f8b corba/src/share/classes/com/sun/corba/se/spi/orb/ParserImplBase.java --- a/corba/src/share/classes/com/sun/corba/se/spi/orb/ParserImplBase.java Thu Nov 04 15:54:15 2010 -0700 +++ b/corba/src/share/classes/com/sun/corba/se/spi/orb/ParserImplBase.java Tue Nov 09 22:48:22 2010 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -125,7 +125,7 @@ // Since exc wraps the actual exception, use exc.getCause() // instead of exc. throw wrapper.errorSettingField( exc.getCause(), name, - ObjectUtility.compactObjectToString(value) ) ; + value.toString() ) ; } }