
com.ajjpj.asysmon.servlet.environment.AEnvVarPageDefinition Maven / Gradle / Ivy
package com.ajjpj.asysmon.servlet.environment;
import com.ajjpj.abase.collection.immutable.AList;
import com.ajjpj.abase.io.AJsonSerHelper;
import com.ajjpj.asysmon.ASysMonApi;
import com.ajjpj.asysmon.config.presentation.APresentationPageDefinition;
import com.ajjpj.asysmon.measure.environment.AEnvironmentData;
import java.io.IOException;
import java.util.*;
/**
* @author arno
*/
public class AEnvVarPageDefinition implements APresentationPageDefinition {
private final List unsortedPathMatchers;
private volatile ASysMonApi sysMon;
public AEnvVarPageDefinition(String unsortedPaths) {
unsortedPathMatchers = PathMatcher.create(unsortedPaths);
}
@Override public String getId() {
return "env";
}
@Override public String getShortLabel() {
return "Environment";
}
@Override public String getFullLabel() {
return "System Environment";
}
@Override public String getHtmlFileName() {
return "envvar.html";
}
@Override public String getControllerName() {
return "CtrlEnvVar";
}
@Override public boolean handleRestCall(String service, List params, AJsonSerHelper json) throws Exception {
if("getData".equals(service)) {
serveData(json);
return true;
}
return false;
}
private void serveData(AJsonSerHelper json) throws Exception {
json.startObject();
json.writeKey("envTree");
writeEnvListRec(json, getData());
json.endObject();
}
private void writeEnvListRec(AJsonSerHelper json, Collection coll) throws IOException {
json.startArray();
for(EnvData data: coll) {
json.startObject();
json.writeKey("name");
json.writeStringLiteral(data.segment);
if(data.value != null) {
json.writeKey("value");
json.writeStringLiteral(data.value);
}
if(! data.children.isEmpty()) {
json.writeKey("children");
writeEnvListRec(json, data.children);
}
json.endObject();
}
json.endArray();
}
private Collection getData() throws Exception {
final List raw = sysMon.getEnvironmentMeasurements();
final SortedSet result = new TreeSet();
for(AEnvironmentData data: raw) {
mergeIntoExisting(result, data.getName(), data.getValue(), AList.nil());
}
return result;
}
private void mergeIntoExisting(Collection existing, AList key, String value, AList keyPrefix) {
if(key.tail().isEmpty()) {
findOrCreateMatch(existing, key.head(), keyPrefix).value = value;
}
else {
mergeIntoExisting(findOrCreateMatch(existing, key.head(), keyPrefix).children, key.tail(), value, keyPrefix.cons(key.head()));
}
}
private EnvData findOrCreateMatch(Collection existing, String name, AList keyPrefix) {
for(EnvData candidate: existing) {
if(name.equals(candidate.segment)) {
return candidate;
}
}
final EnvData result = new EnvData(name, isSorted(keyPrefix, name));
existing.add(result);
return result;
}
private boolean isSorted(AList keyPrefix, String name) {
final AList effectiveKey = keyPrefix.cons(name).reverse();
for(PathMatcher m: unsortedPathMatchers) {
if(m.matches(effectiveKey)) {
return false;
}
}
return true;
}
@Override public void init(ASysMonApi sysMon) {
this.sysMon = sysMon;
}
private static class EnvData implements Comparable {
public final String segment;
public String value; // may be null
public final Collection children;
private EnvData(String segment, boolean sorted) {
children = sorted ? new TreeSet() : new ArrayList();
this.segment = segment;
}
@Override public int compareTo(EnvData o) {
return segment.compareTo(o.segment);
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy