Initial service project

git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@946666 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/service/pom.xml b/service/pom.xml
new file mode 100644
index 0000000..5936dc7
--- /dev/null
+++ b/service/pom.xml
@@ -0,0 +1,65 @@
+<!--
+ 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.
+-->
+<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>
+		<groupId>org.apache.felix</groupId>
+		<artifactId>felix-parent</artifactId>
+		<version>1.2.1</version>
+		<relativePath>../pom.xml</relativePath>
+	</parent>
+	
+  <modelVersion>4.0.0</modelVersion>
+  <name>Apache Felix File Service</name>
+  <description>Combines OSGi service definitions developed collaboratively at Apache Felix</description>
+  <url>http://felix.apache.org/site/service.html</url>
+  <version>0.0.1-SNAPSHOT</version>
+  <groupId>org.apache.felix</groupId>
+  <artifactId>service</artifactId>
+  <dependencies>
+    <dependency>
+    	<groupId>org.apache.felix</groupId>
+    	<artifactId>org.osgi.core</artifactId>
+    	<version>1.4.0</version>
+    	<type>bundle</type>
+    	<scope>compile</scope>
+    </dependency>
+    <dependency>
+    	<groupId>org.apache.felix</groupId>
+    	<artifactId>org.osgi.compendium</artifactId>
+    	<version>1.4.0</version>
+    	<type>bundle</type>
+    	<scope>compile</scope>
+    </dependency>
+  </dependencies>
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.felix</groupId>
+        <artifactId>maven-bundle-plugin</artifactId>
+        <version>2.0.0</version>
+        <extensions>true</extensions>
+        <configuration>
+          <instructions>
+           <_include>bnd.bnd</_include>
+          </instructions>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+</project>
diff --git a/service/src/main/java/org/apache/felix/service/terminal/Terminal.java b/service/src/main/java/org/apache/felix/service/terminal/Terminal.java
new file mode 100644
index 0000000..33e203b
--- /dev/null
+++ b/service/src/main/java/org/apache/felix/service/terminal/Terminal.java
@@ -0,0 +1,268 @@
+/*
+ * 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.felix.service.terminal;
+
+import java.io.*;
+
+/**
+ * Terminal.
+ * 
+ * The Terminal interface describes a minimal terminal that can easily be mapped
+ * to command line editing tools.
+ * 
+ * A Terminal is associated with an Input Stream and an Output Stream. The Input
+ * Stream represents the keyboard and the Output Stream the screen.
+ * 
+ * A terminal does not block the input, each character is returned as it is
+ * typed, no buffering or line editing takes place, characters are also not
+ * echoed. However, the Input Stream is not restricted to bytes only, it can
+ * also return translated key strokes. Integers from 1000 are used for those.
+ * Not all keys have to be supported by an implementation.
+ * 
+ * A number of functions is provided to move the cursor and erase
+ * characters/lines/screens. Any text outputed to the Output Stream is
+ * immediately added to the cursor position, which is then moved forwards. The
+ * control characters (LF,CR,TAB,BS) perform their normal actions. However lines
+ * do not wrap. Text typed that is longer than the window will not be visible,
+ * it is the responsibility of the sender to ensure this does not happen.
+ * 
+ * A screen is considered to be {@link #height()} lines that each have
+ * {@link #width()} characters. For cursor positioning, the screen is assumed to
+ * be starting at 0,0 and increases its position from left to right and from top
+ * to bottom. Positioning outside the screen bounds is undefined.
+ */
+public interface Terminal {
+	/**
+	 * Cursor up key
+	 */
+	int CURSOR_UP = 1000;
+	/**
+	 * Cursor down key.
+	 */
+	int CURSOR_DOWN = 1001;
+	/**
+	 * Cursors forward key. Usually right.
+	 */
+	int CURSOR_FORWARD = 1002;
+
+	/**
+	 * Cursors backward key. Usually left.
+	 */
+	int CURSOR_BACKWARD = 1003;
+
+	/**
+	 * Page up key
+	 */
+	int PAGE_UP = 1004;
+	/**
+	 * Page down key
+	 */
+	int PAGE_DOWN = 1005;
+	/**
+	 * Home key
+	 */
+	int HOME = 1006;
+	/**
+	 * End key
+	 */
+	int END = 1007;
+	/**
+	 * Insert key
+	 */
+	int INSERT = 1008;
+	/**
+	 * Delete key
+	 */
+	int DELETE = 1009;
+	/**
+	 * Break key
+	 */
+	int BREAK = 1009;
+	/**
+	 * Function key 1
+	 */
+	int F1 = 1101;
+	/**
+	 * Function key 2
+	 */
+	int F2 = 1102;
+	/**
+	 * Function key 3
+	 */
+	int F3 = 1103;
+	/**
+	 * Function key 4
+	 */
+	int F4 = 1104;
+	/**
+	 * Function key 5
+	 */
+	int F5 = 1105;
+	/**
+	 * Function key 6
+	 */
+	int F6 = 1106;
+	/**
+	 * Function key 7
+	 */
+	int F7 = 1107;
+	/**
+	 * Function key 8
+	 */
+	int F8 = 1108;
+	/**
+	 * Function key 9
+	 */
+	int F9 = 1109;
+	/**
+	 * Function key 10
+	 */
+	int F10 = 1110;
+	/**
+	 * Function key 11
+	 */
+	int F11 = 1111;
+	/**
+	 * Function key 12
+	 */
+	int F12 = 1112;
+
+	enum Attribute {
+		BLINK, UNDERLINE, STRIKE_THROUGH, BOLD, DIM, REVERSED;
+	}
+
+	enum Color {
+		NONE, BLACK, GREEN, YELLOW, MAGENTA, CYAN, BLUE, RED, WHITE;
+	}
+
+	/**
+	 * Return the associated Input Stream that represents the keyboard. Note
+	 * that this InputStream can return values > 256, these characters are
+	 * defined in this interface as special keys. This Input Stream should not
+	 * be closed by the client. If the client is done, it should unget the
+	 * services.
+	 * 
+	 * @return the current Input Stream.
+	 */
+	InputStream getInputStream();
+
+	/**
+	 * Return the Output Stream that is associated with the screen. Any writes
+	 * Clear the complete screen and position the cursor at 0,0.
+	 * 
+	 * @throws Exception
+	 */
+	void clear() throws Exception;
+
+	/**
+	 * Leave the cursor where it is but clear the remainder of the line.
+	 */
+	void eraseEndOfLine();
+
+	/**
+	 * Move the cursor up one line, this must not cause a scroll if the cursor
+	 * moves off the screen.
+	 * 
+	 * @throws Exception
+	 */
+	void up() throws Exception;
+
+	/**
+	 * Move the cursor down one line, this must not cause a scroll if the
+	 * cursors moves off the screen.
+	 * 
+	 * @throws Exception
+	 */
+	void down() throws Exception;
+
+	/**
+	 * Move the cursor backward. Must not wrap to previous line.
+	 * 
+	 * @throws Exception
+	 */
+	void backward() throws Exception;
+
+	/**
+	 * Move the cursor forward. Must not wrap to next line if the cursor becomes
+	 * higher than the width.
+	 * 
+	 * @throws Exception
+	 */
+	void forward() throws Exception;
+
+	/**
+	 * Return the actual width of the screen. Some screens can change their size
+	 * and this method must return the actual width.
+	 * 
+	 * @return the width of the screen.
+	 * 
+	 * @throws Exception
+	 */
+	int width() throws Exception;
+
+	/**
+	 * Return the actual height of the screen. Some screens can change their
+	 * size and this method must return the actual height.
+	 * 
+	 * @return the height of the screen.
+	 * 
+	 * @throws Exception
+	 */
+	int height() throws Exception;
+
+	/**
+	 * Return the current cursor position.
+	 * 
+	 * The position is returned as an array of 2 elements. The first element is
+	 * the x position and the second elements is the y position. Both are zero
+	 * based.
+	 * 
+	 * @return the current position or null if not possible.
+	 * 
+	 * @throws Exception
+	 */
+	int[] getPosition() throws Exception;
+
+	/**
+	 * Position the cursor on the screen. Positioning starts at 0,0 and the
+	 * maxium value is given by {@link #width()}, {@link #height()}. The visible
+	 * cursor is moved to this position and text insertion will continue from
+	 * that position.
+	 * 
+	 * @param x
+	 *            The x position, must be from 0-width
+	 * @param y
+	 *            The y position, must be from 0-height
+	 * @throws IllegalArgumenException
+	 *             when x or y is not in range
+	 * @throws Exception
+	 */
+	boolean position(int x, int y) throws Exception;
+
+	/**
+	 * Set the attributes of the text to outputed. This method
+	 * must reset all current attributes. That is, attributes
+	 * are not inherited from the current position.
+	 * 
+	 * @param foreground The foreground color
+	 * @param background The background color (around the character)
+	 * @param attr A number of attributes.
+	 */
+	boolean attributes(Color foreground, Color background, Attribute... attr);
+}
diff --git a/service/src/main/java/org/apache/felix/service/terminal/packageinfo b/service/src/main/java/org/apache/felix/service/terminal/packageinfo
new file mode 100644
index 0000000..73918b4
--- /dev/null
+++ b/service/src/main/java/org/apache/felix/service/terminal/packageinfo
@@ -0,0 +1 @@
+version 0.0.1
\ No newline at end of file