package org.ovirt.engine.api.restapi.resource;
import javax.ws.rs.core.Response;
import org.ovirt.engine.api.model.BaseDevice;
import org.ovirt.engine.api.model.BaseDevices;
import org.ovirt.engine.api.resource.DeviceResource;
import org.ovirt.engine.api.resource.DevicesResource;
import org.ovirt.engine.core.common.action.VdcActionParametersBase;
import org.ovirt.engine.core.common.action.VdcActionType;
import org.ovirt.engine.core.common.businessentities.IVdcQueryable;
import org.ovirt.engine.core.common.queries.VdcQueryParametersBase;
import org.ovirt.engine.core.common.queries.VdcQueryType;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.api.restapi.resource.AbstractBackendSubResource.ParametersProvider;
public abstract class AbstractBackendDevicesResource<D extends BaseDevice, C extends BaseDevices, Q extends IVdcQueryable>
extends AbstractBackendReadOnlyDevicesResource<D, C, Q>
implements DevicesResource<D, C> {
protected VdcActionType addAction;
protected VdcActionType removeAction;
protected VdcActionType updateType;
public AbstractBackendDevicesResource(Class<D> modelType,
Class<C> collectionType,
Class<Q> entityType,
Guid parentId,
VdcQueryType queryType,
VdcQueryParametersBase queryParams,
VdcActionType addAction,
VdcActionType removeAction,
VdcActionType updateType,
String... subCollections) {
super(modelType, collectionType, entityType, parentId, queryType, queryParams, subCollections);
this.addAction = addAction;
this.removeAction = removeAction;
this.updateType = updateType;
}
@Override
public Response add(D device) {
validateParameters(device, getRequiredAddFields());
return performCreation(addAction,
getAddParameters(map(device), device),
getEntityIdResolver(device.getName()));
}
@Override
public Response performRemove(String id) {
return performAction(removeAction, getRemoveParameters(id));
}
@Override
@SingleEntityResource
public DeviceResource<D> getDeviceSubResource(String id) {
return inject(new BackendDeviceResource<D, C, Q>(modelType,
entityType,
asGuidOr404(id),
this,
updateType,
getUpdateParametersProvider(),
getRequiredUpdateFields()));
}
public EntityIdResolver getEntityIdResolver(String name) {
return new DeviceIdResolver(name);
}
protected class DeviceIdResolver extends EntityIdResolver {
private String name;
DeviceIdResolver(String name) {
this.name = name;
}
private Q lookupEntity(Guid id, String name) {
for (Q entity : getBackendCollection(queryType, queryParams)) {
if (matchEntity(entity, id) || matchEntity(entity, name)) {
return entity;
}
}
return null;
}
@Override
public Q lookupEntity(Guid id) {
return lookupEntity(id, name);
}
}
protected abstract boolean matchEntity(Q entity, String name);
protected abstract String[] getRequiredAddFields();
protected abstract String[] getRequiredUpdateFields();
protected abstract VdcActionParametersBase getAddParameters(Q entity, D device);
protected abstract VdcActionParametersBase getRemoveParameters(String id);
protected abstract ParametersProvider<D, Q> getUpdateParametersProvider();
}