/*
* Copyright (C) 2004-2008 Jive Software. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jivesoftware.openfire.forms.spi;
import org.jivesoftware.openfire.forms.FormField;
import java.util.*;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.QName;
/**
* A concrete DataForm capable of sending itself to a writer and recover its state from an XMPP
* stanza. XDataForms are packets of the form:
* <pre><code>
* <x xmlns='jabber:x:data' type='{form-type}'>
* <title/>
* <instructions/>
* <field var='field-name'
* type='{field-type}'
* label='description'>
* <desc/>
* <required/>
* <value>field-value</value>
* <option label='option-label'><value>option-value</value></option>
* <option label='option-label'><value>option-value</value></option>
* </field>
* </x>
* </code></pre>
* An XDataFormImpl can contain zero or more XFormFieldImpl 'field' fragments.
* <p>
* To learn more follow this link: <a href="http://www.jabber.org/jeps/jep-0004.html">JEP-04</a>.</p>
*
* @author gdombiak
* @deprecated replaced by {@link org.xmpp.forms.DataForm}
*/
@Deprecated
public class XDataFormImpl {
private String type;
private String title;
private List<String> instructions = new ArrayList<>();
private List<FormField> fields = new ArrayList<>();
private List<FormField> reportedFields = new ArrayList<>();
private List<List<FormField>> reportedItems = new ArrayList<>();
public XDataFormImpl() {
super();
}
public XDataFormImpl(String type) {
this.type = type;
}
public void setTitle(String title) {
this.title = title;
}
public void setInstructions(List<String> instructions) {
this.instructions = instructions;
}
public String getType() {
return type;
}
public String getTitle() {
return title;
}
public Iterator getInstructions() {
synchronized (instructions) {
return Collections.unmodifiableList(new ArrayList<>(instructions)).iterator();
}
}
public FormField getField(String variable) {
if (variable == null || variable.equals("")) {
throw new IllegalArgumentException("Variable must not be null or blank.");
}
// Look for the field whose variable matches the requested variable
FormField field;
for (Iterator it = getFields(); it.hasNext();) {
field = (FormField)it.next();
if (variable.equals(field.getVariable())) {
return field;
}
}
return null;
}
public Iterator getFields() {
synchronized (fields) {
return Collections.unmodifiableList(new ArrayList<>(fields)).iterator();
}
}
public int getFieldsSize() {
return fields.size();
}
public void addInstruction(String instruction) {
synchronized (instructions) {
instructions.add(instruction);
}
}
public void addField(FormField field) {
synchronized (fields) {
fields.add(field);
}
}
public void addReportedField(FormField field) {
synchronized (reportedFields) {
reportedFields.add(field);
}
}
public void addItemFields(List<FormField> itemFields) {
synchronized (reportedItems) {
// We are nesting a List (of fields) inside of the List of items
reportedItems.add(itemFields);
}
}
public String getNamespace() {
// Is someone sending this message?
return "jabber:x:data";
}
public void setNamespace(String namespace) {
// Is someone sending this message?
// Do nothing
}
public String getName() {
// Is someone sending this message?
return "x";
}
public void setName(String name) {
// Is someone sending this message?
// Do nothing
}
public Element asXMLElement() {
Element x = DocumentHelper.createElement(QName.get("x", "jabber:x:data"));
if (getType() != null) {
x.addAttribute("type", getType());
}
if (getTitle() != null) {
x.addElement("title").addText(getTitle());
}
if (instructions.size() > 0) {
Iterator instrItr = getInstructions();
while (instrItr.hasNext()) {
x.addElement("instructions").addText((String)instrItr.next());
}
}
// Append the list of fields returned from a search
if (reportedFields.size() > 0) {
Element reportedElement = x.addElement("reported");
Iterator fieldsItr = reportedFields.iterator();
while (fieldsItr.hasNext()) {
XFormFieldImpl field = (XFormFieldImpl)fieldsItr.next();
reportedElement.add(field.asXMLElement());
}
}
// Append the list of items returned from a search
// Note: each item contains a List of XFormFieldImpls
if (reportedItems.size() > 0) {
Iterator itemsItr = reportedItems.iterator();
while (itemsItr.hasNext()) {
// Add a new item element for this list of fields
Element itemElement = x.addElement("item");
List fields = (List)itemsItr.next();
Iterator fieldsItr = fields.iterator();
// Iterate on the fields and add them to the new item
while (fieldsItr.hasNext()) {
XFormFieldImpl field = (XFormFieldImpl)fieldsItr.next();
itemElement.add(field.asXMLElement());
}
}
}
if (fields.size() > 0) {
Iterator fieldsItr = getFields();
while (fieldsItr.hasNext()) {
XFormFieldImpl field = (XFormFieldImpl)fieldsItr.next();
x.add(field.asXMLElement());
}
}
return x;
}
public void parse(Element formElement) {
type = formElement.attributeValue("type");
Element titleElement = formElement.element("title");
if (titleElement != null) {
setTitle(titleElement.getTextTrim());
}
Iterator instructionElements = formElement.elementIterator("instructions");
while (instructionElements.hasNext()) {
addInstruction(((Element)instructionElements.next()).getTextTrim());
}
Iterator fieldElements = formElement.elementIterator("field");
while (fieldElements.hasNext()) {
XFormFieldImpl field = new XFormFieldImpl();
field.parse((Element)fieldElements.next());
addField(field);
}
Element reportedElement = formElement.element("reported");
if (reportedElement != null) {
Iterator reportedFieldElements = reportedElement.elementIterator("field");
while (reportedFieldElements.hasNext()) {
XFormFieldImpl field = new XFormFieldImpl();
field.parse((Element)reportedFieldElements.next());
addReportedField(field);
}
}
Iterator itemElements = formElement.elementIterator("item");
while (itemElements.hasNext()) {
Element itemElement = (Element)itemElements.next();
Iterator itemFieldElements = itemElement.elementIterator("field");
ArrayList<FormField> itemFields = new ArrayList<>();
while (itemFieldElements.hasNext()) {
XFormFieldImpl field = new XFormFieldImpl();
field.parse((Element)itemFieldElements.next());
itemFields.add(field);
}
addItemFields(itemFields);
}
}
}