1 25 package org.archive.crawler.util; 26 27 import java.util.AbstractCollection ; 28 import java.util.Collection ; 29 import java.util.Iterator ; 30 31 32 52 public class Transform<Original,Transformed> 53 extends AbstractCollection <Transformed> { 54 55 56 final private Collection <? extends Original> delegate; 57 58 59 final private Transformer<Original,Transformed> transformer; 60 61 67 public Transform(Collection <? extends Original> delegate, 68 Transformer<Original,Transformed> transformer) { 69 this.delegate = delegate; 70 this.transformer = transformer; 71 } 72 73 public int size() { 74 int count = 0; 75 Iterator <Transformed> iter = iterator(); 76 while (iter.hasNext()) { 77 iter.next(); 78 count++; 79 } 80 return count; 81 } 82 83 public Iterator <Transformed> iterator() { 84 return new TransformIterator<Original,Transformed>( 85 delegate.iterator(), transformer); 86 } 87 88 89 97 public static <Target> Collection <Target> subclasses( 98 Collection <? extends Object > c, 99 final Class <Target> cls) { 100 Transformer<Object ,Target> t = new Transformer<Object ,Target>() { 101 public Target transform(Object s) { 102 if (cls.isInstance(s)) { 103 return cls.cast(s); 104 } else { 105 return null; 106 } 107 } 108 }; 109 return new Transform<Object ,Target>(c, t); 110 } 111 } 112 113 114 class TransformIterator<Original,Transformed> implements Iterator <Transformed> { 115 116 final private Iterator <? extends Original> iterator; 117 final private Transformer<Original,Transformed> transformer; 118 private Transformed next; 119 120 public TransformIterator(Iterator <? extends Original> iterator, 121 Transformer<Original,Transformed> transformer) { 122 this.iterator = iterator; 123 this.transformer = transformer; 124 } 125 126 public boolean hasNext() { 127 if (next != null) { 128 return true; 129 } 130 while (iterator.hasNext()) { 131 Original o = iterator.next(); 132 next = transformer.transform(o); 133 if (next != null) { 134 return true; 135 } 136 } 137 return false; 138 } 139 140 public Transformed next() { 141 if (!hasNext()) { 142 throw new IllegalStateException (); 143 } 144 Transformed r = next; 145 next = null; 146 return r; 147 } 148 149 public void remove() { 157 iterator.remove(); 158 } 159 160 } | Popular Tags |