import clojure.lang.RT;
import clojure.lang.Var;
import clojure.lang.ISeq;
import clojure.lang.IFn;
import clojure.lang.Namespace;
import clojure.lang.Symbol;
import clojure.lang.Keyword;
import java.util.Map;

class SeqFromJava {

    enum LastOpeningTag {
        TITLE,
        LINK,
        IGNORED
    };

    static class XmlFilter {

        LastOpeningTag lo = LastOpeningTag.IGNORED;
        boolean seenItem = false;
        String lastTitle;
        String lastLink;

        static final Keyword START_ELEMENT 
            = Keyword.intern(Symbol.create("start-element"));
        static final Keyword END_ELEMENT   
            = Keyword.intern(Symbol.create("end-element"));
        static final Keyword CHARACTERS    
            = Keyword.intern(Symbol.create("characters"));
        static final Keyword NAME          
            = Keyword.intern(Symbol.create("name"));
        static final Keyword ITEM          
            = Keyword.intern(Symbol.create("item"));
        static final Keyword TYPE          
            = Keyword.intern(Symbol.create("type"));
        static final Keyword TITLE         
            = Keyword.intern(Symbol.create("title"));
        static final Keyword LINK          
            = Keyword.intern(Symbol.create("link"));
        static final Keyword STR           
            = Keyword.intern(Symbol.create("str"));

        void filterWithState(Map m) {
            if (START_ELEMENT.equals(m.get(TYPE))) {
                if (ITEM.equals(m.get(NAME)))
                    seenItem = true;
                else if (TITLE.equals(m.get(NAME)))
                    lo = LastOpeningTag.TITLE;
                else if (LINK.equals(m.get(NAME)))
                    lo = LastOpeningTag.LINK;
                else
                    lo = LastOpeningTag.IGNORED;
            } else if (CHARACTERS.equals(m.get(TYPE))) {
                if (lo.equals(LastOpeningTag.TITLE))
                    lastTitle = (String)m.get(STR);
                else if (lo.equals(LastOpeningTag.LINK))
                    lastLink = (String)m.get(STR);
            } else if (seenItem &&
                       END_ELEMENT.equals(m.get(TYPE)) &&
                       LINK.equals(m.get(NAME))) {
                System.out.printf("'%s'\n\t%s\n", lastTitle,
                                  lastLink);
            }
        }
    }

    public static void main(String[] args) {
        try {
            RT.CURRENT_NS.bindRoot(
               Namespace.findOrCreate(Symbol.create("user"))
            );
            RT.load("clojure/contrib/lazy_xml");
            Var seqVar = RT.var("clojure.contrib.lazy-xml", 
                                "parse-seq");

            ISeq seq = (ISeq)seqVar.invoke(
                       "http://www.reddit.com/r/clojure.rss"
                       );
            Object o = null;
            XmlFilter f = new XmlFilter();
            while ((seq != null) 
                   && ((o = seq.first()) != null)) {
                f.filterWithState((Map)o);
                seq = seq.next();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.exit(0);
    }
}
