/**
* 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.environment.settings.ProgramSettingsBuilder.builder;
import static com.autoupdater.client.models.Models.*;
import static com.autoupdater.client.models.Models.EComparisionType.LOCAL_INSTALLATIONS;
import static com.autoupdater.client.utils.comparables.Comparables.compare;
import static com.google.common.base.Objects.equal;
import static com.google.common.collect.Iterables.all;
import static java.lang.Math.pow;
import java.util.Comparator;
import java.util.SortedSet;
import java.util.TreeSet;
import com.autoupdater.client.environment.settings.ProgramSettings;
import com.autoupdater.client.utils.comparables.Comparables;
import com.google.common.base.Predicate;
/**
* Class representing Program - either on server or installed one.
*/
public class Program implements IModel<Program> {
private String name;
private String pathToProgramDirectory;
private String serverAddress;
private final SortedSet<Package> packages;
private final SortedSet<BugEntry> bugs;
private boolean developmentVersion;
Program() {
name = "";
pathToProgramDirectory = "";
serverAddress = "";
packages = new TreeSet<Package>();
bugs = new TreeSet<BugEntry>();
}
/**
* Search through set of ProgramSettings and returns matching one if
* possible.
*
* @param programsSettings
* set of ProgramSettings
* @return matching ProgramSettings if found, null otherwise
*/
public ProgramSettings findProgramSettings(SortedSet<ProgramSettings> programsSettings) {
return findEqual(programsSettings, builder().setProgramName(name)
.setPathToProgramDirectory(pathToProgramDirectory).setServerAddress(serverAddress)
.build(), LOCAL_INSTALLATIONS);
}
/**
* Return's Program's name.
*
* @return Program's name
*/
public String getName() {
return name;
}
/**
* Sets Program's name.
*
* @param name
* Program's name
*/
void setName(String name) {
this.name = name != null ? name : "";
}
/**
* Returns path to installation's directory.
*
* @return installation's directory
*/
public String getPathToProgramDirectory() {
return pathToProgramDirectory;
}
/**
* Sets path to installation's directory.
*
* @param pathToProgramDirectory
* installation's directory
*/
void setPathToProgramDirectory(String pathToProgramDirectory) {
this.pathToProgramDirectory = pathToProgramDirectory != null ? pathToProgramDirectory : "";
}
/**
* Returns this Program's server's URL.
*
* @return server URL
*/
public String getServerAddress() {
return serverAddress;
}
/**
* Sets this Program's server's URL.
*
* @param serverAddress
* server's URL
*/
public void setServerAddress(String serverAddress) {
this.serverAddress = serverAddress != null ? serverAddress : "";
if (this.serverAddress.endsWith("/"))
this.serverAddress = this.serverAddress.substring(0, this.serverAddress.length() - 1);
if (!this.serverAddress.startsWith("http://") && !this.serverAddress.startsWith("https://"))
this.serverAddress = "http://" + this.serverAddress;
}
/**
* Whether Program is for development version.
*
* @return whether Program is for development version
*/
public boolean isDevelopmentVersion() {
return developmentVersion;
}
/**
* Sets whether Program is for development version
*
* @param developmentVersion
* whether Program is for development version
*/
public void setDevelopmentVersion(boolean developmentVersion) {
this.developmentVersion = developmentVersion;
}
/**
* Sets whether Program is for development version
*
* @param developmentVersion
* whether Program is for development version
*/
public void setDevelopmentVersion(String developmentVersion) {
this.developmentVersion = Boolean.valueOf(developmentVersion);
}
/**
* Returns Program's Packages.
*
* @return Program's Packages
*/
public SortedSet<Package> getPackages() {
return packages;
}
/**
* Sets Program's Packages
*
* @param packages
* Program's Packages
*/
public void setPackages(SortedSet<Package> packages) {
this.packages.clear();
if (packages != null) {
this.packages.addAll(packages);
configurePackages();
}
}
/**
* Returns Program's Bugs.
*
* @return Program's Bugs
*/
public SortedSet<BugEntry> getBugs() {
return bugs;
}
/**
* Sets Program's Bugs.
*
* @param bugs
* Program's Bugs
*/
public void setBugs(SortedSet<BugEntry> bugs) {
this.bugs.clear();
if (bugs != null)
this.bugs.addAll(bugs);
}
/**
* Whether such Package belongs to Program.
*
* @param _package
* Package
* @return true if such Package belongs to Program
*/
public boolean hasMember(Package _package) {
return packages != null && packages.contains(_package);
}
/**
* Whether there aren't newer Updates to be installed.
*
* @return true if there are no new Updates to install
*/
public boolean isNotOutdated() {
return all(packages, new Predicate<Package>() {
@Override
public boolean apply(Package _package) {
return _package.isNotOutdated();
}
});
}
@Override
public boolean equals(Object obj) {
if (obj == null || !(obj instanceof Program))
return false;
else if (obj == this)
return true;
Program program = (Program) obj;
return equal(name, program.name) && equal(serverAddress, program.serverAddress)
&& equal(pathToProgramDirectory, program.pathToProgramDirectory);
}
@Override
public int hashCode() {
return ((int) pow(name.hashCode(), 8)) + ((int) pow(serverAddress.hashCode(), 4))
+ pathToProgramDirectory.hashCode();
}
@Override
public int compareTo(Program 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(serverAddress, o.serverAddress))
return compare(serverAddress, o.serverAddress);
return compare(pathToProgramDirectory, o.pathToProgramDirectory);
}
private void configurePackages() {
if (packages != null)
for (Package _package : packages)
_package.setProgram(this);
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("[Program]").append('\n');
builder.append("Name on server:\t\t").append(name).append('\n');
builder.append("Installation dir:\t").append(pathToProgramDirectory).append('\n');
builder.append("Server address:\t\t").append(serverAddress).append('\n');
builder.append("Version type:\t\t").append(developmentVersion ? "development" : "release")
.append('\n');
builder.append("Known bugs:").append('\n');
for (BugEntry bug : bugs)
builder.append(addPrefixToEachLine(bug, "\t"));
return builder.toString();
}
@Override
public Comparator<Program> getInstallationsServerPropertiesComparator() {
return new InstallationsServerPropertiesComparator();
}
@Override
public Comparator<Program> getLocalInstallationsComparator() {
return new LocalInstallationsComparator();
}
@Override
public Comparator<Program> getLocal2ServerComparator() {
return new Local2ServerComparator();
}
static class InstallationsServerPropertiesComparator implements Comparator<Program> {
@Override
public int compare(Program o1, Program o2) {
if (o1 == null)
return (o2 == null ? 0 : -1);
else if (!equal(o1.name, o2.name))
return Comparables.compare(o1.name, o2.name);
else if (!equal(o1.serverAddress, o2.serverAddress))
return Comparables.compare(o1.serverAddress, o2.serverAddress);
return Comparables.compare(o1.pathToProgramDirectory, o2.pathToProgramDirectory);
}
}
static class LocalInstallationsComparator implements Comparator<Program> {
@Override
public int compare(Program o1, Program o2) {
if (o1 == null)
return (o2 == null ? 0 : -1);
else if (!equal(o1.name, o2.name))
return Comparables.compare(o1.name, o2.name);
else if (!equal(o1.serverAddress, o2.serverAddress))
return Comparables.compare(o1.serverAddress, o2.serverAddress);
return Comparables.compare(o1.pathToProgramDirectory, o2.pathToProgramDirectory);
}
}
static class Local2ServerComparator implements Comparator<Program> {
@Override
public int compare(Program o1, Program o2) {
return (o1 == null) ? (o2 == null ? 0 : -1) : Comparables.compare(o1.name, o2.name);
}
}
}