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.