package org.infinispan.scripting.impl;
import java.io.Serializable;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import javax.script.Bindings;
import javax.script.SimpleBindings;
import org.infinispan.Cache;
import org.infinispan.distexec.DistributedCallable;
import org.infinispan.scripting.ScriptingManager;
/**
* DistributedScript.
*
* @author Tristan Tarrant
* @since 7.2
*/
class DistributedScript<T> implements DistributedCallable<Object, Object, T>, Serializable {
private final ScriptMetadata metadata;
private final Map<String, ?> ctxParams;
private transient ScriptingManagerImpl scriptManager;
private transient Bindings bindings;
DistributedScript(ScriptMetadata metadata, Map<String, ?> ctxParams) {
this.metadata = metadata;
this.ctxParams = ctxParams;
}
@Override
public T call() throws Exception {
return (T) (scriptManager.execute(metadata, bindings).get());
}
@Override
public void setEnvironment(Cache<Object, Object> cache, Set<Object> inputKeys) {
scriptManager = (ScriptingManagerImpl) SecurityActions.getGlobalComponentRegistry(cache.getCacheManager()).getComponent(ScriptingManager.class);
bindings = new SimpleBindings();
bindings.put("inputKeys", inputKeys);
DataTypedCacheManager dataTypedCacheManager = new DataTypedCacheManager(metadata.dataType(), Optional.empty(), cache.getCacheManager());
bindings.put("cacheManager", dataTypedCacheManager);
Cache<?, ?> c = cache.getCacheConfiguration().compatibility().enabled()
? cache : new DataTypedCache<>(dataTypedCacheManager, cache);
bindings.put("cache", c);
ctxParams.entrySet().stream().forEach(e -> bindings.put(e.getKey(), e.getValue()));
}
}