001    package org.tynamo.blob;
002    
003    import org.apache.commons.io.IOUtils;
004    import org.apache.commons.lang.StringUtils;
005    import org.apache.tapestry5.Link;
006    import org.apache.tapestry5.ioc.services.PropertyAccess;
007    import org.apache.tapestry5.services.PageRenderLinkSource;
008    import org.apache.tapestry5.upload.services.UploadedFile;
009    import org.tynamo.descriptor.TynamoPropertyDescriptor;
010    import org.tynamo.descriptor.extension.BlobDescriptorExtension;
011    import org.tynamo.descriptor.extension.TynamoBlob;
012    import org.tynamo.services.PersistenceService;
013    
014    import java.io.IOException;
015    import java.io.InputStream;
016    
017    
018    /**
019     * The Tynamo {@link BlobManager} default implementation.
020     */
021    public class DefaultBlobManager implements BlobManager
022    {
023    
024            private PersistenceService persistenceService;
025            private PropertyAccess propertyAccess;
026            private PageRenderLinkSource pageRenderLinkSource;
027    
028            public DefaultBlobManager(PersistenceService persistenceService, PropertyAccess propertyAccess,
029                                                              PageRenderLinkSource pageRenderLinkSource)
030            {
031                    this.persistenceService = persistenceService;
032                    this.propertyAccess = propertyAccess;
033                    this.pageRenderLinkSource = pageRenderLinkSource;
034            }
035    
036            public void store(TynamoPropertyDescriptor propertyDescriptor, Object model, UploadedFile file)
037            {
038                    BlobDescriptorExtension blobDescriptorExtension = getBlobDescriptorExtension(propertyDescriptor);
039    
040                    byte[] data = new byte[0];
041                    InputStream inputStream = file.getStream();
042    
043                    try
044                    {
045                            data = IOUtils.toByteArray(inputStream);
046    
047                    } catch (IOException ioe)
048                    {
049                            ioe.printStackTrace();
050                    }
051    
052                    if (data.length > 1)
053                    {
054                            if (blobDescriptorExtension.isBytes())
055                            {
056                                    propertyAccess.set(model, propertyDescriptor.getName(), data);
057                            } else if (blobDescriptorExtension.isITynamoBlob())
058                            {
059                                    TynamoBlob trailsBlob = (TynamoBlob) propertyAccess.get(model, propertyDescriptor.getName());
060    
061                                    if (trailsBlob == null)
062                                    { //trying to avoid an NPE
063                                            trailsBlob = new TynamoBlobImpl();
064                                            propertyAccess.set(model, propertyDescriptor.getName(), trailsBlob);
065                                    }
066    
067                                    trailsBlob.setFileName(file.getFileName());
068                                    trailsBlob.setFilePath(file.getFilePath());
069                                    trailsBlob.setContentType(file.getContentType());
070                                    trailsBlob.setBytes(data);
071                            }
072                    }
073            }
074    
075            public byte[] getData(TynamoPropertyDescriptor propertyDescriptor, Object model)
076            {
077                    BlobDescriptorExtension blobDescriptorExtension = getBlobDescriptorExtension(propertyDescriptor);
078    
079                    if (blobDescriptorExtension.isBytes())
080                    {
081                            return (byte[]) propertyAccess.get(model, propertyDescriptor.getName());
082    
083                    } else if (blobDescriptorExtension.isITynamoBlob())
084                    {
085                            TynamoBlob trailsBlob = (TynamoBlob) propertyAccess.get(model, propertyDescriptor.getName());
086                            return trailsBlob != null ? trailsBlob.getBytes() : new byte[0];
087                    }
088                    return null;
089            }
090    
091            public void delete(TynamoPropertyDescriptor propertyDescriptor, Object model)
092            {
093                    BlobDescriptorExtension blobDescriptorExtension = getBlobDescriptorExtension(propertyDescriptor);
094    
095                    if (blobDescriptorExtension.isBytes())
096                    {
097                            propertyAccess.set(model, propertyDescriptor.getName(), new byte[0]);
098    
099                    } else if (blobDescriptorExtension.isITynamoBlob())
100                    {
101                            TynamoBlob trailsBlob = (TynamoBlob) propertyAccess.get(model, propertyDescriptor.getName());
102                            trailsBlob.reset();
103                    }
104    
105                    persistenceService.save(model);
106            }
107    
108            public Link createBlobLink(TynamoPropertyDescriptor propertyDescriptor, Object model)
109            {
110                    return pageRenderLinkSource
111                                    .createPageRenderLinkWithContext("tynamo/Blob", propertyDescriptor.getBeanType(), model, propertyDescriptor.getName());
112            }
113    
114            public String getContentType(TynamoPropertyDescriptor propertyDescriptor, Object model)
115            {
116                    BlobDescriptorExtension blobDescriptorExtension = getBlobDescriptorExtension(propertyDescriptor);
117    
118                    if (StringUtils.isNotEmpty(blobDescriptorExtension.getFileName()))
119                    {
120                            return blobDescriptorExtension.getContentType();
121                    }
122    
123    
124                    if (blobDescriptorExtension.isITynamoBlob())
125                    {
126                            TynamoBlob trailsBlob = (TynamoBlob) propertyAccess.get(model, propertyDescriptor.getName());
127                            if (trailsBlob != null)
128                            {
129                                    return trailsBlob.getContentType();
130                            }
131                    }
132    
133                    return null;
134            }
135    
136            public String getFileName(TynamoPropertyDescriptor propertyDescriptor, Object model)
137            {
138                    BlobDescriptorExtension blobDescriptorExtension = getBlobDescriptorExtension(propertyDescriptor);
139    
140                    if (StringUtils.isNotEmpty(blobDescriptorExtension.getFileName()))
141                    {
142                            return blobDescriptorExtension.getFileName();
143                    }
144    
145                    if (blobDescriptorExtension.isITynamoBlob())
146                    {
147                            TynamoBlob trailsBlob = (TynamoBlob) propertyAccess.get(model, propertyDescriptor.getName());
148                            if (trailsBlob != null)
149                            {
150                                    return trailsBlob.getFileName();
151                            }
152                    }
153    
154                    return null;
155            }
156    
157            public boolean isNotNull(TynamoPropertyDescriptor propertyDescriptor, Object model)
158            {
159                    BlobDescriptorExtension blobDescriptorExtension = getBlobDescriptorExtension(propertyDescriptor);
160                    TynamoBlob trailsBlob = (TynamoBlob) propertyAccess.get(model, propertyDescriptor.getName());
161                    return trailsBlob != null && trailsBlob.getBytes() != null && trailsBlob.getBytes().length > 0;
162            }
163    
164            private BlobDescriptorExtension getBlobDescriptorExtension(TynamoPropertyDescriptor propertyDescriptor)
165            {
166                    return propertyDescriptor.getExtension(BlobDescriptorExtension.class);
167            }
168    }