package com.framsticks.diagnostics; import com.framsticks.core.Path; import com.framsticks.dumping.SaveStream; import com.framsticks.observers.Endpoint; import com.framsticks.dumping.PrintStreamSink; import com.framsticks.remote.RecursiveFetcher; import com.framsticks.util.Logging; import com.framsticks.util.PeriodicTask; import com.framsticks.util.StateFunctor; import org.apache.log4j.Logger; import java.io.File; import java.io.IOException; import java.io.PrintStream; import java.text.SimpleDateFormat; import java.util.Date; /** * @author Piotr Sniegowski */ public class DiagnosticsEndpoint extends Endpoint { private final static Logger LOGGER = Logger.getLogger(DiagnosticsEndpoint.class.getName()); public DiagnosticsEndpoint() { super(); } @Override public Diagnostics getObserver() { return (Diagnostics)observer; } @Override protected void configure() { super.configure(); if (getObserver().dumpsInterval != null) { new PeriodicTask(instance, getObserver().dumpsInterval * 1000) { @Override public void run() { LOGGER.info("starting periodic dump"); new RecursiveFetcher(instance, new Path(instance, "/"), new StateFunctor() { @Override public void call(Exception e) { if (Logging.log(LOGGER, "recursively fetch", instance, e)) { again(); return; } LOGGER.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 PrintStreamSink(new PrintStream(file)), instance, new Path(instance, "/"), new StateFunctor() { @Override public void call(Exception e) { Logging.log(LOGGER, "periodic dump in " + fileName + " of", DiagnosticsEndpoint.this.instance, e); again(); } }); } catch (IOException ex) { LOGGER.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. } */ }