You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by an...@apache.org on 2011/07/07 23:04:05 UTC

svn commit: r1144036 - in /tuscany/sca-java-2.x/trunk/modules/shell/src/main: java/org/apache/tuscany/sca/shell/ java/org/apache/tuscany/sca/shell/commands/ resources/ resources/META-INF/ resources/META-INF/services/

Author: antelder
Date: Thu Jul  7 21:04:04 2011
New Revision: 1144036

URL: http://svn.apache.org/viewvc?rev=1144036&view=rev
Log:
Start adding a way to have pluggable Shell commands. And start refactoring commands out of the shell class into their own slef contained class for each command

Added:
    tuscany/sca-java-2.x/trunk/modules/shell/src/main/java/org/apache/tuscany/sca/shell/Command.java
    tuscany/sca-java-2.x/trunk/modules/shell/src/main/java/org/apache/tuscany/sca/shell/commands/
    tuscany/sca-java-2.x/trunk/modules/shell/src/main/java/org/apache/tuscany/sca/shell/commands/AddComposite.java
    tuscany/sca-java-2.x/trunk/modules/shell/src/main/resources/
    tuscany/sca-java-2.x/trunk/modules/shell/src/main/resources/META-INF/
    tuscany/sca-java-2.x/trunk/modules/shell/src/main/resources/META-INF/services/
    tuscany/sca-java-2.x/trunk/modules/shell/src/main/resources/META-INF/services/org.apache.tuscany.sca.shell.Command
Modified:
    tuscany/sca-java-2.x/trunk/modules/shell/src/main/java/org/apache/tuscany/sca/shell/Shell.java

Added: tuscany/sca-java-2.x/trunk/modules/shell/src/main/java/org/apache/tuscany/sca/shell/Command.java
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/shell/src/main/java/org/apache/tuscany/sca/shell/Command.java?rev=1144036&view=auto
==============================================================================
--- tuscany/sca-java-2.x/trunk/modules/shell/src/main/java/org/apache/tuscany/sca/shell/Command.java (added)
+++ tuscany/sca-java-2.x/trunk/modules/shell/src/main/java/org/apache/tuscany/sca/shell/Command.java Thu Jul  7 21:04:04 2011
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+ */
+
+package org.apache.tuscany.sca.shell;
+
+import jline.Completor;
+
+public interface Command {
+    String getName();
+    String getShortHelp();
+    String getHelp();
+    Completor[] getCompletors();
+    boolean invoke(String[] args) throws Exception;
+}

Modified: tuscany/sca-java-2.x/trunk/modules/shell/src/main/java/org/apache/tuscany/sca/shell/Shell.java
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/shell/src/main/java/org/apache/tuscany/sca/shell/Shell.java?rev=1144036&r1=1144035&r2=1144036&view=diff
==============================================================================
--- tuscany/sca-java-2.x/trunk/modules/shell/src/main/java/org/apache/tuscany/sca/shell/Shell.java (original)
+++ tuscany/sca-java-2.x/trunk/modules/shell/src/main/java/org/apache/tuscany/sca/shell/Shell.java Thu Jul  7 21:04:04 2011
@@ -51,11 +51,13 @@ import org.apache.tuscany.sca.common.jav
 import org.apache.tuscany.sca.contribution.Artifact;
 import org.apache.tuscany.sca.contribution.Contribution;
 import org.apache.tuscany.sca.contribution.processor.ContributionReadException;
+import org.apache.tuscany.sca.extensibility.ServiceDeclaration;
+import org.apache.tuscany.sca.extensibility.ServiceDiscovery;
 import org.apache.tuscany.sca.impl.NodeImpl;
 import org.apache.tuscany.sca.monitor.ValidationException;
 import org.apache.tuscany.sca.runtime.ActivationException;
-import org.apache.tuscany.sca.runtime.DomainRegistry;
 import org.apache.tuscany.sca.runtime.ContributionDescription;
+import org.apache.tuscany.sca.runtime.DomainRegistry;
 import org.apache.tuscany.sca.runtime.Version;
 import org.apache.tuscany.sca.shell.jline.JLine;
 import org.oasisopen.sca.NoSuchServiceException;
@@ -71,6 +73,7 @@ public class Shell {
     private String currentDomain = "";
     private Map<String, Node> standaloneNodes = new HashMap<String, Node>();
     private Map<String, Node> nodes = new HashMap<String, Node>();
+    private Map<String, Command> commands = new HashMap<String, Command>();
 
     public static final String[] COMMANDS = new String[] {"addComposite", "bye", "domain", "domains", "domainComposite", "help", "install", "installed", "invoke",
                                                           "load", "nodes", "remove", "run", "save", "services", "start", "started", "stop"};
@@ -112,11 +115,35 @@ public class Shell {
     public Shell(String domainURI, boolean useJLine) {
         this.runtime = TuscanyRuntime.newInstance();
         this.useJline = useJLine;
+        
+        try {
+            initCommands();
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        
         if (domainURI != null) {
             domain(domainURI);
         }
     }
 
+    void initCommands() throws IOException {
+        for (ServiceDeclaration sd : ServiceDiscovery.getInstance().getServiceDeclarations(Command.class)) {
+            try {
+                Class<?> c = Class.forName(sd.getClassName());
+                try {
+                    Command command = (Command)c.getConstructor(Shell.class).newInstance(this);
+                    commands.put(command.getName(), command);
+                } catch (NoSuchMethodException e) {
+                    Command command = (Command)c.newInstance();
+                    commands.put(command.getName(), command);
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
     boolean addComposite(String curi, String compositeURL) throws ActivationException, ValidationException, ContributionReadException, FileNotFoundException, XMLStreamException, URISyntaxException {
         File f = new File(IOHelper.getLocationAsURL(compositeURL).toURI());
         getNode().addDeploymentComposite(curi, new FileReader(f));
@@ -525,6 +552,10 @@ public class Shell {
         return true;
     }
 
+    public Map<String, Command> getCommands() {
+        return commands;
+    }
+    
     public Node getNode() {
         return nodes.get(currentDomain);
     }

Added: tuscany/sca-java-2.x/trunk/modules/shell/src/main/java/org/apache/tuscany/sca/shell/commands/AddComposite.java
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/shell/src/main/java/org/apache/tuscany/sca/shell/commands/AddComposite.java?rev=1144036&view=auto
==============================================================================
--- tuscany/sca-java-2.x/trunk/modules/shell/src/main/java/org/apache/tuscany/sca/shell/commands/AddComposite.java (added)
+++ tuscany/sca-java-2.x/trunk/modules/shell/src/main/java/org/apache/tuscany/sca/shell/commands/AddComposite.java Thu Jul  7 21:04:04 2011
@@ -0,0 +1,91 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+ */
+
+package org.apache.tuscany.sca.shell.commands;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.net.URISyntaxException;
+
+import javax.xml.stream.XMLStreamException;
+
+import jline.Completor;
+import jline.FileNameCompletor;
+import jline.NullCompletor;
+
+import org.apache.tuscany.sca.common.java.io.IOHelper;
+import org.apache.tuscany.sca.contribution.processor.ContributionReadException;
+import org.apache.tuscany.sca.monitor.ValidationException;
+import org.apache.tuscany.sca.runtime.ActivationException;
+import org.apache.tuscany.sca.shell.Command;
+import org.apache.tuscany.sca.shell.Shell;
+import org.apache.tuscany.sca.shell.jline.ICURICompletor;
+
+public class AddComposite implements Command {
+
+    private Shell shell;
+    
+    public AddComposite(Shell shell) {
+        this.shell = shell;
+    }
+
+    @Override
+    public String getName() {
+        return "addComposite";
+    }
+
+    @Override
+    public String getShortHelp() {
+        return "addComposite <contributionURI> <compositeURI>";
+    }
+
+    @Override
+    public String getHelp() {
+        StringBuilder helpText = new StringBuilder();
+        helpText.append("Adds a deployable composite to an installed contribution.");
+        helpText.append("\n");
+        helpText.append("Arguments:");
+        helpText.append("   contributionURI - (required) the URI of the installed contribution");
+        helpText.append("   compositeURL    - (required) the URL to an external composite file");
+        return helpText.toString();
+    }
+
+    @Override
+    public Completor[] getCompletors() {
+        return new Completor[]{new ICURICompletor(shell), new FileNameCompletor(), new NullCompletor()};
+    }
+
+    @Override
+    public boolean invoke(String[] args) throws ContributionReadException, FileNotFoundException, XMLStreamException, ActivationException, ValidationException, URISyntaxException {
+        if (args.length != 2) {
+            System.err.println("Wrong number of args");
+            System.err.println(getShortHelp());
+            return true;
+        }
+        if (shell.getNode().getInstalledContributionURIs().contains(args[0])) {
+            System.err.println("contribution not installed: " + args[0]);
+        }
+        
+        File f = new File(IOHelper.getLocationAsURL(args[1]).toURI());
+        shell.getNode().addDeploymentComposite(args[0], new FileReader(f));
+        return true;
+    }
+    
+}

Added: tuscany/sca-java-2.x/trunk/modules/shell/src/main/resources/META-INF/services/org.apache.tuscany.sca.shell.Command
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/shell/src/main/resources/META-INF/services/org.apache.tuscany.sca.shell.Command?rev=1144036&view=auto
==============================================================================
--- tuscany/sca-java-2.x/trunk/modules/shell/src/main/resources/META-INF/services/org.apache.tuscany.sca.shell.Command (added)
+++ tuscany/sca-java-2.x/trunk/modules/shell/src/main/resources/META-INF/services/org.apache.tuscany.sca.shell.Command Thu Jul  7 21:04:04 2011
@@ -0,0 +1,18 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+org.apache.tuscany.sca.shell.commands.AddComposite
+