package sk.stuba.fiit.perconik.core.debug;
import java.io.File;
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import javax.annotation.Nullable;
import org.eclipse.core.commands.Category;
import org.eclipse.core.commands.Command;
import org.eclipse.core.commands.CommandEvent;
import org.eclipse.core.commands.CommandManagerEvent;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.IParameter;
import org.eclipse.core.commands.ParameterType;
import org.eclipse.core.commands.ParameterValuesException;
import org.eclipse.core.commands.State;
import org.eclipse.core.commands.common.NotDefinedException;
import org.eclipse.core.commands.operations.IUndoableOperation;
import org.eclipse.core.commands.operations.OperationHistoryEvent;
import org.eclipse.core.filebuffers.IFileBuffer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceChangeEvent;
import org.eclipse.core.resources.IResourceDelta;
import org.eclipse.core.resources.IResourceDeltaVisitor;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.debug.core.DebugEvent;
import org.eclipse.debug.core.ILaunch;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationType;
import org.eclipse.egit.core.project.RepositoryMapping;
import org.eclipse.jdt.core.ElementChangedEvent;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaElementDelta;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.dom.CompilationUnit;
import org.eclipse.jdt.junit.model.ITestCaseElement;
import org.eclipse.jdt.junit.model.ITestElement;
import org.eclipse.jdt.junit.model.ITestRunSession;
import org.eclipse.jface.text.DocumentEvent;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IMarkSelection;
import org.eclipse.jface.text.ITextSelection;
import org.eclipse.jface.text.TextEvent;
import org.eclipse.jface.text.TextPresentation;
import org.eclipse.jface.text.contentassist.ContentAssistEvent;
import org.eclipse.jface.text.contentassist.ICompletionProposal;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jgit.events.ConfigChangedEvent;
import org.eclipse.jgit.events.IndexChangedEvent;
import org.eclipse.jgit.events.RefsChangedEvent;
import org.eclipse.jgit.events.RepositoryEvent;
import org.eclipse.jgit.events.RepositoryListener;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.lib.RepositoryState;
import org.eclipse.ltk.core.refactoring.RefactoringDescriptorProxy;
import org.eclipse.ltk.core.refactoring.history.RefactoringExecutionEvent;
import org.eclipse.ltk.core.refactoring.history.RefactoringHistoryEvent;
import org.eclipse.search.ui.ISearchQuery;
import org.eclipse.search.ui.ISearchResult;
import org.eclipse.search.ui.SearchResultEvent;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IEditorReference;
import org.eclipse.ui.IPerspectiveDescriptor;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IViewReference;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchPartReference;
import org.eclipse.ui.IWorkbenchWindow;
import sk.stuba.fiit.perconik.core.debug.plugin.Activator;
import sk.stuba.fiit.perconik.core.debug.runtime.DebugConsole;
import sk.stuba.fiit.perconik.eclipse.core.commands.operations.OperationHistoryEventType;
import sk.stuba.fiit.perconik.eclipse.core.resources.ProjectBuildKind;
import sk.stuba.fiit.perconik.eclipse.core.resources.ResourceDeltaFlag;
import sk.stuba.fiit.perconik.eclipse.core.resources.ResourceDeltaKind;
import sk.stuba.fiit.perconik.eclipse.core.resources.ResourceEventType;
import sk.stuba.fiit.perconik.eclipse.core.resources.ResourceType;
import sk.stuba.fiit.perconik.eclipse.core.runtime.StatusSeverity;
import sk.stuba.fiit.perconik.eclipse.debug.core.DebugEventDetail;
import sk.stuba.fiit.perconik.eclipse.debug.core.DebugEventKind;
import sk.stuba.fiit.perconik.eclipse.jdt.core.JavaElementDeltaFlag;
import sk.stuba.fiit.perconik.eclipse.jdt.core.JavaElementDeltaKind;
import sk.stuba.fiit.perconik.eclipse.jdt.core.JavaElementEventType;
import sk.stuba.fiit.perconik.eclipse.jdt.core.JavaElementType;
import sk.stuba.fiit.perconik.eclipse.jdt.core.dom.NodeFlag;
import sk.stuba.fiit.perconik.eclipse.jdt.core.dom.NodeType;
import sk.stuba.fiit.perconik.eclipse.ltk.core.refactoring.history.RefactoringExecutionEventType;
import sk.stuba.fiit.perconik.eclipse.ltk.core.refactoring.history.RefactoringHistoryEventType;
import sk.stuba.fiit.perconik.utilities.SmartStringBuilder;
import static java.util.Arrays.asList;
@SuppressWarnings("restriction")
public final class Debug {
private Debug() {}
private static final class ConsoleHolder {
static final DebugConsole console = DebugConsole.of(Activator.defaultInstance().getConsole());
private ConsoleHolder() {}
}
public static DebugConsole getDefaultConsole() {
return ConsoleHolder.console;
}
private static DebugConsole console() {
return getDefaultConsole();
}
public static void tab() {
console().tab();
}
public static void untab() {
console().untab();
}
public static void put(@Nullable final String message) {
console().put(message);
}
public static void put(final String format, final Object ... args) {
console().put(format, args);
}
public static void print(@Nullable final String message) {
console().print(message);
}
public static void print(final String format, final Object ... args) {
console().print(format, args);
}
public static void notice(final String message) {
console().notice(message);
}
public static void notice(final String format, final Object ... args) {
console().notice(format, args);
}
public static void warning(final String message) {
console().warning(message);
}
public static void warning(final String format, final Object ... args) {
console().warning(format, args);
}
public static void error(final String message, final Throwable failure) {
console().error(failure, message);
}
private static SmartStringBuilder builder() {
return new SmartStringBuilder().tab();
}
private static String missing() {
return builder().appendln("missing").toString();
}
public static String dumpHeader(final String title) {
SmartStringBuilder builder = new SmartStringBuilder();
builder.appendln().appendln(dumpTime()).appendln();
builder.format("%s:", title).appendln();
return builder.toString();
}
public static String dumpClass(final Class<?> type) {
String name = type.getCanonicalName();
if (name != null) {
return name;
}
return type.getName();
}
public static String dumpBlock(final Object key, @Nullable final Object value) {
SmartStringBuilder builder = builder();
return builder.append(key).appendln(':').lines(value).toString();
}
public static String dumpLine(final Object key, @Nullable final Object value) {
SmartStringBuilder builder = builder();
return builder.append(key).append(": ").appendln(value).toString();
}
public static String dumpTime() {
return dumpTime(new Date());
}
public static String dumpTime(final Date date) {
return TimeUtilities.format(date);
}
private static final class TimeUtilities {
private static final DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
static synchronized String format(final Date date) {
return formatter.format(date);
}
}
public static String dumpCategory(final Category category) throws NotDefinedException {
SmartStringBuilder builder = builder();
Class<?> type = category.getClass();
String id = category.getId();
String name = null;
String description = null;
boolean defined = category.isDefined();
if (defined) {
name = category.getName();
description = category.getDescription();
}
builder.append("class: ").appendln(type);
builder.append("identifier: ").appendln(id);
builder.append("name: ").appendln(name);
builder.append("description: ").appendln(description);
builder.append("defined: ").appendln(defined);
return builder.toString();
}
public static String dumpCommand(final Command command) throws NotDefinedException, ParameterValuesException {
SmartStringBuilder builder = builder();
Class<?> type = command.getClass();
String id = command.getId();
String name = null;
String description = null;
Category category = null;
IParameter[] parameters = null;
ParameterType returnType = null;
String[] stateIds = command.getStateIds();
boolean defined = command.isDefined();
boolean enabled = command.isEnabled();
boolean handled = command.isHandled();
if (defined) {
name = command.getName();
description = command.getDescription();
category = command.getCategory();
parameters = command.getParameters();
returnType = command.getReturnType();
}
builder.append("class: ").appendln(dumpClass(type));
builder.append("identifier: ").appendln(id);
builder.append("name: ").appendln(name);
builder.append("description: ").appendln(description);
builder.appendln("category:").lines(category == null ? missing() : dumpCategory(category));
if (parameters == null) {
parameters = new IParameter[0];
}
builder.appendln("parameters:").lines(dumpParameters(parameters));
builder.append("return type: ").appendln(returnType);
builder.appendln("states:").tab();
if (stateIds.length != 0) {
for (String stateId: stateIds) {
State state = command.getState(stateId);
builder.append(state.getId()).append(": ").appendln(state.getValue());
}
} else {
builder.appendln("none");
}
builder.untab();
builder.append("defined: ").appendln(defined);
builder.append("enabled: ").appendln(enabled);
builder.append("handled: ").appendln(handled);
return builder.toString();
}
public static String dumpCommandEvent(final CommandEvent event) throws NotDefinedException, ParameterValuesException {
SmartStringBuilder builder = builder();
Command command = event.getCommand();
boolean nameChanged = event.isNameChanged();
boolean categoryChanged = event.isCategoryChanged();
boolean descriptionChanged = event.isDescriptionChanged();
boolean definedChanged = event.isDefinedChanged();
boolean enabledChanged = event.isEnabledChanged();
boolean handledChanged = event.isHandledChanged();
boolean parametersChanged = event.isParametersChanged();
boolean returnTypeChanged = event.isReturnTypeChanged();
boolean helpContextIdChanged = event.isHelpContextIdChanged();
builder.appendln("command:").lines(dumpCommand(command));
builder.append("name changed: ").appendln(nameChanged);
builder.append("category changed: ").appendln(categoryChanged);
builder.append("description changed: ").appendln(descriptionChanged);
builder.append("defined changed: ").appendln(definedChanged);
builder.append("enabled changed: ").appendln(enabledChanged);
builder.append("handled changed: ").appendln(handledChanged);
builder.append("parameters changed: ").appendln(parametersChanged);
builder.append("return type changed: ").appendln(returnTypeChanged);
builder.append("help context identifier changed: ").appendln(helpContextIdChanged);
return builder.toString();
}
public static String dumpCommandManagerEvent(final CommandManagerEvent event) {
SmartStringBuilder builder = builder();
String commandId = event.getCommandId();
boolean commandDefined = event.isCommandDefined();
boolean commandChanged = event.isCommandChanged();
String categoryId = event.getCategoryId();
boolean categoryDefined = event.isCategoryDefined();
boolean categoryChanged = event.isCategoryChanged();
String parameterTypeId = event.getParameterTypeId();
boolean parameterTypeDefined = event.isParameterTypeDefined();
boolean parameterTypeChanged = event.isParameterTypeChanged();
builder.appendln("command:").tab();
builder.append("identifier: ").appendln(commandId);
builder.append("defined: ").appendln(commandDefined);
builder.append("changed: ").appendln(commandChanged);
builder.untab().appendln("category:").tab();
builder.append("identifier: ").appendln(categoryId);
builder.append("defined: ").appendln(categoryDefined);
builder.append("changed: ").appendln(categoryChanged);
builder.untab().appendln("parameter type:").tab();
builder.append("identifier: ").appendln(parameterTypeId);
builder.append("defined: ").appendln(parameterTypeDefined);
builder.append("changed: ").appendln(parameterTypeChanged);
return builder.toString();
}
public static String dumpCompliationUnit(final CompilationUnit unit) {
SmartStringBuilder builder = builder();
NodeType type = NodeType.valueOf(unit.getNodeType());
Set<NodeFlag> flags = NodeFlag.setOf(unit.getFlags());
int startPosition = unit.getStartPosition();
int length = unit.getLength();
builder.format("type: %s (%d)", type, type.getValue()).appendln();
builder.append("flags: ").list(flags.isEmpty() ? asList("none") : flags).appendln();
builder.append("start position: ").appendln(startPosition);
builder.append("length: ").appendln(length);
return builder.toString();
}
public static String dumpCompletionProposal(final ICompletionProposal proposal) {
SmartStringBuilder builder = builder();
String displayString = proposal.getDisplayString();
String additionalInfo = proposal.getAdditionalProposalInfo();
builder.append("display string: ").appendln(displayString);
builder.append("additional info: ").append(additionalInfo.length()).appendln(" characters");
return builder.toString();
}
public static String dumpContentAssistEvent(final ContentAssistEvent event) {
SmartStringBuilder builder = builder();
boolean autoActivated = event.isAutoActivated;
builder.append("auto activated: ").appendln(autoActivated);
return builder.toString();
}
public static String dumpDebugEvent(final DebugEvent event) {
SmartStringBuilder builder = builder();
Object data = event.getData();
Set<DebugEventKind> kinds = DebugEventKind.setOf(event.getKind());
Set<DebugEventDetail> details = DebugEventDetail.setOf(event.getDetail());
boolean evaluation = event.isEvaluation();
boolean stepStart = event.isStepStart();
builder.append("data: ").appendln(data);
builder.append("kinds: ").list(kinds.isEmpty() ? asList("none") : kinds).appendln();
builder.append("details: ").list(details.isEmpty() ? asList("none") : details).appendln();
builder.append("evaluation: ").appendln(evaluation);
builder.append("step start: ").appendln(stepStart);
return builder.toString();
}
public static String dumpDebugEvents(final DebugEvent[] events) {
SmartStringBuilder builder = builder();
if (events.length != 0) {
for (int i = 0; i < events.length; i ++) {
builder.format("event %d:", i);
builder.lines(dumpDebugEvent(events[i]));
}
} else {
builder.appendln("none");
}
return builder.toString();
}
public static String dumpDocument(final IDocument document) {
SmartStringBuilder builder = builder();
int length = document.getLength();
int lines = document.getNumberOfLines();
builder.append("length: ").appendln(length);
builder.append("lines: ").appendln(lines);
return builder.toString();
}
public static String dumpDocumentChange(final IDocument before, final IDocument after) {
SmartStringBuilder builder = builder();
builder.appendln("before:").lines(dumpDocument(before));
builder.appendln("after:").lines(dumpDocument(after));
return builder.toString();
}
public static String dumpDocumentEvent(final DocumentEvent event) {
SmartStringBuilder builder = builder();
IDocument document = event.getDocument();
int offset = event.getOffset();
int length = event.getLength();
String text = event.getText();
long modificationStamp = event.getModificationStamp();
builder.appendln("document:").lines(dumpDocument(document));
builder.append("offset: ").appendln(offset);
builder.append("length: ").appendln(length);
builder.append("text: \"").append(text).appendln("\"");
builder.append("modification stamp: ").appendln(modificationStamp < 0 ? "unknown" : modificationStamp);
return builder.toString();
}
public static String dumpEditor(final IEditorPart part) {
return dumpPart(part);
}
public static String dumpEditorReference(final IEditorReference reference) {
return dumpPartReference(reference);
}
public static String dumpExecutionEvent(final ExecutionEvent event) throws NotDefinedException, ParameterValuesException {
SmartStringBuilder builder = builder();
Command command = event.getCommand();
Map<?, ?> parameters = event.getParameters();
builder.appendln("command:").lines(dumpCommand(command));
builder.appendln("parameters:").tab();
if (!parameters.isEmpty()) {
for (Entry<?, ?> entry: parameters.entrySet()) {
builder.append(entry.getKey()).append(": ").appendln(entry.getValue());
}
} else {
builder.appendln("none");
}
return builder.toString();
}
public static String dumpFileBuffer(final IFileBuffer buffer) {
SmartStringBuilder builder = builder();
IPath location = buffer.getLocation();
IStatus status = buffer.getStatus();
long modificationStamp = buffer.getModificationStamp();
boolean commitable = buffer.isCommitable();
boolean dirty = buffer.isDirty();
boolean shared = buffer.isShared();
boolean stateValidated = buffer.isStateValidated();
boolean synchronizationContextRequested = buffer.isSynchronizationContextRequested();
boolean synchronizedWithFileSystem = buffer.isSynchronized();
builder.append("location: ").appendln(location);
if (status != null) {
builder.appendln("status:").lines(dumpStatus(status));
}
builder.append("modification stamp: ").appendln(modificationStamp < 0 ? "unknown" : modificationStamp);
builder.append("commitable: ").appendln(commitable);
builder.append("dirty: ").appendln(dirty);
builder.append("shared: ").appendln(shared);
builder.append("state validated: ").appendln(stateValidated);
builder.append("synchronization context requested: ").appendln(synchronizationContextRequested);
builder.append("synchronized with file system: ").appendln(synchronizedWithFileSystem);
return builder.toString();
}
public static String dumpGitConfigurationEvent(final ConfigChangedEvent event) {
return dumpGitRepositoryEvent(event);
}
public static String dumpGitIndexEvent(final IndexChangedEvent event) {
return dumpGitRepositoryEvent(event);
}
public static String dumpGitReferenceEvent(final RefsChangedEvent event) {
return dumpGitRepositoryEvent(event);
}
public static String dumpGitRepository(final Repository repository) {
SmartStringBuilder builder = builder();
File directory = repository.getDirectory();
File indexFile = repository.getIndexFile();
File workTree = repository.getWorkTree();
String branch = null;
String fullBranch = null;
RepositoryState state = repository.getRepositoryState();
boolean bare = repository.isBare();
try {
branch = repository.getBranch();
} catch (IOException e) {
branch = "?";
}
try {
fullBranch = repository.getFullBranch();
} catch (IOException e) {
fullBranch = "?";
}
builder.append("directory: ").appendln(directory);
builder.append("index file: ").appendln(indexFile);
builder.append("work tree: ").appendln(workTree);
builder.append("branch: ").append(branch).append(" (full ").append(fullBranch).appendln(")");
builder.appendln("state:").lines(dumpGitRepositoryState(state));
builder.append("bare: ").appendln(bare);
return builder.toString();
}
public static String dumpGitRepositoryEvent(final RepositoryEvent<?> event) {
SmartStringBuilder builder = builder();
Class<? extends RepositoryListener> type = event.getListenerType();
Repository repository = event.getRepository();
builder.append("listener type: ").appendln(dumpClass(type));
builder.appendln("repository:").lines(dumpGitRepository(repository));
return builder.toString();
}
public static String dumpGitRepositoryMapping(final RepositoryMapping mapping) {
SmartStringBuilder builder = builder();
Repository repository = mapping.getRepository();
builder.appendln("repository:").lines(dumpGitRepository(repository));
return builder.toString();
}
public static String dumpGitRepositoryState(final RepositoryState state) {
SmartStringBuilder builder = builder();
String value = state.toString();
String description = state.getDescription();
boolean amend = state.canAmend();
boolean checkout = state.canCheckout();
boolean commit = state.canCommit();
boolean resetHead = state.canResetHead();
builder.append("value: ").appendln(value);
builder.append("description: ").appendln(description);
builder.append("can amend: ").appendln(amend);
builder.append("can checkout: ").appendln(checkout);
builder.append("can commit: ").appendln(commit);
builder.append("can reset head: ").appendln(resetHead);
return builder.toString();
}
public static String dumpJavaElement(final IJavaElement element) {
SmartStringBuilder builder = builder();
JavaElementType type = JavaElementType.valueOf(element.getElementType());
String name = element.getElementName();
IPath path = element.getPath();
builder.format("type: %s (%d)", type, type.getValue()).appendln();
builder.append("name: ").appendln(name);
builder.append("path: ").appendln(path);
return builder.toString();
}
public static String dumpJavaElementChangeEvent(final ElementChangedEvent event) {
SmartStringBuilder builder = builder();
JavaElementEventType type = JavaElementEventType.valueOf(event.getType());
IJavaElementDelta delta = event.getDelta();
builder.format("type: %s (%d)", type, type.getValue()).appendln();
builder.appendln("delta:").lines(delta == null ? missing() : dumpJavaElementDelta(delta));
return builder.toString();
}
public static String dumpJavaElementDelta(final IJavaElementDelta delta) {
SmartStringBuilder builder = builder();
JavaElementDeltaKind kind = JavaElementDeltaKind.valueOf(delta.getKind());
Set<JavaElementDeltaFlag> flags = JavaElementDeltaFlag.setOf(delta.getFlags());
CompilationUnit unit = delta.getCompilationUnitAST();
IJavaElement element = delta.getElement();
builder.append("kind: ").appendln(kind);
builder.append("flags: ").list(flags.isEmpty() ? asList("none") : flags).appendln();
builder.appendln("unit:").lines(unit == null ? missing() : dumpCompliationUnit(unit));
builder.appendln("element:").lines(element == null ? missing() : dumpJavaElement(element));
return builder.toString();
}
public static String dumpJavaProject(final IJavaProject project) {
SmartStringBuilder builder = builder();
String name = project.getElementName();
IPath path = project.getPath();
builder.append("name: ").appendln(name);
builder.append("path: ").appendln(path);
return builder.toString();
}
public static String dumpLaunch(final ILaunch launch) throws CoreException {
SmartStringBuilder builder = builder();
ILaunchConfiguration configuration = launch.getLaunchConfiguration();
String mode = launch.getLaunchMode();
builder.append("mode: ").appendln(mode);
builder.appendln("configuration:").lines(dumpLaunchConfiguration(configuration));
return builder.toString();
}
public static String dumpLaunches(final ILaunch[] launches) throws CoreException {
SmartStringBuilder builder = builder();
if (launches.length != 0) {
for (int i = 0; i < launches.length; i ++) {
builder.format("launch %d:", i);
builder.lines(dumpLaunch(launches[i]));
}
} else {
builder.appendln("none");
}
return builder.toString();
}
public static String dumpLaunchConfiguration(final ILaunchConfiguration configuration) throws CoreException {
SmartStringBuilder builder = builder();
ILaunchConfigurationType type = configuration.getType();
IFile file = configuration.getFile();
String name = configuration.getName();
String category = configuration.getCategory();
Set<String> modes = configuration.getModes();
Map<String, Object> attributes = configuration.getAttributes();
builder.append("name: ").appendln(name);
builder.append("category: ").appendln(category);
builder.appendln("type:").lines(dumpLaunchConfigurationType(type));
builder.append("modes: ").list(modes.isEmpty() ? asList("none") : modes).appendln();
if (file != null) {
builder.append("full path: ").appendln(file.getFullPath());
builder.append("location: ").appendln(file.getLocation());
}
builder.appendln("attributes:").tab();
if (!attributes.isEmpty()) {
for (Entry<String, Object> entry: attributes.entrySet()) {
builder.append(entry.getKey()).append(": ").appendln(entry.getValue());
}
} else {
builder.appendln("none");
}
return builder.toString();
}
public static String dumpLaunchConfigurationType(final ILaunchConfigurationType type) {
SmartStringBuilder builder = builder();
String name = type.getName();
String category = type.getCategory();
String identifier = type.getIdentifier();
String pluginIdentifier = type.getPluginIdentifier();
String contributorName = type.getContributorName();
builder.append("name: ").appendln(name);
builder.append("category: ").appendln(category);
builder.append("identifier: ").appendln(identifier);
builder.append("plugin identifier: ").appendln(pluginIdentifier);
builder.append("contributor name: ").appendln(contributorName);
return builder.toString();
}
public static String dumpMarkSelection(final IMarkSelection selection) {
SmartStringBuilder builder = builder();
boolean empty = selection.isEmpty();
int offset = selection.getOffset();
int length = selection.getLength();
builder.appendln("category: mark");
builder.append("empty: ").appendln(empty);
builder.append("offset: ").appendln(offset);
builder.append("length: ").appendln(length);
return builder.toString();
}
public static String dumpOperationHistoryEvent(final OperationHistoryEvent event) {
SmartStringBuilder builder = builder();
IUndoableOperation operation = event.getOperation();
IStatus status = event.getStatus();
OperationHistoryEventType type = OperationHistoryEventType.valueOf(event.getEventType());
builder.format("type: %s (%d)", type, type.getValue()).appendln();
builder.appendln("operation:").lines(dumpUndoableOperation(operation));
if (status != null) {
builder.appendln("status:").lines(dumpStatus(status));
}
return builder.toString();
}
public static String dumpPage(final IWorkbenchPage page) {
SmartStringBuilder builder = builder();
Class<?> type = page.getClass();
String label = page.getLabel();
builder.append("class: ").appendln(dumpClass(type));
builder.append("label: ").appendln(label);
return builder.toString();
}
public static String dumpParameter(final IParameter parameter) throws ParameterValuesException {
SmartStringBuilder builder = builder();
String id = parameter.getId();
String name = parameter.getName();
boolean optional = parameter.isOptional();
Map<?, ?> values = parameter.getValues().getParameterValues();
builder.append("identifier: ").appendln(id);
builder.append("name: ").appendln(name);
builder.append("optional: ").appendln(optional);
builder.appendln("values:").tab();
if (!values.isEmpty()) {
for (Entry<?, ?> entry: values.entrySet()) {
builder.append(entry.getKey()).append(": ").appendln(entry.getValue());
}
} else {
builder.appendln("none");
}
return builder.toString();
}
public static String dumpParameters(final IParameter[] parameters) throws ParameterValuesException {
SmartStringBuilder builder = builder();
if (parameters.length != 0) {
for (int i = 0; i < parameters.length; i ++) {
builder.format("parameter %d:", i);
builder.lines(dumpParameter(parameters[i]));
}
} else {
builder.appendln("none");
}
return builder.toString();
}
public static String dumpPart(final IWorkbenchPart part) {
SmartStringBuilder builder = builder();
Class<?> type = part.getClass();
String title = part.getTitle();
String tooltip = part.getTitleToolTip();
builder.append("class: ").appendln(dumpClass(type));
builder.append("title: ").appendln(title);
builder.append("tooltip: ").appendln(tooltip);
return builder.toString();
}
public static String dumpPartReference(final IWorkbenchPartReference reference) {
SmartStringBuilder builder = builder();
Class<?> type = reference.getClass();
String id = reference.getId();
String name = reference.getPartName();
String title = reference.getTitle();
String tooltip = reference.getTitleToolTip();
boolean dirty = reference.isDirty();
builder.append("class: ").appendln(dumpClass(type));
builder.append("identifier: ").appendln(id);
builder.append("name: ").appendln(name);
builder.append("title: ").appendln(title);
builder.append("tooltip: ").appendln(tooltip);
builder.append("dirty: ").appendln(dirty);
return builder.toString();
}
public static String dumpPerspectiveDescriptor(final IPerspectiveDescriptor descriptor) {
SmartStringBuilder builder = builder();
Class<?> type = descriptor.getClass();
String id = descriptor.getId();
String label = descriptor.getLabel();
String description = descriptor.getDescription();
builder.append("class: ").appendln(dumpClass(type));
builder.append("identifier: ").appendln(id);
builder.append("label: ").appendln(label);
builder.append("description: ").appendln(description);
return builder.toString();
}
public static String dumpRefactoringDescriptorProxy(final RefactoringDescriptorProxy proxy) {
SmartStringBuilder builder = builder();
String project = proxy.getProject();
String description = proxy.getDescription();
long timestamp = proxy.getTimeStamp();
builder.append("project: ").appendln(project);
builder.append("description: ").appendln(description);
builder.append("timestamp: ").appendln(timestamp);
return builder.toString();
}
public static String dumpRefactoringExecutionEvent(final RefactoringExecutionEvent event) {
SmartStringBuilder builder = builder();
RefactoringExecutionEventType type = RefactoringExecutionEventType.valueOf(event.getEventType());
RefactoringDescriptorProxy descriptor = event.getDescriptor();
builder.format("type: %s (%d)", type, type.getValue()).appendln();
builder.appendln("descriptor:").lines(dumpRefactoringDescriptorProxy(descriptor));
return builder.toString();
}
public static String dumpRefactoringHistoryEvent(final RefactoringHistoryEvent event) {
SmartStringBuilder builder = builder();
RefactoringHistoryEventType type = RefactoringHistoryEventType.valueOf(event.getEventType());
RefactoringDescriptorProxy descriptor = event.getDescriptor();
builder.format("type: %s (%d)", type, type.getValue()).appendln();
builder.appendln("descriptor:").lines(dumpRefactoringDescriptorProxy(descriptor));
return builder.toString();
}
public static String dumpResource(final IResource resource) {
SmartStringBuilder builder = builder();
ResourceType type = ResourceType.valueOf(resource.getType());
String name = resource.getName();
IPath location = resource.getLocation();
long localStamp = resource.getLocalTimeStamp();
long modificationStamp = resource.getModificationStamp();
builder.format("type: %s (%d)", type, type.getValue()).appendln();
builder.append("name: ").appendln(name);
builder.append("location: ").appendln(location);
builder.append("local stamp: ").appendln(localStamp < 0 ? "unknown" : localStamp);
builder.append("modification stamp: ").appendln(modificationStamp < 0 ? "unknown" : modificationStamp);
return builder.toString();
}
public static String dumpResourceChangeEvent(final IResourceChangeEvent event) {
final SmartStringBuilder builder = builder();
ResourceEventType type = ResourceEventType.valueOf(event.getType());
int buildKind = event.getBuildKind();
IResource resource = event.getResource();
IResourceDelta delta = event.getDelta();
builder.format("type: %s (%d)", type, type.getValue()).appendln();
builder.append("build kind: ").appendln(buildKind == 0 ? "not applicable" : ProjectBuildKind.valueOf(buildKind));
builder.appendln("resource:").lines(resource == null ? missing() : dumpResource(resource));
if (delta == null) {
builder.appendln("delta: ").lines(missing());
} else {
IResourceDeltaVisitor visitor = new IResourceDeltaVisitor() {
public boolean visit(final IResourceDelta delta) {
builder.appendln("delta:").lines(dumpResourceDelta(delta));
return true;
}
};
builder.appendln("delta tree:").tab();
try {
delta.accept(visitor);
} catch (CoreException e) {
builder.appendln("failed");
}
builder.untab();
}
return builder.toString();
}
public static String dumpResourceDelta(final IResourceDelta delta) {
SmartStringBuilder builder = builder();
ResourceDeltaKind kind = ResourceDeltaKind.valueOf(delta.getKind());
Set<ResourceDeltaFlag> flags = ResourceDeltaFlag.setOf(delta.getFlags());
IResource resource = delta.getResource();
builder.append("kind: ").appendln(kind);
builder.append("flags: ").list(flags.isEmpty() ? asList("none") : flags).appendln();
builder.appendln("resource:").lines(dumpResource(resource));
return builder.toString();
}
public static String dumpSearchQuery(final ISearchQuery query) {
SmartStringBuilder builder = builder();
Class<?> type = query.getClass();
String label = query.getLabel();
ISearchResult result = query.getSearchResult();
boolean runInBackground = query.canRunInBackground();
boolean rerun = query.canRerun();
builder.append("class: ").appendln(dumpClass(type));
builder.append("label: ").appendln(label);
builder.appendln("result: ").lines(dumpSearchResult(result));
builder.append("can run in background: ").appendln(runInBackground);
builder.append("can rerun: ").appendln(rerun);
return builder.toString();
}
public static String dumpSearchResult(final ISearchResult result) {
SmartStringBuilder builder = builder();
String label = result.getLabel();
String tooltip = result.getTooltip();
builder.append("label: ").appendln(label);
builder.append("tooltip: ").appendln(tooltip);
return builder.toString();
}
public static String dumpSearchResultEvent(final SearchResultEvent event) {
SmartStringBuilder builder = builder();
Class<?> type = event.getClass();
ISearchResult result = event.getSearchResult();
builder.append("class: ").appendln(dumpClass(type));
builder.appendln("result: ").lines(dumpSearchResult(result));
return builder.toString();
}
public static String dumpSelection(final ISelection selection) {
if (selection instanceof IMarkSelection) {
return dumpMarkSelection((IMarkSelection) selection);
} else if (selection instanceof IStructuredSelection) {
return dumpStructuredSelection((IStructuredSelection) selection);
} else if (selection instanceof ITextSelection) {
return dumpTextSelection((ITextSelection) selection);
} else {
SmartStringBuilder builder = builder();
Class<?> type = selection.getClass();
boolean empty = selection.isEmpty();
builder.append("class: ").appendln(dumpClass(type));
builder.append("empty: ").appendln(empty);
return builder.toString();
}
}
public static String dumpStatus(final IStatus status) {
SmartStringBuilder builder = builder();
int code = status.getCode();
Set<StatusSeverity> severity = StatusSeverity.setOf(status.getSeverity());
String plugin = status.getPlugin();
String message = status.getMessage();
boolean ok = status.isOK();
boolean multi = status.isMultiStatus();
Throwable throwable = status.getException();
builder.append("code: ").appendln(code);
builder.append("severity: ").list(severity.isEmpty() ? asList("unknown") : severity).appendln();
builder.append("plugin: ").appendln(plugin);
builder.append("message: ").appendln(message);
builder.append("ok: ").appendln(ok);
builder.append("multi: ").appendln(multi);
if (throwable != null) {
builder.appendln("exception:").lines(dumpThrowable(throwable));
}
return builder.toString();
}
public static String dumpStructuredSelection(final IStructuredSelection selection) {
SmartStringBuilder builder = builder();
boolean empty = selection.isEmpty();
int size = selection.size();
builder.appendln("category: structured");
builder.append("empty: ").appendln(empty);
builder.append("size: ").appendln(size);
return builder.toString();
}
public static String dumpTestCaseElement(final ITestCaseElement element) {
SmartStringBuilder builder = builder();
ITestRunSession session = element.getTestRunSession();
String className = element.getTestClassName();
String methodName = element.getTestMethodName();
double elapsedTime = element.getElapsedTimeInSeconds();
ITestElement.ProgressState progressState = element.getProgressState();
ITestElement.Result resultExcludingChildren = element.getTestResult(false);
ITestElement.Result resultIncludingChildren = element.getTestResult(true);
builder.appendln("session:").lines(dumpTestRunSession(session));
builder.append("class name: ").appendln(className);
builder.append("method name: ").appendln(methodName);
builder.append("elapsed time: ").append(elapsedTime).appendln(" (in seconds)");
builder.append("progress state: ").appendln(progressState);
builder.append("result excluding children: ").appendln(resultExcludingChildren);
builder.append("result including children: ").appendln(resultIncludingChildren);
return builder.toString();
}
public static String dumpTestRunSession(final ITestRunSession session) {
SmartStringBuilder builder = builder();
IJavaProject project = session.getLaunchedProject();
String name = session.getTestRunName();
double elapsedTime = session.getElapsedTimeInSeconds();
ITestElement.ProgressState progressState = session.getProgressState();
ITestElement.Result resultExcludingChildren = session.getTestResult(false);
ITestElement.Result resultIncludingChildren = session.getTestResult(true);
ITestElement[] children = session.getChildren();
builder.append("run name: ").appendln(name);
builder.appendln("project:").lines(dumpJavaProject(project));
builder.append("elapsed time: ").append(elapsedTime).appendln(" (in seconds)");
builder.append("progress state: ").appendln(progressState);
builder.append("result excluding children: ").appendln(resultExcludingChildren);
builder.append("result including children: ").appendln(resultIncludingChildren);
builder.append("children: ").appendln(children.length);
return builder.toString();
}
public static String dumpTextEvent(final TextEvent event) {
SmartStringBuilder builder = builder();
int offset = event.getOffset();
int length = event.getLength();
String text = event.getText();
String replacedText = event.getReplacedText();
boolean viewerRedrawState = event.getViewerRedrawState();
DocumentEvent documentEvent = event.getDocumentEvent();
builder.append("offset: ").appendln(offset);
builder.append("length: ").appendln(length);
builder.append("text: \"").append(text).appendln("\"");
builder.append("replaced text: \"").append(replacedText).appendln("\"");
builder.append("viewer redraw state: ").appendln(viewerRedrawState);
if (documentEvent != null) {
builder.appendln("document event:").lines(dumpDocumentEvent(documentEvent));
}
return builder.toString();
}
public static String dumpTextPresentation(final TextPresentation presentation) {
SmartStringBuilder builder = builder();
boolean empty = presentation.isEmpty();
builder.append("empty: ").appendln(empty);
return builder.toString();
}
public static String dumpTextSelection(final ITextSelection selection) {
SmartStringBuilder builder = builder();
boolean empty = selection.isEmpty();
int start = selection.getStartLine();
int end = selection.getEndLine();
int offset = selection.getOffset();
int length = selection.getLength();
String text = selection.getText();
builder.appendln("category: text");
builder.append("empty: ").appendln(empty);
builder.append("start line: ").appendln(start);
builder.append("end line: ").appendln(end);
builder.append("offset: ").appendln(offset);
builder.append("length: ").appendln(length);
builder.append("text: \"").append(text).appendln("\"");
return builder.toString();
}
public static String dumpThrowable(final Throwable throwable) {
SmartStringBuilder builder = builder();
Class<?> type = throwable.getClass();
String message = throwable.getMessage();
builder.append("class: ").appendln(dumpClass(type));
builder.append("message: ").appendln(message);
return builder.toString();
}
public static String dumpUndoableOperation(final IUndoableOperation operation) {
SmartStringBuilder builder = builder();
String label = operation.getLabel();
boolean execute = operation.canExecute();
boolean redo = operation.canRedo();
boolean undo = operation.canUndo();
builder.append("label: ").appendln(label);
builder.append("can execute: ").appendln(execute);
builder.append("can redo: ").appendln(redo);
builder.append("can undo: ").appendln(undo);
return builder.toString();
}
public static String dumpView(final IViewPart part) {
return dumpPart(part);
}
public static String dumpViewReference(final IViewReference reference) {
return dumpPartReference(reference);
}
public static String dumpWindow(final IWorkbenchWindow window) {
SmartStringBuilder builder = builder();
Class<?> type = window.getClass();
int pagesCount = window.getPages().length;
IWorkbenchPage activePage = window.getActivePage();
builder.append("class: ").appendln(dumpClass(type));
builder.append("pages: ").appendln(pagesCount);
builder.appendln("active page:").lines(dumpPage(activePage));
return builder.toString();
}
public static String dumpWorkbench(final IWorkbench workbench) {
SmartStringBuilder builder = builder();
Class<?> type = workbench.getClass();
int windowCount = workbench.getWorkbenchWindowCount();
boolean starting = workbench.isStarting();
boolean closing = workbench.isClosing();
builder.append("class: ").appendln(dumpClass(type));
builder.append("windows: ").appendln(windowCount);
builder.append("starting: ").appendln(starting);
builder.append("closing: ").appendln(closing);
return builder.toString();
}
}