package beast.util;
import java.net.URL;
import java.util.*;
import beast.core.Description;
/**
* BEAUti Package managed by AddOnManager
* all property is for installed package only
* the released/latest package info is online
*
* modified by Walter Xie
*/
@Description("BEAUti package managed by package manager, also named as add-on previously")
public class Package {
protected String packageName, description;
protected PackageVersion installedVersion;
protected Set<PackageDependency> installedVersionDeps;
protected TreeMap<PackageVersion, URL> availableVersionURLs;
protected TreeMap<PackageVersion, Set<PackageDependency>> availableVersionDeps;
protected URL projectURL;
public Package(String name) {
this.packageName = name;
this.description = "";
availableVersionURLs = new TreeMap<>();
availableVersionDeps = new TreeMap<>();
}
public String getName() {
return packageName;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public URL getProjectURL() {
return projectURL;
}
public void setProjectURL(URL url) {
this.projectURL = url;
}
/**
* @return true iff package is available online.
*/
public boolean isAvailable() {
return !availableVersionURLs.isEmpty();
}
/**
* @param version version of package
* @return true iff version of package is available
*/
public boolean isAvailable(PackageVersion version) {
return availableVersionURLs.containsKey(version);
}
public void addAvailableVersion(PackageVersion version, URL url, Set<PackageDependency> dependencies) {
availableVersionURLs.put(version, url);
availableVersionDeps.put(version, dependencies);
}
public void setInstalled(PackageVersion version, Set<PackageDependency> dependencies) {
installedVersion = version;
installedVersionDeps = dependencies;
}
public PackageVersion getInstalledVersion() {
return installedVersion;
}
public boolean isInstalled() {
return installedVersion != null;
}
/**
* @return true if a newer version is available.
*/
public boolean newVersionAvailable() {
return isAvailable() &&
(!isInstalled() || getLatestVersion().compareTo(getInstalledVersion()) > 0);
}
public Set<PackageDependency> getInstalledVersionDependencies() {
return installedVersionDeps;
}
/**
* @return latest available version of package.
*/
public PackageVersion getLatestVersion() {
return availableVersionURLs.isEmpty()
? null
: availableVersionURLs.lastKey();
}
/**
* @return URL corresponding to latest available version of package.
*/
public URL getLatestVersionURL() {
return isAvailable()
? availableVersionURLs.lastEntry().getValue()
: null;
}
/**
* Retrieve URL corresponding to particular available version of package.
*
* @param version version of package
* @return URL
*/
public URL getVersionURL(PackageVersion version) {
return isAvailable(version)
? availableVersionURLs.get(version)
: null;
}
public Set<PackageDependency> getLatestVersionDependencies() {
return isAvailable()
? availableVersionDeps.lastEntry().getValue()
: null;
}
public Set<PackageDependency> getDependencies(PackageVersion version) {
return availableVersionDeps.get(version);
}
/**
* @return list of available package versions, sorted in order of decreasing version.
*/
public List<PackageVersion> getAvailableVersions() {
List<PackageVersion> versionList = new ArrayList<>(availableVersionURLs.keySet());
Collections.sort(versionList);
Collections.reverse(versionList);
return versionList;
}
public boolean latestVersionDependsOn(Package pkg) {
if (!isAvailable())
throw new IllegalStateException("Requested latest available version dependencies " +
"when there is no available version.");
for (PackageDependency packageDependency : availableVersionDeps.lastEntry().getValue()) {
if (packageDependency.dependencyName.equals(pkg.packageName))
return true;
}
return false;
}
public boolean installedVersionDependsOn(Package pkg) {
if (!isInstalled())
throw new IllegalStateException("Requested installed version dependencies " +
"when there is no installed version.");
for (PackageDependency packageDependency : installedVersionDeps) {
if (packageDependency.dependencyName.equals(pkg.packageName))
return true;
}
return false;
}
public String getDependenciesString() {
if (availableVersionDeps.isEmpty())
return "";
String depString = "";
for (PackageDependency packageDependency : availableVersionDeps.lastEntry().getValue()) {
String s = packageDependency.dependencyName;
if (!s.equalsIgnoreCase(AddOnManager.BEAST_PACKAGE_NAME)) {
depString += s + ", ";
}
}
if (depString.length() > 2) {
depString = depString.substring(0, depString.length() - 2);
}
return depString;
}
@Override
public String toString() {
return packageName;
}
public String toHTML() {
String html = "<html>";
html += "<h1>" + packageName + "</h1>";
html += "<p>Installed version: " + (isInstalled() ? getInstalledVersion() : "NA") + "</p>";
html += "<p>Latest version: " + (isAvailable() ? getLatestVersion() : "NA") + "</p>";
html += "<p>" + description +"</p>";
html += "</html>";
return html;
}
}