• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**
2  * $RCSfile: PEPProvider.java,v $
3  * $Revision: 1.2 $
4  * $Date: 2007/11/06 02:05:09 $
5  *
6  * Copyright 2003-2007 Jive Software.
7  *
8  * All rights reserved. Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  *     http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  */
20 
21 package org.jivesoftware.smackx.provider;
22 
23 import java.util.HashMap;
24 import java.util.Map;
25 
26 import org.jivesoftware.smack.packet.PacketExtension;
27 import org.jivesoftware.smack.provider.PacketExtensionProvider;
28 import org.xmlpull.v1.XmlPullParser;
29 
30 /**
31  *
32  * The PEPProvider parses incoming PEPEvent packets.
33  * (XEP-163 has a weird asymmetric deal: outbound PEP are <iq> + <pubsub> and inbound are <message> + <event>.
34  * The provider only deals with inbound, and so it only deals with <message>.
35  *
36  * Anyhoo...
37  *
38  * The way this works is that PEPxxx classes are generic <pubsub> and <message> providers, and anyone who
39  * wants to publish/receive PEPs, such as <tune>, <geoloc>, etc., simply need to extend PEPItem and register (here)
40  * a PacketExtensionProvider that knows how to parse that PEPItem extension.
41  *
42  * @author Jeff Williams
43  */
44 public class PEPProvider implements PacketExtensionProvider {
45 
46     Map<String, PacketExtensionProvider> nodeParsers = new HashMap<String, PacketExtensionProvider>();
47     PacketExtension pepItem;
48 
49     /**
50      * Creates a new PEPProvider.
51      * ProviderManager requires that every PacketExtensionProvider has a public, no-argument constructor
52      */
PEPProvider()53     public PEPProvider() {
54     }
55 
registerPEPParserExtension(String node, PacketExtensionProvider pepItemParser)56     public void registerPEPParserExtension(String node, PacketExtensionProvider pepItemParser) {
57         nodeParsers.put(node, pepItemParser);
58     }
59 
60     /**
61      * Parses a PEPEvent packet and extracts a PEPItem from it.
62      * (There is only one per <event>.)
63      *
64      * @param parser the XML parser, positioned at the starting element of the extension.
65      * @return a PacketExtension.
66      * @throws Exception if a parsing error occurs.
67      */
parseExtension(XmlPullParser parser)68     public PacketExtension parseExtension(XmlPullParser parser) throws Exception {
69 
70         boolean done = false;
71         while (!done) {
72             int eventType = parser.next();
73             if (eventType == XmlPullParser.START_TAG) {
74                 if (parser.getName().equals("event")) {
75                 } else if (parser.getName().equals("items")) {
76                     // Figure out the node for this event.
77                     String node = parser.getAttributeValue("", "node");
78                     // Get the parser for this kind of node, and if found then parse the node.
79                     PacketExtensionProvider nodeParser = nodeParsers.get(node);
80                     if (nodeParser != null) {
81                         pepItem = nodeParser.parseExtension(parser);
82                     }
83                  }
84             } else if (eventType == XmlPullParser.END_TAG) {
85                 if (parser.getName().equals("event")) {
86                     done = true;
87                 }
88             }
89         }
90 
91         return pepItem;
92     }
93 }
94