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();
+}