• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**
2  * $RCSfile$
3  * $Revision$
4  * $Date$
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 org.jivesoftware.smack.packet.PacketExtension;
24 import org.jivesoftware.smack.provider.PacketExtensionProvider;
25 import org.jivesoftware.smackx.FormField;
26 import org.jivesoftware.smackx.packet.DataForm;
27 import org.xmlpull.v1.XmlPullParser;
28 
29 import java.util.ArrayList;
30 import java.util.List;
31 
32 /**
33  * The DataFormProvider parses DataForm packets.
34  *
35  * @author Gaston Dombiak
36  */
37 public class DataFormProvider implements PacketExtensionProvider {
38 
39     /**
40      * Creates a new DataFormProvider.
41      * ProviderManager requires that every PacketExtensionProvider has a public, no-argument constructor
42      */
DataFormProvider()43     public DataFormProvider() {
44     }
45 
parseExtension(XmlPullParser parser)46     public PacketExtension parseExtension(XmlPullParser parser) throws Exception {
47         boolean done = false;
48         StringBuilder buffer = null;
49         DataForm dataForm = new DataForm(parser.getAttributeValue("", "type"));
50         while (!done) {
51             int eventType = parser.next();
52             if (eventType == XmlPullParser.START_TAG) {
53                 if (parser.getName().equals("instructions")) {
54                     dataForm.addInstruction(parser.nextText());
55                 }
56                 else if (parser.getName().equals("title")) {
57                     dataForm.setTitle(parser.nextText());
58                 }
59                 else if (parser.getName().equals("field")) {
60                     dataForm.addField(parseField(parser));
61                 }
62                 else if (parser.getName().equals("item")) {
63                     dataForm.addItem(parseItem(parser));
64                 }
65                 else if (parser.getName().equals("reported")) {
66                     dataForm.setReportedData(parseReported(parser));
67                 }
68             } else if (eventType == XmlPullParser.END_TAG) {
69                 if (parser.getName().equals(dataForm.getElementName())) {
70                     done = true;
71                 }
72             }
73         }
74         return dataForm;
75     }
76 
parseField(XmlPullParser parser)77     private FormField parseField(XmlPullParser parser) throws Exception {
78         boolean done = false;
79         FormField formField = new FormField(parser.getAttributeValue("", "var"));
80         formField.setLabel(parser.getAttributeValue("", "label"));
81         formField.setType(parser.getAttributeValue("", "type"));
82         while (!done) {
83             int eventType = parser.next();
84             if (eventType == XmlPullParser.START_TAG) {
85                 if (parser.getName().equals("desc")) {
86                     formField.setDescription(parser.nextText());
87                 }
88                 else if (parser.getName().equals("value")) {
89                     formField.addValue(parser.nextText());
90                 }
91                 else if (parser.getName().equals("required")) {
92                     formField.setRequired(true);
93                 }
94                 else if (parser.getName().equals("option")) {
95                     formField.addOption(parseOption(parser));
96                 }
97             } else if (eventType == XmlPullParser.END_TAG) {
98                 if (parser.getName().equals("field")) {
99                     done = true;
100                 }
101             }
102         }
103         return formField;
104     }
105 
parseItem(XmlPullParser parser)106     private DataForm.Item parseItem(XmlPullParser parser) throws Exception {
107         boolean done = false;
108         List<FormField> fields = new ArrayList<FormField>();
109         while (!done) {
110             int eventType = parser.next();
111             if (eventType == XmlPullParser.START_TAG) {
112                 if (parser.getName().equals("field")) {
113                     fields.add(parseField(parser));
114                 }
115             } else if (eventType == XmlPullParser.END_TAG) {
116                 if (parser.getName().equals("item")) {
117                     done = true;
118                 }
119             }
120         }
121         return new DataForm.Item(fields);
122     }
123 
parseReported(XmlPullParser parser)124     private DataForm.ReportedData parseReported(XmlPullParser parser) throws Exception {
125         boolean done = false;
126         List<FormField> fields = new ArrayList<FormField>();
127         while (!done) {
128             int eventType = parser.next();
129             if (eventType == XmlPullParser.START_TAG) {
130                 if (parser.getName().equals("field")) {
131                     fields.add(parseField(parser));
132                 }
133             } else if (eventType == XmlPullParser.END_TAG) {
134                 if (parser.getName().equals("reported")) {
135                     done = true;
136                 }
137             }
138         }
139         return new DataForm.ReportedData(fields);
140     }
141 
parseOption(XmlPullParser parser)142     private FormField.Option parseOption(XmlPullParser parser) throws Exception {
143         boolean done = false;
144         FormField.Option option = null;
145         String label = parser.getAttributeValue("", "label");
146         while (!done) {
147             int eventType = parser.next();
148             if (eventType == XmlPullParser.START_TAG) {
149                 if (parser.getName().equals("value")) {
150                     option = new FormField.Option(label, parser.nextText());
151                 }
152             } else if (eventType == XmlPullParser.END_TAG) {
153                 if (parser.getName().equals("option")) {
154                     done = true;
155                 }
156             }
157         }
158         return option;
159     }
160 }
161