From b388a8a3dd864549d7abb4c957de2f9a9f92b099 Mon Sep 17 00:00:00 2001 From: Didier Vojtisek Date: Fri, 13 Mar 2020 14:15:52 +0100 Subject: [PATCH] use the new CompositeDynamicPartAccessor contributes to https://github.com/eclipse/gemoc-studio-modeldebugging/issues/155 by adding a CompositeDynamicPartAccessor that allows to combine several IDynamicPartAccessor/IMutableFieldExtractor so they can provide an unified vision of the RTD to both the Variable view (ie.debugger) and the timeline (ie. generic trace manager) Signed-off-by: Didier Vojtisek --- .../javaengine/ui/launcher/Launcher.java | 88 +++++++++++++++++++ 1 file changed, 88 insertions(+) diff --git a/java_engine/plugins/org.eclipse.gemoc.execution.sequential.javaengine.ui/src/org/eclipse/gemoc/execution/sequential/javaengine/ui/launcher/Launcher.java b/java_engine/plugins/org.eclipse.gemoc.execution.sequential.javaengine.ui/src/org/eclipse/gemoc/execution/sequential/javaengine/ui/launcher/Launcher.java index 5043d1e..9df7ba2 100644 --- a/java_engine/plugins/org.eclipse.gemoc.execution.sequential.javaengine.ui/src/org/eclipse/gemoc/execution/sequential/javaengine/ui/launcher/Launcher.java +++ b/java_engine/plugins/org.eclipse.gemoc.execution.sequential.javaengine.ui/src/org/eclipse/gemoc/execution/sequential/javaengine/ui/launcher/Launcher.java @@ -10,21 +10,45 @@ *******************************************************************************/ package org.eclipse.gemoc.execution.sequential.javaengine.ui.launcher; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Set; +import java.util.function.BiPredicate; + import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.debug.core.ILaunchConfiguration; import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; import org.eclipse.emf.ecore.EObject; import org.eclipse.gemoc.commons.eclipse.messagingsystem.api.MessagingSystem; import org.eclipse.gemoc.commons.eclipse.ui.ViewHelper; +import org.eclipse.gemoc.dsl.debug.ide.IDSLDebugger; +import org.eclipse.gemoc.dsl.debug.ide.event.DSLDebugEventDispatcher; import org.eclipse.gemoc.execution.sequential.javaengine.PlainK3ExecutionEngine; import org.eclipse.gemoc.execution.sequential.javaengine.ui.Activator; +import org.eclipse.gemoc.executionframework.debugger.AbstractGemocDebugger; +import org.eclipse.gemoc.executionframework.debugger.AnnotationMutableFieldExtractor; +import org.eclipse.gemoc.executionframework.debugger.CompositeDynamicPartAccessor; +import org.eclipse.gemoc.executionframework.debugger.DefaultDynamicPartAccessor; +import org.eclipse.gemoc.executionframework.debugger.GenericSequentialModelDebugger; +import org.eclipse.gemoc.executionframework.debugger.IDynamicPartAccessor; +import org.eclipse.gemoc.executionframework.debugger.IMutableFieldExtractor; +import org.eclipse.gemoc.executionframework.debugger.IntrospectiveMutableFieldExtractor; +import org.eclipse.gemoc.executionframework.debugger.K3AspectDynamicPartAccessor; +import org.eclipse.gemoc.executionframework.debugger.OmniscientGenericSequentialModelDebugger; import org.eclipse.gemoc.executionframework.engine.commons.EngineContextException; import org.eclipse.gemoc.executionframework.engine.commons.GenericModelExecutionContext; import org.eclipse.gemoc.executionframework.engine.commons.sequential.ISequentialRunConfiguration; import org.eclipse.gemoc.executionframework.engine.commons.sequential.SequentialRunConfiguration; +import org.eclipse.gemoc.executionframework.engine.core.RunConfiguration; import org.eclipse.gemoc.executionframework.engine.ui.launcher.AbstractSequentialGemocLauncher; import org.eclipse.gemoc.executionframework.ui.views.engine.EnginesStatusView; +import org.eclipse.gemoc.trace.commons.model.trace.Step; +import org.eclipse.gemoc.trace.gemoc.api.IMultiDimensionalTraceAddon; +import org.eclipse.gemoc.trace.gemoc.traceaddon.GenericTraceEngineAddon; import org.eclipse.gemoc.xdsmlframework.api.core.ExecutionMode; +import org.eclipse.gemoc.xdsmlframework.api.core.IExecutionEngine; public class Launcher extends AbstractSequentialGemocLauncher, ISequentialRunConfiguration> { @@ -43,6 +67,70 @@ protected PlainK3ExecutionEngine createExecutionEngine(ISequentialRunConfigurati return executionEngine; } + + + + @Override + protected IDSLDebugger getDebugger(ILaunchConfiguration configuration, DSLDebugEventDispatcher dispatcher, + EObject firstInstruction, IProgressMonitor monitor) { + IExecutionEngine> engine = getExecutionEngine(); + AbstractGemocDebugger res; + Set traceAddons = engine.getAddonsTypedBy(IMultiDimensionalTraceAddon.class); + + // We don't want to use trace managers that only work with a subset of + // the execution state + traceAddons.removeIf(traceAddon -> { + return traceAddon.getTraceConstructor() != null + && traceAddon.getTraceConstructor().isPartialTraceConstructor(); + }); + + + // We create a list of all mutable data extractors/dynamicAcceszsor we want to try + List accessors = new ArrayList(); + accessors.add(new DefaultDynamicPartAccessor()); // EMF based accessor (works using @aspect annotations + accessors.add(new K3AspectDynamicPartAccessor(getExecutionEngine().getExecutionContext().getRunConfiguration().getLanguageName(), engine)); + CompositeDynamicPartAccessor compositeDynamicPartAccessor = new CompositeDynamicPartAccessor(accessors); + + // specific for genericTraceAddon + Set genericTraceAddons = engine.getAddonsTypedBy(GenericTraceEngineAddon.class); + for(GenericTraceEngineAddon addon : genericTraceAddons) { + addon.setDynamicPartAccessor(compositeDynamicPartAccessor); + } + + if (traceAddons.isEmpty()) { + res = new GenericSequentialModelDebugger(dispatcher, engine); + } else { + res = new OmniscientGenericSequentialModelDebugger(dispatcher, engine); + } + + // same for extractors + List extractors = new ArrayList(); + extractors.add(compositeDynamicPartAccessor); + res.setMutableFieldExtractors(extractors); + + // If in the launch configuration it is asked to pause at the start, + // we add this dummy break + try { + if (configuration.getAttribute(RunConfiguration.LAUNCH_BREAK_START, false)) { + res.addPredicateBreak(new BiPredicate, Step>() { + @Override + public boolean test(IExecutionEngine t, Step u) { + return true; + } + }); + } + } catch (CoreException e) { + org.eclipse.gemoc.executionframework.engine.ui.Activator.error(e.getMessage(), e); + } + + Activator.getDefault().getMessaggingSystem().debug("Enabled implicit addon: "+res.getAddonID(), getPluginID()); + getExecutionEngine().getExecutionContext().getExecutionPlatform().addEngineAddon(res); + return res; + } + + + + @Override protected String getLaunchConfigurationTypeID() { return TYPE_ID;