You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by gn...@apache.org on 2009/10/16 13:16:31 UTC

svn commit: r825845 - in /felix/trunk/karaf: shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/ shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/internal/ shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/internal/comm...

Author: gnodet
Date: Fri Oct 16 11:16:30 2009
New Revision: 825845

URL: http://svn.apache.org/viewvc?rev=825845&view=rev
Log:
FELIX-1655: Provide an additional argument to the Karaf admin:create command that specifies the featuresBoot

Added:
    felix/trunk/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/InstanceSettings.java
Modified:
    felix/trunk/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/AdminService.java
    felix/trunk/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/internal/AdminServiceImpl.java
    felix/trunk/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/internal/AdminServiceMBeanImpl.java
    felix/trunk/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/internal/commands/CreateCommand.java
    felix/trunk/karaf/webconsole/admin/src/main/java/org/apache/felix/karaf/webconsole/admin/AdminPlugin.java

Modified: felix/trunk/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/AdminService.java
URL: http://svn.apache.org/viewvc/felix/trunk/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/AdminService.java?rev=825845&r1=825844&r2=825845&view=diff
==============================================================================
--- felix/trunk/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/AdminService.java (original)
+++ felix/trunk/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/AdminService.java Fri Oct 16 11:16:30 2009
@@ -18,10 +18,9 @@
 
 public interface AdminService {
 
-    Instance createInstance(String name, int port, String location) throws Exception;
+    Instance createInstance(String name, InstanceSettings settings) throws Exception;
 
     Instance[] getInstances();
 
-    Instance getInstance(String name);
-
+    Instance getInstance(String name);    
 }

Added: felix/trunk/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/InstanceSettings.java
URL: http://svn.apache.org/viewvc/felix/trunk/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/InstanceSettings.java?rev=825845&view=auto
==============================================================================
--- felix/trunk/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/InstanceSettings.java (added)
+++ felix/trunk/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/InstanceSettings.java Fri Oct 16 11:16:30 2009
@@ -0,0 +1,49 @@
+/*
+ * 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.karaf.shell.admin;
+
+import java.util.List;
+
+public class InstanceSettings {
+    private final int port;
+    private final String location;
+    private final List<String> featureURLs;
+    private final List<String> features;
+
+    public InstanceSettings(int port, String location, List<String> featureURLs, List<String> features) {
+        this.port = port;
+        this.location = location;
+        this.featureURLs = featureURLs;
+        this.features = features;
+    }
+
+    public int getPort() {
+        return port;
+    }
+
+    public String getLocation() {
+        return location;
+    }
+
+    public List<String> getFeatureURLs() {
+        return featureURLs;
+    }
+
+    public List<String> getFeatures() {
+        return features;
+    }
+}

Modified: felix/trunk/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/internal/AdminServiceImpl.java
URL: http://svn.apache.org/viewvc/felix/trunk/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/internal/AdminServiceImpl.java?rev=825845&r1=825844&r2=825845&view=diff
==============================================================================
--- felix/trunk/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/internal/AdminServiceImpl.java (original)
+++ felix/trunk/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/internal/AdminServiceImpl.java Fri Oct 16 11:16:30 2009
@@ -17,27 +17,28 @@
 package org.apache.felix.karaf.shell.admin.internal;
 
 import java.io.File;
+import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.io.PrintStream;
-import java.io.FileInputStream;
-import java.net.ServerSocket;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
-import java.util.Scanner;
 import java.util.Properties;
+import java.util.Scanner;
 
 import org.apache.felix.karaf.shell.admin.AdminService;
 import org.apache.felix.karaf.shell.admin.Instance;
-import org.slf4j.LoggerFactory;
-import org.slf4j.Logger;
+import org.apache.felix.karaf.shell.admin.InstanceSettings;
 import org.fusesource.jansi.Ansi;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class AdminServiceImpl implements AdminService {
-
     public static final String STORAGE_FILE = "instance.properties";
+    private static final String FEATURES_CFG = "etc/org.apache.felix.karaf.features.cfg";
 
     private static final Logger LOGGER = LoggerFactory.getLogger(AdminServiceImpl.class);
 
@@ -69,11 +70,11 @@
         }
     }
 
-    private void saveStorage(Properties props, File location) throws IOException {
+    private void saveStorage(Properties props, File location, String comment) throws IOException {
         OutputStream os = null;
         try {
             os = new FileOutputStream(location);
-            props.store(os, "Admin Service storage");
+            props.store(os, comment);
         } finally {
             if (os != null) {
                 os.close();
@@ -116,16 +117,16 @@
         }
     }
 
-    public synchronized Instance createInstance(String name, int port, String location) throws Exception {
+    public synchronized Instance createInstance(String name, InstanceSettings settings) throws Exception {
         if (instances.get(name) != null) {
             throw new IllegalArgumentException("Instance '" + name + "' already exists");
         }
-        String loc = location != null ? location : name;
+        String loc = settings.getLocation() != null ? settings.getLocation() : name;
         File karafBase = new File(loc);
         if (!karafBase.isAbsolute()) {
             karafBase = new File(storageLocation, loc);
         }
-        int sshPort = port;
+        int sshPort = settings.getPort();
         if (sshPort <= 0) {
             sshPort = ++defaultPortStart;
         }
@@ -140,7 +141,7 @@
         copyResourceToDir(karafBase, "etc/config.properties", true);
         copyResourceToDir(karafBase, "etc/java.util.logging.properties", true);
         copyResourceToDir(karafBase, "etc/org.apache.felix.karaf.log.cfg", true);
-        copyResourceToDir(karafBase, "etc/org.apache.felix.karaf.features.cfg", true);
+        copyResourceToDir(karafBase, FEATURES_CFG, true);
         copyResourceToDir(karafBase, "etc/org.apache.felix.karaf.management.cfg", true);
         copyResourceToDir(karafBase, "etc/org.ops4j.pax.logging.cfg", true);
         copyResourceToDir(karafBase, "etc/org.ops4j.pax.url.mvn.cfg", true);
@@ -163,12 +164,37 @@
             chmod(new File(karafBase, "bin/start"), "a+x");
             chmod(new File(karafBase, "bin/stop"), "a+x");
         }
+        
+        handleFeatures(new File(karafBase, FEATURES_CFG), settings);
+        
         Instance instance = new InstanceImpl(this, name, karafBase.toString());
         instances.put(name, instance);
         saveState();
         return instance;
     }
 
+    private void handleFeatures(File featuresCfg, InstanceSettings settings) throws IOException {
+        Properties p = loadStorage(featuresCfg);
+
+        appendToPropList(p, "featuresBoot", settings.getFeatures());
+        appendToPropList(p, "featuresRepositories", settings.getFeatureURLs());
+        saveStorage(p, featuresCfg, "Features Configuration");
+    }
+
+    private void appendToPropList(Properties p, String key, List<String> elements) {
+        if (elements == null) {
+            return;
+        }
+        StringBuilder sb = new StringBuilder(p.getProperty(key));
+        for (String f : elements) {
+            if (sb.length() > 0) {
+                sb.append(',');
+            }
+            sb.append(f);
+        }
+        p.setProperty(key, sb.toString());
+    }
+    
     public synchronized Instance[] getInstances() {
         return instances.values().toArray(new Instance[0]);
     }
@@ -191,7 +217,7 @@
             storage.setProperty("item." + i + ".loc", data[i].getLocation());
             storage.setProperty("item." + i + ".pid", Integer.toString(data[i].getPid()));
         }
-        saveStorage(storage, new File(storageLocation, STORAGE_FILE));
+        saveStorage(storage, new File(storageLocation, STORAGE_FILE), "Admin Service storage");
     }
 
     private void copyResourceToDir(File target, String resource, boolean text) throws Exception {

Modified: felix/trunk/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/internal/AdminServiceMBeanImpl.java
URL: http://svn.apache.org/viewvc/felix/trunk/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/internal/AdminServiceMBeanImpl.java?rev=825845&r1=825844&r2=825845&view=diff
==============================================================================
--- felix/trunk/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/internal/AdminServiceMBeanImpl.java (original)
+++ felix/trunk/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/internal/AdminServiceMBeanImpl.java Fri Oct 16 11:16:30 2009
@@ -16,9 +16,12 @@
  */
 package org.apache.felix.karaf.shell.admin.internal;
 
+import java.util.Collections;
+
 import org.apache.felix.karaf.shell.admin.AdminService;
 import org.apache.felix.karaf.shell.admin.AdminServiceMBean;
 import org.apache.felix.karaf.shell.admin.Instance;
+import org.apache.felix.karaf.shell.admin.InstanceSettings;
 
 public class AdminServiceMBeanImpl implements AdminServiceMBean {
 
@@ -33,7 +36,9 @@
     }
 
     public void createInstance(String name, int port, String location) throws Exception {
-        adminService.createInstance(name, port, location);
+        InstanceSettings settings = new InstanceSettings(port, location, 
+                Collections.<String>emptyList(), Collections.<String>emptyList());
+        adminService.createInstance(name, settings);
     }
 
     public String[] getInstances() {

Modified: felix/trunk/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/internal/commands/CreateCommand.java
URL: http://svn.apache.org/viewvc/felix/trunk/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/internal/commands/CreateCommand.java?rev=825845&r1=825844&r2=825845&view=diff
==============================================================================
--- felix/trunk/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/internal/commands/CreateCommand.java (original)
+++ felix/trunk/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/internal/commands/CreateCommand.java Fri Oct 16 11:16:30 2009
@@ -16,9 +16,12 @@
  */
 package org.apache.felix.karaf.shell.admin.internal.commands;
 
+import java.util.List;
+
 import org.apache.felix.gogo.commands.Argument;
-import org.apache.felix.gogo.commands.Option;
 import org.apache.felix.gogo.commands.Command;
+import org.apache.felix.gogo.commands.Option;
+import org.apache.felix.karaf.shell.admin.InstanceSettings;
 
 
 /**
@@ -29,17 +32,26 @@
 @Command(scope = "admin", name = "create", description = "Creates a new container instance.")
 public class CreateCommand extends AdminCommandSupport
 {
-    @Option(name = "-p", aliases = { "--port"}, description = "Port number for remote shell connection", required = false, multiValued = false)
+    @Option(name = "-p", aliases = {"--port"}, description = "Port number for remote shell connection", required = false, multiValued = false)
     private int port = 0;
 
-    @Option(name = "-l", aliases = { "--location"}, description = "Location of the new container instance in the file system", required = false, multiValued = false)
+    @Option(name = "-l", aliases = {"--location"}, description = "Location of the new container instance in the file system", required = false, multiValued = false)
     private String location;
+    
+    @Option(name = "-f", aliases = {"--feature"}, 
+            description = "Initial features. This option can be specified multiple times to enable multiple initial features", required = false, multiValued = true)
+    List<String> features;
+    
+    @Option(name = "-furl", aliases = {"--featureURL"}, 
+            description = "Additional feature descriptor URLs. This option can be specified multiple times to add multiple URLs", required = false, multiValued = true)
+    List<String> featureURLs;
 
     @Argument(index = 0, name = "name", description="The name of the new container instance", required = true, multiValued = false)
     private String instance = null;
 
     protected Object doExecute() throws Exception {
-        getAdminService().createInstance(instance, port, location);
+        InstanceSettings settings = new InstanceSettings(port, location, featureURLs, features);
+        getAdminService().createInstance(instance, settings);
         return null;
     }
 

Modified: felix/trunk/karaf/webconsole/admin/src/main/java/org/apache/felix/karaf/webconsole/admin/AdminPlugin.java
URL: http://svn.apache.org/viewvc/felix/trunk/karaf/webconsole/admin/src/main/java/org/apache/felix/karaf/webconsole/admin/AdminPlugin.java?rev=825845&r1=825844&r2=825845&view=diff
==============================================================================
--- felix/trunk/karaf/webconsole/admin/src/main/java/org/apache/felix/karaf/webconsole/admin/AdminPlugin.java (original)
+++ felix/trunk/karaf/webconsole/admin/src/main/java/org/apache/felix/karaf/webconsole/admin/AdminPlugin.java Fri Oct 16 11:16:30 2009
@@ -20,19 +20,23 @@
 import java.io.InputStream;
 import java.io.PrintWriter;
 import java.net.URL;
+import java.util.Collections;
 import java.util.logging.Level;
 import java.util.logging.Logger;
+
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.apache.felix.karaf.shell.admin.AdminService;
 import org.apache.felix.karaf.shell.admin.Instance;
+import org.apache.felix.karaf.shell.admin.InstanceSettings;
 import org.apache.felix.webconsole.AbstractWebConsolePlugin;
 import org.json.JSONException;
-import org.osgi.framework.BundleContext;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
 import org.json.JSONWriter;
+import org.osgi.framework.BundleContext;
 
 /**
  * Felix Web Console plugin for interacting with the {@link AdminService}
@@ -271,7 +275,9 @@
 
     private boolean createInstance(String name, int port, String location) {
         try {
-            adminService.createInstance(name, port, location);
+            InstanceSettings settings = new InstanceSettings(port, location, 
+                    Collections.<String>emptyList(), Collections.<String>emptyList());
+            adminService.createInstance(name, settings);
             return true;
         } catch (Exception ex) {
             Logger.getLogger(AdminPlugin.class.getName()).log(Level.SEVERE, null, ex);