src/share/classes/com/sun/corba/se/impl/encoding/CachedCodeBase.java

Wed, 27 Apr 2016 01:21:28 +0800

author
aoqi
date
Wed, 27 Apr 2016 01:21:28 +0800
changeset 0
7ef37b2cdcad
child 748
6845b95cba6b
permissions
-rw-r--r--

Initial load
http://hg.openjdk.java.net/jdk8u/jdk8u/corba/
changeset: 765:f46df0af2ca8
tag: jdk8u25-b17

     1 /*
     2  * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.  Oracle designates this
     8  * particular file as subject to the "Classpath" exception as provided
     9  * by Oracle in the LICENSE file that accompanied this code.
    10  *
    11  * This code is distributed in the hope that it will be useful, but WITHOUT
    12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    14  * version 2 for more details (a copy is included in the LICENSE file that
    15  * accompanied this code).
    16  *
    17  * You should have received a copy of the GNU General Public License version
    18  * 2 along with this work; if not, write to the Free Software Foundation,
    19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    20  *
    21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    22  * or visit www.oracle.com if you need additional information or have any
    23  * questions.
    24  */
    25 package com.sun.corba.se.impl.encoding;
    27 import java.util.Hashtable;
    28 import com.sun.org.omg.CORBA.ValueDefPackage.FullValueDescription;
    29 import com.sun.org.omg.SendingContext.CodeBase;
    30 import com.sun.org.omg.SendingContext.CodeBaseHelper;
    31 import com.sun.org.omg.SendingContext._CodeBaseImplBase;
    32 import com.sun.org.omg.SendingContext._CodeBaseStub;
    33 import com.sun.corba.se.spi.transport.CorbaConnection;
    34 import com.sun.corba.se.spi.ior.IOR;
    35 import com.sun.corba.se.spi.orb.ORB;
    36 /**
    37  * Provides the reading side with a per connection cache of
    38  * info obtained via calls to the remote CodeBase.
    39  *
    40  * Previously, most of this was in IIOPConnection.
    41  *
    42  * Features:
    43  *    Delays cache creation unless used
    44  *    Postpones remote calls until necessary
    45  *    Handles creating obj ref from IOR
    46  *    Maintains caches for the following maps:
    47  *         CodeBase IOR to obj ref (global)
    48  *         RepId to implementation URL(s)
    49  *         RepId to remote FVD
    50  *         RepId to superclass type list
    51  *
    52  * Needs cache management.
    53  */
    54 public class CachedCodeBase extends _CodeBaseImplBase
    55 {
    56     private Hashtable implementations, fvds, bases;
    57     private volatile CodeBase delegate;
    58     private CorbaConnection conn;
    60     private static Object iorMapLock = new Object();
    61     private static Hashtable<IOR,CodeBase> iorMap = new Hashtable<>();
    63     public static synchronized void cleanCache( ORB orb ) {
    64         synchronized (iorMapLock) {
    65             for (IOR ior : iorMap.keySet()) {
    66                 if (ior.getORB() == orb) {
    67                     iorMap.remove(ior);
    68                 }
    69             }
    70         }
    71     }
    73     public CachedCodeBase(CorbaConnection connection) {
    74         conn = connection;
    75     }
    77     public com.sun.org.omg.CORBA.Repository get_ir () {
    78         return null;
    79     }
    81     public synchronized String implementation (String repId) {
    82         String urlResult = null;
    84         if (implementations == null)
    85             implementations = new Hashtable();
    86         else
    87             urlResult = (String)implementations.get(repId);
    89         if (urlResult == null && connectedCodeBase()) {
    90             urlResult = delegate.implementation(repId);
    92             if (urlResult != null)
    93                 implementations.put(repId, urlResult);
    94         }
    96         return urlResult;
    97     }
    99     public synchronized String[] implementations (String[] repIds) {
   100         String[] urlResults = new String[repIds.length];
   102         for (int i = 0; i < urlResults.length; i++)
   103             urlResults[i] = implementation(repIds[i]);
   105         return urlResults;
   106     }
   108     public synchronized FullValueDescription meta (String repId) {
   109         FullValueDescription result = null;
   111         if (fvds == null)
   112             fvds = new Hashtable();
   113         else
   114             result = (FullValueDescription)fvds.get(repId);
   116         if (result == null && connectedCodeBase()) {
   117             result = delegate.meta(repId);
   119             if (result != null)
   120                 fvds.put(repId, result);
   121         }
   123         return result;
   124     }
   126     public synchronized FullValueDescription[] metas (String[] repIds) {
   127         FullValueDescription[] results
   128             = new FullValueDescription[repIds.length];
   130         for (int i = 0; i < results.length; i++)
   131             results[i] = meta(repIds[i]);
   133         return results;
   134     }
   136     public synchronized String[] bases (String repId) {
   138         String[] results = null;
   140         if (bases == null)
   141             bases = new Hashtable();
   142         else
   143             results = (String[])bases.get(repId);
   145         if (results == null && connectedCodeBase()) {
   146             results = delegate.bases(repId);
   148             if (results != null)
   149                 bases.put(repId, results);
   150         }
   152         return results;
   153     }
   155     // Ensures that we've used the connection's IOR to create
   156     // a valid CodeBase delegate.  If this returns false, then
   157     // it is not valid to access the delegate.
   158     private synchronized boolean connectedCodeBase() {
   159         if (delegate != null)
   160             return true;
   162         // The delegate was null, so see if the connection's
   163         // IOR was set.  If so, then we just need to connect
   164         // it.  Otherwise, there is no hope of checking the
   165         // remote code base.  That could be bug if the
   166         // service context processing didn't occur, or it
   167         // could be that we're talking to a foreign ORB which
   168         // doesn't include this optional service context.
   169         if (conn.getCodeBaseIOR() == null) {
   170             // REVISIT.  Use Merlin logging service to report that
   171             // codebase functionality was requested but unavailable.
   172             if (conn.getBroker().transportDebugFlag)
   173                 conn.dprint("CodeBase unavailable on connection: " + conn);
   175             return false;
   176         }
   178         synchronized(iorMapLock) {
   180             // Recheck the condition to make sure another
   181             // thread didn't already do this while we waited
   182             if (delegate != null)
   183                 return true;
   185             // Do we have a reference initialized by another connection?
   186             delegate = CachedCodeBase.iorMap.get(conn.getCodeBaseIOR());
   188             if (delegate != null)
   189                 return true;
   191             // Connect the delegate and update the cache
   192             delegate = CodeBaseHelper.narrow(getObjectFromIOR());
   194             // Save it for the benefit of other connections
   195             CachedCodeBase.iorMap.put(conn.getCodeBaseIOR(), delegate);
   196         }
   198         // It's now safe to use the delegate
   199         return true;
   200     }
   202     private final org.omg.CORBA.Object getObjectFromIOR() {
   203         return CDRInputStream_1_0.internalIORToObject(
   204             conn.getCodeBaseIOR(), null /*stubFactory*/, conn.getBroker());
   205     }
   206 }
   208 // End of file.

mercurial