001package jmri.jmrit.logixng.expressions;
002
003import java.io.*;
004import java.nio.file.Files;
005import java.util.*;
006
007import jmri.InstanceManager;
008import jmri.JmriException;
009import jmri.jmrit.logixng.*;
010import jmri.jmrit.logixng.util.*;
011
012
013/**
014 * Does a file exists? If so, delete the file and return true.
015 *
016 * @author Daniel Bergqvist Copyright 2023
017 */
018public class FileAsFlag extends AbstractDigitalExpression {
019
020    private final LogixNG_SelectString _selectFilename =
021            new LogixNG_SelectString(this);
022
023    private final LogixNG_SelectEnum<DeleteOrKeep> _selectDeleteOrKeep =
024            new LogixNG_SelectEnum<>(this, DeleteOrKeep.values(), DeleteOrKeep.Keep);
025
026
027    public FileAsFlag(String sys, String user)
028            throws BadUserNameException, BadSystemNameException {
029        super(sys, user);
030    }
031
032    @Override
033    public Base getDeepCopy(Map<String, String> systemNames, Map<String, String> userNames) throws JmriException {
034        DigitalExpressionManager manager = InstanceManager.getDefault(DigitalExpressionManager.class);
035        String sysName = systemNames.get(getSystemName());
036        String userName = userNames.get(getSystemName());
037        if (sysName == null) sysName = manager.getAutoSystemName();
038        FileAsFlag copy = new FileAsFlag(sysName, userName);
039        copy.setComment(getComment());
040        _selectFilename.copy(copy._selectFilename);
041        _selectDeleteOrKeep.copy(copy._selectDeleteOrKeep);
042        return manager.registerExpression(copy);
043    }
044
045    public LogixNG_SelectString getSelectFilename() {
046        return _selectFilename;
047    }
048
049    public LogixNG_SelectEnum<DeleteOrKeep> getSelectDeleteOrKeep() {
050        return _selectDeleteOrKeep;
051    }
052
053    /** {@inheritDoc} */
054    @Override
055    public LogixNG_Category getCategory() {
056        return LogixNG_Category.OTHER;
057    }
058
059    /** {@inheritDoc} */
060    @Override
061    public boolean evaluate() throws JmriException {
062
063        String filename = _selectFilename.evaluateValue(getConditionalNG());
064        DeleteOrKeep deleteOrKeep = _selectDeleteOrKeep.evaluateEnum(getConditionalNG());
065
066        if (filename == null) return false;
067
068        try {
069            File file = new File(jmri.util.FileUtil.getExternalFilename(filename));
070            if (file.exists()) {
071                if (deleteOrKeep == DeleteOrKeep.Delete) {
072                    Files.delete(file.toPath());
073                }
074                return true;
075            } else {
076                return false;
077            }
078        } catch (IOException e) {
079            throw new JmriException("IOException has occurred: " + e.getLocalizedMessage(), e);
080        }
081    }
082
083    @Override
084    public FemaleSocket getChild(int index) throws IllegalArgumentException, UnsupportedOperationException {
085        throw new UnsupportedOperationException("Not supported.");
086    }
087
088    @Override
089    public int getChildCount() {
090        return 0;
091    }
092
093    @Override
094    public String getShortDescription(Locale locale) {
095        return Bundle.getMessage(locale, "FileAsFlag_Short");
096    }
097
098    @Override
099    public String getLongDescription(Locale locale) {
100        String filename = _selectFilename.getDescription(locale);
101        String deleteOrKeep = _selectDeleteOrKeep.getDescription(locale);
102
103        return Bundle.getMessage(locale, "FileAsFlag_Long", filename, deleteOrKeep);
104    }
105
106    /** {@inheritDoc} */
107    @Override
108    public void setup() {
109        // Do nothing
110    }
111
112    /** {@inheritDoc} */
113    @Override
114    public void disposeMe() {
115        // Do nothing
116    }
117
118
119    public enum DeleteOrKeep {
120        Delete(Bundle.getMessage("FileAsFlag_Delete")),
121        Keep(Bundle.getMessage("FileAsFlag_Keep"));
122
123        private final String _text;
124
125        private DeleteOrKeep(String text) {
126            this._text = text;
127        }
128
129        @Override
130        public String toString() {
131            return _text;
132        }
133
134    }
135
136
137//    private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(FileAsFlag.class);
138
139}