package io.cattle.platform.extension.api.manager; import io.cattle.platform.engine.process.ExtensionBasedProcessDefinition; import io.cattle.platform.engine.process.ProcessDefinition; import io.cattle.platform.extension.api.dot.DotMaker; import io.cattle.platform.extension.api.model.ProcessDefinitionApi; import io.cattle.platform.extension.api.util.ApiPredicates; import io.github.ibuildthecloud.gdapi.factory.SchemaFactory; import io.github.ibuildthecloud.gdapi.model.ListOptions; import io.github.ibuildthecloud.gdapi.model.Resource; import io.github.ibuildthecloud.gdapi.request.ApiRequest; import io.github.ibuildthecloud.gdapi.request.resource.impl.AbstractNoOpResourceManager; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.inject.Inject; import com.google.common.base.Predicate; public class ProcessDefinitionApiManager extends AbstractNoOpResourceManager { public static final String PROCESS_DOT = "processDot"; private static final Map<String, String> LINKS = new HashMap<String, String>(); static { LINKS.put(PROCESS_DOT, null); } List<ProcessDefinition> processDefinitions; DotMaker dotMaker; public ProcessDefinitionApiManager() { addResourceToCreateResponse(ProcessDefinitionApi.class); } @Override public Class<?>[] getTypeClasses() { return new Class<?>[] { ProcessDefinitionApi.class }; } @Override protected Map<String, String> getLinks(SchemaFactory schemaFactory, Resource resource) { return LINKS; } @Override protected Object getLinkInternal(String type, String id, String link, ApiRequest request) { ProcessDefinition def = getById(id); if (def == null) { return null; } String dot = null; if (PROCESS_DOT.equalsIgnoreCase(link)) { dot = dotMaker.getProcessDot(def); } boolean written = false; try { written = dotMaker.writeResponse(dot, request); } catch (IOException e) { throw new IllegalStateException(e); } return written ? new Object() : null; } @Override protected Object getByIdInternal(String type, String id, ListOptions options) { return toApi(getById(id)); } protected ProcessDefinition getById(String id) { for (ProcessDefinition def : processDefinitions) { if (def.getName().equals(id)) { return def; } } return null; } @Override protected Object listInternal(SchemaFactory schemaFactory, String type, Map<Object, Object> criteria, ListOptions options) { List<ProcessDefinitionApi> result = new ArrayList<ProcessDefinitionApi>(); Predicate<Object> condition = ApiPredicates.filterOn(criteria, "name", "resourceType"); for (ProcessDefinition def : processDefinitions) { if (condition.apply(def)) { result.add(toApi(def)); } } return result; } protected ProcessDefinitionApi toApi(ProcessDefinition def) { if (def == null) { return null; } ProcessDefinitionApi api = new ProcessDefinitionApi(); api.setName(def.getName()); api.setResourceType(def.getResourceType()); api.setStateTransitions(def.getStateTransitions()); if (def instanceof ExtensionBasedProcessDefinition) { api.setExtensionBased(true); api.setPreProcessListeners(((ExtensionBasedProcessDefinition) def).getPreProcessListenersExtensionPoint()); api.setProcessHandlers(((ExtensionBasedProcessDefinition) def).getProcessHandlersExtensionPoint()); api.setPostProcessListeners(((ExtensionBasedProcessDefinition) def).getPostProcessListenersExtensionPoint()); } return api; } public DotMaker getDotMaker() { return dotMaker; } @Inject public void setDotMaker(DotMaker dotMaker) { this.dotMaker = dotMaker; } public List<ProcessDefinition> getProcessDefinitions() { return processDefinitions; } @Inject public void setProcessDefinitions(List<ProcessDefinition> processDefinitions) { this.processDefinitions = processDefinitions; } }