
org.bidib.wizard.script.node.SelectAccessoryCommand Maven / Gradle / Ivy
package org.bidib.wizard.script.node;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.MapUtils;
import org.bidib.wizard.highlight.BidibScriptScanner;
import org.bidib.wizard.highlight.Scanner;
import org.bidib.wizard.highlight.Token;
import org.bidib.wizard.highlight.TokenTypes;
import org.bidib.wizard.mvc.main.model.Accessory;
import org.bidib.wizard.mvc.main.model.MacroRef;
import org.bidib.wizard.mvc.script.view.NodeScripting;
import org.bidib.wizard.mvc.script.view.ScriptParser;
import org.bidib.wizard.script.AbstractScriptCommand;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class SelectAccessoryCommand extends AbstractScriptCommand {
private static final Logger LOGGER = LoggerFactory.getLogger(SelectAccessoryCommand.class);
public static final String KEY = "selectAccessory";
private Long uuid;
private String label;
private Integer accessoryNumber;
private List aspects;
protected SelectAccessoryCommand() {
super(KEY);
}
public SelectAccessoryCommand(Long uuid) {
super(KEY);
this.uuid = uuid;
}
/**
* @return the accessoryNumber
*/
public Integer getAccessoryNumber() {
return accessoryNumber;
}
public String getLabel() {
return label;
}
public void setLabel(String label) {
this.label = label;
}
/**
* @param accessoryNumber
* the accessoryNumber to set
*/
public void setAccessoryNumber(Integer accessoryNumber) {
this.accessoryNumber = accessoryNumber;
}
public void addAspect(AddAspectCommand aspect) {
if (aspects == null) {
aspects = new LinkedList<>();
}
LOGGER.info("Add new aspect: {}", aspect);
aspects.add(aspect);
}
public List getAspects() {
return aspects;
}
@Override
public void parse(String commandLine) {
// TODO Auto-generated method stub
LOGGER.info("Set the label: {}", commandLine);
// label = commandLine;
}
public void scan(Scanner scanner, int index, final Map context) {
for (int i = index + 1; i < scanner.size(); i++) {
Token token = scanner.getToken(i);
LOGGER.info("scan, current index: {}, token symbol: {}, name: {}", i, token.symbol.type, token.symbol.name);
switch (token.symbol.type) {
case TokenTypes.KEYWORD2:
switch (token.symbol.name) {
// case BidibScriptScanner.KEY2_LABEL:
case BidibScriptScanner.KEY2_NAME:
// label detected
StringValueCallback labelAware = new StringValueCallback() {
@Override
public void setString(String value) {
LOGGER.info("Set the macro name: {}", value);
setLabel(label);
}
};
i += NodeScriptUtils.parseLabel(scanner, i, labelAware, context);
break;
default:
break;
}
break;
case TokenTypes.NUMBER:
// set the accessory number
setAccessoryNumber(Integer.valueOf(token.symbol.name));
break;
case TokenTypes.VARIABLE:
if (i == 2) {
// set the accessory number
LOGGER.info("Set the accessory number based on a variable: {}", token.symbol.name);
String variable = token.symbol.name;
Object value = context.get(variable);
if (value == null) {
// not found -> use the variable
value = variable;
}
// TODO if this should work we must have a map of accessory label to accessory
if (value instanceof String) {
String accessoryName = (String) value;
// get the corresponding accessory number
// AccessoryLabels accessoryLabels =
// DefaultApplicationContext.getInstance().get(
// DefaultApplicationContext.KEY_ACCESSORY_LABELS, AccessoryLabels.class);
//
// Integer accessoryId = accessoryLabels.getIdByLabel(uuid, accessoryName);
Map accessoryLabels =
(Map) context.get(ScriptParser.KEY_ACCESSORY_LABELS);
Integer accessoryId = MapUtils.invertMap(accessoryLabels).get(accessoryName);
if (accessoryId != null) {
value = accessoryId;
}
else {
LOGGER.warn("No corresponding accessory number found for accessory name: {}",
accessoryName);
}
}
setAccessoryNumber(Integer.valueOf(value.toString()));
}
default:
break;
}
}
}
@Override
protected void internalExecute(final NodeScripting scripting, final Map context) {
LOGGER.info("Select the accessory: {}", this);
// TODO create a accessory from the provided data
// AccessoryLabels accessoryLabels =
// DefaultApplicationContext.getInstance().get(DefaultApplicationContext.KEY_ACCESSORY_LABELS,
// AccessoryLabels.class);
Map accessoryLabels = (Map) context.get(ScriptParser.KEY_ACCESSORY_LABELS);
// TODO set the macrosize from the device
Accessory accessory = new Accessory();
accessory.setMacroSize(16);
accessory.setLabel(accessoryLabels.get(accessoryNumber));
accessory.setId(accessoryNumber);
if (CollectionUtils.isNotEmpty(getAspects())) {
for (AddAspectCommand command : getAspects()) {
// replace all placeholders in the aspects
command.prepareAccessory(context);
accessory.addAspect(new MacroRef(command.getMacroNumber()));
}
}
else {
LOGGER.info("No aspects provided.");
}
scripting.setAccessory(uuid, accessory);
}
@Override
public String toString() {
StringBuffer sb = new StringBuffer("[");
sb.append(getClass().getSimpleName());
sb.append(", uuid: ").append(uuid);
sb.append(", accessoryNumber: ").append(accessoryNumber);
sb.append(", aspects: ");
if (CollectionUtils.isNotEmpty(aspects)) {
for (AddAspectCommand step : aspects) {
sb.append("\r\n").append(step);
}
}
else {
sb.append("");
}
sb.append("]");
return sb.toString();
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy