package de.uni_passau.fim.pkjab.model.xmpp; import java.io.IOException; import java.util.Collections; import java.util.Set; import java.util.TreeSet; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import de.uni_passau.fim.pkjab.model.ConnectionCallback; import de.uni_passau.fim.pkjab.model.tags.AbstractXMLTag; import de.uni_passau.fim.pkjab.model.tags.XMLTag; import de.uni_passau.fim.pkjab.util.Stack; abstract class XMPPReaderTopLevel extends XMPPReaderAdapter { protected static final String STREAMS_URI = "http://etherx.jabber.org/streams"; protected static final XMLTag FEATURES_TAG = new XMLTag("features", STREAMS_URI); protected static final XMLTag STREAM_TAG = new XMLTag("stream", STREAMS_URI); protected static final XMLTag STREAM_ERROR_TAG = new XMLTag("error", STREAMS_URI); private Set features = null; // <AbstractXMLTag> protected XMPPReaderTopLevel(final ConnectionCallback connection) { super(connection, new Stack(), null); } protected Set getFeatures() { return features != null ? Collections.unmodifiableSet(features) : null; } protected void startStream(AbstractXMLTag thisTag, Attributes atts) { } protected boolean startTopLevel(Stack xmlStack, AbstractXMLTag thisTag, Attributes atts) throws SAXException { // handle top level stream element if (thisTag.equals(STREAM_TAG)) { String serverDomain = atts.getValue("", "from"); String expectedDomain = connection.connection.getJid().getDomain(); if (!expectedDomain.equals(serverDomain)) { System.err.println("Domains differ: " + expectedDomain + " and " + serverDomain); } startStream(thisTag, atts); return true; } return false; } protected boolean startChild(Stack xmlStack, AbstractXMLTag thisTag, Attributes atts) throws SAXException { if (thisTag.equals(FEATURES_TAG)) { features = new TreeSet(); return true; } return false; } protected boolean startGrandchild(Stack xmlStack, AbstractXMLTag thisTag, Attributes atts) throws SAXException { if (xmlStack.get(1).equals(FEATURES_TAG)) { features.add(thisTag); return true; } return false; } protected boolean startFurtherChild(Stack xmlStack, AbstractXMLTag thisTag, AbstractXMLTag lastTag, Attributes atts) throws SAXException { if (xmlStack.get(1).equals(FEATURES_TAG)) { return true; } return false; } protected boolean endTopLevel(AbstractXMLTag thisTag, String content) throws IOException, SAXException { // stream is closed? WTF? throw new SAXException("Server closed stream tag!"); } protected boolean endChild(Stack xmlStack, AbstractXMLTag thisTag, String content) throws IOException, SAXException { if (thisTag.equals(FEATURES_TAG)) { return true; } return false; } protected boolean endGrandchild(Stack xmlStack, AbstractXMLTag thisTag, String content) throws IOException, SAXException { if (xmlStack.get(1).equals(FEATURES_TAG)) { // ignore all feature tags return true; } return false; } protected boolean endFurtherChild(Stack xmlStack, AbstractXMLTag thisTag, AbstractXMLTag lastTag, String content) throws IOException, SAXException { // ignore all further children in features if (xmlStack.get(1).equals(FEATURES_TAG)) { return true; } return false; } }