package core.aws.env;
import core.aws.util.Asserts;
import core.aws.util.Lists;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.locks.ReentrantLock;
/**
* @author neo
*/
public class Context {
final Map<Param, List<String>> params = new ConcurrentHashMap<>();
private final Logger messageLogger = LoggerFactory.getLogger("message");
private final Map<String, List<String>> newOutputs = new TreeMap<>();
private final ReentrantLock lock = new ReentrantLock();
public Goal goal;
public Environment env;
public void output(String key, Object value) {
lock.lock();
try {
newOutputs.computeIfAbsent(key, k -> new ArrayList<>())
.add(String.valueOf(value));
} finally {
lock.unlock();
}
}
public List<String> params(Param key) {
return params.get(key);
}
public String param(Param key) {
List<String> params = this.params.get(key);
if (params == null) return null;
if (params.size() == 1) return params.get(0);
throw new IllegalStateException("found multiple values, key=" + key);
}
public void param(Param key, String value) {
params.computeIfAbsent(key, k -> Lists.newArrayList()).add(value);
}
public String requiredParam(Param key) {
return Asserts.notNull(param(key), "param is required, param={}", key.key);
}
void printOutputs() {
lock.lock();
try {
if (newOutputs.isEmpty()) {
messageLogger.info("\nno outputs\n");
return;
}
messageLogger.info("\noutputs:\n");
newOutputs.forEach((key, values) -> values.forEach(value -> messageLogger.info("{} => {}\n", key, value)));
} finally {
lock.unlock();
}
}
}