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    }