/** * 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.server.nodejs.internal.ui; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; import java.util.List; import org.eclipse.swt.widgets.Display; import tern.ITernProject; import tern.eclipse.ide.core.IIDETernProject; import tern.eclipse.ide.ui.TernUIPlugin; import tern.eclipse.ide.ui.console.ITernConsole; import tern.eclipse.ide.ui.console.LineType; import tern.server.LoggingInterceptor; import tern.server.nodejs.process.INodejsProcessListener; import tern.server.nodejs.process.INodejsProcess; import tern.utils.IOUtils; public class TernNodejsInterceptor extends LoggingInterceptor implements INodejsProcessListener { private final IIDETernProject project; public TernNodejsInterceptor(IIDETernProject project) { this.project = project; } @Override protected void outPrintln(String line) { ITernConsole console = getConsole(); if (console != null) { console.doAppendLine(LineType.DATA, line); } } protected void outProcessPrintln(String line) { ITernConsole console = getConsole(); if (console != null) { console.doAppendLine(LineType.PROCESS_INFO, line); } } protected void errPrintln(String line) { ITernConsole console = getConsole(); if (console != null) { console.doAppendLine(LineType.PROCESS_ERROR, line); } } @Override protected void printStackTrace(Throwable error) { ITernConsole console = getConsole(); if (console != null) { StringWriter s = new StringWriter(); PrintWriter writer = new PrintWriter(s); error.printStackTrace(writer); console.doAppendLine(LineType.PROCESS_ERROR, s.toString()); } } @Override public void onCreate(final INodejsProcess process, final List<String> commands, final File projectDir) { if (Display.getDefault().getThread() != Thread.currentThread()) { Display.getDefault().asyncExec(new Runnable() { @Override public void run() { onCreate(process, commands, projectDir); } }); return; } ITernConsole console = getConsole(); if (console != null) { 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++; } outProcessPrintln("Nodejs Commnand: " + commandsAsString.toString()); String path = projectDir.getPath(); try { path = projectDir.getCanonicalPath(); } catch (IOException e) { } outProcessPrintln("Project dir: " + path); String json = ""; try { File ternProject = new File(projectDir, ITernProject.TERN_PROJECT_FILE); json = IOUtils.toString(new FileInputStream(ternProject)); } catch (Throwable e) { errPrintln(e.getMessage()); } outProcessPrintln(ITernProject.TERN_PROJECT_FILE + ": " + json); } } @Override public void onStart(INodejsProcess process) { outProcessPrintln("Server started at " + process.getPort() + " in " + process.getElapsedStartTime() + "ms"); } @Override public void onData(INodejsProcess process, String line) { outProcessPrintln(line); } @Override public void onStop(INodejsProcess process) { outProcessPrintln("Server stopped at " + process.getPort()); } @Override public void onError(INodejsProcess process, String line) { errPrintln(line); } private ITernConsole getConsole() { if (TernUIPlugin.getDefault() != null) { return TernUIPlugin.getDefault().getConsole(project); } return null; } }