package org.n3r.eql.mtcp.utils;
import com.google.common.collect.Maps;
import org.n3r.eql.spec.Spec;
import org.n3r.eql.spec.SpecParser;
import org.n3r.eql.util.O;
import java.util.HashMap;
import java.util.Map;
public class Mtcps {
public static <T> T createObjectBySpec(String specString, Class<T> assignableClass) {
try {
Spec spec = SpecParser.parseSpecLeniently(specString);
return O.createObject(assignableClass, spec);
} catch (Exception e) {
throw new RuntimeException("failed to create object for spec " + specString, e);
}
}
public static Map<String, String> merge(Map<String, String> params, Map<String, String> merged) {
HashMap<String, String> props = Maps.newHashMap(params);
props.putAll(merged);
return props;
}
public static String interpret(String template, Map<String, String> params) {
StringBuilder parsed = new StringBuilder();
int fromIndex = 0;
int size = template.length();
while (fromIndex < size) {
int leftBracePos = template.indexOf('{', fromIndex);
int leftBracketPos = template.indexOf('[', fromIndex);
// none { or [ found
if (leftBracePos == -1 && leftBracketPos == -1) {
parsed.append(template.substring(fromIndex));
break;
}
// first { found
if (leftBracePos != -1 && (leftBracketPos == -1 || leftBracePos < leftBracketPos)) {
int rightBracePos = template.indexOf('}', leftBracePos + 1);
if (rightBracePos == -1) throw new RuntimeException("bad format of template " + template);
String requiredProp = template.substring(leftBracePos + 1, rightBracePos);
String paramValue = params.remove(requiredProp);
if (paramValue == null) throw new RuntimeException(requiredProp + " is required");
parsed.append(template.substring(fromIndex, leftBracePos));
fromIndex = rightBracePos + 1;
parsed.append(paramValue);
continue;
}
// first [ found
if ((leftBracePos == -1 || leftBracePos > leftBracketPos) && leftBracketPos != -1) {
int rightBracePos = template.indexOf(']', leftBracePos + 1);
if (rightBracePos == -1) throw new RuntimeException("bad format of template " + template);
String optionedProps = template.substring(leftBracketPos + 1, rightBracePos);
String[] usedProps = optionedProps.split(",");
StringBuilder usedPropsExpr = new StringBuilder();
for (String usedProp : usedProps) {
String propValue = params.remove(usedProp);
if (propValue != null) {
if (usedPropsExpr.length() > 0) usedPropsExpr.append('&');
usedPropsExpr.append(usedProp).append("=").append(propValue);
}
}
parsed.append(template.substring(fromIndex, leftBracketPos));
fromIndex = rightBracePos + 1;
parsed.append(usedPropsExpr);
continue;
}
}
return parsed.toString();
}
}