package com.framsticks.diagnostics; import java.util.Date; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.text.SimpleDateFormat; import org.apache.log4j.Logger; import com.framsticks.core.AbstractInstanceListener; import com.framsticks.core.Instance; import com.framsticks.dumping.PrintWriterSink; import com.framsticks.dumping.SaveStream; import com.framsticks.params.annotations.AutoAppendAnnotation; import com.framsticks.remote.RecursiveFetcher; import com.framsticks.util.Logging; import com.framsticks.util.PeriodicTask; import com.framsticks.util.StateFunctor; import com.framsticks.util.dispatching.JoinableCollection; import com.framsticks.util.io.Encoding; /** * @author Piotr Sniegowski */ public class Diagnostics extends JoinableCollection { private static final Logger log = Logger.getLogger(Diagnostics.class); Integer dumpsInterval; String dumpsPath; String dumpsFormat; public Diagnostics() { } @Override @AutoAppendAnnotation public void add(final Instance instance) { super.add(instance); instance.addListener(new AbstractInstanceListener() { @Override public void onRun(Exception e) { if (e != null) { return; } if (dumpsInterval != null) { new PeriodicTask(instance, dumpsInterval * 1000) { @Override public void run() { log.info("starting periodic dump"); new RecursiveFetcher(instance, instance.getRootPath(), new StateFunctor() { @Override public void call(Exception e) { if (Logging.log(log, "recursively fetch", instance, e)) { again(); return; } log.info("instance resolved, saving"); try { final String fileName = dumpsPath + "/" + instance + "_" + new SimpleDateFormat(dumpsFormat).format(new Date()) + ".param"; File file = new File(fileName); new SaveStream(new PrintWriterSink(new PrintWriter(new OutputStreamWriter(new FileOutputStream(file), Encoding.getFramsticksCharset()))), instance, instance.getRootPath(), new StateFunctor() { @Override public void call(Exception e) { Logging.log(log, "periodic dump in " + fileName + " of", instance, e); again(); } }); } catch (IOException ex) { log.info("failed to initiate dump: " + ex); again(); } } }); } }; } } }); } // @Override // public void configure(Configuration config) { // super.configure(config); // dumpsInterval = config.getInteger("dumps.interval", null); // dumpsPath = config.getString("dumps.path", null); // dumpsFormat = config.getString("dumps.format", null); // } }