001:/*
002: * Copyright 1999-2004 The Apache Software Foundation
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: */
016:
017:package org.apache.naming.core;
018:
019:
020:import java.util.Enumeration;
021:
022:import javax.naming.Binding;
023:import javax.naming.Context;
024:import javax.naming.NameClassPair;
025:import javax.naming.NamingEnumeration;
026:import javax.naming.NamingException;
027:
028:/**
029: * Naming enumeration implementation.
030: *
031: * TODO: implement 'throw exceptions on close' part of the spec.
032: * TODO: implement recycling ( for example on close )
033: *
034: * @author Remy Maucherat
035: * @author Costin Manolache
036: */
037:public class NamingContextEnumeration
038: implements NamingEnumeration
039:{
040: /** Constructor.
041: *
042: * @param enum base enumeration. Elements can be Strings, NameClassPair,
043: * Bindings or Entries, we'll provide the wrapping if needed. For String
044: * the Class and value will be lazy-loaded.
045: *
046: * @param ctx The context where this enum belongs. Used to lazy-eval
047: * the class and value
048: *
049: * @param bindings If true, we'll wrap things as Binding ( true for
050: * listBindings, false for list ).
051: */
052: public NamingContextEnumeration( Enumeration enum, Context ctx,
053: boolean bindings )
054: {
055: this .ctx = ctx;
056: this .bindings=bindings;
057: this .enum = enum;
058: }
059:
060: // -------------------------------------------------------------- Variables
061:
062: // return bindings instead of NameClassPair
063: protected boolean bindings;
064: /**
065: * Underlying enumeration.
066: */
067: protected Enumeration enum;
068:
069: protected Context ctx;
070:
071: // --------------------------------------------------------- Public Methods
072:
073:
074: /**
075: * Retrieves the next element in the enumeration.
076: */
077: public Object next()
078: throws NamingException
079: {
080: return nextElement();
081: }
082:
083:
084: /**
085: * Determines whether there are any more elements in the enumeration.
086: */
087: public boolean hasMore()
088: throws NamingException
089: {
090: return enum.hasMoreElements();
091: }
092:
093:
094: /**
095: * Closes this enumeration.
096: */
097: public void close()
098: throws NamingException
099: {
100: // XXX all exceptions should be thrown on close ( AFAIK )
101: }
102:
103:
104: public boolean hasMoreElements() {
105: return enum.hasMoreElements();
106: }
107:
108: public Object nextElement() {
109: Object next=enum.nextElement();
110: if( next instanceof NamingEntry ) {
111: NamingEntry entry = (NamingEntry) next;
112: return new ServerBinding(entry.name, ctx, true);
113: } else if( next instanceof NameClassPair ) {
114: NameClassPair ncp=(NameClassPair)next;
115: if( bindings )
116: return new ServerBinding(ncp.getName(), ctx, true);
117: return next;
118: } else if( next instanceof Binding ) {
119: return next;
120: } else if( next instanceof String ) {
121: String name=(String)next;
122: return new ServerBinding( name, ctx, true );
123: }
124: return null;
125: }
126:
127:}
|