package java.net;

import java.io.IOException;

public abstract class URLStreamHandler {
  protected void parseURL(URL url, String s, int start, int end) {
    String protocol = s.substring(0, start - 1);
    s = s.substring(start, end);

    String host = null;
    int port = -1;
    if (s.startsWith("//")) {
      s = s.substring(2);
      int colon = s.indexOf(':');
      int slash = s.indexOf('/');
      if (slash < 0) {
        if (colon < 0) {
          host = s;
        } else {
          host = s.substring(0, colon);
          port = Integer.parseInt(s.substring(colon + 1));
        }
        s = "";
      } else {
        if (colon < 0 || colon > slash) {
          host = s.substring(0, slash);
        } else {
          host = s.substring(0, colon);
          port = Integer.parseInt(s.substring(colon + 1), slash);
        }
        s = s.substring(slash + 1);
      }
    }

    String file = null;
    if (s.length() > 0) {
      file = s;
    }

    url.set(protocol, host, port, file, null);
  }

  private static boolean equals(String a, String b) {
    return (a == null && b == null) || (a != null && a.equals(b));
  }

  protected boolean equals(URL a, URL b) {
    return equals(a.getHost(), b.getHost())
      && (a.getPort() == b.getPort())
      && equals(a.getFile(), b.getFile());
  }

  protected String toExternalForm(URL url) {
    StringBuilder sb = new StringBuilder();
    sb.append(url.getProtocol()).append(":");
    if (url.getHost() != null) {
      sb.append("//").append(url.getHost());
      if (url.getPort() >= 0) {
        sb.append(":").append(url.getPort());
      }
    }
    if (url.getFile() != null) {
      if (url.getHost() != null) {
        sb.append("/");
      }
      sb.append(url.getFile());
    }
    return sb.toString();
  }

  protected abstract URLConnection openConnection(URL url) throws IOException;
}