/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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.apache.vysper.xmpp.stanza.dataforms; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.apache.vysper.xml.fragment.Attribute; import org.apache.vysper.xml.fragment.XMLElement; import org.apache.vysper.xml.fragment.XMLFragment; import org.apache.vysper.xml.fragment.XMLText; import org.apache.vysper.xmpp.protocol.NamespaceURIs; /** * makes XMPP out of a Data Form as provided by the model contained in a {@link org.apache.vysper.xmpp.stanza.dataforms.DataForm} * instance. */ public class DataFormEncoder { public XMLElement getXML(DataForm dataForm) { List<XMLFragment> childElements = new ArrayList<XMLFragment>(); Iterator<String> instructionIterator = dataForm.getInstructionIterator(); while (instructionIterator.hasNext()) { String instruction = instructionIterator.next(); if (instruction == null) continue; childElements.add(createTextOnlyElement(NamespaceURIs.JABBER_X_DATA, "instructions", instruction)); } if (dataForm.getTitle() != null) { childElements.add(createTextOnlyElement(NamespaceURIs.JABBER_X_DATA, "title", dataForm.getTitle())); } if (dataForm.getType() == DataForm.Type.form) { // reported element, containing the reported items ArrayList<XMLFragment> reportedFields = new ArrayList<XMLFragment>(); Iterator<Field> reportedIterator = dataForm.getReportedIterator(); while (reportedIterator.hasNext()) { Field field = reportedIterator.next(); reportedFields.add(encodeField(field)); } XMLElement reportedElement = new XMLElement(NamespaceURIs.JABBER_X_DATA, "reported", null, null, reportedFields); childElements.add(reportedElement); // all item elements with their values Iterator<List<Field>> itemIterator = dataForm.getItemIterator(); while (itemIterator.hasNext()) { ArrayList<XMLFragment> itemFields = new ArrayList<XMLFragment>(); List<Field> itemField = itemIterator.next(); for (Field field : itemField) { itemFields.add(encodeField(field)); } XMLElement itemElement = new XMLElement(NamespaceURIs.JABBER_X_DATA, "item", null, null, itemFields); childElements.add(itemElement); } } if (dataForm.getType() != DataForm.Type.cancel) { // all fields Iterator<Field> fieldIterator = dataForm.getFieldIterator(); while (fieldIterator.hasNext()) { Field field = fieldIterator.next(); childElements.add(encodeField(field)); } } List<Attribute> attributes = new ArrayList<Attribute>(); attributes.add(new Attribute("type", dataForm.getType().value())); return new XMLElement(NamespaceURIs.JABBER_X_DATA, "x", null, attributes, childElements); } protected XMLElement encodeField(Field field) { ArrayList<XMLFragment> fieldElements = new ArrayList<XMLFragment>(); List<Attribute> fieldAttributes = new ArrayList<Attribute>(); if (field.getVar() != null) { fieldAttributes.add(new Attribute("var", field.getVar())); } if (field.getLabel() != null) { fieldAttributes.add(new Attribute("label", field.getLabel())); } if (field.getType() != null) { fieldAttributes.add(new Attribute("type", field.getType().value())); } if (field.getDesc() != null) { ArrayList<XMLFragment> descFragment = new ArrayList<XMLFragment>(); descFragment.add(new XMLText(field.getDesc())); fieldElements.add(new XMLElement(NamespaceURIs.JABBER_X_DATA, "desc", null, null, descFragment)); } if (field.isRequired()) { fieldElements.add(createEmptyElement(NamespaceURIs.JABBER_X_DATA, "required")); } Iterator<String> valueIterator = field.getValueIterator(); while (valueIterator.hasNext()) { String value = valueIterator.next(); XMLElement valueElement = createTextOnlyElement(NamespaceURIs.JABBER_X_DATA, "value", value); fieldElements.add(valueElement); } Iterator<Option> optionIterator = field.getOptions(); while (optionIterator.hasNext()) { Option option = optionIterator.next(); Attribute[] attributes = option.getLabel() == null ? null : new Attribute[] { new Attribute("label", option .getLabel()) }; XMLFragment[] elements = option.getValue() == null ? null : new XMLFragment[] { new XMLText(option .getValue()) }; XMLElement optionElement = new XMLElement(NamespaceURIs.JABBER_X_DATA, "option", null, attributes, elements); fieldElements.add(optionElement); } return new XMLElement(NamespaceURIs.JABBER_X_DATA, "field", null, fieldAttributes, fieldElements); } protected XMLElement createEmptyElement(String namespaceURI, String elementName) { return new XMLElement(namespaceURI, elementName, null, (Attribute[]) null, (XMLFragment[]) null); } protected XMLElement createTextOnlyElement(String namespaceURI, String elementName, String text) { return new XMLElement(namespaceURI, elementName, null, null, new XMLFragment[] { new XMLText(text) }); } }