1 10 package org.mmbase.util.transformers; 11 12 import java.io.*; 13 import java.util.*; 14 import org.mmbase.util.ThreadPools; 15 16 import org.mmbase.util.logging.*; 17 18 49 50 public class ChainedCharTransformer extends ReaderTransformer implements CharTransformer { 51 private static Logger log = Logging.getLoggerInstance(ChainedCharTransformer.class); 52 53 private List charTransformers = new ArrayList(); 54 55 public ChainedCharTransformer() { 56 super(); 57 } 58 59 64 public ChainedCharTransformer add(CharTransformer ct) { 65 if (ct instanceof ChainedCharTransformer) { 66 addAll(((ChainedCharTransformer)ct).charTransformers); 67 } else { 68 charTransformers.add(ct); 69 } 70 return this; 71 } 72 73 78 public ChainedCharTransformer addAll(Collection col) { 79 Iterator i = col.iterator(); 80 while (i.hasNext()) { 81 CharTransformer c = (CharTransformer) i.next(); 82 add(c); 83 } 84 return this; 85 } 86 87 90 public String transform(String string) { 91 ListIterator i = charTransformers.listIterator(); 92 while (i.hasNext()) { 93 CharTransformer ct = (CharTransformer) i.next(); 94 string = ct.transform(string); 95 } 96 return string; 97 98 } 99 100 public Writer transform(Reader startReader, Writer endWriter) { 102 try { 103 PipedReader r = null; 104 Writer w = endWriter; 105 boolean closeWriterAfterUse = false; 107 List links = new ArrayList(); 110 114 ListIterator i = charTransformers.listIterator(charTransformers.size()); 115 while (i.hasPrevious()) { 116 CharTransformer ct = (CharTransformer) i.previous(); 117 if (i.hasPrevious()) { r = new PipedReader(); 119 CharTransformerLink link = new CharTransformerLink(ct, r, w, closeWriterAfterUse); 120 links.add(link); 121 w = new PipedWriter(r); 122 closeWriterAfterUse = true; 123 ThreadPools.filterExecutor.execute(link); 124 } else { ct.transform(startReader, w); 126 if (closeWriterAfterUse) { 127 w.close(); 128 } 129 } 130 } 131 Iterator ti = links.iterator(); 133 while (ti.hasNext()) { 134 CharTransformerLink l = (CharTransformerLink) ti.next(); 135 try { 136 while (!l.ready()) { 137 synchronized(l) { l.wait(); 139 } 140 } 141 } catch (InterruptedException ie) { 142 log.warn("" + ie); 143 } 144 } 145 } catch (IOException e) { 146 log.error(e.toString()); 147 log.info(Logging.stackTrace(e)); 148 } 149 return endWriter; 150 } 151 152 public String toString() { 153 return "CHAINED" + charTransformers; 154 } 155 156 157 158 public static void main(String [] args) throws IOException { 160 ChainedCharTransformer t = new ChainedCharTransformer().add(new UnicodeEscaper()).add(new SpaceReducer()).add(new UpperCaser()).add(new Trimmer()); 161 System.out.println("Starting transform"); 162 163 t.transform(new InputStreamReader(System.in), new OutputStreamWriter(System.out)).flush(); 164 166 System.out.println(t.transform("test test test test ")); 167 168 System.out.println("Finished transform"); 169 170 } 171 172 } 173 | Popular Tags |