0N/A/*
2362N/A * Copyright (c) 1999, 2005, Oracle and/or its affiliates. All rights reserved.
0N/A * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
0N/A *
0N/A * This code is free software; you can redistribute it and/or modify it
0N/A * under the terms of the GNU General Public License version 2 only, as
2362N/A * published by the Free Software Foundation. Oracle designates this
0N/A * particular file as subject to the "Classpath" exception as provided
2362N/A * by Oracle in the LICENSE file that accompanied this code.
0N/A *
0N/A * This code is distributed in the hope that it will be useful, but WITHOUT
0N/A * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
0N/A * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
0N/A * version 2 for more details (a copy is included in the LICENSE file that
0N/A * accompanied this code).
0N/A *
0N/A * You should have received a copy of the GNU General Public License version
0N/A * 2 along with this work; if not, write to the Free Software Foundation,
0N/A * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
0N/A *
2362N/A * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2362N/A * or visit www.oracle.com if you need additional information or have any
2362N/A * questions.
0N/A */
0N/A
0N/Apackage com.sun.jndi.cosnaming;
0N/A
0N/Aimport javax.naming.*;
0N/Aimport javax.naming.spi.NamingManager;
0N/A
0N/Aimport java.util.NoSuchElementException;
0N/Aimport java.util.Hashtable;
0N/A
0N/Aimport org.omg.CosNaming.*;
0N/Aimport org.omg.CosNaming.NamingContextPackage.*;
0N/Aimport org.omg.CORBA.*;
0N/A
0N/A/**
0N/A * Implements the JNDI NamingEnumeration interface for COS
0N/A * Naming. Gets hold of a list of bindings from the COS Naming Server
0N/A * and allows the client to iterate through them.
0N/A *
0N/A * @author Raj Krishnamurthy
0N/A * @author Rosanna Lee
0N/A */
0N/A
0N/Afinal class CNBindingEnumeration implements NamingEnumeration {
0N/A
0N/A private static final int DEFAULT_BATCHSIZE = 100;
0N/A private BindingListHolder _bindingList; // list of bindings
0N/A private BindingIterator _bindingIter; // iterator for getting list of bindings
0N/A private int counter; // pointer in _bindingList
0N/A private int batchsize = DEFAULT_BATCHSIZE; // how many to ask for each time
0N/A private CNCtx _ctx; // ctx to list
0N/A private Hashtable _env; // environment for getObjectInstance
0N/A private boolean more = false; // iterator done?
0N/A private boolean isLookedUpCtx = false; // iterating on a context beneath this context ?
0N/A
0N/A /**
0N/A * Creates a CNBindingEnumeration object.
0N/A * @param ctx Context to enumerate
0N/A */
0N/A CNBindingEnumeration(CNCtx ctx, boolean isLookedUpCtx, Hashtable env) {
0N/A // Get batch size to use
0N/A String batch = (env != null ?
0N/A (String)env.get(javax.naming.Context.BATCHSIZE) : null);
0N/A if (batch != null) {
0N/A try {
0N/A batchsize = Integer.parseInt(batch);
0N/A } catch (NumberFormatException e) {
0N/A throw new IllegalArgumentException("Batch size not numeric: " + batch);
0N/A }
0N/A }
0N/A _ctx = ctx;
0N/A _ctx.incEnumCount();
0N/A this.isLookedUpCtx = isLookedUpCtx;
0N/A _env = env;
0N/A _bindingList = new BindingListHolder();
0N/A BindingIteratorHolder _bindingIterH = new BindingIteratorHolder();
0N/A
0N/A // Perform listing and request that bindings be returned in _bindingIter
0N/A // Upon return,_bindingList returns a zero length list
0N/A _ctx._nc.list(0, _bindingList, _bindingIterH);
0N/A
0N/A _bindingIter = _bindingIterH.value;
0N/A
0N/A // Get first batch using _bindingIter
0N/A if (_bindingIter != null) {
0N/A more = _bindingIter.next_n(batchsize, _bindingList);
0N/A } else {
0N/A more = false;
0N/A }
0N/A counter = 0;
0N/A }
0N/A
0N/A /**
0N/A * Returns the next binding in the list.
0N/A * @exception NamingException any naming exception.
0N/A */
0N/A
0N/A public java.lang.Object next() throws NamingException {
0N/A if (more && counter >= _bindingList.value.length) {
0N/A getMore();
0N/A }
0N/A if (more && counter < _bindingList.value.length) {
0N/A org.omg.CosNaming.Binding bndg = _bindingList.value[counter];
0N/A counter++;
0N/A return mapBinding(bndg);
0N/A } else {
0N/A throw new NoSuchElementException();
0N/A }
0N/A }
0N/A
0N/A
0N/A /**
0N/A * Returns true or false depending on whether there are more bindings.
0N/A * @return boolean value
0N/A */
0N/A
0N/A public boolean hasMore() throws NamingException {
0N/A // If there's more, check whether current bindingList has been exhausted,
0N/A // and if so, try to get more.
0N/A // If no more, just say so.
0N/A return more ? (counter < _bindingList.value.length || getMore()) : false;
0N/A }
0N/A
0N/A /**
0N/A * Returns true or false depending on whether there are more bindings.
0N/A * Need to define this to satisfy the Enumeration api requirement.
0N/A * @return boolean value
0N/A */
0N/A
0N/A public boolean hasMoreElements() {
0N/A try {
0N/A return hasMore();
0N/A } catch (NamingException e) {
0N/A return false;
0N/A }
0N/A }
0N/A
0N/A /**
0N/A * Returns the next binding in the list.
0N/A * @exception NoSuchElementException Thrown when the end of the
0N/A * list is reached.
0N/A */
0N/A
0N/A public java.lang.Object nextElement() {
0N/A try {
0N/A return next();
0N/A } catch (NamingException ne) {
0N/A throw new NoSuchElementException();
0N/A }
0N/A }
0N/A
0N/A public void close() throws NamingException {
0N/A more = false;
0N/A if (_bindingIter != null) {
0N/A _bindingIter.destroy();
0N/A _bindingIter = null;
0N/A }
0N/A if (_ctx != null) {
0N/A _ctx.decEnumCount();
0N/A
0N/A /**
0N/A * context was obtained by CNCtx, the user doesn't have a handle to
0N/A * it, close it as we are done enumerating through the context
0N/A */
0N/A if (isLookedUpCtx) {
0N/A _ctx.close();
0N/A }
0N/A _ctx = null;
0N/A }
0N/A }
0N/A
0N/A protected void finalize() {
0N/A try {
0N/A close();
0N/A } catch (NamingException e) {
0N/A // ignore failures
0N/A }
0N/A }
0N/A
0N/A /**
0N/A * Get the next batch using _bindingIter. Update the 'more' field.
0N/A */
0N/A private boolean getMore() throws NamingException {
0N/A try {
0N/A more = _bindingIter.next_n(batchsize, _bindingList);
0N/A counter = 0; // reset
0N/A } catch (Exception e) {
0N/A more = false;
0N/A NamingException ne = new NamingException(
0N/A "Problem getting binding list");
0N/A ne.setRootCause(e);
0N/A throw ne;
0N/A }
0N/A return more;
0N/A }
0N/A
0N/A /**
0N/A * Constructs a JNDI Binding object from the COS Naming binding
0N/A * object.
0N/A * @exception NameNotFound No objects under the name.
0N/A * @exception CannotProceed Unable to obtain a continuation context
0N/A * @exception InvalidName Name not understood.
0N/A * @exception NamingException One of the above.
0N/A */
0N/A
0N/A private javax.naming.Binding mapBinding(org.omg.CosNaming.Binding bndg)
0N/A throws NamingException {
0N/A java.lang.Object obj = _ctx.callResolve(bndg.binding_name);
0N/A
0N/A Name cname = CNNameParser.cosNameToName(bndg.binding_name);
0N/A
0N/A try {
0N/A obj = NamingManager.getObjectInstance(obj, cname, _ctx, _env);
0N/A } catch (NamingException e) {
0N/A throw e;
0N/A } catch (Exception e) {
0N/A NamingException ne = new NamingException(
0N/A "problem generating object using object factory");
0N/A ne.setRootCause(e);
0N/A throw ne;
0N/A }
0N/A
0N/A // Use cname.toString() instead of bindingName because the name
0N/A // in the binding should be a composite name
0N/A String cnameStr = cname.toString();
0N/A javax.naming.Binding jbndg = new javax.naming.Binding(cnameStr, obj);
0N/A
0N/A NameComponent[] comps = _ctx.makeFullName(bndg.binding_name);
0N/A String fullName = CNNameParser.cosNameToInsString(comps);
0N/A jbndg.setNameInNamespace(fullName);
0N/A return jbndg;
0N/A }
0N/A}