import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.net.URL;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;
import java.util.regex.Pattern;
import javax.swing.JFrame;
import javax.swing.JTree;
import javax.swing.text.ChangedCharSetException;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.html.HTML;
import javax.swing.text.html.parser.DTD;
import javax.swing.text.html.parser.Parser;
import javax.swing.text.html.parser.TagElement;
import javax.swing.tree.DefaultMutableTreeNode;

public class Linker extends JFrame {

    LinkParser parser;
    
    public Linker(DTD dtd, String root) {
	super("Linker " + dtd);
	parser = new LinkParser(dtd);	
	DefaultMutableTreeNode top = new DefaultMutableTreeNode(root);
    }

    protected void expand(String urlString) {
	
    }

    public LinkParser getParser() {
	return parser;
    }

    public static void main(String[] args) {
	try {
	    Linker linker = new Linker(DTD.getDTD("HTML 4.01"), args[0]);
	    URL url = new URL(args[0]);
	    System.out.println("Main: " + url);
	    Reader in =
		new BufferedReader(new InputStreamReader(url.openStream()));
	    BufferedReader tty = 
		new BufferedReader(new InputStreamReader(System.in));
	    linker.getParser().parse(in);
	    Iterator it = linker.getParser().getLinks().iterator();
	    Pattern pattern = Pattern.compile("\\s*(y|yes|Y|Yes|YES)\\s*");
	    while (it.hasNext()) {
		String link = (String)it.next();
		System.out.print(link + " proceed (y/n) ");
		if (pattern.matcher(tty.readLine()).matches()) {
		    main(new String[] { link });
		}
	    }
	} catch(IOException e) {
	    e.printStackTrace();
	}
    }

}

class LinkParser extends Parser {
    Set links;

    public LinkParser(DTD dtd) {
	super(dtd);
	links = new TreeSet();
    }

    protected void handleEmptyTag(TagElement tag) {
	HTML.Tag ht = tag.getHTMLTag();
	SimpleAttributeSet as = getAttributes();
	Object href = as.getAttribute(HTML.Attribute.HREF);
	if (href != null) {
	    links.add(href);
	}
    }

    public Set getLinks() {
	return links;
    }
}
