package org.infinispan.server.infinispan.task; import java.io.Serializable; import java.util.Map; import java.util.Optional; import java.util.Set; import org.infinispan.Cache; import org.infinispan.commons.marshall.Marshaller; import org.infinispan.commons.marshall.StreamingMarshaller; import org.infinispan.distexec.DistributedCallable; import org.infinispan.factories.GlobalComponentRegistry; import org.infinispan.tasks.TaskContext; /** * Author: Michal Szynkiewicz, michal.l.szynkiewicz@gmail.com * Date: 1/28/16 * Time: 1:49 PM */ public class DistributedServerTask<T> implements Serializable, DistributedCallable<Object, Object, T> { private final Optional<Map<String, ?>> parameters; private final String taskName; private transient ServerTaskRegistry taskRegistry; private transient Marshaller marshaller; private transient Cache<Object, Object> cache; public DistributedServerTask(String taskName, Optional<Map<String, ?>> parameters) { this.taskName = taskName; this.parameters = parameters; } @Override public void setEnvironment(Cache<Object, Object> cache, Set<Object> inputKeys) { this.cache = cache; // todo inject global component registry to be independent of existence of cache. GlobalComponentRegistry componentRegistry = cache.getCacheManager().getGlobalComponentRegistry(); taskRegistry = componentRegistry.getComponent(ServerTaskRegistry.class); marshaller = componentRegistry.getComponent(StreamingMarshaller.class); } @Override public T call() throws Exception { ServerTaskWrapper<T> task = taskRegistry.getTask(taskName); task.inject(prepareContext()); return task.run(); } private TaskContext prepareContext() { TaskContext context = new TaskContext(); if (parameters.isPresent()) context.parameters(parameters.get()); if (cache != null) context.cache(cache); if (marshaller != null) context.marshaller(marshaller); return context; } }