From b42e12ae4f2fd6058a4ed3f0ae876eb24880ec4a Mon Sep 17 00:00:00 2001
From: Raphael Girardot <raphael.girardot@synchrotron-soleil.fr>
Date: Mon, 3 Feb 2014 09:56:34 +0000
Subject: [PATCH] Perspective saving and loading managed by factory (Jira:
 JAVAAPI-120)

---
 .../docking/perspective/FilePerspective.java  |   3 +-
 .../perspective/IPerspectiveFactory.java      |  10 ++
 .../docking/perspective/Perspective.java      |  21 ----
 .../perspective/PerspectiveFactory.java       | 114 +++++++++++++++---
 .../perspective/ResourcePerspective.java      |   3 +-
 5 files changed, 108 insertions(+), 43 deletions(-)

diff --git a/dockingcore/src/main/java/fr/soleil/docking/perspective/FilePerspective.java b/dockingcore/src/main/java/fr/soleil/docking/perspective/FilePerspective.java
index 723d1d6..ec25406 100644
--- a/dockingcore/src/main/java/fr/soleil/docking/perspective/FilePerspective.java
+++ b/dockingcore/src/main/java/fr/soleil/docking/perspective/FilePerspective.java
@@ -12,6 +12,7 @@ import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 
+@Deprecated
 public class FilePerspective extends Perspective {
 
     public FilePerspective(String name, File file) throws IOException {
@@ -19,7 +20,7 @@ public class FilePerspective extends Perspective {
         if ((file != null) && (file.isFile())) {
             InputStream in = new FileInputStream(file);
             if (in != null) {
-                byteArray = readByteArray(in);
+                byteArray = PerspectiveFactory.readByteArray(in);
             }
         }
     }
diff --git a/dockingcore/src/main/java/fr/soleil/docking/perspective/IPerspectiveFactory.java b/dockingcore/src/main/java/fr/soleil/docking/perspective/IPerspectiveFactory.java
index bc972e6..369aa8f 100644
--- a/dockingcore/src/main/java/fr/soleil/docking/perspective/IPerspectiveFactory.java
+++ b/dockingcore/src/main/java/fr/soleil/docking/perspective/IPerspectiveFactory.java
@@ -59,6 +59,8 @@ public interface IPerspectiveFactory {
 
     public void saveSelected(File file) throws DockingException;
 
+    public void savePerspective(File file, IPerspective perspective) throws DockingException;
+
     public void addPropertyChangeListener(PropertyChangeListener propertyChangeListener);
 
     public void removePropertyChangeListener(PropertyChangeListener propertyChangeListener);
@@ -71,4 +73,12 @@ public interface IPerspectiveFactory {
 
     public IPerspective[] getPerspectives();
 
+    public IPerspective loadPerspectiveFromFile(File perspectiveFile, String perpectiveName) throws DockingException;
+
+    public void loadFileInPerspective(File perspectiveFile, IPerspective perspective) throws DockingException;
+
+    public IPerspective loadPerspectiveFromResource(String resource, String perpectiveName) throws DockingException;
+
+    public void loadResourceInPerspective(String resource, IPerspective perspective) throws DockingException;
+
 }
diff --git a/dockingcore/src/main/java/fr/soleil/docking/perspective/Perspective.java b/dockingcore/src/main/java/fr/soleil/docking/perspective/Perspective.java
index 8fb7f95..89ad8d9 100644
--- a/dockingcore/src/main/java/fr/soleil/docking/perspective/Perspective.java
+++ b/dockingcore/src/main/java/fr/soleil/docking/perspective/Perspective.java
@@ -3,8 +3,6 @@
  */
 package fr.soleil.docking.perspective;
 
-import java.io.IOException;
-import java.io.InputStream;
 
 public class Perspective implements IPerspective {
     private final String name;
@@ -35,23 +33,4 @@ public class Perspective implements IPerspective {
         return this.name;
     }
 
-    /**
-     * Reads a <code>byte</code> array from an {@link InputStream} and returns it
-     * 
-     * @param in The {@link InputStream}
-     * @return A <code>byte[]</code>
-     * @throws IOException If a problem occurred while trying to read the {@link InputStream}
-     */
-    protected byte[] readByteArray(InputStream in) throws IOException {
-        byte[] result = null;
-        if (in != null) {
-            result = new byte[in.available()];
-            int length = in.read(result);
-            if (length != result.length) {
-                result = null;
-            }
-        }
-        return result;
-    }
-
 }
\ No newline at end of file
diff --git a/dockingcore/src/main/java/fr/soleil/docking/perspective/PerspectiveFactory.java b/dockingcore/src/main/java/fr/soleil/docking/perspective/PerspectiveFactory.java
index dba8a20..38d4662 100644
--- a/dockingcore/src/main/java/fr/soleil/docking/perspective/PerspectiveFactory.java
+++ b/dockingcore/src/main/java/fr/soleil/docking/perspective/PerspectiveFactory.java
@@ -10,7 +10,10 @@ package fr.soleil.docking.perspective;
 import java.beans.PropertyChangeListener;
 import java.beans.PropertyChangeSupport;
 import java.io.File;
+import java.io.FileInputStream;
 import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.prefs.BackingStoreException;
@@ -171,33 +174,40 @@ public class PerspectiveFactory implements IPerspectiveFactory {
 
     @Override
     public void saveSelected(File file) throws DockingException {
-        DockingException dockingException = null;
-        FileOutputStream out = null;
-        try {
-            out = new FileOutputStream(file);
+        savePerspective(file, selectedPerspective);
+    }
+
+    @Override
+    public void savePerspective(File file, IPerspective perspective) throws DockingException {
+        if ((file != null) && (perspective != null)) {
+            DockingException dockingException = null;
+            FileOutputStream out = null;
             try {
-                out.write(selectedPerspective.getByteArray());
-            } catch (Exception e) {
-                if (dockingException == null) {
-                    dockingException = new DockingException("Error during file writing", e);
-                }
-            } finally {
+                out = new FileOutputStream(file);
                 try {
-                    out.close();
+                    out.write(perspective.getByteArray());
                 } catch (Exception e) {
                     if (dockingException == null) {
-                        dockingException = new DockingException("Error while releasing file access", e);
+                        dockingException = new DockingException("Error during file writing", e);
+                    }
+                } finally {
+                    try {
+                        out.close();
+                    } catch (Exception e) {
+                        if (dockingException == null) {
+                            dockingException = new DockingException("Error while releasing file access", e);
+                        }
                     }
                 }
+            } catch (Exception e) {
+                if (dockingException == null) {
+                    dockingException = new DockingException("Error during file access", e);
+                }
             }
-        } catch (Exception e) {
-            if (dockingException == null) {
-                dockingException = new DockingException("Error during file access", e);
+            if (dockingException != null) {
+                throw dockingException;
             }
         }
-        if (dockingException != null) {
-            throw dockingException;
-        }
     }
 
     /**
@@ -237,8 +247,7 @@ public class PerspectiveFactory implements IPerspectiveFactory {
         } else {
             index = perspectives.indexOf(p);
         }
-        if ((index > -1) && (!(p instanceof ResourcePerspective))
-                && (!ObjectUtils.sameObject(p.getName(), defaultPerspectiveName))) {
+        if ((index > -1) && (!ObjectUtils.sameObject(p.getName(), defaultPerspectiveName))) {
             // Exist and it's not the default perspective
             perspectives.remove(index);
             support.fireIndexedPropertyChange(PERSPECTIVES, index, p, null);
@@ -250,4 +259,69 @@ public class PerspectiveFactory implements IPerspectiveFactory {
         return this.removePerspective(this.getPerspective(name));
     }
 
+    /**
+     * Reads a <code>byte</code> array from an {@link InputStream} and returns it
+     * 
+     * @param in The {@link InputStream}
+     * @return A <code>byte[]</code>
+     * @throws IOException If a problem occurred while trying to read the {@link InputStream}
+     */
+    protected static byte[] readByteArray(InputStream in) throws IOException {
+        byte[] result = null;
+        if (in != null) {
+            result = new byte[in.available()];
+            int length = in.read(result);
+            if (length != result.length) {
+                result = null;
+            }
+        }
+        return result;
+    }
+
+    @Override
+    public IPerspective loadPerspectiveFromFile(File perspectiveFile, String perpectiveName) throws DockingException {
+        Perspective perspective;
+        if (perpectiveName == null) {
+            perspective = null;
+        } else {
+            perspective = new Perspective(perpectiveName);
+        }
+        loadFileInPerspective(perspectiveFile, perspective);
+        return perspective;
+    }
+
+    @Override
+    public void loadFileInPerspective(File perspectiveFile, IPerspective perspective) throws DockingException {
+        if ((perspectiveFile != null) && perspectiveFile.isFile() && (perspective != null)) {
+            try {
+                perspective.setByteArray(readByteArray(new FileInputStream(perspectiveFile)));
+            } catch (Exception e) {
+                throw new DockingException("Error during file reading", e);
+            }
+        }
+    }
+
+    @Override
+    public IPerspective loadPerspectiveFromResource(String resource, String perpectiveName) throws DockingException {
+        Perspective perspective;
+        if (perpectiveName == null) {
+            perspective = null;
+        } else {
+            perspective = new Perspective(perpectiveName);
+        }
+        loadResourceInPerspective(resource, perspective);
+        return perspective;
+    }
+
+    @Override
+    public void loadResourceInPerspective(String resource, IPerspective perspective) throws DockingException {
+        if ((resource != null) && (!resource.trim().isEmpty()) && (perspective != null)) {
+            try {
+                perspective.setByteArray(readByteArray(getClass().getResourceAsStream(resource)));
+            } catch (Exception e) {
+                throw new DockingException("Error during resource reading", e);
+            }
+        }
+    }
+
 }
diff --git a/dockingcore/src/main/java/fr/soleil/docking/perspective/ResourcePerspective.java b/dockingcore/src/main/java/fr/soleil/docking/perspective/ResourcePerspective.java
index f90d5b1..cd2be16 100644
--- a/dockingcore/src/main/java/fr/soleil/docking/perspective/ResourcePerspective.java
+++ b/dockingcore/src/main/java/fr/soleil/docking/perspective/ResourcePerspective.java
@@ -10,13 +10,14 @@ package fr.soleil.docking.perspective;
 import java.io.IOException;
 import java.io.InputStream;
 
+@Deprecated
 public class ResourcePerspective extends Perspective {
 
     public ResourcePerspective(String name, String resource) throws IOException {
         super(name);
         InputStream in = ResourcePerspective.this.getClass().getResourceAsStream(resource);
         if (in != null) {
-            byteArray = readByteArray(in);
+            byteArray = PerspectiveFactory.readByteArray(in);
         }
     }
 
-- 
GitLab