KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > mmbase > util > transformers > TransformingReader


1 /*
2
3 This software is OSI Certified Open Source Software.
4 OSI Certified is a certification mark of the Open Source Initiative.
5
6 The license (Mozilla version 1.0) can be read at the MMBase site.
7 See http://www.MMBase.org/license
8
9 */

10 package org.mmbase.util.transformers;
11
12 import java.io.*;
13
14 import org.mmbase.util.logging.*;
15
16 /**
17  * A Filtering Reader based on CharTransformers.
18 <pre>
19
20   _________ ____
21  / \/ \
22  | R --> PW - this |
23  | T | PR |
24  \_________/ \____/
25   
26
27   PW: piped writer, this PR: this reader, T: transformer
28
29   </pre>
30  * This reader can be instantiated with another Reader and a CharTransformer. All reading from this
31  * reader will be transformed output from reading on the given Reader.
32  *
33  * @author Michiel Meeuwissen
34  * @since MMBase-1.8
35  * @see ChainedCharTransformer
36  * @see TransformingWriter
37  */

38
39 public class TransformingReader extends PipedReader {
40
41     private static final Logger log = Logging.getLoggerInstance(TransformingReader.class);
42
43     private Reader in;
44     private CharTransformerLink link;
45
46
47     public TransformingReader(Reader in, CharTransformer charTransformer) {
48         super();
49         this.in = in;
50         PipedWriter w = new PipedWriter();
51         try {
52             connect(w);
53             link = new CharTransformerLink(charTransformer, in, w, true);
54             org.mmbase.util.ThreadPools.filterExecutor.execute(link);
55         } catch (IOException ioe) {
56             log.error(ioe.getMessage() + Logging.stackTrace(ioe));
57         }
58     }
59     
60     public synchronized int read() throws IOException {
61         int result = super.read();
62         if (result == -1) { // nothing to read any more, wait until transformation is ready.
63
waitReady();
64         }
65         return result;
66     }
67
68     public synchronized int read(char cbuf[], int off, int len) throws IOException {
69         int result = super.read(cbuf, off, len);
70         if (result == -1) {
71             waitReady();
72         }
73         return result;
74     }
75
76     /**
77      * Wait until the transformation is ready
78      */

79     protected void waitReady() {
80         try {
81             while (! link.ready()) {
82                 synchronized(link) { // make sure we have the lock
83
link.wait();
84                 }
85             }
86         } catch (InterruptedException JavaDoc ie) {
87             log.warn("" + ie);
88         }
89     }
90
91
92
93     /**
94      * {@inheritDoc}
95      * ALso closes the wrapped Reader.
96      */

97     public void close() throws IOException {
98         log.info("closing");
99         super.close();
100         in.close();
101     }
102    
103    
104     // main for testing purposes
105
public static void main(String JavaDoc[] args) {
106
107         String JavaDoc testString = "use argument to change this string";
108         if (args.length > 0) {
109             testString = args[0];
110         }
111  
112
113         BufferedReader reader = new BufferedReader(new TransformingReader(new StringReader(testString), new UnicodeEscaper()));
114
115         try {
116             while(true) {
117                 String JavaDoc line = reader.readLine();
118                 if (line == null) break;
119                 System.out.println(line);
120             }
121         } catch (Exception JavaDoc e) {
122             log.error(e + Logging.stackTrace(e));
123         }
124
125         
126         ChainedCharTransformer t = new ChainedCharTransformer();
127         t.add(new UnicodeEscaper());
128         t.add(new UpperCaser());
129         t.add(new SpaceReducer());
130         t.add(new Trimmer());
131         
132         reader = new BufferedReader(new TransformingReader(new StringReader(testString), t));
133         
134         try {
135             while(true) {
136                 String JavaDoc line = reader.readLine();
137                 if (line == null) break;
138                 System.out.println(line);
139             }
140         } catch (Exception JavaDoc e) {
141             log.error(e + Logging.stackTrace(e));
142         }
143     }
144
145
146
147 }
148
149
Popular Tags