Inverted copyInto to copyFrom in IEglContext to avoid duplication of code in EGX. Deleted EglModuleParallel (incomplete/incorrect/requires complete redesign).
diff --git a/plugins/org.eclipse.epsilon.egl.engine/src/org/eclipse/epsilon/egl/EgxModule.java b/plugins/org.eclipse.epsilon.egl.engine/src/org/eclipse/epsilon/egl/EgxModule.java
index df23982..127c4df 100644
--- a/plugins/org.eclipse.epsilon.egl.engine/src/org/eclipse/epsilon/egl/EgxModule.java
+++ b/plugins/org.eclipse.epsilon.egl.engine/src/org/eclipse/epsilon/egl/EgxModule.java
@@ -176,7 +176,7 @@
@Override
protected void prepareContext() {
super.prepareContext();
- getContext().copyInto(getContext().getTemplateFactory().getContext(), true);
+ getTemplateFactory().getContext().copyFrom(context, true);
}
@Override
@@ -194,7 +194,7 @@
* @since 1.6
*/
protected void generateRules() throws EolRuntimeException {
- EglTemplateFactory templateFactory = getContext().getTemplateFactory();
+ EglTemplateFactory templateFactory = getTemplateFactory();
for (GenerationRule rule : getGenerationRules()) {
rule.generateAll(context, templateFactory, this);
diff --git a/plugins/org.eclipse.epsilon.egl.engine/src/org/eclipse/epsilon/egl/concurrent/EgxModuleParallel.java b/plugins/org.eclipse.epsilon.egl.engine/src/org/eclipse/epsilon/egl/concurrent/EgxModuleParallel.java
index 108366f..0a1336a 100644
--- a/plugins/org.eclipse.epsilon.egl.engine/src/org/eclipse/epsilon/egl/concurrent/EgxModuleParallel.java
+++ b/plugins/org.eclipse.epsilon.egl.engine/src/org/eclipse/epsilon/egl/concurrent/EgxModuleParallel.java
@@ -46,7 +46,7 @@
this.context = egxContext;
this.invokedTemplates = new ConcurrentLinkedQueue<>();
}
-
+
@Override
protected void prepareExecution() throws EolRuntimeException {
super.prepareExecution();
diff --git a/plugins/org.eclipse.epsilon.egl.engine/src/org/eclipse/epsilon/egl/execute/context/EglContext.java b/plugins/org.eclipse.epsilon.egl.engine/src/org/eclipse/epsilon/egl/execute/context/EglContext.java
index 0fd6d10..d01f87c 100644
--- a/plugins/org.eclipse.epsilon.egl.engine/src/org/eclipse/epsilon/egl/execute/context/EglContext.java
+++ b/plugins/org.eclipse.epsilon.egl.engine/src/org/eclipse/epsilon/egl/execute/context/EglContext.java
@@ -40,22 +40,26 @@
private IEglContext parentContext;
public EglContext() {
- this(new EglTemplateFactory());
+ this((EglTemplateFactory) null);
}
public EglContext(EglTemplateFactory templateFactory) {
super(new EolClasspathNativeTypeDelegate(EglContext.class.getClassLoader()));
- this.templateFactory = templateFactory != null ? templateFactory : new EglTemplateFactory();
+ this.templateFactory = templateFactory != null ? templateFactory : new EglTemplateFactory(this);
populateScope();
setOperationFactory(new EglOperationFactory());
}
-
- protected void setExecutionManager(EglExecutionManager executionManager) {
- this.executionManager = executionManager;
- }
- public void setTemplateFactory(EglTemplateFactory templateFactory) {
- this.templateFactory = templateFactory;
+ @Override
+ public void copyFrom(IEolContext context, boolean preserveFramestack) {
+ IEglContext.super.copyFrom(context, preserveFramestack);
+
+ if (context instanceof EglContext) {
+ EglContext other = (EglContext) context;
+ this.parentContext = other.parentContext;
+ this.executionManager = other.executionManager;
+ this.templateFactory = other.templateFactory;
+ }
}
@Override
@@ -81,13 +85,6 @@
Variable.createReadOnlyVariable("closeTag", "%]")
);
}
-
-
-
- @Override
- public void copyInto(IEolContext context) {
- copyInto(context, false);
- }
@Override
public CompositePartitioner getPartitioner() {
diff --git a/plugins/org.eclipse.epsilon.egl.engine/src/org/eclipse/epsilon/egl/execute/context/IEglContext.java b/plugins/org.eclipse.epsilon.egl.engine/src/org/eclipse/epsilon/egl/execute/context/IEglContext.java
index 586c0d5..46dee04 100644
--- a/plugins/org.eclipse.epsilon.egl.engine/src/org/eclipse/epsilon/egl/execute/context/IEglContext.java
+++ b/plugins/org.eclipse.epsilon.egl.engine/src/org/eclipse/epsilon/egl/execute/context/IEglContext.java
@@ -27,30 +27,35 @@
public List<String> getPartitioningProblems();
public EglTemplateFactory getTemplateFactory();
-
+
/**
*
* @param context
+ * @param preserveFramestack
* @since 1.6
*/
- public default void copyInto(IEolContext context) {
- copyInto(context, false);
- }
-
- public default void copyInto(IEolContext context, boolean preserveFrameStack) {
- context.setErrorStream(getErrorStream());
- context.setExecutorFactory(getExecutorFactory());
- context.setIntrospectionManager(getIntrospectionManager());
- context.setModelRepository(getModelRepository());
- context.setOperationFactory(getOperationFactory());
- context.setOutputStream(getOutputStream());
- if (!preserveFrameStack) context.setFrameStack(getFrameStack());
- context.setUserInput(getUserInput());
- context.setNativeTypeDelegates(getNativeTypeDelegates());
- context.setExtendedProperties(getExtendedProperties());
- context.setPrettyPrinterManager(getPrettyPrinterManager());
- if (context instanceof EglPreprocessorContext)
- ((EglPreprocessorContext) context).setEglContext(this);
+ public default void copyFrom(IEolContext context, boolean preserveFramestack) {
+ this.setErrorStream(context.getErrorStream());
+ this.setExecutorFactory(context.getExecutorFactory());
+ this.setIntrospectionManager(context.getIntrospectionManager());
+ this.setModelRepository(context.getModelRepository());
+ this.setOperationFactory(context.getOperationFactory());
+ this.setOutputStream(context.getOutputStream());
+ if (!preserveFramestack) this.setFrameStack(context.getFrameStack());
+ this.setUserInput(context.getUserInput());
+ this.setNativeTypeDelegates(context.getNativeTypeDelegates());
+ this.setExtendedProperties(context.getExtendedProperties());
+ this.setPrettyPrinterManager(context.getPrettyPrinterManager());
+ if (context instanceof IEglContext) {
+ IEglContext other = (IEglContext) context;
+ other.getStatusMessages().forEach(this::addStatusMessage);
+ this.setOutputBufferFactory(other.getOutputBufferFactory());
+ this.setPartitioner(other.getPartitioner());
+ this.setContentTypeRepository(other.getContentTypeRepository());
+ if (this instanceof EglPreprocessorContext) {
+ ((EglPreprocessorContext) this).setEglContext(other);
+ }
+ }
}
public CompositePartitioner getPartitioner();
diff --git a/plugins/org.eclipse.epsilon.egl.engine/src/org/eclipse/epsilon/egl/execute/context/IEgxContext.java b/plugins/org.eclipse.epsilon.egl.engine/src/org/eclipse/epsilon/egl/execute/context/IEgxContext.java
index f842896..b052111 100644
--- a/plugins/org.eclipse.epsilon.egl.engine/src/org/eclipse/epsilon/egl/execute/context/IEgxContext.java
+++ b/plugins/org.eclipse.epsilon.egl.engine/src/org/eclipse/epsilon/egl/execute/context/IEgxContext.java
@@ -11,7 +11,6 @@
import org.eclipse.epsilon.egl.EglTemplateFactory;
import org.eclipse.epsilon.egl.IEgxModule;
-import org.eclipse.epsilon.eol.execute.context.IEolContext;
import org.eclipse.epsilon.erl.execute.RuleExecutorFactory;
import org.eclipse.epsilon.erl.execute.context.IErlContext;
@@ -42,26 +41,4 @@
public EglTemplateFactory getTemplateFactory();
- /**
- *
- * @param context
- * @since 1.6
- */
- public default void copyInto(IEolContext context) {
- copyInto(context, false);
- }
-
- public default void copyInto(IEolContext context, boolean preserveFrameStack) {
- context.setErrorStream(getErrorStream());
- context.setExecutorFactory(getExecutorFactory());
- context.setIntrospectionManager(getIntrospectionManager());
- context.setModelRepository(getModelRepository());
- context.setOperationFactory(getOperationFactory());
- context.setOutputStream(getOutputStream());
- if (!preserveFrameStack) context.setFrameStack(getFrameStack());
- context.setUserInput(getUserInput());
- context.setNativeTypeDelegates(getNativeTypeDelegates());
- context.setExtendedProperties(getExtendedProperties());
- context.setPrettyPrinterManager(getPrettyPrinterManager());
- }
}
diff --git a/plugins/org.eclipse.epsilon.egl.engine/src/org/eclipse/epsilon/egl/execute/context/concurrent/EglContextParallel.java b/plugins/org.eclipse.epsilon.egl.engine/src/org/eclipse/epsilon/egl/execute/context/concurrent/EglContextParallel.java
deleted file mode 100644
index 4e2c73f..0000000
--- a/plugins/org.eclipse.epsilon.egl.engine/src/org/eclipse/epsilon/egl/execute/context/concurrent/EglContextParallel.java
+++ /dev/null
@@ -1,174 +0,0 @@
-/*********************************************************************
- * Copyright (c) 2018 The University of York.
- *
- * This program and the accompanying materials are made
- * available under the terms of the Eclipse Public License 2.0
- * which is available at https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
-**********************************************************************/
-package org.eclipse.epsilon.egl.execute.context.concurrent;
-
-import org.eclipse.epsilon.common.concurrent.ConcurrencyUtils;
-import org.eclipse.epsilon.common.module.ModuleElement;
-import org.eclipse.epsilon.egl.EglTemplateFactory;
-import org.eclipse.epsilon.egl.execute.context.EglContext;
-import org.eclipse.epsilon.egl.execute.context.EglExecutionManager;
-import org.eclipse.epsilon.egl.execute.context.EglFrameStackManager;
-import org.eclipse.epsilon.eol.exceptions.concurrent.EolNestedParallelismException;
-import org.eclipse.epsilon.eol.execute.ExecutorFactory;
-import org.eclipse.epsilon.eol.execute.concurrent.executors.EolExecutorService;
-import org.eclipse.epsilon.eol.execute.context.FrameStack;
-import org.eclipse.epsilon.eol.execute.context.concurrent.IEolContextParallel;
-import org.eclipse.epsilon.eol.execute.operations.contributors.OperationContributorRegistry;
-import org.eclipse.epsilon.eol.execute.concurrent.DelegatePersistentThreadLocal;
-import org.eclipse.epsilon.eol.execute.concurrent.PersistentThreadLocal;
-
-/**
- *
- * @author Sina Madani
- * @since 1.6
- */
-public class EglContextParallel extends EglContext implements IEolContextParallel {
-
- protected final int numThreads;
- protected int nestLevel;
- protected boolean isParallel = false;
- protected EolExecutorService executorService;
- protected PersistentThreadLocal<FrameStack> concurrentFrameStacks;
- protected PersistentThreadLocal<ExecutorFactory> concurrentExecutors;
- protected ThreadLocal<OperationContributorRegistry> concurrentMethodContributors;
- protected ThreadLocal<EglExecutionManager> concurrentExecutionManagers;
-
- public EglContextParallel() {
- this(0);
- }
-
- public EglContextParallel(EglTemplateFactory templateFactory) {
- this(templateFactory, 0);
- }
-
- public EglContextParallel(int parallelism) {
- this(null, parallelism);
- }
-
- public EglContextParallel(EglTemplateFactory templateFactory, int parallelism) {
- super(templateFactory);
- numThreads = parallelism > 0 ? parallelism : ConcurrencyUtils.DEFAULT_PARALLELISM;
- initMainThreadStructures();
- }
-
- protected void initMainThreadStructures() {
- frameStack = new FrameStack(null, true);
- executorFactory = new ExecutorFactory(null, true);
- setExecutionManager(new EglExecutionManager(new EglFrameStackManager(getFrameStack())));
- }
-
- protected void initThreadLocals() {
- concurrentMethodContributors = ThreadLocal.withInitial(OperationContributorRegistry::new);
- concurrentFrameStacks = new DelegatePersistentThreadLocal<>(() -> new FrameStack(frameStack, false));
- concurrentExecutors = new DelegatePersistentThreadLocal<>(() -> new ExecutorFactory(executorFactory, false));
- concurrentExecutionManagers = ThreadLocal.withInitial((() -> new EglExecutionManager(new EglFrameStackManager(getFrameStack()))));
- }
-
- protected void setBaseThreadSafety(boolean concurrent) {
- frameStack.setThreadSafe(concurrent);
- executorFactory.setThreadSafe(concurrent);
- }
-
- @Override
- protected void finalize() {
- if (executorService != null) {
- executorService.shutdownNow();
- executorService = null;
- }
- }
-
- @Override
- public void goParallel() {
- if (!isParallel) {
- initThreadLocals();
- isParallel = true;
- }
- }
-
- @Override
- public void endParallel() {
- isParallel = false;
-
- finalize();
-
- concurrentFrameStacks.removeAll();
- concurrentFrameStacks = null;
- concurrentMethodContributors = null;
- concurrentExecutors.removeAll();
- concurrentExecutors = null;
- }
-
- @Override
- public boolean isParallel() {
- return isParallel;
- }
-
- @Override
- public int getParallelism() {
- return numThreads;
- }
-
- @Override
- public void enterParallelNest(ModuleElement entryPoint) throws EolNestedParallelismException {
- if (++nestLevel > PARALLEL_NEST_THRESHOLD) {
- throw new EolNestedParallelismException(entryPoint);
- }
- }
-
- @Override
- public void exitParallelNest(ModuleElement entryPoint) {
- if (nestLevel > 0)
- nestLevel--;
- }
-
- @Override
- public int getNestedParallelism() {
- return nestLevel;
- }
-
- @Override
- public EolExecutorService getExecutorService() {
- if (executorService == null) {
- executorService = newExecutorService();
- }
- return executorService;
- }
-
- @Override
- public FrameStack getFrameStack() {
- return parallelGet(concurrentFrameStacks, super::getFrameStack);
- }
-
- @Override
- public void setFrameStack(FrameStack frameStack) {
- parallelSet(frameStack, concurrentFrameStacks, super::setFrameStack);
- }
-
- @Override
- public OperationContributorRegistry getOperationContributorRegistry() {
- return parallelGet(concurrentMethodContributors, super::getOperationContributorRegistry);
- }
-
- @Override
- public ExecutorFactory getExecutorFactory() {
- return parallelGet(concurrentExecutors, super::getExecutorFactory);
- }
-
- @Override
- public void setExecutorFactory(ExecutorFactory executorFactory) {
- parallelSet(executorFactory, concurrentExecutors, super::setExecutorFactory);
- }
-
- @Override
- public String toString() {
- return super.toString()+" [parallelism="+getParallelism()+"]";
- }
-
-}
diff --git a/plugins/org.eclipse.epsilon.egl.engine/src/org/eclipse/epsilon/egl/execute/context/concurrent/EgxContextParallel.java b/plugins/org.eclipse.epsilon.egl.engine/src/org/eclipse/epsilon/egl/execute/context/concurrent/EgxContextParallel.java
index 2c2bd39..0bd5ec8 100644
--- a/plugins/org.eclipse.epsilon.egl.engine/src/org/eclipse/epsilon/egl/execute/context/concurrent/EgxContextParallel.java
+++ b/plugins/org.eclipse.epsilon.egl.engine/src/org/eclipse/epsilon/egl/execute/context/concurrent/EgxContextParallel.java
@@ -34,8 +34,7 @@
public EgxContextParallel(EglTemplateFactory templateFactory, int parallelism) {
super(parallelism);
- this.templateFactory = templateFactory != null ? templateFactory :
- new EglTemplateFactory(new EglContextParallel(getParallelism()));
+ this.templateFactory = templateFactory != null ? templateFactory : new EglTemplateFactory();
}
public EgxContextParallel(int parallelism) {
diff --git a/plugins/org.eclipse.epsilon.egl.engine/src/org/eclipse/epsilon/egl/internal/EglModule.java b/plugins/org.eclipse.epsilon.egl.engine/src/org/eclipse/epsilon/egl/internal/EglModule.java
index cf917ba..2624b8e 100644
--- a/plugins/org.eclipse.epsilon.egl.engine/src/org/eclipse/epsilon/egl/internal/EglModule.java
+++ b/plugins/org.eclipse.epsilon.egl.engine/src/org/eclipse/epsilon/egl/internal/EglModule.java
@@ -51,9 +51,7 @@
protected EglParser parser;
protected EglLexer lexer;
- protected Reader reader;
protected EglPreprocessorModule preprocessorModule;
- protected AST ast;
private final List<EglMarkerSection> markers = new LinkedList<>();
private URI templateRoot;
@@ -63,8 +61,8 @@
}
public EglModule(IEglContext context) {
- this.context = context != null ? context : new EglContext();
- preprocessorModule = new EglPreprocessorModule(context);
+ ((IEglContext) (this.context = new EglContext())).copyFrom(context, false);
+ preprocessorModule = new EglPreprocessorModule(this.context);
}
@Override
@@ -90,7 +88,8 @@
try {
templateRoot = UriUtil.fileToUri(file.getAbsoluteFile().getParentFile());
- } catch (URISyntaxException e) {}
+ }
+ catch (URISyntaxException e) {}
}
return parseAndPreprocess(lexer, file);
@@ -101,19 +100,15 @@
if (uri == null)
throw new IllegalArgumentException("URI cannot be null");
- try {
- this.sourceUri = uri;
- this.templateRoot = uri;
+ this.sourceUri = uri;
+ this.templateRoot = uri;
- if (uri.getScheme() != null && uri.getScheme().equals("file")) {
- this.sourceFile = new File(uri);
- }
-
- reader = new BufferedReader(new InputStreamReader(uri.toURL().openStream()));
- return parseAndPreprocess(new EglLexer(reader), this.sourceFile);
+ if (uri.getScheme() != null && uri.getScheme().equals("file")) {
+ this.sourceFile = new File(uri);
}
- finally {
- if (reader != null) reader.close();
+
+ try (Reader reader = new BufferedReader(new InputStreamReader(uri.toURL().openStream()))) {
+ return parseAndPreprocess(new EglLexer(reader), this.sourceFile);
}
}
@@ -122,13 +117,13 @@
EpsilonTreeAdaptor astFactory = new EpsilonTreeAdaptor(file, this);
parser = new EglParser(lexer, astFactory);
parser.parse();
- ast = parser.getAST();
+ AST ast = parser.getAST();
final boolean validEgl = parser.getParseProblems().isEmpty();
final boolean validEol = preprocessorModule.preprocess(ast, sourceFile, sourceUri);
if (validEgl && validEol) {
- buildModel();
+ buildModel(ast);
}
return validEgl && validEol;
@@ -141,7 +136,7 @@
return null;
}
- public void buildModel() throws Exception {
+ void buildModel(AST ast) throws Exception {
for (AST child : ast.getChildren()) {
if (child.getType() == TokenType.START_MARKER_TAG.getIdentifier()) {
EglMarkerSection section = (EglMarkerSection) createAst(child, this);
@@ -163,13 +158,11 @@
@Override
public EglResult execute(EglTemplate template, Formatter postprocessor) throws EglRuntimeException {
IEglContext context = getContext();
-
context.enter(template);
final String generatedText = execute(postprocessor);
context.exit();
-
return new EglResult(generatedText);
}
diff --git a/plugins/org.eclipse.epsilon.egl.traceability.fine/src/org/eclipse/epsilon/egl/engine/traceability/fine/internal/EglOutputBufferPrintExecutionListener.java b/plugins/org.eclipse.epsilon.egl.traceability.fine/src/org/eclipse/epsilon/egl/engine/traceability/fine/internal/EglOutputBufferPrintExecutionListener.java
index 265f07c..516fc27 100644
--- a/plugins/org.eclipse.epsilon.egl.traceability.fine/src/org/eclipse/epsilon/egl/engine/traceability/fine/internal/EglOutputBufferPrintExecutionListener.java
+++ b/plugins/org.eclipse.epsilon.egl.traceability.fine/src/org/eclipse/epsilon/egl/engine/traceability/fine/internal/EglOutputBufferPrintExecutionListener.java
@@ -12,9 +12,7 @@
import java.util.Arrays;
import java.util.List;
import java.util.WeakHashMap;
-
import org.eclipse.epsilon.common.module.ModuleElement;
-import org.eclipse.epsilon.common.parse.AST;
import org.eclipse.epsilon.egl.engine.traceability.fine.trace.Region;
import org.eclipse.epsilon.egl.execute.context.IEglContext;
import org.eclipse.epsilon.egl.internal.EglPreprocessorContext;
@@ -25,13 +23,12 @@
import org.eclipse.epsilon.eol.execute.control.IExecutionListener;
import org.eclipse.epsilon.eol.execute.introspection.recording.IPropertyAccess;
import org.eclipse.epsilon.eol.execute.introspection.recording.IPropertyAccessRecorder;
-import org.eclipse.epsilon.eol.parse.EolParser;
@SuppressWarnings("restriction")
public class EglOutputBufferPrintExecutionListener implements IExecutionListener {
private final IPropertyAccessRecorder recorder;
- private final WeakHashMap<ModuleElement, EglOutputBufferPrintExecutionListener.TraceData> cache = new WeakHashMap<ModuleElement, EglOutputBufferPrintExecutionListener.TraceData>();
+ private final WeakHashMap<ModuleElement, EglOutputBufferPrintExecutionListener.TraceData> cache = new WeakHashMap<>();
private final TracedPropertyAccessLedger ledger;
public EglOutputBufferPrintExecutionListener(IPropertyAccessRecorder recorder, TracedPropertyAccessLedger ledger) {
diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/execute/context/FrameStack.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/execute/context/FrameStack.java
index 012a8fd..ffcb23b 100644
--- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/execute/context/FrameStack.java
+++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/execute/context/FrameStack.java
@@ -577,6 +577,21 @@
return locals.isEmpty() ? globals : locals;
}
+ /**
+ * Copies the references of all variables in the given FrameStack into this FrameStack.
+ *
+ * @param other The FrameStack to copy from.
+ * @since 1.6
+ */
+ public void putAll(FrameStack other) {
+ this.globals.putAll(other.globals.getAll());
+ this.locals.putAll(other.locals.getAll());
+ this.builtInVariables.putAll(other.builtInVariables);
+ }
+
+ /**
+ * @since 1.6
+ */
@Override
public FrameStack getBase() {
return base;
@@ -596,11 +611,17 @@
return getFrames().size();
}
+ /**
+ * @since 1.6
+ */
@Override
public boolean isThreadSafe() {
return isConcurrent;
}
+ /**
+ * @since 1.6
+ */
@Override
public void setThreadSafe(boolean concurrent) {
if (concurrent != this.isConcurrent) {
@@ -613,6 +634,7 @@
/**
* Adds all of this FrameStack's frames into its base FrameStack, or vice-versa.
* @param mode Whether to merge from base to this, or from this to base.
+ * @since 1.6
*/
@Override
public void merge(MergeMode mode) {
@@ -623,6 +645,7 @@
/**
* Adds all the frames and variables from the first argument to the second one.
+ * @since 1.6
*/
protected static void mergeFrameStacks(FrameStack from, FrameStack to) {
if (from != null && to != null) {
diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/execute/context/IEolContext.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/execute/context/IEolContext.java
index 9493ecb..9091342 100644
--- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/execute/context/IEolContext.java
+++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/execute/context/IEolContext.java
@@ -94,5 +94,5 @@
Queue<AsyncStatementInstance> getAsyncStatementsQueue();
OperationContributorRegistry getOperationContributorRegistry();
-
+
}