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.packet; 22d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 23d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.jivesoftware.smack.packet.PacketExtension; 24d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.jivesoftware.smackx.Form; 25d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.jivesoftware.smackx.FormField; 26d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 27d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.util.ArrayList; 28d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.util.Collections; 29d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.util.Iterator; 30d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.util.List; 31d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 32d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** 33d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Represents a form that could be use for gathering data as well as for reporting data 34d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * returned from a search. 35d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 36d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @author Gaston Dombiak 37d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 38d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic class DataForm implements PacketExtension { 39d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 40d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen private String type; 41d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen private String title; 42d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen private List<String> instructions = new ArrayList<String>(); 43d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen private ReportedData reportedData; 44d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen private final List<Item> items = new ArrayList<Item>(); 45d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen private final List<FormField> fields = new ArrayList<FormField>(); 46d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 47d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public DataForm(String type) { 48d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen this.type = type; 49d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 50d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 51d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 52d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Returns the meaning of the data within the context. The data could be part of a form 53d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * to fill out, a form submission or data results.<p> 54d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 55d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Possible form types are: 56d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * <ul> 57d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * <li>form -> This packet contains a form to fill out. Display it to the user (if your 58d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * program can).</li> 59d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * <li>submit -> The form is filled out, and this is the data that is being returned from 60d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * the form.</li> 61d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * <li>cancel -> The form was cancelled. Tell the asker that piece of information.</li> 62d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * <li>result -> Data results being returned from a search, or some other query.</li> 63d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * </ul> 64d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 65d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @return the form's type. 66d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 67d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public String getType() { 68d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return type; 69d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 70d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 71d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 72d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Returns the description of the data. It is similar to the title on a web page or an X 73d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * window. You can put a <title/> on either a form to fill out, or a set of data results. 74d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 75d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @return description of the data. 76d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 77d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public String getTitle() { 78d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return title; 79d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 80d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 81d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 82d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Returns an Iterator for the list of instructions that explain how to fill out the form and 83d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * what the form is about. The dataform could include multiple instructions since each 84d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * instruction could not contain newlines characters. Join the instructions together in order 85d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * to show them to the user. 86d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 87d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @return an Iterator for the list of instructions that explain how to fill out the form. 88d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 89d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public Iterator<String> getInstructions() { 90d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen synchronized (instructions) { 91d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return Collections.unmodifiableList(new ArrayList<String>(instructions)).iterator(); 92d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 93d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 94d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 95d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 96d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Returns the fields that will be returned from a search. 97d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 98d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @return fields that will be returned from a search. 99d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 100d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public ReportedData getReportedData() { 101d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return reportedData; 102d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 103d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 104d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 105d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Returns an Iterator for the items returned from a search. 106d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 107d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @return an Iterator for the items returned from a search. 108d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 109d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public Iterator<Item> getItems() { 110d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen synchronized (items) { 111d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return Collections.unmodifiableList(new ArrayList<Item>(items)).iterator(); 112d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 113d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 114d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 115d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 116d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Returns an Iterator for the fields that are part of the form. 117d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 118d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @return an Iterator for the fields that are part of the form. 119d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 120d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public Iterator<FormField> getFields() { 121d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen synchronized (fields) { 122d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return Collections.unmodifiableList(new ArrayList<FormField>(fields)).iterator(); 123d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 124d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 125d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 126d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public String getElementName() { 127d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return Form.ELEMENT; 128d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 129d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 130d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public String getNamespace() { 131d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return Form.NAMESPACE; 132d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 133d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 134d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 135d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Sets the description of the data. It is similar to the title on a web page or an X window. 136d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * You can put a <title/> on either a form to fill out, or a set of data results. 137d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 138d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param title description of the data. 139d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 140d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public void setTitle(String title) { 141d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen this.title = title; 142d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 143d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 144d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 145d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Sets the list of instructions that explain how to fill out the form and what the form is 146d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * about. The dataform could include multiple instructions since each instruction could not 147d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * contain newlines characters. 148d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 149d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param instructions list of instructions that explain how to fill out the form. 150d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 151d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public void setInstructions(List<String> instructions) { 152d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen this.instructions = instructions; 153d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 154d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 155d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 156d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Sets the fields that will be returned from a search. 157d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 158d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param reportedData the fields that will be returned from a search. 159d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 160d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public void setReportedData(ReportedData reportedData) { 161d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen this.reportedData = reportedData; 162d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 163d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 164d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 165d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Adds a new field as part of the form. 166d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 167d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param field the field to add to the form. 168d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 169d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public void addField(FormField field) { 170d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen synchronized (fields) { 171d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen fields.add(field); 172d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 173d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 174d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 175d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 176d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Adds a new instruction to the list of instructions that explain how to fill out the form 177d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * and what the form is about. The dataform could include multiple instructions since each 178d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * instruction could not contain newlines characters. 179d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 180d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param instruction the new instruction that explain how to fill out the form. 181d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 182d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public void addInstruction(String instruction) { 183d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen synchronized (instructions) { 184d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen instructions.add(instruction); 185d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 186d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 187d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 188d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 189d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Adds a new item returned from a search. 190d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 191d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param item the item returned from a search. 192d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 193d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public void addItem(Item item) { 194d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen synchronized (items) { 195d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen items.add(item); 196d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 197d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 198d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 199d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 200d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Returns true if this DataForm has at least one FORM_TYPE field which is 201d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * hidden. This method is used for sanity checks. 202d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 203d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @return 204d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 205d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public boolean hasHiddenFormTypeField() { 206d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen boolean found = false; 207d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen for (FormField f : fields) { 208d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (f.getVariable().equals("FORM_TYPE") && f.getType() != null && f.getType().equals("hidden")) 209d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen found = true; 210d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 211d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return found; 212d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 213d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 214d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public String toXML() { 215d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen StringBuilder buf = new StringBuilder(); 216d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen buf.append("<").append(getElementName()).append(" xmlns=\"").append(getNamespace()).append( 217d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen "\" type=\"" + getType() +"\">"); 218d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (getTitle() != null) { 219d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen buf.append("<title>").append(getTitle()).append("</title>"); 220d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 221d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen for (Iterator<String> it=getInstructions(); it.hasNext();) { 222d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen buf.append("<instructions>").append(it.next()).append("</instructions>"); 223d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 224d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen // Append the list of fields returned from a search 225d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (getReportedData() != null) { 226d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen buf.append(getReportedData().toXML()); 227d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 228d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen // Loop through all the items returned from a search and append them to the string buffer 229d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen for (Iterator<Item> i = getItems(); i.hasNext();) { 230d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen Item item = i.next(); 231d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen buf.append(item.toXML()); 232d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 233d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen // Loop through all the form fields and append them to the string buffer 234d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen for (Iterator<FormField> i = getFields(); i.hasNext();) { 235d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen FormField field = i.next(); 236d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen buf.append(field.toXML()); 237d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 238d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen buf.append("</").append(getElementName()).append(">"); 239d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return buf.toString(); 240d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 241d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 242d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 243d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 244d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Represents the fields that will be returned from a search. This information is useful when 245d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * you try to use the jabber:iq:search namespace to return dynamic form information. 246d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 247d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @author Gaston Dombiak 248d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 249d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public static class ReportedData { 250d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen private List<FormField> fields = new ArrayList<FormField>(); 251d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 252d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public ReportedData(List<FormField> fields) { 253d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen this.fields = fields; 254d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 255d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 256d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 257d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Returns the fields returned from a search. 258d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 259d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @return the fields returned from a search. 260d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 261d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public Iterator<FormField> getFields() { 262d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return Collections.unmodifiableList(new ArrayList<FormField>(fields)).iterator(); 263d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 264d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 265d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public String toXML() { 266d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen StringBuilder buf = new StringBuilder(); 267d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen buf.append("<reported>"); 268d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen // Loop through all the form items and append them to the string buffer 269d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen for (Iterator<FormField> i = getFields(); i.hasNext();) { 270d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen FormField field = i.next(); 271d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen buf.append(field.toXML()); 272d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 273d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen buf.append("</reported>"); 274d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return buf.toString(); 275d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 276d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 277d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 278d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 279d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 280d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Represents items of reported data. 281d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 282d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @author Gaston Dombiak 283d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 284d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public static class Item { 285d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen private List<FormField> fields = new ArrayList<FormField>(); 286d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 287d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public Item(List<FormField> fields) { 288d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen this.fields = fields; 289d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 290d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 291d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 292d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Returns the fields that define the data that goes with the item. 293d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 294d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @return the fields that define the data that goes with the item. 295d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 296d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public Iterator<FormField> getFields() { 297d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return Collections.unmodifiableList(new ArrayList<FormField>(fields)).iterator(); 298d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 299d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 300d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public String toXML() { 301d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen StringBuilder buf = new StringBuilder(); 302d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen buf.append("<item>"); 303d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen // Loop through all the form items and append them to the string buffer 304d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen for (Iterator<FormField> i = getFields(); i.hasNext();) { 305d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen FormField field = i.next(); 306d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen buf.append(field.toXML()); 307d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 308d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen buf.append("</item>"); 309d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return buf.toString(); 310d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 311d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 312d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 313