ExperimentManager.java 2.76 KB
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<T extends AbstractExperimentFactory> {
    private final ConcurrentMap<ExperimentType, AbstractExperimentFactory> experimentFactories = new ConcurrentHashMap<>();

    private final ConcurrentMap<String, Experiment<? extends MatrixClient, ? extends ExperimentOptions>> experiments
            = new ConcurrentHashMap<>(8);

    public ExperimentManager(ObjectProvider<List<? extends AbstractExperimentFactory>> factoriesProvider) {
        factoriesProvider.ifAvailable(obj ->
                obj.forEach(factory -> experimentFactories.put(factory.getExperimentType(), factory)));
    }

    public Experiment<? extends MatrixClient, ? extends ExperimentOptions> getExperiment(String experimentId) {
        return experiments.getOrDefault(experimentId, null);
    }

    public void startExperiment(String experimentId) {
        Experiment<? extends MatrixClient, ? extends ExperimentOptions> t = getExperiment(experimentId);
        if (t != null) {
            t.setRunning(true);
            t.start();
        }
    }

    public void stopExperiment(String experimentId) {
        Experiment<? extends MatrixClient, ? extends ExperimentOptions> 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<? extends MatrixClient, ? extends ExperimentOptions> getOrCreateExperiment(MatrixClient client, ExperimentOptions options) {
        Experiment<? extends MatrixClient, ? extends ExperimentOptions> 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;
    }

}