package io.lumify.core.model.longRunningProcess;
import com.google.inject.Inject;
import io.lumify.core.bootstrap.InjectHelper;
import io.lumify.core.config.Configuration;
import io.lumify.core.exception.LumifyException;
import io.lumify.core.model.user.UserRepository;
import io.lumify.core.model.workQueue.WorkQueueRepository;
import io.lumify.core.user.User;
import io.lumify.core.util.LumifyLogger;
import io.lumify.core.util.LumifyLoggerFactory;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class LongRunningProcessRunner {
private static final LumifyLogger LOGGER = LumifyLoggerFactory.getLogger(LongRunningProcessRunner.class);
private UserRepository userRepository;
private LongRunningProcessRepository longRunningProcessRepository;
private WorkQueueRepository workQueueRepository;
private User user;
private Configuration configuration;
private List<LongRunningProcessWorker> workers = new ArrayList<>();
public void prepare(Map map) {
prepareUser(map);
prepareWorkers(map);
}
private void prepareUser(Map map) {
this.user = (User) map.get("user");
if (this.user == null) {
this.user = this.userRepository.getSystemUser();
}
}
private void prepareWorkers(Map map) {
LongRunningWorkerPrepareData workerPrepareData = new LongRunningWorkerPrepareData(
map,
this.user,
InjectHelper.getInjector());
for (LongRunningProcessWorker worker : InjectHelper.getInjectedServices(LongRunningProcessWorker.class, configuration)) {
try {
worker.prepare(workerPrepareData);
} catch (Exception ex) {
throw new LumifyException("Could not prepare graph property worker " + worker.getClass().getName(), ex);
}
workers.add(worker);
}
}
public void process(JSONObject longRunningProcessQueueItem) {
LOGGER.info("process long running queue item %s", longRunningProcessQueueItem.toString());
for (LongRunningProcessWorker worker : workers) {
if (worker.isHandled(longRunningProcessQueueItem)) {
try {
longRunningProcessQueueItem.put("startTime", System.currentTimeMillis());
longRunningProcessQueueItem.put("progress", 0.0);
longRunningProcessRepository.beginWork(longRunningProcessQueueItem);
workQueueRepository.broadcastLongRunningProcessChange(longRunningProcessQueueItem);
worker.process(longRunningProcessQueueItem);
longRunningProcessQueueItem.put("endTime", System.currentTimeMillis());
longRunningProcessQueueItem.put("progress", 1.0);
longRunningProcessRepository.ack(longRunningProcessQueueItem);
workQueueRepository.broadcastLongRunningProcessChange(longRunningProcessQueueItem);
} catch (Throwable ex) {
LOGGER.error("Failed to process long running process queue item", ex);
longRunningProcessQueueItem.put("error", ex.getMessage());
longRunningProcessQueueItem.put("endTime", System.currentTimeMillis());
longRunningProcessRepository.nak(longRunningProcessQueueItem, ex);
workQueueRepository.broadcastLongRunningProcessChange(longRunningProcessQueueItem);
}
return;
}
}
}
@Inject
public void setUserRepository(UserRepository userRepository) {
this.userRepository = userRepository;
}
@Inject
public void setWorkQueueRepository(WorkQueueRepository workQueueRepository) {
this.workQueueRepository = workQueueRepository;
}
@Inject
public void setLongRunningProcessRepository(LongRunningProcessRepository longRunningProcessRepository) {
this.longRunningProcessRepository = longRunningProcessRepository;
}
@Inject
public void setConfiguration(Configuration configuration) {
this.configuration = configuration;
}
}