package com.aperture_software.glados_wiki.config;
import com.google.common.base.Optional;
import com.google.common.base.Strings;
import com.google.common.io.Closer;
import groovy.lang.Binding;
import groovy.lang.GroovyShell;
import groovy.util.ResourceException;
import groovy.util.ScriptException;
import org.apache.commons.configuration.CompositeConfiguration;
import org.apache.commons.configuration.EnvironmentConfiguration;
import org.apache.commons.configuration.JNDIConfiguration;
import org.apache.commons.configuration.SystemConfiguration;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.vfs2.FileObject;
import org.apache.commons.vfs2.FileSystemManager;
import org.apache.commons.vfs2.VFS;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.naming.NamingException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
/**
* Created by jhyun on 14. 1. 12.
*/
public class GroovyConfigurer {
private static Logger LOG = LoggerFactory.getLogger(GroovyConfigurer.class);
private WikiConfig wikiConfig;
private FileSystemManager fsManager = VFS.getManager();
public GroovyConfigurer() throws Exception {
runGroovyScript("res:com/aperture_software/glados_wiki/wiki-config.groovy", "DEFAULT-CONFIG");
//
Optional<String> userConfigFilename = getUserConfigFilename();
if (userConfigFilename.isPresent()) {
runGroovyScript(userConfigFilename.get(), "LOCAL-CONFIG");
}
}
private Optional<String> getUserConfigFilename() throws NamingException {
CompositeConfiguration cc = new CompositeConfiguration();
JNDIConfiguration jndi = new JNDIConfiguration();
EnvironmentConfiguration env = new EnvironmentConfiguration();
SystemConfiguration jvm = new SystemConfiguration();
cc.addConfiguration(jvm);
cc.addConfiguration(env);
cc.addConfiguration(jndi);
//
final String CONFIG_FILENAME = (String) cc.getProperty("gladosWiki_configFile");
if (false == Strings.isNullOrEmpty(CONFIG_FILENAME)) {
LOG.debug(String.format("LOCAL-CONFIG CONFIG_FILENAME = %s", CONFIG_FILENAME));
return Optional.of(CONFIG_FILENAME);
} else {
return Optional.absent();
}
}
public WikiConfig getWikiConfig() {
return wikiConfig;
}
public void setWikiConfig(WikiConfig wikiConfig) {
this.wikiConfig = wikiConfig;
}
private WikiConfig runGroovyScript(final String vfsFilename, final String phaseName) throws ResourceException, ScriptException, IOException {
LOG.debug(String.format("VFS-RESOLVE [%s] ...", vfsFilename));
FileObject f = fsManager.resolveFile(vfsFilename);
if (f.exists() == false) {
LOG.warn(String.format("VFS-FILE NOT FOUND!!! [%s]", vfsFilename));
//
return null;
}
URL u = f.getURL();
Closer closer = Closer.create();
try {
InputStream in = u.openStream();
closer.register(in);
InputStreamReader reader = new InputStreamReader(in);
closer.register(reader);
//
Binding binding = new Binding();
binding.setVariable("wikiConfig", wikiConfig);
//
GroovyShell shell = new GroovyShell(binding);
shell.evaluate(reader, vfsFilename);
//
wikiConfig = (WikiConfig) binding.getVariable("wikiConfig");
LOG.debug(String.format("WIKI-CONFIG (%s) = %s", phaseName, ObjectUtils.toString(wikiConfig)));
//
return wikiConfig;
} finally {
closer.close();
}
}
}