Author: jm
Date: 2012-10-10 11:56:19 -0700 (Wed, 10 Oct 2012)
New Revision: 30645

Modified:
   
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/net/UpdateManager.java
   
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/net/WebQuerier.java
   
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/net/server/AppGetResponder.java
   
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/ui/CheckForUpdatesPanel.java
   
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/ui/InstallFromStorePanel.java
Log:
Fixes #1498, #1514: Downloading an app is now cancellable and shows progress

Modified: 
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/net/UpdateManager.java
===================================================================
--- 
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/net/UpdateManager.java
   2012-10-10 18:03:30 UTC (rev 30644)
+++ 
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/net/UpdateManager.java
   2012-10-10 18:56:19 UTC (rev 30645)
@@ -2,7 +2,6 @@
 
 import java.io.File;
 import java.io.IOException;
-import java.sql.Time;
 import java.util.Calendar;
 import java.util.HashSet;
 import java.util.Locale;
@@ -20,9 +19,6 @@
 import org.cytoscape.app.internal.manager.SimpleApp;
 import org.cytoscape.app.internal.manager.AppManager;
 import org.cytoscape.app.internal.manager.App.AppStatus;
-import org.cytoscape.app.internal.util.DebugHelper;
-import org.cytoscape.application.events.SetSelectedNetworksEvent;
-import org.omg.CORBA.FREE_MEM;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -73,8 +69,9 @@
         * Installs the given {@link Update} via the given {@link AppManager}
         * @param update The update to install
         * @param appManager The {@link AppManager} keeping track of current 
apps
+        * @param taskMonitor 
         */
-       public void installUpdate(Update update, AppManager appManager) throws 
AppUpdateException {
+       public void installUpdate(Update update, AppManager appManager, 
DownloadStatus status) throws AppUpdateException {
                
                WebQuerier webQuerier = appManager.getWebQuerier();
                
@@ -82,7 +79,8 @@
                try {
                        appFile = webQuerier.downloadApp(update.getWebApp(), 
                                        
update.getRelease().getReleaseVersion(), 
-                                       new 
File(appManager.getDownloadedAppsPath()));
+                                       new 
File(appManager.getDownloadedAppsPath()),
+                                       status);
                } catch (AppDownloadException e) {
                        logger.warn("Failed to obtain update for " 
                                        + update.getApp().getAppName() + ", " + 
e.getMessage());

Modified: 
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/net/WebQuerier.java
===================================================================
--- 
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/net/WebQuerier.java
      2012-10-10 18:03:30 UTC (rev 30644)
+++ 
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/net/WebQuerier.java
      2012-10-10 18:56:19 UTC (rev 30645)
@@ -7,6 +7,7 @@
 import java.net.HttpURLConnection;
 import java.net.MalformedURLException;
 import java.net.URL;
+import java.net.URLConnection;
 import java.nio.channels.Channels;
 import java.nio.channels.FileChannel;
 import java.nio.channels.ReadableByteChannel;
@@ -29,6 +30,7 @@
 import org.cytoscape.app.internal.ui.downloadsites.DownloadSite;
 import org.cytoscape.app.internal.util.DebugHelper;
 import org.cytoscape.io.util.StreamUtil;
+import org.cytoscape.work.TaskMonitor;
 import org.json.JSONArray;
 import org.json.JSONException;
 import org.json.JSONObject;
@@ -459,8 +461,9 @@
         * @param appName The unique app name used by the app store
         * @param version The desired version, or <code>null</code> to obtain 
the latest release
         * @param directory The directory used to store the downloaded file
+        * @param taskMonitor 
         */
-       public File downloadApp(WebApp webApp, String version, File directory) 
throws AppDownloadException {
+       public File downloadApp(WebApp webApp, String version, File directory, 
DownloadStatus status) throws AppDownloadException {
        
                List<WebApp.Release> compatibleReleases = 
getCompatibleReleases(webApp);
                
@@ -497,42 +500,48 @@
                                try {
                                
                                        // Prepare to download
-                                       ReadableByteChannel readableByteChannel 
= Channels.newChannel(downloadUrl.openStream());
-                                       
-                                       // Output file has same name as app, 
but spaces are replaced with hyphens
-                                       File outputFile = new 
File(directory.getCanonicalPath() + File.separator 
-                                                       + 
webApp.getName().replaceAll("\\s", "-") + ".jar");
-                                       
-                                       if (outputFile.exists()) {
-                                               outputFile.delete();
-                                       }
-                                       
-                                       outputFile.createNewFile();
-                                       
-                                   FileOutputStream fileOutputStream = new 
FileOutputStream(outputFile);
-                                   FileChannel fileChannel = 
fileOutputStream.getChannel();
-                                   
-                                   long currentDownloadPosition = 0;
-                                   long bytesTransferred;
-                                   
-                                   do {
-                                       bytesTransferred = 
fileChannel.transferFrom(readableByteChannel, currentDownloadPosition, 1 << 24);
-//                                     System.out.println("Position: " + 
currentDownloadPosition + " new bytes: " + bytesTransferred);
-                                       currentDownloadPosition += 
bytesTransferred;
-                                   } while (bytesTransferred > 0);
-                                   
-//                                 System.out.println("outfile: " + 
outputFile.getAbsolutePath());
-                                   
-                                   try {
-                                       fileOutputStream.close();
-                                   } catch (IOException e) {
-                                   }
-                                   
-                                   try {
+                                       URLConnection connection = 
streamUtil.getURLConnection(downloadUrl);
+                                       InputStream inputStream = 
connection.getInputStream();
+                                       long contentLength = 
connection.getContentLength();
+                                       ReadableByteChannel readableByteChannel 
= Channels.newChannel(inputStream);
+                                       File outputFile;
+                                       try {
+                                               // Output file has same name as 
app, but spaces are replaced with hyphens
+                                               outputFile = new 
File(directory.getCanonicalPath() + File.separator 
+                                                               + 
webApp.getName().replaceAll("\\s", "-") + ".jar");
+                                               
+                                               if (outputFile.exists()) {
+                                                       outputFile.delete();
+                                               }
+                                               
+                                               outputFile.createNewFile();
+                                               
+                                           FileOutputStream fileOutputStream = 
new FileOutputStream(outputFile);
+                                           try {
+                                                   FileChannel fileChannel = 
fileOutputStream.getChannel();
+                                                   
+                                                   long 
currentDownloadPosition = 0;
+                                                   long bytesTransferred;
+                                                   
+                                                   TaskMonitor taskMonitor = 
status.getTaskMonitor();
+                                                   do {
+                                                       bytesTransferred = 
fileChannel.transferFrom(readableByteChannel, currentDownloadPosition, 1 << 14);
+                                                       if 
(status.isCanceled()) {
+                                                               
outputFile.delete();
+                                                               return null;
+                                                       }
+                                                       currentDownloadPosition 
+= bytesTransferred;
+                                                       if (contentLength > 0) {
+                                                               double progress 
= (double) currentDownloadPosition / contentLength;
+                                                               
taskMonitor.setProgress(progress);
+                                                       }
+                                                   } while (bytesTransferred > 
0);
+                                           } finally {
+                                               fileOutputStream.close();
+                                           }
+                                       } finally {
                                        readableByteChannel.close();
-                                   } catch (IOException e) {
                                    }
-                                   
                                    return outputFile;
                                } catch (IOException e) {
                                        throw new AppDownloadException("Error 
while downloading app " + webApp.getFullName()
@@ -543,7 +552,6 @@
                        throw new AppDownloadException("No available releases 
were found for the app " 
                                        + webApp.getFullName() + ".");
                }
-               
                return null;
        }
 

Modified: 
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/net/server/AppGetResponder.java
===================================================================
--- 
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/net/server/AppGetResponder.java
  2012-10-10 18:03:30 UTC (rev 30644)
+++ 
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/net/server/AppGetResponder.java
  2012-10-10 18:56:19 UTC (rev 30645)
@@ -3,17 +3,20 @@
 import java.io.File;
 import java.util.HashMap;
 import java.util.Map;
-
+import java.util.concurrent.Semaphore;
+import java.util.regex.Matcher;
 import java.util.regex.Pattern;
-import java.util.regex.Matcher;
 
-import org.cytoscape.app.internal.exception.AppDownloadException;
 import org.cytoscape.app.internal.exception.AppInstallException;
 import org.cytoscape.app.internal.exception.AppParsingException;
 import org.cytoscape.app.internal.manager.App;
 import org.cytoscape.app.internal.manager.AppManager;
+import org.cytoscape.app.internal.net.DownloadStatus;
 import org.cytoscape.app.internal.net.WebApp;
-import org.cytoscape.app.internal.util.DebugHelper;
+import org.cytoscape.work.AbstractTask;
+import org.cytoscape.work.TaskIterator;
+import org.cytoscape.work.TaskManager;
+import org.cytoscape.work.TaskMonitor;
 import org.json.JSONObject;
 
 /**
@@ -83,7 +86,7 @@
         protected Map<String,String> jsonRespond(CyHttpRequest request, 
Matcher matchedURI) {
             Map<String, String> responseData = new HashMap<String, String>();
                        String appName = matchedURI.group(1);
-                       String version = matchedURI.group(2);
+                       final String version = matchedURI.group(2);
                        
                        if (appName != null && appName.length() != 0 && version 
!= null && version.length() != 0) {
                                // Use the WebQuerier to obtain the app from 
the app store using the app name and version
@@ -107,15 +110,36 @@
                                responseData.put("name", appName);
                                
                                if (appFoundInStore) {
+                                       final File[] result = new File[1];
+                                       final Semaphore semaphore = new 
Semaphore(0);
                                        
-                                       // Download app
-                                       File appFile = null;
-                                       try {
-                                               appFile = 
appManager.getWebQuerier().downloadApp(
-                                                       appToDownload, version, 
new File(appManager.getDownloadedAppsPath()));
-                                       } catch (AppDownloadException e) {
-                                       }
+                                       final WebApp webApp = appToDownload;
+                                       TaskManager<?, ?> taskManager = 
appManager.getSwingAppAdapter().getTaskManager();
+                                       taskManager.execute(new 
TaskIterator(new AbstractTask() {
+                                               private DownloadStatus status;
+
+                                               @Override
+                                               public void run(TaskMonitor 
taskMonitor) throws Exception {
+                                                       try {
+                                                               
taskMonitor.setStatusMessage("Installing app: " + webApp.getFullName());
+                                                               status = new 
DownloadStatus(taskMonitor);
+                                                               result[0] = 
appManager.getWebQuerier().downloadApp(
+                                                                               
webApp, version, new File(appManager.getDownloadedAppsPath()), status);
+                                                       } finally {
+                                                               
semaphore.release();
+                                                       }
+                                               }
+                                               
+                                               public void cancel() {
+                                                       if (status != null) {
+                                                               status.cancel();
+                                                       }
+                                               };
+                                       }));
                                        
+                                       semaphore.acquireUninterruptibly();
+                                       File appFile = result[0];
+                                       
                                        // Attempt to install app
                                        if (appFile == null) {
                                                installStatus = 
"version-not-found";

Modified: 
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/ui/CheckForUpdatesPanel.java
===================================================================
--- 
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/ui/CheckForUpdatesPanel.java
     2012-10-10 18:03:30 UTC (rev 30644)
+++ 
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/ui/CheckForUpdatesPanel.java
     2012-10-10 18:56:19 UTC (rev 30645)
@@ -7,7 +7,6 @@
 import java.util.HashSet;
 import java.util.Set;
 
-import javax.swing.JPanel;
 import javax.swing.SwingUtilities;
 import javax.swing.event.ListSelectionEvent;
 import javax.swing.event.ListSelectionListener;
@@ -18,13 +17,13 @@
 import org.cytoscape.app.internal.manager.App;
 import org.cytoscape.app.internal.manager.App.AppStatus;
 import org.cytoscape.app.internal.manager.AppManager;
+import org.cytoscape.app.internal.net.DownloadStatus;
 import org.cytoscape.app.internal.net.Update;
 import org.cytoscape.app.internal.net.UpdateManager;
 import org.cytoscape.app.internal.net.WebApp;
 import org.cytoscape.app.internal.net.WebQuerier;
 import org.cytoscape.app.internal.ui.downloadsites.DownloadSite;
 import org.cytoscape.app.internal.ui.downloadsites.DownloadSitesManager;
-import org.cytoscape.app.internal.ui.downloadsites.ManageDownloadSitesDialog;
 import org.cytoscape.work.Task;
 import org.cytoscape.work.TaskIterator;
 import org.cytoscape.work.TaskManager;
@@ -299,9 +298,11 @@
         final int updateCount = selectedUpdates.size();
         
         taskManager.execute(new TaskIterator(new Task() {
+                       private DownloadStatus status;
 
                        @Override
                        public void run(TaskMonitor taskMonitor) throws 
Exception {
+                               status = new DownloadStatus(taskMonitor);
                                taskMonitor.setTitle("Installing updates");
                                
                                double progress = 0;
@@ -315,12 +316,15 @@
                                                        + " for " + 
update.getApp().getAppName() 
                                                        + " (" + count + "/" + 
updateCount + ")");
                                        
-                               updateManager.installUpdate(update, appManager);
+                               updateManager.installUpdate(update, appManager, 
status);
                        }
                        }
 
                        @Override
                        public void cancel() {  
+                               if (status != null) {
+                                       status.cancel();
+                               }
                        }
                
         }));
@@ -331,9 +335,11 @@
         final int updateCount = updates.size();
 
         taskManager.execute(new TaskIterator(new Task() {
+                       private DownloadStatus status;
 
                        @Override
                        public void run(TaskMonitor taskMonitor) throws 
Exception {
+                               status = new DownloadStatus(taskMonitor);
                                taskMonitor.setTitle("Installing updates");
                                
                                double progress = 0;
@@ -347,12 +353,15 @@
                                                        + " for " + 
update.getApp().getAppName() 
                                                        + " (" + count + "/" + 
updateCount + ")");
                                        
-                               updateManager.installUpdate(update, appManager);
+                               updateManager.installUpdate(update, appManager, 
status);
                        }
                        }
 
                        @Override
                        public void cancel() {
+                               if (status != null) {
+                                       status.cancel();
+                               }
                        }
                
         }));

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-10-10 18:03:30 UTC (rev 30644)
+++ 
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/ui/InstallFromStorePanel.java
    2012-10-10 18:56:19 UTC (rev 30645)
@@ -45,6 +45,7 @@
 import org.cytoscape.app.internal.manager.App.AppStatus;
 import org.cytoscape.app.internal.manager.AppManager;
 import org.cytoscape.app.internal.manager.AppParser;
+import org.cytoscape.app.internal.net.DownloadStatus;
 import org.cytoscape.app.internal.net.ResultsFilterer;
 import org.cytoscape.app.internal.net.Update;
 import org.cytoscape.app.internal.net.WebApp;
@@ -574,9 +575,11 @@
         final WebApp appToDownload = selectedApp;
         
                taskManager.execute(new TaskIterator(new Task() {
+                       private DownloadStatus status;
 
                        @Override
                        public void run(TaskMonitor taskMonitor) throws 
Exception {
+                               status = new DownloadStatus(taskMonitor);
                                taskMonitor.setTitle("Installing App from App 
Store");
                                
                                double progress = 0;
@@ -584,7 +587,7 @@
                                taskMonitor.setStatusMessage("Installing app: " 
+ appToDownload.getFullName());
                                
                                // Download app
-                       File appFile = webQuerier.downloadApp(appToDownload, 
null, new File(appManager.getDownloadedAppsPath()));
+                       File appFile = webQuerier.downloadApp(appToDownload, 
null, new File(appManager.getDownloadedAppsPath()), status);
                                
                        if (appFile != null) {
                                // Parse app
@@ -602,6 +605,9 @@
 
                        @Override
                        public void cancel() {
+                               if (status != null) {
+                                       status.cancel();
+                               }
                        }
                        
                }));

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