/*******************************************************************************
* Copyright (c) 2006-2014 Nuxeo SA (http://nuxeo.com/) and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
******************************************************************************/
package org.nuxeo.ecm.core.redis.embedded;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.script.Bindings;
import javax.script.CompiledScript;
import javax.script.ScriptException;
import org.apache.commons.codec.binary.Hex;
import org.luaj.vm2.LuaValue;
import org.luaj.vm2.script.LuaScriptEngine;
import org.luaj.vm2.script.LuaScriptEngineFactory;
import org.luaj.vm2.script.LuajContext;
import org.nuxeo.ecm.core.api.NuxeoException;
public class RedisEmbeddedLuaEngine {
protected final Map<String, CompiledScript> binaries = new HashMap<>();
protected final LuaScriptEngine engine;
public RedisEmbeddedLuaEngine(RedisEmbeddedConnection connection) {
engine = initEngine(connection);
}
public String load(String content) throws ScriptException {
String md5 = md5(content);
CompiledScript chunk = null;
try {
chunk = engine.compile(content);
} catch (ScriptException cause) {
throw cause;
}
binaries.put(md5, chunk);
return md5;
}
protected LuaScriptEngine initEngine(RedisEmbeddedConnection connection) {
LuaScriptEngine engine = (LuaScriptEngine) new LuaScriptEngineFactory().getScriptEngine();
LuajContext context = (LuajContext) engine.getContext();
LuaValue redis = context.globals.load(new RedisEmbeddedLuaLibrary(connection));
context.globals.set("redis", redis);
return engine;
}
protected String md5(String content) {
MessageDigest sha = null;
try {
sha = MessageDigest.getInstance("SHA");
} catch (NoSuchAlgorithmException cause) {
throw new NuxeoException("Cannot load sha digester", cause);
}
byte[] key = sha.digest(content.getBytes());
return Hex.encodeHexString(key);
}
public boolean exists(String key) {
return binaries.containsKey(key);
}
public void flush() {
binaries.clear();
}
public Object evalsha(String sha, List<String> keys, List<String> args)
throws ScriptException {
final CompiledScript script = binaries.get(sha);
Bindings bindings = engine.createBindings();
bindings.put("KEYS", keys.toArray(new String[keys.size()]));
bindings.put("ARGV", args.toArray(new String[args.size()]));
Object result = script.eval(bindings);
if (result instanceof LuaValue) {
LuaValue value = (LuaValue) result;
if (value.isboolean() && value.toboolean() == false) {
return null;
}
return value.tojstring();
}
return result;
}
}