package sk.tomsik68.mclauncher.impl.versions.mcdownload;
import sk.tomsik68.mclauncher.api.common.IObservable;
import sk.tomsik68.mclauncher.api.common.IObserver;
import sk.tomsik68.mclauncher.api.common.MCLauncherAPI;
import sk.tomsik68.mclauncher.api.common.mc.MinecraftInstance;
import sk.tomsik68.mclauncher.api.versions.IVersion;
import sk.tomsik68.mclauncher.api.versions.IVersionList;
import sk.tomsik68.mclauncher.api.versions.LatestVersionInformation;
import sk.tomsik68.mclauncher.impl.common.Observable;
import sk.tomsik68.mclauncher.impl.common.Platform;
/**
* Unified version list for {@link MCDownloadVersion}s. Contains local versions as well as remote.
*/
public final class MCDownloadVersionList extends Observable<String> implements IVersionList, IObserver<String> {
private final MCDownloadLocalVersionList localVersionList;
private final MCDownloadOnlineVersionList onlineVersionList;
/**
* Creates new MCDownloadVersionList which fetches local JSON files
* from given minecraft instance
* @param mc where to fetch JSON files from
*/
public MCDownloadVersionList(MinecraftInstance mc) {
onlineVersionList = new MCDownloadOnlineVersionList();
localVersionList = new MCDownloadLocalVersionList(mc);
onlineVersionList.addObserver(this);
localVersionList.addObserver(this);
}
@Override
public void startDownload() throws Exception {
localVersionList.startDownload();
onlineVersionList.startDownload();
}
@Override
public IVersion retrieveVersionInfo(String id) throws Exception {
IVersion result;
result = localVersionList.retrieveVersionInfo(id);
if (result == null)
result = onlineVersionList.retrieveVersionInfo(id);
if(result != null)
resolveInheritance((MCDownloadVersion)result);
return result;
}
@Override
public LatestVersionInformation getLatestVersionInformation() throws Exception {
return onlineVersionList.getLatestVersionInformation();
}
void resolveInheritance(MCDownloadVersion version) throws Exception {
// version's parent needs to be resolved first
if (version.getInheritsFrom() != null) {
MCDownloadVersion parent = (MCDownloadVersion) retrieveVersionInfo(version.getInheritsFrom());
resolveInheritance(parent);
version.doInherit(parent);
}
}
@Override
public void onUpdate(IObservable<String> observable, String changed) {
notifyObservers(changed);
}
}