package org.infinispan.server.test.task.servertask;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import org.infinispan.Cache;
import org.infinispan.manager.EmbeddedCacheManager;
import org.infinispan.scripting.ScriptingManager;
import org.infinispan.tasks.ServerTask;
import org.infinispan.tasks.TaskContext;
/**
* Server Task executing JavaScript script.
*
* @author amanukya
*/
public class JSExecutingServerTask implements ServerTask {
public static final String NAME = "jsexecutor_task";
public static final String CACHE_NAME = "taskAccessible";
public static final String CACHE_NAME_PARAMETER = "cacheName";
private TaskContext taskContext;
@Override
public void setTaskContext(TaskContext taskContext) {
this.taskContext = taskContext;
}
@Override
public String getName() {
return NAME;
}
@Override
public Object call() throws Exception {
Cache cache = taskContext.getCache().get();
EmbeddedCacheManager cacheManager = cache.getCacheManager();
String cacheName = getCacheName();
if (taskContext.getParameters().isPresent() && taskContext.getParameters().get().get(CACHE_NAME_PARAMETER) != null) {
cacheName = (String) taskContext.getParameters().get().get(CACHE_NAME_PARAMETER);
}
Cache usedCache = cacheManager.getCache(cacheName);
ScriptingManager scriptingManager = cacheManager.getGlobalComponentRegistry().getComponent(ScriptingManager.class);
loadScript(scriptingManager, "/stream_serverTask.js");
// Running a JS script is really designed for direct remote execution,
// and hence it's expected to return a byte[] result for sending back
// to remote client.
// To deploy a Java server task that then runs a Javascript file is
// not the common case, so it makes sense for such edge cases to do
// the hard work.
byte[] result = (byte[]) scriptingManager.runScript("/stream_serverTask.js",
new TaskContext().cache(usedCache).marshaller(taskContext.getMarshaller().get())).get();
return taskContext.getMarshaller().get().objectFromByteBuffer(result);
}
public String getCacheName() {
return CACHE_NAME;
}
private void loadScript(ScriptingManager scriptingManager, String scriptName) throws IOException {
try (InputStream is = JSExecutingServerTask.class.getResourceAsStream("/" + scriptName)) {
StringBuilder sb = new StringBuilder();
BufferedReader r = new BufferedReader(new InputStreamReader(is));
for (String line = r.readLine(); line != null; line = r.readLine()) {
sb.append(line);
sb.append("\n");
}
String script = sb.toString();
scriptingManager.addScript(scriptName, script);
}
}
}