summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/isode/stroke/parser/payloadparsers/FormParser.java')
-rw-r--r--src/com/isode/stroke/parser/payloadparsers/FormParser.java402
1 files changed, 114 insertions, 288 deletions
diff --git a/src/com/isode/stroke/parser/payloadparsers/FormParser.java b/src/com/isode/stroke/parser/payloadparsers/FormParser.java
index 86852e6..2aa398c 100644
--- a/src/com/isode/stroke/parser/payloadparsers/FormParser.java
+++ b/src/com/isode/stroke/parser/payloadparsers/FormParser.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012 Isode Limited, London, England.
+ * Copyright (c) 2012-2014 Isode Limited, London, England.
* All rights reserved.
*/
/*
@@ -9,223 +9,46 @@
package com.isode.stroke.parser.payloadparsers;
+import java.util.ArrayList;
import java.util.List;
import com.isode.stroke.elements.Form;
-import com.isode.stroke.elements.FormField;
import com.isode.stroke.elements.Form.Type;
-import com.isode.stroke.elements.FormField.BooleanFormField;
-import com.isode.stroke.elements.FormField.FixedFormField;
-import com.isode.stroke.elements.FormField.GenericFormField;
-import com.isode.stroke.elements.FormField.HiddenFormField;
-import com.isode.stroke.elements.FormField.JIDMultiFormField;
-import com.isode.stroke.elements.FormField.JIDSingleFormField;
-import com.isode.stroke.elements.FormField.ListMultiFormField;
-import com.isode.stroke.elements.FormField.ListSingleFormField;
+import com.isode.stroke.elements.FormField;
import com.isode.stroke.elements.FormField.Option;
-import com.isode.stroke.elements.FormField.TextMultiFormField;
-import com.isode.stroke.elements.FormField.TextPrivateFormField;
-import com.isode.stroke.elements.FormField.TextSingleFormField;
-import com.isode.stroke.jid.JID;
+import com.isode.stroke.elements.FormItem;
import com.isode.stroke.parser.AttributeMap;
import com.isode.stroke.parser.GenericPayloadParser;
-import java.util.ArrayList;
/**
* Parser for {@link Form} element.
*/
public class FormParser extends GenericPayloadParser<Form> {
- private static abstract class FieldParseHelper<T> {
- protected GenericFormField<T> field;
-
- public void addValue(String s) {
- if (s == null) {
- throw new NullPointerException("'s' must not be null");
- }
-
- field.addRawValue(s);
- }
-
- public GenericFormField<T> getField() {
- return field;
- }
- }
-
- private static class BoolFieldParseHelper extends FieldParseHelper<Boolean> {
- public void addValue(String s) {
- super.addValue(s);
- field.setValue(((s.equals("1")) || (s.equals("true"))));
- }
- }
-
- private static class StringFieldParseHelper extends
- FieldParseHelper<String> {
- public void addValue(String s) {
- super.addValue(s);
- if (field.getValue().isEmpty()) {
- field.setValue(s);
- } else {
- field.setValue(field.getValue() + "\n" + s);
- }
- }
- };
-
- private static class JIDFieldParseHelper extends FieldParseHelper<JID> {
- public void addValue(String s) {
- super.addValue(s);
- field.setValue(new JID(s));
- }
- };
-
- private static class StringListFieldParseHelper extends
- FieldParseHelper<List<String>> {
- public void addValue(String s) {
- super.addValue(s);
- List<String> l = field.getValue();
- l.add(s);
- field.setValue(l);
- }
- };
-
- private static class JIDListFieldParseHelper extends
- FieldParseHelper<List<JID>> {
- public void addValue(String s) {
- super.addValue(s);
- List<JID> l = field.getValue();
- l.add(new JID(s));
- field.setValue(l);
- }
- };
-
- private static class BooleanFormFieldParseHelper extends
- BoolFieldParseHelper {
- public BooleanFormFieldParseHelper() {
- field = BooleanFormField.create();
- }
-
- public static BooleanFormFieldParseHelper create() {
- return new BooleanFormFieldParseHelper();
- }
- }
-
- private static class FixedFormFieldParseHelper extends
- StringFieldParseHelper {
- public FixedFormFieldParseHelper() {
- field = FixedFormField.create();
- }
-
- public static FixedFormFieldParseHelper create() {
- return new FixedFormFieldParseHelper();
- }
- }
-
- private static class HiddenFormFieldParseHelper extends
- StringFieldParseHelper {
- public HiddenFormFieldParseHelper() {
- field = HiddenFormField.create();
- }
-
- public static HiddenFormFieldParseHelper create() {
- return new HiddenFormFieldParseHelper();
- }
- }
-
- private static class ListSingleFormFieldParseHelper extends
- StringFieldParseHelper {
- public ListSingleFormFieldParseHelper() {
- field = ListSingleFormField.create();
- }
-
- public static ListSingleFormFieldParseHelper create() {
- return new ListSingleFormFieldParseHelper();
- }
- }
-
- private static class TextMultiFormFieldParseHelper extends
- StringFieldParseHelper {
- public TextMultiFormFieldParseHelper() {
- field = TextMultiFormField.create();
- }
-
- public static TextMultiFormFieldParseHelper create() {
- return new TextMultiFormFieldParseHelper();
- }
- }
-
- private static class TextPrivateFormFieldParseHelper extends
- StringFieldParseHelper {
- public TextPrivateFormFieldParseHelper() {
- field = TextPrivateFormField.create();
- }
-
- public static TextPrivateFormFieldParseHelper create() {
- return new TextPrivateFormFieldParseHelper();
- }
- }
-
- private static class TextSingleFormFieldParseHelper extends
- StringFieldParseHelper {
- public TextSingleFormFieldParseHelper() {
- field = TextSingleFormField.create();
- }
-
- public static TextSingleFormFieldParseHelper create() {
- return new TextSingleFormFieldParseHelper();
- }
- }
-
- private static class JIDSingleFormFieldParseHelper extends
- JIDFieldParseHelper {
- public JIDSingleFormFieldParseHelper() {
- field = JIDSingleFormField.create();
- }
-
- public static JIDSingleFormFieldParseHelper create() {
- return new JIDSingleFormFieldParseHelper();
- }
- }
-
- private static class JIDMultiFormFieldParseHelper extends
- JIDListFieldParseHelper {
- public JIDMultiFormFieldParseHelper() {
- field = JIDMultiFormField.create();
- }
-
- public static JIDMultiFormFieldParseHelper create() {
- return new JIDMultiFormFieldParseHelper();
- }
- }
-
- private static class ListMultiFormFieldParseHelper extends
- StringListFieldParseHelper {
- public ListMultiFormFieldParseHelper() {
- field = ListMultiFormField.create();
- }
-
- public static ListMultiFormFieldParseHelper create() {
- return new ListMultiFormFieldParseHelper();
- }
- }
-
- private static final int TopLevel = 0;
+
+ private List<FormField> currentFields_ = new ArrayList<FormField>();
+ private FormField currentField_ = null;
+ private FormItem currentItem_ = null;
+ private boolean parsingReported_ = false;
+ private boolean parsingOption_ = false;
+ private String currentOptionValue_ = "";
+ private String currentText_ = "";
+
+ private static final int TopLevel = 0;
private static final int PayloadLevel = 1;
private static final int FieldLevel = 2;
private int level_;
- //private String currentText_ = "";
- private ArrayList<String> texts_ = new ArrayList<String>();
private String currentOptionLabel_ = "";
- private FieldParseHelper<?> currentFieldParseHelper_ = null;
/**
* Constructor
*/
public FormParser() {
super(new Form());
-
level_ = TopLevel;
}
+ @Override
public void handleStartElement(String element, String ns,
final AttributeMap attributes) {
if (element == null) {
@@ -237,80 +60,66 @@ public class FormParser extends GenericPayloadParser<Form> {
if (attributes == null) {
throw new NullPointerException("'attributes' must not be null");
}
-
Form form = getPayloadInternal();
if (level_ == TopLevel) {
String type = attributes.getAttribute(Form.FORM_ATTRIBUTE_TYPE);
form.setType(Type.getType(type));
- } else if (level_ == PayloadLevel) {
+ }
+
+ else if (level_ == PayloadLevel) {
if (element.equals(Form.FORM_ELEMENT_TITLE)) {
- texts_ = new ArrayList();
- } else if (element.equals(Form.FORM_ELEMENT_INSTRUCTIONS)) {
- texts_ = new ArrayList();
- } else if (element.equals(Form.FORM_ELEMENT_FIELD)) {
- String type = attributes
- .getAttribute(FormField.FORM_FIELD_ATTRIBUTE_TYPE);
- if (type == null) {
- type = "";
- }
- if (type.equals(FormField.FORM_FIELD_TYPE_BOOLEAN)) {
- currentFieldParseHelper_ = BooleanFormFieldParseHelper
- .create();
- } else if (type.equals(FormField.FORM_FIELD_TYPE_FIXED)) {
- currentFieldParseHelper_ = FixedFormFieldParseHelper
- .create();
- } else if (type.equals(FormField.FORM_FIELD_TYPE_HIDDEN)) {
- currentFieldParseHelper_ = HiddenFormFieldParseHelper
- .create();
- } else if (type.equals(FormField.FORM_FIELD_TYPE_JID_MULTI)) {
- currentFieldParseHelper_ = JIDMultiFormFieldParseHelper
- .create();
- } else if (type.equals(FormField.FORM_FIELD_TYPE_JID_SINGLE)) {
- currentFieldParseHelper_ = JIDSingleFormFieldParseHelper
- .create();
- } else if (type.equals(FormField.FORM_FIELD_TYPE_LIST_MULTI)) {
- currentFieldParseHelper_ = ListMultiFormFieldParseHelper
- .create();
- } else if (type.equals(FormField.FORM_FIELD_TYPE_LIST_SINGLE)) {
- currentFieldParseHelper_ = ListSingleFormFieldParseHelper
- .create();
- } else if (type.equals(FormField.FORM_FIELD_TYPE_TEXT_MULTI)) {
- currentFieldParseHelper_ = TextMultiFormFieldParseHelper
- .create();
- } else if (type.equals(FormField.FORM_FIELD_TYPE_TEXT_PRIVATE)) {
- currentFieldParseHelper_ = TextPrivateFormFieldParseHelper
- .create();
- } else {
- /*
- * if (type == FormField.FORM_FIELD_TYPE_TEXT_SINGLE) ||
- * undefined
- */
- currentFieldParseHelper_ = TextSingleFormFieldParseHelper
- .create();
- }
-
- if (currentFieldParseHelper_ != null) {
- String name = attributes
- .getAttribute(FormField.FORM_FIELD_ATTRIBUTE_VAR);
- currentFieldParseHelper_.getField().setName(name);
-
- String label = attributes
- .getAttribute(FormField.FORM_FIELD_ATTRIBUTE_LABEL);
- currentFieldParseHelper_.getField().setLabel(label);
- }
+ currentText_ = "";
+ }
+
+ else if (element.equals(Form.FORM_ELEMENT_INSTRUCTIONS)) {
+ currentText_ = "";
+ }
+
+ else if (element.equals(Form.FORM_ELEMENT_REPORTED)) {
+ parsingReported_ = true;
}
- } else if ((level_ == FieldLevel) && (currentFieldParseHelper_ != null)) {
- texts_ = new ArrayList();
+
+ else if (element.equals(Form.FORM_ELEMENT_ITEM)) {
+ currentItem_ = new FormItem();
+ }
+
+ }
+
+ if (level_ == FieldLevel && currentField_ != null) {
+ currentText_ = "";
if (element.equals(FormField.FORM_FIELD_ELEMENT_OPTION)) {
currentOptionLabel_ = attributes
.getAttribute(FormField.FORM_FIELD_ATTRIBUTE_OPTION_LABEL);
+ currentOptionValue_ = "";
+ parsingOption_ = true;
}
}
-
+
+ if (level_ >= PayloadLevel) {
+ if (element.equals(Form.FORM_ELEMENT_FIELD)) {
+ currentField_ = new FormField(FormField.Type.UNKNOWN_TYPE);
+ String type = attributes.getAttribute(FormField.FORM_FIELD_ATTRIBUTE_TYPE);
+ if (type == null) {
+ type = "";
+ }
+ FormField.Type fieldType = FormField.Type.getTypeFromString(type);
+ String name = attributes.getAttribute(FormField.FORM_FIELD_ATTRIBUTE_VAR);
+ String label = attributes.getAttribute(FormField.FORM_FIELD_ATTRIBUTE_LABEL);
+ currentField_.setType(fieldType);
+ currentField_.setName(name);
+ currentField_.setLabel(label);
+ }
+
+ else if (element.equals(FormField.FORM_FIELD_ELEMENT_VALUE)) {
+ currentText_ = "";
+ }
+ }
+
++level_;
}
-
+
+ @Override
public void handleEndElement(String element, String ns) {
if (element == null) {
throw new NullPointerException("'element' must not be null");
@@ -326,63 +135,80 @@ public class FormParser extends GenericPayloadParser<Form> {
if (element.equals(Form.FORM_ELEMENT_TITLE)) {
String currentTitle = form.getTitle();
if (currentTitle.isEmpty()) {
- form.setTitle(getCurrentText());
+ form.setTitle(currentText_);
} else {
- form.setTitle(currentTitle + "\n" + getCurrentText());
+ form.setTitle(currentTitle + "\n" + currentText_);
}
- } else if (element.equals(Form.FORM_ELEMENT_INSTRUCTIONS)) {
+ }
+
+ else if (element.equals(Form.FORM_ELEMENT_INSTRUCTIONS)) {
String currentInstructions = form.getInstructions();
if (currentInstructions.isEmpty()) {
- form.setInstructions(getCurrentText());
+ form.setInstructions(currentText_);
} else {
form.setInstructions(currentInstructions + "\n"
- + getCurrentText());
- }
- } else if (element.equals(Form.FORM_ELEMENT_FIELD)) {
- if (currentFieldParseHelper_ != null) {
- form.addField(currentFieldParseHelper_.getField());
- currentFieldParseHelper_ = null;
+ + currentText_);
}
+ }
+
+ else if (element.equals(Form.FORM_ELEMENT_REPORTED)) {
+ parsingReported_ = false;
}
- } else if ((level_ == FieldLevel) && (currentFieldParseHelper_ != null)) {
- if (element.equals(FormField.FORM_FIELD_ELEMENT_REQUIRED)) {
- currentFieldParseHelper_.getField().setRequired(true);
- } else if (element.equals(FormField.FORM_FIELD_ELEMENT_DESC)) {
- currentFieldParseHelper_.getField()
- .setDescription(getCurrentText());
- } else if (element.equals(FormField.FORM_FIELD_ELEMENT_OPTION)) {
- currentFieldParseHelper_.getField().addOption(
- new Option(currentOptionLabel_, getCurrentText()));
- } else if (element.equals(FormField.FORM_FIELD_ELEMENT_VALUE)) {
- currentFieldParseHelper_.addValue(getCurrentText());
+
+ else if (element.equals(Form.FORM_ELEMENT_ITEM)) {
+ currentItem_.addItemFields(currentFields_);
+ form.addItem(currentItem_);
+ currentFields_.clear();
+ currentItem_ = null;
}
}
- }
-
- private String getCurrentText() {
- int size = 0;
- for (String text : texts_) {
- size += text.length();
- }
- StringBuilder builder = new StringBuilder(size);
- for (String text : texts_) {
- builder.append(text);
+
+ if (element.equals(FormField.FORM_FIELD_ELEMENT_REQUIRED)) {
+ currentField_.setRequired(true);
+ }
+ else if (element.equals(FormField.FORM_FIELD_ELEMENT_DESC)) {
+ currentField_.setDescription(currentText_);
+ }
+ else if (element.equals(FormField.FORM_FIELD_ELEMENT_OPTION)) {
+ currentField_.addOption(
+ new Option(currentOptionLabel_, currentOptionValue_));
+ parsingOption_ = false;
+ }
+ else if (element.equals(FormField.FORM_FIELD_ELEMENT_VALUE)) {
+ if (parsingOption_) {
+ currentOptionValue_ = currentText_;
+ }
+ else {
+ currentField_.addValue(currentText_);
+ }
+ }
+
+ if (level_ >= PayloadLevel && currentField_ != null) {
+ if (element.equals("field")) {
+ if (parsingReported_) {
+ form.addReportedField(currentField_);
+ } else if (currentItem_ != null) {
+ currentFields_.add(currentField_);
+ } else {
+ form.addField(currentField_);
+ }
+ currentField_ = null;
+ }
}
- return builder.toString();
}
-
+
+ @Override
public void handleCharacterData(String text) {
if (text == null) {
throw new NullPointerException("'text' must not be null");
}
-
- texts_.add(text);
+ currentText_ += text;
}
@Override
public String toString() {
return FormParser.class.getSimpleName() + "\nlevel: " + level_
- + "\ncurrent text: " + getCurrentText()
+ + "\ncurrent text: " + currentText_
+ "\ncurrent option label: " + currentOptionLabel_;
}
}