package org.ovirt.engine.ui.uicommonweb.models.templates; import org.ovirt.engine.core.common.businessentities.VmTemplate; /** * Connection of 'base template' and 'template version'. * * <p> * Ordering: <br/> * Lexicographically - first by base template then by template version <br/> * Ordering of base templates: * <ul> * <li>Blank</li> * <li>Alphabetically by displayed name * {@link org.ovirt.engine.core.common.businessentities.VmTemplate#getName()}</li> * </ul> * Ordering of template versions: * <ul> * <li>Latest</li> * <li>by version number * {@link org.ovirt.engine.core.common.businessentities.VmTemplate#getTemplateVersionNumber()}</li> * </ul> * </p> * * <p> * Equality based on {@link #baseTemplate}, {@link #templateVersion} and being latest template. * </p> */ public class TemplateWithVersion implements Comparable<TemplateWithVersion> { private VmTemplate baseTemplate; private VmTemplate templateVersion; /** * It has to hold {@code baseTemplate.getId().equals(templateVersion.getBaseTemplateId())} * @param baseTemplate base template, required non-null * @param templateVersion template version of {@code baseTemplate}, required non-null */ public TemplateWithVersion(VmTemplate baseTemplate, VmTemplate templateVersion) { if (baseTemplate == null || templateVersion == null || !baseTemplate.getId().equals(templateVersion.getBaseTemplateId())) { throw new IllegalArgumentException("Arguments of TemplateWithVersion constructor has to be non-null, " + //$NON-NLS-1$ "templateVersion has to be version of baseTemplate."); //$NON-NLS-1$ } this.baseTemplate = baseTemplate; this.templateVersion = templateVersion; } public VmTemplate getTemplateVersion() { return templateVersion; } public VmTemplate getBaseTemplate() { return baseTemplate; } @Override public boolean equals(Object o) { if (this == o) { return true; } if (!(o instanceof TemplateWithVersion)) { return false; } TemplateWithVersion that = (TemplateWithVersion) o; if (!baseTemplate.equals(that.baseTemplate)) { return false; } if (!templateVersion.equals(that.templateVersion)) { return false; } boolean isThisLatest = templateVersion instanceof LatestVmTemplate; boolean isOtherLatest = that.getTemplateVersion() instanceof LatestVmTemplate; if (isThisLatest != isOtherLatest) { return false; } return true; } @Override public int hashCode() { int result = baseTemplate.hashCode(); result = 31 * result + templateVersion.hashCode(); result = 31 * result + (templateVersion instanceof LatestVmTemplate ? 1 : 0); return result; } @Override public int compareTo(TemplateWithVersion other) { final int baseTemplateComparison = compareBaseTemplate( this.getBaseTemplate(), other.getBaseTemplate()); if (baseTemplateComparison != 0) { return baseTemplateComparison; } return compareTemplateVersion(this.getTemplateVersion(), other.getTemplateVersion()); } /** * First <em>Latest</em>, then by version number - latter version first */ private static int compareTemplateVersion(VmTemplate a, VmTemplate b) { if (a instanceof LatestVmTemplate) { if (b instanceof LatestVmTemplate) { return 0; } else { return -1; } } else { if (b instanceof LatestVmTemplate) { return 1; } else { return - Integer.signum(Integer.compare(a.getTemplateVersionNumber(), b.getTemplateVersionNumber())); } } } /** * First blank, then by name */ private static int compareBaseTemplate(VmTemplate a, VmTemplate b) { if (a.isBlank()) { if (b.isBlank()) { return 0; } else { return -1; } } else { if (b.isBlank()) { return 1; } else { return a.getName().compareTo(b.getName()); } } } public boolean isLatest() { return this.getTemplateVersion() instanceof LatestVmTemplate; } }