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 (blobDescriptorExtension.isITynamoBlob())
119 {
120 TynamoBlob trailsBlob = (TynamoBlob) propertyAccess.get(model, propertyDescriptor.getName());
121 if (trailsBlob != null)
122 {
123 return trailsBlob.getContentType();
124 }
125 }
126
127 return blobDescriptorExtension.getContentType();
128 }
129
130 public String getFileName(TynamoPropertyDescriptor propertyDescriptor, Object model)
131 {
132 BlobDescriptorExtension blobDescriptorExtension = getBlobDescriptorExtension(propertyDescriptor);
133
134 if (StringUtils.isNotEmpty(blobDescriptorExtension.getFileName()))
135 {
136 return blobDescriptorExtension.getFileName();
137 }
138
139 if (blobDescriptorExtension.isITynamoBlob())
140 {
141 TynamoBlob trailsBlob = (TynamoBlob) propertyAccess.get(model, propertyDescriptor.getName());
142 if (trailsBlob != null)
143 {
144 return trailsBlob.getFileName();
145 }
146 }
147
148 return null;
149 }
150
151 public boolean isNotNull(TynamoPropertyDescriptor propertyDescriptor, Object model)
152 {
153 if (model != null)
154 {
155 BlobDescriptorExtension blobDescriptorExtension = getBlobDescriptorExtension(propertyDescriptor);
156 byte[] bytes = null;
157 if (blobDescriptorExtension.isITynamoBlob())
158 {
159 TynamoBlob trailsBlob = (TynamoBlob) propertyAccess.get(model, propertyDescriptor.getName());
160 bytes = trailsBlob != null ? trailsBlob.getBytes() : null;
161 } else if (blobDescriptorExtension.isBytes()) {
162 bytes = (byte[]) propertyAccess.get(model, propertyDescriptor.getName());
163 }
164 return bytes != null && bytes.length > 0;
165 }
166 return false;
167 }
168
169 private BlobDescriptorExtension getBlobDescriptorExtension(TynamoPropertyDescriptor propertyDescriptor)
170 {
171 return propertyDescriptor.getExtension(BlobDescriptorExtension.class);
172 }
173 }