package org.ovirt.engine.api.restapi.resource;
import java.util.List;
import javax.ws.rs.core.Response;
import org.ovirt.engine.api.model.BaseResource;
import org.ovirt.engine.api.model.Tag;
import org.ovirt.engine.api.model.Tags;
import org.ovirt.engine.api.resource.AssignedTagResource;
import org.ovirt.engine.core.common.businessentities.tags;
import org.ovirt.engine.core.common.action.TagsActionParametersBase;
import org.ovirt.engine.core.common.action.VdcActionType;
import org.ovirt.engine.core.common.queries.GetTagByTagIdParameters;
import org.ovirt.engine.core.common.queries.VdcQueryParametersBase;
import org.ovirt.engine.core.common.queries.VdcQueryType;
import org.ovirt.engine.core.compat.Guid;
import static org.ovirt.engine.api.common.util.ReflectionHelper.assignChildModel;
public abstract class AbstractBackendAssignedTagsResource
extends AbstractBackendCollectionResource<Tag, tags> {
protected Class<? extends BaseResource> parentType;
protected String parentId;
protected VdcActionType attachAction;
protected VdcActionType detachAction;
public AbstractBackendAssignedTagsResource(Class<? extends BaseResource> parentType,
String parentId,
VdcActionType attachAction,
VdcActionType detachAction) {
super(Tag.class, tags.class);
this.parentType = parentType;
this.parentId = parentId;
this.attachAction = attachAction;
this.detachAction = detachAction;
}
public String getParentId() {
return parentId;
}
public VdcActionType getAttachAction() {
return attachAction;
}
public VdcActionType getDetachAction() {
return detachAction;
}
protected abstract List<tags> getCollection();
protected abstract TagsActionParametersBase getAttachParams(String id);
public Tags list() {
Tags ret = new Tags();
for (tags tag : getCollection()) {
ret.getTags().add(addLinks(populate(map(tag), tag)));
}
return ret;
}
public Response add(Tag tag) {
validateParameters(tag, "id|name");
if (!tag.isSetId()) {
tag = lookupTagByName(tag.getName());
}
return performCreation(attachAction,
getAttachParams(tag.getId()),
new TagIdResolver(asGuid(tag.getId())));
}
@Override
public Response performRemove(String id) {
return performAction(detachAction, getAttachParams(id));
}
@SingleEntityResource
public AssignedTagResource getAssignedTagSubResource(String id) {
return inject(new BackendAssignedTagResource(id, this));
}
@Override
public Tag addParents(Tag tag) {
assignChildModel(tag, parentType).setId(parentId);
return tag;
}
protected Tag lookupTagByName(String name) {
for (tags tag : getBackendCollection(tags.class, VdcQueryType.GetAllTags, new VdcQueryParametersBase())) {
if (tag.gettag_name().equals(name)) {
return map(tag);
}
}
return handleError(new EntityNotFoundException(name), false);
}
public tags lookupTagById(Guid id) {
return getEntity(tags.class, VdcQueryType.GetTagByTagId, new GetTagByTagIdParameters(id), id.toString(), true);
}
protected class TagIdResolver extends EntityIdResolver {
private Guid id;
TagIdResolver(Guid id) {
this.id = id;
}
@Override
public tags lookupEntity(Guid nullId) {
assert(nullId == null); // attach actions return nothing, lookup original id instead
return lookupTagById(id);
}
}
}