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}