/*
* Copyright 2015 the original author or authors.
* @https://github.com/scouter-project/scouter
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package scouter.client.stack.data;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.ArrayList;
import scouter.client.stack.config.ParserConfig;
import scouter.client.stack.utils.StringUtils;
public class FilterStackParser extends StackParser {
public FilterStackParser(){
}
public FilterStackParser(ParserConfig config){
super(config);
}
public void process(){
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader(new File(getStackFileInfo().getFilename())));
StringBuilder timeBuffer = null;
String line = null;
boolean isWorking = false;
ArrayList<String> workingList = new ArrayList<String>(300);
ArrayList<String> workerThread = getWorkerThread();
String filter = getFilter();
ThreadStatusInfo tsinfo = new ThreadStatusInfo();
int lineCount = 0;
int workerCount = 0;
int workingCount = 0;
int totalWorkerCount = 0;
int dumpCount = 0;
ParserConfig config = getStackFileInfo().getParserConfig();
int stackStartLine = config.getStackStartLine();
int timeSize = config.getTimeSize();
while((line = reader.readLine()) != null){
progressBar();
if(line.trim().length() == 0){
if(isWorking && lineCount > stackStartLine){
processStack(workingList, tsinfo);
}
isWorking = false;
workingList = new ArrayList<String>(300);
lineCount = 0;
continue;
}
// Dump time
if(lineCount == 0){
if(line.length() == timeSize){
if(timeBuffer != null && timeBuffer.length() > 10){
timeBuffer.append('\t').append(workerCount).append('\t').append(workingCount);
for(int tsIndex = 0; tsIndex < tsinfo.geSize(); tsIndex++){
timeBuffer.append('\t').append(tsinfo.getValue(tsIndex));
}
addTime(timeBuffer.toString());
}
timeBuffer = new StringBuilder(50);
timeBuffer.append(line);
tsinfo = new ThreadStatusInfo();
writeTime(line);
workerCount = 0;
workingCount = 0;
dumpCount++;
}else{
if(StringUtils.checkExist(line, workerThread)){
workerCount++;
totalWorkerCount++;
}
}
}
// Working Thread
if(!isWorking && line.indexOf(filter) >= 0){
isWorking = true;
workingCount++;
}
workingList.add(line);
lineCount++;
}
// last stack
if(isWorking && lineCount > stackStartLine){
processStack(workingList, tsinfo);
}
// last time
if(timeBuffer != null && timeBuffer.length() > 10){
timeBuffer.append('\t').append(workerCount).append('\t').append(workingCount);
for(int tsIndex = 0; tsIndex < tsinfo.geSize(); tsIndex++){
timeBuffer.append('\t').append(tsinfo.getValue(tsIndex));
}
addTime(timeBuffer.toString());
}
setTotalWorkerCount(totalWorkerCount);
setDumpCount(dumpCount);
}catch(Exception ex){
throw new RuntimeException(ex);
}finally{
if(reader != null){
try { reader.close();}catch(Exception e){}
}
}
}
}