# HG changeset patch # User prappo # Date 1405335040 -3600 # Mon Jul 14 11:50:40 2014 +0100 # Node ID 55c5a26d871073dcf9d42b139d1b7b300c8fcde5 # Parent 9febf9dbc0a4b15323f2dbd29931cfbf086332b4 8048175: Remove redundant use of reflection on core classes from JNDI Reviewed-by: duke diff --git a/src/share/classes/com/sun/jndi/cosnaming/RemoteToCorba.java b/src/share/classes/com/sun/jndi/cosnaming/RemoteToCorba.java --- a/src/share/classes/com/sun/jndi/cosnaming/RemoteToCorba.java +++ b/src/share/classes/com/sun/jndi/cosnaming/RemoteToCorba.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2014, 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 @@ -71,17 +71,10 @@ if (orig instanceof Remote) { // Turn remote object into org.omg.CORBA.Object - try { - // Returns null if JRMP; let next factory try - // CNCtx will eventually throw IllegalArgumentException if - // no CORBA object gotten - return - CorbaUtils.remoteToCorba((Remote)orig, ((CNCtx)ctx)._orb); - } catch (ClassNotFoundException e) { - // RMI-IIOP library not available - throw new ConfigurationException( - "javax.rmi packages not available"); - } + // Returns null if JRMP; let next factory try + // CNCtx will eventually throw IllegalArgumentException if + // no CORBA object gotten + return CorbaUtils.remoteToCorba((Remote)orig, ((CNCtx)ctx)._orb); } return null; // pass and let next state factory try } diff --git a/src/share/classes/com/sun/jndi/ldap/ClientId.java b/src/share/classes/com/sun/jndi/ldap/ClientId.java --- a/src/share/classes/com/sun/jndi/ldap/ClientId.java +++ b/src/share/classes/com/sun/jndi/ldap/ClientId.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2014, 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 @@ -86,9 +86,8 @@ try { Class socketFactoryClass = Obj.helper.loadClass(socketFactory); - Class objClass = Class.forName("java.lang.Object"); this.sockComparator = socketFactoryClass.getMethod( - "compare", new Class[]{objClass, objClass}); + "compare", new Class[]{Object.class, Object.class}); Method getDefault = socketFactoryClass.getMethod( "getDefault", new Class[]{}); this.factory = diff --git a/src/share/classes/com/sun/jndi/ldap/Connection.java b/src/share/classes/com/sun/jndi/ldap/Connection.java --- a/src/share/classes/com/sun/jndi/ldap/Connection.java +++ b/src/share/classes/com/sun/jndi/ldap/Connection.java @@ -31,6 +31,7 @@ import java.io.IOException; import java.io.OutputStream; import java.io.InputStream; +import java.net.InetSocketAddress; import java.net.Socket; import javax.net.ssl.SSLSocket; @@ -42,11 +43,10 @@ import javax.naming.ldap.Control; import java.lang.reflect.Method; -import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.util.Arrays; import sun.misc.IOUtils; -//import javax.net.SocketFactory; +import javax.net.SocketFactory; /** * A thread that creates a connection to an LDAP server. @@ -219,9 +219,7 @@ ce.setRootCause(realException); throw ce; } catch (Exception e) { - // Class.forName() seems to do more error checking - // and will throw IllegalArgumentException and such. - // That's why we need to have a catch all here and + // We need to have a catch all here and // ignore generic exceptions. // Also catches all IO errors generated by socket creation. CommunicationException ce = @@ -238,27 +236,8 @@ /* * Create an InetSocketAddress using the specified hostname and port number. */ - private Object createInetSocketAddress(String host, int port) - throws NoSuchMethodException { - - try { - Class inetSocketAddressClass = - Class.forName("java.net.InetSocketAddress"); - - Constructor inetSocketAddressCons = - inetSocketAddressClass.getConstructor(new Class[]{ - String.class, int.class}); - - return inetSocketAddressCons.newInstance(new Object[]{ - host, new Integer(port)}); - - } catch (ClassNotFoundException | - InstantiationException | - InvocationTargetException | - IllegalAccessException e) { - throw new NoSuchMethodException(); - - } + private InetSocketAddress createInetSocketAddress(String host, int port) { + return new InetSocketAddress(host, port); } /* @@ -279,82 +258,57 @@ // create the factory - Class socketFactoryClass = Obj.helper.loadClass(socketFactory); + Class socketFactoryClass = + (Class) Obj.helper.loadClass + (socketFactory); Method getDefault = socketFactoryClass.getMethod("getDefault", new Class[]{}); - Object factory = getDefault.invoke(null, new Object[]{}); + SocketFactory factory = (SocketFactory) getDefault.invoke(null, new Object[]{}); // create the socket - Method createSocket = null; - if (connectTimeout > 0) { - try { - createSocket = socketFactoryClass.getMethod("createSocket", - new Class[]{}); + InetSocketAddress endpoint = + createInetSocketAddress(host, port); - Method connect = Socket.class.getMethod("connect", - new Class[]{Class.forName("java.net.SocketAddress"), - int.class}); - Object endpoint = createInetSocketAddress(host, port); + // unconnected socket + socket = factory.createSocket(); - // unconnected socket - socket = - (Socket)createSocket.invoke(factory, new Object[]{}); + if (debug) { + System.err.println("Connection: creating socket with " + + "a timeout using supplied socket factory"); + } - if (debug) { - System.err.println("Connection: creating socket with " + - "a timeout using supplied socket factory"); - } - - // connected socket - connect.invoke(socket, new Object[]{ - endpoint, new Integer(connectTimeout)}); - - } catch (NoSuchMethodException e) { - // continue (but ignore connectTimeout) - } + // connected socket + socket.connect(endpoint, connectTimeout); } + // continue (but ignore connectTimeout) if (socket == null) { - createSocket = socketFactoryClass.getMethod("createSocket", - new Class[]{String.class, int.class}); - if (debug) { System.err.println("Connection: creating socket using " + "supplied socket factory"); } // connected socket - socket = (Socket) createSocket.invoke(factory, - new Object[]{host, new Integer(port)}); + socket = factory.createSocket(host, port); } } else { if (connectTimeout > 0) { - try { - Constructor socketCons = - Socket.class.getConstructor(new Class[]{}); + InetSocketAddress endpoint = createInetSocketAddress(host, port); - Method connect = Socket.class.getMethod("connect", - new Class[]{Class.forName("java.net.SocketAddress"), - int.class}); - Object endpoint = createInetSocketAddress(host, port); - - socket = socketCons.newInstance(new Object[]{}); + socket = new Socket(); if (debug) { System.err.println("Connection: creating socket with " + "a timeout"); } - connect.invoke(socket, new Object[]{ - endpoint, new Integer(connectTimeout)}); + socket.connect(endpoint, connectTimeout); + } - } catch (NoSuchMethodException e) { - // continue (but ignore connectTimeout) - } - } + // continue (but ignore connectTimeout) if (socket == null) { if (debug) { diff --git a/src/share/classes/com/sun/jndi/ldap/VersionHelper.java b/src/share/classes/com/sun/jndi/ldap/VersionHelper.java --- a/src/share/classes/com/sun/jndi/ldap/VersionHelper.java +++ b/src/share/classes/com/sun/jndi/ldap/VersionHelper.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2014, 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 @@ -30,32 +30,10 @@ abstract class VersionHelper { - private static VersionHelper helper = null; + private static final VersionHelper helper = new VersionHelper12(); VersionHelper() {} // Disallow anyone from creating one of these. - static { - try { - Class.forName("java.net.URLClassLoader"); // 1.2 test - Class.forName("java.security.PrivilegedAction"); // 1.2 test - helper = (VersionHelper) - Class.forName( - "com.sun.jndi.ldap.VersionHelper12").newInstance(); - } catch (Exception e) { - } - - // Use 1.1 helper if 1.2 test fails, or if we cannot create 1.2 helper - if (helper == null) { - try { - helper = (VersionHelper) - Class.forName( - "com.sun.jndi.ldap.VersionHelper11").newInstance(); - } catch (Exception e) { - // should never happen - } - } - } - static VersionHelper getVersionHelper() { return helper; } diff --git a/src/share/classes/com/sun/jndi/toolkit/corba/CorbaUtils.java b/src/share/classes/com/sun/jndi/toolkit/corba/CorbaUtils.java --- a/src/share/classes/com/sun/jndi/toolkit/corba/CorbaUtils.java +++ b/src/share/classes/com/sun/jndi/toolkit/corba/CorbaUtils.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2014, 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 @@ -30,6 +30,7 @@ import java.lang.reflect.Method; import java.lang.reflect.InvocationTargetException; +import java.rmi.RemoteException; import java.util.Hashtable; import java.util.Properties; import java.util.Enumeration; @@ -38,6 +39,8 @@ import javax.naming.Context; import javax.naming.ConfigurationException; +import javax.rmi.CORBA.Stub; +import javax.rmi.PortableRemoteObject; /** * Contains utilities for performing CORBA-related tasks: @@ -76,71 +79,43 @@ * @param orb The non-null ORB to connect the remote object to * @return The CORBA Object for remoteObj; null if remoteObj * is a JRMP implementation or JRMP stub. - * @exception ClassNotFoundException The RMI-IIOP package is not available * @exception ConfigurationException The CORBA Object cannot be obtained * because of configuration problems. */ public static org.omg.CORBA.Object remoteToCorba(Remote remoteObj, ORB orb) - throws ClassNotFoundException, ConfigurationException { - synchronized (CorbaUtils.class) { - if (toStubMethod == null) { - initMethodHandles(); - } - } + throws ConfigurationException { // First, get remoteObj's stub // javax.rmi.CORBA.Stub stub = PortableRemoteObject.toStub(remoteObj); - java.lang.Object stub; + Remote stub; try { - stub = toStubMethod.invoke(null, new java.lang.Object[]{remoteObj}); - - } catch (InvocationTargetException e) { - Throwable realException = e.getTargetException(); - // realException.printStackTrace(); - + stub = PortableRemoteObject.toStub(remoteObj); + } catch (Throwable t) { ConfigurationException ce = new ConfigurationException( "Problem with PortableRemoteObject.toStub(); object not exported or stub not found"); - ce.setRootCause(realException); - throw ce; - - } catch (IllegalAccessException e) { - ConfigurationException ce = new ConfigurationException( - "Cannot invoke javax.rmi.PortableRemoteObject.toStub(java.rmi.Remote)"); - - ce.setRootCause(e); + ce.setRootCause(t); throw ce; } // Next, make sure that the stub is javax.rmi.CORBA.Stub - if (!corbaStubClass.isInstance(stub)) { + if (!(stub instanceof Stub)) { return null; // JRMP implementation or JRMP stub } // Next, make sure that the stub is connected - // Invoke stub.connect(orb) try { - connectMethod.invoke(stub, new java.lang.Object[]{orb}); - - } catch (InvocationTargetException e) { - Throwable realException = e.getTargetException(); - // realException.printStackTrace(); - - if (!(realException instanceof java.rmi.RemoteException)) { - ConfigurationException ce = new ConfigurationException( - "Problem invoking javax.rmi.CORBA.Stub.connect()"); - ce.setRootCause(realException); - throw ce; - } + ((Stub) stub).connect(orb); + } catch (RemoteException e) { // ignore RemoteException because stub might have already // been connected - } catch (IllegalAccessException e) { + } catch (Throwable t) { ConfigurationException ce = new ConfigurationException( - "Cannot invoke javax.rmi.CORBA.Stub.connect()"); - ce.setRootCause(e); + "Problem invoking javax.rmi.CORBA.Stub.connect()"); + ce.setRootCause(t); throw ce; } // Finally, return stub @@ -235,40 +210,4 @@ throw new AssertionError(iae); } } - - // Fields used for reflection of RMI-IIOP - private static Method toStubMethod = null; - private static Method connectMethod = null; - private static Class corbaStubClass = null; - /** - * Initializes reflection method handles for RMI-IIOP. - * @exception ClassNotFoundException javax.rmi.CORBA.* not available - */ - private static void initMethodHandles() throws ClassNotFoundException { - // Get javax.rmi.CORBA.Stub class - corbaStubClass = Class.forName("javax.rmi.CORBA.Stub"); - - // Get javax.rmi.CORBA.Stub.connect(org.omg.CORBA.ORB) method - - try { - connectMethod = corbaStubClass.getMethod("connect", - new Class[] {org.omg.CORBA.ORB.class}); - } catch (NoSuchMethodException e) { - throw new IllegalStateException( - "No method definition for javax.rmi.CORBA.Stub.connect(org.omg.CORBA.ORB)"); - } - - // Get javax.rmi.PortableRemoteObject class - Class proClass = Class.forName("javax.rmi.PortableRemoteObject"); - - // Get javax.rmi.PortableRemoteObject.toStub(java.rmi.Remote) method - try { - toStubMethod = proClass.getMethod("toStub", - new Class[] {java.rmi.Remote.class}); - - } catch (NoSuchMethodException e) { - throw new IllegalStateException( -"No method definition for javax.rmi.PortableRemoteObject.toStub(java.rmi.Remote)"); - } - } }