/**
* Copyright (c) 2013-2016 Angelo ZERR, IBM.
* 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
* Victor Sosa <sosah.victor@gmail.com> - Extension to allow locations computed programmatically
*/
package tern.eclipse.ide.server.nodejs.internal.core;
import java.io.File;
import java.io.IOException;
import org.eclipse.core.internal.runtime.InternalPlatform;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Platform;
import tern.eclipse.ide.server.nodejs.core.INodejsInstall;
import tern.eclipse.ide.server.nodejs.core.INodejsInstallProvider;
import tern.utils.ZipUtils;
@SuppressWarnings("restriction")
public class NodejsInstall implements INodejsInstall {
private String id;
private String name;
private File path;
/**
* GeneratorType constructor comment.
*
* @param element
* a configuration element
* @throws IOException
*/
public NodejsInstall(IConfigurationElement element) throws IOException {
createClass(element);
}
private void createClass(IConfigurationElement element) throws IOException {
this.id = element.getAttribute("id");
this.name = element.getAttribute("name");
String clazz = element.getAttribute("class");
if (clazz != null && !clazz.isEmpty()) {
try {
INodejsInstallProvider provider = (INodejsInstallProvider) element.createExecutableExtension("class");
this.path = provider.getPath();
} catch (CoreException e) {
Trace.trace(Trace.SEVERE, "Problems at creating install provider", e);
}
} else {
String pluginId = element.getNamespaceIdentifier();
String path = element.getAttribute("path");
if (path != null && path.length() > 0) {
File bundleDir = FileLocator.getBundleFile(Platform
.getBundle(pluginId));
IPath stateLocationPath = InternalPlatform.getDefault().getStateLocation(Platform
.getBundle(pluginId));
if (stateLocationPath != null) {
File baseDir = stateLocationPath.toFile();
this.path = new File(baseDir, path);
// check if path exists, if it doesn't look for zip
if (!this.path.exists()) {
String zip = element.getAttribute("zip");
File zipFile = new File(bundleDir, zip);
if (zipFile.exists()) {
if (zipFile.getName().toLowerCase().endsWith(".zip")) {
ZipUtils.extract(zipFile, baseDir);
}
if(this.path.exists()) {
this.path.setExecutable(true);
}
}
}
}
}
}
}
@Override
public String getId() {
return id;
}
@Override
public String getName() {
return name;
}
@Override
public File getPath() {
return path;
}
public void dispose() {
}
@Override
public boolean isNative() {
return NODE_NATIVE.equals(getId());
}
}