Author: paperwing
Date: 2012-07-03 13:06:59 -0700 (Tue, 03 Jul 2012)
New Revision: 29748

Modified:
   
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/CyActivator.java
   
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/action/AppManagerAction.java
   
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/manager/AppManager.java
   
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/manager/AppParser.java
   
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/ui/InstallFromStorePanel.java
Log:
Installing apps from previous session no longer causes bundle apps to be parsed 
twice, no longer throws exception when exiting Cytoscape while app manager 
dialog is open

Modified: 
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/CyActivator.java
===================================================================
--- 
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/CyActivator.java
 2012-07-03 19:16:52 UTC (rev 29747)
+++ 
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/CyActivator.java
 2012-07-03 20:06:59 UTC (rev 29748)
@@ -356,9 +356,10 @@
                appManager.setFeaturesService(featuresService);
                
                // AbstractCyAction implementation for updated app manager
-               AppManagerAction appManagerAction2 = new 
AppManagerAction(appManager, cySwingApplicationRef, fileUtilServiceRef, 
dialogTaskManagerRef);
-               registerService(bc, appManagerAction2, CyAction.class, new 
Properties());
-       
+               AppManagerAction appManagerAction = new 
AppManagerAction(appManager, cySwingApplicationRef, 
+                               fileUtilServiceRef, dialogTaskManagerRef, 
cyServiceRegistrarRef);
+               registerService(bc, appManagerAction, CyAction.class, new 
Properties());
+               
                // Start thread for local server that reports app installation 
status to the app store when requested,
                // also able to install an app when told by the app store
                Thread serverThread = new Thread() {

Modified: 
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/action/AppManagerAction.java
===================================================================
--- 
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/action/AppManagerAction.java
     2012-07-03 19:16:52 UTC (rev 29747)
+++ 
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/action/AppManagerAction.java
     2012-07-03 20:06:59 UTC (rev 29748)
@@ -1,6 +1,7 @@
 package org.cytoscape.app.internal.action;
 
 import java.awt.event.ActionEvent;
+import java.util.Properties;
 import java.util.Set;
 import java.util.concurrent.Executors;
 
@@ -11,8 +12,11 @@
 import org.cytoscape.app.internal.net.WebQuerier;
 import org.cytoscape.app.internal.net.server.LocalHttpServer;
 import org.cytoscape.app.internal.ui.AppManagerDialog;
+import org.cytoscape.application.events.CyShutdownEvent;
+import org.cytoscape.application.events.CyShutdownListener;
 import org.cytoscape.application.swing.AbstractCyAction;
 import org.cytoscape.application.swing.CySwingApplication;
+import org.cytoscape.service.util.CyServiceRegistrar;
 import org.cytoscape.util.swing.FileUtil;
 import org.cytoscape.work.Task;
 import org.cytoscape.work.TaskIterator;
@@ -43,13 +47,22 @@
         * A reference to the {@link TaskManager} service used to execute 
Cytoscape tasks
         */
        private TaskManager taskManager;
+
+       /**
+        * A reference to the {@link CyServiceRegistrar} service used to add 
listeners for handling shutdown-related events
+        */
+       private CyServiceRegistrar serviceRegistrar;
        
        private LocalHttpServer server;
        
+       private AppManagerDialog appManagerDialog = null;
+       
+       
        /**
         * Creates and sets up the AbstractCyAction, placing an item into the 
menu.
         */
-       public AppManagerAction(AppManager appManager, CySwingApplication 
swingApplication, FileUtil fileUtil, TaskManager taskManager) {
+       public AppManagerAction(AppManager appManager, 
+                       CySwingApplication swingApplication, FileUtil fileUtil, 
TaskManager taskManager, CyServiceRegistrar serviceRegistrar) {
                super("App Manager");
                
                setPreferredMenu("Apps");
@@ -59,13 +72,40 @@
                this.swingApplication = swingApplication;
                this.fileUtil = fileUtil;
                this.taskManager = taskManager;
+               this.serviceRegistrar = serviceRegistrar;
+               
+               CyShutdownListener shutdownListener = createShutdownListener();
+               serviceRegistrar.registerAllServices(shutdownListener, new 
Properties());
        }
 
+       private CyShutdownListener createShutdownListener() {
+               CyShutdownListener shutdownListener = new CyShutdownListener() {
+                       
+                       @Override
+                       public void handleEvent(CyShutdownEvent e) {
+                               
+                               if (appManagerDialog != null) { 
+                                       appManagerDialog.setVisible(false);
+                                       appManagerDialog.dispose();
+                               }
+                               
+                               serviceRegistrar.unregisterService(this, 
CyShutdownListener.class);
+                       }
+               };
+               
+               return shutdownListener;
+       }
+       
        @Override
        public void actionPerformed(ActionEvent event) {
                                
                // Create and display the App Manager dialog
-               AppManagerDialog appManagerDialog = new 
AppManagerDialog(appManager, fileUtil, taskManager, 
swingApplication.getJFrame(), false);
+               if (appManagerDialog == null) {
+                       appManagerDialog = new AppManagerDialog(appManager, 
fileUtil, taskManager, swingApplication.getJFrame(), false);
+               } else {
+                       appManagerDialog.pack();
+                       appManagerDialog.setVisible(true);
+               }
        }
 
 }

Modified: 
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/manager/AppManager.java
===================================================================
--- 
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/manager/AppManager.java
  2012-07-03 19:16:52 UTC (rev 29747)
+++ 
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/manager/AppManager.java
  2012-07-03 20:06:59 UTC (rev 29748)
@@ -148,11 +148,11 @@
                this.appListeners = new HashSet<AppsChangedListener>();
 
                // Install previously enabled apps
-               installAppsInDirectory(new File(getInstalledAppsPath()));
-               installAppsInDirectory(new File(getKarafDeployDirectory()));
+               installAppsInDirectory(new File(getKarafDeployDirectory()), 
false);
+               installAppsInDirectory(new File(getInstalledAppsPath()), true);
                
                // Load apps from the "uninstalled apps" directory
-               Set<App> uninstalledApps = obtainAppsFromDirectory(new 
File(getUninstalledAppsPath()));
+               Set<App> uninstalledApps = obtainAppsFromDirectory(new 
File(getUninstalledAppsPath()), true);
                apps.addAll(uninstalledApps);
                
                DebugHelper.print(this, "config dir: " + 
applicationConfiguration.getConfigurationDirectoryLocation());
@@ -196,8 +196,7 @@
                                                        try {
                                                                
uninstallApp(app);
                                                        } catch 
(AppUninstallException e) {
-
-                                                               
e.printStackTrace();
+                                                               
logger.warn("Failed to uninstall app " + app.getAppName() + " when it was 
removed from the local install directory.");
                                                        }
                                                }
                                        }
@@ -234,7 +233,7 @@
                
                try {
                        //installAlterationObserver.initialize();
-                       // 
fileAlterationMonitor.addObserver(installAlterationObserver);
+                       
//fileAlterationMonitor.addObserver(installAlterationObserver);
                        fileAlterationMonitor.start();
                } catch (Exception e) {
                        // TODO Auto-generated catch block
@@ -583,10 +582,10 @@
                        jarFile.close();
                } catch (ZipException e) {
                        // Do nothing; skip file
-                       e.printStackTrace();
+                       // e.printStackTrace();
                } catch (IOException e) {
                        // Do nothing; skip file
-                       e.printStackTrace();
+                       // e.printStackTrace();
                } finally {
                        if (jarFile != null) {
                                try {
@@ -616,10 +615,10 @@
                }
        }
        
-       private void installAppsInDirectory(File directory) {
+       private void installAppsInDirectory(File directory, boolean 
ignoreDuplicateBundleApps) {
 
                // Parse App objects from the given directory
-               Set<App> parsedApps = obtainAppsFromDirectory(directory);
+               Set<App> parsedApps = obtainAppsFromDirectory(directory, 
ignoreDuplicateBundleApps);
                
                // Install each app
                for (App parsedApp : parsedApps) {
@@ -638,24 +637,33 @@
         * @param directory The directory used to parse {@link App} objects
         * @return A set of all {@link App} objects that were successfully 
parsed from files in the given directory
         */
-       private Set<App> obtainAppsFromDirectory(File directory) {
+       private Set<App> obtainAppsFromDirectory(File directory, boolean 
ignoreDuplicateBundleApps) {
                // Obtain all files in the given directory with supported 
extensions, perform a non-recursive search
                Collection<File> files = FileUtils.listFiles(directory, 
APP_EXTENSIONS, false); 
                
                Set<App> parsedApps = new HashSet<App>();
                
+               String karafDeployDirectory = getKarafDeployDirectory();
+               
                App app;
                for (File potentialApp : files) {
-                       app = null;
-                       try {
-                               app = appParser.parseApp(potentialApp);
-                       } catch (AppParsingException e) {
-                               DebugHelper.print("Failed to parse " + 
potentialApp + ", error: " + e.getMessage());
-                       } finally {
-                               if (app != null) {
-                                       parsedApps.add(app);
-                                       
-                                       DebugHelper.print("App parsed: " + app);
+                       
+                       if (ignoreDuplicateBundleApps
+                                       && (new File(karafDeployDirectory + 
File.separator + potentialApp.getName())).exists()) {
+                               // Skip file
+                       } else {
+                       
+                               app = null;
+                               try {
+                                       app = appParser.parseApp(potentialApp);
+                               } catch (AppParsingException e) {
+                                       DebugHelper.print("Failed to parse " + 
potentialApp + ", error: " + e.getMessage());
+                               } finally {
+                                       if (app != null) {
+                                               parsedApps.add(app);
+                                               
+                                               DebugHelper.print("App parsed: 
" + app);
+                                       }
                                }
                        }
                }
@@ -721,6 +729,6 @@
         * Install apps from the local storage directory containing previously 
installed apps.
         */
        public void installAppsFromDirectory() {
-               installAppsInDirectory(new File(getInstalledAppsPath()));
+               installAppsInDirectory(new File(getInstalledAppsPath()), false);
        }
 }

Modified: 
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/manager/AppParser.java
===================================================================
--- 
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/manager/AppParser.java
   2012-07-03 19:16:52 UTC (rev 29747)
+++ 
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/manager/AppParser.java
   2012-07-03 20:06:59 UTC (rev 29748)
@@ -304,8 +304,8 @@
                        
                        if (compatibleVersions == null || 
compatibleVersions.trim().length() == 0) {
                                if (bundleApp) {
-                                       logger.warn("Bundle app " + 
file.getName() + " manifest does not contain an entry for " + APP_COMPATIBLE_TAG
-                                                       + ". Assuming default 
value 3.0..");
+                                       logger.warn("Bundle app " + 
file.getName() + " manifest does not contain the entry \"" + APP_COMPATIBLE_TAG
+                                                       + "\". Assuming default 
value 3.0..");
                                        compatibleVersions = "3.0";
                                } else {
                                        throw new AppParsingException("Jar is 
missing value for entry " + APP_COMPATIBLE_TAG + " in its manifest file.");

Modified: 
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/ui/InstallFromStorePanel.java
===================================================================
--- 
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/ui/InstallFromStorePanel.java
    2012-07-03 19:16:52 UTC (rev 29747)
+++ 
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/ui/InstallFromStorePanel.java
    2012-07-03 20:06:59 UTC (rev 29748)
@@ -551,7 +551,7 @@
                
                String text = "";
                
-               text += "<html> <head> </head> <body hspace=\"8\" 
vspace=\"8\">";
+               text += "<html> <head> </head> <body hspace=\"6\" 
vspace=\"6\">";
                
                // App hyperlink to web store page
                // text += "<p style=\"margin-top: 0\"> <a href=\"" + 
selectedApp.getPageUrl() + "\">" + selectedApp.getPageUrl() + "</a> </p>";

-- 
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