/** * Copyright (c) 2013-2016 Angelo ZERR. * 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: * Angelo Zerr <angelo.zerr@gmail.com> - initial API and implementation */ package tern.eclipse.ide.tools.internal.ui.wizards.repository; import java.io.File; import java.util.List; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import tern.eclipse.ide.server.nodejs.core.IDENodejsProcessHelper; import tern.eclipse.ide.tools.internal.ui.console.TernRepositoryConsoleHelper; import tern.eclipse.ide.tools.internal.ui.wizards.IOperation; import tern.eclipse.ide.ui.console.LineType; import tern.repository.ITernRepository; import tern.server.ITernModule; import tern.server.nodejs.npm.INPMProcessListener; import tern.server.nodejs.npm.NPMProcess; /** * Operation used to download tern modules selected from the wizard page * {@link InstallTernModulesSelectionWizardPage} * */ public class InstallTernModulesOperation implements IOperation<InstallTernModulesOptions>, INPMProcessListener { @Override public void init() { } @Override public void run(IProgressMonitor monitor, InstallTernModulesOptions options) throws CoreException { // repository where tern modules must be downloaded. ITernRepository repository = options.getRepository(); // tern modules to download ITernModule[] modules = options.getTernModules(); for (int i = 0; i < modules.length; i++) { download(modules[i], repository, options, monitor); } } /** * Download tern module in the given file system tern base dir. * * @param module * the tern module to download. * @param repository * the output file system tern base dir. * @param options * @param monitor */ private void download(ITernModule module, ITernRepository repository, InstallTernModulesOptions options, IProgressMonitor monitor) { try { // TODO : manage npm path with preferences. String npmPath = IDENodejsProcessHelper.getNPMPath(); NPMProcess process = new NPMProcess(npmPath, repository.getTernBaseDir()); process.addProcessListener(this); process.install(module); } catch (Throwable e) { e.printStackTrace(); } } @Override public int getTotal() { return 1; } @Override public void onCreate(NPMProcess process, List<String> commands, File projectDir) { StringBuilder commandsAsString = new StringBuilder(); int i = 0; for (String cmd : commands) { if (i > 0) { commandsAsString.append(" "); } if (i <= 1) { commandsAsString.append("\""); } commandsAsString.append(cmd); if (i <= 1) { commandsAsString.append("\""); } i++; } TernRepositoryConsoleHelper.doAppendLine(LineType.PROCESS_INFO, commandsAsString.toString()); } @Override public void onStart(NPMProcess process) { String line = "start npm process"; TernRepositoryConsoleHelper.doAppendLine(LineType.PROCESS_INFO, line); } @Override public void onData(NPMProcess process, String line) { TernRepositoryConsoleHelper.doAppendLine(LineType.DATA, line); } @Override public void onStop(NPMProcess process) { String line = "end npm process"; TernRepositoryConsoleHelper.doAppendLine(LineType.PROCESS_INFO, line); } @Override public void onError(NPMProcess process, String line) { TernRepositoryConsoleHelper.doAppendLine(LineType.PROCESS_ERROR, line); } }