package org.ovirt.engine.api.restapi.resource;
import javax.ws.rs.core.Response;
import org.ovirt.engine.api.model.Tag;
import org.ovirt.engine.api.resource.TagResource;
import org.ovirt.engine.core.common.action.MoveTagParameters;
import org.ovirt.engine.core.common.action.TagsActionParametersBase;
import org.ovirt.engine.core.common.action.TagsOperationParameters;
import org.ovirt.engine.core.common.action.VdcActionParametersBase;
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.VdcQueryType;
import org.ovirt.engine.core.compat.Guid;
public class BackendTagResource
extends AbstractBackendSubResource<Tag, Tags>
implements TagResource {
private BackendTagsResource parent;
public BackendTagResource(String id, BackendTagsResource parent) {
super(id, Tag.class, Tags.class);
this.parent = parent;
}
BackendTagsResource getParent() {
return parent;
}
@Override
public Tag get() {
return performGet(VdcQueryType.GetTagByTagId, new IdQueryParameters(guid));
}
@Override
public Tag update(Tag incoming) {
if (parent.isSetParentName(incoming)) {
incoming.getParent().setId(parent.getParentId(incoming));
}
Tag existingTag = get();
String existingTagParentId = existingTag.isSetParent()? existingTag.getParent().getId(): null;
if (isSetParent(incoming) && !incoming.getParent().getId().equals(existingTagParentId)) {
moveTag(asGuid(incoming.getParent().getId()));
}
return performUpdate(incoming,
new QueryIdResolver<>(VdcQueryType.GetTagByTagId, IdQueryParameters.class),
VdcActionType.UpdateTag,
new UpdateParametersProvider());
}
@Override
public Response remove() {
get();
return performAction(VdcActionType.RemoveTag, new TagsActionParametersBase(guid));
}
protected void moveTag(Guid newParentId) {
performAction(VdcActionType.MoveTag, new MoveTagParameters(guid, newParentId), Void.class);
}
protected boolean isSetParent(Tag tag) {
return tag.isSetParent() && tag.getParent().isSetId();
}
protected class UpdateParametersProvider implements ParametersProvider<Tag, Tags> {
@Override
public VdcActionParametersBase getParameters(Tag incoming, Tags entity) {
return new TagsOperationParameters(map(incoming, entity));
}
}
}