/** * Copyright (c) 2009-2011, The HATS Consortium. All rights reserved. * This file is licensed under the terms of the Modified BSD License. */ package org.absmodels.abs.plugin.actions; import static org.absmodels.abs.plugin.actions.ActionUtils.showErrorMessage; import static org.absmodels.abs.plugin.util.Constants.MAUDE_ERROR; import static org.absmodels.abs.plugin.util.Constants.MAUDE_ERROR_MAUDE; import static org.absmodels.abs.plugin.util.Constants.MAUDE_ERROR_MAUDE_PATH; import static org.absmodels.abs.plugin.util.Constants.MAUDE_INFO; import static org.absmodels.abs.plugin.util.Constants.MAUDE_OK; import static org.absmodels.abs.plugin.util.Constants.MAUDE_USER_ABORT; import static org.absmodels.abs.plugin.util.Constants.MAUDE_WARNING; import static org.absmodels.abs.plugin.util.UtilityFunctions.getAbsNature; import static org.absmodels.abs.plugin.util.UtilityFunctions.showErrorMessage; import org.absmodels.abs.plugin.console.MsgConsole; import org.absmodels.abs.plugin.console.ConsoleManager.MessageType; import org.absmodels.abs.plugin.exceptions.ParseException; import org.absmodels.abs.plugin.exceptions.TypeCheckerException; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.jobs.IJobChangeEvent; import org.eclipse.core.runtime.jobs.IJobChangeListener; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.dialogs.PreferencesUtil; public class MaudeJobChangeListener implements IJobChangeListener{ IProject project; MsgConsole console; public MaudeJobChangeListener(IProject project){ this.project = project; } @Override public void sleeping(IJobChangeEvent event) {} @Override public void scheduled(IJobChangeEvent event) {} @Override public void running(IJobChangeEvent event) {} @Override public void done(IJobChangeEvent event) { //When the Job is done get the IStatus and print messages on console final IStatus status = event.getResult(); switch(status.getCode()){ case MAUDE_OK: break; //Indicates a successful Job without Maude execution case MAUDE_INFO: //Execution of Maude was successful initializeConsole(); console.println(status.getMessage(), MessageType.MESSAGE_INFO); break; case MAUDE_WARNING: //This message type is not used initializeConsole(); console.println(status.getMessage(), MessageType.MESSAGE_WARNING); break; case MAUDE_ERROR_MAUDE: //Maude encountered an error during execution initializeConsole(); console.println(status.getMessage(), MessageType.MESSAGE_ERROR); break; case MAUDE_ERROR_MAUDE_PATH: //missconfigured Maude path Display.getDefault().asyncExec(new Runnable() { @Override public void run() { showErrorMessage("Encountered IOException while executing Maude (probably misconfigured location of maude executable): " + status.getMessage()); PreferencesUtil.createPreferenceDialogOn(Display.getDefault().getActiveShell(), "org.abs-models.abs.plugin.preferences.ABSMaudePreferences", null, null).open(); } }); break; case MAUDE_ERROR: //encountered an exception during execution Display.getDefault().asyncExec(new Runnable() { @Override public void run() { if(status.getException() instanceof ParseException || status.getException() instanceof TypeCheckerException){ showErrorMessage(status.getMessage(), status); } else{ showErrorMessage(status.getMessage()); } } }); break; case MAUDE_USER_ABORT: initializeConsole(); console.println("Aborted Maude Job.", MessageType.MESSAGE_ERROR); break; default: //This should never happen... just in case... showErrorMessage("reached an unspecified status"); } } private void initializeConsole() { console = getAbsNature(project).getMaudeConsole(); console.clearConsole(); } @Override public void awake(IJobChangeEvent event) {} @Override public void aboutToRun(IJobChangeEvent event) {} }