Author: mes
Date: 2011-11-30 16:28:57 -0800 (Wed, 30 Nov 2011)
New Revision: 27673

Added:
   
core3/impl/trunk/ding-impl/ding-customgraphics-manager-impl/src/main/java/org/cytoscape/ding/customgraphicsmgr/
   
core3/impl/trunk/ding-impl/ding-customgraphics-manager-impl/src/main/java/org/cytoscape/ding/customgraphicsmgr/internal/
   
core3/impl/trunk/ding-impl/ding-customgraphics-manager-impl/src/main/java/org/cytoscape/ding/customgraphicsmgr/internal/CustomGraphicsManagerImpl.java
   
core3/impl/trunk/ding-impl/ding-customgraphics-manager-impl/src/main/java/org/cytoscape/ding/customgraphicsmgr/internal/CyActivator.java
   
core3/impl/trunk/ding-impl/ding-customgraphics-manager-impl/src/main/java/org/cytoscape/ding/customgraphicsmgr/internal/PersistImageTask.java
   
core3/impl/trunk/ding-impl/ding-customgraphics-manager-impl/src/main/java/org/cytoscape/ding/customgraphicsmgr/internal/PersistImageTaskFactory.java
   
core3/impl/trunk/ding-impl/ding-customgraphics-manager-impl/src/main/java/org/cytoscape/ding/customgraphicsmgr/internal/RestoreImageTask.java
   
core3/impl/trunk/ding-impl/ding-customgraphics-manager-impl/src/main/java/org/cytoscape/ding/customgraphicsmgr/internal/RestoreImageTaskFactory.java
   
core3/impl/trunk/ding-impl/ding-customgraphics-manager-impl/src/main/java/org/cytoscape/ding/customgraphicsmgr/internal/action/
   
core3/impl/trunk/ding-impl/ding-customgraphics-manager-impl/src/main/java/org/cytoscape/ding/customgraphicsmgr/internal/ui/
Removed:
   
core3/impl/trunk/ding-impl/ding-customgraphics-manager-impl/src/main/java/org/cytoscape/ding/impl/customgraphics/
Modified:
   core3/impl/trunk/ding-impl/ding-customgraphics-manager-impl/osgi.bnd
   core3/impl/trunk/ding-impl/ding-customgraphics-manager-impl/pom.xml
   
core3/impl/trunk/ding-impl/ding-customgraphics-manager-impl/src/main/java/org/cytoscape/ding/customgraphicsmgr/internal/action/CustomGraphicsManagerAction.java
   
core3/impl/trunk/ding-impl/ding-customgraphics-manager-impl/src/main/java/org/cytoscape/ding/customgraphicsmgr/internal/ui/CustomGraphicsBrowser.java
   
core3/impl/trunk/ding-impl/ding-customgraphics-manager-impl/src/main/java/org/cytoscape/ding/customgraphicsmgr/internal/ui/CustomGraphicsCellRenderer.java
   
core3/impl/trunk/ding-impl/ding-customgraphics-manager-impl/src/main/java/org/cytoscape/ding/customgraphicsmgr/internal/ui/CustomGraphicsDetailPanel.java
   
core3/impl/trunk/ding-impl/ding-customgraphics-manager-impl/src/main/java/org/cytoscape/ding/customgraphicsmgr/internal/ui/CustomGraphicsManagerDialog.java
   
core3/impl/trunk/ding-impl/ding-customgraphics-manager-impl/src/main/java/org/cytoscape/ding/customgraphicsmgr/internal/ui/CyCustomGraphicsTableCellRenderer.java
   
core3/impl/trunk/ding-impl/ding-customgraphics-manager-impl/src/main/java/org/cytoscape/ding/customgraphicsmgr/internal/ui/CyCustomGraphicsTreeCellRenderer.java
   
core3/impl/trunk/ding-impl/ding-customgraphics-manager-impl/src/main/java/org/cytoscape/ding/customgraphicsmgr/internal/ui/CyCustomGraphicsTreeNode.java
Log:
changed package name to avoid split package

Modified: core3/impl/trunk/ding-impl/ding-customgraphics-manager-impl/osgi.bnd
===================================================================
--- core3/impl/trunk/ding-impl/ding-customgraphics-manager-impl/osgi.bnd        
2011-12-01 00:08:13 UTC (rev 27672)
+++ core3/impl/trunk/ding-impl/ding-customgraphics-manager-impl/osgi.bnd        
2011-12-01 00:28:57 UTC (rev 27673)
@@ -2,5 +2,5 @@
 # Use this file to add customized Bnd instructions for the bundle
 #-----------------------------------------------------------------
 
-Bundle-Activator: org.cytoscape.ding.impl.customgraphics.CyActivator
+Bundle-Activator: ${bundle.namespace}.CyActivator
 Import-Package: *, org.cytoscape.work.swing

Modified: core3/impl/trunk/ding-impl/ding-customgraphics-manager-impl/pom.xml
===================================================================
--- core3/impl/trunk/ding-impl/ding-customgraphics-manager-impl/pom.xml 
2011-12-01 00:08:13 UTC (rev 27672)
+++ core3/impl/trunk/ding-impl/ding-customgraphics-manager-impl/pom.xml 
2011-12-01 00:28:57 UTC (rev 27673)
@@ -9,7 +9,7 @@
 
        <properties>
                
<bundle.symbolicName>org.cytoscape.ding-customgraphics-manager-impl</bundle.symbolicName>
-               
<bundle.namespace>org.cytoscape.ding.customgraphics</bundle.namespace>
+               
<bundle.namespace>org.cytoscape.ding.customgraphicsmgr.internal</bundle.namespace>
        </properties>
 
        <modelVersion>4.0.0</modelVersion>

Copied: 
core3/impl/trunk/ding-impl/ding-customgraphics-manager-impl/src/main/java/org/cytoscape/ding/customgraphicsmgr/internal/CustomGraphicsManagerImpl.java
 (from rev 27672, 
core3/impl/trunk/ding-impl/ding-customgraphics-manager-impl/src/main/java/org/cytoscape/ding/impl/customgraphics/CustomGraphicsManagerImpl.java)
===================================================================
--- 
core3/impl/trunk/ding-impl/ding-customgraphics-manager-impl/src/main/java/org/cytoscape/ding/customgraphicsmgr/internal/CustomGraphicsManagerImpl.java
                              (rev 0)
+++ 
core3/impl/trunk/ding-impl/ding-customgraphics-manager-impl/src/main/java/org/cytoscape/ding/customgraphicsmgr/internal/CustomGraphicsManagerImpl.java
      2011-12-01 00:28:57 UTC (rev 27673)
@@ -0,0 +1,225 @@
+package org.cytoscape.ding.customgraphicsmgr.internal;
+
+
+import java.io.File;
+import java.net.URL;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+import java.util.SortedSet;
+import java.util.TreeSet;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.cytoscape.application.CyApplicationConfiguration;
+import org.cytoscape.application.events.CytoscapeShutdownEvent;
+import org.cytoscape.application.events.CytoscapeShutdownListener;
+import org.cytoscape.ding.customgraphics.CustomGraphicsManager;
+import org.cytoscape.ding.customgraphics.CyCustomGraphics;
+import org.cytoscape.ding.customgraphics.NullCustomGraphics;
+import org.cytoscape.property.CyProperty;
+import org.cytoscape.work.swing.DialogTaskManager;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public final class CustomGraphicsManagerImpl implements CustomGraphicsManager, 
CytoscapeShutdownListener {
+       private static final Logger logger = 
LoggerFactory.getLogger(CustomGraphicsManagerImpl.class);
+       private static final String IMAGE_DIR_NAME = "images3";
+
+       protected final Map<Long, CyCustomGraphics> graphicsMap = new 
ConcurrentHashMap<Long, CyCustomGraphics>();
+
+       // URL to hash code map. For images associated with URL.
+       protected final Map<URL, Long> sourceMap = new ConcurrentHashMap<URL, 
Long>();
+
+       // Null Object
+       private static final CyCustomGraphics NULL = 
NullCustomGraphics.getNullObject();
+
+       private final File imageHomeDirectory;
+       protected final Map<CyCustomGraphics,Boolean> isUsedCustomGraphics;
+       private final DialogTaskManager taskManager;
+
+       /**
+        * Creates an image pool object and restore existing images from user
+        * resource directory.
+        */
+       public CustomGraphicsManagerImpl(final CyProperty<Properties> 
properties, final DialogTaskManager taskManager, final 
CyApplicationConfiguration config) {
+               
+               this.taskManager = taskManager;
+               this.isUsedCustomGraphics = new HashMap<CyCustomGraphics, 
Boolean>();
+
+               if (properties == null)
+                       throw new NullPointerException("Property object is 
null.");
+
+               final Properties props = properties.getProperties();
+
+               if (props == null)
+                       throw new NullPointerException("Property is missing.");
+
+               this.imageHomeDirectory = new File(config.getSettingLocation(), 
IMAGE_DIR_NAME);
+
+               logger.debug("\n!!!!!!!!!!!!!!!!! Cytoscape image directory: " 
+ imageHomeDirectory.toString());
+
+               graphicsMap.put(NULL.getIdentifier(), NULL);
+               this.isUsedCustomGraphics.put(NULL, false);
+
+               final RestoreImageTaskFactory taskFactory = new 
RestoreImageTaskFactory(imageHomeDirectory, this);
+
+               taskManager.execute(taskFactory);
+       }
+
+
+
+
+       /**
+        * Add a custom graphics to current session.
+        *
+        * @param hash
+        *            : Hasn code of image object
+        * @param graphics
+        *            : Actual custom graphics object
+        * @param source
+        *            : Source URL of graphics (if exists. Can be null)
+        */
+       @Override public void addCustomGraphics(final CyCustomGraphics 
graphics, final URL source) {
+               if (graphics == null)
+                       throw new IllegalArgumentException(
+                                       "Custom Graphics and its ID should not 
be null.");
+
+               // Souce URL is an optional field.
+               if (source != null)
+                       sourceMap.put(source, graphics.getIdentifier());
+
+               graphicsMap.put(graphics.getIdentifier(), graphics);
+               this.isUsedCustomGraphics.put(graphics, false);
+       }
+
+       /**
+        * Remove graphics from current session (memory).
+        *
+        * @param id
+        *            : ID of graphics (hash code)
+        */
+       @Override public void removeCustomGraphics(final Long id) {
+               final CyCustomGraphics cg = graphicsMap.get(id);
+               if (cg != null && cg != NULL) {
+                       graphicsMap.remove(id);
+                       this.isUsedCustomGraphics.remove(cg);
+               }
+       }
+
+       /**
+        * Get a Custom Graphics by integer ID.
+        *
+        * @param hash
+        *            Hash code of Custom Graphics object
+        *
+        * @return Custom Graphics if exists. Otherwise, null.
+        *
+        */
+       @Override public CyCustomGraphics getCustomGraphicsByID(Long id) {
+               return graphicsMap.get(id);
+       }
+
+       /**
+        * Get Custom Graphics by source URL. Images without source cannot be
+        * retreved by this method.
+        *
+        * @param sourceURL
+        * @return
+        */
+       @Override public CyCustomGraphics getCustomGraphicsBySourceURL(final 
URL sourceURL) {
+               final Long id = sourceMap.get(sourceURL);
+               if (id != null)
+                       return graphicsMap.get(id);
+               else
+                       return null;
+       }
+
+       /**
+        * Get a collection of all Custom Graphics in current session.
+        *
+        * @return
+        */
+       @Override public Collection<CyCustomGraphics> getAllCustomGraphics() {
+               return graphicsMap.values();
+       }
+
+       /**
+        * Remove all custom graphics from memory.
+        */
+       @Override public void removeAllCustomGraphics() {
+               this.graphicsMap.clear();
+               this.sourceMap.clear();
+               this.isUsedCustomGraphics.clear();
+
+               // Null Graphics should not be removed.
+               this.graphicsMap.put(NULL.getIdentifier(), NULL);
+
+       }
+
+       /**
+        * Convert current list of custom graphics into Property object.
+        *
+        * @return
+        */
+       @Override public Properties getMetadata() {
+               // Null graphics object should not be in this property.
+               graphicsMap.remove(NULL.getIdentifier());
+
+               final Properties props = new Properties();
+               // Use hash code as the key, and value will be a string 
returned by
+               // toString() method.
+               // This means all CyCustomGraphics implementations should have 
a special
+               // toString method.
+               for (final CyCustomGraphics graphics : graphicsMap.values())
+                       props.setProperty(graphics.getIdentifier().toString(),
+                                       graphics.toString());
+               graphicsMap.put(NULL.getIdentifier(), NULL);
+               return props;
+       }
+
+
+       @Override public SortedSet<Long> getIDSet() {
+               return new TreeSet<Long>(graphicsMap.keySet());
+       }
+
+       @Override public boolean isUsedInCurrentSession(final CyCustomGraphics 
graphics) {
+               if(graphics == null || 
this.isUsedCustomGraphics.containsKey(graphics) == false)
+                       return false;
+
+               return isUsedCustomGraphics.get(graphics);
+       }
+
+       @Override public void setUsedInCurrentSession(final CyCustomGraphics 
graphics, final Boolean isUsed) {
+               if(isUsed == null || graphics == null)
+                       return;
+
+               if(this.isUsedCustomGraphics.containsKey(graphics) == false){
+                       // Just ignore.
+                       return;
+               }
+
+               this.isUsedCustomGraphics.put(graphics, isUsed);
+       }
+
+       @Override
+       public void handleEvent(CytoscapeShutdownEvent e) {
+               // Persist images
+               logger.info("Start Saving images to: " + imageHomeDirectory);
+
+               // Create Task
+               final PersistImageTaskFactory factory = new 
PersistImageTaskFactory(imageHomeDirectory, this);
+
+               try {
+
+                       //FIXME how this section can wait until everything is 
done?
+                       taskManager.execute(factory);
+               } catch (Exception e1) {
+                       logger.error("Could not save images to disk.", e1);
+               }
+
+               logger.info("========== Image saving process finished 
=============");
+
+       }
+}

Copied: 
core3/impl/trunk/ding-impl/ding-customgraphics-manager-impl/src/main/java/org/cytoscape/ding/customgraphicsmgr/internal/CyActivator.java
 (from rev 27672, 
core3/impl/trunk/ding-impl/ding-customgraphics-manager-impl/src/main/java/org/cytoscape/ding/impl/customgraphics/CyActivator.java)
===================================================================
--- 
core3/impl/trunk/ding-impl/ding-customgraphics-manager-impl/src/main/java/org/cytoscape/ding/customgraphicsmgr/internal/CyActivator.java
                            (rev 0)
+++ 
core3/impl/trunk/ding-impl/ding-customgraphics-manager-impl/src/main/java/org/cytoscape/ding/customgraphicsmgr/internal/CyActivator.java
    2011-12-01 00:28:57 UTC (rev 27673)
@@ -0,0 +1,43 @@
+
+
+
+
+package org.cytoscape.ding.customgraphicsmgr.internal;
+
+import org.cytoscape.property.CyProperty;
+import org.cytoscape.work.swing.DialogTaskManager;
+import org.cytoscape.application.CyApplicationManager;
+import org.cytoscape.application.CyApplicationConfiguration;
+
+import org.cytoscape.ding.customgraphicsmgr.internal.CustomGraphicsManagerImpl;
+import 
org.cytoscape.ding.customgraphicsmgr.internal.action.CustomGraphicsManagerAction;
+
+import org.cytoscape.application.swing.CyAction;
+
+
+import org.osgi.framework.BundleContext;
+
+import org.cytoscape.service.util.AbstractCyActivator;
+
+import java.util.Properties;
+
+public class CyActivator extends AbstractCyActivator {
+       public CyActivator() {
+               super();
+       }
+
+       public void start(BundleContext bc) {
+
+               DialogTaskManager dialogTaskManagerServiceRef = 
getService(bc,DialogTaskManager.class);
+               CyProperty coreCyPropertyServiceRef = 
getService(bc,CyProperty.class,"(cyPropertyName=cytoscape3.props)");
+               CyApplicationManager cyApplicationManagerServiceRef = 
getService(bc,CyApplicationManager.class);
+               CyApplicationConfiguration cyApplicationConfigurationServiceRef 
= getService(bc,CyApplicationConfiguration.class);
+               
+               CustomGraphicsManagerImpl customGraphicsManager = new 
CustomGraphicsManagerImpl(coreCyPropertyServiceRef,dialogTaskManagerServiceRef,cyApplicationConfigurationServiceRef);
+               CustomGraphicsManagerAction customGraphicsManagerAction = new 
CustomGraphicsManagerAction(customGraphicsManager,cyApplicationManagerServiceRef);
+               
+               registerAllServices(bc,customGraphicsManager, new Properties());
+               registerService(bc,customGraphicsManagerAction,CyAction.class, 
new Properties());
+       }
+}
+

Copied: 
core3/impl/trunk/ding-impl/ding-customgraphics-manager-impl/src/main/java/org/cytoscape/ding/customgraphicsmgr/internal/PersistImageTask.java
 (from rev 27672, 
core3/impl/trunk/ding-impl/ding-customgraphics-manager-impl/src/main/java/org/cytoscape/ding/impl/customgraphics/PersistImageTask.java)
===================================================================
--- 
core3/impl/trunk/ding-impl/ding-customgraphics-manager-impl/src/main/java/org/cytoscape/ding/customgraphicsmgr/internal/PersistImageTask.java
                               (rev 0)
+++ 
core3/impl/trunk/ding-impl/ding-customgraphics-manager-impl/src/main/java/org/cytoscape/ding/customgraphicsmgr/internal/PersistImageTask.java
       2011-12-01 00:28:57 UTC (rev 27673)
@@ -0,0 +1,147 @@
+package org.cytoscape.ding.customgraphicsmgr.internal;
+
+import java.awt.Image;
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+
+import javax.imageio.ImageIO;
+
+import org.cytoscape.ding.customgraphics.CustomGraphicsManager;
+import org.cytoscape.ding.customgraphics.CyCustomGraphics;
+import org.cytoscape.ding.customgraphics.ImageUtil;
+import org.cytoscape.ding.customgraphics.NullCustomGraphics;
+import org.cytoscape.ding.impl.customgraphics.bitmap.URLImageCustomGraphics;
+import org.cytoscape.work.Task;
+import org.cytoscape.work.TaskMonitor;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class PersistImageTask implements Task {
+
+       private static final Logger logger = LoggerFactory
+                       .getLogger(PersistImageTask.class);
+
+       private final File location;
+       private final CustomGraphicsManager manager;
+
+       private static final int TIMEOUT = 1000;
+       private static final int NUM_THREADS = 4;
+
+       private static final String METADATA_FILE = "image_metadata.props";
+
+       /**
+        * Constructor.<br>
+        * 
+        * @param fileName
+        *            Absolute path to the Session file.
+        */
+       PersistImageTask(final File location, final CustomGraphicsManager 
manager) {
+               this.location = location;
+               this.manager = manager;
+       }
+
+       @Override
+       public void run(TaskMonitor taskMonitor) throws Exception {
+               taskMonitor
+                               .setStatusMessage("Saving image library to your 
local disk.\n\nPlease wait...");
+               taskMonitor.setProgress(0.0);
+
+               // Remove all existing files
+               final File[] files = location.listFiles();
+               if (files != null) {
+                       for (File old : files)
+                               old.delete();
+               }
+
+               final long startTime = System.currentTimeMillis();
+
+               final ExecutorService exService = Executors
+                               .newFixedThreadPool(NUM_THREADS);
+
+               for (final CyCustomGraphics<?> cg : 
manager.getAllCustomGraphics()) {
+
+                       // Save ONLY bitmap image Custom Graphics.
+                       if (cg instanceof NullCustomGraphics
+                                       || cg instanceof URLImageCustomGraphics 
== false)
+                               continue;
+
+                       final Image img = cg.getRenderedImage();
+                       if (img != null) {
+                               try {
+                                       exService.submit(new 
SaveImageTask(location, cg
+                                                       
.getIdentifier().toString(), ImageUtil
+                                                       .toBufferedImage(img)));
+                               } catch (Exception e) {
+                                       e.printStackTrace();
+                               }
+                       }
+
+               }
+
+               try {
+                       exService.shutdown();
+                       exService.awaitTermination(TIMEOUT, TimeUnit.SECONDS);
+               } catch (InterruptedException e) {
+
+                       e.printStackTrace();
+                       throw e;
+               }
+
+               try {
+                       manager.getMetadata().store(
+                                       new FileOutputStream(new File(location, 
METADATA_FILE)),
+                                       "Image Metadata");
+               } catch (IOException e) {
+                       throw new IOException("Could not save image metadata 
file.", e);
+               }
+
+               long endTime = System.currentTimeMillis();
+               double sec = (endTime - startTime) / (1000.0);
+               logger.info("Image saving process finished in " + sec + " 
sec.");
+
+       }
+
+       @Override
+       public void cancel() {
+               // TODO Auto-generated method stub
+
+       }
+
+       private final class SaveImageTask implements Callable<String> {
+               private final File imageHome;
+               private String fileName;
+               private final BufferedImage image;
+
+               public SaveImageTask(final File imageHomeDirectory, String 
fileName,
+                               BufferedImage image) {
+                       this.imageHome = imageHomeDirectory;
+                       this.fileName = fileName;
+                       this.image = image;
+               }
+
+               public String call() throws Exception {
+
+                       logger.debug("  Saving Image: " + fileName);
+
+                       if (!fileName.endsWith(".png"))
+                               fileName += ".png";
+                       File file = new File(imageHome, fileName);
+
+                       try {
+                               file.createNewFile();
+                               ImageIO.write(image, "PNG", file);
+                       } catch (IOException e) {
+                               e.printStackTrace();
+                       }
+
+                       return file.toString();
+               }
+       }
+
+}

Copied: 
core3/impl/trunk/ding-impl/ding-customgraphics-manager-impl/src/main/java/org/cytoscape/ding/customgraphicsmgr/internal/PersistImageTaskFactory.java
 (from rev 27672, 
core3/impl/trunk/ding-impl/ding-customgraphics-manager-impl/src/main/java/org/cytoscape/ding/impl/customgraphics/PersistImageTaskFactory.java)
===================================================================
--- 
core3/impl/trunk/ding-impl/ding-customgraphics-manager-impl/src/main/java/org/cytoscape/ding/customgraphicsmgr/internal/PersistImageTaskFactory.java
                                (rev 0)
+++ 
core3/impl/trunk/ding-impl/ding-customgraphics-manager-impl/src/main/java/org/cytoscape/ding/customgraphicsmgr/internal/PersistImageTaskFactory.java
        2011-12-01 00:28:57 UTC (rev 27673)
@@ -0,0 +1,25 @@
+package org.cytoscape.ding.customgraphicsmgr.internal;
+
+import java.io.File;
+
+import org.cytoscape.ding.customgraphics.CustomGraphicsManager;
+import org.cytoscape.work.TaskFactory;
+import org.cytoscape.work.TaskIterator;
+
+public class PersistImageTaskFactory implements TaskFactory {
+
+       private final File location;
+       private final CustomGraphicsManager manager;
+
+       PersistImageTaskFactory(final File location,
+                       final CustomGraphicsManager manager) {
+               this.manager = manager;
+               this.location = location;
+       }
+
+       @Override
+       public TaskIterator createTaskIterator() {
+               return new TaskIterator(new PersistImageTask(location, 
manager));
+       }
+
+}

Copied: 
core3/impl/trunk/ding-impl/ding-customgraphics-manager-impl/src/main/java/org/cytoscape/ding/customgraphicsmgr/internal/RestoreImageTask.java
 (from rev 27672, 
core3/impl/trunk/ding-impl/ding-customgraphics-manager-impl/src/main/java/org/cytoscape/ding/impl/customgraphics/RestoreImageTask.java)
===================================================================
--- 
core3/impl/trunk/ding-impl/ding-customgraphics-manager-impl/src/main/java/org/cytoscape/ding/customgraphicsmgr/internal/RestoreImageTask.java
                               (rev 0)
+++ 
core3/impl/trunk/ding-impl/ding-customgraphics-manager-impl/src/main/java/org/cytoscape/ding/customgraphicsmgr/internal/RestoreImageTask.java
       2011-12-01 00:28:57 UTC (rev 27673)
@@ -0,0 +1,236 @@
+package org.cytoscape.ding.customgraphicsmgr.internal;
+
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+import java.util.TreeSet;
+import java.util.concurrent.Callable;
+import java.util.concurrent.CompletionService;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorCompletionService;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+
+import javax.imageio.ImageIO;
+
+import org.cytoscape.ding.customgraphics.CyCustomGraphics;
+import org.cytoscape.ding.customgraphics.Taggable;
+import org.cytoscape.ding.impl.customgraphics.AbstractDCustomGraphics;
+import org.cytoscape.ding.impl.customgraphics.bitmap.URLImageCustomGraphics;
+import org.cytoscape.ding.impl.customgraphics.vector.GradientOvalLayer;
+import 
org.cytoscape.ding.impl.customgraphics.vector.GradientRoundRectangleLayer;
+import org.cytoscape.property.CyProperty;
+import org.cytoscape.work.Task;
+import org.cytoscape.work.TaskMonitor;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class RestoreImageTask implements Task {
+       
+       private static final Logger logger = 
LoggerFactory.getLogger(RestoreImageTask.class);
+
+       private final CustomGraphicsManagerImpl manager;
+       
+       private final ExecutorService imageLoaderService;
+       
+       private static final int TIMEOUT = 1000;
+       private static final int NUM_THREADS = 8;
+       
+       private static final String METADATA_FILE = "image_metadata.props";
+
+       private File imageHomeDirectory;
+       
+
+       // For image I/O, PNG is used as bitmap image format.
+       private static final String IMAGE_EXT = "png";
+       
+       // Default vectors
+       private static final Class<?>[] DEF_VECTORS = {
+                       GradientRoundRectangleLayer.class, 
GradientOvalLayer.class };
+       
+       
+       RestoreImageTask(final File imageLocaiton, final 
CustomGraphicsManagerImpl manager) {
+               this.manager = manager;
+               
+               // For loading images in parallel.
+               this.imageLoaderService = 
Executors.newFixedThreadPool(NUM_THREADS);
+               
+               this.imageHomeDirectory = imageLocaiton;
+       }
+       
+       private void restoreDefaultVectorImageObjects() {
+
+               for (Class<?> cls : DEF_VECTORS) {
+
+                       try {
+                               Object obj = cls.newInstance();
+                               if (obj instanceof CyCustomGraphics) {
+                                       manager.graphicsMap.put( 
((CyCustomGraphics) obj).getIdentifier(), (CyCustomGraphics) obj);
+                                       
manager.isUsedCustomGraphics.put((CyCustomGraphics) obj, false);
+                               }
+                       } catch (InstantiationException e) {
+                               throw new RuntimeException(e);
+                       } catch (IllegalAccessException e) {
+                               throw new RuntimeException(e);
+                       }
+               }
+
+       }
+
+       @Override
+       public void run(TaskMonitor taskMonitor) throws Exception {
+               taskMonitor.setStatusMessage("Loading image library from local 
disk.");
+               taskMonitor.setProgress(0.0);
+
+               final long startTime = System.currentTimeMillis();
+
+               restoreImages();
+               restoreDefaultVectorImageObjects();
+
+               long endTime = System.currentTimeMillis();
+               double sec = (endTime - startTime) / (1000.0);
+               logger.info("Image saving process finished in " + sec + " 
sec.");
+
+       }
+       
+       
+       private void restoreImages() {
+               final CompletionService<BufferedImage> cs = new 
ExecutorCompletionService<BufferedImage>(
+                               imageLoaderService);
+
+               imageHomeDirectory.mkdir();
+
+               long startTime = System.currentTimeMillis();
+
+               // Load metadata first.
+               final Properties prop = new Properties();
+               try {
+                       prop.load(new FileInputStream(new 
File(imageHomeDirectory, METADATA_FILE)));
+                       logger.info("Custom Graphics Image property file loaded 
from: " + imageHomeDirectory);
+               } catch (Exception e) {
+                       logger.info("Custom Graphics Metadata was not found. 
(This is normal for the first time.)");
+                       // Restore process is not necessary.
+                       return;
+               }
+
+               if (this.imageHomeDirectory != null && 
imageHomeDirectory.isDirectory()) {
+                       final File[] imageFiles = 
imageHomeDirectory.listFiles();
+                       final Map<Future<BufferedImage>, String> fMap = new 
HashMap<Future<BufferedImage>, String>();
+                       final Map<Future<BufferedImage>, Set<String>> 
metatagMap = new HashMap<Future<BufferedImage>, Set<String>>();
+                       try {
+                               for (File file : imageFiles) {
+                                       if (file.toString().endsWith(IMAGE_EXT) 
== false)
+                                               continue;
+
+                                       final String fileName = file.getName();
+                                       final String key = 
fileName.split("\\.")[0];
+                                       final String value = 
prop.getProperty(key);
+
+                                       final String[] imageProps = 
value.split(",");
+                                       if (imageProps == null || 
imageProps.length < 2)
+                                               continue;
+
+                                       String name = imageProps[2];
+                                       if (name.contains("___"))
+                                               name = name.replace("___", ",");
+
+                                       Future<BufferedImage> f = cs.submit(new 
LoadImageTask(file
+                                                       .toURI().toURL()));
+                                       fMap.put(f, name);
+
+                                       String tagStr = null;
+                                       if (imageProps.length > 3) {
+                                               tagStr = imageProps[3];
+                                               final Set<String> tags = new 
TreeSet<String>();
+                                               String[] tagParts = 
tagStr.split("\\"
+                                                               + 
AbstractDCustomGraphics.LIST_DELIMITER);
+                                               for (String tag : tagParts)
+                                                       tags.add(tag.trim());
+
+                                               metatagMap.put(f, tags);
+                                       }
+                               }
+                               for (File file : imageFiles) {
+                                       if (file.toString().endsWith(IMAGE_EXT) 
== false)
+                                               continue;
+                                       final Future<BufferedImage> f = 
cs.take();
+                                       final BufferedImage image = f.get();
+                                       if (image == null)
+                                               continue;
+                                       
+                                       final CyCustomGraphics cg = new 
URLImageCustomGraphics(
+                                                       fMap.get(f), image);
+                                       if (cg instanceof Taggable && 
metatagMap.get(f) != null)
+                                               ((Taggable) 
cg).getTags().addAll(metatagMap.get(f));
+
+                                       
manager.graphicsMap.put(cg.getIdentifier(), cg);
+                                       manager.isUsedCustomGraphics.put(cg, 
false);
+
+                                       try {
+                                               final URL source = new 
URL(fMap.get(f));
+                                               if (source != null)
+                                                       
manager.sourceMap.put(source, cg.getIdentifier());
+                                       } catch (MalformedURLException me) {
+                                               continue;
+                                       }
+                               }
+
+                       } catch (IOException ioe) {
+                               ioe.printStackTrace();
+                       } catch (InterruptedException e) {
+                               e.printStackTrace();
+                       } catch (ExecutionException e) {
+                               e.printStackTrace();
+                       }
+               }
+
+               try {
+                       imageLoaderService.shutdown();
+                       imageLoaderService.awaitTermination(TIMEOUT, 
TimeUnit.SECONDS);
+               } catch (InterruptedException e) {
+                       e.printStackTrace();
+               }
+
+               long endTime = System.currentTimeMillis();
+               double sec = (endTime - startTime) / (1000.0);
+               logger.info("Image loading process finished in " + sec + " 
sec.");
+               logger.info("Currently,  " + (manager.graphicsMap.size() - 1)
+                               + " images are available.");
+       }
+
+
+       @Override
+       public void cancel() {
+               // TODO Auto-generated method stub
+
+       }
+       
+       private final class LoadImageTask implements Callable<BufferedImage> {
+
+               private final URL imageURL;
+
+               public LoadImageTask(final URL imageURL) {
+                       this.imageURL = imageURL;
+               }
+
+
+               public BufferedImage call() throws Exception {
+                       if (imageURL == null)
+                               throw new IllegalStateException("URL string 
cannot be null.");
+
+                       return ImageIO.read(imageURL);
+               }
+
+       }
+
+
+}

Copied: 
core3/impl/trunk/ding-impl/ding-customgraphics-manager-impl/src/main/java/org/cytoscape/ding/customgraphicsmgr/internal/RestoreImageTaskFactory.java
 (from rev 27672, 
core3/impl/trunk/ding-impl/ding-customgraphics-manager-impl/src/main/java/org/cytoscape/ding/impl/customgraphics/RestoreImageTaskFactory.java)
===================================================================
--- 
core3/impl/trunk/ding-impl/ding-customgraphics-manager-impl/src/main/java/org/cytoscape/ding/customgraphicsmgr/internal/RestoreImageTaskFactory.java
                                (rev 0)
+++ 
core3/impl/trunk/ding-impl/ding-customgraphics-manager-impl/src/main/java/org/cytoscape/ding/customgraphicsmgr/internal/RestoreImageTaskFactory.java
        2011-12-01 00:28:57 UTC (rev 27673)
@@ -0,0 +1,24 @@
+package org.cytoscape.ding.customgraphicsmgr.internal;
+
+import java.io.File;
+
+import org.cytoscape.work.TaskFactory;
+import org.cytoscape.work.TaskIterator;
+
+public class RestoreImageTaskFactory implements TaskFactory {
+       
+       private final File imageLocation;
+       private final CustomGraphicsManagerImpl manager;
+       
+       RestoreImageTaskFactory(final File imageLocation, final 
CustomGraphicsManagerImpl manager) {
+               this.manager = manager;
+               this.imageLocation = imageLocation;
+       }
+
+       @Override
+       public TaskIterator createTaskIterator() {
+               
+               return new TaskIterator(new RestoreImageTask(imageLocation, 
manager));
+       }
+
+}

Modified: 
core3/impl/trunk/ding-impl/ding-customgraphics-manager-impl/src/main/java/org/cytoscape/ding/customgraphicsmgr/internal/action/CustomGraphicsManagerAction.java
===================================================================
--- 
core3/impl/trunk/ding-impl/ding-customgraphics-manager-impl/src/main/java/org/cytoscape/ding/impl/customgraphics/action/CustomGraphicsManagerAction.java
    2011-12-01 00:08:13 UTC (rev 27672)
+++ 
core3/impl/trunk/ding-impl/ding-customgraphics-manager-impl/src/main/java/org/cytoscape/ding/customgraphicsmgr/internal/action/CustomGraphicsManagerAction.java
     2011-12-01 00:28:57 UTC (rev 27673)
@@ -1,4 +1,4 @@
-package org.cytoscape.ding.impl.customgraphics.action;
+package org.cytoscape.ding.customgraphicsmgr.internal.action;
 
 
 import java.awt.event.ActionEvent;
@@ -6,7 +6,7 @@
 import org.cytoscape.application.CyApplicationManager;
 import org.cytoscape.application.swing.AbstractCyAction;
 import org.cytoscape.ding.customgraphics.CustomGraphicsManager;
-import org.cytoscape.ding.impl.customgraphics.ui.CustomGraphicsManagerDialog;
+import 
org.cytoscape.ding.customgraphicsmgr.internal.ui.CustomGraphicsManagerDialog;
 
 
 public class CustomGraphicsManagerAction extends AbstractCyAction {

Modified: 
core3/impl/trunk/ding-impl/ding-customgraphics-manager-impl/src/main/java/org/cytoscape/ding/customgraphicsmgr/internal/ui/CustomGraphicsBrowser.java
===================================================================
--- 
core3/impl/trunk/ding-impl/ding-customgraphics-manager-impl/src/main/java/org/cytoscape/ding/impl/customgraphics/ui/CustomGraphicsBrowser.java
      2011-12-01 00:08:13 UTC (rev 27672)
+++ 
core3/impl/trunk/ding-impl/ding-customgraphics-manager-impl/src/main/java/org/cytoscape/ding/customgraphicsmgr/internal/ui/CustomGraphicsBrowser.java
       2011-12-01 00:28:57 UTC (rev 27673)
@@ -1,4 +1,4 @@
-package org.cytoscape.ding.impl.customgraphics.ui;
+package org.cytoscape.ding.customgraphicsmgr.internal.ui;
 
 import java.awt.Dimension;
 import java.awt.datatransfer.DataFlavor;

Modified: 
core3/impl/trunk/ding-impl/ding-customgraphics-manager-impl/src/main/java/org/cytoscape/ding/customgraphicsmgr/internal/ui/CustomGraphicsCellRenderer.java
===================================================================
--- 
core3/impl/trunk/ding-impl/ding-customgraphics-manager-impl/src/main/java/org/cytoscape/ding/impl/customgraphics/ui/CustomGraphicsCellRenderer.java
 2011-12-01 00:08:13 UTC (rev 27672)
+++ 
core3/impl/trunk/ding-impl/ding-customgraphics-manager-impl/src/main/java/org/cytoscape/ding/customgraphicsmgr/internal/ui/CustomGraphicsCellRenderer.java
  2011-12-01 00:28:57 UTC (rev 27673)
@@ -1,4 +1,4 @@
-package org.cytoscape.ding.impl.customgraphics.ui;
+package org.cytoscape.ding.customgraphicsmgr.internal.ui;
 
 import java.awt.Color;
 import java.awt.Component;

Modified: 
core3/impl/trunk/ding-impl/ding-customgraphics-manager-impl/src/main/java/org/cytoscape/ding/customgraphicsmgr/internal/ui/CustomGraphicsDetailPanel.java
===================================================================
--- 
core3/impl/trunk/ding-impl/ding-customgraphics-manager-impl/src/main/java/org/cytoscape/ding/impl/customgraphics/ui/CustomGraphicsDetailPanel.java
  2011-12-01 00:08:13 UTC (rev 27672)
+++ 
core3/impl/trunk/ding-impl/ding-customgraphics-manager-impl/src/main/java/org/cytoscape/ding/customgraphicsmgr/internal/ui/CustomGraphicsDetailPanel.java
   2011-12-01 00:28:57 UTC (rev 27673)
@@ -1,4 +1,4 @@
-package org.cytoscape.ding.impl.customgraphics.ui;
+package org.cytoscape.ding.customgraphicsmgr.internal.ui;
 
 import java.awt.Image;
 import java.util.Collection;

Modified: 
core3/impl/trunk/ding-impl/ding-customgraphics-manager-impl/src/main/java/org/cytoscape/ding/customgraphicsmgr/internal/ui/CustomGraphicsManagerDialog.java
===================================================================
--- 
core3/impl/trunk/ding-impl/ding-customgraphics-manager-impl/src/main/java/org/cytoscape/ding/impl/customgraphics/ui/CustomGraphicsManagerDialog.java
        2011-12-01 00:08:13 UTC (rev 27672)
+++ 
core3/impl/trunk/ding-impl/ding-customgraphics-manager-impl/src/main/java/org/cytoscape/ding/customgraphicsmgr/internal/ui/CustomGraphicsManagerDialog.java
 2011-12-01 00:28:57 UTC (rev 27673)
@@ -1,4 +1,4 @@
-package org.cytoscape.ding.impl.customgraphics.ui;
+package org.cytoscape.ding.customgraphicsmgr.internal.ui;
 
 import java.awt.Dimension;
 import java.awt.Frame;
@@ -17,7 +17,7 @@
 import org.cytoscape.application.CyApplicationManager;
 import org.cytoscape.ding.customgraphics.CustomGraphicsManager;
 import org.cytoscape.ding.customgraphics.CyCustomGraphics;
-import org.cytoscape.ding.impl.customgraphics.CustomGraphicsManagerImpl;
+import org.cytoscape.ding.customgraphicsmgr.internal.CustomGraphicsManagerImpl;
 import org.cytoscape.ding.impl.customgraphics.bitmap.URLImageCustomGraphics;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;

Modified: 
core3/impl/trunk/ding-impl/ding-customgraphics-manager-impl/src/main/java/org/cytoscape/ding/customgraphicsmgr/internal/ui/CyCustomGraphicsTableCellRenderer.java
===================================================================
--- 
core3/impl/trunk/ding-impl/ding-customgraphics-manager-impl/src/main/java/org/cytoscape/ding/impl/customgraphics/ui/CyCustomGraphicsTableCellRenderer.java
  2011-12-01 00:08:13 UTC (rev 27672)
+++ 
core3/impl/trunk/ding-impl/ding-customgraphics-manager-impl/src/main/java/org/cytoscape/ding/customgraphicsmgr/internal/ui/CyCustomGraphicsTableCellRenderer.java
   2011-12-01 00:28:57 UTC (rev 27673)
@@ -1,4 +1,4 @@
-package org.cytoscape.ding.impl.customgraphics.ui;
+package org.cytoscape.ding.customgraphicsmgr.internal.ui;
 
 import java.awt.Component;
 

Modified: 
core3/impl/trunk/ding-impl/ding-customgraphics-manager-impl/src/main/java/org/cytoscape/ding/customgraphicsmgr/internal/ui/CyCustomGraphicsTreeCellRenderer.java
===================================================================
--- 
core3/impl/trunk/ding-impl/ding-customgraphics-manager-impl/src/main/java/org/cytoscape/ding/impl/customgraphics/ui/CyCustomGraphicsTreeCellRenderer.java
   2011-12-01 00:08:13 UTC (rev 27672)
+++ 
core3/impl/trunk/ding-impl/ding-customgraphics-manager-impl/src/main/java/org/cytoscape/ding/customgraphicsmgr/internal/ui/CyCustomGraphicsTreeCellRenderer.java
    2011-12-01 00:28:57 UTC (rev 27673)
@@ -1,4 +1,4 @@
-package org.cytoscape.ding.impl.customgraphics.ui;
+package org.cytoscape.ding.customgraphicsmgr.internal.ui;
 
 import java.awt.Component;
 

Modified: 
core3/impl/trunk/ding-impl/ding-customgraphics-manager-impl/src/main/java/org/cytoscape/ding/customgraphicsmgr/internal/ui/CyCustomGraphicsTreeNode.java
===================================================================
--- 
core3/impl/trunk/ding-impl/ding-customgraphics-manager-impl/src/main/java/org/cytoscape/ding/impl/customgraphics/ui/CyCustomGraphicsTreeNode.java
   2011-12-01 00:08:13 UTC (rev 27672)
+++ 
core3/impl/trunk/ding-impl/ding-customgraphics-manager-impl/src/main/java/org/cytoscape/ding/customgraphicsmgr/internal/ui/CyCustomGraphicsTreeNode.java
    2011-12-01 00:28:57 UTC (rev 27673)
@@ -1,4 +1,4 @@
-package org.cytoscape.ding.impl.customgraphics.ui;
+package org.cytoscape.ding.customgraphicsmgr.internal.ui;
 
 import java.util.List;
 

-- 
You received this message because you are subscribed to the Google Groups 
"cytoscape-cvs" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/cytoscape-cvs?hl=en.

Reply via email to