001package jmri.jmrit.logixng.expressions;
002
003import java.util.*;
004
005import jmri.*;
006import jmri.jmrit.logixng.*;
007import jmri.jmrit.logixng.util.LogixNG_SelectString;
008
009/**
010 * Reads a local variable.
011 *
012 * @author Daniel Bergqvist Copyright 2022
013 */
014public class AnalogExpressionLocalVariable extends AbstractAnalogExpression {
015
016    private final LogixNG_SelectString _selectNamedBean = new LogixNG_SelectString(this);
017
018    public AnalogExpressionLocalVariable(String sys, String user)
019            throws BadUserNameException, BadSystemNameException {
020
021        super(sys, user);
022    }
023
024    @Override
025    public Base getDeepCopy(Map<String, String> systemNames, Map<String, String> userNames) throws JmriException {
026        AnalogExpressionManager manager = InstanceManager.getDefault(AnalogExpressionManager.class);
027        String sysName = systemNames.get(getSystemName());
028        String userName = userNames.get(getSystemName());
029        if (sysName == null) sysName = manager.getAutoSystemName();
030        AnalogExpressionLocalVariable copy = new AnalogExpressionLocalVariable(sysName, userName);
031        copy.setComment(getComment());
032        _selectNamedBean.copy(copy._selectNamedBean);
033        return manager.registerExpression(copy).deepCopyChildren(this, systemNames, userNames);
034    }
035
036    public LogixNG_SelectString getSelectNamedBean() {
037        return _selectNamedBean;
038    }
039
040    /** {@inheritDoc} */
041    @Override
042    public LogixNG_Category getCategory() {
043        return LogixNG_Category.ITEM;
044    }
045
046    /** {@inheritDoc} */
047    @Override
048    public double evaluate() throws JmriException {
049        String localVariable = _selectNamedBean.evaluateValue(getConditionalNG());
050        if (localVariable == null) return 0.0;
051
052        Object value = getConditionalNG().getSymbolTable().getValue(localVariable);
053        if (value != null) {
054            return jmri.util.TypeConversionUtil.convertToDouble(value, false);
055        } else {
056            return 0.0;
057        }
058    }
059
060    /** {@inheritDoc} */
061    @Override
062    public FemaleSocket getChild(int index)
063            throws IllegalArgumentException, UnsupportedOperationException {
064        throw new UnsupportedOperationException("Not supported.");
065    }
066
067    /** {@inheritDoc} */
068    @Override
069    public int getChildCount() {
070        return 0;
071    }
072
073    /** {@inheritDoc} */
074    @Override
075    public String getShortDescription(Locale locale) {
076        return Bundle.getMessage(locale, "AnalogExpressionLocalVariable_Short");
077    }
078
079    /** {@inheritDoc} */
080    @Override
081    public String getLongDescription(Locale locale) {
082        return Bundle.getMessage(locale, "AnalogExpressionLocalVariable_Long", _selectNamedBean.getDescription(locale));
083    }
084
085    /** {@inheritDoc} */
086    @Override
087    public void setup() {
088        // Do nothing
089    }
090
091    /** {@inheritDoc} */
092    @Override
093    public void disposeMe() {
094    }
095
096    /** {@inheritDoc} */
097    @Override
098    public void getUsageDetail(int level, NamedBean bean, List<NamedBeanUsageReport> report, NamedBean cdl) {
099        log.debug("getUsageReport :: AnalogExpressionLocalVariable: bean = {}, report = {}", cdl, report);
100    }
101
102    private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(AnalogExpressionLocalVariable.class);
103
104}