package org.kisst.util;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Date;
import org.kisst.gft.GftSettings;
import org.kisst.props4j.Props;
import com.jamonapi.Monitor;
import com.jamonapi.MonitorComposite;
import com.jamonapi.MonitorFactory;
public class JamonUtil {
public static String getFirstDnPart(String dn) {
int pos=dn.indexOf('=');
int pos2=dn.indexOf(',',pos);
if (pos<0 ||pos2<0)
return dn;
else
return dn.substring(pos+1, pos2);
}
private static Comparator<Monitor> comparator = new Comparator<Monitor>() {
public int compare(Monitor o1, Monitor o2) {
return String.CASE_INSENSITIVE_ORDER.compare(o1.getLabel(), o2.getLabel());
}
};
private static void logAndResetAllTimers(String filename, String message) {
SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
StringBuilder msg= new StringBuilder();
msg.append(format.format(new Date()));
msg.append('\t');
msg.append(message);
msg.append('\n');
MonitorComposite rootMon = MonitorFactory.getRootMonitor();
Monitor[] monitors = null;
if (rootMon!=null)
monitors=rootMon.getMonitors();
if (monitors!=null) {
Arrays.sort(monitors,comparator);
for (Monitor mon : monitors){
if (mon.getHits()==0)
continue;
msg.append(format.format(new Date()));
msg.append('\t');
msg.append(mon);
msg.append('\n');
mon.reset();
}
}
FileOutputStream out = null;
try {
out = new FileOutputStream(filename, true);
out.write(msg.toString().getBytes());
} catch (IOException e) { throw new RuntimeException(e);}
finally {
if (out!=null) {
try { out.close(); }
catch (IOException e) { throw new RuntimeException(e);}
}
}
}
public static void jamonLog(Props props, String message) {
if (props==null) {
//logger.warn("Could not perform jamon logging because properties are not available for jamonLog: "+message);
return;
}
if (! GftSettings.jamonEnabled.get(props))
return;
String filename=GftSettings.jamonfilename.get(props);
Date now = new Date();
filename = filename.replace("${yyyy}", new SimpleDateFormat("yyyy").format(now));
filename = filename.replace("${mm}", new SimpleDateFormat("MM").format(now));
filename = filename.replace("${dd}", new SimpleDateFormat("dd").format(now));
filename = filename.replace("${dollar}", "$");
JamonUtil.logAndResetAllTimers(filename, message);
}
public static class JamonThread implements Runnable {
private boolean running=true;
private Thread myThread=null;
private final Props props;
public JamonThread(Props props) {
this.props=props;
}
public void run() {
myThread = Thread.currentThread();
while (running) {
int interval = GftSettings.jamonIntervalInSeconds.get(props);
try {
if (interval<=0)
Thread.sleep(600*1000); // sleep 10 minutes, could be any time
else
Thread.sleep(interval*1000);
synchronized(this) {
if (interval>0)
jamonLog(props, "TIMER expired after "+interval+" seconds, dumping all statistics");
}
} catch (InterruptedException e) { /* ignore, probably a reset or stop */ }
}
myThread=null;
}
public synchronized void stop() {
running=false;
reset();
}
public synchronized void reset() {
if (myThread!=null)
myThread.interrupt();
}
}
}