diff options
author | antelder <antelder@13f79535-47bb-0310-9956-ffa450edef68> | 2011-07-07 21:04:04 +0000 |
---|---|---|
committer | antelder <antelder@13f79535-47bb-0310-9956-ffa450edef68> | 2011-07-07 21:04:04 +0000 |
commit | fbddc5728082725e906e7e11ff2631a65ed34a51 (patch) | |
tree | b4811d882c0da80ae79c73115c524311557643d2 /sca-java-2.x/trunk/modules/shell/src | |
parent | 9191d70401329c8dab8d763a8fcbc3e7f08c8628 (diff) |
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
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@1144036 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'sca-java-2.x/trunk/modules/shell/src')
4 files changed, 171 insertions, 1 deletions
diff --git a/sca-java-2.x/trunk/modules/shell/src/main/java/org/apache/tuscany/sca/shell/Command.java b/sca-java-2.x/trunk/modules/shell/src/main/java/org/apache/tuscany/sca/shell/Command.java new file mode 100644 index 0000000000..30e46cb0e1 --- /dev/null +++ b/sca-java-2.x/trunk/modules/shell/src/main/java/org/apache/tuscany/sca/shell/Command.java @@ -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;
+}
diff --git a/sca-java-2.x/trunk/modules/shell/src/main/java/org/apache/tuscany/sca/shell/Shell.java b/sca-java-2.x/trunk/modules/shell/src/main/java/org/apache/tuscany/sca/shell/Shell.java index a85ca8ec0d..5f56d843c4 100644 --- a/sca-java-2.x/trunk/modules/shell/src/main/java/org/apache/tuscany/sca/shell/Shell.java +++ b/sca-java-2.x/trunk/modules/shell/src/main/java/org/apache/tuscany/sca/shell/Shell.java @@ -51,11 +51,13 @@ import org.apache.tuscany.sca.common.java.io.IOHelper; 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);
}
diff --git a/sca-java-2.x/trunk/modules/shell/src/main/java/org/apache/tuscany/sca/shell/commands/AddComposite.java b/sca-java-2.x/trunk/modules/shell/src/main/java/org/apache/tuscany/sca/shell/commands/AddComposite.java new file mode 100644 index 0000000000..fe60ba5c54 --- /dev/null +++ b/sca-java-2.x/trunk/modules/shell/src/main/java/org/apache/tuscany/sca/shell/commands/AddComposite.java @@ -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;
+ }
+
+}
diff --git a/sca-java-2.x/trunk/modules/shell/src/main/resources/META-INF/services/org.apache.tuscany.sca.shell.Command b/sca-java-2.x/trunk/modules/shell/src/main/resources/META-INF/services/org.apache.tuscany.sca.shell.Command new file mode 100644 index 0000000000..a846db9e9b --- /dev/null +++ b/sca-java-2.x/trunk/modules/shell/src/main/resources/META-INF/services/org.apache.tuscany.sca.shell.Command @@ -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
+
|