com.google.dart.tools.ui.internal.pub.AddPackageAction.java Source code

Java tutorial

Introduction

Here is the source code for com.google.dart.tools.ui.internal.pub.AddPackageAction.java

Source

/*
 * Copyright (c) 2013, the Dart project authors.
 * 
 * Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except
 * in compliance with the License. You may obtain a copy of the License at
 * 
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Unless required by applicable law or agreed to in writing, software distributed under the License
 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
 * or implied. See the License for the specific language governing permissions and limitations under
 * the License.
 */
package com.google.dart.tools.ui.internal.pub;

import com.google.dart.tools.core.DartCore;
import com.google.dart.tools.core.pub.PubCacheManager_OLD;
import com.google.dart.tools.ui.actions.InstrumentedSelectionDispatchAction;
import com.google.dart.tools.ui.instrumentation.UIInstrumentationBuilder;
import com.google.dart.tools.ui.internal.projects.NewApplicationCreationPage.ProjectType;
import com.google.dart.tools.ui.internal.projects.ProjectUtils;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.ui.IWorkbenchPartSite;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.progress.IProgressService;

import java.io.File;
import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;

/**
 * Installs the package from pub.dartlang to pub cache and opens the package as a new folder
 */
public class AddPackageAction extends InstrumentedSelectionDispatchAction {

    private static String PUBSPEC = "name: sample\n" + "dependencies:\n  ";

    private String packageName;
    private String version;
    private IWorkbenchWindow window;

    public AddPackageAction(IWorkbenchPartSite site, String packageName, String version) {
        super(site);
        this.packageName = packageName;
        this.version = version;
        window = site.getWorkbenchWindow();
    }

    @Override
    protected void doRun(Event event, UIInstrumentationBuilder instrumentation) {

        // create project
        String dirName = packageName + "-" + version;
        File potentialDir = new File(DartCore.getUserDefaultDartFolder(), dirName);
        final File newProjectDir = ProjectUtils.generateUniqueSampleDirFrom(dirName + "_copy", potentialDir);

        Control focusControl = Display.getCurrent().getFocusControl();
        try {
            IProgressService progressService = PlatformUI.getWorkbench().getProgressService();
            progressService.busyCursorWhile(new IRunnableWithProgress() {

                @Override
                public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
                    installAndCopyPackage(newProjectDir, monitor);
                }
            });

        } catch (Throwable ie) {

        } finally {
            if (focusControl != null) {
                focusControl.setFocus();
            }
        }

    }

    private void installAndCopyPackage(final File newProjectDir, IProgressMonitor monitor) {

        if (!isPackageInstalled()) {
            // run pub install
            String pubspec = PUBSPEC + packageName + ": " + version.trim();
            if (PubPackageUtils.createPubspec(newProjectDir, pubspec, monitor)) {
                if (PubPackageUtils.runPubInstall(newProjectDir, monitor)) {
                    // copy contents
                    String location = PubPackageUtils.getPackageCacheDir(monitor, packageName, version);
                    if (location != null && !location.isEmpty()) {
                        PubPackageUtils.copyPackageContents(newProjectDir, location, monitor);
                        openProject(newProjectDir);
                    }
                } else {

                }
            }
        } else {
            String location = PubCacheManager_OLD.getInstance().getCacheLocation(packageName, version);
            if (location != null) {
                PubPackageUtils.copyPackageContents(newProjectDir, location, monitor);
                openProject(newProjectDir);
            }
        }
    }

    @SuppressWarnings("unchecked")
    private boolean isPackageInstalled() {
        HashMap<String, Object> allPackages = PubCacheManager_OLD.getInstance().getAllCachePackages();
        HashMap<String, Object> map = (HashMap<String, Object>) allPackages.get(packageName);
        if (map != null && map.keySet().contains(version)) {
            return true;
        }
        return false;
    }

    private void openProject(final File newProjectDir) {
        final String newProjectName = newProjectDir.getName();
        final IProject newProjectHandle = ResourcesPlugin.getWorkspace().getRoot().getProject(newProjectName);

        Display.getDefault().asyncExec(new Runnable() {

            @Override
            public void run() {
                ProjectUtils.createNewProject(newProjectName, newProjectHandle, ProjectType.NONE,
                        newProjectDir.toURI(), window, window.getShell());

            }
        });
    }

}