package glug.groovy;
import com.google.common.collect.LinkedListMultimap;
import com.google.common.collect.ListMultimap;
import glug.parser.logmessages.GroovyDrivenLogMessageParser;
import glug.parser.logmessages.JVMUptimeParser;
import glug.parser.logmessages.LogMessageParser;
import glug.parser.logmessages.LogMessageParserRegistry;
import groovy.lang.Binding;
import groovy.lang.GroovyCodeSource;
import groovy.lang.GroovyShell;
import org.joda.time.Duration;
import java.io.UnsupportedEncodingException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.List;
import static com.google.common.collect.Lists.newArrayList;
import static java.net.URLDecoder.decode;
public class ParserDefLoader {
public LogMessageParserRegistry load(GroovyCodeSource groovyCodeSource) {
RegistrationFunction registration = new RegistrationFunction();
GroovyShell shell = new GroovyShell(standardBinding(registration));
shell.evaluate(groovyCodeSource);
return registration.getLogMessageParserRegistry();
}
private Binding standardBinding(RegistrationFunction registration) {
Binding binding = new Binding();
binding.setProperty("register", registration);
binding.setProperty("durationInMillis",new HandyDurationFromTextConverterFunction());
binding.setProperty("urlParams",new UrlParamsFunction());
return binding;
}
public class RegistrationFunction {
private List<LogMessageParser> parsers = newArrayList((LogMessageParser)new JVMUptimeParser());
public void call(ParserDef... things) {
for (ParserDef parserDef : things) {
parsers.add(new GroovyDrivenLogMessageParser(parserDef));
}
System.out.println("Yep "+parsers);
}
public LogMessageParserRegistry getLogMessageParserRegistry() {
return new LogMessageParserRegistry(parsers);
}
}
public class HandyDurationFromTextConverterFunction {
public Duration call(String text) {
return new Duration(Integer.parseInt(text));
}
}
public class UrlParamsFunction {
public ListMultimap<String,String> call(String uriString) throws URISyntaxException, UnsupportedEncodingException {
URI uri = new URI(uriString);
String queryString = uri.getRawQuery();
ListMultimap<String,String> params = LinkedListMultimap.create();
if (queryString!=null) {
for (String keyValue : queryString.split("&")) {
String[] items = keyValue.split("=");
if (items.length==2) {
params.put(decode(items[0],"UTF-8"),decode(items[1],"UTF-8"));
}
}
}
return params;
}
}
}