/**
* Copyright (c) 2013-2016 Angelo ZERR and Genuitec LLC.
* 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
* Piotr Tomiak <piotr@genuitec.com> - support for tern.js debugging
*/
package tern.eclipse.ide.server.nodejs.internal.core;
import java.io.File;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import tern.ITernProject;
import tern.eclipse.ide.core.ITernServerFactory;
import tern.eclipse.ide.server.nodejs.core.debugger.INodejsDebugger;
import tern.eclipse.ide.server.nodejs.core.debugger.NodejsDebuggersManager;
import tern.server.ITernServer;
import tern.server.nodejs.NodejsTernServer;
/**
* Tern server factory implementation with node.js terns server.
*/
public class TernNodejsServerFactory implements ITernServerFactory {
@Override
public ITernServer create(ITernProject project) throws Exception {
NodejsTernServer server;
if (isRemoteAccess()) {
server = new NodejsTernServer(project, getRemotePort()) {
@Override
protected void onError(String message, Throwable e) {
Trace.trace(Trace.SEVERE, message, e);
}
};
} else {
INodejsDebugger debugger = NodejsDebuggersManager
.getDebugger(getDebugger());
File installPath = getInstallPath();
IFile ternServerFile = getTernServerDebugFile();
// debugger must be present
if (debugger != null && debugger.isInstalled()
// tern server file must exist
&& ternServerFile != null
&& ternServerFile.exists()
// do not run debug mode if project contains the tern server
&& !ternServerFile.getProject().equals(
project.getAdapter(IProject.class))) {
server = new NodejsTernServer(project, debugger.createProcess(
ternServerFile, project.getProjectDir(), installPath)){
@Override
protected void onError(String message, Throwable e) {
Trace.trace(Trace.SEVERE, message, e);
}
};
server.setDebugLaunch(true);
server.setSaveLaunch(false);
} else {
File ternBaseDir = project.getRepository().getTernBaseDir();
server = new NodejsTernServer(project, installPath, ternBaseDir) {
@Override
protected void onError(String message, Throwable e) {
Trace.trace(Trace.SEVERE, message, e);
}
};
}
}
server.setTimeout(getTimeout());
server.setTestNumber(getTestNumber());
server.setPersistent(isPersistent());
return server;
}
// -------------------- Properties for remote access
private boolean isRemoteAccess() {
return TernNodejsCorePreferencesSupport.getInstance()
.isNodejsRemoteAccess();
}
private int getRemotePort() {
return TernNodejsCorePreferencesSupport.getInstance()
.getNodejsRemotePort();
}
// -------------------- Properties for direct access
private File getInstallPath() {
return TernNodejsCorePreferencesSupport.getInstance().getInstallPath();
}
private long getTimeout() {
return TernNodejsCorePreferencesSupport.getInstance()
.getNodejsTimeout();
}
private int getTestNumber() {
return TernNodejsCorePreferencesSupport.getInstance()
.getNodejsTestNumber();
}
private boolean isPersistent() {
return TernNodejsCorePreferencesSupport.getInstance()
.isNodejsPersistent();
}
private String getDebugger() {
return TernNodejsCorePreferencesSupport.getInstance().getDebugger();
}
private IFile getTernServerDebugFile() {
return TernNodejsCorePreferencesSupport.getInstance()
.getTernServerDebugFile();
}
}