reply.setChildElement(getDataElement());
return reply;
}
// parse params from request.
final DataForm df = new DataForm(formElement);
boolean name_is_exact_match = false;
String subject = null;
int numusers = -1;
int numaxusers = -1;
boolean includePasswordProtectedRooms = true;
final Set<String> names = new HashSet<String>();
for (final FormField field : df.getFields())
{
if (field.getVariable().equals("name"))
{
names.add(field.getFirstValue());
}
}
final FormField matchFF = df.getField("name_is_exact_match");
if (matchFF != null)
{
final String b = matchFF.getFirstValue();
if (b != null)
{
name_is_exact_match = b.equals("1")
|| b.equalsIgnoreCase("true")
|| b.equalsIgnoreCase("yes");
}
}
final FormField subjectFF = df.getField("subject");
if (subjectFF != null)
{
subject = subjectFF.getFirstValue();
}
try
{
final FormField userAmountFF = df.getField("num_users");
if (userAmountFF != null)
{
String value = userAmountFF.getFirstValue();
if (value != null && !"".equals(value)) {
numusers = Integer.parseInt(value);
}
}
final FormField maxUsersFF = df.getField("num_max_users");
if (maxUsersFF != null)
{
String value = maxUsersFF.getFirstValue();
if (value != null && !"".equals(value)) {
numaxusers = Integer.parseInt(value);
}
}
}
catch (NumberFormatException e)
{
reply.setError(PacketError.Condition.bad_request);
return reply;
}
final FormField includePasswordProtectedRoomsFF = df.getField("include_password_protected");
if (includePasswordProtectedRoomsFF != null)
{
final String b = includePasswordProtectedRoomsFF.getFirstValue();
if (b != null)
{
if (b.equals("0") || b.equalsIgnoreCase("false")
|| b.equalsIgnoreCase("no"))
{
includePasswordProtectedRooms = false;
}
}
}
// search for chatrooms matching the request params.
final List<MUCRoom> mucs = new ArrayList<MUCRoom>();
for (MUCRoom room : mucService.getChatRooms())
{
boolean find = false;
if (names.size() > 0)
{
for (final String name : names)
{
if (name_is_exact_match)
{
if (name.equalsIgnoreCase(room.getNaturalLanguageName()))
{
find = true;
break;
}
}
else
{
if (room.getNaturalLanguageName().toLowerCase().indexOf(
name.toLowerCase()) != -1)
{
find = true;
break;
}
}
}
}
if (subject != null
&& room.getSubject().toLowerCase().indexOf(
subject.toLowerCase()) != -1)
{
find = true;
}
if (numusers > -1 && room.getParticipants().size() < numusers)
{
find = false;
}
if (numaxusers > -1 && room.getMaxUsers() < numaxusers)
{
find = false;
}
if (!includePasswordProtectedRooms && room.isPasswordProtected())
{
find = false;
}
if (find && canBeIncludedInResult(room))
{
mucs.add(room);
}
}
final ResultSet<MUCRoom> searchResults = new ResultSetImpl<MUCRoom>(
sortByUserAmount(mucs));
// See if the requesting entity would like to apply 'result set
// management'
final Element set = iq.getChildElement().element(
QName.get("set", ResultSet.NAMESPACE_RESULT_SET_MANAGEMENT));
final List<MUCRoom> mucrsm;
// apply RSM only if the element exists, and the (total) results
// set is not empty.
final boolean applyRSM = set != null && !mucs.isEmpty();
if (applyRSM)
{
if (!ResultSet.isValidRSMRequest(set))
{
reply.setError(Condition.bad_request);
return reply;
}
try
{
mucrsm = searchResults.applyRSMDirectives(set);
}
catch (NullPointerException e)
{
final IQ itemNotFound = IQ.createResultIQ(iq);
itemNotFound.setError(Condition.item_not_found);
return itemNotFound;
}
}
else
{
// if no rsm, all found rooms are part of the result.
mucrsm = new ArrayList<MUCRoom>(searchResults);
}
final Element res = DocumentHelper.createElement(QName.get("query",
"jabber:iq:search"));
final DataForm resultform = new DataForm(DataForm.Type.result);
boolean atLeastoneResult = false;
for (MUCRoom room : mucrsm)
{
final Map<String, Object> fields = new HashMap<String, Object>();
fields.put("name", room.getNaturalLanguageName());
fields.put("subject", room.getSubject());
fields.put("num_users", room.getOccupantsCount());
fields.put("num_max_users", room.getMaxUsers());
fields.put("is_password_protected", room.isPasswordProtected());
fields.put("is_member_only", room.isMembersOnly());
fields.put("jid", room.getRole().getRoleAddress().toString());
resultform.addItemFields(fields);
atLeastoneResult = true;
}
if (atLeastoneResult)
{
resultform.addReportedField("name", "Name", FormField.Type.text_single);
resultform.addReportedField("subject", "Subject", FormField.Type.text_single);
resultform.addReportedField("num_users", "Number of users", FormField.Type.text_single);
resultform.addReportedField("num_max_users", "Max number allowed of users", FormField.Type.text_single);
resultform.addReportedField("is_password_protected", "Is a password protected room.", FormField.Type.boolean_type);
resultform.addReportedField("is_member_only", "Is a member only room.", FormField.Type.boolean_type);
resultform.addReportedField("jid", "JID", FormField.Type.jid_single);
}
if (applyRSM)
{
res.add(searchResults.generateSetElementFromResults(mucrsm));