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    }