]> git.argeo.org Git - lgpl/argeo-commons.git/blobdiff - org.argeo.jcr/src/org/argeo/jcr/fs/BinaryChannel.java
Working file drop
[lgpl/argeo-commons.git] / org.argeo.jcr / src / org / argeo / jcr / fs / BinaryChannel.java
index b90bb900ae129827768f277831a86e17a128f018..94eb70482b6751ba3b7d62b98b138acab37a891f 100644 (file)
@@ -12,6 +12,8 @@ import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.StandardOpenOption;
 
+import javax.activation.FileTypeMap;
+import javax.activation.MimetypesFileTypeMap;
 import javax.jcr.Binary;
 import javax.jcr.Node;
 import javax.jcr.Property;
@@ -19,7 +21,6 @@ import javax.jcr.RepositoryException;
 import javax.jcr.Session;
 import javax.jcr.nodetype.NodeType;
 
-import org.apache.commons.io.IOUtils;
 import org.argeo.jcr.JcrUtils;
 
 public class BinaryChannel implements SeekableByteChannel {
@@ -32,6 +33,16 @@ public class BinaryChannel implements SeekableByteChannel {
        // private ByteBuffer toWrite;
        private FileChannel fc = null;
 
+       private static FileTypeMap fileTypeMap;
+
+       static {
+               try {
+                       fileTypeMap = new MimetypesFileTypeMap("/etc/mime.types");
+               } catch (IOException e) {
+                       fileTypeMap = FileTypeMap.getDefaultFileTypeMap();
+               }
+       }
+
        public BinaryChannel(Node file) throws RepositoryException, IOException {
                this.file = file;
                // int capacity = 1024 * 1024;
@@ -46,6 +57,11 @@ public class BinaryChannel implements SeekableByteChannel {
                                        this.binary = data.getSession().getValueFactory().createBinary(in);
                                }
                                data.setProperty(Property.JCR_DATA, this.binary);
+
+                               // MIME type
+                               String mime = fileTypeMap.getContentType(file.getName());
+                               data.setProperty(Property.JCR_MIMETYPE, mime);
+
                                data.getSession().save();
                        }
                } else {
@@ -75,10 +91,13 @@ public class BinaryChannel implements SeekableByteChannel {
                                session.save();
                                open = false;
                        } catch (RepositoryException e) {
-                               throw new JcrFsException("Cannot close " + file, e);
+                               throw new IOException("Cannot close " + file, e);
                        } finally {
                                JcrUtils.closeQuietly(newBinary);
-                               IOUtils.closeQuietly(fc);
+                               // IOUtils.closeQuietly(fc);
+                               if (fc != null) {
+                                       fc.close();
+                               }
                        }
                } else {
                        clearReadState();
@@ -112,7 +131,7 @@ public class BinaryChannel implements SeekableByteChannel {
                                        position = position + read;
                                return read;
                        } catch (RepositoryException e) {
-                               throw new JcrFsException("Cannot read into buffer", e);
+                               throw new IOException("Cannot read into buffer", e);
                        }
                }
        }
@@ -158,7 +177,7 @@ public class BinaryChannel implements SeekableByteChannel {
                        try {
                                return binary.getSize();
                        } catch (RepositoryException e) {
-                               throw new JcrFsException("Cannot get size", e);
+                               throw new IOException("Cannot get size", e);
                        }
                }
        }
@@ -184,7 +203,7 @@ public class BinaryChannel implements SeekableByteChannel {
                        }
                        return fc;
                } catch (RepositoryException e) {
-                       throw new JcrFsException("Cannot get temp file channel", e);
+                       throw new IOException("Cannot get temp file channel", e);
                }
        }