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 }