/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.core.command.internal;
import java.io.File;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
import java.util.concurrent.Future;
import de.rcenvironment.core.command.api.CommandExecutionResult;
import de.rcenvironment.core.command.api.CommandExecutionService;
import de.rcenvironment.core.command.internal.handlers.BuiltInCommandPlugin;
import de.rcenvironment.core.command.spi.CommandDescription;
import de.rcenvironment.core.command.spi.CommandPlugin;
import de.rcenvironment.core.configuration.ConfigurationService;
import de.rcenvironment.core.configuration.ConfigurationService.ConfigurablePathId;
import de.rcenvironment.core.toolkitbridge.transitional.ConcurrencyUtils;
import de.rcenvironment.core.utils.common.textstream.TextOutputReceiver;
import de.rcenvironment.core.utils.common.textstream.receivers.CapturingTextOutReceiver;
import de.rcenvironment.toolkit.modules.concurrency.api.AsyncTaskService;
/**
* Default implementation of {@link CommandExecutionService}.
*
* @author Robert Mischke
*/
public class CommandExecutionServiceImpl implements CommandExecutionService {
private static final String INDENT = "\t";
private final CommandPluginDispatcher commandPluginDispatcher;
private final AsyncTaskService threadPool;
private final Set<CommandDescription> commandDescriptions = new TreeSet<CommandDescription>();
private ConfigurationService configurationService;
public CommandExecutionServiceImpl() {
commandPluginDispatcher = new CommandPluginDispatcher();
threadPool = ConcurrencyUtils.getAsyncTaskService();
}
/**
* OSGi-DS activation method.
*/
public void activate() {
registerCommandPlugin(new BuiltInCommandPlugin());
}
/**
* Registers a {@link CommandPlugin}; may be called by OSGi-DS or manually.
*
* @param plugin the plugin to add
*/
public void registerCommandPlugin(CommandPlugin plugin) {
commandPluginDispatcher.registerPlugin(plugin);
synchronized (commandDescriptions) {
commandDescriptions.addAll(plugin.getCommandDescriptions());
}
}
/**
* Unregisters a {@link CommandPlugin}; may be called by OSGi-DS or manually.
*
* @param plugin the plugin to remove
*/
public void unregisterCommandPlugin(CommandPlugin plugin) {
// TODO unregister help contributions once plugins are actually removed dynamically;
// right now, this only exists for symmetry
commandPluginDispatcher.unregisterPlugin(plugin);
}
/**
* Bind configuration service method.
*
* @param service The service to bind.
*/
public void bindConfigurationService(ConfigurationService service) {
configurationService = service;
}
@Override
public Future<CommandExecutionResult> asyncExecMultiCommand(List<String> tokens, TextOutputReceiver outputReceiver, Object initiator) {
File profileOutput = configurationService.getConfigurablePath(ConfigurablePathId.PROFILE_OUTPUT);
MultiCommandHandler multiCommandHandler = new MultiCommandHandler(tokens, outputReceiver, commandPluginDispatcher, profileOutput);
multiCommandHandler.setInitiatorInformation(initiator);
return threadPool.submit(multiCommandHandler);
}
@Override
public void printHelpText(boolean addCommonPrefix, boolean showDevCommands, TextOutputReceiver outputReceiver) {
synchronized (commandDescriptions) {
if (showDevCommands) {
outputReceiver.addOutput("RCE User Commands:");
} else {
outputReceiver.addOutput("RCE Console Commands:");
}
// only show non-developer commands in this block
for (CommandDescription contribution : commandDescriptions) {
if (!contribution.isDeveloperCommand()) {
printHelpContribution(outputReceiver, contribution, addCommonPrefix);
}
}
if (showDevCommands) {
// only show developer commands in this block
outputReceiver.addOutput("RCE Developer Commands:");
for (CommandDescription contribution : commandDescriptions) {
if (contribution.isDeveloperCommand()) {
printHelpContribution(outputReceiver, contribution, addCommonPrefix);
}
}
}
}
}
@Override
public String getHelpText(boolean addCommonPrefix, boolean showDevCommands) {
CapturingTextOutReceiver capturingReceiver = new CapturingTextOutReceiver("");
printHelpText(addCommonPrefix, showDevCommands, capturingReceiver);
return capturingReceiver.getBufferedOutput();
}
private void printHelpContribution(TextOutputReceiver outputReceiver, CommandDescription contribution, boolean addCommonPrefix) {
// construct first line
StringBuilder buffer = new StringBuilder();
buffer.append(INDENT);
if (addCommonPrefix) {
buffer.append("rce ");
}
buffer.append(contribution.getStaticPart());
if (contribution.hasDynamicPart()) {
buffer.append(" ");
buffer.append(contribution.getDynamicPart());
}
buffer.append(" - ");
buffer.append(contribution.getFirstLine());
outputReceiver.addOutput(buffer.toString());
// additional lines
for (String additionalLine : contribution.getAdditionalLines()) {
outputReceiver.addOutput(INDENT + INDENT + additionalLine);
}
}
}