diff options
author | slewis | 2006-05-27 23:32:22 +0000 |
---|---|---|
committer | slewis | 2006-05-27 23:32:22 +0000 |
commit | 95fc727e464259c2c2dca076a88d667fcf65f3bb (patch) | |
tree | e4f882d9b7e174a973129743dfdffe7155724a53 | |
parent | 758a7d84ff336dd00c2146592bcbc03b08385c3c (diff) | |
download | org.eclipse.ecf-95fc727e464259c2c2dca076a88d667fcf65f3bb.tar.gz org.eclipse.ecf-95fc727e464259c2c2dca076a88d667fcf65f3bb.tar.xz org.eclipse.ecf-95fc727e464259c2c2dca076a88d667fcf65f3bb.zip |
Fixes for UI nits and refactoring of XMPP container code
3 files changed, 94 insertions, 196 deletions
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 878a1735a..b29c6905e 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 @@ -447,51 +447,12 @@ public class RosterView extends ViewPart implements IChatRoomViewCloseListener { } return null; } - public void addEntry(TreeParent parent, IRosterEntry entry) { - TreeBuddy tb = findBuddy(parent, entry); - TreeBuddy newBuddy = createBuddy(tb, entry); - // If buddy found already, then remove old and add new - if (tb != null) { - TreeParent tbparent = tb.getParent(); - tbparent.removeChild(tb); - tbparent.addChild(newBuddy); - } - TreeParent buddyParent = newBuddy.getParent(); - if (buddyParent == null) { - // Existing group not found, so see if entry has a group - // associated with it - Iterator groups = entry.getGroups(); - if (groups.hasNext()) { - // There's a group associated with entry...so add with group - // name - String groupName = ((IRosterGroup) groups.next()).getName(); - TreeGroup oldgrp = findGroup(parent, groupName); - if (oldgrp != null) { - oldgrp.addChild(newBuddy); - } else { - TreeGroup newgrp = new TreeGroup(groupName, entry - .getServiceID()); - newgrp.addChild(newBuddy); - parent.addChild(newgrp); - } - } else { - TreeGroup tg = findGroup(parent, UNFILED_GROUP_NAME); - if (tg == null) { - tg = new TreeGroup(UNFILED_GROUP_NAME, entry - .getServiceID()); - tg.addChild(newBuddy); - parent.addChild(tg); - } else { - tg.addChild(newBuddy); - } - } - } - } public void replaceEntry(TreeParent parent, IRosterEntry entry) { TreeBuddy tb = findBuddy(parent, entry); + TreeParent tp = null; // If entry already in tree, remove it from current position if (tb != null) { - TreeParent tp = (TreeParent) tb.getParent(); + tp = (TreeParent) tb.getParent(); if (tp != null) { tp.removeChild(tb); if (tp.getName().equals(UNFILED_GROUP_NAME)) { @@ -504,31 +465,41 @@ public class RosterView extends ViewPart implements IChatRoomViewCloseListener { } // Create new buddy TreeBuddy newBuddy = createBuddy(tb, entry); - Iterator groups = entry.getGroups(); - if (groups.hasNext()) { - // There's a group associated with entry...so add with group - // name - String groupName = ((IRosterGroup) groups.next()).getName(); - TreeGroup oldgrp = findGroup(parent, groupName); - if (oldgrp != null) { - oldgrp.addChild(newBuddy); - } else { - TreeGroup newgrp = new TreeGroup(groupName, entry - .getServiceID()); - newgrp.addChild(newBuddy); - parent.addChild(newgrp); - } + // If it's a replacement for an existing buddy with group (tg), then simply add as child + if (tp != null) { + tp.addChild(newBuddy); } else { - TreeGroup tg = findGroup(parent, UNFILED_GROUP_NAME); - if (tg == null) { - tg = new TreeGroup(UNFILED_GROUP_NAME, entry.getServiceID()); - tg.addChild(newBuddy); - parent.addChild(tg); + // The parent group is not there + Iterator groups = entry.getGroups(); + // If the entry has any group, then take first one + if (groups.hasNext()) { + // There's a group associated with entry + String groupName = ((IRosterGroup) groups.next()).getName(); + // Check to see if group already there + TreeGroup oldgrp = findGroup(parent, groupName); + // If so, simply add new buddy structure to existing group + if (oldgrp != null) oldgrp.addChild(newBuddy); + else { + // There is a group name, but check to make sure it's valid + if (groupName.equals("")) groupName = UNFILED_GROUP_NAME; + addBuddyWithGroupName(parent, entry.getServiceID(), groupName, newBuddy); + } } else { - tg.addChild(newBuddy); + // No group name, so we add under UNFILED_GROUP_NAME + addBuddyWithGroupName(parent, entry.getServiceID(), UNFILED_GROUP_NAME, newBuddy); } } } + protected void addBuddyWithGroupName(TreeParent parent, ID serviceID, String groupName, TreeBuddy newBuddy) { + TreeGroup tg = findGroup(parent, groupName); + if (tg == null) { + tg = new TreeGroup(groupName, serviceID); + tg.addChild(newBuddy); + parent.addChild(tg); + } else { + tg.addChild(newBuddy); + } + } public void addAccount(ID accountID, String name) { TreeGroup oldgrp = findGroup(root, accountID); if (oldgrp != null) { @@ -573,13 +544,6 @@ public class RosterView extends ViewPart implements IChatRoomViewCloseListener { return; removeGroup(root, name); } - public void addEntry(IRosterEntry entry) { - if (entry == null) - return; - ID svcID = entry.getServiceID(); - TreeGroup tg = findAccount(svcID.getName()); - addEntry(tg, entry); - } public void replaceEntry(IRosterEntry entry) { if (entry == null) return; @@ -1240,7 +1204,7 @@ public class RosterView extends ViewPart implements IChatRoomViewCloseListener { || entry.getInterestType() == IRosterEntry.InterestType.NONE) { vcp.removeRosterEntry(entry.getUserID()); } else - vcp.addEntry(entry); + vcp.replaceEntry(entry); refreshView(); } } 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 3d160858c..126ed9be2 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 @@ -35,6 +35,7 @@ import org.eclipse.ecf.core.identity.Namespace; import org.eclipse.ecf.core.security.IConnectContext; import org.eclipse.ecf.core.security.ObjectCallback; import org.eclipse.ecf.core.util.ECFException; +import org.eclipse.ecf.core.util.Event; import org.eclipse.ecf.core.util.IQueueEnqueue; import org.eclipse.ecf.presence.IAccountManager; import org.eclipse.ecf.presence.IMessageListener; @@ -74,6 +75,7 @@ import org.jivesoftware.smack.packet.Presence; import org.jivesoftware.smackx.muc.HostedRoom; import org.jivesoftware.smackx.muc.MultiUserChat; import org.jivesoftware.smackx.muc.RoomInfo; +import org.jivesoftware.smackx.packet.MUCUser; public class XMPPClientSOContainer extends ClientSOContainer { @@ -81,7 +83,6 @@ public class XMPPClientSOContainer extends ClientSOContainer { Trace trace = Trace.create("XMPPClientSOContainer"); public static final String NAMESPACE_IDENTIFIER = XmppPlugin.getDefault().getNamespaceIdentifier(); - public static final String XMPP_SHARED_OBJECT_ID = XMPPClientSOContainer.class .getName() + ".xmpphandler"; @@ -110,20 +111,21 @@ public class XMPPClientSOContainer extends ClientSOContainer { trace.dumpStack(t,msg); } } + protected XMPPClientSOContainer(SOContainerConfig config, int keepAlive) throws Exception { + super(config); + this.keepAlive = keepAlive; + this.sharedObjectID = IDFactory.getDefault().createStringID(XMPP_SHARED_OBJECT_ID); + sharedObject = new XMPPPresenceSharedObject(); + } public XMPPClientSOContainer() throws Exception { this(DEFAULT_KEEPALIVE); } - public XMPPClientSOContainer(int ka) throws Exception { - super(new SOContainerConfig(IDFactory.getDefault().createGUID())); - keepAlive = ka; - initializeSharedObject(); + this(new SOContainerConfig(IDFactory.getDefault().createGUID()),ka); } public XMPPClientSOContainer(String userhost, int ka) throws Exception { - super(new SOContainerConfig(IDFactory.getDefault().createStringID(userhost))); - keepAlive = ka; - initializeSharedObject(); + this(new SOContainerConfig(IDFactory.getDefault().createStringID(userhost)),ka); } protected void disposeChats() { for(Iterator i=chats.iterator(); i.hasNext(); ) { @@ -175,10 +177,6 @@ public class XMPPClientSOContainer extends ClientSOContainer { new HashMap()); } - protected void cleanUpConnectFail() { - dispose(); - } - public void dispose() { if (sharedObject != null) { getSharedObjectManager().removeSharedObject(sharedObjectID); @@ -238,121 +236,44 @@ public class XMPPClientSOContainer extends ClientSOContainer { } else return null; } + public Namespace getConnectNamespace() { return IDFactory.getDefault().getNamespaceByName(XmppPlugin.getDefault().getNamespaceIdentifier()); } - protected void handleChatMessageWithExtension(Message mess) throws IOException { - // XXX Log this properly or handle with new semantics for handling extensions - Iterator i = mess.getExtensions(); - if (i.hasNext()) { - for(; i.hasNext(); ) { - Object extension = i.next(); - trace("XMPPClientSOContainer.handleChatMessageWithExtension("+mess+") presence extension: "+extension+",from="+mess.getFrom()+",to="+mess.getTo()); - } - - } - } - protected void handleChatMessage(Message mess) throws IOException { + + protected void deliverEvent(Event evt) { SOWrapper wrap = getSharedObjectWrapper(sharedObjectID); - /* XXX - if (mess.getExtensions().hasNext()) { - handleChatMessageWithExtension(mess); - } else { - */ - if (wrap != null) { - wrap.deliverEvent(new MessageEvent(mess)); - } - /* - } - */ - } - - protected void handleContainerMessage(ContainerMessage mess) - throws IOException { - if (mess == null) { - debug("got null container message...ignoring"); - return; - } - IChatRoomContainer chat = findChat(mess.getToContainerID()); - if (chat != null && chat instanceof XMPPGroupChatSOContainer) { - XMPPGroupChatSOContainer cont = (XMPPGroupChatSOContainer) chat; - cont.handleContainerMessage(mess); - return; - } - Object data = mess.getData(); - if (data instanceof ContainerMessage.CreateMessage) { - handleCreateMessage(mess); - } else if (data instanceof ContainerMessage.CreateResponseMessage) { - handleCreateResponseMessage(mess); - } else if (data instanceof ContainerMessage.SharedObjectMessage) { - handleSharedObjectMessage(mess); - } else if (data instanceof ContainerMessage.SharedObjectDisposeMessage) { - handleSharedObjectDisposeMessage(mess); - } else { - debug("got unrecognized container message...ignoring: " + mess); - } - } - - protected void handleIQMessageWithExtension(IQ mess) throws IOException { - // XXX Log this properly or handle with new semantics for handling extensions - Iterator i = mess.getExtensions(); - if (i.hasNext()) { - for(; i.hasNext(); ) { - Object extension = i.next(); - trace("XMPPClientSOContainer.handleIQMessageWithExtension("+mess+") presence extension: "+extension+",from="+mess.getFrom()+",to="+mess.getTo()); - } - } + if (wrap != null) wrap.deliverEvent(evt); + else trace("deliverEvent("+evt+") wrapper object is unavailable"); } - protected void handleIQMessage(IQ mess) throws IOException { - SOWrapper wrap = getSharedObjectWrapper(sharedObjectID); - if (mess.getExtensions().hasNext()) { - handleIQMessageWithExtension(mess); - } else { - if (wrap != null) { - wrap.deliverEvent(new IQEvent(mess)); + + protected void handleXMPPMessage(Packet aPacket) throws IOException { + if (!handleAsExtension(aPacket)) { + if (aPacket instanceof IQ) { + deliverEvent(new IQEvent((IQ) aPacket)); + } else if (aPacket instanceof Message) { + deliverEvent(new MessageEvent((Message) aPacket)); + } else if (aPacket instanceof Presence) { + deliverEvent(new PresenceEvent((Presence) aPacket)); + } else { + // unexpected message + debug("got unexpected packet " + aPacket.toXML()); } } } - protected void handlePresenceMessageWithExtension(Presence mess) throws IOException { - // XXX Log this properly or handle with new semantics for handling extensions - Iterator i = mess.getExtensions(); - if (i.hasNext()) { - for(; i.hasNext(); ) { - Object extension = i.next(); - trace("XMPPClientSOContainer.handlePresenceMessageWithExtension("+mess+") presence extension: "+extension+",from="+mess.getFrom()+",to="+mess.getTo()); - } - + protected boolean handleAsExtension(Packet packet) { + // XXX this is where extension mechanism needs to be added + Iterator i = packet.getExtensions(); + for(; i.hasNext(); ) { + Object extension = i.next(); + trace("XMPPClientSOContainer.handleAsExtension(ext="+extension+",packet="+packet.toXML()+")"); + if (packet instanceof Presence && extension instanceof MUCUser) { + trace("XMPPClientSOContainer.handleAsExtension: received presence for MUCUser"); + return true; + } } - - } - protected void handlePresenceMessage(Presence mess) throws IOException { - SOWrapper wrap = getSharedObjectWrapper(sharedObjectID); - if (mess.getExtensions().hasNext()) { - handlePresenceMessageWithExtension(mess); - } else { - if (wrap != null) { - wrap.deliverEvent(new PresenceEvent(mess)); - } - } - } - - protected void handleXMPPMessage(Packet aPacket) throws IOException { - if (aPacket instanceof IQ) { - handleIQMessage((IQ) aPacket); - } else if (aPacket instanceof Message) { - handleChatMessage((Message) aPacket); - } else if (aPacket instanceof Presence) { - handlePresenceMessage((Presence) aPacket); - } else { - // unexpected message - debug("got unexpected packet " + aPacket); - } - } - - protected void initializeSharedObject() throws Exception { - sharedObjectID = IDFactory.getDefault().createStringID(XMPP_SHARED_OBJECT_ID); - sharedObject = new XMPPPresenceSharedObject(); + return false; } public void connect(ID remote, IConnectContext joinContext) @@ -361,10 +282,10 @@ public class XMPPClientSOContainer extends ClientSOContainer { addSharedObjectToContainer(remote); super.connect(remote, joinContext); } catch (ContainerConnectException e) { - cleanUpConnectFail(); + dispose(); throw e; } catch (SharedObjectAddException e1) { - cleanUpConnectFail(); + dispose(); throw new ContainerConnectException( "Exception adding shared object " + sharedObjectID, e1); } @@ -408,18 +329,35 @@ public class XMPPClientSOContainer extends ClientSOContainer { protected void processAsynch(AsynchConnectionEvent e) { try { if (e instanceof ECFConnectionPacketEvent) { - // It's a regular message...just print for now - Packet chatMess = (Packet) e.getData(); - handleXMPPMessage(chatMess); + // It's a regular xmpp message + handleXMPPMessage((Packet) e.getData()); return; } else if (e instanceof ECFConnectionObjectPacketEvent) { + // It's an ECF object message ECFConnectionObjectPacketEvent evt = (ECFConnectionObjectPacketEvent) e; Object obj = evt.getObjectValue(); // this should be a ContainerMessage Object cm = deserializeContainerMessage((byte[]) obj); if (cm == null) throw new IOException("deserialized object is null"); ContainerMessage contMessage = (ContainerMessage) cm; - handleContainerMessage(contMessage); + IChatRoomContainer chat = findChat(contMessage.getToContainerID()); + if (chat != null && chat instanceof XMPPGroupChatSOContainer) { + XMPPGroupChatSOContainer cont = (XMPPGroupChatSOContainer) chat; + cont.handleContainerMessage(contMessage); + return; + } + Object data = contMessage.getData(); + if (data instanceof ContainerMessage.CreateMessage) { + handleCreateMessage(contMessage); + } else if (data instanceof ContainerMessage.CreateResponseMessage) { + handleCreateResponseMessage(contMessage); + } else if (data instanceof ContainerMessage.SharedObjectMessage) { + handleSharedObjectMessage(contMessage); + } else if (data instanceof ContainerMessage.SharedObjectDisposeMessage) { + handleSharedObjectDisposeMessage(contMessage); + } else { + debug("got unrecognized container message...ignoring: " + contMessage); + } } else { // Unexpected type... debug("got unexpected event: " + e); diff --git a/providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/provider/xmpp/container/XMPPPresenceSharedObject.java b/providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/provider/xmpp/container/XMPPPresenceSharedObject.java index 85aa57603..625d494cf 100644 --- a/providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/provider/xmpp/container/XMPPPresenceSharedObject.java +++ b/providers/bundles/org.eclipse.ecf.provider.xmpp/src/org/eclipse/ecf/provider/xmpp/container/XMPPPresenceSharedObject.java @@ -53,10 +53,6 @@ import org.jivesoftware.smack.packet.RosterPacket; import org.jivesoftware.smack.packet.Presence.Mode; import org.jivesoftware.smack.packet.Presence.Type; -/** - * @author slewis - * - */ public class XMPPPresenceSharedObject implements ISharedObject, IAccountManager { public static Trace trace = Trace.create("xmpppresencesharedobject"); |