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(); } } }