package org.ovirt.engine.ui.uicommonweb.models;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.ovirt.engine.core.common.businessentities.ErrataData;
import org.ovirt.engine.core.common.businessentities.Erratum;
import org.ovirt.engine.core.common.businessentities.HasErrata;
import org.ovirt.engine.core.common.mode.ApplicationMode;
import org.ovirt.engine.core.common.queries.GetErrataCountsParameters;
import org.ovirt.engine.core.common.queries.VdcQueryReturnValue;
import org.ovirt.engine.core.common.queries.VdcQueryType;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.ui.frontend.Frontend;
import org.ovirt.engine.ui.uicommonweb.help.HelpTag;
import org.ovirt.engine.ui.uicompat.ConstantsManager;
import org.ovirt.engine.ui.uicompat.IEventListener;
import org.ovirt.engine.ui.uicompat.PropertyChangedEventArgs;
import org.ovirt.engine.ui.uicompat.UIConstants;
/**
* Model object representing List of errata (singular: Erratum) for a VM, Host, or the engine itself (aka System).
*
* @see {@link EngineErrataListModel}
* @see {@link HostErrataListModel}
* @see {@link VmErrataListModel}
*
*/
public abstract class AbstractErrataListModel extends ListWithSimpleDetailsModel<HasErrata, Erratum> {
private static final UIConstants constants = ConstantsManager.getInstance().getConstants();
protected Collection<Erratum> unfilteredResultList;
protected ErrataFilterValue filter;
protected Guid guid;
public AbstractErrataListModel() {
setIsTimerDisabled(true);
setTitle(ConstantsManager.getInstance().getConstants().errata());
setHelpTag(HelpTag.errata);
setHashName("errata"); //$NON-NLS-1$
setDefaultSearchString("Errata:"); //$NON-NLS-1$
setSearchString(getDefaultSearchString());
setAvailableInModes(ApplicationMode.AllModes);
getSearchNextPageCommand().setIsAvailable(true);
getSearchPreviousPageCommand().setIsAvailable(true);
}
@Override
protected void syncSearch() {
super.syncSearch();
runQuery(getGuid());
}
public void addErrorMessageChangeListener(IEventListener<PropertyChangedEventArgs> listener) {
getPropertyChangedEvent().addListener(listener);
}
public void addItemsChangeListener(IEventListener<PropertyChangedEventArgs> listener) {
getPropertyChangedEvent().addListener(listener);
}
public void retrieveEngineErrata() {
runQuery(guid);
}
public void retrieveErrata(Guid guid) {
runQuery(guid);
}
public void retrieveErrata() {
runQuery(getGuid());
}
private void runQuery(Guid guid) {
AsyncQuery<VdcQueryReturnValue> asyncQuery = new AsyncQuery<>(returnValue -> {
if (returnValue.getSucceeded()) {
ErrataData errataData = returnValue.getReturnValue();
unfilteredResultList = errataData.getErrata();
// manual client-side filter
// TODO: Use filtering and pagination options by GetErrataCountsParameters.setErrataFilter(filter)
setItems(filter(unfilteredResultList));
}
else {
setMessage(constants.katelloProblemRetrievingErrata() + " " + returnValue.getExceptionMessage()); //$NON-NLS-1$
}
});
asyncQuery.setHandleFailure(true);
Frontend.getInstance().runQuery(getQueryType(), new GetErrataCountsParameters(guid), asyncQuery);
}
protected Collection<Erratum> filter(Collection<Erratum> resultList) {
List<Erratum> ret = new ArrayList<>();
if (filter == null || (filter.isSecurity() && filter.isBugs() && filter.isEnhancements())) {
return resultList;
}
for (Erratum e : resultList) {
if ((filter.isSecurity() && e.getType() == Erratum.ErrataType.SECURITY) ||
(filter.isBugs() && e.getType() == Erratum.ErrataType.BUGFIX) ||
(filter.isEnhancements() && e.getType() == Erratum.ErrataType.ENHANCEMENT) ) {
ret.add(e);
}
}
return ret;
}
public void setGuid(Guid id) {
this.guid = id;
}
public Guid getGuid() {
return guid;
}
public void setItemsFilter(ErrataFilterValue filter) {
this.filter = filter;
}
public ErrataFilterValue getItemsFilter() {
return this.filter;
}
public void reFilter() {
setItems(filter(unfilteredResultList));
}
protected abstract VdcQueryType getQueryType();
}