KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > openedit > generators > CompositeGenerator


1 /*
2  * Created on Jul 21, 2004
3  */

4 package com.openedit.generators;
5
6 import java.io.ByteArrayOutputStream JavaDoc;
7 import java.io.IOException JavaDoc;
8 import java.io.OutputStreamWriter JavaDoc;
9 import java.io.Writer JavaDoc;
10 import java.util.ArrayList JavaDoc;
11 import java.util.Iterator JavaDoc;
12 import java.util.List JavaDoc;
13
14 import org.apache.commons.logging.Log;
15 import org.apache.commons.logging.LogFactory;
16 import org.openedit.repository.filesystem.StringItem;
17
18 import com.openedit.Generator;
19 import com.openedit.OpenEditException;
20 import com.openedit.OpenEditRuntimeException;
21 import com.openedit.WebPageRequest;
22 import com.openedit.page.Page;
23 import com.openedit.page.PageStreamer;
24
25 /**
26  * TODO: Just make this track a list of generators
27  * @author Matthew Avery, mavery@einnovation.com
28  */

29 public class CompositeGenerator extends BaseGenerator implements Generator
30 {
31     protected List JavaDoc fieldAllGenerators;
32     
33     private static final Log log = LogFactory.getLog(CompositeGenerator.class);
34     public CompositeGenerator( )
35     {
36     }
37
38     protected List JavaDoc getGenerators()
39     {
40         if ( fieldAllGenerators == null)
41         {
42             fieldAllGenerators =new ArrayList JavaDoc(2);
43         }
44         return fieldAllGenerators;
45     }
46     public void addGenerator(Generator inGen)
47     {
48         if ( inGen == null)
49         {
50             throw new OpenEditRuntimeException("No such generator");
51         }
52         getGenerators().add(inGen);
53     }
54     public void generate( WebPageRequest inContext, Page inPage, Output inOut ) throws OpenEditException
55     {
56         PageStreamer pages = inContext.getPageStreamer();
57         Output old = pages.getOutput(); //They might write out the streamer so we need to capture this
58
Page resultsThuFar = inPage;
59
60         //This class only support String composite generation. No byte[] stuff allowed
61

62         String JavaDoc content = null;
63         for (Iterator JavaDoc iter = getGenerators().iterator(); iter.hasNext();)
64         {
65             Generator gen = (Generator) iter.next();
66
67             content = captureAllOutput(inContext, gen, resultsThuFar);
68             //make fake page and keep processing
69
resultsThuFar = new Page( resultsThuFar );
70             resultsThuFar.setContentItem( new StringItem( inPage.getPath(), content, inPage.getCharacterEncoding() ) );
71         }
72         
73         try
74         {
75             pages.setOutput(old);
76             inOut.getWriter().write(content);
77             inOut.getWriter().flush();
78         }
79         catch (IOException JavaDoc ex)
80         {
81             log.error( ex );
82         }
83     }
84     protected String JavaDoc captureAllOutput(WebPageRequest inContext, Generator inGen, Page inResultsThuFar ) throws OpenEditException
85     {
86         //We have to replace the streamer with one that has our context and writer
87

88         //Cant copy because the action are editing the parent version
89
WebPageRequest copy = inContext.copy();
90
91         //This allows the $pages.stream method to keep working with our fake output
92
PageStreamer streamer = inContext.getPageStreamer().copy();
93
94         //allows capture of any output on our tmp streamer
95
ByteArrayOutputStream JavaDoc scapture = new ByteArrayOutputStream JavaDoc();
96         Writer JavaDoc capture = null;
97         try
98         {
99             capture = new OutputStreamWriter JavaDoc(scapture, inResultsThuFar.getCharacterEncoding() );
100             Output out = new Output(capture, scapture );
101             streamer.setOutput(out);
102             
103             copy.putPageStreamer(streamer);
104             streamer.setWebPageRequest(copy);
105             
106             //kicks the proces off without running any actions again
107
inGen.generate( copy, inResultsThuFar , out);
108     
109             capture.flush();
110             String JavaDoc value = scapture.toString(inResultsThuFar.getCharacterEncoding());
111             return value;
112         }
113         catch (IOException JavaDoc ex)
114         {
115             throw new OpenEditException(ex);
116         }
117
118     }
119
120     public boolean canGenerate(WebPageRequest inReq)
121     {
122         for (Iterator JavaDoc iter = getGenerators().iterator(); iter.hasNext();)
123         {
124             Generator gen = (Generator) iter.next();
125             if ( !gen.canGenerate( inReq ))
126             {
127                 return false;
128             }
129         }
130         return true;
131     }
132
133     public void setGenerators(List JavaDoc inMorefound)
134     {
135         fieldAllGenerators = inMorefound;
136     }
137
138     public boolean contains(Generator inClass)
139     {
140         return getGenerators().contains(inClass);
141     }
142     
143     public boolean hasGenerator(Generator inChild)
144     {
145         if( inChild == this )
146         {
147             return true;
148         }
149         for (Iterator JavaDoc iter = getGenerators().iterator(); iter.hasNext();)
150         {
151             Generator gen = (Generator) iter.next();
152             if ( gen.hasGenerator(inChild))
153             {
154                 return true;
155             }
156         }
157         return false;
158     }
159
160 }
161
Popular Tags