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


Reply via email to