package io.cattle.platform.process.common.handler; import io.cattle.platform.core.constants.CommonStatesConstants; import io.cattle.platform.engine.handler.AbstractProcessLogic; import io.cattle.platform.engine.manager.ProcessNotFoundException; import io.cattle.platform.engine.process.ExitReason; 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.meta.ObjectMetaDataManager; import io.cattle.platform.object.process.ObjectProcessManager; import io.cattle.platform.object.process.StandardProcess; import io.cattle.platform.object.util.ObjectUtils; import java.util.List; import java.util.Map; import javax.inject.Inject; public abstract class AbstractObjectProcessLogic extends AbstractProcessLogic { protected ObjectManager objectManager; protected ObjectProcessManager objectProcessManager; protected ObjectMetaDataManager objectMetaDataManager; public ObjectManager getObjectManager() { return objectManager; } protected ExitReason activate(Object obj, Map<String, Object> data) { return getObjectProcessManager().executeStandardProcess(StandardProcess.ACTIVATE, obj, data); } protected ExitReason deactivate(Object obj, Map<String, Object> data) { return getObjectProcessManager().executeStandardProcess(StandardProcess.DEACTIVATE, obj, data); } protected ExitReason deactivateThenRemove(Object obj, Map<String, Object> data) { Object state = ObjectUtils.getPropertyIgnoreErrors(obj, ObjectMetaDataManager.STATE_FIELD); if (CommonStatesConstants.PURGED.equals(state) || CommonStatesConstants.PURGING.equals(state)) { return null; } try { getObjectProcessManager().executeStandardProcess(StandardProcess.DEACTIVATE, obj, data); obj = getObjectManager().reload(obj); } catch (ProcessCancelException e) { // ignore } catch (ProcessNotFoundException e) { // ignore } return getObjectProcessManager().executeStandardProcess(StandardProcess.REMOVE, obj, data); } protected ExitReason deactivateThenScheduleRemove(Object obj, Map<String, Object> data) { Object state = ObjectUtils.getPropertyIgnoreErrors(obj, ObjectMetaDataManager.STATE_FIELD); if (CommonStatesConstants.PURGED.equals(state) || CommonStatesConstants.PURGING.equals(state)) { return null; } try { getObjectProcessManager().executeStandardProcess(StandardProcess.DEACTIVATE, obj, data); obj = getObjectManager().reload(obj); } catch (ProcessCancelException e) { // ignore } catch (ProcessNotFoundException e) { // ignore } state = ObjectUtils.getPropertyIgnoreErrors(obj, ObjectMetaDataManager.STATE_FIELD); if (!CommonStatesConstants.REMOVING.equals(state) && !CommonStatesConstants.REMOVED.equals(state)) { getObjectProcessManager().scheduleStandardProcess(StandardProcess.REMOVE, obj, data); } return null; } protected ExitReason createThenActivate(Object obj, Map<String, Object> data) { if (CommonStatesConstants.ACTIVE.equals(ObjectUtils.getState(obj))) { return ExitReason.ALREADY_DONE; } createIgnoreCancel(obj, data); return getObjectProcessManager().executeStandardProcess(StandardProcess.ACTIVATE, obj, data); } protected ExitReason createIgnoreCancel(Object obj, Map<String, Object> data) { try { return getObjectProcessManager().executeStandardProcess(StandardProcess.CREATE, obj, data); } catch (ProcessCancelException e) { return null; } } protected ExitReason create(Object obj, Map<String, Object> data) { return getObjectProcessManager().executeStandardProcess(StandardProcess.CREATE, obj, data); } protected ExitReason remove(Object obj, Map<String, Object> data) { if (CommonStatesConstants.ACTIVE.equals(ObjectUtils.getState(obj)) || CommonStatesConstants.DEACTIVATING.equals(ObjectUtils.getState(obj))) { getObjectProcessManager().executeStandardProcess(StandardProcess.DEACTIVATE, obj, data); } try { return getObjectProcessManager().executeStandardProcess(StandardProcess.REMOVE, obj, data); } catch (ProcessCancelException e) { Object state = ObjectUtils.getPropertyIgnoreErrors(obj, ObjectMetaDataManager.STATE_FIELD); if (CommonStatesConstants.PURGED.equals(state) || CommonStatesConstants.PURGING.equals(state)) { return null; } throw e; } } protected ExitReason purge(Object obj, Map<String, Object> data) { return getObjectProcessManager().executeStandardProcess(StandardProcess.PURGE, obj, data); } protected ExitReason deallocate(Object obj, Map<String, Object> data) { return getObjectProcessManager().executeStandardProcess(StandardProcess.DEALLOCATE, obj, data); } protected ExitReason allocate(Object obj, Map<String, Object> data) { return getObjectProcessManager().executeStandardProcess(StandardProcess.ALLOCATE, obj, data); } protected ExitReason execute(String processName, Object resource, Map<String, Object> data) { ProcessInstance pi = getObjectProcessManager().createProcessInstance(processName, resource, data); return pi.execute(); } @Inject public void setObjectManager(ObjectManager objectManager) { this.objectManager = objectManager; } public ObjectProcessManager getObjectProcessManager() { return objectProcessManager; } @Inject public void setObjectProcessManager(ObjectProcessManager objectProcessManager) { this.objectProcessManager = objectProcessManager; } public ObjectMetaDataManager getObjectMetaDataManager() { return objectMetaDataManager; } @Inject public void setObjectMetaDataManager(ObjectMetaDataManager objectMetaDataManager) { this.objectMetaDataManager = objectMetaDataManager; } /* Delegate Methods */ public <T> T loadResource(Class<T> type, String resourceId) { return objectManager.loadResource(type, resourceId); } public <T> T loadResource(Class<T> type, Long resourceId) { return objectManager.loadResource(type, resourceId); } public <T> T loadResource(String resourceType, String resourceId) { return objectManager.loadResource(resourceType, resourceId); } public <T> T loadResource(String resourceType, Long resourceId) { return objectManager.loadResource(resourceType, resourceId); } public <T> List<T> children(Object obj, Class<T> type) { return objectManager.children(obj, type); } public <T> List<T> mappedChildren(Object obj, Class<T> type) { return objectManager.mappedChildren(obj, type); } }