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.AbstractTreeListener; import com.framsticks.core.Tree; import com.framsticks.core.Path; 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.FramsticksException; import com.framsticks.util.PeriodicTask; import com.framsticks.util.dispatching.ExceptionResultHandler; import com.framsticks.util.dispatching.FutureHandler; import com.framsticks.util.dispatching.JoinableCollection; import com.framsticks.util.dispatching.ThrowExceptionHandler; 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 Tree tree) { super.add(tree); tree.addListener(new AbstractTreeListener() { @Override public void onRun(Exception e) { if (e != null) { return; } if (dumpsInterval != null) { new PeriodicTask(ThrowExceptionHandler.getInstance(), tree, dumpsInterval * 1000) { protected final ExceptionResultHandler repeater = new ExceptionResultHandler() { @Override public void handle(FramsticksException exception) { log.error("caught error during diagnostics fetching (repeating): " + exception); again(); } }; @Override protected void runAt() { log.info("starting periodic dump"); new RecursiveFetcher(tree, Path.to(tree, "/"), new FutureHandler(repeater) { @Override protected void result(Void result) { log.info("tree resolved, saving"); try { final String fileName = dumpsPath + "/" + tree + "_" + 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()))), tree, Path.to(tree, "/"), new FutureHandler(repeater) { @Override protected void result(Void result) { again(); } }); } catch (IOException e) { throw new FramsticksException().msg("failed to initiate dump").cause(e); } } }); } }; } } }); } // @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); // } }