package org.jivesoftware.openfire.plugin.rest.controller;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.ws.rs.core.Response;
import org.jivesoftware.openfire.SessionManager;
import org.jivesoftware.openfire.plugin.rest.entity.SessionEntities;
import org.jivesoftware.openfire.plugin.rest.entity.SessionEntity;
import org.jivesoftware.openfire.plugin.rest.exceptions.ExceptionType;
import org.jivesoftware.openfire.plugin.rest.exceptions.ServiceException;
import org.jivesoftware.openfire.session.ClientSession;
import org.jivesoftware.openfire.session.LocalClientSession;
import org.jivesoftware.openfire.session.Session;
import org.jivesoftware.openfire.user.UserNotFoundException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.xmpp.packet.Presence;
import org.xmpp.packet.StreamError;
/**
* The Class SessionController.
*/
public class SessionController {
/** The Constant INSTANCE. */
public static final SessionController INSTANCE = new SessionController();
/** The log. */
private static Logger LOG = LoggerFactory.getLogger(SessionController.class);
/**
* Gets the single instance of SessionController.
*
* @return single instance of SessionController
*/
public static SessionController getInstance() {
return INSTANCE;
}
/**
* Gets the user sessions.
*
* @param username the username
* @return the user sessions
* @throws ServiceException the service exception
*/
public SessionEntities getUserSessions(String username) throws ServiceException {
Collection<ClientSession> clientSessions = SessionManager.getInstance().getSessions(username);
SessionEntities sessionEntities = convertToSessionEntities(clientSessions);
return sessionEntities;
}
/**
* Gets the all sessions.
*
* @return the all sessions
* @throws ServiceException the service exception
*/
public SessionEntities getAllSessions() throws ServiceException {
Collection<ClientSession> clientSessions = SessionManager.getInstance().getSessions();
SessionEntities sessionEntities = convertToSessionEntities(clientSessions);
return sessionEntities;
}
/**
* Removes the user sessions.
*
* @param username the username
* @throws ServiceException the service exception
*/
public void removeUserSessions(String username) throws ServiceException {
final StreamError error = new StreamError(StreamError.Condition.not_authorized);
for (ClientSession session : SessionManager.getInstance().getSessions(username)) {
session.deliverRawText(error.toXML());
session.close();
}
}
/**
* Convert to session entities.
*
* @param clientSessions the client sessions
* @return the session entities
* @throws ServiceException the service exception
*/
private SessionEntities convertToSessionEntities(Collection<ClientSession> clientSessions) throws ServiceException {
List<SessionEntity> sessions = new ArrayList<SessionEntity>();
SessionEntities sessionEntities = new SessionEntities(sessions);
for (ClientSession clientSession : clientSessions) {
SessionEntity session = new SessionEntity();
session.setSessionId(clientSession.getAddress().toString());
if (!clientSession.isAnonymousUser()) {
try {
session.setUsername(clientSession.getUsername());
} catch (UserNotFoundException e) {
throw new ServiceException("Could not get user", "", ExceptionType.USER_NOT_FOUND_EXCEPTION,
Response.Status.NOT_FOUND, e);
}
} else {
session.setUsername("Anonymous");
}
session.setRessource(clientSession.getAddress().getResource());
if (clientSession instanceof LocalClientSession) {
session.setNode("Local");
} else {
session.setNode("Remote");
}
String status = "";
if (clientSession.getStatus() == Session.STATUS_CLOSED) {
status = "Closed";
} else if (clientSession.getStatus() == Session.STATUS_CONNECTED) {
status = "Connected";
} else if (clientSession.getStatus() == Session.STATUS_AUTHENTICATED) {
status = "Authenticated";
} else {
status = "Unkown";
}
session.setSessionStatus(status);
if (clientSession.getPresence() != null) {
session.setPresenceMessage(clientSession.getPresence().getStatus());
Presence.Show show = clientSession.getPresence().getShow();
if(show == Presence.Show.away) {
session.setPresenceStatus("Away");
} else if(show == Presence.Show.chat) {
session.setPresenceStatus("Available to Chat");
} else if(show == Presence.Show.dnd) {
session.setPresenceStatus("Do Not Disturb");
} else if(show == Presence.Show.xa) {
session.setPresenceStatus("Extended Away");
} else if(show == null) {
session.setPresenceStatus("Online");
} else {
session.setPresenceStatus("Unknown/Not Recognized");
}
session.setPriority(clientSession.getPresence().getPriority());
}
try {
session.setHostAddress(clientSession.getHostAddress());
session.setHostName(clientSession.getHostName());
} catch (UnknownHostException e) {
LOG.error("UnknownHostException", e);
}
session.setCreationDate(clientSession.getCreationDate());
session.setLastActionDate(clientSession.getLastActiveDate());
session.setSecure(clientSession.isSecure());
sessions.add(session);
}
return sessionEntities;
}
}