1 4 package com.openedit.generators; 5 6 import java.io.ByteArrayOutputStream ; 7 import java.io.IOException ; 8 import java.io.OutputStreamWriter ; 9 import java.io.Writer ; 10 import java.util.ArrayList ; 11 import java.util.Iterator ; 12 import java.util.List ; 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 29 public class CompositeGenerator extends BaseGenerator implements Generator 30 { 31 protected List fieldAllGenerators; 32 33 private static final Log log = LogFactory.getLog(CompositeGenerator.class); 34 public CompositeGenerator( ) 35 { 36 } 37 38 protected List getGenerators() 39 { 40 if ( fieldAllGenerators == null) 41 { 42 fieldAllGenerators =new ArrayList (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(); Page resultsThuFar = inPage; 59 60 62 String content = null; 63 for (Iterator iter = getGenerators().iterator(); iter.hasNext();) 64 { 65 Generator gen = (Generator) iter.next(); 66 67 content = captureAllOutput(inContext, gen, resultsThuFar); 68 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 ex) 80 { 81 log.error( ex ); 82 } 83 } 84 protected String captureAllOutput(WebPageRequest inContext, Generator inGen, Page inResultsThuFar ) throws OpenEditException 85 { 86 88 WebPageRequest copy = inContext.copy(); 90 91 PageStreamer streamer = inContext.getPageStreamer().copy(); 93 94 ByteArrayOutputStream scapture = new ByteArrayOutputStream (); 96 Writer capture = null; 97 try 98 { 99 capture = new OutputStreamWriter (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 inGen.generate( copy, inResultsThuFar , out); 108 109 capture.flush(); 110 String value = scapture.toString(inResultsThuFar.getCharacterEncoding()); 111 return value; 112 } 113 catch (IOException ex) 114 { 115 throw new OpenEditException(ex); 116 } 117 118 } 119 120 public boolean canGenerate(WebPageRequest inReq) 121 { 122 for (Iterator 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 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 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 |