org.nuxeo.ecm.core.redis.embedded.RedisEmbeddedLuaEngine.java Source code

Java tutorial

Introduction

Here is the source code for org.nuxeo.ecm.core.redis.embedded.RedisEmbeddedLuaEngine.java

Source

/*******************************************************************************
 * 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;
    }
}