package org.ovirt.engine.api.restapi.resource; import java.util.List; import javax.ws.rs.core.Response; import org.ovirt.engine.api.model.Tag; import org.ovirt.engine.api.model.Tags; import org.ovirt.engine.api.resource.TagResource; import org.ovirt.engine.api.resource.TagsResource; import org.ovirt.engine.core.common.action.TagsActionParametersBase; import org.ovirt.engine.core.common.action.TagsOperationParameters; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.businessentities.tags; import org.ovirt.engine.core.common.queries.GetTagByTagNameParameters; import org.ovirt.engine.core.common.queries.VdcQueryParametersBase; import org.ovirt.engine.core.common.queries.VdcQueryType; import org.ovirt.engine.core.compat.Guid; public class BackendTagsResource extends AbstractBackendCollectionResource<Tag, tags> implements TagsResource { public BackendTagsResource() { super(Tag.class, tags.class); } @Override public Tags list() { List<tags> tags = getTags(); tags.add(getRootTag()); return mapCollection(tags); } @Override @SingleEntityResource public TagResource getTagSubResource(String id) { return inject(new BackendTagResource(id, this)); } @Override public Response add(Tag tag) { validateParameters(tag, "name"); if (isSetParentName(tag)) { tag.getParent().getTag().setId(getParentId(tag)); } return performCreation(VdcActionType.AddTag, new TagsOperationParameters(map(tag)), new TagNameResolver(tag.getName())); } @Override public Response performRemove(String id) { return performAction(VdcActionType.RemoveTag, new TagsActionParametersBase(asGuid(id))); } protected List<tags> getTags() { return getBackendCollection(VdcQueryType.GetAllTags, new VdcQueryParametersBase()); } protected tags getRootTag() { return getEntity(tags.class, VdcQueryType.GetRootTag, new VdcQueryParametersBase(), "root"); } protected Tags mapCollection(List<tags> entities) { Tags collection = new Tags(); for (tags entity : entities) { collection.getTags().add(addLinks(map(entity))); } return collection; } boolean isSetParentName(Tag tag) { return tag.isSetParent() && tag.getParent().isSetTag() && tag.getParent().getTag().isSetName(); } String getParentId(Tag tag) { return lookupTagByName(tag.getParent().getTag().getName()).gettag_id().toString(); } protected tags lookupTagByName(String name) { return getEntity(tags.class, VdcQueryType.GetTagByTagName, new GetTagByTagNameParameters(name), name); } protected class TagNameResolver extends EntityIdResolver { private String name; TagNameResolver(String name) { this.name = name; } @Override public tags lookupEntity(Guid id) { assert(id == null); // AddTag returns nothing, lookup name instead return lookupTagByName(name); } } }