This document is to declare all code changes to any Open Source software that Bignition Services Inc. has modified for its use. The changes made do not impact the core operation of the software used, but are basic functionality tweaks to enable it to run more efficiently for our operations. All code modifications listed below may be used without permission from Bignition Services Inc., however the original code is still licensed under the GPL. < Openfire - Jive Software > (1) External Database Connection Pooling: While Openfire has connection pooling implemented to access its own HSQL database, for external database access, database connection pooling is not implemented. Developers are expected to develop their own class for external database connection pooling. Below is the interface that is in the Openfire code suggested from Jive Software that we have implemented. /** * Abstract class that defines the connection provider framework. Other classes * extend this abstract class to make connection to actual data sources.

*

* It is expected that each subclass be a JavaBean, so that properties of * the connection provider are exposed through bean introspection. * * @author Jive Software */ public interface ConnectionProvider { public boolean isPooled(); public Connection getConnection() throws SQLException; public void start(); public void restart(); public void destroy(); } (2) Contact Group Sharing Caching: Openfire allows us to define groups and assign users to them and once users belong to a group, they will automatically be listed on each group members' contact list. Group administartors could link their group with another group and set contact sharing to be one way or both ways. What we found out is that while this feature works without modifying any Openfire code, it does not work efficiently as each login takes too long to complete when enabled as we have over 1500 groups. On further investigation, it was found that this snippet of code was the culprit and was commented out. Collection answer = new HashSet(); Collection groups = GroupManager.getInstance().getSharedGroups(); for (Group group : groups) { String showInRoster = group.getProperties().get("sharedRoster.showInRoster"); if ("onlyGroup".equals(showInRoster)) { if (group.isUser(username)) { // The user belongs to the group so add the group to the answer answer.add(group); } else { // Check if the user belongs to a group that may see this group Collection groupList = parseGroups(group.getProperties().get("sharedRoster.groupList")); for (Group groupInList : groupList) { if (groupInList.isUser(username)) { answer.add(group); } } } } (3) Online/offline Notifications: As Openfire keeps track of user's online/offline times, we made a simple change to also make another log entry in our external database. While this could actually be done with out modifying the Openfire code base through a custom plugin, it was much simpler to directly modify it.