src/share/classes/com/sun/corba/se/impl/orbutil/RepositoryIdCache_1_3.java

Fri, 24 Sep 2010 22:42:14 -0700

author
skoppar
date
Fri, 24 Sep 2010 22:42:14 -0700
changeset 205
b2fff4b7e8cd
parent 158
91006f157c46
permissions
-rw-r--r--

6891766: Vulnerabilities in use of reflection in CORBA
Reviewed-by: hawtin

     1 /*
     2  * Copyright (c) 2000, 2002, 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 /*
    26  * Licensed Materials - Property of IBM
    27  * RMI-IIOP v1.0
    28  * Copyright IBM Corp. 1998 1999  All Rights Reserved
    29  *
    30  */
    32 package com.sun.corba.se.impl.orbutil;
    34 import java.util.Stack;
    35 import java.util.Hashtable;
    36 import java.util.EmptyStackException;
    37 import java.util.Enumeration;
    39 // Really limited pool - in this case just creating several at a time...
    40 class RepositoryIdPool_1_3 extends Stack {
    42     private static int MAX_CACHE_SIZE = 4;
    43     private RepositoryIdCache_1_3 cache;
    45     public final synchronized RepositoryId_1_3 popId() {
    47         try {
    48             return (RepositoryId_1_3)super.pop();
    49         }
    50         catch(EmptyStackException e) {
    51             increasePool(5);
    52             return (RepositoryId_1_3)super.pop();
    53         }
    55     }
    57     // Pool management
    58     final void increasePool(int size) {
    59         //if (cache.size() <= MAX_CACHE_SIZE)
    60         for (int i = size; i > 0; i--)
    61             push(new RepositoryId_1_3());
    62         /*
    63           // _REVISIT_ This will not work w/out either thread tracing or weak references.  I am
    64           // betting that thread tracing almost completely negates benefit of reuse.  Until either
    65           // 1.2 only inclusion or proof to the contrary, I'll leave it this way...
    66           else {
    67           int numToReclaim = cache.size() / 2;
    68           Enumeration keys = cache.keys();
    69           Enumeration elements = cache.elements();
    70           for (int i = numToReclaim; i > 0; i--) {
    71           Object key = keys.nextElement();
    72           Object element = elements.nextElement();
    74           push(element);
    75           cache.remove(key);
    76           }
    77           }
    78         */
    79     }
    81     final void setCaches(RepositoryIdCache_1_3 cache) {
    82         this.cache = cache;
    83     }
    85 }
    87 public class RepositoryIdCache_1_3 extends Hashtable {
    89     private RepositoryIdPool_1_3 pool = new RepositoryIdPool_1_3();
    91     public RepositoryIdCache_1_3() {
    92         pool.setCaches(this);
    93     }
    95     public final synchronized RepositoryId_1_3 getId(String key) {
    96         RepositoryId_1_3 repId = (RepositoryId_1_3)super.get(key);
    98         if (repId != null)
    99             return repId;
   100         else {
   101             //repId = pool.popId().init(key);
   102             repId = new RepositoryId_1_3(key);
   103             put(key, repId);
   104             return repId;
   105         }
   107     }
   108 }

mercurial