package org.ovirt.engine.ui.uicommonweb.models.userportal;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import org.ovirt.engine.core.common.VdcActionUtils;
import org.ovirt.engine.core.common.action.VdcActionType;
import org.ovirt.engine.core.common.businessentities.VmTemplate;
import org.ovirt.engine.core.common.businessentities.VmTemplateStatus;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.ui.uicommonweb.dataprovider.AsyncDataProvider;
import org.ovirt.engine.ui.uicommonweb.models.configure.UserPortalPermissionListModel;
import org.ovirt.engine.ui.uicommonweb.models.templates.TemplateGeneralModel;
import org.ovirt.engine.ui.uicommonweb.models.templates.TemplateInterfaceListModel;
import org.ovirt.engine.ui.uicommonweb.models.templates.TemplateListModel;
import org.ovirt.engine.ui.uicommonweb.models.templates.TemplateStorageListModel;
import org.ovirt.engine.ui.uicommonweb.models.templates.TemplateVmListModel;
import org.ovirt.engine.ui.uicommonweb.models.templates.UserPortalTemplateDiskListModel;
import org.ovirt.engine.ui.uicommonweb.models.templates.UserPortalTemplateEventListModel;
import org.ovirt.engine.ui.uicommonweb.models.vms.IconCache;
import org.ovirt.engine.ui.uicommonweb.models.vms.TemplateVmModelBehavior;
import org.ovirt.engine.ui.uicommonweb.models.vms.UserPortalTemplateVmModelBehavior;
import org.ovirt.engine.ui.uicommonweb.place.UserPortalApplicationPlaces;
import com.google.inject.Inject;
public class UserPortalTemplateListModel extends TemplateListModel {
@Inject
public UserPortalTemplateListModel(TemplateGeneralModel templateGeneralModel,
TemplateVmListModel templateVmListModel,
TemplateInterfaceListModel templateInterfaceListModel,
TemplateStorageListModel templateStorageListModel,
UserPortalTemplateDiskListModel templateDiskListModel,
UserPortalTemplateEventListModel templateEventListModel,
UserPortalPermissionListModel permissionListModel) {
super(templateGeneralModel,
templateVmListModel,
templateInterfaceListModel,
templateStorageListModel,
templateDiskListModel,
templateEventListModel,
permissionListModel, 2);
setApplicationPlace(UserPortalApplicationPlaces.extendedTemplateSideTabPlace);
}
@Override
protected void syncSearch() {
AsyncDataProvider.getInstance().getAllVmTemplates(new AsyncQuery<>(vmTemplates -> prefetchIcons(vmTemplates)), getIsQueryFirstTime());
}
private void prefetchIcons(final Collection<VmTemplate> vmTemplates) {
final List<Guid> iconIds = extractSmallIconIds(vmTemplates);
IconCache.getInstance().getOrFetchIcons(iconIds, idToIconMap -> setItems(vmTemplates));
}
private List<Guid> extractSmallIconIds(Collection<VmTemplate> vmTemplates) {
final List<Guid> result = new ArrayList<>();
for (VmTemplate template: vmTemplates) {
result.add(template.getSmallIconId());
}
return result;
}
@Override
protected void updateActionsAvailability() {
VmTemplate item = getSelectedItem();
if (item != null) {
ArrayList items = new ArrayList();
items.add(item);
getEditCommand().setIsExecutionAllowed(
item.getStatus() != VmTemplateStatus.Locked &&
!isBlankTemplateSelected());
getRemoveCommand().setIsExecutionAllowed(
VdcActionUtils.canExecute(items, VmTemplate.class,
VdcActionType.RemoveVmTemplate) &&
!isBlankTemplateSelected()
);
} else {
getEditCommand().setIsExecutionAllowed(false);
getRemoveCommand().setIsExecutionAllowed(false);
}
}
@Override
protected String getEditTemplateAdvancedModelKey() {
return "up_template_dialog"; //$NON-NLS-1$
}
@Override
protected TemplateVmModelBehavior createBehavior(VmTemplate template) {
return new UserPortalTemplateVmModelBehavior(template);
}
@Override
public void setItems(Collection value) {
final List<VmTemplate> sortedValues = sortTemplates(value);
super.setItems(sortedValues);
}
/**
* It sorts {@link org.ovirt.engine.core.common.businessentities.VmTemplate}s using
* {@link org.ovirt.engine.ui.uicommonweb.models.userportal.UserPortalTemplateListModel.TemplateComparator}
*/
private List<VmTemplate> sortTemplates(Collection<VmTemplate> value) {
if (value == null) {
return null;
}
final List<VmTemplate> sortedValues = new ArrayList<>(value);
Collections.sort(sortedValues, new TemplateComparator());
return sortedValues;
}
/**
* Comparator sorting templates
* <ul>
* <li>alphabetically by base-template name case insensitive</li>
* <li>alphabetically by base-template name case sensitive</li>
* <li>and then by version number - descending</li>
* </ul>
*/
private static class TemplateComparator implements Comparator<VmTemplate>, Serializable {
@Override
public int compare(VmTemplate t1, VmTemplate t2) {
final int baseNameCaseInsensitiveComparison = t1.getName().compareToIgnoreCase(t2.getName());
if (baseNameCaseInsensitiveComparison != 0) {
return baseNameCaseInsensitiveComparison;
}
final int baseNameComparison = t1.getName().compareTo(t2.getName());
if (baseNameComparison != 0) {
return baseNameComparison;
}
return - Integer.signum(Integer.compare(t1.getTemplateVersionNumber(), t2.getTemplateVersionNumber()));
}
@Override
public boolean equals(Object obj) {
return obj != null && this.getClass().equals(obj.getClass());
}
@Override
public int hashCode() {
return this.getClass().hashCode();
}
}
}