package org.ovirt.engine.core.bll;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import org.ovirt.engine.core.common.errors.VdcFault;
import org.ovirt.engine.core.common.interfaces.IBackendCallBackServer;
import org.ovirt.engine.core.common.queries.AsyncQueryResults;
import org.ovirt.engine.core.common.queries.IRegisterQueryUpdatedData;
import org.ovirt.engine.core.common.queries.ListIVdcQueryableUpdatedData;
import org.ovirt.engine.core.common.queries.ValueObjectPair;
import org.ovirt.engine.core.common.queries.VdcQueryType;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.compat.KeyValuePairCompat;
import org.ovirt.engine.core.compat.LogCompat;
import org.ovirt.engine.core.compat.LogFactoryCompat;
import org.ovirt.engine.core.compat.NotImplementedException;
public class CallbackServer implements IBackendCallBackServer {
public static final CallbackServer Instance = new CallbackServer();
public void QueryDataChanged(Guid queryId, IRegisterQueryUpdatedData updatedData) {
synchronized (queries) {
if (!queries.containsKey(queryId)) {
queries.put(queryId, new java.util.ArrayList<ListIVdcQueryableUpdatedData>());
}
queries.get(queryId).add((ListIVdcQueryableUpdatedData) updatedData);
}
}
public void QueryFailed(Guid queryId) {
throw new NotImplementedException();
}
public Guid BackendException(org.ovirt.engine.core.common.action.VdcActionType actionType,
org.ovirt.engine.core.common.errors.VdcFault fault) {
Guid FaultQueryId = Guid.NewGuid();
log.debugFormat("CallbackServer:VdcFaultMessage: action={0} Fault={1}", actionType.name(), fault.getMessage());
synchronized (queries) {
queries.put(FaultQueryId, new java.util.ArrayList<ListIVdcQueryableUpdatedData>());
ListIVdcQueryableUpdatedData faultData = new ListIVdcQueryableUpdatedData();
faultData.setFaulted(new ValueObjectPair(actionType, fault));
queries.get(FaultQueryId).add(faultData);
}
return FaultQueryId;
}
@Override
public void SearchQueryException(Guid queryId, VdcQueryType queryType, VdcFault fault) {
synchronized (queries) {
queries.put(queryId, new java.util.ArrayList<ListIVdcQueryableUpdatedData>());
ListIVdcQueryableUpdatedData faultData = new ListIVdcQueryableUpdatedData();
faultData.setFaulted(new ValueObjectPair(queryType, fault));
queries.get(queryId).add(faultData);
}
}
public AsyncQueryResults GetAsyncQueryResults(Guid[] queryIDs) {
java.util.ArrayList<KeyValuePairCompat<Guid, ListIVdcQueryableUpdatedData[]>> allResults =
new ArrayList<KeyValuePairCompat<Guid, ListIVdcQueryableUpdatedData[]>>();
synchronized (queries) {
for (Guid queryId : queryIDs) {
List<ListIVdcQueryableUpdatedData> result = new LinkedList<ListIVdcQueryableUpdatedData>();
if (queries.containsKey(queryId)) {
result = queries.get(queryId);
queries.put(queryId, new java.util.ArrayList<ListIVdcQueryableUpdatedData>());
}
allResults.add(new KeyValuePairCompat<Guid, ListIVdcQueryableUpdatedData[]>(queryId,
result
.toArray(new ListIVdcQueryableUpdatedData[0])));
}
}
return new AsyncQueryResults(allResults.toArray(new KeyValuePairCompat[0]));
}
private java.util.HashMap<Guid, java.util.ArrayList<ListIVdcQueryableUpdatedData>> queries =
new java.util.HashMap<Guid, java.util.ArrayList<ListIVdcQueryableUpdatedData>>();
private static LogCompat log = LogFactoryCompat.getLog(CallbackServer.class);
// need to remove old queries from queue of registeres searches
public void ClearQuery(Guid QueryId) {
synchronized (queries) {
queries.remove(QueryId);
}
}
}