de.loskutov.fs.actions.ForceFileSyncActionDelegate.java Source code

Java tutorial

Introduction

Here is the source code for de.loskutov.fs.actions.ForceFileSyncActionDelegate.java

Source

/*******************************************************************************
 * Copyright (c) 2009 Andrey Loskutov.
 * 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
 * Contributor:  Andrey Loskutov - initial API and implementation
 *******************************************************************************/
package de.loskutov.fs.actions;

import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.commands.IHandler;
import org.eclipse.core.commands.IHandlerListener;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectNature;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IncrementalProjectBuilder;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.widgets.Event;
import org.eclipse.ui.actions.ActionDelegate;
import org.eclipse.ui.handlers.HandlerUtil;

import de.loskutov.fs.FileSyncPlugin;
import de.loskutov.fs.builder.FileSyncBuilder;
import de.loskutov.fs.preferences.FileSyncConstants;
import de.loskutov.fs.properties.ProjectHelper;

/**
 * @author Andrey
 */
public class ForceFileSyncActionDelegate extends ActionDelegate implements IHandler {

    private IProject project;

    public ForceFileSyncActionDelegate() {
        super();
    }

    @Override
    public void dispose() {
        project = null;
        super.dispose();
    }

    @Override
    public void run(IAction action) {
        FileSyncBuilder builder = getOrCreateBuilder();
        if (builder != null) {
            sync(builder);
        }
    }

    /**
     * Public method to be able to test it
     */
    public FileSyncBuilder getOrCreateBuilder() {
        if (project == null) {
            FileSyncPlugin.error("Could not run FileSync builder - project is null!", null);
            return null;
        }
        IPreferenceStore store = FileSyncPlugin.getDefault().getPreferenceStore();
        boolean askUser = store.getBoolean(FileSyncConstants.KEY_ASK_USER);
        if (ProjectHelper.isBuilderDisabled(project)) {
            if (askUser) {
                MessageDialog.openInformation(FileSyncPlugin.getShell(), "FileSync builder is disabled!",
                        "Please activate FileSync builder for project '" + project.getName() + "' under\n"
                                + "Project->Properties->Builders!");
            }
            return null;
        }

        if (!ProjectHelper.hasBuilder(project)) {
            boolean ok = true; // TODO should be taken from prefs
            if (askUser) {
                ok = MessageDialog.openQuestion(FileSyncPlugin.getShell(), "FileSync builder is not enabled!",
                        "Should FileSync builder be enabled for project '" + project.getName() + "' ?");
            }
            if (ok) {
                ProjectHelper.addBuilder(project);
            }
        }

        return new FileSyncBuilder(project);
    }

    private void sync(FileSyncBuilder builder) {
        final FileSyncBuilder finalBuilder = builder;

        final Job myJob = new Job("Full project sync") {
            @Override
            public IStatus run(IProgressMonitor monitor) {
                finalBuilder.build(IncrementalProjectBuilder.FULL_BUILD, monitor);
                return Status.OK_STATUS;//new JobStatus(IStatus.INFO, 0, this, "", null);
            }
        };
        myJob.schedule();
    }

    //    private FileSyncBuilder getBuilder() {
    //        //        BuildManager manager = ((Workspace) ResourcesPlugin.getWorkspace()).getBuildManager();
    //        ICommand[] commands = null;
    //
    //        // TODO does not work as expected...
    //
    //        //        try {
    //        //            commands = project.getDescription().getBuildSpec();
    //        //        } catch (CoreException e) {
    //        //            FileSyncPlugin.error("Could not get builder info from project " + project.getName(), e);
    //        //            return null;
    //        //        }
    //        // the hack for problem above
    //        commands = ((Project) project).internalGetDescription().getBuildSpec(false);
    //
    //        for (int i = 0; i < commands.length; i++) {
    //            String builderName = commands[i].getBuilderName();
    //            if (FileSyncBuilder.BUILDER_ID.equals(builderName)) {
    //                return (FileSyncBuilder) ((BuildCommand) commands[i]).getBuilder();
    //            }
    //        }
    //        return null;
    //        //        ProjectInfo info = (ProjectInfo) ((Workspace) ResourcesPlugin
    //        //                .getWorkspace()).getResourceInfo(project.getFullPath(), false,
    //        //                false);
    //        //        Hashtable builders = info.getBuilders();
    //        //        final FileSyncBuilder builder = (FileSyncBuilder) builders
    //        //                .get(FileSyncBuilder.BUILDER_ID);
    //        //        return builder;
    //    }

    @Override
    public void runWithEvent(IAction action, Event event) {
        run(action);
    }

    @Override
    public void selectionChanged(IAction action, ISelection selection) {
        if (!(selection instanceof IStructuredSelection)) {
            project = null;
            return;
        }
        IStructuredSelection ssel = (IStructuredSelection) selection;
        Object firstElement = ssel.getFirstElement();
        if (firstElement == null) {
            project = null;
            return;
        }
        project = getProject(firstElement);
        if (project != null) {
            return;
        }
        if (firstElement instanceof IResource) {
            project = ((IResource) firstElement).getProject();
        }
        if (project != null) {
            return;
        }
        if (firstElement instanceof IProjectNature) {
            project = ((IProjectNature) firstElement).getProject();
        }
    }

    public static IProject getProject(Object o) {
        if (o instanceof IAdaptable) {
            IAdaptable adaptable = (IAdaptable) o;
            IResource adapter = (IProject) adaptable.getAdapter(IProject.class);
            if (adapter != null) {
                return adapter.getProject();
            }
            adapter = (IResource) adaptable.getAdapter(IResource.class);
            if (adapter != null) {
                return adapter.getProject();
            }
            adapter = (IResource) adaptable.getAdapter(IFile.class);
            if (adapter != null) {
                return adapter.getProject();
            }
        }
        Object adapter = Platform.getAdapterManager().getAdapter(o, IResource.class);
        return adapter != null ? ((IResource) adapter).getProject() : null;
    }

    @Override
    public void addHandlerListener(IHandlerListener handlerListener) {
        // noop
    }

    @Override
    public Object execute(ExecutionEvent event) throws ExecutionException {
        ISelection selection = HandlerUtil.getCurrentSelection(event);
        selectionChanged(null, selection);
        run(null);
        return null;
    }

    @Override
    public boolean isEnabled() {
        return true;
    }

    @Override
    public boolean isHandled() {
        return true;
    }

    @Override
    public void removeHandlerListener(IHandlerListener handlerListener) {
        // noop
    }

}