/*******************************************************************************
* Copyright (c) 2007 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.ecf.presence.bot.impl;
import java.util.List;
import org.eclipse.ecf.core.ContainerConnectException;
import org.eclipse.ecf.core.ContainerFactory;
import org.eclipse.ecf.core.IContainer;
import org.eclipse.ecf.core.identity.ID;
import org.eclipse.ecf.core.identity.IDFactory;
import org.eclipse.ecf.core.identity.Namespace;
import org.eclipse.ecf.core.security.ConnectContextFactory;
import org.eclipse.ecf.core.security.IConnectContext;
import org.eclipse.ecf.core.util.ECFException;
import org.eclipse.ecf.presence.IIMMessageEvent;
import org.eclipse.ecf.presence.IIMMessageListener;
import org.eclipse.ecf.presence.IPresenceContainerAdapter;
import org.eclipse.ecf.presence.bot.IIMBotEntry;
import org.eclipse.ecf.presence.bot.IIMMessageHandlerEntry;
import org.eclipse.ecf.presence.im.IChatMessage;
import org.eclipse.ecf.presence.im.IChatMessageEvent;
/**
* Default im robot implementation class.
*/
public class IMBot implements IIMMessageListener {
protected IIMBotEntry bot;
protected IContainer container;
protected ID targetID;
public IMBot(IIMBotEntry bot) {
this.bot = bot;
}
protected void fireInitBot() {
List commands = bot.getCommands();
for (int i = 0; i < commands.size(); i++) {
IIMMessageHandlerEntry entry = (IIMMessageHandlerEntry) commands
.get(i);
entry.getHandler().init(bot);
}
}
protected void firePreConnect() {
List commands = bot.getCommands();
for (int i = 0; i < commands.size(); i++) {
IIMMessageHandlerEntry entry = (IIMMessageHandlerEntry) commands
.get(i);
entry.getHandler().preContainerConnect(container, targetID);
}
}
public synchronized void connect() throws ECFException {
fireInitBot();
try {
Namespace namespace = null;
if (container == null) {
container = ContainerFactory.getDefault().createContainer(
bot.getContainerFactoryName());
namespace = container.getConnectNamespace();
} else
throw new ContainerConnectException("Already connected");
targetID = IDFactory.getDefault().createID(namespace,
bot.getConnectID());
firePreConnect();
IPresenceContainerAdapter presenceAdapter = (IPresenceContainerAdapter) container
.getAdapter(IPresenceContainerAdapter.class);
presenceAdapter.getChatManager().addMessageListener(this);
String password = bot.getPassword();
IConnectContext context = (password == null) ? null
: ConnectContextFactory
.createPasswordConnectContext(password);
container.connect(targetID, context);
} catch (ECFException e) {
if (container != null) {
if (container.getConnectedID() != null) {
container.disconnect();
}
container.dispose();
}
container = null;
throw e;
}
}
public void handleMessageEvent(IIMMessageEvent event) {
if (event instanceof IChatMessageEvent) {
IChatMessageEvent imEvent = (IChatMessageEvent) event;
IChatMessage message = imEvent.getChatMessage();
List commands = bot.getCommands();
for (int i = 0; i < commands.size(); i++) {
IIMMessageHandlerEntry entry = (IIMMessageHandlerEntry) commands
.get(i);
entry.handleIMMessage(message);
}
}
}
}