001: /* ====================================================================
002: * The LateralNZ Software License, Version 1.0
003: *
004: * Copyright (c) 2003 LateralNZ. All rights reserved.
005: *
006: * Redistribution and use in source and binary forms, with or without
007: * modification, are permitted provided that the following conditions
008: * are met:
009: *
010: * 1. Redistributions of source code must retain the above copyright
011: * notice, this list of conditions and the following disclaimer.
012: *
013: * 2. Redistributions in binary form must reproduce the above copyright
014: * notice, this list of conditions and the following disclaimer in
015: * the documentation and/or other materials provided with the
016: * distribution.
017: *
018: * 3. The end-user documentation included with the redistribution,
019: * if any, must include the following acknowledgment:
020: * "This product includes software developed by
021: * LateralNZ (http://www.lateralnz.org/) and other third parties."
022: * Alternately, this acknowledgment may appear in the software itself,
023: * if and wherever such third-party acknowledgments normally appear.
024: *
025: * 4. The names "LateralNZ" must not be used to endorse or promote
026: * products derived from this software without prior written
027: * permission. For written permission, please
028: * contact oss@lateralnz.org.
029: *
030: * 5. Products derived from this software may not be called "Panther",
031: * or "Lateral" or "LateralNZ", nor may "PANTHER" or "LATERAL" or
032: * "LATERALNZ" appear in their name, without prior written
033: * permission of LateralNZ.
034: *
035: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
036: * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
037: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
038: * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
039: * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
040: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
041: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
042: * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
043: * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
044: * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
045: * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
046: * SUCH DAMAGE.
047: * ====================================================================
048: *
049: * This software consists of voluntary contributions made by many
050: * individuals on behalf of LateralNZ. For more
051: * information on Lateral, please see http://www.lateralnz.com/ or
052: * http://www.lateralnz.org
053: *
054: */
055: package org.lateralnz.common.util;
056:
057: import java.util.HashMap;
058: import java.util.Set;
059: import java.util.Iterator;
060: import java.util.regex.Matcher;
061: import java.util.regex.Pattern;
062:
063: /**
064: *
065: * @author jbriggs
066: */
067: public class FilteredIterator implements Iterator {
068:
069: private Pattern ipat;
070: private Pattern epat;
071: private Iterator iter;
072:
073: private boolean hasNextProcessed = false;
074: private boolean hasNext = false;
075: private Object next = null;
076:
077: public FilteredIterator(Set keyset, String incregex, String excregex) {
078: ipat = Pattern.compile(incregex);
079: epat = Pattern.compile(excregex);
080: iter = keyset.iterator();
081: }
082:
083: private Object getNext() {
084: String key;
085: while (iter.hasNext()) {
086: key = (String) iter.next();
087: Matcher imat = ipat.matcher(key);
088: Matcher emat = epat.matcher(key);
089: if (imat.matches() && !emat.matches()) {
090: return key;
091: }
092: }
093: return null;
094: }
095:
096: public boolean hasNext() {
097: if (!hasNextProcessed) {
098: next = getNext();
099: if (next != null) {
100: hasNext = true;
101: return true;
102: }
103: }
104: return hasNext;
105: }
106:
107: public Object next() {
108: hasNext = false;
109: if (next != null) {
110: Object rtn = next;
111: next = null;
112: return rtn;
113: } else {
114: return getNext();
115: }
116: }
117:
118: public void remove() {
119: throw new UnsupportedOperationException();
120: }
121:
122: public static final void main(String[] args) throws Exception {
123: HashMap hm = new HashMap();
124: hm.put("a/test1", "");
125: hm.put("a/hello2", "");
126: hm.put("a/test4", "");
127: hm.put("a/tst5", "");
128: hm.put("b/", "");
129: hm.put("b/test18", "");
130: hm.put("b/test3", "");
131: hm.put("b/e/test19", "");
132: hm.put("c/test2", "");
133: hm.put("c/whattest52", "");
134:
135: FilteredIterator fi = new FilteredIterator(hm.keySet(),
136: "b/[^/]*", "b/|");
137: while (fi.hasNext()) {
138: System.out.println(fi.next());
139: }
140: }
141: }
|