Skip to content

Commit

Permalink
Merge branch 'develop' of github.com:cytoscape/cytoscape-impl into de…
Browse files Browse the repository at this point in the history
…velop
  • Loading branch information
Adam Treister committed Feb 12, 2018
2 parents 5762cad + 42a4f3d commit b9bfb53
Show file tree
Hide file tree
Showing 42 changed files with 1,748 additions and 72 deletions.
217 changes: 209 additions & 8 deletions app-impl/src/main/java/org/cytoscape/app/internal/CyActivator.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import org.cytoscape.app.internal.event.AppsChangedEvent;
import org.cytoscape.app.internal.event.AppsChangedListener;
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.UpdateManager;
import org.cytoscape.app.internal.net.WebQuerier;
Expand All @@ -24,6 +25,16 @@
import org.cytoscape.app.internal.net.server.LocalhostServerSocketFactory;
import org.cytoscape.app.internal.net.server.OriginOptionsBeforeResponse;
import org.cytoscape.app.internal.net.server.ScreenOriginsBeforeResponse;
import org.cytoscape.app.internal.task.EnableTaskFactory;
import org.cytoscape.app.internal.task.DisableTaskFactory;
import org.cytoscape.app.internal.task.InformationTaskFactory;
import org.cytoscape.app.internal.task.InstallTaskFactory;
import org.cytoscape.app.internal.task.ListAvailableTaskFactory;
import org.cytoscape.app.internal.task.ListAppsTaskFactory;
import org.cytoscape.app.internal.task.ListUpdatesTaskFactory;
import org.cytoscape.app.internal.task.StatusTaskFactory;
import org.cytoscape.app.internal.task.UninstallTaskFactory;
import org.cytoscape.app.internal.task.UpdateTaskFactory;
import org.cytoscape.app.internal.tunable.AppConflictHandlerFactory;
import org.cytoscape.app.internal.ui.downloadsites.DownloadSitesManager;
import org.cytoscape.app.swing.CySwingAppAdapter;
Expand Down Expand Up @@ -119,6 +130,13 @@
import org.cytoscape.view.vizmap.VisualMappingFunctionFactory;
import org.cytoscape.view.vizmap.VisualMappingManager;
import org.cytoscape.view.vizmap.VisualStyleFactory;
import static org.cytoscape.work.ServiceProperties.COMMAND;
import static org.cytoscape.work.ServiceProperties.COMMAND_DESCRIPTION;
import static org.cytoscape.work.ServiceProperties.COMMAND_EXAMPLE_JSON;
import static org.cytoscape.work.ServiceProperties.COMMAND_LONG_DESCRIPTION;
import static org.cytoscape.work.ServiceProperties.COMMAND_NAMESPACE;
import static org.cytoscape.work.ServiceProperties.COMMAND_SUPPORTS_JSON;
import org.cytoscape.work.TaskFactory;
import org.cytoscape.work.TaskManager;
import org.cytoscape.work.properties.TunablePropertySerializerFactory;
import org.cytoscape.work.swing.DialogTaskManager;
Expand Down Expand Up @@ -411,20 +429,203 @@ public void start(BundleContext bc) {

// Start 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
final AppGetResponder appGetResponder = new AppGetResponder(appManager, cytoscapeVersionService);
final CyHttpd httpd = (new CyHttpdFactoryImpl()).createHttpd(new LocalhostServerSocketFactory(2607));
httpd.addBeforeResponse(new ScreenOriginsBeforeResponse(WebQuerier.DEFAULT_APP_STORE_URL));
httpd.addBeforeResponse(new OriginOptionsBeforeResponse("x-csrftoken"));
httpd.addAfterResponse(new AddAllowOriginHeader());
httpd.addResponder(appGetResponder.new StatusResponder());
httpd.addResponder(appGetResponder.new InstallResponder());
httpd.start();
final AppGetResponder appGetResponder = new AppGetResponder(appManager, cytoscapeVersionService);
final CyHttpd httpd = (new CyHttpdFactoryImpl()).createHttpd(new LocalhostServerSocketFactory(2607));
httpd.addBeforeResponse(new ScreenOriginsBeforeResponse(WebQuerier.DEFAULT_APP_STORE_URL));
httpd.addBeforeResponse(new OriginOptionsBeforeResponse("x-csrftoken"));
httpd.addAfterResponse(new AddAllowOriginHeader());
httpd.addResponder(appGetResponder.new StatusResponder());
httpd.addResponder(appGetResponder.new InstallResponder());
httpd.start();

// Special case: handle yFiles app options
final OpenBrowser openBrowser = getService(bc, OpenBrowser.class);
YFilesChecker checker = new YFilesChecker(appManager, serviceRegistrar, openBrowser);
bc.addBundleListener(checker);
registerAllServices(bc, checker, new Properties());

{
DisableTaskFactory factory = new DisableTaskFactory(appManager);
Properties props = new Properties();
props.setProperty(COMMAND_NAMESPACE, "apps");
props.setProperty(COMMAND, "disable");
props.setProperty(COMMAND_DESCRIPTION, "Disable an app");
props.setProperty(COMMAND_LONG_DESCRIPTION,
"Disable a currently installed app.");
props.setProperty(COMMAND_SUPPORTS_JSON, "true");
props.setProperty(COMMAND_EXAMPLE_JSON, "{\"app\": \"appname\"}");
registerService(bc, factory, TaskFactory.class, props);
}

{
EnableTaskFactory factory = new EnableTaskFactory(appManager);
Properties props = new Properties();
props.setProperty(COMMAND_NAMESPACE, "apps");
props.setProperty(COMMAND, "enable");
props.setProperty(COMMAND_DESCRIPTION, "Enable a disabled app");
props.setProperty(COMMAND_LONG_DESCRIPTION,
"Enable a currently disabled app.");
props.setProperty(COMMAND_SUPPORTS_JSON, "true");
props.setProperty(COMMAND_EXAMPLE_JSON, "{\"app\": \"appname\"}");
registerService(bc, factory, TaskFactory.class, props);
}

{
InformationTaskFactory factory = new InformationTaskFactory(appManager);
Properties props = new Properties();
props.setProperty(COMMAND_NAMESPACE, "apps");
props.setProperty(COMMAND, "information");
props.setProperty(COMMAND_DESCRIPTION, "Get app information");
props.setProperty(COMMAND_LONG_DESCRIPTION,
"Get information about an app.");
props.setProperty(COMMAND_SUPPORTS_JSON, "true");
props.setProperty(COMMAND_EXAMPLE_JSON, "{\"app\": \"appname\""+
", \"description\": \"App description\""+
", \"version\": \"1.2.2\"}");
registerService(bc, factory, TaskFactory.class, props);
}

{
InstallTaskFactory factory = new InstallTaskFactory(appManager);
Properties props = new Properties();
props.setProperty(COMMAND_NAMESPACE, "apps");
props.setProperty(COMMAND, "install");
props.setProperty(COMMAND_DESCRIPTION, "Install an app");
props.setProperty(COMMAND_LONG_DESCRIPTION,
"Install an app given an app name or file.");
props.setProperty(COMMAND_SUPPORTS_JSON, "true");
props.setProperty(COMMAND_EXAMPLE_JSON, "{}");
registerService(bc, factory, TaskFactory.class, props);
}

{
ListAvailableTaskFactory factory = new ListAvailableTaskFactory(appManager);
Properties props = new Properties();
props.setProperty(COMMAND_NAMESPACE, "apps");
props.setProperty(COMMAND, "list available");
props.setProperty(COMMAND_DESCRIPTION, "List the available apps");
props.setProperty(COMMAND_LONG_DESCRIPTION,
"Return a list of the available apps in the app store");
props.setProperty(COMMAND_SUPPORTS_JSON, "true");
props.setProperty(COMMAND_EXAMPLE_JSON,
"[{ \"fullName\": \"appname\","+
"\"name\": \"name\","+
"\"description\": \"descriptions\","+
"\"details\": \"app details\"},...]"
);
registerService(bc, factory, TaskFactory.class, props);
}

{
ListAppsTaskFactory factory = new ListAppsTaskFactory(appManager, AppStatus.DISABLED);
Properties props = new Properties();
props.setProperty(COMMAND_NAMESPACE, "apps");
props.setProperty(COMMAND, "list disabled");
props.setProperty(COMMAND_DESCRIPTION, "List the disabled apps");
props.setProperty(COMMAND_LONG_DESCRIPTION,
"Return a list of the disabled apps in the current installation.");
props.setProperty(COMMAND_SUPPORTS_JSON, "true");
props.setProperty(COMMAND_EXAMPLE_JSON,
"[{ \"name\": \"appname\","+
"\"version\": \"1.1.0\","+
"\"description\": \"descriptions\","+
"\"status\": \"disabled\"},...]"
);
registerService(bc, factory, TaskFactory.class, props);
}

{
ListAppsTaskFactory factory = new ListAppsTaskFactory(appManager, AppStatus.INSTALLED);
Properties props = new Properties();
props.setProperty(COMMAND_NAMESPACE, "apps");
props.setProperty(COMMAND, "list installed");
props.setProperty(COMMAND_DESCRIPTION, "List the installed apps");
props.setProperty(COMMAND_LONG_DESCRIPTION,
"Return a list of the installed apps in the current installation.");
props.setProperty(COMMAND_SUPPORTS_JSON, "true");
props.setProperty(COMMAND_EXAMPLE_JSON,
"[{ \"name\": \"appname\","+
"\"version\": \"1.1.0\","+
"\"description\": \"descriptions\","+
"\"status\": \"installed\"},...]"
);
registerService(bc, factory, TaskFactory.class, props);
}

{
ListAppsTaskFactory factory = new ListAppsTaskFactory(appManager, AppStatus.UNINSTALLED);
Properties props = new Properties();
props.setProperty(COMMAND_NAMESPACE, "apps");
props.setProperty(COMMAND, "list uninstalled");
props.setProperty(COMMAND_DESCRIPTION, "List the uninstalled apps");
props.setProperty(COMMAND_LONG_DESCRIPTION,
"Return a list of the uninstalled apps in the current installation.");
props.setProperty(COMMAND_SUPPORTS_JSON, "true");
props.setProperty(COMMAND_EXAMPLE_JSON,
"[{ \"name\": \"appname\","+
"\"version\": \"1.1.0\","+
"\"description\": \"descriptions\","+
"\"status\": \"uninstalled\"},...]"
);
registerService(bc, factory, TaskFactory.class, props);
}

{
ListUpdatesTaskFactory factory = new ListUpdatesTaskFactory(appManager);
Properties props = new Properties();
props.setProperty(COMMAND_NAMESPACE, "apps");
props.setProperty(COMMAND, "list updates");
props.setProperty(COMMAND_DESCRIPTION, "List the apps available for updates");
props.setProperty(COMMAND_LONG_DESCRIPTION,
"Return a list of the apps that have updates in the app store.");
props.setProperty(COMMAND_SUPPORTS_JSON, "true");
props.setProperty(COMMAND_EXAMPLE_JSON,
"[{ \"name\": \"appname\","+
"\"version\": \"1.1.10\","+
"\"information\": \"app information\"},...]"
);
registerService(bc, factory, TaskFactory.class, props);
}

{
StatusTaskFactory factory = new StatusTaskFactory(appManager);
Properties props = new Properties();
props.setProperty(COMMAND_NAMESPACE, "apps");
props.setProperty(COMMAND, "status");
props.setProperty(COMMAND_DESCRIPTION, "Get the status of an app");
props.setProperty(COMMAND_LONG_DESCRIPTION,
"Get the status of an app.");
props.setProperty(COMMAND_SUPPORTS_JSON, "true");
props.setProperty(COMMAND_EXAMPLE_JSON, "{\"app\": \"appname\", \"status\": \"installed\"}");
registerService(bc, factory, TaskFactory.class, props);
}

{
UninstallTaskFactory factory = new UninstallTaskFactory(appManager);
Properties props = new Properties();
props.setProperty(COMMAND_NAMESPACE, "apps");
props.setProperty(COMMAND, "uninstall");
props.setProperty(COMMAND_DESCRIPTION, "Uninstall an app");
props.setProperty(COMMAND_LONG_DESCRIPTION,
"Uninstall a currently installed app.");
props.setProperty(COMMAND_SUPPORTS_JSON, "true");
props.setProperty(COMMAND_EXAMPLE_JSON, "{\"app\": \"appname\"}");
registerService(bc, factory, TaskFactory.class, props);
}

{
UpdateTaskFactory factory = new UpdateTaskFactory(appManager, updateManager);
Properties props = new Properties();
props.setProperty(COMMAND_NAMESPACE, "apps");
props.setProperty(COMMAND, "update");
props.setProperty(COMMAND_DESCRIPTION, "Update an app or all apps");
props.setProperty(COMMAND_LONG_DESCRIPTION,
"Update an app or all apps.");
props.setProperty(COMMAND_SUPPORTS_JSON, "true");
props.setProperty(COMMAND_EXAMPLE_JSON, "{}");
registerService(bc, factory, TaskFactory.class, props);
}

}


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -881,7 +881,9 @@ public void installApp(App app) throws AppInstallException {
* apps directory
*/
public void uninstallApp(App app) throws AppUninstallException {
if(app.isBundledApp()) return;
if(app.isBundledApp()) {
return;
}

try {
app.moveAppFile(this, new File(getUninstalledAppsPath()));
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
package org.cytoscape.app.internal.task;

import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

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.WebApp;
import org.cytoscape.app.internal.net.WebApp.Release;
import org.cytoscape.app.internal.net.WebQuerier;
import org.cytoscape.work.AbstractTask;
import org.cytoscape.work.ObservableTask;
import org.cytoscape.work.TaskMonitor;
import org.cytoscape.work.json.JSONResult;

public abstract class AbstractAppTask extends AbstractTask {
final protected AppManager appManager;
protected Set<App> appList;
protected Set<WebApp> webAppList;

AbstractAppTask(AppManager appManager) {
this.appManager = appManager;
updateApps();
}

protected App getApp(String appName) {
for (App app: appList) {
if (appName.equalsIgnoreCase(app.getAppName()))
return app;
}
return null;
}

protected List<App> getApps(AppStatus status) {
List<App> apps = new ArrayList<>();
for (App app: appList) {
if (app.getStatus().equals(status))
apps.add(app);
}
return apps;
}

protected WebApp getWebApp(String appName) {
for (WebApp app: webAppList) {
if (app.getName().equalsIgnoreCase(appName))
return app;
}
return null;
}

protected void updateApps() {
appList = appManager.getApps();
webAppList = appManager.getWebQuerier().getAllApps();
}

protected String getVersion(WebApp webApp) {
List<Release> releases = webApp.getReleases();
Collections.sort(releases);
Release release = releases.get(releases.size()-1);
return release.getReleaseVersion();
}

}
Loading

0 comments on commit b9bfb53

Please sign in to comment.