package org.ovirt.engine.api.restapi.resource;
import java.lang.reflect.Method;
import java.util.List;
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.model.VM;
import org.ovirt.engine.api.resource.ReadOnlyDeviceResource;
import org.ovirt.engine.api.resource.ReadOnlyDevicesResource;
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;
public abstract class AbstractBackendReadOnlyDevicesResource<D extends BaseDevice, C extends BaseDevices, Q extends IVdcQueryable>
extends AbstractBackendCollectionResource<D, Q>
implements ReadOnlyDevicesResource<D, C> {
protected Class<C> collectionType;
protected Guid parentId;
protected VdcQueryType queryType;
protected VdcQueryParametersBase queryParams;
public AbstractBackendReadOnlyDevicesResource(Class<D> modelType,
Class<C> collectionType,
Class<Q> entityType,
Guid parentId,
VdcQueryType queryType,
VdcQueryParametersBase queryParams,
String... subCollections) {
super(modelType, entityType, subCollections);
this.collectionType = collectionType;
this.parentId = parentId;
this.queryType = queryType;
this.queryParams = queryParams;
}
@Override
public C list() {
return mapCollection(getBackendCollection(queryType, queryParams));
}
@Override
public ReadOnlyDeviceResource<D> getDeviceSubResource(String id) {
return inject(new BackendReadOnlyDeviceResource<D, C, Q>(modelType, entityType, asGuidOr404(id), this));
}
@Override
public D addParents(D device) {
// REVISIT: this can also be a template
device.setVm(new VM());
device.getVm().setId(parentId.toString());
return device;
}
protected C mapCollection(List<Q> entities) {
C collection = instantiate(collectionType);
List<D> list = getList(collection);
for (Q entity : entities) {
D candidate = populate(map(entity), entity);
if (validate(candidate)) {
list.add(addLinks(candidate));
}
}
return collection;
}
protected boolean validate(D device) {
return true;
}
@SuppressWarnings("unchecked")
protected List<D> getList(C collection) {
for (Method m : collectionType.getMethods()) {
if (m.getName().equals("get" + collectionType.getSimpleName())) {
try {
return (List<D>)m.invoke(collection);
} catch (Exception e) {
// simple getter shouldn't fail
}
}
}
return null;
}
public Q lookupEntity(Guid id) {
for (Q entity : getBackendCollection(queryType, queryParams)) {
if (matchEntity(entity, id)) {
return entity;
}
}
return null;
}
protected abstract boolean matchEntity(Q entity, Guid id);
@Override
protected Response performRemove(String id) {
throw new UnsupportedOperationException();
}
}