001 package org.tynamo.pages;
002
003 import org.apache.tapestry5.StreamResponse;
004 import org.apache.tapestry5.ioc.annotations.Inject;
005 import org.apache.tapestry5.services.ContextValueEncoder;
006 import org.apache.tapestry5.services.Response;
007 import org.tynamo.blob.BlobManager;
008 import org.tynamo.descriptor.TynamoPropertyDescriptor;
009 import org.tynamo.descriptor.extension.BlobDescriptorExtension;
010 import org.tynamo.services.DescriptorService;
011
012 import java.io.ByteArrayInputStream;
013 import java.io.IOException;
014 import java.io.InputStream;
015
016 public class Blob
017 {
018 @Inject
019 private BlobManager filePersister;
020
021 @Inject
022 private DescriptorService descriptorService;
023
024 @Inject
025 private ContextValueEncoder contextValueEncoder;
026
027 final StreamResponse onActivate(Class clazz, String id, String property) throws Exception
028 {
029 final Object bean = contextValueEncoder.toValue(clazz, id);
030 final TynamoPropertyDescriptor propertyDescriptor =
031 descriptorService.getClassDescriptor(clazz).getPropertyDescriptor(property);
032
033 return new StreamResponse()
034 {
035 public String getContentType()
036 {
037 return filePersister.getContentType(propertyDescriptor, bean);
038 }
039
040 public InputStream getStream() throws IOException
041 {
042 return new ByteArrayInputStream(filePersister.getData(propertyDescriptor, bean));
043 }
044
045 public void prepareResponse(Response response)
046 {
047 String contentDisposition =
048 propertyDescriptor.getExtension(BlobDescriptorExtension.class).getContentDisposition().getValue();
049 String fileName = filePersister.getFileName(propertyDescriptor, bean);
050 response.setHeader("Content-Disposition",
051 contentDisposition + (fileName != null ? "; filename=" + fileName : ""));
052 }
053 };
054 }
055 }