Commit d532c456 authored by Leon Roy's avatar Leon Roy

OF-929-Add the ability to generate messages in the userCreation plugin (for...

OF-929-Add the ability to generate messages in the userCreation plugin (for monitoring plugin tests)
parent cac2d7fe
...@@ -79,7 +79,7 @@ import org.xmpp.packet.Message; ...@@ -79,7 +79,7 @@ import org.xmpp.packet.Message;
* *
* @author Matt Tucker * @author Matt Tucker
*/ */
public class ConversationManager implements Startable, ComponentEventListener { public class ConversationManager implements Startable, ComponentEventListener{
private static final Logger Log = LoggerFactory.getLogger(ConversationManager.class); private static final Logger Log = LoggerFactory.getLogger(ConversationManager.class);
...@@ -95,6 +95,7 @@ public class ConversationManager implements Startable, ComponentEventListener { ...@@ -95,6 +95,7 @@ public class ConversationManager implements Startable, ComponentEventListener {
private static final int DEFAULT_IDLE_TIME = 10; private static final int DEFAULT_IDLE_TIME = 10;
private static final int DEFAULT_MAX_TIME = 60; private static final int DEFAULT_MAX_TIME = 60;
public static final int DEFAULT_MAX_TIME_DEBUG = 30;
public static final int DEFAULT_MAX_RETRIEVABLE = 0; public static final int DEFAULT_MAX_RETRIEVABLE = 0;
private static final int DEFAULT_MAX_AGE = 0; private static final int DEFAULT_MAX_AGE = 0;
...@@ -191,6 +192,11 @@ public class ConversationManager implements Startable, ComponentEventListener { ...@@ -191,6 +192,11 @@ public class ConversationManager implements Startable, ComponentEventListener {
}; };
taskEngine.scheduleAtFixedRate(archiveTask, JiveConstants.MINUTE, JiveConstants.MINUTE); taskEngine.scheduleAtFixedRate(archiveTask, JiveConstants.MINUTE, JiveConstants.MINUTE);
if (JiveGlobals.getProperty("conversation.maxTimeDebug") != null) {
Log.info("Monitoring plugin max time value deleted. Must be left over from stalled userCreation plugin run.");
JiveGlobals.deleteProperty("conversation.maxTimeDebug");
}
// Schedule a task to do conversation cleanup. // Schedule a task to do conversation cleanup.
cleanupTask = new TimerTask() { cleanupTask = new TimerTask() {
@Override @Override
...@@ -1119,8 +1125,17 @@ public class ConversationManager implements Startable, ComponentEventListener { ...@@ -1119,8 +1125,17 @@ public class ConversationManager implements Startable, ComponentEventListener {
Log.error(e.getMessage(), e); Log.error(e.getMessage(), e);
maxAge = DEFAULT_MAX_AGE * JiveConstants.DAY; maxAge = DEFAULT_MAX_AGE * JiveConstants.DAY;
} }
} else if (property.equals("conversation.maxTimeDebug")) {
String value = (String) params.get("value");
try {
Log.info("Monitoring plugin max time overridden (as used by userCreation plugin)");
maxTime = Integer.parseInt(value);
} catch (Exception e) {
Log.error(e.getMessage(), e);
Log.info("Monitoring plugin max time reset back to " + DEFAULT_MAX_TIME + " minutes");
maxTime = DEFAULT_MAX_TIME * JiveConstants.MINUTE;
}
} }
} }
public void propertyDeleted(String property, Map<String, Object> params) { public void propertyDeleted(String property, Map<String, Object> params) {
...@@ -1140,8 +1155,10 @@ public class ConversationManager implements Startable, ComponentEventListener { ...@@ -1140,8 +1155,10 @@ public class ConversationManager implements Startable, ComponentEventListener {
maxAge = DEFAULT_MAX_AGE * JiveConstants.DAY; maxAge = DEFAULT_MAX_AGE * JiveConstants.DAY;
} else if (property.equals("conversation.maxRetrievable")) { } else if (property.equals("conversation.maxRetrievable")) {
maxRetrievable = DEFAULT_MAX_RETRIEVABLE * JiveConstants.DAY; maxRetrievable = DEFAULT_MAX_RETRIEVABLE * JiveConstants.DAY;
} else if (property.equals("conversation.maxTimeDebug")) {
Log.info("Monitoring plugin max time reset back to " + DEFAULT_MAX_TIME + " minutes");
maxTime = DEFAULT_MAX_TIME * JiveConstants.MINUTE;
} }
} }
public void xmlPropertySet(String property, Map<String, Object> params) { public void xmlPropertySet(String property, Map<String, Object> params) {
......
package org.jivesoftware.openfire.plugin; package org.jivesoftware.openfire.plugin;
import org.apache.commons.lang.RandomStringUtils;
import org.apache.commons.lang.math.RandomUtils;
import org.dom4j.DocumentException; import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper; import org.dom4j.DocumentHelper;
import org.dom4j.Element; import org.dom4j.Element;
import org.jivesoftware.util.JiveGlobals;
import org.jivesoftware.util.LocaleUtils; import org.jivesoftware.util.LocaleUtils;
import org.jivesoftware.util.Log; import org.jivesoftware.util.Log;
import org.jivesoftware.openfire.SharedGroupException; import org.jivesoftware.openfire.SharedGroupException;
...@@ -12,17 +15,23 @@ import org.jivesoftware.openfire.container.PluginManager; ...@@ -12,17 +15,23 @@ import org.jivesoftware.openfire.container.PluginManager;
import org.jivesoftware.openfire.roster.Roster; import org.jivesoftware.openfire.roster.Roster;
import org.jivesoftware.openfire.roster.RosterItem; import org.jivesoftware.openfire.roster.RosterItem;
import org.jivesoftware.openfire.roster.RosterManager; import org.jivesoftware.openfire.roster.RosterManager;
import org.jivesoftware.openfire.user.User;
import org.jivesoftware.openfire.user.UserAlreadyExistsException; import org.jivesoftware.openfire.user.UserAlreadyExistsException;
import org.jivesoftware.openfire.user.UserManager; import org.jivesoftware.openfire.user.UserManager;
import org.jivesoftware.openfire.user.UserNotFoundException; import org.jivesoftware.openfire.user.UserNotFoundException;
import org.jivesoftware.openfire.vcard.VCardManager; import org.jivesoftware.openfire.vcard.VCardManager;
import org.xmpp.packet.JID; import org.xmpp.packet.JID;
import org.xmpp.packet.Message;
import org.xmpp.packet.Presence; import org.xmpp.packet.Presence;
import java.io.File; import java.io.File;
import java.util.Arrays; import java.util.Arrays;
import java.util.Hashtable; import java.util.Hashtable;
import java.util.Map; import java.util.Map;
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
/** /**
* Created by IntelliJ IDEA. * Created by IntelliJ IDEA.
...@@ -36,6 +45,7 @@ public class UserCreationPlugin implements Plugin { ...@@ -36,6 +45,7 @@ public class UserCreationPlugin implements Plugin {
private static Hashtable<RosterItem.SubType, Map<String, Map<Presence.Type, Change>>> stateTable = private static Hashtable<RosterItem.SubType, Map<String, Map<Presence.Type, Change>>> stateTable =
new Hashtable<RosterItem.SubType, Map<String, Map<Presence.Type, Change>>>(); new Hashtable<RosterItem.SubType, Map<String, Map<Presence.Type, Change>>>();
private Element vCard; private Element vCard;
public static final int DEFAULT_MAX_TIME_DEBUG = 30;
static { static {
Hashtable<Presence.Type, Change> subrTable; Hashtable<Presence.Type, Change> subrTable;
...@@ -283,6 +293,79 @@ public class UserCreationPlugin implements Plugin { ...@@ -283,6 +293,79 @@ public class UserCreationPlugin implements Plugin {
System.out.println("VCards created successfully: " + created); System.out.println("VCards created successfully: " + created);
} }
public static final int NUMBER_CONVERSATION = 10;
public static final int NUMBER_MESSAGES = 10 ;//+ RandomUtils.nextInt(9);
public void generateMessages() {
JiveGlobals.setProperty("conversation.maxTimeDebug", String.valueOf(DEFAULT_MAX_TIME_DEBUG));
XMPPServer server = XMPPServer.getInstance();
ExecutorService taskExecutor = Executors.newFixedThreadPool(8);
for (User user : UserManager.getInstance().getUsers()) {
final JID userJid = server.createJID(user.getUsername(), null);
System.out.println("Creating messages for user: " + userJid.getNode());
for (RosterItem ri : user.getRoster().getRosterItems()) {
final JID rosterItemJid = ri.getJid();
taskExecutor.execute(new Runnable() {
@Override
public void run() {
for (int j = 0; j < NUMBER_CONVERSATION; j++) {
String thread = RandomStringUtils.randomAlphanumeric(6);
for (int i = 0; i < NUMBER_MESSAGES; i++) {
if (i % 2 == 0) {
Message msg = new Message();
msg.setBody("Hello to " + rosterItemJid.getNode() + " from " + userJid.getNode() + ", conversation number " + j
+ " of " + NUMBER_CONVERSATION + ", message " + i + " of " + NUMBER_MESSAGES + " thread " + thread);
msg.setType(Message.Type.chat);
msg.setFrom(userJid);
msg.setTo(rosterItemJid);
msg.setThread(thread);
XMPPServer.getInstance().getMessageRouter().route(msg);
try {
/* otherwise monitoring plugin stores messages out of order */
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
Message msg = new Message();
msg.setBody("Hello to " + userJid.getNode() + " from " + rosterItemJid.getNode() + ", conversation number " + j
+ " of " + NUMBER_CONVERSATION + ", message " + i + " of " + NUMBER_MESSAGES + " thread " + thread);
msg.setType(Message.Type.chat);
msg.setFrom(rosterItemJid);
msg.setTo(userJid);
msg.setThread(thread);
XMPPServer.getInstance().getMessageRouter().route(msg);
try {
/* otherwise monitoring plugin stores messages out of order */
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
try {
Thread.sleep(DEFAULT_MAX_TIME_DEBUG);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
}
}
taskExecutor.shutdown();
try {
taskExecutor.awaitTermination(2, TimeUnit.HOURS);
System.out.println("Conversation generation finished");
} catch (InterruptedException e) {
e.printStackTrace();
}
JiveGlobals.deleteProperty("conversation.maxTimeDebug");
}
private Element getDefaultVCard() { private Element getDefaultVCard() {
if (vCard != null) { if (vCard != null) {
return vCard; return vCard;
......
<%@page import="org.jivesoftware.util.JiveGlobals"%>
<%@ page import="org.jivesoftware.util.ParamUtils, <%@ page import="org.jivesoftware.util.ParamUtils,
org.jivesoftware.util.TaskEngine, org.jivesoftware.util.TaskEngine,
org.jivesoftware.openfire.XMPPServer, org.jivesoftware.openfire.XMPPServer,
...@@ -21,6 +22,7 @@ ...@@ -21,6 +22,7 @@
String from = ParamUtils.getParameter(request, "from"); String from = ParamUtils.getParameter(request, "from");
String total = ParamUtils.getParameter(request, "total"); String total = ParamUtils.getParameter(request, "total");
String usersPerRoster = ParamUtils.getParameter(request, "usersPerRoster"); String usersPerRoster = ParamUtils.getParameter(request, "usersPerRoster");
boolean generateMessages = request.getParameter("messageGenerate") != null;
Map<String, String> errors = new HashMap<String, String>(); Map<String, String> errors = new HashMap<String, String>();
...@@ -31,6 +33,8 @@ ...@@ -31,6 +33,8 @@
final int intFrom = Integer.parseInt(from); final int intFrom = Integer.parseInt(from);
final int maxUsers = Integer.parseInt(total); final int maxUsers = Integer.parseInt(total);
final int usersRoster = Integer.parseInt(usersPerRoster) + 1; final int usersRoster = Integer.parseInt(usersPerRoster) + 1;
final boolean boolGenerateMessages = generateMessages;
if (maxUsers % usersRoster != 0 || maxUsers <= usersRoster) { if (maxUsers % usersRoster != 0 || maxUsers <= usersRoster) {
errors.put("arguments", ""); errors.put("arguments", "");
} }
...@@ -43,6 +47,10 @@ ...@@ -43,6 +47,10 @@
plugin.createUsers(userPrefix, intFrom, maxUsers); plugin.createUsers(userPrefix, intFrom, maxUsers);
plugin.populateRosters(userPrefix, intFrom, maxUsers, usersRoster); plugin.populateRosters(userPrefix, intFrom, maxUsers, usersRoster);
plugin.createVCards(userPrefix, intFrom, maxUsers); plugin.createVCards(userPrefix, intFrom, maxUsers);
if (boolGenerateMessages) {
plugin.generateMessages();
}
} }
}); });
running = true; running = true;
...@@ -92,7 +100,7 @@ ...@@ -92,7 +100,7 @@
<tr class="c1"> <tr class="c1">
<td width="1%" colspan="2" nowrap> <td width="1%" colspan="2" nowrap>
User prefix: User prefix:
&nbsp;<input type="text" name="prefix" value="<%=(prefix != null ? prefix : "") %>" size="30" maxlength="75"/> &nbsp;<input type="text" name="prefix" value="<%=(prefix != null ? prefix : "user") %>" size="30" maxlength="75"/>
</td> </td>
</tr> </tr>
<tr class="c1"> <tr class="c1">
...@@ -104,15 +112,20 @@ ...@@ -104,15 +112,20 @@
<tr class="c1"> <tr class="c1">
<td width="1%" colspan="2" nowrap> <td width="1%" colspan="2" nowrap>
Total users: Total users:
&nbsp;<input type="text" name="total" value="<%=(total != null ? total : "1000") %>" size="5" maxlength="15"/> &nbsp;<input type="text" name="total" value="<%=(total != null ? total : "20") %>" size="5" maxlength="15"/>
</td> </td>
</tr> </tr>
<tr class="c1"> <tr class="c1">
<td width="1%" colspan="2" nowrap> <td width="1%" colspan="2" nowrap>
Contacts in roster: Contacts in roster:
&nbsp;<input type="text" name="usersPerRoster" value="<%=(usersPerRoster != null ? usersPerRoster : "30") %>" size="5" maxlength="15"/> &nbsp;<input type="text" name="usersPerRoster" value="<%=(usersPerRoster != null ? usersPerRoster : "9") %>" size="5" maxlength="15"/>
</td> </td>
</tr> </tr>
<tr>
<td colspan="2" width="90%"><label class="jive-label" for="messageGenerate">Generate chat messages:</label><br>
Generates dummy chat messages between users. Useful for testing message archiving.</td>
<td><input type="checkbox" id="messageGenerate" name="messageGenerate" <%= "checked" %> /></td>
</tr>
<tr class="c1"> <tr class="c1">
<td width="1%" colspan="2" nowrap> <td width="1%" colspan="2" nowrap>
<input type="submit" name="Create"/> <input type="submit" name="Create"/>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment