package org.ovirt.engine.core.bll;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import org.apache.commons.collections.CollectionUtils;
import org.ovirt.engine.core.common.businessentities.IVdcQueryable;
import org.ovirt.engine.core.common.errors.VdcFault;
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.VdcQueryReturnValue;
import org.ovirt.engine.core.compat.RefObject;
import org.ovirt.engine.core.utils.linq.DefaultMapper;
import org.ovirt.engine.core.utils.linq.LinqUtils;
public class ListIQueryableQueryData extends QueryData {
protected java.util.Map<Object, IVdcQueryable> _cache;
public ListIQueryableQueryData() {
_cache = Collections.emptyMap();
}
@Override
public IRegisterQueryUpdatedData GetQueryUpdatedDataFromQueryReturnValue(VdcQueryReturnValue QueryReturnValue,
RefObject<Boolean> changed) {
// LINQ FIX 29456
// Dictionary<object, IVdcQueryable> newData =
// (QueryReturnValue.ReturnValue as
// IList).Cast<IVdcQueryable>().ToDictionary(a => a.QueryableId);
java.util.Map<Object, IVdcQueryable> newData;
ListIVdcQueryableUpdatedData queryUpdatedData;
if (QueryReturnValue.getSucceeded()) {
List<IVdcQueryable> list = (List<IVdcQueryable>) QueryReturnValue.getReturnValue();
newData = LinqUtils.toMap(list,
new DefaultMapper<IVdcQueryable, Object>() {
@Override
public Object createKey(IVdcQueryable iVdcQueryable) {
return iVdcQueryable.getQueryableId();
}
});
// LINQ FIX 29456
// LINQ FIX 29456
// List<object> removed = _cache.Keys.Except(newData.Keys).ToList();
Collection removed = CollectionUtils.subtract(_cache.keySet(), newData.keySet());
// LINQ FIX 29456
java.util.Map<Object, IVdcQueryable> added = new java.util.LinkedHashMap<Object, IVdcQueryable>();
java.util.Map<Object, IVdcQueryable> updated = new java.util.LinkedHashMap<Object, IVdcQueryable>();
for (IVdcQueryable newValue : newData.values()) {
if (_cache.containsKey(newValue.getQueryableId())) {
if (!SingleIQueryableQueryData.AreIVdcQueryablesEqual(_cache.get(newValue.getQueryableId()),
newValue)) {
updated.put(newValue.getQueryableId(), newValue);
}
} else {
added.put(newValue.getQueryableId(), newValue);
}
}
queryUpdatedData = new ListIVdcQueryableUpdatedData(added, removed, updated);
changed.argvalue = removed.size() > 0 || added.size() > 0 || updated.size() > 0;
_cache = newData;
} else {
_cache = Collections.emptyMap();
queryUpdatedData = new ListIVdcQueryableUpdatedData();
queryUpdatedData.setFaulted(new ValueObjectPair(getQueryType(), new VdcFault(new RuntimeException(QueryReturnValue.getExceptionString()))));
changed.argvalue = Boolean.TRUE;
}
return queryUpdatedData;
}
}