1 16 package org.outerj.daisy.frontend; 17 18 import org.apache.cocoon.reading.Reader; 19 import org.apache.cocoon.ProcessingException; 20 import org.apache.cocoon.environment.SourceResolver; 21 import org.apache.cocoon.environment.ObjectModelHelper; 22 import org.apache.cocoon.environment.Response; 23 import org.apache.cocoon.environment.Request; 24 import org.apache.avalon.framework.parameters.Parameters; 25 import org.apache.avalon.framework.service.Serviceable; 26 import org.apache.avalon.framework.service.ServiceManager; 27 import org.apache.avalon.framework.service.ServiceException; 28 import org.apache.avalon.framework.logger.LogEnabled; 29 import org.apache.avalon.framework.logger.Logger; 30 import org.apache.avalon.framework.activity.Disposable; 31 import org.xml.sax.SAXException ; 32 import org.outerj.daisy.repository.VariantKey; 33 import org.outerj.daisy.repository.RepositoryException; 34 import org.outerj.daisy.repository.Repository; 35 import org.outerj.daisy.publisher.Publisher; 36 import org.outerj.daisy.publisher.BlobInfo; 37 38 import java.io.IOException ; 39 import java.io.OutputStream ; 40 import java.io.InputStream ; 41 import java.util.Map ; 42 43 public class PartReader implements LogEnabled, Reader, Serviceable, Disposable { 44 private ServiceManager serviceManager; 45 private OutputStream outputStream; 46 private Response response; 47 private BlobInfo blobInfo; 48 private Logger logger; 49 private static final int BUFFER_SIZE = 32768; 50 51 public void service(ServiceManager serviceManager) throws ServiceException { 52 this.serviceManager = serviceManager; 53 } 54 55 public void enableLogging(Logger logger) { 56 this.logger = logger; 57 } 58 59 public void dispose() { 60 if (this.blobInfo != null) 61 blobInfo.dispose(); 62 } 63 64 public void generate() throws IOException , SAXException , ProcessingException { 65 response.setIntHeader("Content-Length", (int)blobInfo.getSize()); 66 67 InputStream is = null; 68 try { 69 is = blobInfo.getInputStream(); 70 byte[] data = new byte[BUFFER_SIZE]; 71 int read; 72 do { 73 read = is.read(data); 74 if (read != -1) { 75 outputStream.write(data, 0, read); 76 } 77 } while (read != -1); 78 } catch (RepositoryException e) { 79 throw new ProcessingException(e); 80 } finally { 81 if (is != null) { 82 try { 83 is.close(); 84 } catch (Throwable e) { 85 logger.error("Error closing input stream in PartReader.", e); 86 } 87 } 88 } 89 } 90 91 public long getLastModified() { 92 return blobInfo.getLastModified().getTime(); 93 } 94 95 public void setup(SourceResolver sourceResolver, Map objectModel, String s, Parameters parameters) throws ProcessingException, SAXException , IOException { 96 try { 97 long documentId = Long.parseLong(parameters.getParameter("documentId")); 98 String version = parameters.getParameter("version"); 99 if (version.equalsIgnoreCase("default")) { 100 Request request = ObjectModelHelper.getRequest(objectModel); 101 version = WikiHelper.getVersionMode(request).toString(); 102 } 103 String partType = parameters.getParameter("partType"); 104 String branch = parameters.getParameter("branch"); 105 String language = parameters.getParameter("language"); 106 long defaultBranchId = parameters.getParameterAsLong("defaultBranchId"); 107 long defaultLanguageId = parameters.getParameterAsLong("defaultLanguageId"); 108 109 Repository repository = WikiHelper.getRepository(ObjectModelHelper.getRequest(objectModel), serviceManager); 110 long branchId = RequestUtil.getBranchId(branch, defaultBranchId, repository); 111 long languageId = RequestUtil.getLanguageId(language, defaultLanguageId, repository); 112 113 Publisher publisher = (Publisher)repository.getExtension("Publisher"); 114 this.blobInfo = publisher.getBlobInfo(new VariantKey(documentId, branchId, languageId), version, partType); 115 116 this.response = ObjectModelHelper.getResponse(objectModel); 117 } catch (Exception e) { 118 throw new ProcessingException(e); 119 } 120 } 121 122 public void setOutputStream(OutputStream outputStream) throws IOException { 123 this.outputStream = outputStream; 124 } 125 126 public String getMimeType() { 127 return blobInfo.getMimeType(); 128 } 129 130 public boolean shouldSetContentLength() { 131 return false; 132 } 133 } 134 | Popular Tags |