# HG changeset patch # User coffeys # Date 1340827826 -3600 # Node ID 338ae0f483718a1bea8cbea2448bca3781faf4c1 # Parent a9a2abaa9333646ffec3f1e757e30dadb1275497 6893617: JDK 6 CNCtx always uses the default ORB Reviewed-by: lancea diff -r a9a2abaa9333 -r 338ae0f48371 jdk/src/share/classes/com/sun/jndi/cosnaming/CNCtx.java --- a/jdk/src/share/classes/com/sun/jndi/cosnaming/CNCtx.java Wed Jun 27 00:09:30 2012 -0700 +++ b/jdk/src/share/classes/com/sun/jndi/cosnaming/CNCtx.java Wed Jun 27 21:10:26 2012 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2012, 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 @@ -58,8 +58,22 @@ private final static boolean debug = false; + /* + * Implement one shared ORB among all CNCtx. However, there is a public constructor + * accepting an ORB, so we need the option of using a given ORB. + */ + private static ORB _defaultOrb; ORB _orb; // used by ExceptionMapper and RMI/IIOP factory public NamingContext _nc; // public for accessing underlying NamingContext + + private synchronized static ORB getDefaultOrb() { + if (_defaultOrb == null) { + _defaultOrb = CorbaUtils.getOrb(null, -1, + new Hashtable<String, java.lang.Object>()); + } + return _defaultOrb; + } + private NameComponent[] _name = null; Hashtable<String, java.lang.Object> _env; // used by ExceptionMapper @@ -114,8 +128,9 @@ // rest is the INS name // Return the parsed form to prevent subsequent lookup // from parsing the string as a composite name - // The caller should be aware that a toString() of the name - // will yield its INS syntax, rather than a composite syntax + // The caller should be aware that a toString() of the name, + // which came from the environment will yield its INS syntax, + // rather than a composite syntax return new ResolveResult(ctx, parser.parse(rest)); } @@ -135,10 +150,10 @@ if (orb == null || nctx == null) throw new ConfigurationException( "Must supply ORB or NamingContext"); - _orb = orb; - orbTracker = tracker; - if (orbTracker != null) { - orbTracker.incRefCount(); + if (orb != null) { + _orb = orb; + } else { + _orb = getDefaultOrb(); } _nc = nctx; _env = env; @@ -212,10 +227,13 @@ org.omg.CORBA.ORB inOrb = null; String ncIor = null; - if (env != null) { + if (inOrb == null && env != null) { inOrb = (org.omg.CORBA.ORB) env.get("java.naming.corba.orb"); } + if (inOrb == null) + inOrb = getDefaultOrb(); // will create a default ORB if none exists + // Extract PROVIDER_URL from environment String provUrl = null; if (env != null) { @@ -226,13 +244,6 @@ // Initialize the root naming context by using the IOR supplied // in the PROVIDER_URL ncIor = getStringifiedIor(provUrl); - - if (inOrb == null) { - - // no ORB instance specified; create one using env and defaults - inOrb = CorbaUtils.getOrb(null, -1, env); - orbTracker = new OrbReuseTracker(inOrb); - } setOrbAndRootContext(inOrb, ncIor); } else if (provUrl != null) { // Initialize the root naming context by using the URL supplied @@ -258,14 +269,8 @@ } } else { // No PROVIDER_URL supplied; initialize using defaults - if (inOrb == null) { - - // No ORB instance specified; create one using env and defaults - inOrb = CorbaUtils.getOrb(null, -1, env); - orbTracker = new OrbReuseTracker(inOrb); - if (debug) { - System.err.println("Getting default ORB: " + inOrb + env); - } + if (debug) { + System.err.println("Getting default ORB: " + inOrb + env); } setOrbAndRootContext(inOrb, (String)null); } @@ -286,6 +291,10 @@ */ private String initUsingIiopUrl(ORB defOrb, String url, Hashtable<?,?> env) throws NamingException { + + if (defOrb == null) + defOrb = getDefaultOrb(); + try { IiopUrl parsedUrl = new IiopUrl(url); @@ -294,19 +303,17 @@ for (IiopUrl.Address addr : parsedUrl.getAddresses()) { try { - if (defOrb != null) { - try { - String tmpUrl = "corbaloc:iiop:" + addr.host - + ":" + addr.port + "/NameService"; - if (debug) { - System.err.println("Using url: " + tmpUrl); - } - org.omg.CORBA.Object rootCtx = - defOrb.string_to_object(tmpUrl); - setOrbAndRootContext(defOrb, rootCtx); - return parsedUrl.getStringName(); - } catch (Exception e) {} // keep going - } + try { + String tmpUrl = "corbaloc:iiop:" + addr.host + + ":" + addr.port + "/NameService"; + if (debug) { + System.err.println("Using url: " + tmpUrl); + } + org.omg.CORBA.Object rootCtx = + defOrb.string_to_object(tmpUrl); + setOrbAndRootContext(defOrb, rootCtx); + return parsedUrl.getStringName(); + } catch (Exception e) {} // keep going // Get ORB if (debug) { @@ -314,12 +321,8 @@ + " and port " + addr.port); } - // Get ORB - ORB orb = CorbaUtils.getOrb(addr.host, addr.port, env); - orbTracker = new OrbReuseTracker(orb); - // Assign to fields - setOrbAndRootContext(orb, (String)null); + setOrbAndRootContext(defOrb, (String)null); return parsedUrl.getStringName(); } catch (NamingException ne) { @@ -341,18 +344,16 @@ */ private String initUsingCorbanameUrl(ORB orb, String url, Hashtable<?,?> env) throws NamingException { + + if (orb == null) + orb = getDefaultOrb(); + try { CorbanameUrl parsedUrl = new CorbanameUrl(url); String corbaloc = parsedUrl.getLocation(); String cosName = parsedUrl.getStringName(); - if (orb == null) { - - // No ORB instance specified; create one using env and defaults - orb = CorbaUtils.getOrb(null, -1, env); - orbTracker = new OrbReuseTracker(orb); - } setOrbAndRootContext(orb, corbaloc); return parsedUrl.getStringName(); @@ -1117,9 +1118,6 @@ } synchronized public void incEnumCount() { - if (orbTracker == null) { - return; - } enumCount++; if (debug) { System.out.println("incEnumCount, new count:" + enumCount); @@ -1128,9 +1126,6 @@ synchronized public void decEnumCount() throws NamingException { - if (orbTracker == null) { - return; - } enumCount--; if (debug) { System.out.println("decEnumCount, new count:" + enumCount + @@ -1142,14 +1137,15 @@ } synchronized public void close() throws NamingException { - if (orbTracker == null) { - return; - } + if (enumCount > 0) { isCloseCalled = true; return; } - orbTracker.decRefCount(); + + // Never destroy an orb in CNCtx. + // The orb we have is either the shared/default orb, or one passed in to a constructor + // from elsewhere, so that orb is somebody else's reponsibility. } protected void finalize() {