DataFormProvider.java

  1. /**
  2.  *
  3.  * Copyright 2003-2007 Jive Software.
  4.  *
  5.  * Licensed under the Apache License, Version 2.0 (the "License");
  6.  * you may not use this file except in compliance with the License.
  7.  * You may obtain a copy of the License at
  8.  *
  9.  *     http://www.apache.org/licenses/LICENSE-2.0
  10.  *
  11.  * Unless required by applicable law or agreed to in writing, software
  12.  * distributed under the License is distributed on an "AS IS" BASIS,
  13.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14.  * See the License for the specific language governing permissions and
  15.  * limitations under the License.
  16.  */

  17. package org.jivesoftware.smackx.xdata.provider;

  18. import org.jivesoftware.smack.provider.ExtensionElementProvider;
  19. import org.jivesoftware.smack.roster.packet.RosterPacket;
  20. import org.jivesoftware.smack.roster.provider.RosterPacketProvider;
  21. import org.jivesoftware.smackx.xdata.FormField;
  22. import org.jivesoftware.smackx.xdata.packet.DataForm;
  23. import org.jivesoftware.smackx.xdatalayout.packet.DataLayout;
  24. import org.jivesoftware.smackx.xdatalayout.provider.DataLayoutProvider;
  25. import org.jivesoftware.smackx.xdatavalidation.packet.ValidateElement;
  26. import org.jivesoftware.smackx.xdatavalidation.provider.DataValidationProvider;
  27. import org.xmlpull.v1.XmlPullParser;
  28. import org.xmlpull.v1.XmlPullParserException;

  29. import java.io.IOException;
  30. import java.util.ArrayList;
  31. import java.util.List;

  32. /**
  33.  * The DataFormProvider parses DataForm packets.
  34.  *
  35.  * @author Gaston Dombiak
  36.  */
  37. public class DataFormProvider extends ExtensionElementProvider<DataForm> {

  38.     @Override
  39.     public DataForm parse(XmlPullParser parser, int initialDepth) throws
  40.                     Exception {
  41.         DataForm.Type dataFormType = DataForm.Type.fromString(parser.getAttributeValue("", "type"));
  42.         DataForm dataForm = new DataForm(dataFormType);
  43.         outerloop: while (true) {
  44.             int eventType = parser.next();
  45.             switch (eventType) {
  46.             case XmlPullParser.START_TAG:
  47.                 String name = parser.getName();
  48.                 String namespace = parser.getNamespace();
  49.                 switch (name) {
  50.                 case "instructions":
  51.                     dataForm.addInstruction(parser.nextText());
  52.                     break;
  53.                 case "title":
  54.                     dataForm.setTitle(parser.nextText());
  55.                     break;
  56.                 case "field":
  57.                     dataForm.addField(parseField(parser));
  58.                     break;
  59.                 case "item":
  60.                     dataForm.addItem(parseItem(parser));
  61.                     break;
  62.                 case "reported":
  63.                     dataForm.setReportedData(parseReported(parser));
  64.                     break;
  65.                 // See XEP-133 Example 32 for a corner case where the data form contains this extension.
  66.                 case RosterPacket.ELEMENT:
  67.                     if (namespace.equals(RosterPacket.NAMESPACE)) {
  68.                         dataForm.addExtensionElement(RosterPacketProvider.INSTANCE.parse(parser));
  69.                     }
  70.                     break;
  71.                 // See XEP-141 Data Forms Layout
  72.                 case DataLayout.ELEMENT:
  73.                     if (namespace.equals(DataLayout.NAMESPACE)) {
  74.                         dataForm.addExtensionElement(DataLayoutProvider.parse(parser));
  75.                     }
  76.                     break;
  77.                 }
  78.                 break;
  79.             case XmlPullParser.END_TAG:
  80.                 if (parser.getDepth() == initialDepth) {
  81.                     break outerloop;
  82.                 }
  83.                 break;
  84.             }
  85.         }
  86.         return dataForm;
  87.     }

  88.     private FormField parseField(XmlPullParser parser) throws XmlPullParserException, IOException {
  89.         final int initialDepth = parser.getDepth();
  90.         final String var = parser.getAttributeValue("", "var");
  91.         final FormField.Type type = FormField.Type.fromString(parser.getAttributeValue("", "type"));

  92.         final FormField formField;
  93.         if (type == FormField.Type.fixed) {
  94.             formField = new FormField();
  95.         } else {
  96.             formField = new FormField(var);
  97.             formField.setType(type);
  98.         }
  99.         formField.setLabel(parser.getAttributeValue("", "label"));

  100.         outerloop: while (true) {
  101.             int eventType = parser.next();
  102.             switch (eventType) {
  103.             case XmlPullParser.START_TAG:
  104.                 String name = parser.getName();
  105.                 String namespace = parser.getNamespace();
  106.                 switch (name) {
  107.                 case "desc":
  108.                     formField.setDescription(parser.nextText());
  109.                     break;
  110.                 case "value":
  111.                     formField.addValue(parser.nextText());
  112.                     break;
  113.                 case "required":
  114.                     formField.setRequired(true);
  115.                     break;
  116.                 case "option":
  117.                     formField.addOption(parseOption(parser));
  118.                     break;
  119.                 // See XEP-122 Data Forms Validation
  120.                 case ValidateElement.ELEMENT:
  121.                     if (namespace.equals(ValidateElement.NAMESPACE)) {
  122.                         formField.setValidateElement(DataValidationProvider.parse(parser));
  123.                     }
  124.                     break;
  125.                 }
  126.             case XmlPullParser.END_TAG:
  127.                 if (parser.getDepth() == initialDepth) {
  128.                     break outerloop;
  129.                 }
  130.                 break;
  131.             }
  132.         }
  133.         return formField;
  134.     }

  135.     private DataForm.Item parseItem(XmlPullParser parser) throws XmlPullParserException, IOException {
  136.         final int initialDepth = parser.getDepth();
  137.         List<FormField> fields = new ArrayList<FormField>();
  138.         outerloop: while (true) {
  139.             int eventType = parser.next();
  140.             switch (eventType) {
  141.             case XmlPullParser.START_TAG:
  142.                 String name = parser.getName();
  143.                 switch (name) {
  144.                 case "field":
  145.                     fields.add(parseField(parser));
  146.                     break;
  147.                 }
  148.                 break;
  149.             case XmlPullParser.END_TAG:
  150.                 if (parser.getDepth() == initialDepth) {
  151.                     break outerloop;
  152.                 }
  153.                 break;
  154.             }
  155.         }
  156.         return new DataForm.Item(fields);
  157.     }

  158.     private DataForm.ReportedData parseReported(XmlPullParser parser) throws XmlPullParserException, IOException {
  159.         final int initialDepth = parser.getDepth();
  160.         List<FormField> fields = new ArrayList<FormField>();
  161.         outerloop: while (true) {
  162.             int eventType = parser.next();
  163.             switch (eventType) {
  164.             case XmlPullParser.START_TAG:
  165.                 String name = parser.getName();
  166.                 switch (name) {
  167.                 case "field":
  168.                     fields.add(parseField(parser));
  169.                     break;
  170.                 }
  171.                 break;
  172.             case XmlPullParser.END_TAG:
  173.                 if (parser.getDepth() == initialDepth) {
  174.                     break outerloop;
  175.                 }
  176.                 break;
  177.             }
  178.         }
  179.         return new DataForm.ReportedData(fields);
  180.     }

  181.     private FormField.Option parseOption(XmlPullParser parser) throws XmlPullParserException, IOException {
  182.         final int initialDepth = parser.getDepth();
  183.         FormField.Option option = null;
  184.         String label = parser.getAttributeValue("", "label");
  185.         outerloop: while (true) {
  186.             int eventType = parser.next();
  187.             switch (eventType) {
  188.             case XmlPullParser.START_TAG:
  189.                 String name = parser.getName();
  190.                 switch (name) {
  191.                 case "value":
  192.                     option = new FormField.Option(label, parser.nextText());
  193.                     break;
  194.                 }
  195.                 break;
  196.             case XmlPullParser.END_TAG:
  197.                 if (parser.getDepth() == initialDepth) {
  198.                     break outerloop;
  199.                 }
  200.                 break;
  201.             }
  202.         }
  203.         return option;
  204.     }
  205. }