Java tutorial
/* * This file is part of Technic Launcher. * Copyright 2015 Syndicate, LLC * * Technic Launcher is free software: you can redistribute it and/or modify * it under the terms of the GNU 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 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 * along with Technic Launcher. If not, see <http://www.gnu.org/licenses/>. */ package net.technicpack.utilslib; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import net.technicpack.launchercore.exception.DownloadException; import net.technicpack.launchercore.mirror.MirrorStore; import org.apache.commons.io.IOUtils; import java.io.*; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.util.logging.Logger; public class Utils { private static final Gson gson; private static final Logger logger = Logger.getLogger("net.technicpack.launcher.Main"); static { GsonBuilder builder = new GsonBuilder(); builder.setPrettyPrinting(); gson = builder.create(); } public static Gson getGson() { return gson; } public static Logger getLogger() { return logger; } /** * Establishes an HttpURLConnection from a URL, with the correct configuration to receive content from the given URL. * * @param url The URL to set up and receive content from * @return A valid HttpURLConnection * @throws IOException The openConnection() method throws an IOException and the calling method is responsible for handling it. */ public static HttpURLConnection openHttpConnection(URL url) throws IOException { HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setDoInput(true); conn.setDoOutput(false); System.setProperty("http.agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.162 Safari/535.19"); conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.162 Safari/535.19"); conn.setUseCaches(false); return conn; } /** * Opens an HTTP connection to a web URL and tests that the response is a valid 200-level code * and we can successfully open a stream to the content. * * @param urlLoc The HTTP URL indicating the location of the content. * @return True if the content can be accessed successfully, false otherwise. */ public static boolean pingHttpURL(String urlLoc, MirrorStore mirrorStore) { InputStream stream = null; try { final URL url = mirrorStore.getFullUrl(urlLoc); HttpURLConnection conn = openHttpConnection(url); int responseCode = conn.getResponseCode(); int responseFamily = responseCode / 100; if (responseFamily == 3) { String newUrl = conn.getHeaderField("Location"); URL redirectUrl = null; try { redirectUrl = new URL(newUrl); } catch (MalformedURLException ex) { throw new DownloadException("Invalid Redirect URL: " + url, ex); } conn = openHttpConnection(redirectUrl); responseCode = conn.getResponseCode(); responseFamily = responseCode / 100; } if (responseFamily == 2) { stream = conn.getInputStream(); return true; } else { return false; } } catch (IOException e) { return false; } finally { IOUtils.closeQuietly(stream); } } public static boolean sendTracking(String category, String action, String label, String clientId) { String url = "http://www.google-analytics.com/collect"; try { URL urlObj = new URL(url); HttpURLConnection con = (HttpURLConnection) urlObj.openConnection(); con.setRequestMethod("POST"); String urlParameters = "v=1&tid=UA-30896795-3&cid=" + clientId + "&t=event&ec=" + category + "&ea=" + action + "&el=" + label; con.setDoOutput(true); DataOutputStream wr = new DataOutputStream(con.getOutputStream()); wr.writeBytes(urlParameters); wr.flush(); wr.close(); int responseCode = con.getResponseCode(); Utils.getLogger().info("Analytics Response [" + category + "]: " + responseCode); BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream())); String inputLine; StringBuffer response = new StringBuffer(); while ((inputLine = in.readLine()) != null) { response.append(inputLine); } in.close(); return true; } catch (IOException e) { return false; } } /** * * Run a command on the local command line and return the program output. * THIS COMMAND IS BLOCKING! Only run for short command line stuff, or I guess run on a thread. * * @param command List of args to run on the command line * @return The newline-separated program output */ public static String getProcessOutput(String... command) { String out = null; try { ProcessBuilder pb = new ProcessBuilder(command); pb.redirectErrorStream(true); Process process = pb.start(); final BufferedReader bufferedReader = new BufferedReader( new InputStreamReader(process.getInputStream())); final StringBuilder response = new StringBuilder(); new Thread(new Runnable() { @Override public void run() { try { String line; while ((line = bufferedReader.readLine()) != null) { response.append(line + "\n"); } } catch (IOException ex) { //Don't let other process' problems concern us } finally { IOUtils.closeQuietly(bufferedReader); } } }).start(); process.waitFor(); if (response.toString().length() > 0) { out = response.toString().trim(); } } catch (IOException e) { //Some kind of problem running java -version or getting output, just assume the version is bad return null; } catch (InterruptedException ex) { //Something booted us while we were waiting on java -version to complete, just assume //this version is bad return null; } return out; } }