package hep.io.root.daemon; import java.io.IOException; import java.io.InputStream; import java.net.Authenticator; import java.net.InetAddress; import java.net.PasswordAuthentication; import java.net.URL; import java.net.URLConnection; import java.util.logging.Logger; /** * The core class for dealing with root: protocol connections. * Currently only supports reading files. Currently only supports * plain text (insecure) authorization. * @author Tony Johnson */ public class RootURLConnection extends URLConnection { private String username; private String password; private String auth; // authorization mode to use private int bufferSize = 0; private DaemonInputStream connection; private long date; private long fSize; private static Logger logger = Logger.getLogger("hep.io.root.daemon"); RootURLConnection(URL url) { super(url); } public InputStream getInputStream() throws IOException { connect(); return connection; } public void connect() throws IOException { if (connected) return; if (auth == null) auth = System.getProperty("root.scheme"); if (auth != null && auth.equalsIgnoreCase("anonymous")) { username = "anonymous"; try { password = System.getProperty("user.name")+"@"+InetAddress.getLocalHost().getCanonicalHostName(); } catch (SecurityException x) { password = "freehep-user@freehep.org"; } } if (username == null) username = System.getProperty("root.user"); if (password == null) password = System.getProperty("root.password"); // Check for username password, if not present, and if allowed, prompt the user. if ((password == null || username == null) && getAllowUserInteraction()) { int port = url.getPort(); if (port == -1) port = RootProtocol.defaultPort; PasswordAuthentication pa = Authenticator.requestPasswordAuthentication(url.getHost(),null,port,"root","Username/Password required", auth); if (pa != null) { username = pa.getUserName(); password = new String(pa.getPassword()); } } if (password == null || username == null) throw new IOException("Authorization Required"); logger.fine("Opening rootd connection to: "+url); RootProtocol rp = new RootProtocol(url.getHost(),url.getPort(),auth,username,password); if (bufferSize != 0) rp.setBufferSize(bufferSize); rp.open(url.getFile()); String[] fstat = rp.fstat(); fSize = Long.parseLong(fstat[1]); date = Long.parseLong(fstat[3])*1000; connection = rp.openStream(fSize); connected = true; } public int getContentLength() { if (connection == null) return -1; return (int) fSize; } public long getLastModified() { if (connection == null) return -1; return date; } public long getDate() { return getLastModified(); } public void setRequestProperty(String key, String value) { if (key.equalsIgnoreCase("user")) username = value; else if (key.equalsIgnoreCase("password")) password = value; else if (key.equalsIgnoreCase("scheme")) auth = value; else if (key.equalsIgnoreCase("bufferSize")) bufferSize = Integer.parseInt(value); } }