/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.core.gui.command;
import java.util.ArrayList;
import java.util.List;
import de.rcenvironment.core.configuration.PersistentSettingsService;
import de.rcenvironment.core.utils.common.StringUtils;
import de.rcenvironment.core.utils.incubator.ServiceRegistry;
import de.rcenvironment.core.utils.incubator.ServiceRegistryAccess;
/**
* Handling the storage and retrieval of used commands.
*
* @author Marc Stammerjohann
*/
public class CommandHandler {
private static final String KEYCOMMAND = "UsedCommands";
private static final String SAVEDCOMMANDCOUNTER = "SavedCommandCounter";
/** Constant. Command History is limited to 30 entries. */
private static final int COMMAND_LIMIT = 30;
/** Recently used commands. User can iterate over it through key up and down. */
private final List<String> usedCommands = new ArrayList<String>();
private PersistentSettingsService persistentSettingsService;
public CommandHandler() {
ServiceRegistryAccess serviceRegistryAccess = ServiceRegistry.createAccessFor(this);
persistentSettingsService = serviceRegistryAccess.getService(PersistentSettingsService.class);
retrieveCommandHistory();
}
public List<String> getUsedCommands() {
return usedCommands;
}
/** Retrieve commands from persistent service. */
private void retrieveCommandHistory() {
String commands = persistentSettingsService.readStringValue(KEYCOMMAND);
if (commands != null) {
String[] commandSplit = StringUtils.splitAndUnescape(commands);
for (String element : commandSplit) {
addUsedCommand(element);
}
}
}
/**
* Adding used commands at the first position of {@link CommandHandler#usedCommands}. Removes the last command, if the list size is
* equals {@link CommandHandler#COMMAND_LIMIT}.
*
* @param command recently used
*/
public void addUsedCommand(String command) {
usedCommands.remove(command);
int size = usedCommands.size();
if (size == COMMAND_LIMIT) {
usedCommands.remove(size - 1);
}
usedCommands.add(0, command);
}
/**
* Save command with persistent service. Used as History. Commands are available after restart.
*
* @param command to be saved
*/
public void saveCommand(String command) {
String savedCommands = persistentSettingsService.readStringValue(KEYCOMMAND);
String savedCommandCounter = persistentSettingsService.readStringValue(SAVEDCOMMANDCOUNTER);
String escapeAndConcat = null;
int savedCounter;
if (savedCommandCounter == null) {
savedCounter = 0;
} else {
savedCounter = Integer.parseInt(savedCommandCounter);
}
if (savedCounter < COMMAND_LIMIT) {
// saves new command
if (savedCommands == null) {
escapeAndConcat = StringUtils.escapeAndConcat(command);
} else {
String[] splitAndUnescape = splitAndUnescapeCommand(savedCommands, command, savedCounter);
escapeAndConcat = StringUtils.escapeAndConcat(splitAndUnescape);
}
persistentSettingsService.saveStringValue(SAVEDCOMMANDCOUNTER, "" + ++savedCounter);
} else {
// if limit of saving commands is reached, last command will be removed
String[] splitAndUnescape = splitAndRemoveLast(savedCommands, command);
escapeAndConcat = StringUtils.escapeAndConcat(splitAndUnescape);
}
persistentSettingsService.saveStringValue(KEYCOMMAND, escapeAndConcat);
}
/** Splits saved commands and adds new command to be saved. */
private String[] splitAndUnescapeCommand(String savedCommands, String command, int savedCounter) {
String[] splitAndUnescape = new String[savedCounter + 1];
String[] commandSplit = StringUtils.splitAndUnescape(savedCommands);
for (int i = 0; i < commandSplit.length; i++) {
splitAndUnescape[i] = commandSplit[i];
}
splitAndUnescape[splitAndUnescape.length - 1] = command;
return splitAndUnescape;
}
/** Removes last command. */
private String[] splitAndRemoveLast(String savedCommands, String command) {
String[] splitAndUnescape = StringUtils.splitAndUnescape(savedCommands);
for (int i = 0; i < splitAndUnescape.length - 1; i++) {
splitAndUnescape[i] = splitAndUnescape[i + 1];
}
splitAndUnescape[splitAndUnescape.length - 1] = command;
return splitAndUnescape;
}
}