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.resource.TagResource; import org.ovirt.engine.api.resource.TagsResource; 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.NameQueryParameters; 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 org.ovirt.engine.api.model.Tags list() { List<Tags> tags = getTags(); tags.add(getRootTag()); return mapCollection(tags); } @Override public TagResource getTagResource(String id) { return inject(new BackendTagResource(id, this)); } @Override public Response add(Tag tag) { validateParameters(tag, "name"); if (isSetParentName(tag)) { tag.getParent().setId(getParentId(tag)); } return performCreate(VdcActionType.AddTag, new TagsOperationParameters(map(tag)), new TagNameResolver(tag.getName())); } protected List<Tags> getTags() { return getBackendCollection(VdcQueryType.GetAllTags, new VdcQueryParametersBase()); } protected Tags getRootTag() { return getEntity(Tags.class, VdcQueryType.GetRootTag, new VdcQueryParametersBase(), "root"); } protected org.ovirt.engine.api.model.Tags mapCollection(List<Tags> entities) { org.ovirt.engine.api.model.Tags collection = new org.ovirt.engine.api.model.Tags(); for (Tags entity : entities) { collection.getTags().add(addLinks(map(entity))); } return collection; } boolean isSetParentName(Tag tag) { return tag.isSetParent() && tag.getParent().isSetName(); } String getParentId(Tag tag) { return lookupTagByName(tag.getParent().getName()).getTagId().toString(); } protected Tags lookupTagByName(String name) { return getEntity(Tags.class, VdcQueryType.GetTagByTagName, new NameQueryParameters(name), name); } protected class TagNameResolver extends EntityIdResolver<Guid> { private String name; TagNameResolver(String name) { this.name = name; } @Override public Tags lookupEntity(Guid id) throws BackendFailureException { assert id == null; // AddTag returns nothing, lookup name instead return lookupTagByName(name); } } }