001 package org.trails.component.blob;
002
003 import org.apache.commons.io.IOUtils;
004 import org.apache.commons.lang.StringUtils;
005 import org.apache.hivemind.util.PropertyUtils;
006 import org.apache.tapestry.IAsset;
007 import org.apache.tapestry.request.IUploadFile;
008 import org.trails.descriptor.IClassDescriptor;
009 import org.trails.descriptor.IPropertyDescriptor;
010 import org.trails.descriptor.DescriptorService;
011 import org.trails.descriptor.extension.BlobDescriptorExtension;
012 import org.trails.descriptor.extension.ITrailsBlob;
013 import org.trails.persistence.PersistenceService;
014 import org.trails.builder.BuilderDirector;
015
016 import java.io.IOException;
017 import java.io.InputStream;
018 import java.io.Serializable;
019
020
021 /**
022 * The Trails {@link org.trails.component.blob.IFilePersister} default implementation.
023 */
024 public class DefaultFilePersister implements IFilePersister
025 {
026
027 PersistenceService persistenceService;
028 DescriptorService descriptorService;
029 BlobDownloadService blobDownloadService;
030
031 public void store(IPropertyDescriptor propertyDescriptor, Object model, IUploadFile file)
032 {
033 BlobDescriptorExtension blobDescriptorExtension = getBlobDescriptorExtension(propertyDescriptor);
034
035 byte[] data = new byte[0];
036 InputStream inputStream = file.getStream();
037
038 try
039 {
040 data = IOUtils.toByteArray(inputStream);
041
042 } catch (IOException ioe)
043 {
044 ioe.printStackTrace();
045 }
046
047 if (data.length > 1)
048 {
049 if (blobDescriptorExtension.isBytes())
050 {
051 PropertyUtils.write(model, propertyDescriptor.getName(), data);
052 } else if (blobDescriptorExtension.isITrailsBlob())
053 {
054 ITrailsBlob trailsBlob = (ITrailsBlob) PropertyUtils.read(model, propertyDescriptor.getName());
055
056 if (trailsBlob == null) { //trying to avoid an NPE
057 trailsBlob = new TrailsBlobImpl();
058 PropertyUtils.write(model, propertyDescriptor.getName(), trailsBlob);
059 }
060
061 trailsBlob.setFileName(file.getFileName());
062 trailsBlob.setFilePath(file.getFilePath());
063 trailsBlob.setContentType(file.getContentType());
064 trailsBlob.setBytes(data);
065 }
066 }
067 }
068
069 public byte[] getData(IPropertyDescriptor propertyDescriptor, Object model)
070 {
071 BlobDescriptorExtension blobDescriptorExtension = getBlobDescriptorExtension(propertyDescriptor);
072
073 if (blobDescriptorExtension.isBytes())
074 {
075 return (byte[]) PropertyUtils.read(model, propertyDescriptor.getName());
076
077 } else if (blobDescriptorExtension.isITrailsBlob())
078 {
079 ITrailsBlob trailsBlob = (ITrailsBlob) PropertyUtils.read(model, propertyDescriptor.getName());
080 return trailsBlob != null ? trailsBlob.getBytes() : new byte[0];
081 }
082 return null;
083 }
084
085 public void delete(IPropertyDescriptor propertyDescriptor, Object model)
086 {
087 BlobDescriptorExtension blobDescriptorExtension = getBlobDescriptorExtension(propertyDescriptor);
088
089 if (blobDescriptorExtension.isBytes())
090 {
091 PropertyUtils.write(model, propertyDescriptor.getName(), new byte[0]);
092
093 } else if (blobDescriptorExtension.isITrailsBlob())
094 {
095 ITrailsBlob trailsBlob = (ITrailsBlob) PropertyUtils.read(model, propertyDescriptor.getName());
096 trailsBlob.reset();
097 }
098
099 persistenceService.save(model);
100 }
101
102 public IAsset getAsset(IPropertyDescriptor propertyDescriptor, Object model)
103 {
104 Serializable pk = persistenceService
105 .getIdentifier(model, descriptorService.getClassDescriptor(propertyDescriptor.getBeanType()));
106
107 if (pk != null)
108 {
109 byte[] bytes = getData(propertyDescriptor, model);
110
111 if (bytes != null && bytes.length > 0)
112 {
113 return new TrailsBlobAsset(blobDownloadService, propertyDescriptor, pk);
114 }
115 }
116 return null;
117 }
118
119 public String getContentType(IPropertyDescriptor propertyDescriptor, Object model)
120 {
121 BlobDescriptorExtension blobDescriptorExtension = getBlobDescriptorExtension(propertyDescriptor);
122
123 if (StringUtils.isNotEmpty(blobDescriptorExtension.getFileName()))
124 {
125 return blobDescriptorExtension.getContentType();
126 }
127
128
129 if (blobDescriptorExtension.isITrailsBlob())
130 {
131 ITrailsBlob trailsBlob = (ITrailsBlob) PropertyUtils.read(model, propertyDescriptor.getName());
132 if (trailsBlob != null)
133 {
134 return trailsBlob.getContentType();
135 }
136 }
137
138 return null;
139 }
140
141 public String getFileName(IPropertyDescriptor propertyDescriptor, Object model)
142 {
143 BlobDescriptorExtension blobDescriptorExtension = getBlobDescriptorExtension(propertyDescriptor);
144
145 if (StringUtils.isNotEmpty(blobDescriptorExtension.getFileName()))
146 {
147 return blobDescriptorExtension.getFileName();
148 }
149
150 if (blobDescriptorExtension.isITrailsBlob())
151 {
152 ITrailsBlob trailsBlob = (ITrailsBlob) PropertyUtils.read(model, propertyDescriptor.getName());
153 if (trailsBlob != null)
154 {
155 return trailsBlob.getFileName();
156 }
157 }
158
159 return null;
160 }
161
162 private BlobDescriptorExtension getBlobDescriptorExtension(IPropertyDescriptor propertyDescriptor)
163 {
164 return propertyDescriptor.getExtension(BlobDescriptorExtension.class);
165 }
166
167 public void setPersistenceService(PersistenceService persistenceService)
168 {
169 this.persistenceService = persistenceService;
170 }
171
172 public void setBlobDownloadService(BlobDownloadService blobDownloadService)
173 {
174 this.blobDownloadService = blobDownloadService;
175 }
176
177 public void setDescriptorService(DescriptorService descriptorService)
178 {
179 this.descriptorService = descriptorService;
180 }
181 }