diff options
author | slewis | 2006-06-03 06:05:09 +0000 |
---|---|---|
committer | slewis | 2006-06-03 06:05:09 +0000 |
commit | 9c2f94847f97d465c906e706103a9ea3cf13f48f (patch) | |
tree | 84ab834f678f18117119e41d1b060350ecce524b | |
parent | 2a4ee8c278fb83466fb1c9ed3ea9aa3297666a3c (diff) | |
download | org.eclipse.ecf-9c2f94847f97d465c906e706103a9ea3cf13f48f.tar.gz org.eclipse.ecf-9c2f94847f97d465c906e706103a9ea3cf13f48f.tar.xz org.eclipse.ecf-9c2f94847f97d465c906e706103a9ea3cf13f48f.zip |
Tested and debugged handling of shared object messages for xmpp provider. Also added trivial test UI to the RosterView (along with RosterViewSharedObject)
9 files changed, 137 insertions, 39 deletions
diff --git a/examples/bundles/org.eclipse.ecf.example.collab/src/org/eclipse/ecf/example/collab/PresenceContainerUI.java b/examples/bundles/org.eclipse.ecf.example.collab/src/org/eclipse/ecf/example/collab/PresenceContainerUI.java index 2edc052d9..e50d18afb 100644 --- a/examples/bundles/org.eclipse.ecf.example.collab/src/org/eclipse/ecf/example/collab/PresenceContainerUI.java +++ b/examples/bundles/org.eclipse.ecf.example.collab/src/org/eclipse/ecf/example/collab/PresenceContainerUI.java @@ -3,6 +3,7 @@ package org.eclipse.ecf.example.collab; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.ecf.core.IContainer; +import org.eclipse.ecf.core.ISharedObjectContainer; import org.eclipse.ecf.core.identity.ID; import org.eclipse.ecf.presence.IAccountManager; import org.eclipse.ecf.presence.IMessageListener; @@ -30,7 +31,8 @@ public class PresenceContainerUI { protected IPresenceSender presenceSender = null; protected IAccountManager accountManager = null; protected IPresenceContainer pc = null; - + protected ISharedObjectContainer soContainer = null; + protected org.eclipse.ecf.core.user.User localUser = null; protected ID groupID = null; protected IContainer container; @@ -44,6 +46,7 @@ public class PresenceContainerUI { protected void setup(final IContainer container, final ID localUser, final String nick) { this.container = container; + this.soContainer = (ISharedObjectContainer) this.container.getAdapter(ISharedObjectContainer.class); Display.getDefault().syncExec(new Runnable() { public void run() { try { @@ -104,7 +107,7 @@ public class PresenceContainerUI { } }; PresenceContainerUI.this.groupID = joinedContainer; - rosterView.addAccount(joinedContainer,PresenceContainerUI.this.localUser,handler,pc); + rosterView.addAccount(joinedContainer,PresenceContainerUI.this.localUser,handler,pc,soContainer); } }); } diff --git a/framework/bundles/org.eclipse.ecf.provider/src/org/eclipse/ecf/provider/generic/SOContainer.java b/framework/bundles/org.eclipse.ecf.provider/src/org/eclipse/ecf/provider/generic/SOContainer.java index d7a9397c0..4bf24936e 100644 --- a/framework/bundles/org.eclipse.ecf.provider/src/org/eclipse/ecf/provider/generic/SOContainer.java +++ b/framework/bundles/org.eclipse.ecf.provider/src/org/eclipse/ecf/provider/generic/SOContainer.java @@ -701,20 +701,18 @@ public abstract class SOContainer implements ISharedObjectContainer { ContainerMessage.SharedObjectMessage resp = (ContainerMessage.SharedObjectMessage) mess .getData(); synchronized (getGroupMembershipLock()) { - if (verifyToIDForSharedObjectMessage(toID)) { - SOWrapper sow = getSharedObjectWrapper(resp - .getFromSharedObjectID()); - if (sow != null) { - try { - sow - .deliverSharedObjectMessage( - fromID, - (Serializable) deserializeSharedObjectMessage((byte[]) resp - .getData())); - } catch (ClassNotFoundException e) { - dumpStack( - "Exception in handleSharedObjectMessage:"+resp,e); - } + SOWrapper sow = getSharedObjectWrapper(resp + .getFromSharedObjectID()); + if (sow != null) { + try { + sow + .deliverSharedObjectMessage( + fromID, + (Serializable) deserializeSharedObjectMessage((byte[]) resp + .getData())); + } catch (ClassNotFoundException e) { + dumpStack( + "Exception in handleSharedObjectMessage:"+resp,e); } } forward(fromID, toID, mess); diff --git a/framework/bundles/org.eclipse.ecf.ui/META-INF/MANIFEST.MF b/framework/bundles/org.eclipse.ecf.ui/META-INF/MANIFEST.MF index 7ffa7edce..ede15475e 100644 --- a/framework/bundles/org.eclipse.ecf.ui/META-INF/MANIFEST.MF +++ b/framework/bundles/org.eclipse.ecf.ui/META-INF/MANIFEST.MF @@ -19,4 +19,6 @@ Provide-Package: org.eclipse.ecf.ui, org.eclipse.ecf.ui.views, org.eclipse.ecf.ui.wizards Export-Package: org.eclipse.ecf.ui.views, org.eclipse.ecf.ui.dialogs +Eclipse-RegisterBuddy: org.eclipse.ecf +Eclipse-BuddyPolicy: dependent diff --git a/framework/bundles/org.eclipse.ecf.ui/src/org/eclipse/ecf/ui/views/RosterView.java b/framework/bundles/org.eclipse.ecf.ui/src/org/eclipse/ecf/ui/views/RosterView.java index 42bafe14e..a624bc524 100644 --- a/framework/bundles/org.eclipse.ecf.ui/src/org/eclipse/ecf/ui/views/RosterView.java +++ b/framework/bundles/org.eclipse.ecf.ui/src/org/eclipse/ecf/ui/views/RosterView.java @@ -32,8 +32,11 @@ import org.eclipse.core.runtime.IAdaptable; import org.eclipse.core.runtime.Path; import org.eclipse.ecf.core.ContainerConnectException; import org.eclipse.ecf.core.ContainerInstantiationException; +import org.eclipse.ecf.core.ISharedObjectContainer; +import org.eclipse.ecf.core.SharedObjectAddException; import org.eclipse.ecf.core.identity.ID; import org.eclipse.ecf.core.identity.IDFactory; +import org.eclipse.ecf.core.identity.IDInstantiationException; import org.eclipse.ecf.core.security.IConnectContext; import org.eclipse.ecf.core.user.IUser; import org.eclipse.ecf.core.user.User; @@ -120,13 +123,27 @@ public class RosterView extends ViewPart implements IChatRoomViewCloseListener { IUser user; ILocalInputHandler inputHandler; IPresenceContainer container; + ISharedObjectContainer soContainer; + RosterViewSharedObject sharedObject; + public UserAccount(ID serviceID, IUser user, - ILocalInputHandler handler, IPresenceContainer container) { + ILocalInputHandler handler, IPresenceContainer container, ISharedObjectContainer soContainer) { this.serviceID = serviceID; this.user = user; this.inputHandler = handler; this.container = container; + this.soContainer = soContainer; + if (this.soContainer != null) { + try { + sharedObject = new RosterViewSharedObject(RosterView.this); + soContainer.getSharedObjectManager().addSharedObject(IDFactory.getDefault().createStringID(RosterViewSharedObject.class.getName()), sharedObject, null); + } catch (Exception e) { + sharedObject = null; + e.printStackTrace(); + } + } } + public ID getServiceID() { return serviceID; } @@ -136,9 +153,22 @@ public class RosterView extends ViewPart implements IChatRoomViewCloseListener { public ILocalInputHandler getInputHandler() { return inputHandler; } - public IPresenceContainer getContainer() { + public IPresenceContainer getPresenceContainer() { return container; } + public ISharedObjectContainer getSOContainer() { + return soContainer; + } + public RosterViewSharedObject getSharedObject() { + return sharedObject; + } + } + + protected boolean isSOContainerAccount(ID serviceID) { + if (serviceID == null) return false; + UserAccount ua = getAccount(serviceID); + if (ua != null) return ua.getSharedObject() != null; + return false; } protected void addAccount(UserAccount account) { ViewContentProvider vcp = (ViewContentProvider) viewer @@ -730,6 +760,17 @@ public class RosterView extends ViewPart implements IChatRoomViewCloseListener { .getSharedImages().getImageDescriptor( ISharedImages.IMG_TOOL_DELETE)); manager.add(removeUserAction); + + ID serviceID = tb.getServiceID(); + final UserAccount ua = getAccount(serviceID); + Action sendSOMessageAction = new Action() { + public void run() { + sendSOMessageToTarget(ua,targetID); + } + }; + sendSOMessageAction.setText("Send ECF private message to "+targetID.getName()); + sendSOMessageAction.setEnabled(isSOContainerAccount(serviceID)); + manager.add(sendSOMessageAction); } else if (treeObject instanceof TreeAccount) { final TreeAccount treeAccount = (TreeAccount) treeObject; final ID accountID = treeAccount.getId(); @@ -811,10 +852,16 @@ public class RosterView extends ViewPart implements IChatRoomViewCloseListener { // Other plug-ins can contribute there actions here manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS)); } + protected void sendSOMessageToTarget(UserAccount account, ID targetID) { + RosterViewSharedObject so = account.getSharedObject(); + if (so != null) { + so.sendMessageTo(targetID, "hello!"); + } + } protected void changePasswordForAccount(ID accountID) { UserAccount account = getAccount(accountID); if (account != null) { - IPresenceContainer pc = account.getContainer(); + IPresenceContainer pc = account.getPresenceContainer(); IAccountManager am = pc.getAccountManager(); ChangePasswordDialog cpd = new ChangePasswordDialog(viewer.getControl().getShell()); cpd.open(); @@ -951,7 +998,7 @@ public class RosterView extends ViewPart implements IChatRoomViewCloseListener { }; } protected void showChatRoomsForAccount(UserAccount ua) { - IChatRoomManager manager = ua.getContainer().getChatRoomManager(); + IChatRoomManager manager = ua.getPresenceContainer().getChatRoomManager(); if (manager != null) showChatRooms(new IChatRoomManager [] { manager}); else showChatRooms(new IChatRoomManager [] {}); } @@ -1129,7 +1176,7 @@ public class RosterView extends ViewPart implements IChatRoomViewCloseListener { List list = new ArrayList(); for (Iterator i = accounts.values().iterator(); i.hasNext();) { UserAccount ua = (UserAccount) i.next(); - IChatRoomManager man = ua.getContainer().getChatRoomManager(); + IChatRoomManager man = ua.getPresenceContainer().getChatRoomManager(); if (man != null) list.add(man); } // get chat rooms, allow user to choose desired one and open it @@ -1300,9 +1347,9 @@ public class RosterView extends ViewPart implements IChatRoomViewCloseListener { } } public void addAccount(ID account, IUser user, ILocalInputHandler handler, - IPresenceContainer container) { + IPresenceContainer container, ISharedObjectContainer soContainer) { if (account != null) { - addAccount(new UserAccount(account, user, handler, container)); + addAccount(new UserAccount(account, user, handler, container, soContainer)); setToolbarEnabled(true); } } diff --git a/framework/bundles/org.eclipse.ecf.ui/src/org/eclipse/ecf/ui/views/RosterViewSharedObject.java b/framework/bundles/org.eclipse.ecf.ui/src/org/eclipse/ecf/ui/views/RosterViewSharedObject.java new file mode 100644 index 000000000..a124bbeee --- /dev/null +++ b/framework/bundles/org.eclipse.ecf.ui/src/org/eclipse/ecf/ui/views/RosterViewSharedObject.java @@ -0,0 +1,43 @@ +package org.eclipse.ecf.ui.views; + +import java.io.IOException; + +import org.eclipse.ecf.core.events.ISharedObjectMessageEvent; +import org.eclipse.ecf.core.identity.ID; +import org.eclipse.ecf.core.sharedobject.AbstractSharedObject; +import org.eclipse.ecf.core.sharedobject.SharedObjectMsg; +import org.eclipse.ecf.core.sharedobject.SharedObjectMsgEvent; +import org.eclipse.ecf.core.util.Event; + +public class RosterViewSharedObject extends AbstractSharedObject { + + RosterView view; + + public RosterViewSharedObject(RosterView view) { + this.view = view; + } + + public void sendMessageTo(ID targetID, String message) { + try { + super.sendSharedObjectMsgTo(targetID, SharedObjectMsg.createMsg( + null, "handleMessage", message)); + } catch (IOException e) { + e.printStackTrace(); + } + } + + protected Event handleSharedObjectMsgEvent(ISharedObjectMessageEvent event) { + try { + ((SharedObjectMsgEvent) event.getData()).getSharedObjectMsg() + .invoke(this); + } catch (Exception e) { + e.printStackTrace(); + } + return event; + } + + protected void handleMessage(String message) { + // XXX this should call the view back to display the message/do other things, etc + System.out.println("GOT MESSAGE: " + message); + } +} diff --git a/framework/bundles/org.eclipse.ecf/src/org/eclipse/ecf/core/sharedobject/AbstractSharedObject.java b/framework/bundles/org.eclipse.ecf/src/org/eclipse/ecf/core/sharedobject/AbstractSharedObject.java index 38f578316..7bdd06f10 100644 --- a/framework/bundles/org.eclipse.ecf/src/org/eclipse/ecf/core/sharedobject/AbstractSharedObject.java +++ b/framework/bundles/org.eclipse.ecf/src/org/eclipse/ecf/core/sharedobject/AbstractSharedObject.java @@ -16,6 +16,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Vector; + import org.eclipse.ecf.core.IIdentifiable; import org.eclipse.ecf.core.ISharedObject; import org.eclipse.ecf.core.ISharedObjectConfig; @@ -23,6 +24,7 @@ import org.eclipse.ecf.core.ISharedObjectContext; import org.eclipse.ecf.core.ISharedObjectManager; import org.eclipse.ecf.core.ReplicaSharedObjectDescription; import org.eclipse.ecf.core.SharedObjectInitException; +import org.eclipse.ecf.core.events.ISharedObjectMessageEvent; import org.eclipse.ecf.core.identity.ID; import org.eclipse.ecf.core.util.Event; import org.eclipse.ecf.core.util.IEventProcessor; @@ -253,7 +255,7 @@ public class AbstractSharedObject implements ISharedObject, * will receive no further processing. If non-null the provided Event will be * passed to subsequent event processors. */ - protected Event handleSharedObjectMsgEvent(SharedObjectMsgEvent event) { + protected Event handleSharedObjectMsgEvent(ISharedObjectMessageEvent event) { trace("handleSharedObjectMsgEvent("+event+")"); return event; } diff --git a/framework/bundles/org.eclipse.ecf/src/org/eclipse/ecf/core/sharedobject/SharedObjectMsgEventProcessor.java b/framework/bundles/org.eclipse.ecf/src/org/eclipse/ecf/core/sharedobject/SharedObjectMsgEventProcessor.java index 511e7ac63..ab0e6f69e 100644 --- a/framework/bundles/org.eclipse.ecf/src/org/eclipse/ecf/core/sharedobject/SharedObjectMsgEventProcessor.java +++ b/framework/bundles/org.eclipse.ecf/src/org/eclipse/ecf/core/sharedobject/SharedObjectMsgEventProcessor.java @@ -11,6 +11,7 @@ package org.eclipse.ecf.core.sharedobject; +import org.eclipse.ecf.core.events.ISharedObjectMessageEvent; import org.eclipse.ecf.core.util.Event; import org.eclipse.ecf.core.util.IEventProcessor; @@ -27,15 +28,15 @@ public class SharedObjectMsgEventProcessor implements IEventProcessor { this.sharedObject = sharedObject; } public boolean acceptEvent(Event event) { - return (event instanceof SharedObjectMsgEvent); + return (event instanceof ISharedObjectMessageEvent); } public Event processEvent(Event event) { - if (!(event instanceof SharedObjectMsgEvent)) { + if (!(event instanceof ISharedObjectMessageEvent)) { return event; } - return processSharedObjectMsgEvent((SharedObjectMsgEvent) event); + return processSharedObjectMsgEvent((ISharedObjectMessageEvent) event); } - protected Event processSharedObjectMsgEvent(SharedObjectMsgEvent event) { + protected Event processSharedObjectMsgEvent(ISharedObjectMessageEvent event) { return sharedObject.handleSharedObjectMsgEvent(event); } } diff --git a/providers/bundles/org.eclipse.ecf.provider.xmpp/META-INF/MANIFEST.MF b/providers/bundles/org.eclipse.ecf.provider.xmpp/META-INF/MANIFEST.MF index 506f3f6c0..af99dc087 100644 --- a/providers/bundles/org.eclipse.ecf.provider.xmpp/META-INF/MANIFEST.MF +++ b/providers/bundles/org.eclipse.ecf.provider.xmpp/META-INF/MANIFEST.MF @@ -13,3 +13,5 @@ Require-Bundle: org.eclipse.core.runtime, org.jivesoftware.smack Eclipse-AutoStart: true Export-Package: org.eclipse.ecf.provider.xmpp.container, org.eclipse.ecf.provider.xmpp.identity +Eclipse-RegisterBuddy: org.eclipse.ecf +Eclipse-BuddyPolicy: dependent diff --git a/providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/provider/xmpp/container/XMPPClientSOContainer.java b/providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/provider/xmpp/container/XMPPClientSOContainer.java index 126ed9be2..659b061cc 100644 --- a/providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/provider/xmpp/container/XMPPClientSOContainer.java +++ b/providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/provider/xmpp/container/XMPPClientSOContainer.java @@ -139,17 +139,17 @@ public class XMPPClientSOContainer extends ClientSOContainer { XMPPRoomID roomID = null; if (toID instanceof XMPPRoomID) { roomID = (XMPPRoomID) toID; - } - String mucname = roomID.getMucString(); - for(Iterator i=chats.iterator(); i.hasNext(); ) { - IChatRoomContainer cont = (IChatRoomContainer) i.next(); - if (cont == null) continue; - ID tid = cont.getConnectedID(); - if (tid != null && tid instanceof XMPPRoomID) { - XMPPRoomID targetID = (XMPPRoomID) tid; - String tmuc = targetID.getMucString(); - if (tmuc.equals(mucname)) { - return cont; + String mucname = roomID.getMucString(); + for(Iterator i=chats.iterator(); i.hasNext(); ) { + IChatRoomContainer cont = (IChatRoomContainer) i.next(); + if (cont == null) continue; + ID tid = cont.getConnectedID(); + if (tid != null && tid instanceof XMPPRoomID) { + XMPPRoomID targetID = (XMPPRoomID) tid; + String tmuc = targetID.getMucString(); + if (tmuc.equals(mucname)) { + return cont; + } } } } |