Initial commit of OSGi Shell contribution. (FELIX-946)
git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@783826 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/gogo/src/org/osgi/service/command/CommandProcessor.java b/gogo/src/org/osgi/service/command/CommandProcessor.java
new file mode 100644
index 0000000..dba883d
--- /dev/null
+++ b/gogo/src/org/osgi/service/command/CommandProcessor.java
@@ -0,0 +1,66 @@
+/*
+ * 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.osgi.service.command;
+
+import java.io.*;
+
+/**
+ * A command shell can create and maintain a number of command sessions.
+ *
+ * @author aqute
+ *
+ */
+public interface CommandProcessor {
+ /**
+ * The scope of commands provided by this service. This name can be used to distinguish
+ * between different command providers with the same function names.
+ */
+ final static String COMMAND_SCOPE = "osgi.command.scope";
+
+ /**
+ * A list of method names that may be called for this command provider. A
+ * name may end with a *, this will then be calculated from all declared public
+ * methods in this service.
+ *
+ * Help information for the command may be supplied with a space as
+ * separation.
+ */
+ final static String COMMAND_FUNCTION = "osgi.command.function";
+
+ /**
+ * Create a new command session associated with IO streams.
+ *
+ * The session is bound to the life cycle of the bundle getting this
+ * service. The session will be automatically closed when this bundle is
+ * stopped or the service is returned.
+ *
+ * The shell will provide any available commands to this session and
+ * can set additional variables.
+ *
+ * @param in
+ * The value used for System.in
+ * @param out
+ * The stream used for System.out
+ * @param err
+ * The stream used for System.err
+ * @return A new session.
+ */
+ CommandSession createSession(InputStream in, PrintStream out,
+ PrintStream err);
+}
diff --git a/gogo/src/org/osgi/service/command/CommandSession.java b/gogo/src/org/osgi/service/command/CommandSession.java
new file mode 100644
index 0000000..6770689
--- /dev/null
+++ b/gogo/src/org/osgi/service/command/CommandSession.java
@@ -0,0 +1,96 @@
+/*
+ * 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.osgi.service.command;
+
+import java.io.*;
+
+public interface CommandSession {
+ /**
+ * Execute a program in this session.
+ *
+ * @param commandline
+ * @return the result of the execution
+ */
+ Object execute(CharSequence commandline) throws Exception;
+
+ /**
+ * Close this command session. After the session is closed, it will throw
+ * IllegalStateException when it is used.
+ *
+ * @param
+ */
+ void close();
+
+ /**
+ * Return the input stream that is the first of the pipeline. This stream is
+ * sometimes necessary to communicate directly to the end user. For example,
+ * a "less" or "more" command needs direct input from the keyboard to
+ * control the paging.
+ *
+ * @return InpuStream used closest to the user or null if input is from a
+ * file.
+ */
+ InputStream getKeybord();
+
+ /**
+ * Return the PrintStream for the console. This must always be the stream
+ * "closest" to the user. This stream can be used to post messages that
+ * bypass the piping. If the output is piped to a file, then the object
+ * returned must be null.
+ *
+ * @return
+ */
+ PrintStream getConsole();
+
+ /**
+ * Get the value of a variable.
+ *
+ * @param name
+ * @return
+ */
+ Object get(String name);
+
+ /**
+ * Set the value of a variable.
+ *
+ * @param name
+ * Name of the variable.
+ * @param value
+ * Value of the variable
+ */
+ void put(String name, Object value);
+
+ /**
+ * Convert an object to string form (CharSequence). The level is defined in
+ * the Converter interface, it can be one of INSPECT, LINE, PART. This
+ * function always returns a non null value. As a last resort, toString is
+ * called on the Object.
+ *
+ * @param target
+ * @param level
+ * @return
+ */
+ CharSequence format(Object target, int level);
+
+ /**
+ * Convert an object to another type.
+ */
+
+ Object convert(Class<?> type, Object instance);
+}
diff --git a/gogo/src/org/osgi/service/command/Converter.java b/gogo/src/org/osgi/service/command/Converter.java
new file mode 100644
index 0000000..9f57481
--- /dev/null
+++ b/gogo/src/org/osgi/service/command/Converter.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.osgi.service.command;
+
+
+/**
+ * A converter is a service that can help create specific object types from a
+ * string, and vice versa.
+ *
+ * The shell is capable of coercing arguments to the their proper type. However,
+ * sometimes commands require extra help to do this conversion. This service can
+ * implement a converter for a number of types.
+ *
+ * The command shell will rank these services in order of service.ranking and
+ * will then call them until one of the converters succeeds.
+ *
+ */
+public interface Converter {
+ /**
+ * This property is a string, or array of strings, and defines the classes
+ * or interfaces that this converter recognizes. Recognized classes can be
+ * converted from a string to a class and they can be printed in 3 different
+ * modes.
+ */
+ String CONVERTER_CLASSES = "osgi.converter.classes";
+
+ /**
+ * Print the object in detail. This can contain multiple lines.
+ */
+ int INSPECT = 0;
+
+ /**
+ * Print the object as a row in a table. The columns should align for
+ * multiple objects printed beneath each other. The print may run over
+ * multiple lines but must not end in a CR.
+ */
+ int LINE = 1;
+
+ /**
+ * Print the value in a small format so that it is identifiable. This
+ * printed format must be recognizable by the conversion method.
+ */
+ int PART = 2;
+
+ /**
+ * Convert an object to the desired type.
+ *
+ * Return null if the conversion can not be done. Otherwise return and
+ * object that extends the desired type or implements it.
+ *
+ * @param desiredType
+ * The type that the returned object can be assigned to
+ * @param in
+ * The object that must be converted
+ * @return An object that can be assigned to the desired type or null.
+ * @throws Exception
+ */
+ Object convert(Class<?> desiredType, Object in) throws Exception;
+
+ /**
+ * Convert an objet to a CharSequence object in the requested format. The
+ * format can be INSPECT, LINE, or PART. Other values must throw
+ * IllegalArgumentException.
+ *
+ * @param target
+ * The object to be converted to a String
+ * @param level
+ * One of INSPECT, LINE, or PART.
+ * @param escape
+ * Use this object to format sub ordinate objects.
+ * @return A printed object of potentially multiple lines
+ * @throws Exception
+ */
+ CharSequence format(Object target, int level, Converter escape) throws Exception;
+}
diff --git a/gogo/src/org/osgi/service/command/Function.java b/gogo/src/org/osgi/service/command/Function.java
new file mode 100644
index 0000000..81f175e
--- /dev/null
+++ b/gogo/src/org/osgi/service/command/Function.java
@@ -0,0 +1,38 @@
+/*
+ * 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.osgi.service.command;
+
+import java.util.*;
+
+/**
+ * A Function is a a block of code that can be executed with a set of arguments,
+ * it returns the result object of executing the script.
+ */
+public interface Function {
+ /**
+ * Execute this function and return the result.
+ *
+ * @return the result from the execution.
+ *
+ * @throws Exception
+ * if anything goes terribly wrong
+ */
+ Object execute(CommandSession session, List<Object> arguments)
+ throws Exception;
+}
diff --git a/gogo/src/org/osgi/service/threadio/ThreadIO.java b/gogo/src/org/osgi/service/threadio/ThreadIO.java
new file mode 100644
index 0000000..765f594
--- /dev/null
+++ b/gogo/src/org/osgi/service/threadio/ThreadIO.java
@@ -0,0 +1,56 @@
+/*
+ * 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.osgi.service.threadio;
+
+import java.io.*;
+
+/**
+ * Enable multiplexing of the standard IO streams for input, output, and error.
+ *
+ * This service guards the central resource of IO streams. The standard streams
+ * are singletons. This service replaces the singletons with special versions that
+ * can find a unique stream for each thread. If no stream is associated with a
+ * thread, it will use the standard input/output that was originally set.
+ *
+ * @author aqute
+ *
+ */
+public interface ThreadIO {
+ /**
+ * Associate this streams with the current thread.
+ *
+ * Ensure that when output is performed on System.in, System.out, System.err it
+ * will happen on the given streams.
+ *
+ * The streams will automatically be canceled when the bundle that has gotten
+ * this service is stopped or returns this service.
+ *
+ * @param in InputStream to use for the current thread when System.in is used
+ * @param out PrintStream to use for the current thread when System.out is used
+ * @param err PrintStream to use for the current thread when System.err is used
+ */
+ void setStreams(InputStream in, PrintStream out, PrintStream err);
+
+ /**
+ * Cancel the streams associated with the current thread.
+ *
+ * This method will not do anything when no streams are associated.
+ */
+ void close();
+}