| /**************************************************************************** |
| * Copyright (c) 2004, 2008 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.internal.example.collab; |
| |
| import java.net.URI; |
| import java.net.URISyntaxException; |
| import java.util.*; |
| import org.eclipse.core.resources.*; |
| import org.eclipse.ecf.core.*; |
| 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.security.ConnectContextFactory; |
| import org.eclipse.ecf.core.sharedobject.ISharedObjectContainer; |
| import org.eclipse.ecf.example.collab.share.EclipseCollabSharedObject; |
| import org.eclipse.ecf.internal.example.collab.ui.SharedObjectContainerUI; |
| import org.eclipse.ecf.provider.generic.GenericContainerInstantiator; |
| |
| public class CollabClient { |
| public static final String WORKSPACE_NAME = Messages.CollabClient_WORKSPACE_NAME; |
| |
| public static final String GENERIC_CONTAINER_CLIENT_NAME = GenericContainerInstantiator.TCPCLIENT_NAME; |
| |
| static Hashtable clients = new Hashtable(); |
| |
| static CollabClient collabClient = new CollabClient(); |
| |
| /** |
| * Create a new container instance, and connect to a remote server or group. |
| * |
| * @param containerType |
| * the container type used to create the new container instance. |
| * Must not be null. |
| * @param uri |
| * the uri that is used to create a targetID for connection. Must |
| * not be null. |
| * @param nickname |
| * an optional String nickname. May be null. |
| * @param connectData |
| * optional connection data. May be null. |
| * @param resource |
| * the resource that this container instance is associated with. |
| * Must not be null. |
| * @throws Exception |
| */ |
| public void createAndConnectClient(final String containerType, String uri, String nickname, final Object connectData, final IResource resource) throws Exception { |
| // First create the new container instance |
| final IContainer newClient = ContainerFactory.getDefault().createContainer(containerType); |
| |
| // Create the targetID instance |
| ID targetID = IDFactory.getDefault().createID(newClient.getConnectNamespace(), uri); |
| |
| // Setup username |
| String username = setupUsername(targetID, nickname); |
| // Create a new container entry to hold onto container once created |
| final ClientEntry newClientEntry = new ClientEntry(containerType, newClient); |
| |
| // Setup sharedobject container if the new instance supports |
| // this |
| ISharedObjectContainer sharedObjectContainer = (ISharedObjectContainer) newClient.getAdapter(ISharedObjectContainer.class); |
| SharedObjectContainerUI socui = new SharedObjectContainerUI(this, sharedObjectContainer); |
| socui.setup(sharedObjectContainer, newClientEntry, resource, username); |
| // Now connect |
| try { |
| newClient.connect(targetID, ConnectContextFactory.createUsernamePasswordConnectContext(username, connectData)); |
| } catch (ContainerConnectException e) { |
| // If we have a connect exception then we remove any previously |
| // added shared object |
| EclipseCollabSharedObject so = newClientEntry.getSharedObject(); |
| if (so != null) |
| so.destroySelf(); |
| throw e; |
| } |
| |
| // only add container if the connect was successful |
| addClientForResource(newClientEntry, resource); |
| } |
| |
| public ClientEntry isConnected(IResource project, String type) { |
| ClientEntry entry = getClientEntry(project, type); |
| return entry; |
| } |
| |
| protected static void addClientForResource(ClientEntry entry, IResource proj) { |
| synchronized (clients) { |
| String name = getNameForResource(proj); |
| Vector v = (Vector) clients.get(name); |
| if (v == null) { |
| v = new Vector(); |
| } |
| v.add(entry); |
| clients.put(name, v); |
| } |
| } |
| |
| public static void removeClientForResource(IResource proj, ID targetID) { |
| synchronized (clients) { |
| String resourceName = getNameForResource(proj); |
| Vector v = (Vector) clients.get(resourceName); |
| if (v == null) |
| return; |
| ClientEntry remove = null; |
| for (Iterator i = v.iterator(); i.hasNext();) { |
| ClientEntry e = (ClientEntry) i.next(); |
| ID connectedID = e.getContainer().getConnectedID(); |
| if (connectedID == null || connectedID.equals(targetID)) { |
| remove = e; |
| } |
| } |
| if (remove != null) |
| v.remove(remove); |
| if (v.size() == 0) { |
| clients.remove(resourceName); |
| } |
| } |
| } |
| |
| public static String getNameForResource(IResource res) { |
| String preName = res.getName().trim(); |
| if (preName == null || preName.equals("")) { //$NON-NLS-1$ |
| preName = WORKSPACE_NAME; |
| } |
| return preName; |
| } |
| |
| public static IResource getWorkspace() throws Exception { |
| IWorkspaceRoot ws = ResourcesPlugin.getWorkspace().getRoot(); |
| return ws; |
| } |
| |
| protected static Vector getClientEntries(IResource proj) { |
| synchronized (clients) { |
| return (Vector) clients.get(getNameForResource(proj)); |
| } |
| } |
| |
| protected static ClientEntry getClientEntry(IResource proj, ID targetID) { |
| synchronized (clients) { |
| Vector v = getClientEntries(proj); |
| if (v == null) |
| return null; |
| for (Iterator i = v.iterator(); i.hasNext();) { |
| ClientEntry e = (ClientEntry) i.next(); |
| ID connectedID = e.getContainer().getConnectedID(); |
| if (connectedID == null) |
| continue; |
| else if (connectedID.equals(targetID)) { |
| return e; |
| } |
| } |
| } |
| return null; |
| } |
| |
| protected static ClientEntry getClientEntry(IResource proj, String containerType) { |
| synchronized (clients) { |
| Vector v = getClientEntries(proj); |
| if (v == null) |
| return null; |
| for (Iterator i = v.iterator(); i.hasNext();) { |
| ClientEntry e = (ClientEntry) i.next(); |
| ID connectedID = e.getContainer().getConnectedID(); |
| if (connectedID == null) |
| continue; |
| else { |
| String contType = e.getContainerType(); |
| if (contType.equals(containerType)) { |
| return e; |
| } |
| } |
| } |
| } |
| return null; |
| } |
| |
| protected static boolean containsEntry(IResource proj, ID targetID) { |
| synchronized (clients) { |
| Vector v = (Vector) clients.get(getNameForResource(proj)); |
| if (v == null) |
| return false; |
| for (Iterator i = v.iterator(); i.hasNext();) { |
| ClientEntry e = (ClientEntry) i.next(); |
| ID connectedID = e.getContainer().getConnectedID(); |
| if (connectedID == null) |
| continue; |
| else if (connectedID.equals(targetID)) { |
| return true; |
| } |
| } |
| } |
| return false; |
| } |
| |
| public synchronized static ISharedObjectContainer getContainer(IResource proj) { |
| ClientEntry entry = getClientEntry(proj, GENERIC_CONTAINER_CLIENT_NAME); |
| if (entry == null) { |
| entry = getClientEntry(ResourcesPlugin.getWorkspace().getRoot(), GENERIC_CONTAINER_CLIENT_NAME); |
| } |
| if (entry != null) { |
| IContainer cont = entry.getContainer(); |
| if (cont != null) |
| return (ISharedObjectContainer) cont.getAdapter(ISharedObjectContainer.class); |
| else |
| return null; |
| } else |
| return null; |
| } |
| |
| public static CollabClient getDefault() { |
| return collabClient; |
| } |
| |
| public synchronized void disposeClient(IResource proj, ClientEntry entry) { |
| entry.dispose(); |
| removeClientForResource(proj, entry.getContainer().getConnectedID()); |
| } |
| |
| protected String setupUsername(ID targetID, String nickname) throws URISyntaxException { |
| String username = null; |
| if (nickname != null) { |
| username = nickname; |
| } else { |
| username = new URI(targetID.getName()).getUserInfo(); |
| if (username == null || username.equals("")) //$NON-NLS-1$ |
| username = System.getProperty("user.name"); //$NON-NLS-1$ |
| } |
| return username; |
| } |
| |
| } |