package io.cattle.platform.process.progress;
import io.cattle.platform.deferred.util.DeferredUtils;
import io.cattle.platform.engine.process.ProcessState;
import io.cattle.platform.eventing.EventService;
import io.cattle.platform.eventing.model.Event;
import io.cattle.platform.eventing.model.EventVO;
import io.cattle.platform.framework.event.FrameworkEvents;
import io.cattle.platform.json.JsonMapper;
import io.cattle.platform.object.ObjectManager;
import io.cattle.platform.object.meta.ObjectMetaDataManager;
import io.cattle.platform.object.util.DataAccessor;
import io.cattle.platform.object.util.ObjectUtils;
import io.cattle.platform.util.type.CollectionUtils;
import javax.inject.Inject;
public class ProcessProgressContext implements ProcessProgressInstance {
ProcessState processState;
ProcessProgressState progressState;
ObjectManager objectManager;
JsonMapper jsonMapper;
EventService eventService;
public ProcessProgressContext(ProcessState processState, ObjectManager objectManager, JsonMapper jsonMapper, EventService eventService) {
super();
this.processState = processState;
this.objectManager = objectManager;
this.jsonMapper = jsonMapper;
this.eventService = eventService;
}
@Override
public void init(ProcessState state, int... checkpointWeights) {
DataAccessor value = DataAccessor.fromMap(state.getData()).withKey("progress");
progressState = value.as(jsonMapper, ProcessProgressState.class);
if (progressState == null) {
progressState = new ProcessProgressState(checkpointWeights);
value.set(progressState);
}
}
@Override
public void checkPoint(String name) {
if (progressState.checkPoint(name)) {
update();
}
}
@Override
public void progress(Integer progress) {
if (progressState.setIntermediateProgress(progress)) {
update();
}
}
@Override
public void messsage(String message) {
if (progressState.setMessage(message)) {
update();
}
}
protected void update() {
String message = progressState.getMessage();
Integer progress = progressState.getProgress();
final Object resource = objectManager.reload(processState.getResource());
objectManager.setFields(resource, ObjectMetaDataManager.TRANSITIONING_MESSAGE_FIELD, message, ObjectMetaDataManager.TRANSITIONING_PROGRESS_FIELD,
progress);
DeferredUtils.nest(new Runnable() {
@Override
public void run() {
String type = objectManager.getType(resource);
Object id = ObjectUtils.getId(resource);
Object accountId = ObjectUtils.getAccountId(resource);
if (id != null) {
Event event = EventVO.newEvent(FrameworkEvents.RESOURCE_PROGRESS).withResourceType(type).withResourceId(id.toString()).withData(
CollectionUtils.asMap(ObjectMetaDataManager.ACCOUNT_FIELD, accountId));
eventService.publish(event);
}
}
});
}
@Override
public String getCurrentCheckpoint() {
return progressState.getCurrentCheckpoint();
}
public ObjectManager getObjectManager() {
return objectManager;
}
@Inject
public void setObjectManager(ObjectManager objectManager) {
this.objectManager = objectManager;
}
public JsonMapper getJsonMapper() {
return jsonMapper;
}
@Inject
public void setJsonMapper(JsonMapper jsonMapper) {
this.jsonMapper = jsonMapper;
}
public EventService getEventService() {
return eventService;
}
@Inject
public void setEventService(EventService eventService) {
this.eventService = eventService;
}
}