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.