package dailyBot.model; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.TreeMap; import dailyBot.analysis.SignalHistoryRecord; import dailyBot.analysis.Utils; import dailyBot.control.DailyLog; import dailyBot.control.DailyProperties; import dailyBot.control.connection.EmailConnection; public class ExternalProcessFilter implements Filter { public static String getUniqueName(String name) { return name.intern(); } private final String name; private final double[] parameters; private final int loopCount; public ExternalProcessFilter(String name, String propertyName) { this.name = getUniqueName(name); ArrayList <Double> params = new ArrayList <Double> (); for(int i = 0; true; i++) { String property = DailyProperties.getProperty("dailyBot.model.ExternalProcessFilter." + propertyName + ".arg" + i); if(property == null) break; params.add(Double.parseDouble(property)); } parameters = new double[params.size()]; for(int i = 0; i < params.size(); i++) parameters[i] = params.get(i); loopCount = Integer.parseInt(DailyProperties.getProperty("dailyBot.model.ExternalProcessFilter." + propertyName + ".loopCount")); } @Override public boolean filter(SignalHistoryRecord record) { return process(record); } private void write(SignalHistoryRecord record) { List <SignalHistoryRecord> list = Utils.getRecords(); try { BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter( DailyProperties.getProperty("dailyBot.model.ExternalProcessFilter." + name + ".file"))); int total = record.getCharacteristics().length + record.getOutput().length; String first = ""; for(double d : parameters) first += " " + d; for(int i = parameters.length; i < total - 1; i++) first += " 0"; first += " " + dailyBot.model.Utils.getId(record); first = first.trim(); bufferedWriter.write(first + "\n"); bufferedWriter.write(record.generateLine() + "\n"); boolean writeAny = false; for(SignalHistoryRecord currentRecord : list) { if(Utils.isRelevant(currentRecord.openDate) && currentRecord.id.equals(record.id) && currentRecord.pair.equals(record.pair) && (currentRecord.buy == record.buy) && currentRecord != record) { bufferedWriter.write(currentRecord.generateLine() + "\n"); writeAny = true; } } if(!writeAny) { for(SignalHistoryRecord currentRecord : list) { if(currentRecord.id.equals(record.id) && currentRecord.pair.equals(record.pair) && (currentRecord.buy == record.buy)) { bufferedWriter.write(currentRecord.generateLine() + "\n"); writeAny = true; } } } bufferedWriter.flush(); bufferedWriter.close(); } catch(IOException e) { DailyLog.logError("Error escribiendo registros en filtroProveedorIA " + e.getMessage()); } } public final static Map <String, Integer> lastHit = Collections.synchronizedMap(new TreeMap <String, Integer> ()); private boolean process(SignalHistoryRecord record) { synchronized(name) { write(record); try { for(int i = 0; i < loopCount; i++) { Process process = Runtime.getRuntime().exec( DailyProperties.getProperty("dailyBot.model.ExternalProcessFilter." + name + ".command")); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream())); process.waitFor(); try { String firstOutput = bufferedReader.readLine().trim(); String secondOutput = bufferedReader.readLine(); if(secondOutput != null) firstOutput = firstOutput + secondOutput; firstOutput = firstOutput.trim(); if(firstOutput.toUpperCase().compareToIgnoreCase("YES") != 0) { if(!lastHit.containsKey(name)) { lastHit.put(name, -1); if(i > 0) EmailConnection.sendEmail("DailyBot-error", "Starting " + name + " - new: " + lastHit.get(name), EmailConnection.SUPERADMINS); } if(i > lastHit.get(name)) { if(i > 0) EmailConnection.sendEmail("DailyBot-error", "Increasing " + name + " - new: " + i + ", before: " + lastHit.get(name), EmailConnection.SUPERADMINS); lastHit.put(name, i); } return false; } } catch(Exception e) { } } return true; } catch(IOException e) { DailyLog.logError("Error de entrada salida en filtroProveedorIA " + e.getMessage()); return false; } catch(InterruptedException e) { DailyLog.logError("Error de interrupcion en filtroProveedorIA " + e.getMessage()); return false; } } } @Override public String getName() { return name; } }