Author: kono Date: 2012-05-03 18:36:59 -0700 (Thu, 03 May 2012) New Revision: 29104
Added: core3/impl/trunk/scripting-impl/src/main/java/org/cytoscape/scripting/internal/AbstractExecuteScriptTask.java core3/impl/trunk/scripting-impl/src/main/java/org/cytoscape/scripting/internal/ExecuteScriptCommandTask.java core3/impl/trunk/scripting-impl/src/main/java/org/cytoscape/scripting/internal/command/ core3/impl/trunk/scripting-impl/src/main/java/org/cytoscape/scripting/internal/command/CommandCompleter.java core3/impl/trunk/scripting-impl/src/main/java/org/cytoscape/scripting/internal/command/ExecuteScriptCommand.java core3/impl/trunk/scripting-impl/src/main/resources/ core3/impl/trunk/scripting-impl/src/main/resources/OSGI-INF/ core3/impl/trunk/scripting-impl/src/main/resources/OSGI-INF/blueprint/ core3/impl/trunk/scripting-impl/src/main/resources/OSGI-INF/blueprint/command.xml Modified: core3/impl/trunk/scripting-impl/pom.xml core3/impl/trunk/scripting-impl/src/main/java/org/cytoscape/scripting/internal/ExecuteScriptTask.java core3/impl/trunk/scripting-impl/src/test/resources/network_creation.js Log: Extended karaf command to run scripts from command line. Modified: core3/impl/trunk/scripting-impl/pom.xml =================================================================== --- core3/impl/trunk/scripting-impl/pom.xml 2012-05-04 01:35:46 UTC (rev 29103) +++ core3/impl/trunk/scripting-impl/pom.xml 2012-05-04 01:36:59 UTC (rev 29104) @@ -1,5 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <parent> <artifactId>impl-parent</artifactId> @@ -15,7 +16,7 @@ <modelVersion>4.0.0</modelVersion> <artifactId>scripting-impl</artifactId> - <name>Cytoscape Scripting Impl (${project.artifactId})</name> + <name>Cytoscape Scripting Impl (${project.artifactId})</name> <packaging>bundle</packaging> @@ -86,8 +87,14 @@ <groupId>org.cytoscape</groupId> <artifactId>app-api</artifactId> </dependency> + + <dependency> + <groupId>org.apache.karaf.shell</groupId> + <artifactId>org.apache.karaf.shell.console</artifactId> + <version>2.2.3</version> + <scope>provided</scope> + </dependency> - <!-- Testing --> <dependency> <groupId>junit</groupId> Added: core3/impl/trunk/scripting-impl/src/main/java/org/cytoscape/scripting/internal/AbstractExecuteScriptTask.java =================================================================== --- core3/impl/trunk/scripting-impl/src/main/java/org/cytoscape/scripting/internal/AbstractExecuteScriptTask.java (rev 0) +++ core3/impl/trunk/scripting-impl/src/main/java/org/cytoscape/scripting/internal/AbstractExecuteScriptTask.java 2012-05-04 01:36:59 UTC (rev 29104) @@ -0,0 +1,49 @@ +package org.cytoscape.scripting.internal; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.script.ScriptEngineFactory; +import javax.script.ScriptEngineManager; + +import org.cytoscape.app.CyAppAdapter; +import org.cytoscape.work.Task; + +public abstract class AbstractExecuteScriptTask implements Task { + + protected final Map<String, ScriptEngineFactory> name2engineMap; + protected final CyAppAdapter cyAppAdapter; + + protected final List<String> engineNameList; + + protected final ScriptEngineManager manager; + + AbstractExecuteScriptTask(final ScriptEngineManager manager, final CyAppAdapter cyAppAdapter) { + this.cyAppAdapter = cyAppAdapter; + this.manager = manager; + + this.name2engineMap = new HashMap<String, ScriptEngineFactory>(); + + final List<ScriptEngineFactory> engines = manager.getEngineFactories(); + engineNameList = new ArrayList<String>(); + + for (final ScriptEngineFactory engine : engines) { + final String langName = engine.getLanguageName(); + final String langVersion = engine.getLanguageVersion(); + final String engineName = engine.getEngineName(); + final String engineDescription = langName + " (" + engineName + ", Version " + langVersion + ")"; + engineNameList.add(engineDescription); + name2engineMap.put(engineDescription, engine); + } + + if (engineNameList.size() == 0) + throw new IllegalStateException("No Scripting Engine is available."); + } + + @Override + public void cancel() { + Thread.currentThread().interrupt(); + } +} Added: core3/impl/trunk/scripting-impl/src/main/java/org/cytoscape/scripting/internal/ExecuteScriptCommandTask.java =================================================================== --- core3/impl/trunk/scripting-impl/src/main/java/org/cytoscape/scripting/internal/ExecuteScriptCommandTask.java (rev 0) +++ core3/impl/trunk/scripting-impl/src/main/java/org/cytoscape/scripting/internal/ExecuteScriptCommandTask.java 2012-05-04 01:36:59 UTC (rev 29104) @@ -0,0 +1,50 @@ +package org.cytoscape.scripting.internal; + +import java.io.File; +import java.io.FileReader; +import java.util.ArrayList; +import java.util.List; + +import javax.script.ScriptEngine; +import javax.script.ScriptEngineManager; + +import org.cytoscape.app.CyAppAdapter; +import org.cytoscape.work.TaskMonitor; + +public class ExecuteScriptCommandTask extends AbstractExecuteScriptTask { + + private final String engineName; + private final String filename; + private final List<String> args; + + public ExecuteScriptCommandTask(final ScriptEngineManager manager, final CyAppAdapter cyAppAdapter, + final String engineName, final String filename, final List<String> args) { + super(manager, cyAppAdapter); + + this.engineName = engineName; + this.filename = filename; + if(args == null) + this.args = new ArrayList<String>(); + else + this.args = args; + } + + @Override + public void run(TaskMonitor taskMonitor) throws Exception { + final ScriptEngine engine = manager.getEngineByName(engineName); + + // Provide access to CyAppAdapter. + engine.put("cyAppAdapter", cyAppAdapter); + + final String[] argArray = new String[args.size()]; + for(int i=0; i<args.size(); i++) { + System.out.println("* ARG = " + args.get(i)); + argArray[i] = args.get(i); + } + engine.put("args", argArray); + + // Execute + engine.eval(new FileReader(new File(filename))); + } + +} Modified: core3/impl/trunk/scripting-impl/src/main/java/org/cytoscape/scripting/internal/ExecuteScriptTask.java =================================================================== --- core3/impl/trunk/scripting-impl/src/main/java/org/cytoscape/scripting/internal/ExecuteScriptTask.java 2012-05-04 01:35:46 UTC (rev 29103) +++ core3/impl/trunk/scripting-impl/src/main/java/org/cytoscape/scripting/internal/ExecuteScriptTask.java 2012-05-04 01:36:59 UTC (rev 29104) @@ -2,17 +2,12 @@ import java.io.File; import java.io.FileReader; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; import javax.script.ScriptEngine; import javax.script.ScriptEngineFactory; import javax.script.ScriptEngineManager; import org.cytoscape.app.CyAppAdapter; -import org.cytoscape.work.Task; import org.cytoscape.work.TaskMonitor; import org.cytoscape.work.Tunable; import org.cytoscape.work.util.ListSingleSelection; @@ -22,7 +17,7 @@ * Use standard Java scripting mechanism to run script. * */ -public class ExecuteScriptTask implements Task { +public class ExecuteScriptTask extends AbstractExecuteScriptTask { @Tunable(description = "Select a script file:", params = "fileCategory=SCRIPT;input=true") public File file; @@ -30,29 +25,10 @@ @Tunable(description = "Select Scripting Language:") public ListSingleSelection<String> engineNames; - private final Map<String, ScriptEngineFactory> name2engineMap; - private final CyAppAdapter cyAppAdapter; ExecuteScriptTask(final ScriptEngineManager manager, final CyAppAdapter cyAppAdapter) { - this.cyAppAdapter = cyAppAdapter; + super(manager, cyAppAdapter); - this.name2engineMap = new HashMap<String, ScriptEngineFactory>(); - - final List<ScriptEngineFactory> engines = manager.getEngineFactories(); - final List<String> engineNameList = new ArrayList<String>(); - - for(final ScriptEngineFactory engine: engines) { - final String langName = engine.getEngineName(); - final String langVersion = engine.getLanguageVersion(); - final String engineName = engine.getEngineName(); - final String engineDescription = langName + " (" + engineName + ", Version " + langVersion + ")"; - engineNameList.add(engineDescription); - name2engineMap.put(engineDescription, engine); - } - - if(engineNameList.size() == 0) - throw new IllegalStateException("No Scripting Engine is available."); - engineNames = new ListSingleSelection<String>(engineNameList); engineNames.setSelectedValue(engineNameList.get(0)); } @@ -68,10 +44,4 @@ // Execute engine.eval(new FileReader(file)); } - - @Override - public void cancel() { - Thread.currentThread().interrupt(); - } - } Added: core3/impl/trunk/scripting-impl/src/main/java/org/cytoscape/scripting/internal/command/CommandCompleter.java =================================================================== --- core3/impl/trunk/scripting-impl/src/main/java/org/cytoscape/scripting/internal/command/CommandCompleter.java (rev 0) +++ core3/impl/trunk/scripting-impl/src/main/java/org/cytoscape/scripting/internal/command/CommandCompleter.java 2012-05-04 01:36:59 UTC (rev 29104) @@ -0,0 +1,37 @@ +package org.cytoscape.scripting.internal.command; + +import java.util.List; + +import javax.script.ScriptEngineFactory; +import javax.script.ScriptEngineManager; + +import org.apache.karaf.shell.console.Completer; +import org.apache.karaf.shell.console.completer.StringsCompleter; + +public class CommandCompleter implements Completer { + + private ScriptEngineManager manager; + + /** + * @param buffer + * the beginning string typed by the user + * @param cursor + * the position of the cursor + * @param candidates + * the list of completions proposed to the user + */ + public int complete(String buffer, int cursor, List candidates) { + StringsCompleter delegate = new StringsCompleter(); + + final List<ScriptEngineFactory> engines = manager.getEngineFactories(); + + for (final ScriptEngineFactory engine : engines) { + final List<String> names = engine.getNames(); + for (final String name : names) + delegate.getStrings().add(name); + } + + return delegate.complete(buffer, cursor, candidates); + } + +} \ No newline at end of file Added: core3/impl/trunk/scripting-impl/src/main/java/org/cytoscape/scripting/internal/command/ExecuteScriptCommand.java =================================================================== --- core3/impl/trunk/scripting-impl/src/main/java/org/cytoscape/scripting/internal/command/ExecuteScriptCommand.java (rev 0) +++ core3/impl/trunk/scripting-impl/src/main/java/org/cytoscape/scripting/internal/command/ExecuteScriptCommand.java 2012-05-04 01:36:59 UTC (rev 29104) @@ -0,0 +1,49 @@ +package org.cytoscape.scripting.internal.command; + +import java.util.ArrayList; +import java.util.List; + +import javax.script.ScriptEngineManager; + +import org.apache.felix.gogo.commands.Argument; +import org.apache.felix.gogo.commands.Command; +import org.apache.karaf.shell.console.OsgiCommandSupport; +import org.cytoscape.app.CyAppAdapter; +import org.cytoscape.scripting.internal.ExecuteScriptCommandTask; +import org.cytoscape.work.TaskIterator; +import org.cytoscape.work.TaskManager; + +@Command(scope = "cytoscape", name = "script", description = "Execute scripts", detailedDescription = "Execute script in the file.") +public class ExecuteScriptCommand extends OsgiCommandSupport { + + @Argument(index = 0, name = "engine", description = "Name of scripting engine", required = true, multiValued = false) + String engine; + + @Argument(index = 1, name = "filename", description = "Script file name", required = true, multiValued = false) + String filename; + + @Argument(index = 2, name = "arg", description = "Optional arguments for the script", required = false, multiValued = true) + List<String> args; + + private ScriptEngineManager manager = new ScriptEngineManager(); + private TaskManager<?, ?> taskManager; + private CyAppAdapter cyAppAdapter; + + public void setCyAppAdapter(CyAppAdapter cyAppAdapter) { + this.cyAppAdapter = cyAppAdapter; + } + + public void setTaskManager(TaskManager taskManager) { + this.taskManager = taskManager; + } + + @Override + protected Object doExecute() throws Exception { + final TaskIterator taskItr = new TaskIterator(new ExecuteScriptCommandTask(manager, cyAppAdapter, engine, + filename, args)); + + taskManager.execute(taskItr); + + return null; + } +} \ No newline at end of file Added: core3/impl/trunk/scripting-impl/src/main/resources/OSGI-INF/blueprint/command.xml =================================================================== --- core3/impl/trunk/scripting-impl/src/main/resources/OSGI-INF/blueprint/command.xml (rev 0) +++ core3/impl/trunk/scripting-impl/src/main/resources/OSGI-INF/blueprint/command.xml 2012-05-04 01:36:59 UTC (rev 29104) @@ -0,0 +1,24 @@ +<blueprint default-activation="eager" + xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + + <reference id="taskManagerServiceRef" interface="org.cytoscape.work.TaskManager" /> + <reference id="cyAppAdapterServiceRef" interface="org.cytoscape.app.CyAppAdapter" /> + + <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.0.0"> + <command name="cytoscape/script"> + <action + class="org.cytoscape.scripting.internal.command.ExecuteScriptCommand"> + <property name="taskManager" ref="taskManagerServiceRef" /> + <property name="cyAppAdapter" ref="cyAppAdapterServiceRef" /> + </action> + <completers> + <ref component-id="commandCompleter" /> + <null /> + </completers> + </command> + </command-bundle> + + <bean id="commandCompleter" + class="org.cytoscape.scripting.internal.command.CommandCompleter" /> + +</blueprint> \ No newline at end of file Modified: core3/impl/trunk/scripting-impl/src/test/resources/network_creation.js =================================================================== --- core3/impl/trunk/scripting-impl/src/test/resources/network_creation.js 2012-05-04 01:35:46 UTC (rev 29103) +++ core3/impl/trunk/scripting-impl/src/test/resources/network_creation.js 2012-05-04 01:36:59 UTC (rev 29104) @@ -1,12 +1,36 @@ // Generate a complete graph -importPackage( Packages.javax.swing ); -importPackage( Packages.org.cytoscape.app.CyAppAdapter ); -importPackage( Packages.org.cytoscape.model.CyNetwork ); +importPackage(Packages.org.cytoscape.app.CyAppAdapter); +importPackage(Packages.org.cytoscape.model.CyNetwork); +// Extract arguments +var numberOfNodes = args[0]; +if(numberOfNodes == null) + numberOfNodes = 10; + var newNetwork = cyAppAdapter.getCyNetworkFactory().createNetwork(); +newNetwork.getRow(newNetwork).set("name", "Complete Graph with " + numberOfNodes + " Nodes"); + +// Register it to the manager cyAppAdapter.getCyNetworkManager().addNetwork(newNetwork); var nodes = new Array(); +for( i = 0; i < numberOfNodes; i++) { + var nodeName = "Node " + i; + var node = newNetwork.addNode(); + newNetwork.getRow(node).set("name", nodeName); + nodes[i] = node; +} -println("Network registered!: "); +var edgeCount = 0; +for( i = 0; i < numberOfNodes; i++) { + var source = nodes[i]; + for( j = 0; j < numberOfNodes; j++) { + var target = nodes[j]; + if(newNetwork.containsEdge(source, target) == false && newNetwork.containsEdge(target, source) == false && j != i) { + var edge = newNetwork.addEdge(source, target, true); + newNetwork.getRow(edge).set("name", "Edge " + edgeCount++); + newNetwork.getRow(edge).set("interaction", "interacts_with"); + } + } +} \ No newline at end of file -- 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.
