All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.bidib.wizard.script.node.SelectAccessoryCommand Maven / Gradle / Ivy

There is a newer version: 2.0.0-M1
Show newest version
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