Author: donsez
Date: Thu Dec 6 06:10:13 2007
New Revision: 601740
URL: http://svn.apache.org/viewvc?rev=601740&view=rev
Log:
creation of the sosoc.cmd bundle
This shell command enables to start and stop Script-oriented and
Service-Oriented Components (SOSOC) described in files available from urls.
Added:
felix/sandbox/donsez/sosoc.cmd/
felix/sandbox/donsez/sosoc.cmd/pom.xml (with props)
felix/sandbox/donsez/sosoc.cmd/src/
felix/sandbox/donsez/sosoc.cmd/src/main/
felix/sandbox/donsez/sosoc.cmd/src/main/java/
felix/sandbox/donsez/sosoc.cmd/src/main/java/org/
felix/sandbox/donsez/sosoc.cmd/src/main/java/org/apache/
felix/sandbox/donsez/sosoc.cmd/src/main/java/org/apache/felix/
felix/sandbox/donsez/sosoc.cmd/src/main/java/org/apache/felix/sandbox/
felix/sandbox/donsez/sosoc.cmd/src/main/java/org/apache/felix/sandbox/sosoc/
felix/sandbox/donsez/sosoc.cmd/src/main/java/org/apache/felix/sandbox/sosoc/cmd/
felix/sandbox/donsez/sosoc.cmd/src/main/java/org/apache/felix/sandbox/sosoc/cmd/SOSOCCommand.java
(with props)
felix/sandbox/donsez/sosoc.cmd/src/main/java/org/apache/felix/sandbox/util/
felix/sandbox/donsez/sosoc.cmd/src/main/java/org/apache/felix/sandbox/util/load/
felix/sandbox/donsez/sosoc.cmd/src/main/java/org/apache/felix/sandbox/util/load/LoadUtils.java
(with props)
felix/sandbox/donsez/sosoc.cmd/src/site/
felix/sandbox/donsez/sosoc.cmd/src/site/readme.html (with props)
Added: felix/sandbox/donsez/sosoc.cmd/pom.xml
URL:
http://svn.apache.org/viewvc/felix/sandbox/donsez/sosoc.cmd/pom.xml?rev=601740&view=auto
==============================================================================
--- felix/sandbox/donsez/sosoc.cmd/pom.xml (added)
+++ felix/sandbox/donsez/sosoc.cmd/pom.xml Thu Dec 6 06:10:13 2007
@@ -0,0 +1,113 @@
+<!--
+ 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>
+
+ <properties>
+
<repositoryLocation>http://people.apache.org/~donsez/dev/felix/sandbox/</repositoryLocation>
+ <description>provides a command to launch script-oriented and
service-oriented components (SOSOC).</description>
+ </properties>
+
+ <modelVersion>4.0.0</modelVersion>
+ <packaging>bundle</packaging>
+ <name>SOSOC Command</name>
+ <artifactId>org.apache.felix.sandbox.sosoc.cmd</artifactId>
+ <groupId>org.apache.felix.sandbox</groupId>
+ <version>0.1.0</version>
+ <description>${description}</description>
+
+ <dependencies>
+
+ <dependency>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>org.osgi.core</artifactId>
+ <version>1.1.0-SNAPSHOT</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>org.osgi.compendium</artifactId>
+ <version>0.9.0-SNAPSHOT</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>org.apache.felix.shell</artifactId>
+ <version>1.1.0-SNAPSHOT</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.felix.sandbox</groupId>
+ <artifactId>org.apache.felix.sandbox.sosoc</artifactId>
+ <version>0.1.0</version>
+ </dependency>
+
+
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-bundle-plugin</artifactId>
+ <extensions>true</extensions>
+ <configuration>
+ <instructions>
+
+ <!-- docs in
http://cwiki.apache.org/FELIX/bundle-plugin-for-maven-bnd.html and
http://cwiki.apache.org/FELIX/osgi-plugin-for-maven-2.html -->
+
+ <Import-Package>
+ org.osgi.framework,
+ org.apache.felix.sandbox.sosoc,
+ org.apache.felix.shell
+ </Import-Package>
+
+ <DynamicImport-Package>*</DynamicImport-Package>
+
+ <Private-Package>
+ ${pom.artifactId},
+ org.apache.felix.sandbox.util.*
+ </Private-Package>
+
+ <Bundle-Activator>${pom.artifactId}.SOSOCCommand</Bundle-Activator>
+
+ <Bundle-SymbolicName>${pom.artifactId}</Bundle-SymbolicName>
+ <Bundle-Description>${description}</Bundle-Description>
+
+ </instructions>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+<!--
+ <repositories>
+ <repository>
+ <id>apache.m2.incubator</id>
+ <name>Apache M2 Incubator Repository</name>
+ <url>http://people.apache.org/repo/m2-incubating-repository/</url>
+ </repository>
+ </repositories>
+ <pluginRepositories>
+ <pluginRepository>
+ <id>apache.m2.incubator</id>
+ <name>Apache M2 Incubator Repository</name>
+ <url>http://people.apache.org/repo/m2-incubating-repository/</url>
+ </pluginRepository>
+ </pluginRepositories>
+ -->
+</project>
Propchange: felix/sandbox/donsez/sosoc.cmd/pom.xml
------------------------------------------------------------------------------
svn:eol-style = native
Added:
felix/sandbox/donsez/sosoc.cmd/src/main/java/org/apache/felix/sandbox/sosoc/cmd/SOSOCCommand.java
URL:
http://svn.apache.org/viewvc/felix/sandbox/donsez/sosoc.cmd/src/main/java/org/apache/felix/sandbox/sosoc/cmd/SOSOCCommand.java?rev=601740&view=auto
==============================================================================
---
felix/sandbox/donsez/sosoc.cmd/src/main/java/org/apache/felix/sandbox/sosoc/cmd/SOSOCCommand.java
(added)
+++
felix/sandbox/donsez/sosoc.cmd/src/main/java/org/apache/felix/sandbox/sosoc/cmd/SOSOCCommand.java
Thu Dec 6 06:10:13 2007
@@ -0,0 +1,356 @@
+/*
+ * 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.sandbox.sosoc.cmd;
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.io.PrintStream;
+import java.io.Serializable;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Dictionary;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Properties;
+import java.util.StringTokenizer;
+
+import org.apache.felix.sandbox.sosoc.SOSOCActivator;
+import org.apache.felix.sandbox.util.load.LoadUtils;
+import org.apache.felix.shell.Command;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceRegistration;
+
+
+/**
+ * This class provides a shell command to instanciate SOSOC components
+ * @author <a href="mailto:[EMAIL PROTECTED]">Felix Project Team</a>
+ */
+public class SOSOCCommand implements Command, BundleActivator {
+
+ private Properties properties=new Properties();
+
+ private void initProperties() {
+ properties.setProperty("sosoc.showtrace","false");
+ properties.setProperty("sosoc.showparsertrace","false");
+ properties.setProperty("sosoc.showerrors","false");
+ properties.setProperty("sosoc.showversion","false");
+ properties.setProperty("sosoc.strictlycompliant","true");
+ }
+
+
+ private static final String BASE_CMD = "base";
+
+ private static final String START_CMD = "start";
+
+ private static final String STOP_CMD = "stop";
+
+ // private static final String INSTALL_CMD = "install";
+
+ // private static final String UNINSTALL_CMD = "uninstall";
+
+ // private static final String UPDATE_CMD = "update";
+
+ private static final String LIST_CMD = "list";
+
+ private static final String HELP_CMD = "help";
+
+ private static final String PROP_CMD = "prop";
+
+ private BundleContext bundleContext;
+
+ private String baseUrlStr;
+
+ private Map scripts = new HashMap();
+
+ private ServiceRegistration serviceRegistration;
+
+ public SOSOCCommand() {
+ initProperties();
+ }
+
+ public String getName() {
+ return "sosoc";
+ }
+
+ public String getUsage() {
+ return "sosoc [help|base|list|start|stop|prop]";
+ }
+
+ public String getShortDescription() {
+ return "start/stop script components";
+ }
+
+ private void printUsage(PrintStream out, String message) {
+ StringBuffer sb = new StringBuffer();
+ if (message != null)
+ sb.append(message);
+ sb.append(getUsage()).append('\n');
+ sb.append("sosoc " + BASE_CMD + " <url> : define the base for
relative urls").append('\n');
+ sb.append("sosoc " + START_CMD + " <url> : start a script from
the url").append('\n');
+ sb.append("sosoc " + STOP_CMD + " <script id> : stop a
script").append('\n');
+ sb.append("sosoc " + LIST_CMD + " : list all started
scripts").append('\n');
+ sb.append("sosoc " + PROP_CMD + " : [<name> <value>]
display/set trace properties").append('\n');
+ out.println(sb.toString());
+ return;
+ }
+
+ public void execute(String commandline, PrintStream out, PrintStream
err) {
+
+ StringTokenizer st = new StringTokenizer(commandline, " ");
+
+ if (st.countTokens() == 1) {
+ printUsage(out, null);
+ return;
+ }
+
+ // Ignore the command name.
+ st.nextToken();
+
+ if (!st.hasMoreTokens()) {
+ printUsage(out, null);
+ return;
+ }
+
+ String option = st.nextToken().trim();
+
+ if (option.equals(HELP_CMD)) {
+ printUsage(out, null);
+ return;
+ } else if (option.equals(START_CMD)) {
+ if (!st.hasMoreTokens()) {
+ printUsage(out, "url is missing");
+ return;
+ }
+ String urlstr = st.nextToken().trim();
+
+ Script script = new Script(properties);
+ try {
+ script.install(urlstr, baseUrlStr);
+ script.start(bundleContext);
+ } catch (Exception e) {
+ err.println(e);
+ e.printStackTrace(err);
+ return;
+ }
+
+ Integer id = new Integer(script.getId());
+ scripts.put(id, script);
+ // TODO save entry to disk
+
+ } else if (option.equals(BASE_CMD)) {
+ if (!st.hasMoreTokens()) {
+ out.println("base url is :"+baseUrlStr);
+ return;
+ } else {
+ baseUrlStr = st.nextToken().trim();
+ return;
+ }
+ } else if (option.equals(PROP_CMD)) {
+ if (!st.hasMoreTokens()) {
+ out.println("trace properties are:"+properties);
+ return;
+ } else {
+ String name = st.nextToken().trim();
+ if (!st.hasMoreTokens()) {
+ out.println(name+" value
is:"+properties.getProperty(name));
+ return;
+ } else {
+ String value = st.nextToken().trim();
+ properties.put(name, value);
+ return;
+ }
+ }
+
+ } else if (option.equals(STOP_CMD)) {
+ if (!st.hasMoreTokens()) {
+ printUsage(out, "script number is missing");
+ return;
+ }
+ int id = Integer.parseInt(st.nextToken().trim());
+ Integer number = new Integer(id);
+ Script script = (Script) scripts.remove(number);
+ if (script == null) {
+ err.println("this script is stopped or does not
exist");
+ } else {
+ try {
+ script.stop(bundleContext);
+ } catch (Exception e) {
+ err.println(e);
+ return;
+ }
+ out.println("the script is stopped");
+ }
+ // TODO save entry to disk
+ } else if (option.equals(LIST_CMD)) {
+ Iterator iterator = scripts.entrySet().iterator();
+ while (iterator.hasNext()) {
+ Map.Entry entry = (Map.Entry) iterator.next();
+ out.print(entry.getKey().toString());
+ out.print(':');
+ // TODO print lifecycle status
+ out.println(((Script)
entry.getValue()).toString());
+ }
+ }
+ }
+
+ public void start(BundleContext bundleContext) throws Exception {
+ this.bundleContext = bundleContext;
+ Map scripts = new HashMap();
+ // reload entries from disk
+
+ Dictionary properties = new Hashtable();
+ properties.put("categories", new String[] { "command", "script"
});
+ serviceRegistration =
bundleContext.registerService(Command.class
+ .getName(), this, properties);
+ }
+
+ public void stop(BundleContext bundleContext) throws Exception {
+ serviceRegistration.unregister();
+
+ // stop all scripts
+ Iterator iterator = scripts.values().iterator();
+ while (iterator.hasNext()) {
+ ((Script) iterator.next()).shutdown(bundleContext);
+ }
+ }
+}
+
+class Script implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ private static int scriptCounter = 0;
+
+ // TODO for persistence : private int lifecycle;
+ private int id = -1; // may be a long to be consistent with bundle ids
+ // and service ids
+
+ private String urlStr;
+
+ private String baseUrlStr;
+
+ private String metadata;
+
+ private Properties properties;
+
+ private transient BundleActivator bundleActivator;
+
+ public Script(Properties properties) {
+ super();
+ this.properties=properties;
+ }
+
+ public String getUrlStr() {
+ return urlStr;
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public void install(String urlStr, String baseUrlStr) throws Exception {
+ URL url=null;
+ try {
+ url=new URL(urlStr);
+ } catch (MalformedURLException e) {
+ try {
+ if(baseUrlStr==null){
+ throw e;
+ }
+ url=new URL(new URL(baseUrlStr),urlStr);
+ } catch (MalformedURLException e1) {
+ throw e1;
+ }
+ }
+
+ this.metadata = LoadUtils.loadAsUrl(url.toExternalForm());
+ this.urlStr = urlStr;
+ this.baseUrlStr = baseUrlStr;
+ this.id = ++scriptCounter;
+ }
+
+ public void start(BundleContext bundleContext) throws Exception {
+ if (bundleActivator == null) {
+ InputStream inputStream = new
ByteArrayInputStream(metadata
+ .getBytes());
+ bundleActivator = new
Activator(inputStream,properties,baseUrlStr);
+ try {
+ bundleActivator.start(bundleContext);
+ // TODO save lifecycle ! use a finally to
ensure that
+ } catch (Exception e) {
+ bundleActivator = null;
+ throw e;
+ }
+ } else {
+ throw new IllegalStateException("script is already
started");
+ }
+ }
+
+ public void stop(BundleContext bundleContext) throws Exception {
+ if (bundleActivator != null) {
+ BundleActivator _bundleActivator = bundleActivator;
+ bundleActivator = null;
+ _bundleActivator.stop(bundleContext);
+ // TODO save lifecycle ! use a finally to ensure that
+ } else {
+ throw new IllegalStateException("script is already
stopped");
+ }
+ }
+
+ public void shutdown(BundleContext bundleContext) throws Exception {
+ bundleActivator.stop(bundleContext);
+ }
+
+ public void update(BundleContext bundleContext) throws Exception {
+ bundleActivator.stop(bundleContext);
+ this.metadata = LoadUtils.loadAsUrl(this.urlStr);
+ bundleActivator.start(bundleContext);
+ }
+
+ public void update(BundleContext bundleContext, String urlStr)
+ throws Exception {
+ bundleActivator.stop(bundleContext);
+ this.metadata = LoadUtils.loadAsUrl(urlStr);
+ // keep this.urlStr unchanged
+ bundleActivator.start(bundleContext);
+ }
+
+ public static void uninstall(BundleContext bundleContext, Script script)
+ throws Exception {
+ // TODO
+ throw new Exception("Not implemented");
+ }
+
+ public String toString() {
+ return urlStr; // + lifecycle
+ }
+}
+
+class Activator extends SOSOCActivator {
+ Activator(InputStream inputStream, Properties initProperties, String
baseUrlStr){
+ super(inputStream, initProperties, baseUrlStr);
+ }
+}
Propchange:
felix/sandbox/donsez/sosoc.cmd/src/main/java/org/apache/felix/sandbox/sosoc/cmd/SOSOCCommand.java
------------------------------------------------------------------------------
svn:eol-style = native
Added:
felix/sandbox/donsez/sosoc.cmd/src/main/java/org/apache/felix/sandbox/util/load/LoadUtils.java
URL:
http://svn.apache.org/viewvc/felix/sandbox/donsez/sosoc.cmd/src/main/java/org/apache/felix/sandbox/util/load/LoadUtils.java?rev=601740&view=auto
==============================================================================
---
felix/sandbox/donsez/sosoc.cmd/src/main/java/org/apache/felix/sandbox/util/load/LoadUtils.java
(added)
+++
felix/sandbox/donsez/sosoc.cmd/src/main/java/org/apache/felix/sandbox/util/load/LoadUtils.java
Thu Dec 6 06:10:13 2007
@@ -0,0 +1,127 @@
+/*
+ * 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.sandbox.util.load;
+
+import java.io.BufferedInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+
+/**
+ * Utility class to load text from URL or Ressources
+ * @author <a href="mailto:[EMAIL PROTECTED]">Felix Project Team</a>
+ */
+public class LoadUtils {
+
+ /**
+ * Load the text from a document located at an URL
+ * @param urlStr the url of the document to load
+ * @return the text contained in the document
+ * @throws Exception
+ */
+ public static String loadAsUrl(String urlStr) throws Exception {
+ URL url = null;
+ url = new URL(urlStr);
+ InputStream inputStream = null;
+ BufferedInputStream bufferedInputStream = null;
+ ByteArrayOutputStream byteArrayOutputStream = null;
+
+ try {
+ inputStream = url.openStream();
+ bufferedInputStream = new
BufferedInputStream(inputStream);
+ byteArrayOutputStream = new ByteArrayOutputStream();
+ int n;
+ byte[] buffer = new byte[512];
+ while ((n = bufferedInputStream.read(buffer)) != -1) {
+ byteArrayOutputStream.write(buffer, 0, n);
+ }
+ bufferedInputStream.close();
+ inputStream=null;
+ bufferedInputStream=null;
+
+ String res = new
String(byteArrayOutputStream.toByteArray());
+ return res;
+ } finally {
+ if (bufferedInputStream != null)
+ try {
+ bufferedInputStream.close();
+ inputStream = null;
+ } catch (IOException e) {
+ }
+ if (inputStream != null)
+ try {
+ inputStream.close();
+ } catch (IOException e) {
+ }
+ if (byteArrayOutputStream != null)
+ try {
+ byteArrayOutputStream.close();
+ } catch (IOException e) {
+ }
+ }
+ }
+
+ /**
+ * Load the text from a ressource
+ * @param classLoader classLoader from which the ressource is accessible
+ * @param path path of the ressource
+ * @return the text contained in the ressource
+ * @throws Exception
+ */public static String loadAsRessource(ClassLoader classLoader, String
path)
+ throws Exception {
+ InputStream inputStream = null;
+ BufferedInputStream bufferedInputStream = null;
+ ByteArrayOutputStream byteArrayOutputStream = null;
+
+ try {
+ inputStream = classLoader.getResourceAsStream(path);
+ bufferedInputStream = new
BufferedInputStream(inputStream);
+ byteArrayOutputStream = new ByteArrayOutputStream();
+ int n;
+ byte[] buffer = new byte[512];
+ while ((n = bufferedInputStream.read(buffer)) != -1) {
+ byteArrayOutputStream.write(buffer, 0, n);
+ }
+ bufferedInputStream.close();
+ inputStream=null;
+ bufferedInputStream=null;
+
+ String res = new
String(byteArrayOutputStream.toByteArray());
+ return res;
+ } finally {
+ if (bufferedInputStream != null)
+ try {
+ bufferedInputStream.close();
+ inputStream = null;
+ } catch (IOException e) {
+ }
+ if (inputStream != null)
+ try {
+ inputStream.close();
+ } catch (IOException e) {
+ }
+ if (byteArrayOutputStream != null)
+ try {
+ byteArrayOutputStream.close();
+ } catch (IOException e) {
+ }
+ }
+ }
+}
Propchange:
felix/sandbox/donsez/sosoc.cmd/src/main/java/org/apache/felix/sandbox/util/load/LoadUtils.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: felix/sandbox/donsez/sosoc.cmd/src/site/readme.html
URL:
http://svn.apache.org/viewvc/felix/sandbox/donsez/sosoc.cmd/src/site/readme.html?rev=601740&view=auto
==============================================================================
--- felix/sandbox/donsez/sosoc.cmd/src/site/readme.html (added)
+++ felix/sandbox/donsez/sosoc.cmd/src/site/readme.html Thu Dec 6 06:10:13 2007
@@ -0,0 +1,99 @@
+<html>
+<head>
+<title>SOSOC Command</title>
+</head>
+<body>
+
+<!-- Start of Felix Bundle Documentation -->
+<hr width="100%" size="2">
+<h1><i><a name="sosoc.cmd"></a><font color="#0000aa">SOSOC
Command</font></i></h1>
+
+<p>
+<b>Description</b><br>
+provides a command to start/stop services (SOSOC) developed with scripting
languages (JavaScript, Jython, Jacl, ...)
+<br>see <a
href="http://people.apache.org/~donsez/dev/osgi/sosoc/index.html">SOSOC</a> for
more details
+<br>For more details on how to use this bundle, refer to the /doc/readme.html
file embedded in the bundle jarfile.<br>
+</p>
+
+<p>
+<b>Contributors</b><br>
+<ul>
+<li>Author:<a href="mailto:[EMAIL PROTECTED]">Didier Donsez ([EMAIL
PROTECTED])</a></li>
+</ul>
+</p>
+
+<p>
+<b>License</b><br>
+ASL 2.0
+</p>
+
+<p>
+<b>Services</b><br>
+org.apache.felix.shell.Command
+</p>
+
+<p>
+<b>Properties</b><br>
+<ul>
+<li>None</li>
+</ul>
+</p>
+
+<p><b>Requirements</b><br>
+TODO
+</p>
+
+<!-- End of Felix Bundle Documentation -->
+
+<hr width="100%" size="2">
+
+<!-- Start of extra information -->
+
+<p id="build">
+<b>Build</b><br>
+<ol>
+<li>mvn clean install</li>
+</ol>
+</p>
+
+<p id="settings">
+<b>Settings</b><br>
+config.properties
+</p>
+
+
+<p id="rundemo">
+<b>Run the demo</b><br>
+To run the demo of this bundle, enter in the Felix shell the <a
href="http://people.apache.org/~donsez/dev/osgi/sosoc/script.txt">following
commands</a><br>
+</p>
+
+<p id="typicalusage">
+<b>Typical Usages</b><br>
+<li>quick services assembling/prototyping</li>
+</p>
+
+<p id="versions">
+<b>Versions history</b><br>
+<ul>
+<li>2 December 2007: migrate the project to Maven2</li>
+<li>0.1.0, 26 July 2005</li>
+</ul>
+</p>
+
+<p id="todo">
+<b>TODO (contributions are welcome)</b><br>
+<ul>
+<li>TODO: persistence for scripts</li>
+<li>TODO: scripts lifecycle (install, start, stop, update, uninstall)</li>
+</ul>
+<p>
+
+<p id="links">
+<b>Links</b><br>
+<ul>
+<li><a href="http://people.apache.org/~donsez/dev/osgi/sosoc/readme.html">The
SOSOC core bundle</a></li>
+</ul>
+</p>
+
+</body>
+</html>
Propchange: felix/sandbox/donsez/sosoc.cmd/src/site/readme.html
------------------------------------------------------------------------------
svn:eol-style = native