1d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** 2d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Copyright 2003-2007 Jive Software. 3d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 4d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); 5d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * you may not use this file except in compliance with the License. 6d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * You may obtain a copy of the License at 7d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 8d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * http://www.apache.org/licenses/LICENSE-2.0 9d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 10d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Unless required by applicable law or agreed to in writing, software 11d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * distributed under the License is distributed on an "AS IS" BASIS, 12d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * See the License for the specific language governing permissions and 14d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * limitations under the License. 15d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 16d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 17d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpackage org.jivesoftware.smackx.search; 18d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 19d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.jivesoftware.smack.packet.IQ; 20d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.jivesoftware.smackx.Form; 21d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.jivesoftware.smackx.FormField; 22d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.jivesoftware.smackx.ReportedData; 23d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.xmlpull.v1.XmlPullParser; 24d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 25d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.util.ArrayList; 26d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.util.Iterator; 27d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.util.List; 28d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 29d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** 30d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * SimpleUserSearch is used to support the non-dataform type of JEP 55. This provides 31d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * the mechanism for allowing always type ReportedData to be returned by any search result, 32d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * regardless of the form of the data returned from the server. 33d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 34d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @author Derek DeMoro 35d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 36d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenclass SimpleUserSearch extends IQ { 37d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 38d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen private Form form; 39d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen private ReportedData data; 40d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 41d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public void setForm(Form form) { 42d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen this.form = form; 43d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 44d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 45d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public ReportedData getReportedData() { 46d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return data; 47d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 48d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 49d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 50d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public String getChildElementXML() { 51d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen StringBuilder buf = new StringBuilder(); 52d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen buf.append("<query xmlns=\"jabber:iq:search\">"); 53d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen buf.append(getItemsToSearch()); 54d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen buf.append("</query>"); 55d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return buf.toString(); 56d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 57d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 58d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen private String getItemsToSearch() { 59d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen StringBuilder buf = new StringBuilder(); 60d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 61d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (form == null) { 62d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen form = Form.getFormFrom(this); 63d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 64d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 65d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (form == null) { 66d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return ""; 67d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 68d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 69d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen Iterator<FormField> fields = form.getFields(); 70d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen while (fields.hasNext()) { 71d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen FormField field = fields.next(); 72d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen String name = field.getVariable(); 73d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen String value = getSingleValue(field); 74d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (value.trim().length() > 0) { 75d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen buf.append("<").append(name).append(">").append(value).append("</").append(name).append(">"); 76d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 77d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 78d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 79d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return buf.toString(); 80d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 81d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 82d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen private static String getSingleValue(FormField formField) { 83d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen Iterator<String> values = formField.getValues(); 84d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen while (values.hasNext()) { 85d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return values.next(); 86d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 87d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return ""; 88d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 89d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 90d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen protected void parseItems(XmlPullParser parser) throws Exception { 91d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen ReportedData data = new ReportedData(); 92d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen data.addColumn(new ReportedData.Column("JID", "jid", "text-single")); 93d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 94d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen boolean done = false; 95d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 96d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen List<ReportedData.Field> fields = new ArrayList<ReportedData.Field>(); 97d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen while (!done) { 98d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (parser.getAttributeCount() > 0) { 99d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen String jid = parser.getAttributeValue("", "jid"); 100d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen List<String> valueList = new ArrayList<String>(); 101d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen valueList.add(jid); 102d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen ReportedData.Field field = new ReportedData.Field("jid", valueList); 103d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen fields.add(field); 104d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 105d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 106d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen int eventType = parser.next(); 107d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 108d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (eventType == XmlPullParser.START_TAG && parser.getName().equals("item")) { 109d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen fields = new ArrayList<ReportedData.Field>(); 110d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 111d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen else if (eventType == XmlPullParser.END_TAG && parser.getName().equals("item")) { 112d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen ReportedData.Row row = new ReportedData.Row(fields); 113d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen data.addRow(row); 114d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 115d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen else if (eventType == XmlPullParser.START_TAG) { 116d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen String name = parser.getName(); 117d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen String value = parser.nextText(); 118d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 119d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen List<String> valueList = new ArrayList<String>(); 120d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen valueList.add(value); 121d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen ReportedData.Field field = new ReportedData.Field(name, valueList); 122d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen fields.add(field); 123d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 124d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen boolean exists = false; 125d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen Iterator<ReportedData.Column> cols = data.getColumns(); 126d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen while (cols.hasNext()) { 127d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen ReportedData.Column column = cols.next(); 128d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (column.getVariable().equals(name)) { 129d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen exists = true; 130d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 131d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 132d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 133d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen // Column name should be the same 134d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (!exists) { 135d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen ReportedData.Column column = new ReportedData.Column(name, name, "text-single"); 136d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen data.addColumn(column); 137d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 138d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 139d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen else if (eventType == XmlPullParser.END_TAG) { 140d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (parser.getName().equals("query")) { 141d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen done = true; 142d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 143d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 144d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 145d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 146d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 147d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen this.data = data; 148d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 149d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 150d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 151d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 152