KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > mchange > v1 > util > WrapperIterator


1 /*
2  * Distributed as part of c3p0 v.0.9.1
3  *
4  * Copyright (C) 2005 Machinery For Change, Inc.
5  *
6  * Author: Steve Waldman <swaldman@mchange.com>
7  *
8  * This library is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU Lesser General Public License version 2.1, as
10  * published by the Free Software Foundation.
11  *
12  * This software is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public License
18  * along with this software; see the file LICENSE. If not, write to the
19  * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
20  * Boston, MA 02111-1307, USA.
21  */

22
23
24 package com.mchange.v1.util;
25
26 import java.util.*;
27 import com.mchange.v1.util.DebugUtils;
28
29 /**
30  * This implementation does not yet support removes once hasNext() has
31  * been called... will add if necessary.
32  */

33 public abstract class WrapperIterator implements Iterator
34 {
35     protected final static Object JavaDoc SKIP_TOKEN = new Object JavaDoc();
36
37     final static boolean DEBUG = true;
38
39     Iterator inner;
40     boolean supports_remove;
41     Object JavaDoc lastOut = null;
42     Object JavaDoc nextOut = SKIP_TOKEN;
43     
44     public WrapperIterator(Iterator inner, boolean supports_remove)
45     {
46     this.inner = inner;
47     this.supports_remove = supports_remove;
48     }
49
50     public WrapperIterator(Iterator inner)
51     { this( inner, false ); }
52
53     public boolean hasNext()
54     {
55     findNext();
56     return nextOut != SKIP_TOKEN;
57     }
58
59     private void findNext()
60     {
61     if (nextOut == SKIP_TOKEN)
62         {
63         while (inner.hasNext() && nextOut == SKIP_TOKEN)
64             this.nextOut = transformObject( inner.next() );
65         }
66     }
67
68     public Object JavaDoc next()
69     {
70     findNext();
71     if (nextOut != SKIP_TOKEN)
72         {
73         lastOut = nextOut;
74         nextOut = SKIP_TOKEN;
75         }
76     else
77         throw new NoSuchElementException();
78
79     //postcondition
80
if (DEBUG)
81         DebugUtils.myAssert( nextOut == SKIP_TOKEN && lastOut != SKIP_TOKEN );
82     return lastOut;
83     }
84     
85     public void remove()
86     {
87     if (supports_remove)
88         {
89         if (nextOut != SKIP_TOKEN)
90             throw new UnsupportedOperationException JavaDoc(this.getClass().getName() +
91                                 " cannot support remove after" +
92                                 " hasNext() has been called!");
93         if (lastOut != SKIP_TOKEN)
94             inner.remove();
95         else
96             throw new NoSuchElementException();
97         }
98     else
99         throw new UnsupportedOperationException JavaDoc();
100     }
101
102     /**
103      * return SKIP_TOKEN to indicate an object should be
104      * skipped, i.e., not exposed as part of the iterator.
105      * (we don't use null, because we want to support iterators
106      * over null-accepting Collections.)
107      */

108     protected abstract Object JavaDoc transformObject(Object JavaDoc o);
109 }
110
111
112
113
114
115
116
Popular Tags