/* * This file is part of Sponge, licensed under the MIT License (MIT). * * Copyright (c) SpongePowered <https://www.spongepowered.org> * Copyright (c) contributors * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ package org.spongepowered.launch; import org.spongepowered.launch.gui.LaunchInfoPanel; import java.io.File; import java.io.IOException; import java.lang.reflect.Method; import java.net.URI; import java.util.Scanner; import java.util.jar.Attributes; import java.util.jar.JarFile; import javax.imageio.ImageIO; import javax.swing.JDialog; import javax.swing.JOptionPane; import javax.swing.WindowConstants; import javax.swing.border.EmptyBorder; /** * Bootstrap class to provide some help for end users and manage headless * self-install deployment via Ivy */ public class Main { private static final File JAR = Main.getJar(); public static final String JAR_NAME = Main.getJarName(); private static Attributes manifestAttributes = null; public static void main(String[] argv) { if (System.console() == null && !Main.checkHeadlessState()) { Main.displayGraphicalMessage(); return; } Main.printHeader(); Main.printUsage(); } private static void displayGraphicalMessage() { JOptionPane messagePane = new JOptionPane(new LaunchInfoPanel(), JOptionPane.PLAIN_MESSAGE, JOptionPane.DEFAULT_OPTION); messagePane.setBorder(new EmptyBorder(0, 0, 20, 0)); String dialogTitle = "Cannot start this jar directly - " + Main.getManifestAttribute("Implementation-Version", "DEV"); JDialog dialog = messagePane.createDialog(null, dialogTitle); try { dialog.setIconImage(ImageIO.read(LaunchInfoPanel.class.getResourceAsStream("sponge_icon.png"))); } catch (IOException ex) { // load icon failed :( } dialog.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); dialog.setModal(true); dialog.setVisible(true); dialog.dispose(); } private static void printHeader() { System.out.printf("\n%s v%s for Minecraft Forge %s\n implementing %s version %s\n", Main.getManifestAttribute("Implementation-Name", "Sponge"), Main.getManifestAttribute("Implementation-Version", "DEV"), Main.getManifestAttribute("TargetForgeBuild", ""), Main.getManifestAttribute("Specification-Name", "SpongeAPI"), Main.getManifestAttribute("Specification-Version", "DEV") ); } private static boolean checkHeadlessState() { try { Class<?> clGraphicsEnvironment = Class.forName("java.awt.GraphicsEnvironment"); Method mdIsHeadless = clGraphicsEnvironment.getDeclaredMethod("isHeadless"); return (Boolean)mdIsHeadless.invoke(null); } catch (Exception ex) { // ignore } return true; } private static void printUsage() { Scanner help = new Scanner(Main.class.getResourceAsStream("help.txt")).useDelimiter("\\Z"); System.out.print(help.next().replace("${jarfile}", Main.JAR_NAME)); } private static File getJar() { try { File jar = new File(Main.class.getProtectionDomain().getCodeSource().getLocation().toURI()); if (jar.isFile()) { return jar; } } catch (IllegalArgumentException ex) { try { String uriFull = Main.class.getProtectionDomain().getCodeSource().getLocation().toURI().toString(); int bangPos = uriFull.lastIndexOf('!'); if (bangPos > -1 && uriFull.startsWith("jar:")) { File jar = new File(URI.create(uriFull.substring(4, bangPos))); if (jar.isFile()) { return jar; } } } catch (Exception ex1) { // ex1.printStackTrace(); } } catch (Exception ex) { // derp } return null; } private static String getJarName() { return Main.JAR != null ? Main.JAR.getName() : "sponge.jar"; } public static String getManifestAttribute(String key, String defaultValue) { if (Main.JAR == null) { return defaultValue; } Attributes manifestAttributes = Main.getManifestAttributes(); return manifestAttributes != null ? manifestAttributes.getValue(key) : defaultValue; } private static Attributes getManifestAttributes() { if (Main.manifestAttributes == null) { JarFile jarFile = null; try { jarFile = new JarFile(Main.JAR); Main.manifestAttributes = jarFile.getManifest().getMainAttributes(); } catch (IOException ex) { // be quiet checkstyle } finally { if (jarFile != null) { try { jarFile.close(); } catch (IOException ex) { // this could be an issue later on :( } } } } return Main.manifestAttributes; } }