--- /dev/null
+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;
+ }
+}