package com.example.mina.client.base; import java.util.List; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.ObjectProvider; import org.springframework.stereotype.Component; import org.springframework.util.Assert; /** * @author BenJin Yin * @date 2021/4/6 */ @Slf4j @Component public class ExperimentManager { private final ConcurrentMap experimentFactories = new ConcurrentHashMap<>(); private final ConcurrentMap> experiments = new ConcurrentHashMap<>(8); public ExperimentManager(ObjectProvider> factoriesProvider) { factoriesProvider.ifAvailable(obj -> obj.forEach(factory -> experimentFactories.put(factory.getExperimentType(), factory))); } public Experiment getExperiment(String experimentId) { return experiments.getOrDefault(experimentId, null); } public void startExperiment(String experimentId) { Experiment t = getExperiment(experimentId); if (t != null) { t.setRunning(true); t.start(); } } public void stopExperiment(String experimentId) { Experiment t = getExperiment(experimentId); if (t != null && t.isContinue()) { t.finish(); experiments.remove(experimentId); } } public AbstractExperimentFactory getClientFactory(String name) { return this.experimentFactories.get(name); } public Experiment getOrCreateExperiment(MatrixClient client, ExperimentOptions options) { Experiment experiment = experiments.get(options.getExperimentId()); if (experiment != null) { return experiment; } ExperimentType experimentType = options.getExperimentType(); if (!experimentFactories.containsKey(experimentType)) { log.error("the matrix type is not supported by the system! matrix type is: " + experimentType); throw new RuntimeException("the matrix type is not supported by the system! matrix type is: " + experimentType); } AbstractExperimentFactory t = experimentFactories.get(experimentType); experiment = t.createExperiment(client, options); experiments.put(options.experimentId, experiment); return experiment; } }