diff options
| author | slewis | 2005-04-12 05:11:09 +0000 |
|---|---|---|
| committer | slewis | 2005-04-12 05:11:09 +0000 |
| commit | 820d024091652c6e8be77c54b2413b50fd353aee (patch) | |
| tree | e547735d6b9968efbd20f12f4df26f69aa520b1f | |
| parent | 1c1c8218073cb72d49ffc71739e26892a311a379 (diff) | |
| download | org.eclipse.ecf-820d024091652c6e8be77c54b2413b50fd353aee.tar.gz org.eclipse.ecf-820d024091652c6e8be77c54b2413b50fd353aee.tar.xz org.eclipse.ecf-820d024091652c6e8be77c54b2413b50fd353aee.zip | |
Fixed bug in group handling. Added IAccountManager interface to org.eclipse.ecf.presence.IPresenceContainer interface. Created/added IPresenceSender and moved sendPresenceUpdate method to IPresenceSender interface (rather than IMessageSender). Provided implementation of all three interfaces in org.eclipse.ecf.provider.xmpp provider
10 files changed, 214 insertions, 38 deletions
diff --git a/examples/bundles/org.eclipse.ecf.example.collab/src/org/eclipse/ecf/example/collab/Client.java b/examples/bundles/org.eclipse.ecf.example.collab/src/org/eclipse/ecf/example/collab/Client.java index efff0e7b2..c35b82b42 100644 --- a/examples/bundles/org.eclipse.ecf.example.collab/src/org/eclipse/ecf/example/collab/Client.java +++ b/examples/bundles/org.eclipse.ecf.example.collab/src/org/eclipse/ecf/example/collab/Client.java @@ -18,6 +18,7 @@ import java.util.HashMap; import java.util.Hashtable; import java.util.Iterator; import java.util.Vector; + import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.ResourcesPlugin; @@ -36,13 +37,15 @@ import org.eclipse.ecf.example.collab.share.EclipseCollabSharedObject; import org.eclipse.ecf.example.collab.share.SharedObjectEventListener; import org.eclipse.ecf.example.collab.share.TreeItem; import org.eclipse.ecf.example.collab.share.User; +import org.eclipse.ecf.presence.IAccountManager; import org.eclipse.ecf.presence.IMessageListener; import org.eclipse.ecf.presence.IMessageSender; import org.eclipse.ecf.presence.IPresence; import org.eclipse.ecf.presence.IPresenceContainer; import org.eclipse.ecf.presence.IPresenceListener; -import org.eclipse.ecf.presence.ISubscribeListener; +import org.eclipse.ecf.presence.IPresenceSender; import org.eclipse.ecf.presence.IRosterEntry; +import org.eclipse.ecf.presence.ISubscribeListener; import org.eclipse.ecf.presence.impl.Presence; import org.eclipse.ecf.ui.views.ITextInputHandler; import org.eclipse.ecf.ui.views.RosterView; @@ -311,11 +314,15 @@ public class Client { protected RosterView rosterView = null; protected IMessageSender messageSender = null; - + protected IPresenceSender presenceSender = null; + protected IAccountManager accountManager = null; + protected void setupPresenceContainer(final ISharedObjectContainer container, IPresenceContainer pc, final ID localUser, final String nick) { messageSender = pc.getMessageSender(); - + presenceSender = pc.getPresenceSender(); + accountManager = pc.getAccountManager(); + Display.getDefault().syncExec(new Runnable() { public void run() { try { @@ -370,6 +377,15 @@ public class Client { rosterView.setGroup(joinedContainer); } }); + // XXX TESTING OF ACCOUNT CREATION + /* + try { + accountManager.createAccount("foo1","foo1",null); + } catch (ECFException e) { + e.printStackTrace(); + } + */ + } public void handleRosterEntry(final IRosterEntry entry) { @@ -405,8 +421,8 @@ public class Client { public void handleSubscribeRequest(ID fromID, IPresence presence) { System.out.println("subscribe request from "+fromID); - if (messageSender != null) { - messageSender.sendPresenceUpdate(localUser,fromID,new Presence(IPresence.Type.SUBSCRIBED)); + if (presenceSender != null) { + presenceSender.sendPresenceUpdate(localUser,fromID,new Presence(IPresence.Type.SUBSCRIBED)); } } diff --git a/framework/bundles/org.eclipse.ecf.presence/src/org/eclipse/ecf/presence/IAccountManager.java b/framework/bundles/org.eclipse.ecf.presence/src/org/eclipse/ecf/presence/IAccountManager.java new file mode 100644 index 000000000..d04cc92b2 --- /dev/null +++ b/framework/bundles/org.eclipse.ecf.presence/src/org/eclipse/ecf/presence/IAccountManager.java @@ -0,0 +1,26 @@ +/**************************************************************************** +* Copyright (c) 2004 Composent, Inc. 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: +* Composent, Inc. - initial API and implementation +*****************************************************************************/ +package org.eclipse.ecf.presence; + +import java.util.Map; + +import org.eclipse.ecf.core.util.ECFException; + +public interface IAccountManager { + + public void changePassword(String newpassword) throws ECFException; + public void createAccount(String username, String password, Map attributes) throws ECFException; + public void deleteAccount() throws ECFException; + public String getAccountInstructions(); + public String[] getAccountAttributeNames(); + public Object getAccountAttribute(String name); + public boolean supportsCreation(); +} diff --git a/framework/bundles/org.eclipse.ecf.presence/src/org/eclipse/ecf/presence/IMessageSender.java b/framework/bundles/org.eclipse.ecf.presence/src/org/eclipse/ecf/presence/IMessageSender.java index 9ab209395..f03d39583 100644 --- a/framework/bundles/org.eclipse.ecf.presence/src/org/eclipse/ecf/presence/IMessageSender.java +++ b/framework/bundles/org.eclipse.ecf.presence/src/org/eclipse/ecf/presence/IMessageSender.java @@ -16,6 +16,4 @@ import org.eclipse.ecf.presence.IMessageListener.Type; public interface IMessageSender { public void sendMessage(ID fromID, ID toID, Type type, String subject, String message); - public void sendPresenceUpdate(ID fromID, ID toID, IPresence presence); - } diff --git a/framework/bundles/org.eclipse.ecf.presence/src/org/eclipse/ecf/presence/IPresenceContainer.java b/framework/bundles/org.eclipse.ecf.presence/src/org/eclipse/ecf/presence/IPresenceContainer.java index f1f47be6a..65d71ca54 100644 --- a/framework/bundles/org.eclipse.ecf.presence/src/org/eclipse/ecf/presence/IPresenceContainer.java +++ b/framework/bundles/org.eclipse.ecf.presence/src/org/eclipse/ecf/presence/IPresenceContainer.java @@ -22,7 +22,9 @@ public interface IPresenceContainer { public void addSharedObjectMessageListener(ISharedObjectMessageListener listener); public IMessageSender getMessageSender(); - + public IPresenceSender getPresenceSender(); + public IAccountManager getAccountManager(); + public ISharedObjectContainer makeSharedObjectContainer(Class [] types, Object [] args) throws SharedObjectContainerInstantiationException; } diff --git a/framework/bundles/org.eclipse.ecf.presence/src/org/eclipse/ecf/presence/IPresenceSender.java b/framework/bundles/org.eclipse.ecf.presence/src/org/eclipse/ecf/presence/IPresenceSender.java new file mode 100644 index 000000000..baa3c97ac --- /dev/null +++ b/framework/bundles/org.eclipse.ecf.presence/src/org/eclipse/ecf/presence/IPresenceSender.java @@ -0,0 +1,19 @@ +/**************************************************************************** +* Copyright (c) 2004 Composent, Inc. 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: +* Composent, Inc. - initial API and implementation +*****************************************************************************/ +package org.eclipse.ecf.presence; + +import org.eclipse.ecf.core.identity.ID; + +public interface IPresenceSender { + + public void sendPresenceUpdate(ID fromID, ID toID, IPresence presence); + +} 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 20fde5fc2..3e2d9ee21 100644 --- a/framework/bundles/org.eclipse.ecf.ui/META-INF/MANIFEST.MF +++ b/framework/bundles/org.eclipse.ecf.ui/META-INF/MANIFEST.MF @@ -14,6 +14,6 @@ Require-Bundle: org.eclipse.ecf, Eclipse-AutoStart: true Provide-Package: org.eclipse.ecf.ui, org.eclipse.ecf.ui.views -Export-Package: org.eclipse.ecf.ui.views +Export-Package: org.eclipse.ecf.ui.views, org.eclipse.ecf.ui.dialogs DynamicImport-Package: org.eclipse.ecf.presence, org.eclipse.ecf.presence.impl diff --git a/framework/bundles/org.eclipse.ecf.ui/src/org/eclipse/ecf/ui/dialogs/AuthorizeRequest.java b/framework/bundles/org.eclipse.ecf.ui/src/org/eclipse/ecf/ui/dialogs/AuthorizeRequest.java index 138f36d86..93003632d 100644 --- a/framework/bundles/org.eclipse.ecf.ui/src/org/eclipse/ecf/ui/dialogs/AuthorizeRequest.java +++ b/framework/bundles/org.eclipse.ecf.ui/src/org/eclipse/ecf/ui/dialogs/AuthorizeRequest.java @@ -14,6 +14,9 @@ import org.eclipse.swt.widgets.Shell; public class AuthorizeRequest extends Dialog { + private String targetName = "target"; + private String requesterName = "requester"; + private Label target_username; private Label requester_userid; private static final int REFUSE_ID = IDialogConstants.CLIENT_ID + 3; @@ -23,6 +26,12 @@ public class AuthorizeRequest extends Dialog { public AuthorizeRequest(Shell parentShell) { super(parentShell); } + + public AuthorizeRequest(Shell parentShell, String fromName, String toName) { + super(parentShell); + this.requesterName = fromName; + this.targetName = toName; + } protected Control createDialogArea(Composite parent) { Composite container = (Composite) super.createDialogArea(parent); @@ -33,34 +42,38 @@ public class AuthorizeRequest extends Dialog { gridLayout.numColumns = 4; composite.setLayout(gridLayout); final GridData gridData_1 = new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_VERTICAL); - gridData_1.heightHint = 22; + gridData_1.heightHint = 52; gridData_1.verticalSpan = 2; composite.setLayoutData(gridData_1); requester_userid = new Label(composite, SWT.NONE); - final GridData gridData_2 = new GridData(); + final GridData gridData_2 = new GridData(GridData.GRAB_VERTICAL); requester_userid.setLayoutData(gridData_2); - requester_userid.setText("slewis@cerf.composent.com"); + requester_userid.setText(requesterName); final Label label_4 = new Label(composite, SWT.NONE); label_4.setText(" would like to add "); target_username = new Label(composite, SWT.NONE); target_username.setLayoutData(new GridData()); - target_username.setText("slewis@composent.com"); + target_username.setText(targetName); final Label label_5 = new Label(composite, SWT.NONE); label_5.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); label_5.setText(" to their buddy list"); final Composite composite_1 = new Composite(container, SWT.NONE); - composite_1.setLayout(new FillLayout(SWT.VERTICAL)); + composite_1.setLayout(new GridLayout()); final GridData gridData = new GridData(GridData.FILL_BOTH); - gridData.heightHint = 82; + gridData.heightHint = 73; composite_1.setLayoutData(gridData); final Label label = new Label(composite_1, SWT.WRAP); - label.setText("\nYou can choose to authorize and also add them to your own buddy list, authorize them without adding them to your buddy list, or refuse to authorize"); + final GridData gridData_4 = new GridData(); + gridData_4.heightHint = 56; + gridData_4.widthHint = 462; + label.setLayoutData(gridData_4); + label.setText("You may choose to authorize and add them to your own buddy list, authorize without adding them to your buddy list, or refuse to authorize"); final Label label_3 = new Label(container, SWT.SEPARATOR | SWT.HORIZONTAL); final GridData gridData_3 = new GridData(GridData.FILL_HORIZONTAL); @@ -81,11 +94,13 @@ public class AuthorizeRequest extends Dialog { } protected Point getInitialSize() { - return new Point(507, 196); + return new Point(486, 223); } protected void configureShell(Shell newShell) { super.configureShell(newShell); - newShell.setText("ECF Authorization Request"); + newShell.setText("ECF Authorization request from "+requesterName); + } + protected void buttonPressed(int button) { + System.out.println("button "+button+" pressed"); } - } 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 cc2f7768b..c9e9eb33c 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 @@ -278,21 +278,15 @@ public class RosterView extends ViewPart implements IPresenceListener, IMessageL return newBuddy; } - public TreeParent findGroup(TreeParent parent, IRosterEntry entry) { + public TreeGroup findGroup(TreeParent parent, String name) { TreeObject [] objs = parent.getChildren(); - Iterator groups = entry.getGroups(); - for( ; groups.hasNext(); ) { - IRosterGroup grp = (IRosterGroup) groups.next(); - String groupName = grp.getName(); - if (objs != null) { - for(int i = 0; i < objs.length; i++) { - if (objs[i].getName().equals(groupName)) { - return (TreeParent) objs[i]; - } + if (objs != null) { + for(int i = 0; i < objs.length; i++) { + if (objs[i].getName().equals(name)) { + return (TreeGroup) objs[i]; } } } - return null; } @@ -336,9 +330,14 @@ public class RosterView extends ViewPart implements IPresenceListener, IMessageL if (groups.hasNext()) { // There's a group associated with entry...so add with group name String groupName = ((IRosterGroup) groups.next()).getName(); - TreeGroup newgrp = new TreeGroup(groupName); - newgrp.addChild(newBuddy); - parent.addChild(newgrp); + TreeGroup oldgrp = findGroup(parent,groupName); + if (oldgrp != null) { + oldgrp.addChild(newBuddy); + } else { + TreeGroup newgrp = new TreeGroup(groupName); + newgrp.addChild(newBuddy); + parent.addChild(newgrp); + } } else { parent.addChild(newBuddy); } 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 e0976daa7..b41a6fef7 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 @@ -11,6 +11,7 @@ package org.eclipse.ecf.provider.xmpp.container; import java.io.IOException; import java.io.Serializable; import java.util.HashMap; +import java.util.Map; import org.eclipse.ecf.core.ISharedObjectContainer; import org.eclipse.ecf.core.SharedObjectAddException; @@ -24,12 +25,15 @@ import org.eclipse.ecf.core.events.SharedObjectContainerJoinedEvent; import org.eclipse.ecf.core.events.SharedObjectContainerLeaveGroupEvent; import org.eclipse.ecf.core.identity.ID; import org.eclipse.ecf.core.identity.IDFactory; +import org.eclipse.ecf.core.util.ECFException; import org.eclipse.ecf.core.util.IQueueEnqueue; +import org.eclipse.ecf.presence.IAccountManager; import org.eclipse.ecf.presence.IMessageListener; import org.eclipse.ecf.presence.IMessageSender; import org.eclipse.ecf.presence.IPresence; import org.eclipse.ecf.presence.IPresenceContainer; import org.eclipse.ecf.presence.IPresenceListener; +import org.eclipse.ecf.presence.IPresenceSender; import org.eclipse.ecf.presence.ISharedObjectMessageListener; import org.eclipse.ecf.presence.ISubscribeListener; import org.eclipse.ecf.presence.IMessageListener.Type; @@ -329,6 +333,10 @@ public class XMPPClientSOContainer extends ClientSOContainer { } + }; + } + public IPresenceSender getPresenceSender() { + return new IPresenceSender() { public void sendPresenceUpdate(ID fromID, ID toID, IPresence presence) { try { Presence newPresence = makePresenceFromIPresence(presence); @@ -337,10 +345,42 @@ public class XMPPClientSOContainer extends ClientSOContainer { dumpStack("Exception in sendPresenceUpdate to "+toID+" with presence "+presence,e); } } - - }; - } + + }; + } + + public IAccountManager getAccountManager() { + return new IAccountManager() { + + public void changePassword(String newpassword) throws ECFException { + sharedObject.changePassword(newpassword); + } + + public void createAccount(String username, String password, Map attributes) throws ECFException { + sharedObject.createAccount(username,password,attributes); + } + public void deleteAccount() throws ECFException { + sharedObject.deleteAccount(); + } + + public String getAccountInstructions() { + return sharedObject.getAccountInstructions(); + } + + public String[] getAccountAttributeNames() { + return sharedObject.getAccountAttributeNames(); + } + + public Object getAccountAttribute(String name) { + return sharedObject.getAccountAttribute(name); + } + + public boolean supportsCreation() { + return sharedObject.supportsCreation(); + } + }; + } public ISharedObjectContainer makeSharedObjectContainer(Class[] types, Object[] args) throws SharedObjectContainerInstantiationException { return null; } 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 3334f76fa..8e41d9c27 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 @@ -8,7 +8,10 @@ ******************************************************************************/ package org.eclipse.ecf.provider.xmpp.container; +import java.util.ArrayList; import java.util.Iterator; +import java.util.List; +import java.util.Map; import java.util.Vector; import org.eclipse.ecf.core.ISharedObject; import org.eclipse.ecf.core.ISharedObjectConfig; @@ -21,7 +24,9 @@ import org.eclipse.ecf.core.events.ISharedObjectDeactivatedEvent; import org.eclipse.ecf.core.events.ISharedObjectMessageEvent; import org.eclipse.ecf.core.identity.ID; import org.eclipse.ecf.core.identity.IDFactory; +import org.eclipse.ecf.core.util.ECFException; import org.eclipse.ecf.core.util.Event; +import org.eclipse.ecf.presence.IAccountManager; import org.eclipse.ecf.presence.IMessageListener; import org.eclipse.ecf.presence.IPresence; import org.eclipse.ecf.presence.IPresenceListener; @@ -34,10 +39,12 @@ import org.eclipse.ecf.provider.xmpp.events.IQEvent; import org.eclipse.ecf.provider.xmpp.events.MessageEvent; import org.eclipse.ecf.provider.xmpp.events.PresenceEvent; import org.eclipse.ecf.provider.xmpp.identity.XMPPID; +import org.jivesoftware.smack.AccountManager; import org.jivesoftware.smack.Roster; import org.jivesoftware.smack.RosterEntry; import org.jivesoftware.smack.RosterGroup; import org.jivesoftware.smack.XMPPConnection; +import org.jivesoftware.smack.XMPPException; import org.jivesoftware.smack.packet.IQ; import org.jivesoftware.smack.packet.Message; import org.jivesoftware.smack.packet.Presence; @@ -49,11 +56,12 @@ import org.jivesoftware.smack.packet.Presence.Type; * @author slewis * */ -public class XMPPPresenceSharedObject implements ISharedObject { +public class XMPPPresenceSharedObject implements ISharedObject, IAccountManager { public static Trace trace = Trace.create("xmpppresencesharedobject"); ISharedObjectConfig config = null; XMPPConnection connection = null; + AccountManager accountManager = null; Vector messageListeners = new Vector(); Vector presenceListeners = new Vector(); Vector sharedObjectMessageListeners = new Vector(); @@ -113,6 +121,7 @@ public class XMPPPresenceSharedObject implements ISharedObject { */ public void dispose(ID containerID) { config = null; + accountManager = null; } protected void dumpStack(String msg, Throwable e) { @@ -517,6 +526,58 @@ public class XMPPPresenceSharedObject implements ISharedObject { protected void setConnection(XMPPConnection connection) { this.connection = connection; - } + if (connection != null) { + accountManager = new AccountManager(connection); + } + } + public void changePassword(String newpassword) throws ECFException { + if (accountManager == null) throw new ECFException("not connected"); + try { + accountManager.changePassword(newpassword); + } catch (XMPPException e) { + dumpStack("server exception changing password",e); + throw new ECFException("server exception changing password",e); + } + } + public void createAccount(String username, String password, Map attributes) throws ECFException { + if (accountManager == null) throw new ECFException("not connected"); + try { + accountManager.createAccount(username,password,attributes); + } catch (XMPPException e) { + dumpStack("server exception creating account for "+username,e); + throw new ECFException("server exception creating account for "+username,e); + } + } + public void deleteAccount() throws ECFException { + if (accountManager == null) throw new ECFException("not connected"); + try { + accountManager.deleteAccount(); + } catch (XMPPException e) { + dumpStack("server exception deleting account",e); + throw new ECFException("server exception deleting account",e); + } + } + public String getAccountInstructions() { + if (accountManager == null) return null; + return accountManager.getAccountInstructions(); + } + public String[] getAccountAttributeNames() { + if (accountManager == null) return null; + Iterator i = accountManager.getAccountAttributes(); + List l = new ArrayList(); + for(; i.hasNext(); ) { + l.add(i.next()); + } + return (String []) l.toArray(new String[] {}); + } + public Object getAccountAttribute(String name) { + if (accountManager == null) return null; + return accountManager.getAccountAttribute(name); + } + + public boolean supportsCreation() { + if (accountManager == null) return false; + return accountManager.supportsAccountCreation(); + } } |
