package de.saumya.mojo.mavengem; import java.io.ByteArrayInputStream; import java.io.File; import java.io.InputStream; import java.io.IOException; import java.util.Map; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import java.net.URLStreamHandler; public class Handler extends URLStreamHandler { public static String KEY = "java.protocol.handler.pkgs"; public static String PKG = "de.saumya.mojo"; public static String PING_URL = "mavengem:https://rubygems.org" + MavenGemURLConnection.PING; private static RubygemsFactory factory; public synchronized static boolean isMavenGemProtocolRegistered() { return System.getProperties().contains(KEY); } public synchronized static boolean registerMavenGemProtocol() throws MalformedURLException { return registerMavenGemProtocol(RubygemsFactory.defaultFactory()); } public synchronized static boolean registerMavenGemProtocol(RubygemsFactory rubygemsFactory) { if (ping()) { // we can register the protocol only once return false; } factory = rubygemsFactory; if (System.getProperties().contains(KEY)) { String current = System.getProperty(KEY); if (!current.contains(PKG)) { System.setProperty(KEY, current + "|" + PKG); } } else { System.setProperty(KEY, PKG); } return ping(); } private static boolean ping() { try { // this url works offline as /maven/releases/ping is // not a remote resource. but using the protocol here // will register this instance Handler and other // classloaders will be able to use the mavengem-protocol as well // this does not go online see MavenGemURLConnection URL url = new URL(PING_URL); try (InputStream in = url.openStream()) { byte[] data = new byte[in.available()]; in.read(data, 0, data.length); return "pong".equals(new String(data)); } } catch(IOException e) { return false; } } private String uri; @Override protected void parseURL(URL u, String spec, int start, int end) { uri = spec.substring(start, end); super.parseURL(u, spec, start, end); } @Override protected URLConnection openConnection(URL url) throws IOException { return MavenGemURLConnection.create(factory, uri); } }