package com.framsticks.diagnostics; import com.framsticks.core.Instance; import com.framsticks.dumping.PrintWriterSink; import com.framsticks.dumping.SaveStream; import com.framsticks.observers.Endpoint; import com.framsticks.remote.RecursiveFetcher; import com.framsticks.util.Logging; import com.framsticks.util.PeriodicTask; import com.framsticks.util.StateFunctor; import com.framsticks.util.io.Encoding; import org.apache.log4j.Logger; 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 java.util.Date; /** * @author Piotr Sniegowski */ public class DiagnosticsEndpoint extends Endpoint { private final static Logger log = Logger.getLogger(DiagnosticsEndpoint.class.getName()); public DiagnosticsEndpoint() { super(); } @Override public Diagnostics getObserver() { return (Diagnostics)observer; } @Override public void start() { super.start(); if (getObserver().dumpsInterval != null) { new PeriodicTask(instance, getObserver().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 = getObserver().dumpsPath + "/" + instance + "_" + new SimpleDateFormat(getObserver().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", DiagnosticsEndpoint.this.instance, e); again(); } }); } catch (IOException ex) { log.info("failed to initiate dump: " + ex); again(); } } }); } }; } } /* @Override public void onChange(Path path) { super.onChange(path); //To change body of overridden methods use File | Settings | File Templates. } */ }