/**
* Hudson Sametime Plugin
*/
package hudson.plugins.sametime.im.transport;
import hudson.plugins.sametime.im.IMConnection;
import hudson.plugins.sametime.im.IMException;
import hudson.plugins.sametime.im.IMMessageTarget;
import hudson.plugins.sametime.im.IMPresence;
import hudson.plugins.sametime.im.transport.bot.SametimeNotificationBot;
import java.util.logging.Level;
import java.util.logging.Logger;
import com.lotus.sametime.community.CommunityService;
import com.lotus.sametime.community.Login;
import com.lotus.sametime.community.LoginEvent;
import com.lotus.sametime.community.LoginListener;
import com.lotus.sametime.core.comparch.DuplicateObjectException;
import com.lotus.sametime.core.comparch.STSession;
import com.lotus.sametime.core.constants.EncLevel;
import com.lotus.sametime.core.constants.ImTypes;
import com.lotus.sametime.core.types.STPrivacyList;
import com.lotus.sametime.im.Im;
import com.lotus.sametime.im.InstantMessagingService;
/**
* ST Toolkit-specific implementation of IMConnection.
* @author Jamie Burrell
*/
class SametimeIMConnection implements IMConnection, LoginListener
{
private STSession session;
private CommunityService commService;
private Login login;
private InstantMessagingService imService;
private static final Logger log = Logger.getLogger(SametimeIMConnection.class.getName());
/**
* Constructor.
* @param desc The configuration
*/
public SametimeIMConnection(SametimePublisherDescriptor desc)
{
try
{
log.info("Creating ST Session.");
session = new STSession("HudsonNotifierSession");
log.info("Loading ST Components.");
session.loadSemanticComponents();
log.info("Starting ST Session.");
session.start();
commService = (CommunityService) session.getCompApi(CommunityService.COMP_NAME);
commService.addLoginListener(this);
log.info("Attempting login.");
commService.loginByPassword(desc.getHostname(), desc.getHudsonNickname(), desc.getHudsonPassword());
}
catch (DuplicateObjectException e)
{
log.log(Level.SEVERE, "DuplicateObjectException caught!", e);
}
}
/* (non-Javadoc)
* @see hudson.plugins.sametime.im.IMConnection#close()
*/
public void close()
{
commService.logout();
session.stop();
session.unloadSession();
}
/* (non-Javadoc)
* @see hudson.plugins.sametime.im.IMConnection#send(hudson.plugins.sametime.im.IMMessageTarget, java.lang.String)
*/
public void send(IMMessageTarget target, String text) throws IMException
{
SametimeIMMessageTarget stTarget = (SametimeIMMessageTarget)target;
log.info("Opening IM session with target: "+ stTarget.getUser().getName());
Im im = imService.createIm(stTarget.getUser(), EncLevel.ENC_LEVEL_ALL, ImTypes.IM_TYPE_CHAT);
im.addImListener(new SametimeNotificationBot(text));
im.open();
}
/* (non-Javadoc)
* @see hudson.plugins.sametime.im.IMConnection#setPresence(hudson.plugins.sametime.im.IMPresence)
*/
public void setPresence(IMPresence presence) throws IMException
{
if(null == login || !commService.isLoggedIn())
return;
switch(presence)
{
case AVAILABLE :
// exclude no-one
login.changeMyPrivacy(new STPrivacyList(true));
break;
case UNAVAILABLE : // default state
default :
// include no-one
login.changeMyPrivacy(new STPrivacyList(false));
}
}
/**
* Get the session we are currently using
* @return The session
*/
public STSession getSession()
{
return session;
}
/* (non-Javadoc)
* @see com.lotus.sametime.community.LoginListener#loggedIn(com.lotus.sametime.community.LoginEvent)
*/
public void loggedIn(LoginEvent le)
{
log.info("Loggedin successfully.");
login = le.getLogin();
log.info("Registering for IM Service.");
imService = (InstantMessagingService) session.getCompApi(InstantMessagingService.COMP_NAME);
imService.registerImType(ImTypes.IM_TYPE_CHAT);
}
/* (non-Javadoc)
* @see com.lotus.sametime.community.LoginListener#loggedOut(com.lotus.sametime.community.LoginEvent)
*/
public void loggedOut(LoginEvent le)
{
session.stop();
session.unloadSession();
}
}