/** * Copyright 2012-2013 Maciej Jaworski, Mariusz Kapcia, Paweł Kędzia, Mateusz Kubuszok * * <p>Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at</p> * * <p>http://www.apache.org/licenses/LICENSE-2.0</p> * * <p>Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License.</p> */ package com.autoupdater.client.models; import static com.autoupdater.client.models.VersionNumber.UNVERSIONED; import static com.autoupdater.client.utils.comparables.Comparables.compare; import static com.google.common.base.Objects.equal; import java.util.Comparator; import java.util.SortedSet; import java.util.TreeSet; import com.autoupdater.client.utils.comparables.Comparables; import com.google.common.base.Objects; /** * Class representing Program - either on server or installed one. */ public class Package implements IModel<Package>, IModelWithVersionNumber { private String name; private String id; private Program program; private final SortedSet<Update> updates; private final SortedSet<ChangelogEntry> changelog; private VersionNumber versionNumber; Package() { name = ""; id = ""; versionNumber = UNVERSIONED; updates = new TreeSet<Update>(); changelog = new TreeSet<ChangelogEntry>(); } /** * Returns Program. * * @return Program */ public Program getProgram() { return program; } /** * Sets Program. * * @param program * Program */ void setProgram(Program program) { this.program = program; } /** * Returns changelog. * * @return changelog */ public SortedSet<ChangelogEntry> getChangelog() { return changelog; } /** * Sets changelog. * * @param changelog * changelog */ public void setChangelog(SortedSet<ChangelogEntry> changelog) { this.changelog.clear(); if (changelog != null) this.changelog.addAll(changelog); } /** * Return's Package's name. * * @return Package's name */ public String getName() { return name; } /** * Sets Package's name. * * @param name * Package's name */ void setName(String name) { this.name = name != null ? name : ""; } /** * Returns Package's ID. * * @return Package's ID */ public String getID() { return id; } /** * Sets Package's ID. * * @param id * Package's ID */ public void setID(String id) { this.id = id != null ? id : ""; } @Override public VersionNumber getVersionNumber() { return versionNumber; } /** * Sets Package's version number. * * @param major * Package's major version number * @param minor * Package's minor version number * @param release * Package's release version number * @param nightly * Package's nightly version number */ public void setVersionNumber(int major, int minor, int release, int nightly) { this.versionNumber = new VersionNumber(major, minor, release, nightly); } /** * Sets Package's version number. * * @param versionNumber * Package's version number */ public void setVersionNumber(String versionNumber) { this.versionNumber = new VersionNumber(versionNumber); } /** * Sets Package's version number. * * @param versionNumber * Package's version number */ public void setVersionNumber(VersionNumber versionNumber) { this.versionNumber = versionNumber != null ? versionNumber : VersionNumber.UNVERSIONED; } /** * Adds Update to the set. * * @param update * Update that should belong to Package */ public void addUpdate(Update update) { updates.add(update); update.setPackage(this); } /** * Whether Package has any Updates. * * @return true if Package has any Update */ public boolean hasUpdates() { return !updates.isEmpty(); } /** * Returns Package's Updates. * * @return Package's Updates */ public SortedSet<Update> getUpdates() { return updates; } /** * Sets Package's Updates. * * @param updates * new Package's Update */ public void setUpdates(SortedSet<Update> updates) { this.updates.clear(); if (updates != null) { this.updates.addAll(updates); for (Update update : updates) update.setPackage(this); } } /** * Whether Package can be updated with such Update. * * @param update * Update * @return true if Package could be updated with such Update */ public boolean isUpdatedBy(Update update) { return update != null && Objects.equal(id, update.getPackageID()); } /** * Whether package is installed and there aren't newer updates to be * installed. * * @return true if there are no newer updates or Update has the same version * number as Package */ public boolean isNotOutdated() { return !versionNumber.equals(UNVERSIONED) && (updates.isEmpty() || versionNumber.compareTo(updates.last().getVersionNumber()) >= 0); } @Override public boolean equals(Object obj) { if (obj == null || !(obj instanceof Package)) return false; else if (obj == this) return true; Package _package = (Package) obj; return equal(name, _package.name) && equal(versionNumber, _package.versionNumber) && equal(program, _package.program); } @Override public boolean equalVersions(IModelWithVersionNumber model) { return versionNumber.equals(model.getVersionNumber()); } @Override public int hashCode() { return (name + id).hashCode(); } @Override public int compareTo(Package o) { if (o == null) return 1; else if (o == this) return 0; else if (!equal(name, o.name)) return compare(name, o.name); else if (!equal(versionNumber, o.versionNumber)) return compare(versionNumber, o.versionNumber); return compare(program, o.program); } @Override public int compareVersions(IModelWithVersionNumber model) { return versionNumber.compareTo(model.getVersionNumber()); } @Override public String toString() { StringBuilder builder = new StringBuilder(); builder.append("[Package]").append('\n'); builder.append("Package name:\t").append(name).append('\n'); builder.append("Version number:\t").append(versionNumber).append('\n'); return builder.toString(); } @Override public Comparator<Package> getInstallationsServerPropertiesComparator() { return new CreationHelperComparator(); } @Override public Comparator<Package> getLocalInstallationsComparator() { return new InnerConsistencyComparator(); } @Override public Comparator<Package> getLocal2ServerComparator() { return new OuterMatchingComparator(); } static class CreationHelperComparator implements Comparator<Package> { @Override public int compare(Package o1, Package o2) { return (o1 == null) ? (o2 == null ? 0 : -1) : Comparables.compare(o1.name, o2.name); } } static class InnerConsistencyComparator implements Comparator<Package> { @Override public int compare(Package o1, Package o2) { if (o1 == null) return (o2 == null ? 0 : -1); if (Comparables.compare(o1.name, o2.name) != 0) return Comparables.compare(o1.name, o2.name); return Comparables.compare(o1.program, o2.program); } } static class OuterMatchingComparator implements Comparator<Package> { @Override public int compare(Package o1, Package o2) { return (o1 == null) ? (o2 == null ? 0 : -1) : Comparables.compare(o1.name, o2.name); } } }