/*
* Copyright 2006-2010 Daniel Henninger. All rights reserved.
*
* This software is published under the terms of the GNU Public License (GPL),
* a copy of which is included in this distribution.
*/
package net.sf.kraken.pseudoroster;
import net.sf.kraken.registration.Registration;
import net.sf.kraken.registration.RegistrationManager;
import net.sf.kraken.type.TransportType;
import org.apache.log4j.Logger;
import org.jivesoftware.database.DbConnectionManager;
import org.jivesoftware.openfire.user.UserNotFoundException;
import org.xmpp.packet.JID;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.*;
/**
* Handles retrieving pseudo rosters and other related tasks.
*
* @author Daniel Henninger
*/
public class PseudoRosterManager {
private static PseudoRosterManager instance = null;
static Logger Log = Logger.getLogger(PseudoRosterManager.class);
private static final String REMOVE_ROSTER =
"DELETE FROM ofGatewayPseudoRoster WHERE registrationID=?";
private static final String GET_ALL_PSEUDO_ROSTERS =
"SELECT DISTINCT registrationID FROM ofGatewayPseudoRoster";
private PseudoRosterManager() {
}
/**
* Retrieve the instance of the pseudo roster manager.
*
* @return Current instance of PseudoRosterManager.
*/
public static PseudoRosterManager getInstance() {
if (instance == null) {
instance = new PseudoRosterManager();
}
return instance;
}
/**
* Shuts down the pseudo roster manager.
*/
public void shutdown() {
if (instance != null) {
instance = null;
}
}
/**
* Retrieves a pseudo roster based off of a registration ID.
*
* @param registrationID To retrieve the roster for.
* @return A Pseudo roster
*/
public PseudoRoster getPseudoRoster(Long registrationID) {
return new PseudoRoster(registrationID);
}
/**
* Retrieves a pseudo roster based off of a registration.
*
* @param registration To retrieve the roster for.
* @return A Pseudo roster
*/
public PseudoRoster getPseudoRoster(Registration registration) {
return getPseudoRoster(registration.getRegistrationID());
}
/**
* Retrieves a pseudo roster based off of a registration.
*
* @param jid To retrieve the roster for.
* @param type TransportType the roster is for.
* @return A Pseudo roster
* @throws UserNotFoundException if the user is not actually registered.
*/
public PseudoRoster getPseudoRoster(JID jid, TransportType type) throws UserNotFoundException {
Collection<Registration> registrations = RegistrationManager.getInstance().getRegistrations(jid, type);
if (registrations.isEmpty()) {
// User is not registered with us.
throw new UserNotFoundException("Unable to find registration.");
}
Registration registration = registrations.iterator().next();
return getPseudoRoster(registration);
}
/**
* Retrieves a list of all registration IDs that have pseudo rosters.
*
* @return List of registration ids that have pseudo rosters.
*/
public List<Long> getRegistrations() {
List<Long> registrations = new ArrayList<Long>();
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
con = DbConnectionManager.getConnection();
pstmt = con.prepareStatement(GET_ALL_PSEUDO_ROSTERS);
rs = pstmt.executeQuery();
while (rs.next()) {
Long regId = rs.getLong(1);
registrations.add(regId);
}
}
catch (SQLException sqle) {
Log.error(sqle);
}
finally {
DbConnectionManager.closeConnection(rs, pstmt, con);
}
return registrations;
}
/**
* Removes a pseudo roster entirely.
*
* @param registrationID ID to be removed.
* @throws SQLException if the SQL statement is wrong for whatever reason.
*/
public void removePseudoRoster(Long registrationID) throws SQLException {
Connection con = null;
PreparedStatement pstmt = null;
boolean abortTransaction = false;
try {
con = DbConnectionManager.getTransactionConnection();
pstmt = con.prepareStatement(REMOVE_ROSTER);
pstmt.setLong(1, registrationID);
pstmt.executeUpdate();
}
catch (SQLException sqle) {
abortTransaction = true;
throw sqle;
}
finally {
DbConnectionManager.closeTransactionConnection(pstmt, con, abortTransaction);
}
}
}