package org.tynamo.blob; import org.apache.commons.io.IOUtils; import org.apache.commons.lang.StringUtils; import org.apache.tapestry5.Link; import org.apache.tapestry5.ioc.services.PropertyAccess; import org.apache.tapestry5.services.PageRenderLinkSource; import org.apache.tapestry5.upload.services.UploadedFile; import org.tynamo.builder.BuilderDirector; import org.tynamo.descriptor.TynamoPropertyDescriptor; import org.tynamo.descriptor.extension.BlobDescriptorExtension; import org.tynamo.descriptor.extension.TynamoBlob; import org.tynamo.services.PersistenceService; import java.io.IOException; import java.io.InputStream; /** * The Tynamo {@link BlobManager} default implementation. */ public class BlobManagerImpl implements BlobManager { private PersistenceService persistenceService; private PropertyAccess propertyAccess; private PageRenderLinkSource pageRenderLinkSource; private BuilderDirector builderDirector; public BlobManagerImpl(PersistenceService persistenceService, PropertyAccess propertyAccess, PageRenderLinkSource pageRenderLinkSource, BuilderDirector builderDirector) { this.persistenceService = persistenceService; this.propertyAccess = propertyAccess; this.pageRenderLinkSource = pageRenderLinkSource; this.builderDirector = builderDirector; } public void store(TynamoPropertyDescriptor propertyDescriptor, Object model, UploadedFile file) { BlobDescriptorExtension blobDescriptorExtension = getBlobDescriptorExtension(propertyDescriptor); byte[] data = new byte[0]; InputStream inputStream = file.getStream(); try { data = IOUtils.toByteArray(inputStream); } catch (IOException ioe) { ioe.printStackTrace(); } if (data.length > 1) { if (blobDescriptorExtension.isBytes()) { propertyAccess.set(model, propertyDescriptor.getName(), data); } else if (blobDescriptorExtension.isITynamoBlob()) { TynamoBlob tynamoBlob = (TynamoBlob) propertyAccess.get(model, propertyDescriptor.getName()); if (tynamoBlob == null) { //trying to avoid an NPE tynamoBlob = (TynamoBlob) builderDirector.createNewInstance(propertyDescriptor.getPropertyType()); propertyAccess.set(model, propertyDescriptor.getName(), tynamoBlob); } tynamoBlob.setFileName(file.getFileName()); tynamoBlob.setFilePath(file.getFilePath()); tynamoBlob.setContentType(file.getContentType()); tynamoBlob.setBytes(data); } } } public byte[] getData(TynamoPropertyDescriptor propertyDescriptor, Object model) { BlobDescriptorExtension blobDescriptorExtension = getBlobDescriptorExtension(propertyDescriptor); if (blobDescriptorExtension.isBytes()) { return (byte[]) propertyAccess.get(model, propertyDescriptor.getName()); } else if (blobDescriptorExtension.isITynamoBlob()) { TynamoBlob tynamoBlob = (TynamoBlob) propertyAccess.get(model, propertyDescriptor.getName()); return tynamoBlob != null ? tynamoBlob.getBytes() : new byte[0]; } return null; } public void delete(TynamoPropertyDescriptor propertyDescriptor, Object model) { BlobDescriptorExtension blobDescriptorExtension = getBlobDescriptorExtension(propertyDescriptor); if (blobDescriptorExtension.isBytes()) { propertyAccess.set(model, propertyDescriptor.getName(), new byte[0]); } else if (blobDescriptorExtension.isITynamoBlob()) { TynamoBlob tynamoBlob = (TynamoBlob) propertyAccess.get(model, propertyDescriptor.getName()); tynamoBlob.reset(); } persistenceService.save(model); } public Link createBlobLink(TynamoPropertyDescriptor propertyDescriptor, Object model) { return pageRenderLinkSource .createPageRenderLinkWithContext("tynamo/Blob", propertyDescriptor.getBeanType(), model, propertyDescriptor.getName()); } public String getContentType(TynamoPropertyDescriptor propertyDescriptor, Object model) { BlobDescriptorExtension blobDescriptorExtension = getBlobDescriptorExtension(propertyDescriptor); if (blobDescriptorExtension.isITynamoBlob()) { TynamoBlob tynamoBlob = (TynamoBlob) propertyAccess.get(model, propertyDescriptor.getName()); if (tynamoBlob != null) { return tynamoBlob.getContentType(); } } return blobDescriptorExtension.getContentType(); } public String getFileName(TynamoPropertyDescriptor propertyDescriptor, Object model) { BlobDescriptorExtension blobDescriptorExtension = getBlobDescriptorExtension(propertyDescriptor); if (StringUtils.isNotEmpty(blobDescriptorExtension.getFileName())) { return blobDescriptorExtension.getFileName(); } if (blobDescriptorExtension.isITynamoBlob()) { TynamoBlob tynamoBlob = (TynamoBlob) propertyAccess.get(model, propertyDescriptor.getName()); if (tynamoBlob != null) { return tynamoBlob.getFileName(); } } return null; } public boolean isNotNull(TynamoPropertyDescriptor propertyDescriptor, Object model) { if (model != null) { BlobDescriptorExtension blobDescriptorExtension = getBlobDescriptorExtension(propertyDescriptor); byte[] bytes = null; if (blobDescriptorExtension.isITynamoBlob()) { TynamoBlob tynamoBlob = (TynamoBlob) propertyAccess.get(model, propertyDescriptor.getName()); bytes = tynamoBlob != null ? tynamoBlob.getBytes() : null; } else if (blobDescriptorExtension.isBytes()) { bytes = (byte[]) propertyAccess.get(model, propertyDescriptor.getName()); } return bytes != null && bytes.length > 0; } return false; } private BlobDescriptorExtension getBlobDescriptorExtension(TynamoPropertyDescriptor propertyDescriptor) { return propertyDescriptor.getExtension(BlobDescriptorExtension.class); } }