org.eclipse.ecf.sync.ui.resources.ResourcesShareHandler.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.ecf.sync.ui.resources.ResourcesShareHandler.java

Source

/*******************************************************************************
 * Copyright (c) 2009 Remy Chi Jian Suen 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:
 *    Remy Chi Jian Suen <remy.suen@gmail.com> - initial API and implementation
 ******************************************************************************/
package org.eclipse.ecf.sync.ui.resources;

import java.lang.reflect.InvocationTargetException;

import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.ecf.core.IContainer;
import org.eclipse.ecf.core.util.ECFException;
import org.eclipse.ecf.internal.sync.resources.core.ResourcesShare;
import org.eclipse.ecf.internal.sync.resources.core.SyncResourcesCore;
import org.eclipse.ecf.internal.sync.ui.resources.SyncResourcesUI;
import org.eclipse.ecf.presence.IPresenceContainerAdapter;
import org.eclipse.ecf.presence.roster.IRosterEntry;
import org.eclipse.ecf.presence.roster.IRosterManager;
import org.eclipse.ecf.presence.ui.menu.AbstractRosterMenuHandler;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.handlers.HandlerUtil;
import org.eclipse.ui.statushandlers.StatusManager;

class ResourcesShareHandler extends AbstractRosterMenuHandler {

    ResourcesShareHandler(IRosterEntry entry) {
        super(entry);
    }

    public Object execute(ExecutionEvent event) throws ExecutionException {
        ISelection selection = HandlerUtil.getCurrentSelectionChecked(event);
        if (!(selection instanceof IStructuredSelection)) {
            return null;
        }

        IStructuredSelection iss = (IStructuredSelection) selection;

        Object o = iss.getFirstElement();
        IResource resource = null;
        if (o instanceof IAdaptable) {
            resource = (IResource) ((IAdaptable) o).getAdapter(IResource.class);
        } else {
            return null;
        }

        IPresenceContainerAdapter ipca = getRosterEntry().getRoster().getPresenceContainerAdapter();
        IContainer container = (IContainer) ipca.getAdapter(IContainer.class);

        ResourcesShare sender = SyncResourcesCore.getResourcesShare(container.getID());
        IProject project = resource.getProject();
        String projectName = project.getName();

        if (!SyncResourcesCore.isSharing(projectName)) {
            run(HandlerUtil.getActiveShellChecked(event), sender, projectName);
        } else {
            sender.stopSharing(projectName);
        }

        return null;
    }

    private void run(Shell shell, final ResourcesShare share, final String projectName) {
        final boolean[] ret = { false };

        try {
            ProgressMonitorDialog dialog = new ProgressMonitorDialog(shell);
            dialog.open();
            dialog.run(true, true, new IRunnableWithProgress() {
                public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
                    try {
                        monitor.beginTask("Sharing " + projectName, IProgressMonitor.UNKNOWN);
                        monitor.subTask("Sending request...");
                        share.startShare(getRosterEntry().getRoster().getUser().getID(),
                                getRosterEntry().getUser().getID(), projectName);
                        monitor.subTask("Waiting for acknowledgement...");
                        while (true) {
                            if (monitor.isCanceled()) {
                                throw new InterruptedException();
                            }

                            Thread.sleep(50);
                            Boolean response = share.getResponse();
                            if (response != null) {
                                ret[0] = response.booleanValue();
                                return;
                            }
                        }
                    } catch (ECFException e) {
                        throw new InvocationTargetException(e);
                    } finally {
                        monitor.done();
                    }
                }
            });
        } catch (InvocationTargetException e) {
            IStatus status = new Status(IStatus.ERROR, SyncResourcesUI.PLUGIN_ID, "Could not send share request",
                    e.getCause());
            StatusManager.getManager().handle(status);
            SyncResourcesUI.log(status);
        } catch (InterruptedException e) {
            // operation canceled, stop sharing this project
            share.stopSharing(projectName);
            return;
        }

        if (ret[0]) {
            IRosterManager manager = getRosterEntry().getRoster().getPresenceContainerAdapter().getRosterManager();
            manager.addRosterListener(new RosterListener(share, projectName, getRosterEntry()));
        } else {
            MessageDialog.openInformation(shell, null, "Sharing request denied.");
        }
    }
}