ExperimentManager.java
2.76 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
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;
}
}