FELIX-1655: Provide an additional argument to the Karaf admin:create command that specifies the featuresBoot
git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@825845 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/AdminService.java b/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/AdminService.java
index ce214af..138f45b 100644
--- a/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/AdminService.java
+++ b/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/AdminService.java
@@ -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);
}
diff --git a/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/InstanceSettings.java b/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/InstanceSettings.java
new file mode 100644
index 0000000..65e3197
--- /dev/null
+++ b/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/InstanceSettings.java
@@ -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;
+ }
+}
diff --git a/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/internal/AdminServiceImpl.java b/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/internal/AdminServiceImpl.java
index a541556..0a2b936 100644
--- a/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/internal/AdminServiceImpl.java
+++ b/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/internal/AdminServiceImpl.java
@@ -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 {
diff --git a/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/internal/AdminServiceMBeanImpl.java b/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/internal/AdminServiceMBeanImpl.java
index 9cbf90f..f2ebabd 100644
--- a/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/internal/AdminServiceMBeanImpl.java
+++ b/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/internal/AdminServiceMBeanImpl.java
@@ -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() {
diff --git a/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/internal/commands/CreateCommand.java b/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/internal/commands/CreateCommand.java
index 277a0cb..a8d3a40 100644
--- a/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/internal/commands/CreateCommand.java
+++ b/karaf/shell/admin/src/main/java/org/apache/felix/karaf/shell/admin/internal/commands/CreateCommand.java
@@ -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;
}
diff --git a/karaf/webconsole/admin/src/main/java/org/apache/felix/karaf/webconsole/admin/AdminPlugin.java b/karaf/webconsole/admin/src/main/java/org/apache/felix/karaf/webconsole/admin/AdminPlugin.java
index 44fdef1..cf2ddf1 100644
--- a/karaf/webconsole/admin/src/main/java/org/apache/felix/karaf/webconsole/admin/AdminPlugin.java
+++ b/karaf/webconsole/admin/src/main/java/org/apache/felix/karaf/webconsole/admin/AdminPlugin.java
@@ -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.felix.karaf.shell.admin.AdminService;
-import org.apache.felix.karaf.shell.admin.Instance;
-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.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.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);