package org.fastcatsearch.http.action.management.test;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import org.fastcatsearch.http.ActionMapping;
import org.fastcatsearch.http.action.ActionRequest;
import org.fastcatsearch.http.action.ActionResponse;
import org.fastcatsearch.http.action.AuthAction;
import org.fastcatsearch.http.action.StreamWriter;
import org.fastcatsearch.ir.util.Formatter;
/*
* 파일을 지속적으로 read line하여 전달해주는 action.
* tail를 system.log파일에 걸 경우, 이 action에서 system.log에 기록을 하는 코드가 있으면 무한루프에 빠지기 때문에 여기서는 로거를 사용하지 않는다.
*
* tail할 파일의 데이터가 작을 경우 http write시 버퍼크기에 미치지 못해 client쪽에서 데이터가 안보일수 있지만, 차후 로그파일에 몇라인이 기록되면 그때 보인다.
* 이 액션만 http response에 버퍼를 사용하지 않도록 하면 통일성이 깨지므로, 이 현상은 그대로 놔둔다.
* */
@ActionMapping("/management/test/tail")
public class TestTailAction extends AuthAction {
static String encoding = "utf-8";
@Override
public void doAuthAction(ActionRequest request, ActionResponse response) throws Exception {
String filepath = request.getParameter("filepath");
int defaultSize = request.getIntParameter("defaultSize", 1024);
String type = request.getParameter("type", "text");
String linefeed = null;
if (type.equalsIgnoreCase("text")) {
linefeed = "\n";
} else if (type.equalsIgnoreCase("html")) {
linefeed = "<br>";
}
File f = new File(filepath);
System.out.println("TestTailAction "+this+" Started!");
if (!f.exists()) {
return;
}
long skipSize = f.length();
Reader fileReader = new FileReader(f);
if(skipSize > defaultSize){
skipSize -= defaultSize;
}
fileReader.skip(skipSize);
writeHeader(response);
StreamWriter streamWriter = response.getStreamWriter();
BufferedReader input = new BufferedReader(fileReader, 1024);
try {
streamWriter.writeHeader(response);
printTailInfoHeader(streamWriter, f);
String line = null;
while (true) {
if ((line = input.readLine()) != null) {
byte[] data = (line + linefeed).getBytes(encoding);
System.out.println("TestTailAction "+this+" "+line);
streamWriter.write(data, 0, data.length);
} else {
try {
Thread.sleep(500L);
} catch (InterruptedException x) {
Thread.currentThread().interrupt();
break;
}
}
}
} catch (IOException e) {
System.err.println("TestTailAction 에러발생 "+this);
return;
} finally {
if (input != null) {
input.close();
}
if (streamWriter != null) {
streamWriter.close();
}
}
System.out.println("TestTailAction "+this+" Finished!");
}
private void printTailInfoHeader(StreamWriter streamWriter, File f) throws IOException {
String header = "####################################################\n"
+ "# Tail file = " + f.getName() + " (" + Formatter.getFormatSize(f.length()) + ")\n"
+ "####################################################\n";
byte[] str = header.getBytes(encoding);
streamWriter.write(str, 0, str.length);
}
}