package org.robobinding.binder;
import java.text.MessageFormat;
import java.util.Collection;
import org.robobinding.binder.ViewHierarchyInflationErrorsException.ErrorFormatter;
import org.robobinding.util.Throwables;
/**
*
* @since 1.0
* @version $Revision: 1.0 $
* @author Cheng Wei
*/
class ErrorFormatterWithFirstErrorStackTrace implements ErrorFormatter {
private static final String LINE_SEPARATOR = System.getProperty("line.separator");
@Override
public String format(ViewInflationErrors inflationError) {
ErrorMessageBuilder errorMessageBuilder = new ErrorMessageBuilder(inflationError);
return errorMessageBuilder.build();
}
private static class ErrorMessageBuilder {
private ViewInflationErrors inflationError;
private StringBuilder errorMessage;
public ErrorMessageBuilder(ViewInflationErrors inflationError) {
this.inflationError = inflationError;
}
public String build() {
errorMessage = new StringBuilder();
addBriefErrorList();
addFirstErrorStackTrace();
return errorMessage.toString();
}
private void addBriefErrorList() {
addErrorListHeader();
addErrorListBody();
}
private void addErrorListHeader() {
errorMessage.append(withNewLine(MessageFormat.format("-------------------------{0}({1} errors)-----------------------",
inflationError.getViewName(), inflationError.numErrors())));
}
private void addErrorListBody() {
Collection<Exception> errors = inflationError.getErrors();
for (Exception error : errors) {
errorMessage.append(withNewLine(error.toString()));
errorMessage.append(newLine());
}
if (!errors.isEmpty()) {
removeLastNewLine();
}
}
private void removeLastNewLine() {
int endIndex = errorMessage.length();
int startIndex = endIndex - lengthOfNewLineText();
errorMessage.delete(startIndex, endIndex);
}
private int lengthOfNewLineText() {
return newLine().length();
}
private String withNewLine(String str) {
return str + newLine();
}
private String newLine() {
return LINE_SEPARATOR;
}
private void addFirstErrorStackTrace() {
errorMessage.append(withNewLine("-------------------------The first error stack trace-----------------------"));
Exception firstError = getFirstError();
String stackTrace = Throwables.getStackTraceAsString(firstError);
errorMessage.append(withNewLine(stackTrace));
}
private Exception getFirstError() {
return inflationError.getErrors().iterator().next();
}
}
}