blob: e1a41ce96ba25a6d012fe1bdcae8aefc35ff79c4 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008, 2010 VMware Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* VMware Inc. - initial contribution
*******************************************************************************/
package org.eclipse.virgo.kernel.config.internal.commandline;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import org.osgi.framework.BundleContext;
import org.eclipse.virgo.kernel.config.internal.PropertiesSource;
import org.eclipse.virgo.kernel.diagnostics.KernelLogEvents;
import org.eclipse.virgo.medic.eventlog.EventLogger;
public final class CommandLinePropertiesSource implements PropertiesSource {
private static final String PROPERTY_USERREGION_COMMANDLINE_ARTIFACTS = "commandLineArtifacts";
private static final String PROPERTY_UNRECOGNIZED_LAUNCHER_ARGUMENTS = "eclipse.commands";
private static final String COMMAND_PREFIX = "-";
private static final String COMMAND_PLAN = "plan";
private static final String PID_KERNEL_REGION = "org.eclipse.virgo.kernel.userregion";
private static final String TEMPLATE_VERSIONED_PLAN_REPOSITORY_URI = "repository:plan/%s/%s";
private static final String TEMPLATE_UNVERSIONED_PLAN_REPOSITORY_URI = "repository:plan/%s";
private final String unrecognizedArguments;
private final EventLogger eventLogger;
public CommandLinePropertiesSource(BundleContext bundleContext, EventLogger eventLogger) {
this.unrecognizedArguments = bundleContext.getProperty(PROPERTY_UNRECOGNIZED_LAUNCHER_ARGUMENTS);
this.eventLogger = eventLogger;
}
public Map<String, Properties> getConfigurationProperties() {
Map<String, Properties> configuration = new HashMap<String, Properties>();
if (this.unrecognizedArguments != null) {
String[] components = this.unrecognizedArguments.split("\n");
List<String> arguments = null;
String command = null;
for (int i = 0; i < components.length; i++) {
if (components[i].startsWith(COMMAND_PREFIX)) {
if (command != null) {
processCommand(command, arguments, configuration);
}
command = components[i].substring(COMMAND_PREFIX.length());
arguments = new ArrayList<String>();
} else if (arguments != null) {
arguments.add(components[i]);
}
}
if (command != null) {
processCommand(command, arguments, configuration);
}
}
return configuration;
}
private void processCommand(String command, List<String> arguments, Map<String, Properties> configuration) {
if (COMMAND_PLAN.equals(command)) {
processPlanCommand(arguments, configuration);
}
}
private void processPlanCommand(List<String> arguments, Map<String, Properties> configuration) {
String repositoryUri = null;
if (arguments.size() == 1) {
repositoryUri = String.format(TEMPLATE_UNVERSIONED_PLAN_REPOSITORY_URI, arguments.get(0));
} else if (arguments.size() == 2) {
repositoryUri = String.format(TEMPLATE_VERSIONED_PLAN_REPOSITORY_URI, arguments.get(0), arguments.get(1));
} else {
this.eventLogger.log(KernelLogEvents.KERNEL_PLAN_ARGUMENTS_INCORRECT, arguments.size(), formatArgumentList(arguments));
}
if (repositoryUri != null) {
Properties properties = getProperties(PID_KERNEL_REGION, configuration);
appendProperty(PROPERTY_USERREGION_COMMANDLINE_ARTIFACTS, repositoryUri, properties);
}
}
private String formatArgumentList(List<String> arguments) {
if (arguments.size() == 0) {
return "";
}
StringBuilder argumentsBuilder = new StringBuilder();
for (int i = 0; i < arguments.size(); i++) {
argumentsBuilder.append(arguments.get(i));
if ((i + 1) < arguments.size()) {
argumentsBuilder.append(", ");
}
}
return argumentsBuilder.toString();
}
private Properties getProperties(String pid, Map<String, Properties> configuration) {
Properties properties = configuration.get(pid);
if (properties == null) {
properties = new Properties();
configuration.put(pid, properties);
}
return properties;
}
private void appendProperty(String key, String value, Properties properties) {
String property = properties.getProperty(key);
if (property != null) {
property = property + "," + value;
} else {
property = value;
}
properties.put(key, property);
}
}