1d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/**
2d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * $RCSfile$
3d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * $Revision$
4d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * $Date$
5d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *
6d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Copyright 2003-2007 Jive Software.
7d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *
8d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * All rights reserved. Licensed under the Apache License, Version 2.0 (the "License");
9d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * you may not use this file except in compliance with the License.
10d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * You may obtain a copy of the License at
11d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *
12d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *     http://www.apache.org/licenses/LICENSE-2.0
13d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *
14d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Unless required by applicable law or agreed to in writing, software
15d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * distributed under the License is distributed on an "AS IS" BASIS,
16d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * See the License for the specific language governing permissions and
18d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * limitations under the License.
19d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */
20d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
21d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpackage org.jivesoftware.smackx.provider;
22d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
23d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.jivesoftware.smack.packet.PacketExtension;
24d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.jivesoftware.smack.provider.PacketExtensionProvider;
25d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.jivesoftware.smackx.FormField;
26d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.jivesoftware.smackx.packet.DataForm;
27d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.xmlpull.v1.XmlPullParser;
28d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
29d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.util.ArrayList;
30d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.util.List;
31d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
32d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/**
33d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * The DataFormProvider parses DataForm packets.
34d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *
35d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @author Gaston Dombiak
36d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */
37d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic class DataFormProvider implements PacketExtensionProvider {
38d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
39d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
40d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Creates a new DataFormProvider.
41d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * ProviderManager requires that every PacketExtensionProvider has a public, no-argument constructor
42d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
43d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public DataFormProvider() {
44d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
45d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
46d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public PacketExtension parseExtension(XmlPullParser parser) throws Exception {
47d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        boolean done = false;
48d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        StringBuilder buffer = null;
49d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        DataForm dataForm = new DataForm(parser.getAttributeValue("", "type"));
50d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        while (!done) {
51d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            int eventType = parser.next();
52d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            if (eventType == XmlPullParser.START_TAG) {
53d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                if (parser.getName().equals("instructions")) {
54d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    dataForm.addInstruction(parser.nextText());
55d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                }
56d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                else if (parser.getName().equals("title")) {
57d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    dataForm.setTitle(parser.nextText());
58d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                }
59d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                else if (parser.getName().equals("field")) {
60d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    dataForm.addField(parseField(parser));
61d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                }
62d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                else if (parser.getName().equals("item")) {
63d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    dataForm.addItem(parseItem(parser));
64d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                }
65d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                else if (parser.getName().equals("reported")) {
66d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    dataForm.setReportedData(parseReported(parser));
67d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                }
68d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            } else if (eventType == XmlPullParser.END_TAG) {
69d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                if (parser.getName().equals(dataForm.getElementName())) {
70d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    done = true;
71d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                }
72d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            }
73d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
74d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        return dataForm;
75d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
76d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
77d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    private FormField parseField(XmlPullParser parser) throws Exception {
78d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        boolean done = false;
79d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        FormField formField = new FormField(parser.getAttributeValue("", "var"));
80d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        formField.setLabel(parser.getAttributeValue("", "label"));
81d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        formField.setType(parser.getAttributeValue("", "type"));
82d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        while (!done) {
83d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            int eventType = parser.next();
84d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            if (eventType == XmlPullParser.START_TAG) {
85d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                if (parser.getName().equals("desc")) {
86d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    formField.setDescription(parser.nextText());
87d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                }
88d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                else if (parser.getName().equals("value")) {
89d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    formField.addValue(parser.nextText());
90d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                }
91d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                else if (parser.getName().equals("required")) {
92d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    formField.setRequired(true);
93d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                }
94d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                else if (parser.getName().equals("option")) {
95d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    formField.addOption(parseOption(parser));
96d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                }
97d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            } else if (eventType == XmlPullParser.END_TAG) {
98d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                if (parser.getName().equals("field")) {
99d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    done = true;
100d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                }
101d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            }
102d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
103d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        return formField;
104d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
105d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
106d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    private DataForm.Item parseItem(XmlPullParser parser) throws Exception {
107d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        boolean done = false;
108d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        List<FormField> fields = new ArrayList<FormField>();
109d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        while (!done) {
110d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            int eventType = parser.next();
111d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            if (eventType == XmlPullParser.START_TAG) {
112d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                if (parser.getName().equals("field")) {
113d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    fields.add(parseField(parser));
114d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                }
115d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            } else if (eventType == XmlPullParser.END_TAG) {
116d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                if (parser.getName().equals("item")) {
117d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    done = true;
118d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                }
119d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            }
120d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
121d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        return new DataForm.Item(fields);
122d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
123d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
124d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    private DataForm.ReportedData parseReported(XmlPullParser parser) throws Exception {
125d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        boolean done = false;
126d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        List<FormField> fields = new ArrayList<FormField>();
127d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        while (!done) {
128d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            int eventType = parser.next();
129d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            if (eventType == XmlPullParser.START_TAG) {
130d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                if (parser.getName().equals("field")) {
131d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    fields.add(parseField(parser));
132d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                }
133d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            } else if (eventType == XmlPullParser.END_TAG) {
134d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                if (parser.getName().equals("reported")) {
135d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    done = true;
136d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                }
137d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            }
138d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
139d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        return new DataForm.ReportedData(fields);
140d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
141d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
142d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    private FormField.Option parseOption(XmlPullParser parser) throws Exception {
143d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        boolean done = false;
144d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        FormField.Option option = null;
145d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        String label = parser.getAttributeValue("", "label");
146d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        while (!done) {
147d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            int eventType = parser.next();
148d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            if (eventType == XmlPullParser.START_TAG) {
149d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                if (parser.getName().equals("value")) {
150d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    option = new FormField.Option(label, parser.nextText());
151d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                }
152d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            } else if (eventType == XmlPullParser.END_TAG) {
153d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                if (parser.getName().equals("option")) {
154d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    done = true;
155d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                }
156d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            }
157d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
158d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        return option;
159d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
160d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
161