package org.ovirt.engine.api.restapi.resource;
import static org.ovirt.engine.api.utils.ReflectionHelper.assignChildModel;
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.resource.AssignedTagsResource;
import org.ovirt.engine.core.common.action.AttachEntityToTagParameters;
import org.ovirt.engine.core.common.action.TagsActionParametersBase;
import org.ovirt.engine.core.common.action.VdcActionType;
import org.ovirt.engine.core.common.businessentities.Tags;
import org.ovirt.engine.core.common.queries.IdQueryParameters;
import org.ovirt.engine.core.common.queries.VdcQueryParametersBase;
import org.ovirt.engine.core.common.queries.VdcQueryType;
import org.ovirt.engine.core.compat.Guid;
public abstract class AbstractBackendAssignedTagsResource
extends AbstractBackendCollectionResource<Tag, Tags>
implements AssignedTagsResource {
protected Class<? extends BaseResource> parentType;
protected String parentId;
protected VdcActionType attachAction;
public AbstractBackendAssignedTagsResource(Class<? extends BaseResource> parentType,
String parentId,
VdcActionType attachAction) {
super(Tag.class, Tags.class);
this.parentType = parentType;
this.parentId = parentId;
this.attachAction = attachAction;
}
public String getParentId() {
return parentId;
}
protected abstract List<Tags> getCollection();
private TagsActionParametersBase getAttachParams(String id) {
return new AttachEntityToTagParameters(asGuid(id), asList(asGuid(parentId)));
}
public org.ovirt.engine.api.model.Tags list() {
org.ovirt.engine.api.model.Tags ret = new org.ovirt.engine.api.model.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 performCreate(attachAction, getAttachParams(tag.getId()), new TagIdResolver(asGuid(tag.getId())));
}
@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.getTagName().equals(name)) {
return map(tag);
}
}
return handleError(new EntityNotFoundException(name), false);
}
public Tags lookupTagById(Guid id) {
return getEntity(Tags.class, VdcQueryType.GetTagByTagId, new IdQueryParameters(id), id.toString(), true);
}
protected class TagIdResolver extends EntityIdResolver<Guid> {
private Guid id;
TagIdResolver(Guid id) {
this.id = id;
}
@Override
public Tags lookupEntity(Guid id) throws BackendFailureException {
assert id == null; // attach actions return nothing, lookup original id instead
return lookupTagById(this.id);
}
}
}