/* * 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()); } }); } }