KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > jboss > portal > format > parser > chars > StackFilter


1 /*****************************************
2  * *
3  * JBoss Portal: The OpenSource Portal *
4  * *
5  * Distributable under LGPL license. *
6  * See terms of license at gnu.org. *
7  * *
8  *****************************************/

9
10 package org.jboss.portal.format.parser.chars;
11
12 import java.io.IOException JavaDoc;
13 import java.io.Reader JavaDoc;
14 import java.io.Writer JavaDoc;
15
16 /**
17  * @author <a HREF="mailto:julien@jboss.org">Julien Viet</a>
18  * @version $Revision: 1.2 $
19  */

20 public class StackFilter implements Filter
21 {
22
23    private Filter[] stack = new Filter[0];
24
25    public StackFilter()
26    {
27    }
28
29    public void add(Filter filter)
30    {
31       Filter[] tmp = new Filter[1 + stack.length];
32       System.arraycopy(stack, 0, tmp, 1, stack.length);
33       tmp[0] = filter;
34       stack = tmp;
35    }
36
37    public void filter(Reader JavaDoc in, Writer JavaDoc out) throws IOException JavaDoc
38    {
39       int n = stack.length - 1;
40       if (n > 1)
41       {
42          MutableChars chars1 = new MutableChars();
43          stack[n].filter(in, chars1.getWriter());
44          MutableChars chars2 = new MutableChars();
45          while (n > 0)
46          {
47             // Filter
48
stack[n].filter(chars1.getReader(), chars2.getWriter());
49             // Swap and reset
50
MutableChars tmp = chars1;
51             chars1 = chars2;
52             chars2 = tmp;
53             chars2.reset();
54             n--;
55          }
56          stack[0].filter(chars1.getReader(), out);
57       }
58       else if (n == 1)
59       {
60          MutableChars chars = new MutableChars();
61          stack[1].filter(in, chars.getWriter());
62          stack[0].filter(chars.getReader(), out);
63       }
64       else if (n == 0)
65       {
66          stack[0].filter(in, out);
67       }
68    }
69
70 }
71
Popular Tags