Java tutorial
/* * This file is part of Technic Launcher Core. * Copyright 2015 Syndicate, LLC * * Technic Launcher Core is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Technic Launcher Core is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License, * as well as a copy of the GNU Lesser General Public License, * along with Technic Launcher Core. If not, see <http://www.gnu.org/licenses/>. */ package net.technicpack.launchercore.modpacks; import net.technicpack.launchercore.install.LauncherDirectories; import net.technicpack.launchercore.install.Version; import net.technicpack.launchercore.modpacks.packinfo.CombinedPackInfo; import net.technicpack.launchercore.modpacks.sources.IInstalledPackRepository; import net.technicpack.launchercore.modpacks.sources.IModpackTagBuilder; import net.technicpack.platform.io.FeedItem; import net.technicpack.platform.io.PlatformPackInfo; import net.technicpack.rest.io.PackInfo; import net.technicpack.rest.io.Resource; import net.technicpack.solder.io.SolderPackInfo; import net.technicpack.utilslib.Utils; import org.apache.commons.io.FileUtils; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.logging.Level; public class ModpackModel { private InstalledPack installedPack; private PackInfo packInfo; private IInstalledPackRepository installedPackRepository; private LauncherDirectories directories; private Collection<String> tags = new ArrayList<String>(); private String buildName; private boolean isPlatform; private File installedDirectory; private int priority = -2; public ModpackModel(InstalledPack installedPack, PackInfo info, IInstalledPackRepository installedPackRepository, LauncherDirectories directories) { this(); this.installedPack = installedPack; this.packInfo = info; this.installedPackRepository = installedPackRepository; this.directories = directories; } protected ModpackModel() { buildName = InstalledPack.RECOMMENDED; isPlatform = true; } public boolean isOfficial() { if (packInfo == null) return false; return packInfo.isOfficial(); } public InstalledPack getInstalledPack() { return installedPack; } public PackInfo getPackInfo() { return packInfo; } public void setInstalledPack(InstalledPack pack, IInstalledPackRepository packRepo) { installedPack = pack; installedPackRepository = packRepo; } public void setPackInfo(PackInfo packInfo) { //HACK //I need to rework the way platform & solder data interact to produce a complete pack, but until I do so, this //awesome hack will combine platform & solder data where necessary if (packInfo instanceof SolderPackInfo && this.packInfo instanceof PlatformPackInfo) { this.packInfo = new CombinedPackInfo(packInfo, this.packInfo); } else if (packInfo instanceof PlatformPackInfo && this.packInfo instanceof SolderPackInfo) { this.packInfo = new CombinedPackInfo(this.packInfo, packInfo); } else if (packInfo instanceof SolderPackInfo && this.packInfo instanceof CombinedPackInfo) { this.packInfo = new CombinedPackInfo(packInfo, this.packInfo); } else if (packInfo instanceof PlatformPackInfo && this.packInfo instanceof CombinedPackInfo) { this.packInfo = new CombinedPackInfo(this.packInfo, packInfo); } else { this.packInfo = packInfo; } } public String getDiscordId() { if (packInfo != null) return packInfo.getDiscordId(); else return null; } public String getName() { if (packInfo != null) { return packInfo.getName(); } else if (installedPack != null) { return installedPack.getName(); } else return null; } public String getDisplayName() { if (packInfo != null) { return packInfo.getDisplayName(); } else if (installedPack != null) { return installedPack.getName(); } else return ""; } public void setBuild(String build) { if (installedPack != null) { installedPack.setBuild(build); save(); } else buildName = build; } public String getBuild() { if (installedPack != null) { return installedPack.getBuild(); } else return buildName; } public List<String> getBuilds() { if (packInfo != null && packInfo.getBuilds() != null) return packInfo.getBuilds(); List<String> oneBuild = new ArrayList<String>(1); Version version = getInstalledVersion(); if (version != null) oneBuild.add(version.getVersion()); else oneBuild.add(getBuild()); return oneBuild; } public String getRecommendedBuild() { if (packInfo != null && packInfo.getRecommended() != null) return packInfo.getRecommended(); else return getBuild(); } public String getLatestBuild() { if (packInfo != null && packInfo.getLatest() != null) return packInfo.getLatest(); else return getBuild(); } public String getWebSite() { if (getPackInfo() == null) return null; return getPackInfo().getWebSite(); } public Resource getIcon() { if (packInfo == null) return null; return packInfo.getIcon(); } public Resource getLogo() { if (packInfo == null) return null; return packInfo.getLogo(); } public Resource getBackground() { if (packInfo == null) return null; return packInfo.getBackground(); } public ArrayList<FeedItem> getFeed() { if (packInfo == null) return new ArrayList<FeedItem>(); return packInfo.getFeed(); } public boolean isLocalOnly() { if (packInfo == null) return true; return packInfo.isLocal(); } public Version getInstalledVersion() { Version version = null; File versionFile = new File(getBinDir(), "version"); if (versionFile.exists()) { return Version.load(versionFile); } else { return null; } } public boolean hasRecommendedUpdate() { if (installedPack == null || packInfo == null) return false; Version installedVersion = getInstalledVersion(); if (installedVersion == null) return false; String installedBuild = installedVersion.getVersion(); List<String> allBuilds = packInfo.getBuilds(); if (!allBuilds.contains(installedBuild)) return true; for (String build : allBuilds) { if (build.equalsIgnoreCase(packInfo.getRecommended())) { return false; } else if (build.equalsIgnoreCase(installedBuild)) { return true; } } return false; } public void setIsPlatform(boolean isPlatform) { if (installedPack == null) { this.isPlatform = isPlatform; } } public String getDescription() { if (packInfo == null) return ""; return packInfo.getDescription(); } public boolean isServerPack() { if (packInfo == null) return false; return packInfo.isServerPack(); } public Integer getLikes() { if (packInfo == null) return null; return packInfo.getLikes(); } public Integer getRuns() { if (packInfo == null) return null; return packInfo.getRuns(); } public Integer getDownloads() { if (packInfo == null) return null; return packInfo.getDownloads(); } public RunData getRunData() { File runDataFile = new File(getBinDir(), "runData"); if (!runDataFile.exists()) return null; String runData = "{}"; try { runData = FileUtils.readFileToString(runDataFile); } catch (IOException ex) { return null; } return (RunData) Utils.getGson().fromJson(runData, RunData.class); } public File getInstalledDirectory() { if (installedPack == null) return null; if (installedDirectory == null) { String rawDir = installedPack.getDirectory(); if (rawDir != null && rawDir.startsWith(InstalledPack.LAUNCHER_DIR)) { rawDir = new File(directories.getLauncherDirectory(), rawDir.substring(InstalledPack.LAUNCHER_DIR.length())).getAbsolutePath(); } if (rawDir != null && rawDir.startsWith(InstalledPack.MODPACKS_DIR)) { rawDir = new File(directories.getModpacksDirectory(), rawDir.substring(InstalledPack.MODPACKS_DIR.length())).getAbsolutePath(); } setInstalledDirectory(new File(rawDir)); } return installedDirectory; } public File getBinDir() { File installedDir = getInstalledDirectory(); if (installedDir == null) return null; return new File(installedDir, "bin"); } public File getModsDir() { File installedDir = getInstalledDirectory(); if (installedDir == null) return null; return new File(installedDir, "mods"); } public File getCoremodsDir() { File installedDir = getInstalledDirectory(); if (installedDir == null) return null; return new File(installedDir, "coremods"); } public File getCacheDir() { File installedDir = getInstalledDirectory(); if (installedDir == null) return null; return new File(installedDir, "cache"); } public File getConfigDir() { File installedDir = getInstalledDirectory(); if (installedDir == null) return null; return new File(installedDir, "config"); } public File getResourcesDir() { File installedDir = getInstalledDirectory(); if (installedDir == null) return null; return new File(installedDir, "resources"); } public File getSavesDir() { File installedDir = getInstalledDirectory(); if (installedDir == null) return null; return new File(installedDir, "saves"); } public void initDirectories() { getBinDir().mkdirs(); getModsDir().mkdirs(); getCoremodsDir().mkdirs(); getConfigDir().mkdirs(); getCacheDir().mkdirs(); getResourcesDir().mkdirs(); getSavesDir().mkdirs(); } public void setInstalledDirectory(File targetDirectory) { if (installedDirectory != null && installedDirectory.exists()) { try { FileUtils.copyDirectory(installedDirectory, targetDirectory); FileUtils.cleanDirectory(installedDirectory); } catch (IOException ex) { Utils.getLogger().log(Level.SEVERE, ex.getMessage(), ex); return; } } installedDirectory = targetDirectory; String path = installedDirectory.getAbsolutePath(); if (path.equals(directories.getModpacksDirectory().getAbsolutePath())) { installedPack.setDirectory(InstalledPack.MODPACKS_DIR); } else if (path.equals(directories.getLauncherDirectory().getAbsolutePath())) { installedPack.setDirectory(InstalledPack.LAUNCHER_DIR); } else if (path.startsWith(directories.getModpacksDirectory().getAbsolutePath())) { installedPack.setDirectory(InstalledPack.MODPACKS_DIR + path.substring(directories.getModpacksDirectory().getAbsolutePath().length() + 1)); } else if (path.startsWith(directories.getLauncherDirectory().getAbsolutePath())) { installedPack.setDirectory(InstalledPack.LAUNCHER_DIR + path.substring(directories.getLauncherDirectory().getAbsolutePath().length() + 1)); } else installedPack.setDirectory(path); save(); } public void save() { if (installedPack == null) { installedPack = new InstalledPack(getName(), getBuild()); } installedPackRepository.put(installedPack); installedPackRepository.save(); } public boolean isSelected() { String selectedSlug = installedPackRepository.getSelectedSlug(); if (selectedSlug == null) select(); return (selectedSlug == null || selectedSlug.equalsIgnoreCase(getName())); } public void select() { installedPackRepository.setSelectedSlug(getName()); installedPackRepository.save(); } public Collection<String> getTags() { return tags; } public void updateTags(IModpackTagBuilder tagBuilder) { this.tags.clear(); if (tagBuilder != null) { for (String tag : tagBuilder.getModpackTags(this)) { this.tags.add(tag); } } } public int getPriority() { return priority; } public void updatePriority(int priority) { if (this.priority < priority) { this.priority = priority; } if (this.priority == -1 && this.packInfo != null && this.packInfo.isComplete()) { if (this.packInfo.isOfficial()) this.priority = 5000; else this.priority = 1000; } } public void resetPack() { if (installedPack != null && getBinDir() != null) { File version = new File(getBinDir(), "version"); if (version.exists()) version.delete(); } } public void delete() { if (getInstalledDirectory() != null && getInstalledDirectory().exists()) { try { FileUtils.deleteDirectory(getInstalledDirectory()); } catch (IOException ex) { Utils.getLogger().log(Level.SEVERE, ex.getMessage(), ex); } } File assets = new File(directories.getAssetsDirectory(), getName()); if (assets.exists()) { try { FileUtils.deleteDirectory(assets); } catch (IOException ex) { Utils.getLogger().log(Level.SEVERE, ex.getMessage(), ex); } } installedPackRepository.remove(getName()); installedPack = null; installedDirectory = null; } }