]> git.argeo.org Git - gpl/argeo-slc.git/blobdiff - runtime/org.argeo.slc.core/src/main/java/org/argeo/slc/core/attachment/FileAttachmentsStorage.java
Restructure modules
[gpl/argeo-slc.git] / runtime / org.argeo.slc.core / src / main / java / org / argeo / slc / core / attachment / FileAttachmentsStorage.java
diff --git a/runtime/org.argeo.slc.core/src/main/java/org/argeo/slc/core/attachment/FileAttachmentsStorage.java b/runtime/org.argeo.slc.core/src/main/java/org/argeo/slc/core/attachment/FileAttachmentsStorage.java
new file mode 100644 (file)
index 0000000..0e70805
--- /dev/null
@@ -0,0 +1,77 @@
+package org.argeo.slc.core.attachment;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+import org.apache.commons.io.IOUtils;
+import org.argeo.slc.SlcException;
+
+public class FileAttachmentsStorage implements AttachmentsStorage {
+       private File attachmentsDirectory;
+
+       public FileAttachmentsStorage() {
+               String osgiInstanceArea = System.getProperty("osgi.instance.area");
+               if (osgiInstanceArea != null) {
+                       if (osgiInstanceArea.startsWith("file:"))
+                               osgiInstanceArea = osgiInstanceArea.substring("file:".length());
+                       attachmentsDirectory = new File(osgiInstanceArea + File.separator
+                                       + "slcAttachments");
+               }
+
+               if (attachmentsDirectory == null) {
+                       String tempDir = System.getProperty("java.io.tmpdir");
+                       attachmentsDirectory = new File(tempDir + File.separator
+                                       + "slcAttachments");
+               }
+       }
+
+       public void retrieveAttachment(Attachment attachment,
+                       OutputStream outputStream) {
+               File file = getFile(attachment);
+               InputStream in = null;
+               try {
+                       byte[] buffer = new byte[1024 * 1024];
+                       in = new FileInputStream(file);
+                       int read = -1;
+                       while ((read = in.read(buffer)) >= 0) {
+                               outputStream.write(buffer, 0, read);
+                       }
+               } catch (IOException e) {
+                       throw new SlcException("Cannot write attachment " + attachment
+                                       + " to " + file, e);
+               } finally {
+                       IOUtils.closeQuietly(in);
+               }
+       }
+
+       public void storeAttachment(Attachment attachment, InputStream inputStream) {
+               File file = getFile(attachment);
+               FileOutputStream out = null;
+               try {
+                       byte[] buffer = new byte[1024 * 1024];
+                       out = new FileOutputStream(file);
+                       int read = -1;
+                       while ((read = inputStream.read(buffer)) >= 0) {
+                               out.write(buffer, 0, read);
+                       }
+               } catch (IOException e) {
+                       throw new SlcException("Cannot write attachment " + attachment
+                                       + " to " + file, e);
+               } finally {
+                       IOUtils.closeQuietly(out);
+               }
+
+       }
+
+       protected File getFile(Attachment attachment) {
+               if (!attachmentsDirectory.exists())
+                       attachmentsDirectory.mkdirs();
+               File file = new File(attachmentsDirectory + File.separator
+                               + attachment.getUuid());
+               return file;
+       }
+}