Author: paperwing
Date: 2012-12-19 16:03:48 -0800 (Wed, 19 Dec 2012)
New Revision: 31023
Added:
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/manager/__Unused__KarafArchiveApp.java
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/net/server/AddAllowOriginHeader.java
core3/impl/trunk/app-impl/src/test/java/org/cytoscape/app/internal/net/server/AddAllowOriginHeaderTest.java
Removed:
core3/impl/trunk/app-impl/src/test/java/org/cytoscape/app/internal/net/server/AddAccessControlAllowOriginHeaderAfterResponseTest.java
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/event/UpdatesChangedEvent.java
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/exception/AppInstallException.java
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/exception/AppUpdateException.java
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/manager/AppDependencyNode.java
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/net/server/CyHttpRequestImpl.java
Log:
Fixed incompletely renamed file
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-12-19 22:57:53 UTC (rev 31022)
+++
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/CyActivator.java
2012-12-20 00:03:48 UTC (rev 31023)
@@ -11,7 +11,7 @@
import org.cytoscape.app.internal.net.server.ServerSocketFactory;
import org.cytoscape.app.internal.net.server.LocalhostServerSocketFactory;
import org.cytoscape.app.internal.net.server.ScreenOriginsBeforeResponse;
-import
org.cytoscape.app.internal.net.server.AddAccessControlAllowOriginHeaderAfterResponse;
+import org.cytoscape.app.internal.net.server.AddAllowOriginHeader;
import org.cytoscape.app.internal.net.server.OriginOptionsBeforeResponse;
import org.cytoscape.app.internal.ui.downloadsites.DownloadSite;
import org.cytoscape.app.internal.ui.downloadsites.DownloadSitesManager;
@@ -384,7 +384,7 @@
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
AddAccessControlAllowOriginHeaderAfterResponse());
+ httpd.addAfterResponse(new AddAllowOriginHeader());
httpd.addResponder(appGetResponder.new StatusResponder());
httpd.addResponder(appGetResponder.new InstallResponder());
httpd.start();
Modified:
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/event/UpdatesChangedEvent.java
===================================================================
---
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/event/UpdatesChangedEvent.java
2012-12-19 22:57:53 UTC (rev 31022)
+++
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/event/UpdatesChangedEvent.java
2012-12-20 00:03:48 UTC (rev 31023)
@@ -8,7 +8,7 @@
* update their data to reflect the change.
*/
public final class UpdatesChangedEvent {
-
+
/** The {@link UpdateManager} that created the event. */
private UpdateManager source;
Modified:
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/exception/AppInstallException.java
===================================================================
---
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/exception/AppInstallException.java
2012-12-19 22:57:53 UTC (rev 31022)
+++
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/exception/AppInstallException.java
2012-12-20 00:03:48 UTC (rev 31023)
@@ -1,5 +1,8 @@
package org.cytoscape.app.internal.exception;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
/**
* An exception thrown signal errors found while attempting to install an app.
*/
@@ -7,8 +10,12 @@
private static final long serialVersionUID = 5799194018659112606L;
+ private static final Logger logger =
LoggerFactory.getLogger(AppInstallException.class);
+
public AppInstallException(String message) {
super(message);
+
+ logger.info(message);
}
public AppInstallException(String message, Throwable cause) {
Modified:
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/exception/AppUpdateException.java
===================================================================
---
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/exception/AppUpdateException.java
2012-12-19 22:57:53 UTC (rev 31022)
+++
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/exception/AppUpdateException.java
2012-12-20 00:03:48 UTC (rev 31023)
@@ -1,15 +1,22 @@
package org.cytoscape.app.internal.exception;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
/**
* An exception thrown to signal errors found while attempting to perform
* an update on an app
*/
public class AppUpdateException extends Exception {
+ private static final Logger logger =
LoggerFactory.getLogger(AppUpdateException.class);
+
private static final long serialVersionUID = 4741554087496424850L;
public AppUpdateException(String message) {
super(message);
+
+ logger.info(message);
}
public AppUpdateException(String message, Throwable cause) {
Modified:
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/manager/AppDependencyNode.java
===================================================================
---
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/manager/AppDependencyNode.java
2012-12-19 22:57:53 UTC (rev 31022)
+++
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/manager/AppDependencyNode.java
2012-12-20 00:03:48 UTC (rev 31023)
@@ -8,6 +8,9 @@
import java.util.Queue;
import java.util.Set;
+import org.cytoscape.app.internal.manager.App.AppStatus;
+
+// This class represents a node in the app dependency graph, where each node
corresponds to an app.
public class AppDependencyNode {
private Set<AppDependencyNode> dependencies = new
HashSet<AppDependencyNode>();
@@ -16,17 +19,20 @@
private String currentAppName;
private String currentAppVersion;
- private App currentApp;
public AppDependencyNode(String appName, String appVersion) {
this.currentAppName = appName;
this.currentAppVersion = appVersion;
}
- public void setCurrentApp(App app) {
- this.currentApp = app;
+ public String getNodeAppName() {
+ return currentAppName;
}
+ public String getNodeAppVersion() {
+ return currentAppVersion;
+ }
+
public Set<AppDependencyNode> getDependencies() { return dependencies; }
public Set<AppDependencyNode> getParents() { return parents; }
@@ -45,7 +51,7 @@
Map<String, App> currentApps = new HashMap<String, App>();
for (App app : appManager.getApps()) {
-// currentApps.put(app.getAppName() + " " + app.get)
+ currentApps.put(app.getAppName() + " " +
app.getVersion(), app);
}
Queue<AppDependencyNode> dependenciesToCheck = new
LinkedList<AppDependencyNode>();
@@ -54,6 +60,10 @@
dependenciesToCheck.add(node);
}
+ List<String> missingDependencies = new LinkedList<String>();
+
+ // To check if a dependency is missing, check if it was hashed
into the hash table from
+ // a few lines above
while (!dependenciesToCheck.isEmpty()) {
AppDependencyNode current =
dependenciesToCheck.remove();
@@ -63,11 +73,16 @@
}
} else {
// Leaf
-// AppManager appManager;
-// if (appManager.getApps())
+ String keyName = current.getNodeAppName() + " "
+ current.getNodeAppVersion();
+
+ if (currentApps.get(keyName) == null
+ ||
currentApps.get(keyName).getStatus() != AppStatus.INSTALLED) {
+
+ missingDependencies.add(keyName);
+ }
}
}
- return null;
+ return missingDependencies;
}
}
Added:
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/manager/__Unused__KarafArchiveApp.java
===================================================================
---
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/manager/__Unused__KarafArchiveApp.java
(rev 0)
+++
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/manager/__Unused__KarafArchiveApp.java
2012-12-20 00:03:48 UTC (rev 31023)
@@ -0,0 +1,208 @@
+package org.cytoscape.app.internal.manager;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.commons.io.FileExistsException;
+import org.apache.commons.io.FileUtils;
+import org.cytoscape.app.internal.exception.AppDisableException;
+import org.cytoscape.app.internal.exception.AppInstallException;
+import org.cytoscape.app.internal.exception.AppInstanceException;
+import org.cytoscape.app.internal.exception.AppUninstallException;
+import org.cytoscape.app.swing.CySwingAppAdapter;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleException;
+
+public class __Unused__KarafArchiveApp extends App {
+
+ /**
+ * Karaf feature information used to install/uninstall a bundle app,
+ * which consists of Karaf features.
+ */
+
+ public static class KarafFeature {
+ public String featureName;
+ public String featureVersion;
+ }
+
+ private Map<String, KarafFeature> featuresSet;
+
+ public __Unused__KarafArchiveApp() {
+ super();
+
+ this.featuresSet = new HashMap<String, KarafFeature>();
+ }
+
+
+
+ @Override
+ public Object createAppInstance(CySwingAppAdapter appAdapter)
+ throws AppInstanceException {
+
+ BundleContext bundleContext = null;
+ Bundle bundle = null;
+ try {
+ bundle =
bundleContext.installBundle(this.getAppTemporaryInstallFile().toURI().toURL().toString());
+ } catch (MalformedURLException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (BundleException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+
+ return bundle;
+ }
+
+
+ @Override
+ public void install(AppManager appManager) throws AppInstallException {
+ /*
+
+ // Check if we already have an app object representing this app
registered to the app manager
+ for (App app : appManager.getApps()) {
+ if (this.heuristicEquals(app) && this != app) {
+
+ app.setAppFile(this.getAppFile());
+ app.install(appManager);
+
+ return;
+ }
+ }
+
+ File appFile = this.getAppFile();
+
+ try {
+ if (appFile != null
+ &&
!appFile.getParentFile().getCanonicalPath().equals(appManager.getInstalledAppsPath()))
{
+
+ FileUtils.copyFileToDirectory(appFile, new
File(appManager.getInstalledAppsPath()));
+
+ if
(appFile.getParentFile().getCanonicalPath().equalsIgnoreCase(
+
appManager.getUninstalledAppsPath())) {
+ appFile.delete();
+ }
+
+ this.setAppFile(new
File(appManager.getInstalledAppsPath() + File.separator + appFile.getName()));
+ }
+ } catch (IOException e) {
+ throw new AppInstallException("Failed to copy bundle
app to local storage directory for installed apps");
+ }
+
+ // Prepare to copy to Karaf deploy directory
+ String karafDeployDirectory =
appManager.getKarafDeployDirectory();
+
+ try {
+
+ // Copy if not already in Karaf deploy directory
+ File karafTargetFile = new File(karafDeployDirectory +
File.separator + this.getAppFile().getName());
+ if (!karafTargetFile.exists()) {
+ FileUtils.copyFile(this.getAppFile(),
karafTargetFile);
+ }
+
+ this.setAppTemporaryInstallFile(karafTargetFile);
+
+ } catch (IOException e) {
+ throw new AppInstallException("Failed to copy bundle
app to Karaf deploy directory");
+ }
+
+ // Check if the features were installed
+ FeaturesService featuresService =
appManager.getFeaturesService();
+ List<Feature> installedFeatures =
getCorrespondingFeatures(featuresService);
+
+ //System.out.println("features from app: " +
featuresSet.size());
+ //System.out.println("available features: " +
featuresService.listFeatures().length);
+
+ if (!appManager.getApps().contains(this)) {
+ appManager.getApps().add(this);
+ }
+
+ this.setStatus(AppStatus.INSTALLED);
+
+ */
+ }
+
+// Ticket 1554: FeaturesService is not API so we shouldn't use it. Disabled
for now.
+// private List<Feature> getCorrespondingFeatures(FeaturesService
featuresService) {
+// List<Feature> correspondingFeatures = new LinkedList<Feature>();
+//
+// Feature[] availableFeatures = new Feature[]{};
+// try {
+// availableFeatures = featuresService.listFeatures();
+// } catch (Exception e) {
+// e.printStackTrace();
+// }
+//
+// for (int i = 0; i < availableFeatures.length; i++) {
+// Feature availableFeature = availableFeatures[i];
+//
+// KarafArchiveApp.KarafFeature appFeature =
featuresSet.get(availableFeature.getName());
+//
+// // System.out.println("available feature: " +
availableFeature.getName() + ", " + availableFeature.getVersion());
+//
+// if (appFeature != null
+// &&
appFeature.featureVersion.equalsIgnoreCase(availableFeature.getVersion())) {
+// correspondingFeatures.add(availableFeature);
+//
+// // System.out.println("feature match: " +
availableFeature.getName() + " vs " + appFeature.featureName);
+// }
+// }
+//
+// return correspondingFeatures;
+// }
+
+ @Override
+ public void uninstall(AppManager appManager) throws
AppUninstallException {
+
+ // Use the default uninstallation procedure consisting of
moving the app file
+ // to the uninstalled apps directory
+ // defaultUninstall(appManager);
+
+ try {
+ File uninstallDirectoryTargetFile = new
File(appManager.getUninstalledAppsPath() + File.separator +
getAppFile().getName());
+
+ if (uninstallDirectoryTargetFile.exists()) {
+ uninstallDirectoryTargetFile.delete();
+ }
+
+ try {
+ FileUtils.moveFile(getAppFile(),
uninstallDirectoryTargetFile);
+ } catch (FileExistsException e) {
+ }
+
+ this.setAppFile(uninstallDirectoryTargetFile);
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+
+ throw new AppUninstallException("Unable to move app
file to uninstalled apps directory: " + e.getMessage());
+ }
+
+ this.getAppTemporaryInstallFile().delete();
+
+ this.setStatus(AppStatus.UNINSTALLED);
+ }
+
+ @Override
+ public void disable(AppManager appManager) throws AppDisableException {
+ // TODO Auto-generated method stub
+
+ }
+
+ /**
+ * Return the list of karaf features.
+ * @return The list of karaf features
+ */
+ public Map<String, KarafFeature> getFeaturesList() {
+ return featuresSet;
+ }
+
+ public void setFeaturesList(Map<String, KarafFeature> featuresSet) {
+ this.featuresSet = featuresSet;
+ }
+
+}
Added:
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/net/server/AddAllowOriginHeader.java
===================================================================
---
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/net/server/AddAllowOriginHeader.java
(rev 0)
+++
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/net/server/AddAllowOriginHeader.java
2012-12-20 00:03:48 UTC (rev 31023)
@@ -0,0 +1,16 @@
+package org.cytoscape.app.internal.net.server;
+
+/**
+ * Adds the {@code Access-Control-Allow-Origin} http header to responses.
+ */
+public class AddAllowOriginHeader implements CyHttpAfterResponse
+{
+ static final CyHttpResponseFactory responseFactory = new
CyHttpResponseFactoryImpl();
+
+ public CyHttpResponse intercept(CyHttpRequest request, CyHttpResponse
response)
+ {
+ final String origin = request.getHeaders().get("Origin");
+ response.getHeaders().put("Access-Control-Allow-Origin", (origin ==
null ? "*" : origin));
+ return response;
+ }
+}
Modified:
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/net/server/CyHttpRequestImpl.java
===================================================================
---
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/net/server/CyHttpRequestImpl.java
2012-12-19 22:57:53 UTC (rev 31022)
+++
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/net/server/CyHttpRequestImpl.java
2012-12-20 00:03:48 UTC (rev 31023)
@@ -33,7 +33,7 @@
}
catch (UnsupportedEncodingException e)
{
- throw new IllegalArgumentException("Unable to parse uri: " +
uriEncoded, e);
+ throw new IllegalArgumentException("Unable to parse URI: " +
uriEncoded, e);
}
method = request.getRequestLine().getMethod().toUpperCase();
Deleted:
core3/impl/trunk/app-impl/src/test/java/org/cytoscape/app/internal/net/server/AddAccessControlAllowOriginHeaderAfterResponseTest.java
===================================================================
---
core3/impl/trunk/app-impl/src/test/java/org/cytoscape/app/internal/net/server/AddAccessControlAllowOriginHeaderAfterResponseTest.java
2012-12-19 22:57:53 UTC (rev 31022)
+++
core3/impl/trunk/app-impl/src/test/java/org/cytoscape/app/internal/net/server/AddAccessControlAllowOriginHeaderAfterResponseTest.java
2012-12-20 00:03:48 UTC (rev 31023)
@@ -1,79 +0,0 @@
-package org.cytoscape.app.internal.net.server;
-
-import static org.junit.Assert.*;
-import static org.mockito.Mockito.*;
-
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-import java.util.regex.Pattern;
-import java.util.regex.Matcher;
-
-import org.apache.http.HttpStatus;
-
-import java.net.URL;
-import java.net.HttpURLConnection;
-import java.io.BufferedReader;
-import java.io.InputStreamReader;
-
-public class AddAccessControlAllowOriginHeaderAfterResponseTest {
- @Test
- public void testAddAccessControlAllowOriginHeader() throws Exception
- {
- final CyHttpd httpd = (new CyHttpdFactoryImpl()).createHttpd(new
LocalhostServerSocketFactory(2611));
- final CyHttpResponseFactory responseFactory = new
CyHttpResponseFactoryImpl();
- httpd.addResponder(new CyHttpResponder()
- {
- public Pattern getURIPattern()
- {
- return Pattern.compile("^/test$");
- }
-
- public CyHttpResponse respond(CyHttpRequest request, Matcher
matchedURI)
- {
- return responseFactory.createHttpResponse(HttpStatus.SC_OK,
"test response ok", "text/html");
- }
- });
- httpd.addAfterResponse(new
AddAccessControlAllowOriginHeaderAfterResponse());
- httpd.start();
-
- HttpURLConnection connection = null;
- final String url = "http://localhost:2611/test";
-
- connection = connectToURL(url, "GET");
- assertTrue(connection.getResponseCode() == HttpURLConnection.HTTP_OK);
- assertEquals(connection.getHeaderField("Access-Control-Allow-Origin"),
"*");
- assertEquals(readConnection(connection), "test response ok");
-
- httpd.stop();
- }
-
- private static HttpURLConnection connectToURL(String urlString, String
method) throws Exception
- {
- final URL url = new URL(urlString);
- final HttpURLConnection connection = (HttpURLConnection)
url.openConnection();
- connection.setRequestMethod(method);
- connection.setDoOutput(true);
- connection.setConnectTimeout(1000);
- connection.connect();
- return connection;
- }
-
- private static String readConnection(HttpURLConnection connection) throws
Exception
- {
- final StringBuffer buffer = new StringBuffer();
- final BufferedReader reader = new BufferedReader(new
InputStreamReader(connection.getInputStream()));
- while (true)
- {
- final String line = reader.readLine();
- if (line == null)
- break;
- buffer.append(line);
- }
-
- return buffer.toString();
- }
-}
Copied:
core3/impl/trunk/app-impl/src/test/java/org/cytoscape/app/internal/net/server/AddAllowOriginHeaderTest.java
(from rev 31021,
core3/impl/trunk/app-impl/src/test/java/org/cytoscape/app/internal/net/server/AddAccessControlAllowOriginHeaderAfterResponseTest.java)
===================================================================
---
core3/impl/trunk/app-impl/src/test/java/org/cytoscape/app/internal/net/server/AddAllowOriginHeaderTest.java
(rev 0)
+++
core3/impl/trunk/app-impl/src/test/java/org/cytoscape/app/internal/net/server/AddAllowOriginHeaderTest.java
2012-12-20 00:03:48 UTC (rev 31023)
@@ -0,0 +1,79 @@
+package org.cytoscape.app.internal.net.server;
+
+import static org.junit.Assert.*;
+import static org.mockito.Mockito.*;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.util.regex.Pattern;
+import java.util.regex.Matcher;
+
+import org.apache.http.HttpStatus;
+
+import java.net.URL;
+import java.net.HttpURLConnection;
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+
+public class AddAccessControlAllowOriginHeaderAfterResponseTest {
+ @Test
+ public void testAddAccessControlAllowOriginHeader() throws Exception
+ {
+ final CyHttpd httpd = (new CyHttpdFactoryImpl()).createHttpd(new
LocalhostServerSocketFactory(2611));
+ final CyHttpResponseFactory responseFactory = new
CyHttpResponseFactoryImpl();
+ httpd.addResponder(new CyHttpResponder()
+ {
+ public Pattern getURIPattern()
+ {
+ return Pattern.compile("^/test$");
+ }
+
+ public CyHttpResponse respond(CyHttpRequest request, Matcher
matchedURI)
+ {
+ return responseFactory.createHttpResponse(HttpStatus.SC_OK,
"test response ok", "text/html");
+ }
+ });
+ httpd.addAfterResponse(new AddAllowOriginHeader());
+ httpd.start();
+
+ HttpURLConnection connection = null;
+ final String url = "http://localhost:2611/test";
+
+ connection = connectToURL(url, "GET");
+ assertTrue(connection.getResponseCode() == HttpURLConnection.HTTP_OK);
+ assertEquals(connection.getHeaderField("Access-Control-Allow-Origin"),
"*");
+ assertEquals(readConnection(connection), "test response ok");
+
+ httpd.stop();
+ }
+
+ private static HttpURLConnection connectToURL(String urlString, String
method) throws Exception
+ {
+ final URL url = new URL(urlString);
+ final HttpURLConnection connection = (HttpURLConnection)
url.openConnection();
+ connection.setRequestMethod(method);
+ connection.setDoOutput(true);
+ connection.setConnectTimeout(1000);
+ connection.connect();
+ return connection;
+ }
+
+ private static String readConnection(HttpURLConnection connection) throws
Exception
+ {
+ final StringBuffer buffer = new StringBuffer();
+ final BufferedReader reader = new BufferedReader(new
InputStreamReader(connection.getInputStream()));
+ while (true)
+ {
+ final String line = reader.readLine();
+ if (line == null)
+ break;
+ buffer.append(line);
+ }
+
+ return buffer.toString();
+ }
+}
--
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.