/* * 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.ByteArrayInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileReader; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.zip.ZipInputStream; import scouter.client.stack.config.ParserConfig; import scouter.client.stack.utils.ResourceUtils; import scouter.client.stack.utils.StringUtils; public class BasicFileStackParser extends StackParser { public BasicFileStackParser(){ } public BasicFileStackParser(ParserConfig config){ super(config); } public void process(){ BufferedReader reader = null; ZipInputStream zipInputStream = null; try { if(getStackContents() != null){ reader = new BufferedReader(new InputStreamReader(new ByteArrayInputStream(getStackContents().getBytes()))); }else if(ResourceUtils.isZipFile(getStackFileInfo().getFilename())){ zipInputStream = new ZipInputStream(new FileInputStream(new File(getStackFileInfo().getFilename()))); zipInputStream.getNextEntry(); reader = new BufferedReader(new InputStreamReader(zipInputStream)); }else{ 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(); int lineCount = 0; int lineSize = 0; int workerCount = 0; int workingCount = 0; int totalWorkerCount = 0; int dumpCount = 0; ThreadStatusInfo tsinfo = new ThreadStatusInfo(); ParserConfig config = getConfig(); String timeFilter = config.getTimeFilter(); int timePosition = config.getTimePosition(); int timeSize = config.getTimeSize(); int stackStartLine = config.getStackStartLine(); String divideStack = config.getDivideStack(); String timeMatchStr = null; if(timeFilter != null && timeSize > 0){ timeMatchStr = new StringBuilder(50).append("(.*)").append(timeFilter).append("(.*)").toString(); } while((line = reader.readLine()) != null){ progressBar(); // Empty line or include divideStack string lineSize = line.trim().length(); if( lineSize == 0 || (divideStack != null && line.indexOf(divideStack)>= 0)){ if(isWorking && lineCount > stackStartLine){ processStack(workingList, tsinfo); } isWorking = false; workingList = new ArrayList<String>(300); lineCount = 0; if(lineSize == 0){ continue; } } // Dump time if(lineCount == 0){ if(timeMatchStr != null && line.matches(timeMatchStr) && line.length() >= (timePosition + 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.substring(timePosition, (timePosition + timeSize))); tsinfo = new ThreadStatusInfo(); writeTime(line); workerCount = 0; workingCount = 0; dumpCount++; }else{ if(StringUtils.checkExist(line, workerThread)){ workerCount++; totalWorkerCount++; } } } // Working Thread if(!isWorking && isWorkingThread(line)){ isWorking = true; workingCount++; } //Thread status count workingList.add(line); lineCount++; } // last stack if(isWorking && lineCount > stackStartLine){ processStack(workingList, tsinfo); } // last time if(timeMatchStr != null && 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(zipInputStream != null){ try { zipInputStream.closeEntry();}catch(Exception e){} } if(reader != null){ try { reader.close();}catch(Exception e){} } } } }