Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 9 additions & 6 deletions main/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,8 @@
<artifactId>butterfly-container</artifactId>
<version>1.2.7-SNAPSHOT</version>
</parent>

<groupId>org.openrefine.dependencies</groupId>

<artifactId>butterfly</artifactId>
<version>1.2.7-SNAPSHOT</version>

<name>SIMILE Butterfly Engine</name>
<url>https://github.com/OpenRefine/simile-butterfly/</url>
Expand Down Expand Up @@ -81,9 +79,14 @@

<dependencies>
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.2</version>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.4</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-configuration2</artifactId>
<version>2.10.1</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
Expand Down
145 changes: 70 additions & 75 deletions main/src/edu/mit/simile/butterfly/Butterfly.java
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,11 @@
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.collections.ExtendedProperties;
import org.apache.commons.configuration2.AbstractConfiguration;
import org.apache.commons.configuration2.CombinedConfiguration;
import org.apache.commons.configuration2.PropertiesConfiguration;
import org.apache.commons.configuration2.ex.ConfigurationException;
import org.apache.commons.configuration2.tree.OverrideCombiner;
import org.apache.velocity.app.VelocityEngine;
import org.apache.velocity.runtime.RuntimeConstants;
import org.mozilla.javascript.Context;
Expand Down Expand Up @@ -156,7 +160,7 @@ public static boolean isGAE(ServletConfig config) {
transient protected ServletContext _context;
transient protected ButterflyMounter _mounter;

protected ExtendedProperties _properties;
protected PropertiesConfiguration _properties;
protected File _contextDir;
protected File _homeDir;
protected File _webInfDir;
Expand Down Expand Up @@ -188,55 +192,38 @@ public void init(ServletConfig config) throws ServletException {

_contextDir = new File(_context.getRealPath("/"));
_webInfDir = new File(_contextDir, "WEB-INF");
_properties = new ExtendedProperties();
_properties = new PropertiesConfiguration();
_mounter = new ButterflyMounter();

// Load the butterfly properties
String props = System.getProperty("butterfly.properties");
File butterflyProperties = (props == null) ? new File(_webInfDir, "butterfly.properties") : new File(props);

BufferedInputStream is = null;
try {
is = new BufferedInputStream(new FileInputStream(butterflyProperties));
_properties.load(is);
} catch (FileNotFoundException e) {
try (BufferedInputStream is = new BufferedInputStream(Files.newInputStream(butterflyProperties.toPath()))){
_properties.read(new InputStreamReader(is, StandardCharsets.UTF_8));
} catch (IOException|ConfigurationException e) {
throw new ServletException("Could not find butterfly properties file",e);
} catch (IOException e) {
throw new ServletException("Could not read butterfly properties file",e);
} finally {
try {
is.close();
} catch (Exception e) {
// ignore
}
}

// Process eventual properties includes
String includes = _properties.getString("butterfly.includes");
if (includes != null) {
for (String prop : includes.split(",")) {
File prop_file = (prop.startsWith("/")) ? new File(prop) : new File(_webInfDir, prop);
try {
is = new BufferedInputStream(new FileInputStream(prop_file));
ExtendedProperties p = new ExtendedProperties();
p.load(is);
_properties.combine(p);
} catch (Exception e) {
// ignore
} finally {
try {
is.close();
} catch (Exception e) {
// ignore
}
try (BufferedInputStream is = new BufferedInputStream(Files.newInputStream(prop_file.toPath()))){
PropertiesConfiguration p = new PropertiesConfiguration();
p.read(new InputStreamReader(is, StandardCharsets.UTF_8));
_properties.append(p);
} catch (ConfigurationException | IOException e) {
_logger.warn("Error loading included properties file: " + prop_file, e);
}
}
}
// Overload with properties set from the command line
// using the -Dkey=value parameters to the JVM
Properties systemProperties = System.getProperties();
for (Iterator<Object> i = systemProperties.keySet().iterator(); i.hasNext(); ) {
String key = (String) i.next();
for (Object o : systemProperties.keySet()) {
String key = (String) o;
String value = systemProperties.getProperty(key);
_properties.setProperty(key, value);
}
Expand Down Expand Up @@ -326,8 +313,7 @@ public void configure() {
}
_logger.info("Butterfly home: {}", _homeDir);

Iterator<String> i = _properties.getKeys(ZONE);
while (i.hasNext()) {
for(Iterator<String> i = _properties.getKeys(ZONE); i.hasNext(); ) {
String zone = i.next();
String path = _properties.getString(zone);
zone = zone.substring(ZONE.length() + 1);
Expand Down Expand Up @@ -373,7 +359,7 @@ public void configure() {

_logger.info("> load modules");
// load modules from the properties found in the butterfly.properties
List<String> paths = _properties.getList(MODULES_PATH);
List<String> paths = _properties.getList(String.class, MODULES_PATH);
for (String path : paths) {
findModulesIn(absolutize(_homeDir, path.trim()));
}
Expand All @@ -394,16 +380,15 @@ public void configure() {
_logger.info("< create modules");

_logger.info("> load module wirings");
ExtendedProperties wirings = new ExtendedProperties();
try {
// Load the wiring properties
File moduleWirings = absolutize(_homeDir, _properties.getString("butterfly.modules.wirings","WEB-INF/modules.properties"));
_logger.info("Loaded module wirings from: {}", moduleWirings);
_classLoader.watch(moduleWirings); // reload if the module wirings change
FileInputStream fis = new FileInputStream(moduleWirings);
wirings.load(fis);
fis.close();
} catch (Exception e) {
PropertiesConfiguration wirings = new PropertiesConfiguration();

// Load the wiring properties
File moduleWirings = absolutize(_homeDir, _properties.getString("butterfly.modules.wirings","WEB-INF/modules.properties"));
_logger.info("Loaded module wirings from: {}", moduleWirings);
_classLoader.watch(moduleWirings); // reload if the module wirings change
try (FileInputStream fis = new FileInputStream(moduleWirings)) {
wirings.read(new InputStreamReader(fis, StandardCharsets.UTF_8));
} catch (IOException | ConfigurationException e) {
_configurationException = new Exception("Failed to load module wirings", e);
}
_logger.info("< load module wirings");
Expand Down Expand Up @@ -526,7 +511,7 @@ public void service(HttpServletRequest request, HttpServletResponse response) th

protected Map<String,ButterflyModule> _modulesByName = new HashMap<String,ButterflyModule>();
protected Map<String,Map<String,ButterflyModule>> _modulesByInterface = new HashMap<String,Map<String,ButterflyModule>>();
protected Map<String,ExtendedProperties> _moduleProperties = new HashMap<String,ExtendedProperties>();
protected Map<String,AbstractConfiguration> _moduleProperties = new HashMap<String,AbstractConfiguration>();
protected Map<String,Boolean> _created = new HashMap<String,Boolean>();

final static private String routingCookie = "host";
Expand Down Expand Up @@ -573,13 +558,13 @@ protected void findModulesIn(File f) {
try {
String name = f.getName();

ExtendedProperties p = new ExtendedProperties();
PropertiesConfiguration p = new PropertiesConfiguration();
File propFile = new File(modFile,"module.properties");
if (propFile.exists()) {
_classLoader.watch(propFile); // reload if the the module properties change
BufferedInputStream stream = new BufferedInputStream(new FileInputStream(propFile));
p.load(stream);
stream.close();
_classLoader.watch(propFile); // reload if the module properties change
try (BufferedInputStream stream = new BufferedInputStream(Files.newInputStream(propFile.toPath()))) {
p.read(new InputStreamReader(stream, StandardCharsets.UTF_8));
}
}

p.addProperty(PATH_PROP, f.getAbsolutePath());
Expand Down Expand Up @@ -624,7 +609,7 @@ protected ButterflyModule createModule(String name) {
return _modulesByName.get(name);
}

ExtendedProperties p = _moduleProperties.get(name);
AbstractConfiguration p = _moduleProperties.get(name);
File path = new File(p.getString(PATH_PROP));
_logger.debug("Module path: {}", path);

Expand Down Expand Up @@ -685,8 +670,7 @@ protected ButterflyModule createModule(String name) {
return m;
}

@SuppressWarnings("unchecked")
protected void wireModules(ExtendedProperties wirings) {
protected void wireModules(PropertiesConfiguration wirings) {
_logger.trace("> wireModules()");

_logger.info("mounting modules");
Expand Down Expand Up @@ -714,21 +698,32 @@ protected void wireModules(ExtendedProperties wirings) {
for (String name : _moduleProperties.keySet()) {
_logger.trace("> Expanding properties for module: {}", name);
ButterflyModule m = _modulesByName.get(name);
ExtendedProperties p = _moduleProperties.get(name);
ButterflyModule extended = m.getExtendedModule();

// Highest priority properties need to be added first, so we need to collect them all first
List<AbstractConfiguration> propertiesList = new ArrayList<>();
propertiesList.add(_moduleProperties.get(name));
while (extended != null) {
_logger.trace("> Merging properties from extended module: {}", name);
ExtendedProperties temp = p;
p = _moduleProperties.get(extended.getName());
p.combine(temp);
AbstractConfiguration p = _moduleProperties.get(extended.getName());
propertiesList.add(p);
_logger.trace("< Merging properties from extended module: {} -> {}", name, p);
extended = extended.getExtendedModule();
}
AbstractConfiguration p;
if (propertiesList.size() == 1) {
p = propertiesList.get(0);
} else {
p = new CombinedConfiguration(new OverrideCombiner());
// Add files in reverse order to maintain priority
for (int i = propertiesList.size() - 1; i >= 0; i--) {
((CombinedConfiguration) p).addConfiguration(propertiesList.get(i));
}
}

_moduleProperties.put(name,p);
_moduleProperties.put(name, p);

List<String> implementations = p.getList(implementsProperty);
List<String> implementations = p.getList(String.class, implementsProperty);
if (implementations != null) {
for (String i : implementations) {
Map<String, ButterflyModule> map = _modulesByInterface.get(i);
Expand All @@ -745,11 +740,11 @@ protected void wireModules(ExtendedProperties wirings) {

for (String name : _moduleProperties.keySet()) {
_logger.trace("> Inject dependencies in module: {}", name);
ExtendedProperties p = _moduleProperties.get(name);
AbstractConfiguration p = _moduleProperties.get(name);
ButterflyModule m = _modulesByName.get(name);

for (Object o : p.keySet()) {
String s = (String) o;
for (Iterator<String> keys = p.getKeys(); keys.hasNext(); ) {
String s = keys.next();
if (s.equals(dependencyPrefix)) {
for (Object oo : p.getList(s)) {
String dep = (String) oo;
Expand Down Expand Up @@ -800,12 +795,12 @@ protected void wireModules(ExtendedProperties wirings) {
_logger.trace("< wireModules()");
}

@SuppressWarnings("unchecked")

protected void configureModules() {
_logger.trace("> configureModules()");
for (String name : _moduleProperties.keySet()) {
_logger.trace("> Configuring module: {}", name);
ExtendedProperties p = _moduleProperties.get(name);
AbstractConfiguration p = _moduleProperties.get(name);
ButterflyModule m = _modulesByName.get(name);

// make the system properties accessible to the modules
Expand All @@ -818,16 +813,16 @@ protected void configureModules() {
Properties properties = new Properties();
File velocityProperties = new File(_webInfDir, "velocity.properties");
_classLoader.watch(velocityProperties); // reload if the velocity properties change
FileInputStream fis = new FileInputStream(velocityProperties);
properties.load(fis);
fis.close();
try (FileInputStream fis = new FileInputStream(velocityProperties)) {
properties.load(fis);
}

// set properties for resource loading
properties.setProperty("resource.loader", "butterfly");
properties.setProperty("butterfly.resource.loader.class", ButterflyResourceLoader.class.getName());
properties.setProperty("butterfly.resource.loader.cache", "true");
properties.setProperty("butterfly.resource.loader.modificationCheckInterval", "1");
properties.setProperty("butterfly.resource.loader.description", "Butterfly Resource Loader");
properties.setProperty("resource.loaders", "butterfly");
properties.setProperty("resource.loader.butterfly.class", ButterflyResourceLoader.class.getName());
properties.setProperty("resource.loader.butterfly.cache", "true");
properties.setProperty("resource.loader.butterfly.modification_check_interval", "1");
properties.setProperty("resource.loader.butterfly.description", "Butterfly Resource Loader");

// set properties for macros
properties.setProperty("velocimacro.library.path", p.getString("templating.macros", ""));
Expand All @@ -854,8 +849,8 @@ protected void configureModules() {
_logger.trace("< enabling templating");
}

List<String> scriptables = p.getList("scriptables");
if (scriptables.size() > 0) {
List<String> scriptables = p.getList(String.class, "scriptables");
if (scriptables != null && !scriptables.isEmpty()) {
Context context = Context.enter();

BufferedReader initializerReader = null;
Expand Down Expand Up @@ -887,7 +882,7 @@ protected void configureModules() {
Context.exit();
}

List<String> controllers = p.getList("controller", CONTROLLER);
List<String> controllers = p.getList(String.class, "controller", CONTROLLER);
Set<URL> controllerURLs = new HashSet<URL>(controllers.size());
for (String controller : controllers) {
URL controllerURL = m.getResource("MOD-INF/" + controller);
Expand Down
6 changes: 3 additions & 3 deletions main/src/edu/mit/simile/butterfly/ButterflyModule.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.collections.ExtendedProperties;
import org.apache.commons.configuration2.FileBasedConfiguration;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.VelocityEngine;
import org.mozilla.javascript.Context;
Expand Down Expand Up @@ -65,7 +65,7 @@ public interface ButterflyModule {

public void setTemplateEngine(VelocityEngine velocity);

public void setProperties(ExtendedProperties properties);
public void setProperties(FileBasedConfiguration properties);

public void setTimer(Timer timer);

Expand All @@ -77,7 +77,7 @@ public interface ButterflyModule {

public String getName();

public ExtendedProperties getProperties();
public FileBasedConfiguration getProperties();

public File getPath();

Expand Down
Loading
Loading