/* * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors * * SPDX-License-Identifier: EPL-2.0 */ package tools.refinery.store.query.viatra.internal.update; import tools.refinery.viatra.runtime.matchers.context.IInputKey; import tools.refinery.viatra.runtime.matchers.context.IQueryRuntimeContextListener; import tools.refinery.viatra.runtime.matchers.tuple.ITuple; import tools.refinery.store.query.viatra.internal.ViatraModelQueryAdapterImpl; import tools.refinery.store.query.view.AnySymbolView; import tools.refinery.store.query.view.SymbolView; import java.util.HashMap; import java.util.Map; public class ModelUpdateListener { private final Map> symbolViewUpdateListeners; public ModelUpdateListener(ViatraModelQueryAdapterImpl adapter) { var symbolViews = adapter.getStoreAdapter().getInputKeys().keySet(); symbolViewUpdateListeners = new HashMap<>(symbolViews.size()); for (var symbolView : symbolViews) { registerView(adapter, (SymbolView) symbolView); } } private void registerView(ViatraModelQueryAdapterImpl adapter, SymbolView view) { var model = adapter.getModel(); var interpretation = model.getInterpretation(view.getSymbol()); var listener = SymbolViewUpdateListener.of(adapter, view, interpretation); symbolViewUpdateListeners.put(view, listener); } public boolean containsSymbolView(AnySymbolView relationView) { return symbolViewUpdateListeners.containsKey(relationView); } public void addListener(IInputKey key, AnySymbolView symbolView, ITuple seed, IQueryRuntimeContextListener listener) { var symbolViewUpdateListener = symbolViewUpdateListeners.get(symbolView); symbolViewUpdateListener.addFilter(key, seed, listener); } public void removeListener(IInputKey key, AnySymbolView symbolView, ITuple seed, IQueryRuntimeContextListener listener) { var symbolViewUpdateListener = symbolViewUpdateListeners.get(symbolView); symbolViewUpdateListener.removeFilter(key, seed, listener); } }