Java tutorial
/** * Copyright (C) 2015 Michael Schnell. All rights reserved. * http://www.fuin.org/ * * This library 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. * * This library 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 Lesser General Public License for more * details. * * You should have received a copy of the GNU Lesser General Public License * along with this library. If not, see http://www.gnu.org/licenses/. */ package org.fuin.esmp; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.io.Reader; import java.net.URL; import java.util.ArrayList; import java.util.Collections; import java.util.List; import javax.json.Json; import javax.json.JsonArray; import javax.json.JsonObject; import javax.json.JsonReader; import org.apache.commons.io.FileUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Parses all available versions and provides easy access to this information. */ public final class Downloads { private static final Logger LOG = LoggerFactory.getLogger(Downloads.class); private static final String VERSION_URL = "https://geteventstore.com/downloads/downloads.json"; private static final int TIMEOUT_30_SECONDS = 1000 * 30; private final File jsonDownloadsFile; private final List<DownloadOS> osList; /** * Constructor with local file. If the file does not exist, a current * version of the version file will be loaded. * * @param jsonDownloadsFile * Name of the JSON download file. * * @throws IOException * Copying the event store version file from URL to local disc * failed. */ public Downloads(final File jsonDownloadsFile) throws IOException { super(); this.jsonDownloadsFile = jsonDownloadsFile; this.osList = new ArrayList<>(); if (!jsonDownloadsFile.exists()) { LOG.info("Download version file: " + VERSION_URL); FileUtils.copyURLToFile(new URL(VERSION_URL), jsonDownloadsFile, TIMEOUT_30_SECONDS, TIMEOUT_30_SECONDS); } LOG.info("Local version file: " + jsonDownloadsFile); } /** * Returns the OS with a given name. * * @param name * OS name to find. * * @return Found instance or <code>null</code> if no OS with that name was * found. */ public DownloadOS findOS(final String name) { if (osList == null) { return null; } final int idx = osList.indexOf(new DownloadOS(name)); if (idx < 0) { return null; } return osList.get(idx); } /** * Loads the data from the JSON download versions file. * * @throws IOException * Parsing the event store version file failed. */ public final void parse() throws IOException { final Reader reader = new FileReader(jsonDownloadsFile); try { final JsonReader jsonReader = Json.createReader(reader); final JsonArray osArray = jsonReader.readArray(); for (int i = 0; i < osArray.size(); i++) { final JsonObject osObj = (JsonObject) osArray.get(i); final String os = osObj.getString("os"); final String currentVersion = osObj.getString("currentVersion"); final JsonArray downloadsArray = osObj.getJsonArray("downloads"); final List<DownloadVersion> versions = new ArrayList<>(); for (int j = 0; j < downloadsArray.size(); j++) { final JsonObject downloadObj = (JsonObject) downloadsArray.get(j); final String version = downloadObj.getString("version"); final String url = downloadObj.getString("url"); versions.add(new DownloadVersion(version, url)); } Collections.sort(versions); osList.add(new DownloadOS(os, currentVersion, versions)); } Collections.sort(osList); } finally { reader.close(); } for (final DownloadOS os : osList) { LOG.info("Latest '" + os + "': " + os.getLatestVersion() + " (Versions: " + os.getVersions().size() + ")"); } } /** * Returns the parsed file. * * @return File. */ public final File getJsonDownloadsFile() { return jsonDownloadsFile; } /** * Returns the OS list. * * @return Available download versions. */ public List<DownloadOS> getOsList() { return Collections.unmodifiableList(osList); } }