In the Roster class:
public RosterItem createRosterItem(JID user) {
return createRosterItem(user, /nickname/ null, null);
}
// nickname is null
public RosterItem createRosterItem(JID user, String nickname, List groups) {
org.xmpp.packet.Roster roster = new org.xmpp.packet.Roster();
roster.setType(IQ.Type.set);
// creating an item with null nickname
Roster.Item item = roster.addItem(user, nickname, null, Roster.Subscription.none, groups);
// trying to create a roster item with null nickname
RosterItem rosterItem = rosterItemProvider.createItem(username, new RosterItem(item));
broadcast(roster);
return rosterItem;
}
/code
RosterItemProvider:
private static final String CREATE_ROSTER_ITEM =
"INSERT INTO jiveRoster (username, rosterID, jid, sub, ask, recv, nick) " +
“VALUES (?, ?, ?, ?, ?, ?, ?)”;
public RosterItem createItem(String username, RosterItem item) {
Connection con = null;
PreparedStatement pstmt = null;
try {
con = DbConnectionManager.getConnection();
long rosterID = SequenceManager.nextID(JiveConstants.ROSTER);
pstmt = con.prepareStatement(CREATE_ROSTER_ITEM);
pstmt.setString(1, username);
pstmt.setLong(2, rosterID);
pstmt.setString(3, item.getJid().toBareJID());
pstmt.setInt(4, item.getSubStatus().getValue());
pstmt.setInt(5, item.getAskStatus().getValue());
pstmt.setInt(6, item.getRecvStatus().getValue());
pstmt.setString(7, item.getNickname());
pstmt.executeUpdate();
item.setID(rosterID);
insertGroups(rosterID, item.getGroups().iterator(), con);
}
catch (SQLException e) {
// swallowing is BAD, BAD, BAD! (well, not always)
// please log the original SQL message as well…
throw new UserAlreadyExistsException(item.getJid().toBareJID());
}
return item;
}
/code
wildfire_sybase.sql
CREATE TABLE jiveRoster (
rosterID INTEGER NOT NULL,
username NVARCHAR(32) NOT NULL, /* violated constraint */
jid TEXT NOT NULL,
sub INTEGER NOT NULL,
ask INTEGER NOT NULL,
recv INTEGER NOT NULL,
nick NVARCHAR(255),
CONSTRAINT jiveRoster_pk PRIMARY KEY (rosterID)
);
/code
To fix this issue, it’'s enough to change the Roster.createRoster(JID) to:
public RosterItem createRosterItem(JID user) {
return createRosterItem(user, user.getNode(), null);
}
/code