package io.cattle.platform.extension.api.manager;
import io.cattle.platform.api.utils.ApiUtils;
import io.cattle.platform.engine.manager.ProcessManager;
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.model.ResourceDefinition;
import io.cattle.platform.util.type.CollectionUtils;
import io.github.ibuildthecloud.gdapi.factory.SchemaFactory;
import io.github.ibuildthecloud.gdapi.id.IdFormatter;
import io.github.ibuildthecloud.gdapi.model.Include;
import io.github.ibuildthecloud.gdapi.model.ListOptions;
import io.github.ibuildthecloud.gdapi.model.Resource;
import io.github.ibuildthecloud.gdapi.model.Schema;
import io.github.ibuildthecloud.gdapi.request.ApiRequest;
import io.github.ibuildthecloud.gdapi.request.resource.ResourceManager;
import io.github.ibuildthecloud.gdapi.request.resource.impl.AbstractNoOpResourceManager;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.inject.Inject;
public class ResourceDefinitionManager extends AbstractNoOpResourceManager {
public static final String PROCESSES = "processes";
public static final String RESOURCE_DOT = "resourceDot";
private static final Map<String, String> LINKS = new HashMap<String, String>();
static {
LINKS.put(PROCESSES, null);
LINKS.put(RESOURCE_DOT, null);
}
List<ProcessDefinition> processDefinitions;
ProcessManager processManager;
DotMaker dotMaker;
public ResourceDefinitionManager() {
addResourceToCreateResponse(ResourceDefinition.class);
}
@Override
public Class<?>[] getTypeClasses() {
return new Class<?>[] { ResourceDefinition.class };
}
@Override
protected Object getByIdInternal(String type, String id, ListOptions options) {
for (ProcessDefinition def : processDefinitions) {
if (id.equalsIgnoreCase(def.getResourceType())) {
return newResource(def.getResourceType(), options.getInclude());
}
}
return null;
}
@Override
protected Object listInternal(SchemaFactory schemaFactory, String type, Map<Object, Object> criteria, ListOptions options) {
Set<String> found = new HashSet<String>();
List<ResourceDefinition> result = new ArrayList<ResourceDefinition>();
for (ProcessDefinition def : processDefinitions) {
String resourceType = def.getResourceType();
if (found.contains(resourceType)) {
continue;
}
result.add(newResource(resourceType, options.getInclude()));
found.add(resourceType);
}
return result;
}
protected ResourceDefinition newResource(String name, Include include) {
ResourceDefinition def = new ResourceDefinition(name);
if (include != null) {
for (String link : include.getLinks()) {
for (Object obj : getLinkInternal(def, link, null)) {
ApiUtils.addAttachement(def, link, obj);
}
}
}
return def;
}
@Override
protected Resource constructResource(final IdFormatter idFormatter, SchemaFactory schemaFactory, final Schema schema, Object obj, ApiRequest apiRequest) {
return ApiUtils.createResourceWithAttachments(this, apiRequest, idFormatter, schemaFactory, schema, obj, new HashMap<String, Object>());
}
protected List<?> getLinkInternal(ResourceDefinition def, String link, ApiRequest request) {
String type = request.getSchemaFactory().getSchemaName(ProcessDefinitionApi.class);
ResourceManager rm = getLocator().getResourceManagerByType(type);
if (link.equalsIgnoreCase(PROCESSES)) {
Map<Object, Object> criteria = CollectionUtils.asMap((Object) "resourceType", def.getId());
return CollectionUtils.toList(rm.list(type, criteria, new ListOptions()));
} else if (request != null && link.equalsIgnoreCase(RESOURCE_DOT)) {
String dot = dotMaker.getResourceDot(def.getName());
boolean written = false;
try {
written = dotMaker.writeResponse(dot, request);
} catch (IOException e) {
throw new IllegalStateException(e);
}
return written ? Collections.emptyList() : null;
}
return null;
}
@Override
protected Object getLinkInternal(String type, String id, String link, ApiRequest request) {
ResourceDefinition def = (ResourceDefinition) getById(type, id, new ListOptions());
return def == null ? null : getLinkInternal(def, link, request);
}
@Override
protected Map<String, String> getLinks(SchemaFactory schemaFactory, Resource resource) {
return LINKS;
}
public ProcessManager getProcessManager() {
return processManager;
}
@Inject
public void setProcessManager(ProcessManager processManager) {
this.processManager = processManager;
}
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;
}
}