package io.cattle.platform.iaas.api.request.handler; import io.cattle.platform.object.meta.ObjectMetaDataManager; import io.cattle.platform.object.meta.Relationship; import io.github.ibuildthecloud.gdapi.model.Schema; import io.github.ibuildthecloud.gdapi.model.Schema.Method; import io.github.ibuildthecloud.gdapi.request.ApiRequest; import io.github.ibuildthecloud.gdapi.request.handler.AbstractApiRequestHandler; import java.io.IOException; import java.util.LinkedHashMap; import java.util.Map; import javax.inject.Inject; public class PostChildLinkHandler extends AbstractApiRequestHandler { ObjectMetaDataManager metaDataManager; @Override public void handle(ApiRequest request) throws IOException { if (!Method.POST.isMethod(request.getMethod()) || request.getLink() == null) { return; } Map<String, Relationship> rels = metaDataManager.getLinkRelationships(request.getSchemaFactory(), request.getType()); Relationship rel = rels == null ? null : rels.get(request.getLink()); if (rel == null || rel.getRelationshipType() != Relationship.RelationshipType.CHILD) { return; } Schema childSchema = request.getSchemaFactory().getSchema(rel.getObjectType()); if (childSchema == null) { return; } if (!childSchema.getCollectionMethods().contains(Method.POST.toString())) { return; } Map<String, Object> requestParams = request.getRequestParams(); if (!requestParams.containsKey(rel.getPropertyName())) { requestParams = new LinkedHashMap<String, Object>(requestParams); requestParams.put(rel.getPropertyName(), request.getId()); request.setRequestParams(requestParams); } request.setType(childSchema.getId()); request.setId(null); request.setLink(null); } public ObjectMetaDataManager getMetaDataManager() { return metaDataManager; } @Inject public void setMetaDataManager(ObjectMetaDataManager metaDataManager) { this.metaDataManager = metaDataManager; } }