package org.eclipse.ecf.internal.examples.webinar.util.rosterentry;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.URL;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.eclipse.ecf.core.IContainer;
import org.eclipse.ecf.core.identity.ID;
import org.eclipse.ecf.core.identity.IDFactory;
import org.eclipse.ecf.datashare.IChannel;
import org.eclipse.ecf.datashare.IChannelContainerAdapter;
import org.eclipse.ecf.datashare.IChannelListener;
import org.eclipse.ecf.datashare.events.IChannelEvent;
import org.eclipse.ecf.datashare.events.IChannelMessageEvent;
import org.eclipse.ecf.presence.roster.IRosterEntry;
import org.eclipse.ecf.presence.ui.roster.AbstractRosterEntryContributionItem;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.browser.IWebBrowser;
import org.eclipse.ui.browser.IWorkbenchBrowserSupport;
public class SendMessageRosterEntryContribution extends
AbstractRosterEntryContributionItem {
private static final String CHANNELID = "mychannel";
/*
* (non-Javadoc)
*
* @see org.eclipse.ecf.presence.ui.roster.AbstractPresenceContributionItem#makeActions()
*/
protected IAction[] makeActions() {
IAction action = null;
final IRosterEntry rosterEntry = getSelectedRosterEntry();
if (rosterEntry != null) {
if (initializeChannelFor(getContainerForRosterEntry(rosterEntry)) != null) {
action = new Action() {
public void run() {
sendDataToChannel(rosterEntry);
}
};
action.setText("Send Message and URL");
action.setImageDescriptor(PlatformUI.getWorkbench()
.getSharedImages().getImageDescriptor(
ISharedImages.IMG_DEF_VIEW));
return new IAction[] { action };
}
}
return null;
}
private void sendDataToChannel(IRosterEntry rosterEntry) {
try {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(new String[] { "Hi " + rosterEntry.getName(),
"http://www.eclipse.org/ecf" });
IChannel channel = initializeChannelFor(getContainerForRosterEntry(rosterEntry));
channel.sendMessage(rosterEntry.getUser().getID(), bos
.toByteArray());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private void receiveDataFromChannel(byte[] data) {
try {
ObjectInputStream oos = new ObjectInputStream(new ByteArrayInputStream(data));
String[] received = (String[]) oos.readObject();
showMessageAndURL(received[0], received[1]);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private static Map channels = new HashMap();
private IChannel initializeChannelFor(IContainer container) {
if (container == null)
return null;
ID containerID = container.getID();
IChannel chan = (IChannel) channels.get(containerID);
if (chan == null) {
IChannelContainerAdapter adapter = (IChannelContainerAdapter) container
.getAdapter(IChannelContainerAdapter.class);
if (adapter != null) {
chan = createChannel(adapter);
channels.put(containerID, chan);
}
}
return chan;
}
public void dispose() {
super.dispose();
for (Iterator i = channels.keySet().iterator(); i.hasNext();) {
IChannel chan = (IChannel) channels.get(i.next());
chan.dispose();
}
channels.clear();
}
private IChannel createChannel(IChannelContainerAdapter adapter) {
try {
return adapter.createChannel(IDFactory.getDefault().createStringID(
CHANNELID), new IChannelListener() {
public void handleChannelEvent(IChannelEvent event) {
if (event instanceof IChannelMessageEvent) {
receiveDataFromChannel(((IChannelMessageEvent) event)
.getData());
}
}
}, null);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
private void showMessageAndURL(final String string, final String url) {
Display.getDefault().asyncExec(new Runnable() {
public void run() {
if (MessageDialog.openConfirm(null, "Received message", string
+ ". Show URL?"))
showURL(url);
}
});
}
private void showURL(String string) {
IWorkbenchBrowserSupport support = PlatformUI.getWorkbench()
.getBrowserSupport();
IWebBrowser browser;
try {
browser = support.createBrowser(null);
browser.openURL(new URL(string));
} catch (Exception e) {
e.printStackTrace();
}
}
}