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