import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.zeromq.ZMQ;
class ConcoreJavaRuntimeCore {
private Map iport = new HashMap<>();
private Map oport = new HashMap<>();
private String s = "";
private String olds = "";
private int delay = 1000;
private int retrycount = 0;
private int maxRetries = 5;
private String inpath;
private String outpath;
private final boolean suffixPortPath;
private Map params = new HashMap<>();
private Map zmqPorts = new HashMap<>();
private ZMQ.Context zmqContext = null;
private double simtime = 0;
private double maxtime;
ConcoreJavaRuntimeCore(String inpath, String outpath, boolean suffixPortPath) {
this.inpath = inpath;
this.outpath = outpath;
this.suffixPortPath = suffixPortPath;
initialize();
}
private void initialize() {
try {
iport = parseFile("concore.iport");
} catch (IOException e) {
}
try {
oport = parseFile("concore.oport");
} catch (IOException e) {
}
try {
String paramsFile = Paths.get(portPath(inpath, 1), "concore.params").toString();
String sparams = new String(Files.readAllBytes(Paths.get(paramsFile)), java.nio.charset.StandardCharsets.UTF_8);
if (sparams.length() > 0 && sparams.charAt(0) == '"') {
sparams = sparams.substring(1);
sparams = sparams.substring(0, sparams.indexOf('"'));
}
params = parseParams(sparams);
} catch (IOException e) {
params = new HashMap<>();
}
defaultMaxTime(100);
}
private String portPath(String base, int portNum) {
if (suffixPortPath) {
return base + portNum;
}
return Paths.get(base, String.valueOf(portNum)).toString();
}
private Path resolvePortFilePath(String base, int portNum, String name) throws IOException {
Path portDir = Paths.get(portPath(base, portNum)).toAbsolutePath().normalize();
Path filePath = portDir.resolve(name).normalize();
if (!filePath.startsWith(portDir)) {
throw new IOException("Invalid file name '" + name + "' for port " + portNum);
}
return filePath;
}
private static Map parseParams(String sparams) {
Map result = new HashMap<>();
if (sparams == null || sparams.isEmpty()) return result;
String trimmed = sparams.trim();
if (trimmed.startsWith("{") && trimmed.endsWith("}")) {
try {
Object val = literalEval(trimmed);
if (val instanceof Map) {
@SuppressWarnings("unchecked")
Map map = (Map) val;
return map;
}
} catch (Exception e) {
}
}
for (String item : trimmed.split(";")) {
if (item.contains("=")) {
String[] parts = item.split("=", 2);
String key = parts[0].trim();
String value = parts[1].trim();
try {
result.put(key, literalEval(value));
} catch (Exception e) {
result.put(key, value);
}
}
}
return result;
}
private static Map parseFile(String filename) throws IOException {
String content = new String(Files.readAllBytes(Paths.get(filename)), java.nio.charset.StandardCharsets.UTF_8);
content = content.trim();
if (content.isEmpty()) {
return new HashMap<>();
}
try {
Object result = literalEval(content);
if (result instanceof Map) {
@SuppressWarnings("unchecked")
Map map = (Map) result;
return map;
}
} catch (IllegalArgumentException e) {
System.err.println("Failed to parse file as map: " + filename + " (" + e.getMessage() + ")");
}
return new HashMap<>();
}
void setInPath(String path) { inpath = path; }
void setOutPath(String path) { outpath = path; }
void setDelay(int ms) { delay = ms; }
double getSimtime() { return simtime; }
void resetState() { s = ""; olds = ""; simtime = 0; }
boolean unchanged() {
if (olds.equals(s)) {
s = "";
return true;
}
olds = s;
return false;
}
Object tryParam(String n, Object i) {
if (params.containsKey(n)) {
return params.get(n);
}
return i;
}
void defaultMaxTime(double defaultValue) {
try {
String maxtimeFile = Paths.get(portPath(inpath, 1), "concore.maxtime").toString();
String content = new String(Files.readAllBytes(Paths.get(maxtimeFile)));
Object parsed = literalEval(content.trim());
if (parsed instanceof Number) {
maxtime = ((Number) parsed).doubleValue();
} else {
maxtime = defaultValue;
}
} catch (IOException | RuntimeException e) {
maxtime = defaultValue;
}
}
ReadResult readFilePort(int port, String name, String initstr) {
List