/**
* SlingBeans - NetBeans Sling plugin https://github.com/jkan997/SlingBeans
* Licensed under Apache 2.0 license http://www.apache.org/licenses/LICENSE-2.0
*/
package org.jkan997.slingbeans.nblogviewer;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.Timer;
import java.util.TimerTask;
import org.jkan997.slingbeans.helper.DisposableTimerTask;
import org.jkan997.slingbeans.helper.LogHelper;
import org.jkan997.slingbeans.slingfs.FileSystem;
import org.openide.windows.IOProvider;
import org.openide.windows.InputOutput;
import org.openide.windows.OutputWriter;
/**
*
* @author jkan997
*/
public class LogViewer {
private InputOutput io;
private Timer timer;
private long lastPos = 0;
private String logName = null;
private OutputWriter logWriter;
private FileSystem fs;
private Map<String, String> params = new HashMap<String, String>();
private final static Set<LogViewer> logViewers = new HashSet<LogViewer>();
public synchronized static void openLogViewer(FileSystem fs, String logName) {
IOProvider iop = IOProvider.getDefault();
String ioName = logName;
InputOutput io = iop.getIO(ioName, false);
if (io != null) {
io.closeInputOutput();
}
io = iop.getIO(ioName, false);
io.setOutputVisible(true);
io.select();
closeLogViewer(logName);
LogViewer lv = new LogViewer();
lv.init(io, fs, logName);
logViewers.add(lv);
}
public synchronized static void closeLogViewer(String logName) {
for (LogViewer lv : logViewers) {
if (lv.getLogName().equals(logName)) {
lv.dispose();
}
}
}
public synchronized static void closeAllLogViewers() {
for (LogViewer lv : logViewers) {
lv.dispose();
}
}
public String getLogName() {
return logName;
}
protected LogViewer() {
}
protected void init(InputOutput inputIo, FileSystem fs, String logName) {
this.logName = logName;
this.fs = fs;
this.io = inputIo;
logWriter = io.getOut();
timer = new Timer();
TimerTask timerTask = new DisposableTimerTask() {
@Override
public void run() {
if (io.isClosed()) {
cancel();
dispose();
} else {
try {
updateLog();
} catch (Exception ex) {
LogHelper.logError(ex);
}
}
}
};
timer.scheduleAtFixedRate(timerTask, 0, 1000);
LogHelper.logInfo(this, "Log Timer scheduled");
}
public void dispose() {
try {
if (timer != null) {
timer.cancel();
LogHelper.logInfo(this, "Log Timer canceled");
io.closeInputOutput();
}
} catch (Exception ex) {
LogHelper.logError(ex);
}
}
private void updateLog() throws Exception {
boolean res = false;
String urlStr = logName;
long startPos = -1;
long lastBytes = -1;
String action = null;
if (lastPos > 0) {
startPos = lastPos;
} else {
lastBytes = (200 * 500);
}
String url = "/bin/remotelog.html";
params.clear();
if (startPos >= 0) {
params.put("startPos", "" + startPos);
}
if (lastBytes >= 0) {
params.put("lastBytes", "" + lastBytes);
}
if (action != null) {
params.put("action", action);
}
if (logName != null) {
params.put("logFile", logName);
}
byte[] resp = fs.sendGet(url, params, false);
InputStream is = new ByteArrayInputStream(resp);
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String line = null;
while ((line = br.readLine()) != null) {
if (line.startsWith("END_POSITION:")) {
line = line.replaceAll("END_POSITION:", "").trim();
long newLastPos = Long.parseLong(line);
if (newLastPos > lastPos) {
lastPos = newLastPos;
}
} else /* if ((hideReplicationCheck.isSelected())
&& (line.indexOf("com.day.cq.replication.Agent") >= 0)) {
// Skip line
} */ if (line.length() > 0) {
res = true;
logWriter.append(line);
logWriter.append("\n");
}
}
br.close();
}
}