From ea0f09096afe05e2d414c707584e1e33c0c44383 Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Fri, 21 Apr 2023 02:12:04 +0200 Subject: refactor: simplify ModelAdapter * Remove the reflection-based machinery around adapter types. * Adapter builders, store adapters, and model adapters are now only associated with each other based on static and runtime types. * Simplifies writing new adapters. * Hierarchical syntax for adding adapter builders to the store builder. --- .../store/adapter/AbstractModelAdapterBuilder.java | 42 ++++++--- .../tools/refinery/store/adapter/AdapterList.java | 102 --------------------- .../tools/refinery/store/adapter/AdapterUtils.java | 33 +++++++ .../store/adapter/AnyModelAdapterType.java | 24 ----- .../store/adapter/ModelAdapterBuilder.java | 11 +-- .../store/adapter/ModelAdapterBuilderFactory.java | 19 ---- .../refinery/store/adapter/ModelAdapterType.java | 84 ----------------- .../java/tools/refinery/store/model/Model.java | 5 +- .../tools/refinery/store/model/ModelStore.java | 5 +- .../refinery/store/model/ModelStoreBuilder.java | 8 +- .../refinery/store/model/internal/ModelImpl.java | 20 ++-- .../model/internal/ModelStoreBuilderImpl.java | 59 ++++-------- .../store/model/internal/ModelStoreImpl.java | 26 +++--- 13 files changed, 111 insertions(+), 327 deletions(-) delete mode 100644 subprojects/store/src/main/java/tools/refinery/store/adapter/AdapterList.java create mode 100644 subprojects/store/src/main/java/tools/refinery/store/adapter/AdapterUtils.java delete mode 100644 subprojects/store/src/main/java/tools/refinery/store/adapter/AnyModelAdapterType.java delete mode 100644 subprojects/store/src/main/java/tools/refinery/store/adapter/ModelAdapterBuilderFactory.java delete mode 100644 subprojects/store/src/main/java/tools/refinery/store/adapter/ModelAdapterType.java (limited to 'subprojects/store/src/main/java/tools') diff --git a/subprojects/store/src/main/java/tools/refinery/store/adapter/AbstractModelAdapterBuilder.java b/subprojects/store/src/main/java/tools/refinery/store/adapter/AbstractModelAdapterBuilder.java index 70602ef5..8d3e998e 100644 --- a/subprojects/store/src/main/java/tools/refinery/store/adapter/AbstractModelAdapterBuilder.java +++ b/subprojects/store/src/main/java/tools/refinery/store/adapter/AbstractModelAdapterBuilder.java @@ -1,32 +1,48 @@ +package tools.refinery.store.adapter; /* * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors * * SPDX-License-Identifier: EPL-2.0 */ -package tools.refinery.store.adapter; - import tools.refinery.store.model.ModelStore; import tools.refinery.store.model.ModelStoreBuilder; -public abstract class AbstractModelAdapterBuilder implements ModelAdapterBuilder { - private final ModelStoreBuilder storeBuilder; +public abstract class AbstractModelAdapterBuilder implements ModelAdapterBuilder { + private boolean configured; - protected AbstractModelAdapterBuilder(ModelStoreBuilder storeBuilder) { - this.storeBuilder = storeBuilder; + @Override + public boolean isConfigured() { + return configured; } - @Override - public T with(ModelAdapterBuilderFactory adapterBuilderFactory) { - return storeBuilder.with(adapterBuilderFactory); + protected void checkConfigured() { + if (!configured) { + throw new IllegalStateException("Model adapter builder was not configured"); + } + } + + protected void checkNotConfigured() { + if (configured) { + throw new IllegalStateException("Model adapter builder was already configured"); + } + } + + protected void doConfigure(ModelStoreBuilder storeBuilder) { + // Nothing to configure by default. } @Override - public ModelStoreBuilder getStoreBuilder() { - return storeBuilder; + public final void configure(ModelStoreBuilder storeBuilder) { + checkNotConfigured(); + doConfigure(storeBuilder); + configured = true; } + protected abstract T doBuild(ModelStore store); + @Override - public ModelStore build() { - return storeBuilder.build(); + public final T build(ModelStore store) { + checkConfigured(); + return doBuild(store); } } diff --git a/subprojects/store/src/main/java/tools/refinery/store/adapter/AdapterList.java b/subprojects/store/src/main/java/tools/refinery/store/adapter/AdapterList.java deleted file mode 100644 index e896d8d9..00000000 --- a/subprojects/store/src/main/java/tools/refinery/store/adapter/AdapterList.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.adapter; - -import org.jetbrains.annotations.NotNull; - -import java.util.*; -import java.util.function.Consumer; - -public class AdapterList implements Iterable { - private final List adapterTypes; - private final List adapters; - - public AdapterList() { - adapterTypes = new ArrayList<>(); - adapters = new ArrayList<>(); - } - - public AdapterList(int adapterCount) { - adapterTypes = new ArrayList<>(adapterCount); - adapters = new ArrayList<>(adapterCount); - } - - public int size() { - return adapters.size(); - } - - public void add(AnyModelAdapterType adapterType, T adapter) { - adapterTypes.add(adapterType); - adapters.add(adapter); - } - - public Optional tryGet(AnyModelAdapterType adapterType, Class adapterClass) { - int size = size(); - for (int i = 0; i < size; i++) { - if (getType(i).supports(adapterType)) { - return Optional.of(adapterClass.cast(get(i))); - } - } - return Optional.empty(); - } - - public U get(AnyModelAdapterType adapterType, Class adapterClass) { - return tryGet(adapterType, adapterClass).orElseThrow(() -> new IllegalArgumentException( - "No %s was configured".formatted(adapterType))); - } - - public AnyModelAdapterType getType(int i) { - return adapterTypes.get(i); - } - - public T get(int i) { - return adapters.get(i); - } - - public Collection getAdapterTypes() { - return Collections.unmodifiableCollection(adapterTypes); - } - - public Iterable> withAdapterTypes() { - return () -> new Iterator<>() { - private int i = 0; - - @Override - public boolean hasNext() { - return i < size(); - } - - @Override - public Entry next() { - if (i >= size()) { - throw new NoSuchElementException(); - } - var entry = new Entry<>(getType(i), get(i)); - i++; - return entry; - } - }; - } - - @NotNull - @Override - public Iterator iterator() { - return adapters.iterator(); - } - - @Override - public void forEach(Consumer action) { - adapters.forEach(action); - } - - @Override - public Spliterator spliterator() { - return adapters.spliterator(); - } - - public record Entry(AnyModelAdapterType adapterType, T adapter) { - } -} diff --git a/subprojects/store/src/main/java/tools/refinery/store/adapter/AdapterUtils.java b/subprojects/store/src/main/java/tools/refinery/store/adapter/AdapterUtils.java new file mode 100644 index 00000000..556e99f0 --- /dev/null +++ b/subprojects/store/src/main/java/tools/refinery/store/adapter/AdapterUtils.java @@ -0,0 +1,33 @@ +/* + * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors + * + * SPDX-License-Identifier: EPL-2.0 + */ +package tools.refinery.store.adapter; + +import java.util.Collection; +import java.util.Optional; + +public class AdapterUtils { + private AdapterUtils() { + throw new IllegalStateException("This is a static utility class and should not be instantiated directly"); + } + + public static Optional tryGetAdapter(Collection adapters, Class type) { + var iterator = adapters.stream().filter(type::isInstance).iterator(); + if (!iterator.hasNext()) { + return Optional.empty(); + } + var adapter = type.cast(iterator.next()); + if (iterator.hasNext()) { + throw new IllegalArgumentException("Ambiguous adapter: both %s and %s match %s" + .formatted(adapter.getClass().getName(), iterator.next().getClass().getName(), type.getName())); + } + return Optional.of(adapter); + } + + public static T getAdapter(Collection adapters, Class type) { + return tryGetAdapter(adapters, type).orElseThrow(() -> new IllegalArgumentException( + "No %s adapter was configured".formatted(type.getName()))); + } +} diff --git a/subprojects/store/src/main/java/tools/refinery/store/adapter/AnyModelAdapterType.java b/subprojects/store/src/main/java/tools/refinery/store/adapter/AnyModelAdapterType.java deleted file mode 100644 index f161a60b..00000000 --- a/subprojects/store/src/main/java/tools/refinery/store/adapter/AnyModelAdapterType.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.adapter; - -import java.util.Collection; - -public sealed interface AnyModelAdapterType permits ModelAdapterType { - Class getModelAdapterClass(); - - Class getModelStoreAdapterClass(); - - Class getModelAdapterBuilderClass(); - - Collection getSupportedAdapterTypes(); - - default boolean supports(AnyModelAdapterType targetAdapter) { - return getSupportedAdapterTypes().contains(targetAdapter); - } - - String getName(); -} diff --git a/subprojects/store/src/main/java/tools/refinery/store/adapter/ModelAdapterBuilder.java b/subprojects/store/src/main/java/tools/refinery/store/adapter/ModelAdapterBuilder.java index 709cbb3e..75e5e07d 100644 --- a/subprojects/store/src/main/java/tools/refinery/store/adapter/ModelAdapterBuilder.java +++ b/subprojects/store/src/main/java/tools/refinery/store/adapter/ModelAdapterBuilder.java @@ -9,14 +9,9 @@ import tools.refinery.store.model.ModelStore; import tools.refinery.store.model.ModelStoreBuilder; public interface ModelAdapterBuilder { - ModelStoreAdapter createStoreAdapter(ModelStore store); + boolean isConfigured(); - T with(ModelAdapterBuilderFactory adapterBuilderFactory); + void configure(ModelStoreBuilder storeBuilder); - ModelStoreBuilder getStoreBuilder(); - - default void configure() { - } - - ModelStore build(); + ModelStoreAdapter build(ModelStore store); } diff --git a/subprojects/store/src/main/java/tools/refinery/store/adapter/ModelAdapterBuilderFactory.java b/subprojects/store/src/main/java/tools/refinery/store/adapter/ModelAdapterBuilderFactory.java deleted file mode 100644 index 1d549d5b..00000000 --- a/subprojects/store/src/main/java/tools/refinery/store/adapter/ModelAdapterBuilderFactory.java +++ /dev/null @@ -1,19 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.adapter; - -import tools.refinery.store.model.ModelStoreBuilder; - -public abstract class ModelAdapterBuilderFactory extends ModelAdapterType { - - protected ModelAdapterBuilderFactory(Class modelAdapterClass, Class modelStoreAdapterClass, - Class modelAdapterBuilderClass) { - super(modelAdapterClass, modelStoreAdapterClass, modelAdapterBuilderClass); - } - - public abstract T3 createBuilder(ModelStoreBuilder storeBuilder); -} diff --git a/subprojects/store/src/main/java/tools/refinery/store/adapter/ModelAdapterType.java b/subprojects/store/src/main/java/tools/refinery/store/adapter/ModelAdapterType.java deleted file mode 100644 index 6255fe52..00000000 --- a/subprojects/store/src/main/java/tools/refinery/store/adapter/ModelAdapterType.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.store.adapter; - -import tools.refinery.store.model.Model; -import tools.refinery.store.model.ModelStore; - -import java.lang.reflect.Method; -import java.util.Collection; -import java.util.Collections; -import java.util.HashSet; -import java.util.Set; - -public abstract non-sealed class ModelAdapterType implements AnyModelAdapterType { - private final Class modelAdapterClass; - private final Class modelStoreAdapterClass; - private final Class modelAdapterBuilderClass; - private final Set supportedAdapters = new HashSet<>(); - - protected ModelAdapterType(Class modelAdapterClass, Class modelStoreAdapterClass, - Class modelAdapterBuilderClass) { - checkReturnType(modelAdapterClass, modelStoreAdapterClass, "createModelAdapter", Model.class); - checkReturnType(modelStoreAdapterClass, modelAdapterBuilderClass, "createStoreAdapter", ModelStore.class); - this.modelAdapterClass = modelAdapterClass; - this.modelStoreAdapterClass = modelStoreAdapterClass; - this.modelAdapterBuilderClass = modelAdapterBuilderClass; - supportedAdapters.add(this); - } - - private void checkReturnType(Class expectedReturnType, Class ownerClass, String methodName, - Class... argumentTypes) { - Method method; - try { - method = ownerClass.getMethod(methodName, argumentTypes); - } catch (NoSuchMethodException e) { - throw new IllegalStateException("Invalid %s: %s#%s method is required" - .formatted(this, ownerClass.getName(), methodName), e); - } - var returnType = method.getReturnType(); - if (!expectedReturnType.isAssignableFrom(returnType)) { - throw new IllegalStateException("Invalid %s: %s is not assignable from the return type %s of %s#%s" - .formatted(this, expectedReturnType.getName(), returnType.getCanonicalName(), - ownerClass.getName(), methodName)); - } - } - - protected void extendsAdapter(ModelAdapterType superAdapter) { - supportedAdapters.addAll(superAdapter.supportedAdapters); - } - - @Override - public final Class getModelAdapterClass() { - return modelAdapterClass; - } - - @Override - public final Class getModelStoreAdapterClass() { - return modelStoreAdapterClass; - } - - @Override - public final Class getModelAdapterBuilderClass() { - return modelAdapterBuilderClass; - } - - @Override - public Collection getSupportedAdapterTypes() { - return Collections.unmodifiableCollection(supportedAdapters); - } - - @Override - public String getName() { - return "%s.ADAPTER".formatted(this.getClass().getName()); - } - - @Override - public String toString() { - return getName(); - } -} diff --git a/subprojects/store/src/main/java/tools/refinery/store/model/Model.java b/subprojects/store/src/main/java/tools/refinery/store/model/Model.java index f4131756..d58d91c3 100644 --- a/subprojects/store/src/main/java/tools/refinery/store/model/Model.java +++ b/subprojects/store/src/main/java/tools/refinery/store/model/Model.java @@ -6,7 +6,6 @@ package tools.refinery.store.model; import tools.refinery.store.adapter.ModelAdapter; -import tools.refinery.store.adapter.ModelAdapterType; import tools.refinery.store.map.Versioned; import tools.refinery.store.representation.AnySymbol; import tools.refinery.store.representation.Symbol; @@ -30,9 +29,9 @@ public interface Model extends Versioned { ModelDiffCursor getDiffCursor(long to); - Optional tryGetAdapter(ModelAdapterType adapterType); + Optional tryGetAdapter(Class adapterType); - T getAdapter(ModelAdapterType adapterType); + T getAdapter(Class adapterType); void addListener(ModelListener listener); diff --git a/subprojects/store/src/main/java/tools/refinery/store/model/ModelStore.java b/subprojects/store/src/main/java/tools/refinery/store/model/ModelStore.java index a72399f7..b10eb8a4 100644 --- a/subprojects/store/src/main/java/tools/refinery/store/model/ModelStore.java +++ b/subprojects/store/src/main/java/tools/refinery/store/model/ModelStore.java @@ -5,7 +5,6 @@ */ package tools.refinery.store.model; -import tools.refinery.store.adapter.ModelAdapterType; import tools.refinery.store.adapter.ModelStoreAdapter; import tools.refinery.store.model.internal.ModelStoreBuilderImpl; import tools.refinery.store.representation.AnySymbol; @@ -25,9 +24,9 @@ public interface ModelStore { ModelDiffCursor getDiffCursor(long from, long to); - Optional tryGetAdapter(ModelAdapterType adapterType); + Optional tryGetAdapter(Class adapterType); - T getAdapter(ModelAdapterType adapterType); + T getAdapter(Class adapterType); static ModelStoreBuilder builder() { return new ModelStoreBuilderImpl(); diff --git a/subprojects/store/src/main/java/tools/refinery/store/model/ModelStoreBuilder.java b/subprojects/store/src/main/java/tools/refinery/store/model/ModelStoreBuilder.java index d9354bdb..3a4024b5 100644 --- a/subprojects/store/src/main/java/tools/refinery/store/model/ModelStoreBuilder.java +++ b/subprojects/store/src/main/java/tools/refinery/store/model/ModelStoreBuilder.java @@ -6,8 +6,6 @@ package tools.refinery.store.model; import tools.refinery.store.adapter.ModelAdapterBuilder; -import tools.refinery.store.adapter.ModelAdapterBuilderFactory; -import tools.refinery.store.adapter.ModelAdapterType; import tools.refinery.store.representation.AnySymbol; import tools.refinery.store.representation.Symbol; @@ -31,11 +29,11 @@ public interface ModelStoreBuilder { ModelStoreBuilder symbol(Symbol symbol); - T with(ModelAdapterBuilderFactory adapterBuilderFactory); + ModelStoreBuilder with(T adapterBuilder); - Optional tryGetAdapter(ModelAdapterType adapterType); + Optional tryGetAdapter(Class adapterType); - T getAdapter(ModelAdapterType adapterType); + T getAdapter(Class adapterType); ModelStore build(); } diff --git a/subprojects/store/src/main/java/tools/refinery/store/model/internal/ModelImpl.java b/subprojects/store/src/main/java/tools/refinery/store/model/internal/ModelImpl.java index 50a408da..c5475a1a 100644 --- a/subprojects/store/src/main/java/tools/refinery/store/model/internal/ModelImpl.java +++ b/subprojects/store/src/main/java/tools/refinery/store/model/internal/ModelImpl.java @@ -5,10 +5,8 @@ */ package tools.refinery.store.model.internal; -import tools.refinery.store.adapter.AdapterList; -import tools.refinery.store.adapter.AnyModelAdapterType; +import tools.refinery.store.adapter.AdapterUtils; import tools.refinery.store.adapter.ModelAdapter; -import tools.refinery.store.adapter.ModelAdapterType; import tools.refinery.store.map.DiffCursor; import tools.refinery.store.model.*; import tools.refinery.store.representation.AnySymbol; @@ -21,7 +19,7 @@ public class ModelImpl implements Model { private final ModelStore store; private long state; private Map> interpretations; - private final AdapterList adapters; + private final List adapters; private final List listeners = new ArrayList<>(); private boolean uncommittedChanges; private ModelAction pendingAction = ModelAction.NONE; @@ -30,7 +28,7 @@ public class ModelImpl implements Model { ModelImpl(ModelStore store, long state, int adapterCount) { this.store = store; this.state = state; - adapters = new AdapterList<>(adapterCount); + adapters = new ArrayList<>(adapterCount); } void setInterpretations(Map> interpretations) { @@ -167,17 +165,17 @@ public class ModelImpl implements Model { } @Override - public Optional tryGetAdapter(ModelAdapterType adapterType) { - return adapters.tryGet(adapterType, adapterType.getModelAdapterClass()); + public Optional tryGetAdapter(Class adapterType) { + return AdapterUtils.tryGetAdapter(adapters, adapterType); } @Override - public T getAdapter(ModelAdapterType adapterType) { - return adapters.get(adapterType, adapterType.getModelAdapterClass()); + public T getAdapter(Class adapterType) { + return AdapterUtils.getAdapter(adapters, adapterType); } - void addAdapter(AnyModelAdapterType adapterType, ModelAdapter adapter) { - adapters.add(adapterType, adapter); + void addAdapter(ModelAdapter adapter) { + adapters.add(adapter); } @Override diff --git a/subprojects/store/src/main/java/tools/refinery/store/model/internal/ModelStoreBuilderImpl.java b/subprojects/store/src/main/java/tools/refinery/store/model/internal/ModelStoreBuilderImpl.java index 70bccb96..aafbe130 100644 --- a/subprojects/store/src/main/java/tools/refinery/store/model/internal/ModelStoreBuilderImpl.java +++ b/subprojects/store/src/main/java/tools/refinery/store/model/internal/ModelStoreBuilderImpl.java @@ -5,10 +5,8 @@ */ package tools.refinery.store.model.internal; -import tools.refinery.store.adapter.AdapterList; +import tools.refinery.store.adapter.AdapterUtils; import tools.refinery.store.adapter.ModelAdapterBuilder; -import tools.refinery.store.adapter.ModelAdapterBuilderFactory; -import tools.refinery.store.adapter.ModelAdapterType; import tools.refinery.store.map.VersionedMapStore; import tools.refinery.store.map.VersionedMapStoreImpl; import tools.refinery.store.model.ModelStore; @@ -23,7 +21,7 @@ import java.util.*; public class ModelStoreBuilderImpl implements ModelStoreBuilder { private final Set allSymbols = new HashSet<>(); private final Map, List> equivalenceClasses = new HashMap<>(); - private final AdapterList adapters = new AdapterList<>(); + private final List adapters = new ArrayList<>(); @Override public ModelStoreBuilder symbol(Symbol symbol) { @@ -38,46 +36,25 @@ public class ModelStoreBuilderImpl implements ModelStoreBuilder { } @Override - public T with(ModelAdapterBuilderFactory adapterBuilderFactory) { - return adapters.tryGet(adapterBuilderFactory, adapterBuilderFactory.getModelAdapterBuilderClass()) - .orElseGet(() -> addAdapter(adapterBuilderFactory)); - } - - private T addAdapter(ModelAdapterBuilderFactory adapterBuilderFactory) { - for (var configuredAdapterType : adapters.getAdapterTypes()) { - var intersection = new HashSet<>(adapterBuilderFactory.getSupportedAdapterTypes()); - intersection.retainAll(configuredAdapterType.getSupportedAdapterTypes()); - if (!intersection.isEmpty()) { - if (configuredAdapterType.supports(adapterBuilderFactory)) { - // Impossible to end up here from #with, because we should have returned - // the existing adapter there instead of adding a new one. - throw new IllegalArgumentException( - "Cannot add %s, because it is already provided by configured adapter %s" - .formatted(adapterBuilderFactory, configuredAdapterType)); - } else if (adapterBuilderFactory.supports(configuredAdapterType)) { - throw new IllegalArgumentException( - "Cannot add %s, because it provides already configured adapter %s" - .formatted(adapterBuilderFactory, configuredAdapterType)); - } else { - throw new IllegalArgumentException( - "Cannot add %s, because configured adapter %s already provides %s" - .formatted(adapterBuilderFactory, configuredAdapterType, intersection)); - } + public ModelStoreBuilder with(T adapterBuilder) { + for (var existingAdapter : adapters) { + if (existingAdapter.getClass().equals(adapterBuilder.getClass())) { + throw new IllegalArgumentException("%s adapter was already configured for store builder" + .formatted(adapterBuilder.getClass().getName())); } } - var newAdapter = adapterBuilderFactory.createBuilder(this); - adapters.add(adapterBuilderFactory, newAdapter); - return newAdapter; + adapters.add(adapterBuilder); + return this; } @Override - public Optional tryGetAdapter(ModelAdapterType adapterType) { - return adapters.tryGet(adapterType, adapterType.getModelAdapterBuilderClass()); + public Optional tryGetAdapter(Class adapterType) { + return AdapterUtils.tryGetAdapter(adapters, adapterType); } @Override - public T getAdapter(ModelAdapterType adapterType) { - return adapters.get(adapterType, adapterType.getModelAdapterBuilderClass()); + public T getAdapter(Class adapterType) { + return AdapterUtils.getAdapter(adapters, adapterType); } @Override @@ -86,13 +63,13 @@ public class ModelStoreBuilderImpl implements ModelStoreBuilder { for (var entry : equivalenceClasses.entrySet()) { createStores(stores, entry.getKey(), entry.getValue()); } - var modelStore = new ModelStoreImpl(stores, adapters.size()); for (int i = adapters.size() - 1; i >= 0; i--) { - adapters.get(i).configure(); + adapters.get(i).configure(this); } - for (var entry : adapters.withAdapterTypes()) { - var adapter = entry.adapter().createStoreAdapter(modelStore); - modelStore.addAdapter(entry.adapterType(), adapter); + var modelStore = new ModelStoreImpl(stores, adapters.size()); + for (var adapterBuilder : adapters) { + var storeAdapter = adapterBuilder.build(modelStore); + modelStore.addAdapter(storeAdapter); } return modelStore; } diff --git a/subprojects/store/src/main/java/tools/refinery/store/model/internal/ModelStoreImpl.java b/subprojects/store/src/main/java/tools/refinery/store/model/internal/ModelStoreImpl.java index bfae7181..60b735e6 100644 --- a/subprojects/store/src/main/java/tools/refinery/store/model/internal/ModelStoreImpl.java +++ b/subprojects/store/src/main/java/tools/refinery/store/model/internal/ModelStoreImpl.java @@ -5,9 +5,7 @@ */ package tools.refinery.store.model.internal; -import tools.refinery.store.adapter.AdapterList; -import tools.refinery.store.adapter.AnyModelAdapterType; -import tools.refinery.store.adapter.ModelAdapterType; +import tools.refinery.store.adapter.AdapterUtils; import tools.refinery.store.adapter.ModelStoreAdapter; import tools.refinery.store.map.DiffCursor; import tools.refinery.store.map.VersionedMapStore; @@ -21,11 +19,11 @@ import java.util.*; public class ModelStoreImpl implements ModelStore { private final Map> stores; - private final AdapterList adapters; + private final List adapters; ModelStoreImpl(Map> stores, int adapterCount) { this.stores = stores; - adapters = new AdapterList<>(adapterCount); + adapters = new ArrayList<>(adapterCount); } @Override @@ -64,9 +62,9 @@ public class ModelStoreImpl implements ModelStore { } private void adaptModel(ModelImpl model) { - for (var entry : adapters.withAdapterTypes()) { - var adapter = entry.adapter().createModelAdapter(model); - model.addAdapter(entry.adapterType(), adapter); + for (var storeAdapter : adapters) { + var adapter = storeAdapter.createModelAdapter(model); + model.addAdapter(adapter); } } @@ -91,16 +89,16 @@ public class ModelStoreImpl implements ModelStore { } @Override - public Optional tryGetAdapter(ModelAdapterType adapterType) { - return adapters.tryGet(adapterType, adapterType.getModelStoreAdapterClass()); + public Optional tryGetAdapter(Class adapterType) { + return AdapterUtils.tryGetAdapter(adapters, adapterType); } @Override - public T getAdapter(ModelAdapterType adapterType) { - return adapters.get(adapterType, adapterType.getModelStoreAdapterClass()); + public T getAdapter(Class adapterType) { + return AdapterUtils.getAdapter(adapters, adapterType); } - void addAdapter(AnyModelAdapterType adapterType, ModelStoreAdapter adapter) { - adapters.add(adapterType, adapter); + void addAdapter(ModelStoreAdapter adapter) { + adapters.add(adapter); } } -- cgit v1.2.3-70-g09d2