blob: abef653f8a1bbd758e342b510756ee021126a43d [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2012 EclipseSource Muenchen GmbH.
*
* 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:
******************************************************************************/
package org.eclipse.emf.emfstore.client.ui.errorreporting;
import java.text.MessageFormat;
import java.util.HashSet;
import java.util.Set;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.runtime.Status;
import org.eclipse.emf.emfstore.client.model.Configuration;
import org.eclipse.emf.emfstore.client.model.exceptions.MissingCommandException;
import org.eclipse.emf.emfstore.client.model.observers.ExceptionObserver;
import org.eclipse.emf.emfstore.client.model.util.WorkspaceUtil;
import org.eclipse.emf.emfstore.common.extensionpoint.ExtensionPoint;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.ui.PlatformUI;
/**
* An exception observer that collects logs.
*
* @author Maximilian Koegel
*/
public class EmfStoreExceptionObserver implements ExceptionObserver {
private static EmfStoreExceptionObserver instance;
private Set<ExceptionLog> exceptionLogs;
private Boolean enabled;
/**
* Constructor.
*/
public EmfStoreExceptionObserver() {
instance = this;
exceptionLogs = new HashSet<ExceptionLog>();
ExtensionPoint extensionPoint = new ExtensionPoint(Activator.PLUGIN_ID);
enabled = extensionPoint.getBoolean("enabled", true);
}
/**
* Returns the instance.
*
* @return the instance
*/
public static EmfStoreExceptionObserver getInstance() {
if (instance == null) {
instance = new EmfStoreExceptionObserver();
}
return instance;
}
/**
* {@inheritDoc}
*/
public boolean handleError(RuntimeException e) {
if (!enabled) {
return false;
}
if (Configuration.isDebugMode()) {
MailBugHandler bugHandler = new MailBugHandler();
try {
bugHandler.execute(new ExecutionEvent());
} catch (ExecutionException exception) {
WorkspaceUtil.handleException(exception);
}
ErrorDialog
.openError(
PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
"DEBUG MODE ACTIVE: An Error Occured",
MessageFormat
.format(
"This error message only appears if debug mode is active. \n"
+ "Although this error message might be an error itself, it might help to find bugs faster. \n"
+ "The most recent log has been copied to the clipboard, please add it to the bug report. Thanks! \n"
+ "To disable, launch without {0}={1} switch.", Configuration.DEBUG_SWITCH,
Configuration.DEBUG_SWITCH_ENABLED_VALUE), new Status(Status.ERROR,
"org.eclipse.emf.emfstore.client", "An error occured.", e));
throw e;
}
// MissingCommandException should only be logged if the debug switch is not set
if (e.getCause() instanceof MissingCommandException) {
return true;
}
for (ExceptionLog exceptionLog : exceptionLogs) {
exceptionLog.addException(e);
}
return true;
}
/**
* Adds a log.
*
* @param log
* the log being added
*/
public void addLog(ExceptionLog log) {
exceptionLogs.add(log);
}
/**
* Removes a log.
*
* @param log
* the log to be removed
*/
public void removeLog(ExceptionLog log) {
exceptionLogs.remove(log);
}
/**
* Returns the log.
*
* @return the log
*/
public ExceptionLog getLog() {
return new ExceptionLog(this);
}
}