package io.cattle.platform.object.process.impl; import io.cattle.platform.deferred.util.DeferredUtils; import io.cattle.platform.engine.handler.ProcessLogic; import io.cattle.platform.engine.manager.ProcessManager; import io.cattle.platform.engine.process.ExitReason; import io.cattle.platform.engine.process.LaunchConfiguration; import io.cattle.platform.engine.process.Predicate; import io.cattle.platform.engine.process.ProcessInstance; import io.cattle.platform.engine.process.impl.ProcessCancelException; import io.cattle.platform.object.ObjectManager; import io.cattle.platform.object.process.ObjectProcessManager; import io.cattle.platform.object.process.StandardProcess; import io.cattle.platform.object.util.ObjectLaunchConfigurationUtils; import io.github.ibuildthecloud.gdapi.factory.SchemaFactory; import java.util.HashMap; import java.util.Map; import javax.inject.Inject; public class DefaultObjectProcessManager implements ObjectProcessManager { ProcessManager processManager; SchemaFactory schemaFactory; ObjectManager objectManager; @Override public ExitReason executeStandardProcess(StandardProcess process, Object resource, Map<String, Object> data) { String processName = getProcessName(resource, process); ProcessInstance pi = createProcessInstance(processName, resource, data); return pi.execute(); } @Override public void scheduleStandardProcess(StandardProcess process, Object resource, Map<String, Object> data) { scheduleStandardProcess(process, resource, data, null); } @Override public void scheduleStandardProcess(StandardProcess process, Object resource, Map<String, Object> data, Predicate predicate) { String processName = getProcessName(resource, process); scheduleProcessInstance(processName, resource, data, predicate); } @Override public void scheduleProcessInstance(String processName, Object resource, Map<String, Object> data, Predicate predicate) { LaunchConfiguration config = ObjectLaunchConfigurationUtils.createConfig(schemaFactory, processName, resource, data); config.setPredicate(predicate); processManager.scheduleProcessInstance(config); } @Override public void scheduleProcessInstance(String processName, Object resource, Map<String, Object> data) { scheduleProcessInstance(processName, resource, data, null); } @Override public String getProcessName(Object resource, StandardProcess process) { String type = objectManager.getType(resource); return getStandardProcessName(process, type); } @Override public String getStandardProcessName(StandardProcess process, String type) { return type.toLowerCase() + "." + process.toString().toLowerCase(); } @Override public String getStandardProcessName(StandardProcess process, Object obj) { return getProcessName(obj, process); } @Override public ProcessInstance createProcessInstance(String processName, Object resource, Map<String, Object> data) { LaunchConfiguration config = ObjectLaunchConfigurationUtils.createConfig(schemaFactory, processName, resource, data); return processManager.createProcessInstance(config); } public ProcessManager getProcessManager() { return processManager; } @Inject public void setProcessManager(ProcessManager processManager) { this.processManager = processManager; } public SchemaFactory getSchemaFactory() { return schemaFactory; } public void setSchemaFactory(SchemaFactory schemaFactory) { this.schemaFactory = schemaFactory; } public ObjectManager getObjectManager() { return objectManager; } @Inject public void setObjectManager(ObjectManager objectManager) { this.objectManager = objectManager; } @Override public ExitReason executeProcess(String processName, Object resource, Map<String, Object> data) { ProcessInstance pi = createProcessInstance(processName, resource, data); return pi.execute(); } @Override public void scheduleProcessInstanceAsync(final String processName, final Object resource, final Map<String, Object> data) { DeferredUtils.nest(new Runnable() { @Override public void run() { scheduleProcessInstance(processName, resource, data); } }); } @Override public void scheduleStandardProcessAsync(final StandardProcess process, final Object resource, final Map<String, Object> data) { DeferredUtils.nest(new Runnable() { @Override public void run() { scheduleStandardProcess(process, resource, data); } }); } @Override public void scheduleStandardChainedProcessAsync(StandardProcess from, StandardProcess to, Object resource, Map<String, Object> data) { String fromProcess = getProcessName(resource, from); String toProcess = getProcessName(resource, to); Map<String, Object> newData = new HashMap<>(); if (data != null) { newData.putAll(data); } newData.put(fromProcess + ProcessLogic.CHAIN_PROCESS, toProcess); try { scheduleStandardProcessAsync(to, resource, data); } catch (ProcessCancelException e) { scheduleStandardProcessAsync(from, resource, newData); } } }