/*******************************************************************************
* Copyright (c) 2009 Red Hat, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Red Hat - initial API and implementation
*******************************************************************************/
package org.eclipse.linuxtools.internal.callgraph.core;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
/**
* Helper class parses the given string for recognizable error messages
*
*/
public class SystemTapErrorHandler {
public static final String FILE_PROP = "errors.prop"; //$NON-NLS-1$
private final int LINE_LIMIT = 300;
private boolean errorRecognized;
private StringBuilder errorMessage = new StringBuilder(""); //$NON-NLS-1$
private StringBuilder logContents;
public SystemTapErrorHandler() {
errorRecognized = false;
errorMessage.append(Messages
.getString("SystemTapErrorHandler.ErrorMessage") + //$NON-NLS-1$
Messages.getString("SystemTapErrorHandler.ErrorMessage1")); //$NON-NLS-1$
logContents = new StringBuilder();
}
/**
* Search given string for recognizable error messages. Can append the
* contents of the string to the error log if writeToLog() or
* finishHandling() are called.
* @param doc
*/
public void handle(IProgressMonitor m, String errors) {
String[] errorsList = errors.split("\n"); //$NON-NLS-1$
// READ FROM THE PROP FILE AND DETERMINE TYPE OF ERROR
File file = new File(PluginConstants.getPluginLocation() + FILE_PROP);
try (BufferedReader buff1 = new BufferedReader(new FileReader(file))) {
String line;
for (String message : errorsList) {
try (BufferedReader innerBuff = new BufferedReader(
new FileReader(file))) {
while ((line = innerBuff.readLine()) != null) {
if (m != null && m.isCanceled()) {
return;
}
int index = line.indexOf('=');
Pattern pat = Pattern.compile(line.substring(0, index),
Pattern.DOTALL);
Matcher matcher = pat.matcher(message);
if (matcher.matches()) {
if (!isErrorRecognized()) {
// First error
errorMessage
.append(Messages
.getString("SystemTapErrorHandler.ErrorMessage2")); //$NON-NLS-1$
errorRecognized = true;
}
String errorFound = line.substring(index + 1);
if (!errorMessage.toString().contains(errorFound)) {
errorMessage.append(errorFound
+ PluginConstants.NEW_LINE);
}
break;
}
}
}
}
logContents.append(errors);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* Append to the log contents
*/
public void appendToLog (String header){
logContents.append(header);
}
/**
* Handle the error.
*
* @param m
* @param f Temporary error file
* @throws IOException
*/
public void handle(IProgressMonitor m, FileReader f) throws IOException {
BufferedReader br = new BufferedReader(f);
String line;
StringBuilder builder = new StringBuilder();
int counter = 0;
while ((line = br.readLine()) != null) {
counter++;
builder.append(line + "\n"); //$NON-NLS-1$
if (m != null && m.isCanceled()) {
return;
}
if (counter == LINE_LIMIT) {
handle(m, builder.toString());
builder = new StringBuilder();
counter = 0;
}
}
handle(m, builder.toString());
}
/**
* Run this method when there are no more error messages to handle. Creates
* the error pop-up message and writes to log.Currently relaunch only works
* for the callgraph script.
*/
public void finishHandling() {
if (!isErrorRecognized()) {
errorMessage.append(Messages.getString("SystemTapErrorHandler.NoErrRecognized") + //$NON-NLS-1$
Messages.getString("SystemTapErrorHandler.NoErrRecognizedMsg")); //$NON-NLS-1$
}
writeToLog();
}
/**
* Writes the contents of logContents to the error log, along with date and
* time.
*/
private void writeToLog() {
IStatus status = new Status(IStatus.ERROR,CallgraphCorePlugin.PLUGIN_ID,logContents.toString());
CallgraphCorePlugin.getDefault().getLog().log(status);
logContents = new StringBuilder();
}
/**
* @return Returns true if an error matches one of the regex's in error.prop
* and false otherwise.
*/
public boolean isErrorRecognized() {
return errorRecognized;
}
/**
* @return The error message string
*/
public String getErrorMessage(){
return errorMessage.toString();
}
}