View Javadoc

1   /**
2    *
3    * Copyright 2005 The Apache Software Foundation
4    *
5    *  Licensed under the Apache License, Version 2.0 (the "License");
6    *  you may not use this file except in compliance with the License.
7    *  You may obtain a copy of the License at
8    *
9    *     http://www.apache.org/licenses/LICENSE-2.0
10   *
11   *  Unless required by applicable law or agreed to in writing, software
12   *  distributed under the License is distributed on an "AS IS" BASIS,
13   *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   *  See the License for the specific language governing permissions and
15   *  limitations under the License.
16   */
17  package org.apache.geronimo.kernel.classloader;
18  
19  import java.util.Enumeration;
20  import java.util.Iterator;
21  import java.util.Collection;
22  import java.util.NoSuchElementException;
23  
24  /**
25   * @version $Rev: 410741 $ $Date: 2006-05-31 21:35:48 -0700 (Wed, 31 May 2006) $
26   */
27  public class ResourceEnumeration implements Enumeration {
28      private Iterator iterator;
29      private final String resourceName;
30      private Object next;
31  
32      public ResourceEnumeration(Collection resourceLocations, String resourceName) {
33          this.iterator = resourceLocations.iterator();
34          this.resourceName = resourceName;
35      }
36  
37      public boolean hasMoreElements() {
38          fetchNext();
39          return (next != null);
40      }
41  
42      public Object nextElement() {
43          fetchNext();
44  
45          // save next into a local variable and clear the next field
46          Object next = this.next;
47          this.next = null;
48  
49          // if we didn't have a next throw an exception
50          if (next == null) {
51              throw new NoSuchElementException();
52          }
53          return next;
54      }
55  
56      private void fetchNext() {
57          if (iterator == null) {
58              return;
59          }
60          if (next != null) {
61              return;
62          }
63  
64          try {
65              while (iterator.hasNext()) {
66                  ResourceLocation resourceLocation = (ResourceLocation) iterator.next();
67                  ResourceHandle resourceHandle = resourceLocation.getResourceHandle(resourceName);
68                  if (resourceHandle != null) {
69                      next = resourceHandle.getUrl();
70                      return;
71                  }
72              }
73              // no more elements
74              // clear the iterator so it can be GCed
75              iterator = null;
76          } catch (IllegalStateException e) {
77              // Jar file was closed... this means the resource finder was destroyed
78              // clear the iterator so it can be GCed
79              iterator = null;
80              throw e;
81          }
82      }
83  }