Browse Source

Added exception handling for dynamic operation invocation during simulation

Flow.Antony@gmail.com 12 years ago
parent
commit
b48a34485d

+ 2 - 2
plugins/org.yakindu.sct.simulation.core/src/org/yakindu/sct/simulation/core/debugmodel/SCTDebugTarget.java

@@ -122,10 +122,10 @@ public class SCTDebugTarget extends SCTDebugElement implements IDebugTarget,
 		if (isCycleBased) {
 			long cyclePeriod = launch.getLaunchConfiguration().getAttribute(
 					CYCLE_PERIOD, DEFAULT_CYCLE_PERIOD);
-			controller = new CycleBasedExecutionFacadeController(facade,
+			controller = new CycleBasedExecutionFacadeController(this,
 					cyclePeriod);
 		} else {
-			controller = new EventDrivenExecutionFacadeController(facade);
+			controller = new EventDrivenExecutionFacadeController(this);
 		}
 		controller.start();
 	}

+ 34 - 4
plugins/org.yakindu.sct.simulation.core/src/org/yakindu/sct/simulation/core/runtime/impl/AbstractExecutionFacadeController.java

@@ -11,6 +11,13 @@
 
 package org.yakindu.sct.simulation.core.runtime.impl;
 
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.debug.core.DebugPlugin;
+import org.eclipse.debug.core.IStatusHandler;
+import org.eclipse.emf.common.util.WrappedException;
+import org.yakindu.sct.simulation.core.Activator;
+import org.yakindu.sct.simulation.core.debugmodel.SCTDebugTarget;
 import org.yakindu.sct.simulation.core.runtime.IExecutionFacade;
 import org.yakindu.sct.simulation.core.runtime.IExecutionFacadeController;
 
@@ -23,13 +30,36 @@ import org.yakindu.sct.simulation.core.runtime.IExecutionFacadeController;
 public abstract class AbstractExecutionFacadeController implements
 		IExecutionFacadeController {
 
+	public static final int ERROR_DURING_SIMULATION = 765;
+
 	protected final IExecutionFacade facade;
 
 	protected boolean terminated = false;
 	protected boolean suspended = false;
 
-	public AbstractExecutionFacadeController(IExecutionFacade facade) {
-		this.facade = facade;
+	private SCTDebugTarget target;
+
+	public AbstractExecutionFacadeController(SCTDebugTarget target) {
+		this.target = target;
+		this.facade = (IExecutionFacade) target
+				.getAdapter(IExecutionFacade.class);
+	}
+
+	protected void runCycle() {
+		try {
+			facade.runCycle();
+		} catch (WrappedException ex) {
+			Status errorStatus = new Status(Status.ERROR, Activator.PLUGIN_ID,
+					ERROR_DURING_SIMULATION, ex.getCause().getMessage(),
+					ex.getCause());
+			IStatusHandler statusHandler = DebugPlugin.getDefault()
+					.getStatusHandler(errorStatus);
+			try {
+				statusHandler.handleStatus(errorStatus, target);
+			} catch (CoreException e) {
+				e.printStackTrace();
+			}
+		}
 	}
 
 	public void start() {
@@ -48,9 +78,9 @@ public abstract class AbstractExecutionFacadeController implements
 		terminated = true;
 		facade.tearDown();
 	}
-	
+
 	public void step() {
-		facade.runCycle();		
+		facade.runCycle();
 	}
 
 }

+ 6 - 5
plugins/org.yakindu.sct.simulation.core/src/org/yakindu/sct/simulation/core/runtime/impl/CycleBasedExecutionFacadeController.java

@@ -13,6 +13,7 @@ package org.yakindu.sct.simulation.core.runtime.impl;
 import java.util.Timer;
 import java.util.TimerTask;
 
+import org.yakindu.sct.simulation.core.debugmodel.SCTDebugTarget;
 import org.yakindu.sct.simulation.core.runtime.IExecutionFacade;
 import org.yakindu.sct.simulation.core.runtime.IExecutionFacadeController;
 
@@ -32,9 +33,9 @@ public class CycleBasedExecutionFacadeController extends
 
 	private long cyclePeriod;
 
-	public CycleBasedExecutionFacadeController(IExecutionFacade facade,
+	public CycleBasedExecutionFacadeController(SCTDebugTarget target,
 			long cyclePeriod) {
-		super(facade);
+		super(target);
 		this.cyclePeriod = cyclePeriod;
 		timer = new Timer();
 	}
@@ -43,8 +44,8 @@ public class CycleBasedExecutionFacadeController extends
 		if (!terminated && !suspended) {
 			TimerTask virtualTimerTask = new TimerTask() {
 				public void run() {
-					facade.runCycle();
-					scheduleCycle();
+						runCycle();
+						scheduleCycle();
 				}
 			};
 			timer.schedule(virtualTimerTask, cyclePeriod);
@@ -55,7 +56,7 @@ public class CycleBasedExecutionFacadeController extends
 		super.start();
 		scheduleCycle();
 	}
-	
+
 	public void resume() {
 		super.resume();
 		scheduleCycle();

+ 4 - 4
plugins/org.yakindu.sct.simulation.core/src/org/yakindu/sct/simulation/core/runtime/impl/EventDrivenExecutionFacadeController.java

@@ -11,8 +11,8 @@
 
 package org.yakindu.sct.simulation.core.runtime.impl;
 
+import org.yakindu.sct.simulation.core.debugmodel.SCTDebugTarget;
 import org.yakindu.sct.simulation.core.runtime.IExecutionContext;
-import org.yakindu.sct.simulation.core.runtime.IExecutionFacade;
 import org.yakindu.sct.simulation.core.runtime.IExecutionFacadeController;
 
 /**
@@ -26,8 +26,8 @@ public class EventDrivenExecutionFacadeController extends
 
 	private Thread cycleRunner;
 
-	public EventDrivenExecutionFacadeController(IExecutionFacade facade) {
-		super(facade);
+	public EventDrivenExecutionFacadeController(SCTDebugTarget target) {
+		super(target);
 	}
 
 	public void start() {
@@ -56,7 +56,7 @@ public class EventDrivenExecutionFacadeController extends
 				IExecutionContext context = facade.getExecutionContext();
 				if (context.getRaisedEvents().size() > 0
 						|| context.getScheduledEvents().size() > 0) {
-					facade.runCycle();
+					runCycle();
 				}
 			}
 		}

+ 9 - 0
plugins/org.yakindu.sct.simulation.ui/plugin.xml

@@ -72,6 +72,15 @@
           plugin="org.yakindu.sct.simulation.core">
     </statusHandler>
  </extension>
+  <extension
+       point="org.eclipse.debug.core.statusHandlers">
+    <statusHandler
+          class="org.yakindu.sct.simulation.ui.handler.TerminateLaunchStatusHandler"
+          code="765"
+          id="org.yakindu.sct.simulation.ui.statushandler"
+          plugin="org.yakindu.sct.simulation.core">
+    </statusHandler>
+ </extension>
  
  <!-- Source Display Adapter factory -->
  <extension

+ 1 - 1
plugins/org.yakindu.sct.simulation.ui/src/org/yakindu/sct/simulation/ui/dialogs/HotModelReplacementListener.java

@@ -43,7 +43,7 @@ public class HotModelReplacementListener implements
 					if (display.isDisposed()) {
 						return;
 					}
-					HotModelReplaceErrorDialog dialog = new HotModelReplaceErrorDialog(
+					SimulationLaunchErrorDialog dialog = new SimulationLaunchErrorDialog(
 							DebugUIPlugin.getShell(), title, MESSAGE, status,
 							targets);
 					dialog.setBlockOnOpen(false);

+ 7 - 2
plugins/org.yakindu.sct.simulation.ui/src/org/yakindu/sct/simulation/ui/dialogs/HotModelReplaceErrorDialog.java

@@ -28,13 +28,13 @@ import org.yakindu.sct.simulation.core.debugmodel.SCTDebugTarget;
  * @author andreas muelder - Initial contribution and API
  * 
  */
-public class HotModelReplaceErrorDialog extends ErrorDialog {
+public class SimulationLaunchErrorDialog extends ErrorDialog {
 
 	protected List<SCTDebugTarget> targets;
 
 	private static final int RELAUNCH_ID = 42;
 
-	public HotModelReplaceErrorDialog(Shell parentShell, String dialogTitle,
+	public SimulationLaunchErrorDialog(Shell parentShell, String dialogTitle,
 			String message, IStatus status, List<SCTDebugTarget> target) {
 		super(parentShell, dialogTitle, message, status, IStatus.WARNING
 				| IStatus.ERROR | IStatus.INFO);
@@ -47,6 +47,11 @@ public class HotModelReplaceErrorDialog extends ErrorDialog {
 		createButton(parent, RELAUNCH_ID, "Relaunch", false);
 	}
 
+	@Override
+	protected void createDetailsButton(Composite parent) {
+		// No Detail section required
+	}
+
 	protected Button createButton(Composite parent, int id, String label,
 			boolean defaultButton) {
 		Button button = super.createButton(parent, id, label, defaultButton);

+ 47 - 0
plugins/org.yakindu.sct.simulation.ui/src/org/yakindu/sct/simulation/ui/handler/TerminateLaunchStatusHandler.java

@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2013 committers of YAKINDU and others.
+ * 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:
+ * 	committers of YAKINDU - initial API and implementation
+ * 
+ */
+
+package org.yakindu.sct.simulation.ui.handler;
+
+import java.util.Collections;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.debug.core.IStatusHandler;
+import org.eclipse.debug.internal.ui.DebugUIPlugin;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.yakindu.sct.simulation.core.debugmodel.SCTDebugTarget;
+import org.yakindu.sct.simulation.ui.dialogs.SimulationLaunchErrorDialog;
+
+/**
+ * 
+ * @author andreas muelder - Initial contribution and API
+ * @author florian antony
+ * 
+ */
+@SuppressWarnings("restriction")
+public class TerminateLaunchStatusHandler implements IStatusHandler {
+
+	public Object handleStatus(final IStatus status, final Object source) {
+		final Throwable cause = status.getException();
+		Display.getDefault().asyncExec(new Runnable() {
+			public void run() {
+				Shell shell = DebugUIPlugin.getShell();
+				SimulationLaunchErrorDialog dialog = new SimulationLaunchErrorDialog(
+						shell, "Exception occured during simulation", cause.toString(), status,
+						Collections.singletonList((SCTDebugTarget) source));
+				dialog.setBlockOnOpen(false);
+				dialog.open();
+			}
+		});
+		return null;
+	}
+}