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;
22d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
23d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.jivesoftware.smack.packet.Packet;
24d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.jivesoftware.smack.packet.PacketExtension;
25d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.jivesoftware.smackx.packet.DataForm;
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 set of data results returned as part of a search. The report is structured
34d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * in columns and rows.
35d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *
36d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @author Gaston Dombiak
37d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */
38d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic class ReportedData {
39d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
40d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    private List<Column> columns = new ArrayList<Column>();
41d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    private List<Row> rows = new ArrayList<Row>();
42d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    private String title = "";
43d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
44d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
45d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Returns a new ReportedData if the packet is used for reporting data and includes an
46d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * extension that matches the elementName and namespace "x","jabber:x:data".
47d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *
48d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @param packet the packet used for reporting data.
49d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
50d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public static ReportedData getReportedDataFrom(Packet packet) {
51d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        // Check if the packet includes the DataForm extension
52d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        PacketExtension packetExtension = packet.getExtension("x","jabber:x:data");
53d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        if (packetExtension != null) {
54d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            // Check if the existing DataForm is a result of a search
55d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            DataForm dataForm = (DataForm) packetExtension;
56d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            if (dataForm.getReportedData() != null)
57d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                return new ReportedData(dataForm);
58d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
59d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        // Otherwise return null
60d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        return null;
61d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
62d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
63d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
64d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
65d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Creates a new ReportedData based on the returned dataForm from a search
66d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *(namespace "jabber:iq:search").
67d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *
68d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @param dataForm the dataForm returned from a search (namespace "jabber:iq:search").
69d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
70d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    private ReportedData(DataForm dataForm) {
71d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        // Add the columns to the report based on the reported data fields
72d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        for (Iterator fields = dataForm.getReportedData().getFields(); fields.hasNext();) {
73d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            FormField field = (FormField)fields.next();
74d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            columns.add(new Column(field.getLabel(), field.getVariable(), field.getType()));
75d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
76d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
77d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        // Add the rows to the report based on the form's items
78d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        for (Iterator items = dataForm.getItems(); items.hasNext();) {
79d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            DataForm.Item item = (DataForm.Item)items.next();
80d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            List<Field> fieldList = new ArrayList<Field>(columns.size());
81d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            FormField field;
82d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            for (Iterator fields = item.getFields(); fields.hasNext();) {
83d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                field = (FormField) fields.next();
84d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                // The field is created with all the values of the data form's field
85d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                List<String> values = new ArrayList<String>();
86d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                for (Iterator<String> it=field.getValues(); it.hasNext();) {
87d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    values.add(it.next());
88d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                }
89d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                fieldList.add(new Field(field.getVariable(), values));
90d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            }
91d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            rows.add(new Row(fieldList));
92d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
93d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
94d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        // Set the report's title
95d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        this.title = dataForm.getTitle();
96d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
97d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
98d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
99d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public ReportedData(){
100d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        // Allow for model creation of ReportedData.
101d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
102d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
103d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
104d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Adds a new <code>Row</code>.
105d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @param row the new row to add.
106d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
107d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public void addRow(Row row){
108d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        rows.add(row);
109d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
110d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
111d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
112d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Adds a new <code>Column</code>
113d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @param column the column to add.
114d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
115d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public void addColumn(Column column){
116d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        columns.add(column);
117d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
118d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
119d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
120d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
121d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Returns an Iterator for the rows returned from a search.
122d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *
123d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @return an Iterator for the rows returned from a search.
124d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
125d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public Iterator<Row> getRows() {
126d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        return Collections.unmodifiableList(new ArrayList<Row>(rows)).iterator();
127d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
128d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
129d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
130d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Returns an Iterator for the columns returned from a search.
131d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *
132d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @return an Iterator for the columns returned from a search.
133d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
134d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public Iterator<Column> getColumns() {
135d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        return Collections.unmodifiableList(new ArrayList<Column>(columns)).iterator();
136d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
137d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
138d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
139d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
140d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Returns the report's title. It is similar to the title on a web page or an X
141d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * window.
142d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *
143d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @return title of the report.
144d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
145d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public String getTitle() {
146d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        return title;
147d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
148d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
149d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
150d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *
151d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Represents the columns definition of the reported data.
152d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *
153d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @author Gaston Dombiak
154d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
155d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public static class Column {
156d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        private String label;
157d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        private String variable;
158d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        private String type;
159d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
160d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        /**
161d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * Creates a new column with the specified definition.
162d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         *
163d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * @param label the columns's label.
164d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * @param variable the variable name of the column.
165d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * @param type the format for the returned data.
166d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         */
167d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        public Column(String label, String variable, String type) {
168d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            this.label = label;
169d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            this.variable = variable;
170d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            this.type = type;
171d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
172d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
173d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        /**
174d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * Returns the column's label.
175d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         *
176d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * @return label of the column.
177d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         */
178d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        public String getLabel() {
179d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            return label;
180d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
181d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
182d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
183d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        /**
184d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * Returns the column's data format. Valid formats are:
185d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         *
186d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * <ul>
187d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         *  <li>text-single -> single line or word of text
188d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         *  <li>text-private -> instead of showing the user what they typed, you show ***** to
189d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * protect it
190d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         *  <li>text-multi -> multiple lines of text entry
191d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         *  <li>list-single -> given a list of choices, pick one
192d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         *  <li>list-multi -> given a list of choices, pick one or more
193d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         *  <li>boolean -> 0 or 1, true or false, yes or no. Default value is 0
194d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         *  <li>fixed -> fixed for putting in text to show sections, or just advertise your web
195d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * site in the middle of the form
196d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         *  <li>hidden -> is not given to the user at all, but returned with the questionnaire
197d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         *  <li>jid-single -> Jabber ID - choosing a JID from your roster, and entering one based
198d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * on the rules for a JID.
199d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         *  <li>jid-multi -> multiple entries for JIDs
200d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * </ul>
201d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         *
202d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * @return format for the returned data.
203d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         */
204d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        public String getType() {
205d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            return type;
206d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
207d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
208d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
209d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        /**
210d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * Returns the variable name that the column is showing.
211d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         *
212d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * @return the variable name of the column.
213d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         */
214d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        public String getVariable() {
215d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            return variable;
216d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
217d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
218d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
219d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
220d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
221d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public static class Row {
222d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        private List<Field> fields = new ArrayList<Field>();
223d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
224d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        public Row(List<Field> fields) {
225d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            this.fields = fields;
226d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
227d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
228d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        /**
229d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * Returns the values of the field whose variable matches the requested variable.
230d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         *
231d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * @param variable the variable to match.
232d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * @return the values of the field whose variable matches the requested variable.
233d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         */
234d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        public Iterator getValues(String variable) {
235d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            for(Iterator<Field> it=getFields();it.hasNext();) {
236d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                Field field = it.next();
237d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                if (variable.equalsIgnoreCase(field.getVariable())) {
238d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    return field.getValues();
239d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                }
240d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            }
241d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            return null;
242d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
243d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
244d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        /**
245d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * Returns the fields that define the data that goes with the item.
246d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         *
247d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * @return the fields that define the data that goes with the item.
248d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         */
249d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        private Iterator<Field> getFields() {
250d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            return Collections.unmodifiableList(new ArrayList<Field>(fields)).iterator();
251d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
252d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
253d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
254d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public static class Field {
255d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        private String variable;
256d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        private List<String> values;
257d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
258d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        public Field(String variable, List<String> values) {
259d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            this.variable = variable;
260d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            this.values = values;
261d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
262d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
263d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        /**
264d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * Returns the variable name that the field represents.
265d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         *
266d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * @return the variable name of the field.
267d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         */
268d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        public String getVariable() {
269d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            return variable;
270d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
271d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
272d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        /**
273d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * Returns an iterator on the values reported as part of the search.
274d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         *
275d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * @return the returned values of the search.
276d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         */
277d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        public Iterator<String> getValues() {
278d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            return Collections.unmodifiableList(values).iterator();
279d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
280d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
281d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
282