001    package com.valhalla.jbother.jabber.smack.provider;
002    
003    import org.jivesoftware.smack.packet.IQ;
004    import org.jivesoftware.smack.packet.PacketExtension;
005    import org.jivesoftware.smack.provider.IQProvider;
006    import com.valhalla.jbother.jabber.smack.*;
007    import org.jivesoftware.smackx.packet.DataForm;
008    import org.jivesoftware.smackx.provider.*;
009    
010    import org.xmlpull.v1.XmlPullParser;
011    import com.valhalla.jbother.jabber.smack.*;
012    
013    import java.util.HashMap;
014    
015    /**
016     * Created by luke on Apr 1, 2005 1:11:23 PM
017     */
018    
019    /**
020     * provider class for parsing Search packages
021     */
022    public class SearchProvider implements IQProvider
023    {
024      private static String fId = "$Id$";
025    
026      public static final String NAMESPACE = "jabber:iq:search";
027    
028      public IQ parseIQ(XmlPullParser parser) throws Exception
029      {
030        Search search = new Search();
031    
032        boolean done = false;
033        HashMap searchFields = new HashMap();
034    
035        while(!done)
036        {
037          int eventType = parser.next();
038          String elementName = parser.getName();
039          String namespace = parser.getNamespace();
040    
041          if (eventType == XmlPullParser.START_TAG)
042          {
043            if(elementName.equals("instructions")) {
044              search.setInstructions( parser.nextText() );
045            }
046            else if(elementName.equals("item")) {
047              search.addItem(parseItem(parser));
048            }
049            else if(elementName.equals("x") && namespace.equals("jabber:x:data")) {
050              DataFormProvider dataFormProvider = new DataFormProvider();
051              search.setSearchDataForm((DataForm)dataFormProvider.parseExtension(parser));
052            }
053            else
054            {
055              if( ! searchFields.containsKey(elementName)) {
056                searchFields.put(elementName,parser.nextText());
057              }
058            }
059          }
060          else if (eventType == XmlPullParser.END_TAG && elementName.equals("query")) {
061              done = true;
062          }
063        }
064        if(searchFields.size() > 0) {
065          search.setSearchFields(searchFields);
066        }
067        return search;
068      }
069    
070      /**
071       * tries to parse <code><item></code> messages and return Saech.Item objects
072       * @param parser XmlPullParser providing the XML data
073       * @return @link{String.Item} object representing search result
074       */
075      private Search.Item parseItem(XmlPullParser parser) throws Exception
076      {
077        boolean done = false;
078        HashMap attributes = new HashMap();
079        Search.Item item = new Search.Item(parser.getAttributeValue("","jid"));
080        while (!done) {
081            int eventType = parser.next();
082            if (eventType == XmlPullParser.START_TAG) {
083              attributes.put(parser.getName(),parser.nextText());
084            }
085            else if (eventType == XmlPullParser.END_TAG) {
086                if (parser.getName().equals("item")) {
087                    done = true;
088                }
089            }
090        }
091        item.setAttributes(attributes);
092        return item;
093      }
094    }