diff --git a/org.eclipse.wildwebdeveloper.embedder.node.feature/.gitignore b/org.eclipse.wildwebdeveloper.embedder.node.feature/.gitignore new file mode 100644 index 0000000000..809cc8f282 --- /dev/null +++ b/org.eclipse.wildwebdeveloper.embedder.node.feature/.gitignore @@ -0,0 +1,2 @@ +target/ +bin/ diff --git a/org.eclipse.wildwebdeveloper.embedder.node.feature/.project b/org.eclipse.wildwebdeveloper.embedder.node.feature/.project new file mode 100644 index 0000000000..c4ff525f82 --- /dev/null +++ b/org.eclipse.wildwebdeveloper.embedder.node.feature/.project @@ -0,0 +1,23 @@ + + + org.eclipse.wildwebdeveloper.embedder.node.feature + + + + + + org.eclipse.pde.FeatureBuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.m2e.core.maven2Nature + org.eclipse.pde.FeatureNature + + diff --git a/org.eclipse.wildwebdeveloper.embedder.node.feature/build.properties b/org.eclipse.wildwebdeveloper.embedder.node.feature/build.properties new file mode 100644 index 0000000000..b3a611b5c9 --- /dev/null +++ b/org.eclipse.wildwebdeveloper.embedder.node.feature/build.properties @@ -0,0 +1,2 @@ +bin.includes = feature.xml,\ + feature.properties diff --git a/org.eclipse.wildwebdeveloper.embedder.node.feature/feature.properties b/org.eclipse.wildwebdeveloper.embedder.node.feature/feature.properties new file mode 100644 index 0000000000..50046f3c9a --- /dev/null +++ b/org.eclipse.wildwebdeveloper.embedder.node.feature/feature.properties @@ -0,0 +1,4 @@ +name=Node.js embedder from Wild Web Developer +description=Includes node.js and some code to manage and consume it from other bundles +copyright=Copyright (c) 2020 Red Hat Inc. and others.\ + This program and the accompanying materials are made available under the terms of the Eclipse Public License 2.0 which is available at https://www.eclipse.org/legal/epl-2.0/ diff --git a/org.eclipse.wildwebdeveloper.embedder.node.feature/feature.xml b/org.eclipse.wildwebdeveloper.embedder.node.feature/feature.xml new file mode 100644 index 0000000000..5774dae89d --- /dev/null +++ b/org.eclipse.wildwebdeveloper.embedder.node.feature/feature.xml @@ -0,0 +1,58 @@ + + + + + %description + + + + %copyright + + + + %license + + + + + + + + + + + diff --git a/org.eclipse.wildwebdeveloper.embedder.node.feature/pom.xml b/org.eclipse.wildwebdeveloper.embedder.node.feature/pom.xml new file mode 100644 index 0000000000..d9b447ea07 --- /dev/null +++ b/org.eclipse.wildwebdeveloper.embedder.node.feature/pom.xml @@ -0,0 +1,49 @@ + + 4.0.0 + org.eclipse.wildwebdeveloper.embedder.node.feature + + org.eclipse.wildwebdeveloper + parent + 0.5.0-SNAPSHOT + + eclipse-feature + 0.1.0-SNAPSHOT + + + + org.eclipse.tycho.extras + tycho-source-feature-plugin + ${tycho-version} + + + source-feature + package + + source-feature + + + + + + + + + + + + + org.eclipse.tycho + tycho-p2-plugin + + + attach-p2-metadata + package + + p2-metadata + + + + + + + diff --git a/org.eclipse.wildwebdeveloper.embedder.node.linux.x86_64/.gitignore b/org.eclipse.wildwebdeveloper.embedder.node.linux.x86_64/.gitignore new file mode 100644 index 0000000000..d4e86fbce1 --- /dev/null +++ b/org.eclipse.wildwebdeveloper.embedder.node.linux.x86_64/.gitignore @@ -0,0 +1,2 @@ +target/ +resources/*.tar.* diff --git a/org.eclipse.wildwebdeveloper.embedder.node.linux.x86_64/.project b/org.eclipse.wildwebdeveloper.embedder.node.linux.x86_64/.project new file mode 100644 index 0000000000..d106f53b85 --- /dev/null +++ b/org.eclipse.wildwebdeveloper.embedder.node.linux.x86_64/.project @@ -0,0 +1,22 @@ + + + org.eclipse.wildwebdeveloper.embedder.node.linux.x86_64 + + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + + diff --git a/org.eclipse.wildwebdeveloper.embedder.node.linux.x86_64/META-INF/MANIFEST.MF b/org.eclipse.wildwebdeveloper.embedder.node.linux.x86_64/META-INF/MANIFEST.MF new file mode 100644 index 0000000000..2849be7389 --- /dev/null +++ b/org.eclipse.wildwebdeveloper.embedder.node.linux.x86_64/META-INF/MANIFEST.MF @@ -0,0 +1,10 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: Node.js for Linux x64 +Bundle-SymbolicName: org.eclipse.wildwebdeveloper.embedder.node.linux.x86_64 +Bundle-Version: 0.1.0.qualifier +Bundle-Vendor: Eclipse Wild Web Developer +Fragment-Host: org.eclipse.wildwebdeveloper.embedder.node;bundle-version="0.1.0" +Automatic-Module-Name: org.eclipse.wildwebdeveloper.embedder.node.linux +Eclipse-PlatformFilter: (& (osgi.ws=gtk) (osgi.os=linux) (osgi.arch=x86_64)) +Bundle-RequiredExecutionEnvironment: JavaSE-1.8 diff --git a/org.eclipse.wildwebdeveloper.embedder.node.linux.x86_64/build.properties b/org.eclipse.wildwebdeveloper.embedder.node.linux.x86_64/build.properties new file mode 100644 index 0000000000..186c7dccfd --- /dev/null +++ b/org.eclipse.wildwebdeveloper.embedder.node.linux.x86_64/build.properties @@ -0,0 +1,4 @@ +bin.includes = META-INF/,\ + .,\ + resources/,\ + nodejs-info.properties \ No newline at end of file diff --git a/org.eclipse.wildwebdeveloper.embedder.node.linux.x86_64/nodejs-info.properties b/org.eclipse.wildwebdeveloper.embedder.node.linux.x86_64/nodejs-info.properties new file mode 100644 index 0000000000..7a09c146cf --- /dev/null +++ b/org.eclipse.wildwebdeveloper.embedder.node.linux.x86_64/nodejs-info.properties @@ -0,0 +1,3 @@ +archiveURL=https://nodejs.org/download/release/v12.16.1/node-v12.16.1-linux-x64.tar.gz +archiveFile=resources/node-v12.16.1-linux-x64.tar.gz +nodePath=node-v12.16.1-linux-x64/bin/node diff --git a/org.eclipse.wildwebdeveloper.embedder.node.linux.x86_64/pom.xml b/org.eclipse.wildwebdeveloper.embedder.node.linux.x86_64/pom.xml new file mode 100644 index 0000000000..720b9f7662 --- /dev/null +++ b/org.eclipse.wildwebdeveloper.embedder.node.linux.x86_64/pom.xml @@ -0,0 +1,76 @@ + + 4.0.0 + org.eclipse.wildwebdeveloper.embedder.node.linux.x86_64 + + org.eclipse.wildwebdeveloper + parent + 0.5.0-SNAPSHOT + + eclipse-plugin + 0.1.0-SNAPSHOT + + + + + org.codehaus.mojo + properties-maven-plugin + 1.0.0 + + + initialize + + read-project-properties + + + + ${project.basedir}/nodejs-info.properties + + + + + + + com.googlecode.maven-download-plugin + download-maven-plugin + 1.3.0 + + + fetch-node.js + generate-resources + + wget + + + ${archiveURL} + false + ${project.basedir}/resources + + + + + + org.eclipse.tycho + tycho-packaging-plugin + + + resources/*.tar.xz + + + + + org.eclipse.tycho + target-platform-configuration + true + + + + linux + gtk + x86_64 + + + + + + + diff --git a/org.eclipse.wildwebdeveloper.embedder.node.macos.x86_64/.gitignore b/org.eclipse.wildwebdeveloper.embedder.node.macos.x86_64/.gitignore new file mode 100644 index 0000000000..d4e86fbce1 --- /dev/null +++ b/org.eclipse.wildwebdeveloper.embedder.node.macos.x86_64/.gitignore @@ -0,0 +1,2 @@ +target/ +resources/*.tar.* diff --git a/org.eclipse.wildwebdeveloper.embedder.node.macos.x86_64/.project b/org.eclipse.wildwebdeveloper.embedder.node.macos.x86_64/.project new file mode 100644 index 0000000000..df9b82f778 --- /dev/null +++ b/org.eclipse.wildwebdeveloper.embedder.node.macos.x86_64/.project @@ -0,0 +1,22 @@ + + + org.eclipse.wildwebdeveloper.embedder.node.macos.x86_64 + + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + + diff --git a/org.eclipse.wildwebdeveloper.embedder.node.macos.x86_64/META-INF/MANIFEST.MF b/org.eclipse.wildwebdeveloper.embedder.node.macos.x86_64/META-INF/MANIFEST.MF new file mode 100644 index 0000000000..9dd92c75d6 --- /dev/null +++ b/org.eclipse.wildwebdeveloper.embedder.node.macos.x86_64/META-INF/MANIFEST.MF @@ -0,0 +1,10 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: Node.js for MacOS x64 +Bundle-SymbolicName: org.eclipse.wildwebdeveloper.embedder.node.macos.x86_64 +Bundle-Version: 0.1.0.qualifier +Bundle-Vendor: Eclipse Wild Web Developer +Fragment-Host: org.eclipse.wildwebdeveloper.embedder.node;bundle-version="0.1.0" +Automatic-Module-Name: org.eclipse.wildwebdeveloper.embedder.node.macos +Eclipse-PlatformFilter: (& (osgi.ws=cocoa) (osgi.os=macosx) (|(osgi.arch=x86_64)(osgi.arch=ppc))) +Bundle-RequiredExecutionEnvironment: JavaSE-1.8 diff --git a/org.eclipse.wildwebdeveloper.embedder.node.macos.x86_64/build.properties b/org.eclipse.wildwebdeveloper.embedder.node.macos.x86_64/build.properties new file mode 100644 index 0000000000..186c7dccfd --- /dev/null +++ b/org.eclipse.wildwebdeveloper.embedder.node.macos.x86_64/build.properties @@ -0,0 +1,4 @@ +bin.includes = META-INF/,\ + .,\ + resources/,\ + nodejs-info.properties \ No newline at end of file diff --git a/org.eclipse.wildwebdeveloper.embedder.node.macos.x86_64/nodejs-info.properties b/org.eclipse.wildwebdeveloper.embedder.node.macos.x86_64/nodejs-info.properties new file mode 100644 index 0000000000..99737614c0 --- /dev/null +++ b/org.eclipse.wildwebdeveloper.embedder.node.macos.x86_64/nodejs-info.properties @@ -0,0 +1,3 @@ +archiveURL=https://nodejs.org/download/release/v12.16.1/node-v12.16.1-darwin-x64.tar.gz +archiveFile=resources/node-v12.16.1-darwin-x64.tar.gz +nodePath=node-v12.16.1-darwin-x64/bin/node diff --git a/org.eclipse.wildwebdeveloper.embedder.node.macos.x86_64/pom.xml b/org.eclipse.wildwebdeveloper.embedder.node.macos.x86_64/pom.xml new file mode 100644 index 0000000000..b9db9eb289 --- /dev/null +++ b/org.eclipse.wildwebdeveloper.embedder.node.macos.x86_64/pom.xml @@ -0,0 +1,76 @@ + + 4.0.0 + org.eclipse.wildwebdeveloper.embedder.node.macos.x86_64 + + org.eclipse.wildwebdeveloper + parent + 0.5.0-SNAPSHOT + + eclipse-plugin + 0.1.0-SNAPSHOT + + + + + org.codehaus.mojo + properties-maven-plugin + 1.0.0 + + + initialize + + read-project-properties + + + + ${project.basedir}/nodejs-info.properties + + + + + + + com.googlecode.maven-download-plugin + download-maven-plugin + 1.3.0 + + + fetch-node.js + generate-resources + + wget + + + ${archiveURL} + false + ${project.basedir}/resources + + + + + + org.eclipse.tycho + tycho-packaging-plugin + + + resources/*.tar.xz + + + + + org.eclipse.tycho + target-platform-configuration + true + + + + macosx + cocoa + x86_64 + + + + + + + diff --git a/org.eclipse.wildwebdeveloper.embedder.node.win32.x86_64/.gitignore b/org.eclipse.wildwebdeveloper.embedder.node.win32.x86_64/.gitignore new file mode 100644 index 0000000000..f6787d06b7 --- /dev/null +++ b/org.eclipse.wildwebdeveloper.embedder.node.win32.x86_64/.gitignore @@ -0,0 +1,2 @@ +target/ +resources/*.zip diff --git a/org.eclipse.wildwebdeveloper.embedder.node.win32.x86_64/.project b/org.eclipse.wildwebdeveloper.embedder.node.win32.x86_64/.project new file mode 100644 index 0000000000..44fb6d853e --- /dev/null +++ b/org.eclipse.wildwebdeveloper.embedder.node.win32.x86_64/.project @@ -0,0 +1,22 @@ + + + org.eclipse.wildwebdeveloper.embedder.node.win32.x86_64 + + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + + diff --git a/org.eclipse.wildwebdeveloper.embedder.node.win32.x86_64/META-INF/MANIFEST.MF b/org.eclipse.wildwebdeveloper.embedder.node.win32.x86_64/META-INF/MANIFEST.MF new file mode 100644 index 0000000000..c1d6fe5c01 --- /dev/null +++ b/org.eclipse.wildwebdeveloper.embedder.node.win32.x86_64/META-INF/MANIFEST.MF @@ -0,0 +1,10 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: Node.js for Windows x86_64 +Bundle-SymbolicName: org.eclipse.wildwebdeveloper.embedder.node.win32.x86_64 +Bundle-Version: 0.1.0.qualifier +Bundle-Vendor: Eclipse Wild Web Developer +Fragment-Host: org.eclipse.wildwebdeveloper.embedder.node;bundle-version="0.1.0" +Automatic-Module-Name: org.eclipse.wildwebdeveloper.embedder.node.win32.x86_64 +Eclipse-PlatformFilter: (& (osgi.os=win32) (osgi.ws=win32) (osgi.arch=x86_64)) +Bundle-RequiredExecutionEnvironment: JavaSE-1.8 diff --git a/org.eclipse.wildwebdeveloper.embedder.node.win32.x86_64/build.properties b/org.eclipse.wildwebdeveloper.embedder.node.win32.x86_64/build.properties new file mode 100644 index 0000000000..186c7dccfd --- /dev/null +++ b/org.eclipse.wildwebdeveloper.embedder.node.win32.x86_64/build.properties @@ -0,0 +1,4 @@ +bin.includes = META-INF/,\ + .,\ + resources/,\ + nodejs-info.properties \ No newline at end of file diff --git a/org.eclipse.wildwebdeveloper.embedder.node.win32.x86_64/nodejs-info.properties b/org.eclipse.wildwebdeveloper.embedder.node.win32.x86_64/nodejs-info.properties new file mode 100644 index 0000000000..24acd8804d --- /dev/null +++ b/org.eclipse.wildwebdeveloper.embedder.node.win32.x86_64/nodejs-info.properties @@ -0,0 +1,3 @@ +archiveURL=https://nodejs.org/download/release/v12.16.1/node-v12.16.1-win-x64.zip +archiveFile = resources/node-v12.16.1-win-x64.zip +nodePath = node-v12.16.1-win-x64/node.exe diff --git a/org.eclipse.wildwebdeveloper.embedder.node.win32.x86_64/pom.xml b/org.eclipse.wildwebdeveloper.embedder.node.win32.x86_64/pom.xml new file mode 100644 index 0000000000..67c70ec5b5 --- /dev/null +++ b/org.eclipse.wildwebdeveloper.embedder.node.win32.x86_64/pom.xml @@ -0,0 +1,76 @@ + + 4.0.0 + org.eclipse.wildwebdeveloper.embedder.node.win32.x86_64 + + org.eclipse.wildwebdeveloper + parent + 0.5.0-SNAPSHOT + + eclipse-plugin + 0.1.0-SNAPSHOT + + + + + org.codehaus.mojo + properties-maven-plugin + 1.0.0 + + + initialize + + read-project-properties + + + + ${project.basedir}/nodejs-info.properties + + + + + + + com.googlecode.maven-download-plugin + download-maven-plugin + 1.3.0 + + + fetch-node.js + generate-resources + + wget + + + ${archiveURL} + false + ${project.basedir}/resources + + + + + + org.eclipse.tycho + tycho-packaging-plugin + + + resources/*.zip + + + + + org.eclipse.tycho + target-platform-configuration + true + + + + win32 + win32 + x86_64 + + + + + + + diff --git a/org.eclipse.wildwebdeveloper.embedder.node/.classpath b/org.eclipse.wildwebdeveloper.embedder.node/.classpath new file mode 100644 index 0000000000..eca7bdba8f --- /dev/null +++ b/org.eclipse.wildwebdeveloper.embedder.node/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/org.eclipse.wildwebdeveloper.embedder.node/.gitignore b/org.eclipse.wildwebdeveloper.embedder.node/.gitignore new file mode 100644 index 0000000000..9cd502b1e2 --- /dev/null +++ b/org.eclipse.wildwebdeveloper.embedder.node/.gitignore @@ -0,0 +1,3 @@ +target/ +bin/ +.settings/ diff --git a/org.eclipse.wildwebdeveloper.embedder.node/.project b/org.eclipse.wildwebdeveloper.embedder.node/.project new file mode 100644 index 0000000000..f1e67fae10 --- /dev/null +++ b/org.eclipse.wildwebdeveloper.embedder.node/.project @@ -0,0 +1,28 @@ + + + org.eclipse.wildwebdeveloper.embedder.node + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + diff --git a/org.eclipse.wildwebdeveloper.embedder.node/META-INF/MANIFEST.MF b/org.eclipse.wildwebdeveloper.embedder.node/META-INF/MANIFEST.MF new file mode 100644 index 0000000000..53dd015045 --- /dev/null +++ b/org.eclipse.wildwebdeveloper.embedder.node/META-INF/MANIFEST.MF @@ -0,0 +1,17 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: Manager for embedded Node.js +Bundle-SymbolicName: org.eclipse.wildwebdeveloper.embedder.node +Bundle-Version: 0.1.0.qualifier +Bundle-Vendor: Eclipse Wild Web Developer +Automatic-Module-Name: org.eclipse.wildwebdeveloper.embedder.node +Bundle-RequiredExecutionEnvironment: JavaSE-1.8 +Require-Bundle: org.eclipse.ui, + org.eclipse.ui.workbench, + org.eclipse.swt, + org.eclipse.core.runtime;bundle-version="3.18.0", + org.eclipse.jface;bundle-version="3.20.0", + org.apache.commons.compress;bundle-version="1.19.0" +Bundle-ActivationPolicy: lazy +Bundle-Activator: org.eclipse.wildwebdeveloper.embedder.node.Activator +Export-Package: org.eclipse.wildwebdeveloper.embedder.node diff --git a/org.eclipse.wildwebdeveloper.embedder.node/build.properties b/org.eclipse.wildwebdeveloper.embedder.node/build.properties new file mode 100644 index 0000000000..34d2e4d2da --- /dev/null +++ b/org.eclipse.wildwebdeveloper.embedder.node/build.properties @@ -0,0 +1,4 @@ +source.. = src/ +output.. = bin/ +bin.includes = META-INF/,\ + . diff --git a/org.eclipse.wildwebdeveloper.embedder.node/pom.xml b/org.eclipse.wildwebdeveloper.embedder.node/pom.xml new file mode 100644 index 0000000000..e9cfbc566d --- /dev/null +++ b/org.eclipse.wildwebdeveloper.embedder.node/pom.xml @@ -0,0 +1,11 @@ + + 4.0.0 + org.eclipse.wildwebdeveloper.embedder.node + + org.eclipse.wildwebdeveloper + parent + 0.5.0-SNAPSHOT + + eclipse-plugin + 0.1.0-SNAPSHOT + diff --git a/org.eclipse.wildwebdeveloper.embedder.node/src/org/eclipse/wildwebdeveloper/embedder/node/Activator.java b/org.eclipse.wildwebdeveloper.embedder.node/src/org/eclipse/wildwebdeveloper/embedder/node/Activator.java new file mode 100644 index 0000000000..39f2855514 --- /dev/null +++ b/org.eclipse.wildwebdeveloper.embedder.node/src/org/eclipse/wildwebdeveloper/embedder/node/Activator.java @@ -0,0 +1,53 @@ +/******************************************************************************* + * Copyright (c) 2020 Red Hat Inc. and others. + * + * This program and the accompanying materials are made + * available under the terms of the Eclipse Public License 2.0 + * which is available at https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + *******************************************************************************/ +package org.eclipse.wildwebdeveloper.embedder.node; + +import org.eclipse.core.runtime.Plugin; +import org.osgi.framework.BundleContext; + +/** + * The activator class controls the plug-in life cycle + */ +public class Activator extends Plugin { + + // The plug-in ID + public static final String PLUGIN_ID = "org.eclipse.wildwebdeveloper.embedder.node"; //$NON-NLS-1$ + + // The shared instance + private static Activator plugin; + + /** + * The constructor + */ + public Activator() { + } + + @Override + public void start(BundleContext context) throws Exception { + super.start(context); + plugin = this; + } + + @Override + public void stop(BundleContext context) throws Exception { + plugin = null; + super.stop(context); + } + + /** + * Returns the shared instance + * + * @return the shared instance + */ + public static Activator getDefault() { + return plugin; + } + +} diff --git a/org.eclipse.wildwebdeveloper.embedder.node/src/org/eclipse/wildwebdeveloper/embedder/node/CompressUtils.java b/org.eclipse.wildwebdeveloper.embedder.node/src/org/eclipse/wildwebdeveloper/embedder/node/CompressUtils.java new file mode 100644 index 0000000000..19ea49a80c --- /dev/null +++ b/org.eclipse.wildwebdeveloper.embedder.node/src/org/eclipse/wildwebdeveloper/embedder/node/CompressUtils.java @@ -0,0 +1,95 @@ +/******************************************************************************* + * Copyright (c) 2020 Red Hat Inc. and others. + * + * This program and the accompanying materials are made + * available under the terms of the Eclipse Public License 2.0 + * which is available at https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Victor Rubezhny (Red Hat Inc.) - initial implementation + *******************************************************************************/ +package org.eclipse.wildwebdeveloper.embedder.node; + +import java.io.BufferedInputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.URL; +import java.nio.file.Files; + +import org.apache.commons.compress.archivers.ArchiveEntry; +import org.apache.commons.compress.archivers.ArchiveInputStream; +import org.apache.commons.compress.archivers.dump.UnsupportedCompressionAlgorithmException; +import org.apache.commons.compress.archivers.tar.TarArchiveEntry; +import org.apache.commons.compress.archivers.tar.TarArchiveInputStream; +import org.apache.commons.compress.archivers.zip.ZipArchiveInputStream; +import org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream; +import org.apache.commons.compress.compressors.xz.XZCompressorInputStream; +import org.apache.commons.compress.utils.IOUtils; + +public class CompressUtils { + public static final String ZIP_EXTENSION = ".zip"; + public static final String TAR_GZ_EXTENSION = ".tar.gz"; + public static final String TAR_XZ_EXTENSION = ".tar.xz"; + + public static void unarchive(URL find, File baseDir) throws IOException { + String archive = find != null ? find.getFile() : ""; + if (archive.endsWith(TAR_GZ_EXTENSION) || archive.endsWith(TAR_XZ_EXTENSION)) { + try (InputStream fi = find.openStream(); + InputStream bi = new BufferedInputStream(fi); + InputStream gzi = archive.endsWith(TAR_XZ_EXTENSION) ? + new XZCompressorInputStream(bi) : new GzipCompressorInputStream(bi); + TarArchiveInputStream in = new TarArchiveInputStream(gzi)) { + extractArchive(in, baseDir); + } + } else if (archive.endsWith(ZIP_EXTENSION)) { + try (InputStream fi = find.openStream(); + ZipArchiveInputStream in = new ZipArchiveInputStream(fi)) { + extractArchive(in, baseDir); + } + } else { + throw new UnsupportedCompressionAlgorithmException("Unsupported archive file extension: " + archive); + } + + } + + /** + * Extract zip/tar.gz/tar.xz file to destination folder. + * Sets up 'executable' permission for TarAchiveEntry representing an + * executable file. + * + * @param in + * Zip/Tar Archive Input Stream to extract + * @param destination + * destination folder + */ + public static void extractArchive(ArchiveInputStream in, File destination) throws IOException { + ArchiveEntry entry = null; + while ((entry = in.getNextEntry()) != null) { + if (!in.canReadEntryData(entry)) { + // log something? + continue; + } + File f = new File(destination, entry.getName()); + if (entry.isDirectory()) { + if (!f.isDirectory() && !f.mkdirs()) { + throw new IOException("failed to create directory " + f); + } + } else { + File parent = f.getParentFile(); + if (!parent.isDirectory() && !parent.mkdirs()) { + throw new IOException("failed to create directory " + parent); + } + try (OutputStream o = Files.newOutputStream(f.toPath())) { + IOUtils.copy(in, o); + } + if (entry instanceof TarArchiveEntry) { + f.setExecutable((((TarArchiveEntry)entry).getMode() & 256) != 0); + } + } + } + } +} diff --git a/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/InitializeLaunchConfigurations.java b/org.eclipse.wildwebdeveloper.embedder.node/src/org/eclipse/wildwebdeveloper/embedder/node/NodeJSManager.java similarity index 56% rename from org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/InitializeLaunchConfigurations.java rename to org.eclipse.wildwebdeveloper.embedder.node/src/org/eclipse/wildwebdeveloper/embedder/node/NodeJSManager.java index b73c40a6a2..3ac35435d6 100644 --- a/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/InitializeLaunchConfigurations.java +++ b/org.eclipse.wildwebdeveloper.embedder.node/src/org/eclipse/wildwebdeveloper/embedder/node/NodeJSManager.java @@ -14,28 +14,34 @@ * Pierre-Yves B. - Issue #238 Why does wildweb do "/bin/bash -c which node" ? * Pierre-Yves B. - Issue #268 Incorrect default Node.js location for macOS *******************************************************************************/ -package org.eclipse.wildwebdeveloper; +package org.eclipse.wildwebdeveloper.embedder.node; import java.io.BufferedReader; import java.io.File; import java.io.IOException; +import java.io.InputStream; import java.io.InputStreamReader; -import java.nio.file.Files; -import java.nio.file.Paths; +import java.net.URL; import java.util.Arrays; import java.util.Collections; import java.util.HashSet; +import java.util.Properties; import java.util.Set; import java.util.stream.Collectors; +import org.eclipse.core.internal.runtime.InternalPlatform; +import org.eclipse.core.runtime.FileLocator; +import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.Status; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.swt.widgets.Display; import org.osgi.framework.Version; -public class InitializeLaunchConfigurations { +@SuppressWarnings("restriction") +public class NodeJSManager { private static final String MACOS_DSCL_SHELL_PREFIX = "UserShell: "; @@ -43,25 +49,49 @@ public class InitializeLaunchConfigurations { .unmodifiableSet(new HashSet<>(Arrays.asList(10, 11, 12, 13, 14))); private static boolean alreadyWarned; - public static String getNodeJsLocation() { + private static Properties cachedNodeJsInfoProperties; + + public static File getNodeJsLocation() { { String nodeJsLocation = System.getProperty("org.eclipse.wildwebdeveloper.nodeJSLocation"); - if (nodeJsLocation != null && Files.exists(Paths.get(nodeJsLocation))) { - validateNodeVersion(nodeJsLocation); - return nodeJsLocation; + if (nodeJsLocation != null) { + File nodejs = new File(nodeJsLocation); + if (nodejs.exists()) { + validateNodeVersion(nodejs); + return new File(nodeJsLocation); + } } } - String res = which("node"); - if (res == null) { - if (Files.exists(Paths.get(getDefaultNodePath()))) { - res = getDefaultNodePath(); + Properties properties = getNodeJsInfoProperties(); + if (properties != null) { + try { + IPath stateLocationPath = InternalPlatform.getDefault().getStateLocation(Platform + .getBundle(Activator.PLUGIN_ID)); + if (stateLocationPath != null) { + File installationPath = stateLocationPath.toFile(); + File nodePath = new File(installationPath, properties.getProperty("nodePath")); + if (nodePath.exists() && nodePath.canRead() && nodePath.canExecute()) { + return nodePath; + } + + CompressUtils.unarchive(FileLocator.find(Activator.getDefault().getBundle(), + new Path(properties.getProperty("archiveFile"))), + installationPath); + return nodePath; + } + } catch (IOException e) { + Activator.getDefault().getLog().log(new Status(IStatus.ERROR, Activator.PLUGIN_ID, e.getMessage(), e)); } } + File res = which("node"); + if (res == null && getDefaultNodePath().exists()) { + res = getDefaultNodePath(); + } + if (res != null) { validateNodeVersion(res); - return res; } else if (!alreadyWarned) { warnNodeJSMissing(); @@ -69,14 +99,28 @@ public static String getNodeJsLocation() { } return null; } - - public static String which(String program) { - + + public static File which(String program) { + Properties properties = getNodeJsInfoProperties(); + if (properties != null) { + IPath stateLocationPath = InternalPlatform.getDefault().getStateLocation(Platform + .getBundle(Activator.PLUGIN_ID)); + if (stateLocationPath != null) { + File installationPath = stateLocationPath.toFile(); + File nodePath = new File(installationPath, properties.getProperty("nodePath")); + if (nodePath.exists() && nodePath.canRead() && nodePath.canExecute()) { + File exe = new File(nodePath.getParent(), program); + if (exe.canExecute()) + return exe; + } + } + } + String[] paths = System.getenv("PATH").split(System.getProperty("path.separator")); for (String path : paths) { File exe = new File(path, program); if (exe.canExecute()) - return exe.getAbsolutePath(); + return exe; } String res = null; @@ -93,44 +137,59 @@ public static String which(String program) { Activator.getDefault().getLog().log( new Status(IStatus.ERROR, Activator.getDefault().getBundle().getSymbolicName(), e.getMessage(), e)); } + return new File(res); + } + + private static Properties getNodeJsInfoProperties() { + if (cachedNodeJsInfoProperties == null) { + URL nodeJsInfo = FileLocator.find(Activator.getDefault().getBundle(), new Path("nodejs-info.properties")); + if (nodeJsInfo != null) { + try (InputStream infoStream = nodeJsInfo.openStream()) { + Properties properties = new Properties(); + properties.load(infoStream); + cachedNodeJsInfoProperties = properties; + } catch (IOException e) { + Activator.getDefault().getLog().log(new Status(IStatus.ERROR, Activator.PLUGIN_ID, e.getMessage(), e)); + } + } + } + return cachedNodeJsInfoProperties; + } + + private static String getDefaultShellMacOS() { + String res = null; + String[] command = new String[] { "/bin/bash", "-c", "-l", "dscl . -read ~/ UserShell" }; + try (BufferedReader reader = new BufferedReader( + new InputStreamReader(Runtime.getRuntime().exec(command).getInputStream()));) { + res = reader.readLine(); + if (!res.startsWith(MACOS_DSCL_SHELL_PREFIX)) { + Activator.getDefault().getLog() + .log(new Status(IStatus.ERROR, Activator.getDefault().getBundle().getSymbolicName(), + "Cannot find default shell. Use '/bin/zsh' instead.")); + return "/bin/zsh"; // Default shell since macOS 10.15 + } + res = res.substring(MACOS_DSCL_SHELL_PREFIX.length()); + } catch (IOException e) { + Activator.getDefault().getLog().log( + new Status(IStatus.ERROR, Activator.getDefault().getBundle().getSymbolicName(), e.getMessage(), e)); + } return res; } - private static String getDefaultShellMacOS() { - String res = null; - String[] command = new String[] {"/bin/bash", "-c", "-l", "dscl . -read ~/ UserShell"}; - try (BufferedReader reader = new BufferedReader( - new InputStreamReader(Runtime.getRuntime().exec(command).getInputStream()));) { - res = reader.readLine(); - if ( ! res.startsWith(MACOS_DSCL_SHELL_PREFIX)) { - Activator.getDefault().getLog().log( - new Status(IStatus.ERROR, Activator.getDefault().getBundle().getSymbolicName(), - "Cannot find default shell. Use '/bin/zsh' instead.")); - return "/bin/zsh"; // Default shell since macOS 10.15 - } - res = res.substring(MACOS_DSCL_SHELL_PREFIX.length()); - } catch (IOException e) { - Activator.getDefault().getLog().log( - new Status(IStatus.ERROR, Activator.getDefault().getBundle().getSymbolicName(), e.getMessage(), e)); - } - return res; - } - - private static String getDefaultNodePath() { + private static File getDefaultNodePath() { switch (Platform.getOS()) { case Platform.OS_MACOSX: - return "/usr/local/bin/node"; + return new File("/usr/local/bin/node"); case Platform.OS_WIN32: - return "C:\\Program Files\\nodejs\\node.exe"; + return new File("C:\\Program Files\\nodejs\\node.exe"); default: - return "/usr/bin/node"; + return new File("/usr/bin/node"); } } - private static void validateNodeVersion(String nodeJsLocation) { - + private static void validateNodeVersion(File nodeJsLocation) { String nodeVersion = null; - String[] nodeVersionCommand = new String[] { nodeJsLocation, "-v" }; + String[] nodeVersionCommand = new String[] { nodeJsLocation.getAbsolutePath(), "-v" }; try (BufferedReader reader = new BufferedReader( new InputStreamReader(Runtime.getRuntime().exec(nodeVersionCommand).getInputStream()));) { diff --git a/org.eclipse.wildwebdeveloper.feature/feature.xml b/org.eclipse.wildwebdeveloper.feature/feature.xml index ea11525453..31f5e3fdbf 100644 --- a/org.eclipse.wildwebdeveloper.feature/feature.xml +++ b/org.eclipse.wildwebdeveloper.feature/feature.xml @@ -22,6 +22,9 @@ + javax.annotation 0.0.0 + + eclipse-feature + org.eclipse.wildwebdeveloper.embedder.node.feature + 0.0.0 + diff --git a/org.eclipse.wildwebdeveloper.tests/src/org/eclipse/wildwebdeveloper/tests/TestNodeJsEmbedder.java b/org.eclipse.wildwebdeveloper.tests/src/org/eclipse/wildwebdeveloper/tests/TestNodeJsEmbedder.java new file mode 100644 index 0000000000..b2d0f205d0 --- /dev/null +++ b/org.eclipse.wildwebdeveloper.tests/src/org/eclipse/wildwebdeveloper/tests/TestNodeJsEmbedder.java @@ -0,0 +1,113 @@ +/******************************************************************************* + * Copyright (c) 2020 Red Hat Inc. and others. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v. 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0. + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Victor Rubezhny (Red Hat Inc.) - Initial implementation + *******************************************************************************/ +package org.eclipse.wildwebdeveloper.tests; + +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.assertEquals; + +import java.io.File; +import java.io.InputStream; +import java.net.URL; +import java.util.Properties; + +import org.eclipse.core.internal.runtime.InternalPlatform; +import org.eclipse.core.runtime.FileLocator; +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.Path; +import org.eclipse.core.runtime.Platform; +import org.eclipse.wildwebdeveloper.embedder.node.Activator; +import org.eclipse.wildwebdeveloper.embedder.node.NodeJSManager; +import org.junit.Rule; +import org.junit.Test; + +@SuppressWarnings("restriction") +public class TestNodeJsEmbedder { + @Rule public AllCleanRule allClean = new AllCleanRule(); + + @Test + public void testNodeJsEmbedder() throws Exception { + URL nodeJsInfo = FileLocator.find(Activator.getDefault().getBundle(), new Path("nodejs-info.properties")); + assertNotNull("NodeJs descriptor \"nodejs-info.properties\" not found!", nodeJsInfo); + + Properties properties = new Properties(); + try (InputStream infoStream = nodeJsInfo.openStream()) { + properties.load(infoStream); + } + + assertTrue("Property \"archiveURL\" is not defined", properties.getProperty("archiveURL") != null && + !properties.getProperty("archiveURL").isEmpty()); + assertTrue("Property \"archiveFile\" is not defined", properties.getProperty("archiveFile") != null && + !properties.getProperty("archiveFile").isEmpty()); + assertTrue("Property \"nodePath\" is not defined", properties.getProperty("nodePath") != null && + !properties.getProperty("nodePath").isEmpty()); + + File nodePath = NodeJSManager.getNodeJsLocation(); + assertNotNull("Node.Js location cannot be found", nodePath); + + IPath stateLocationPath = InternalPlatform.getDefault().getStateLocation(Platform + .getBundle(Activator.PLUGIN_ID)); + assertNotNull("State location cannot be found for plugin \"" + Activator.PLUGIN_ID + "\"", + stateLocationPath); + + File installationPath = stateLocationPath.toFile(); + File embeddedNodePath = new File(installationPath, properties.getProperty("nodePath")); + assertTrue("Embedded NodeJs is not extracted", nodePath.exists() && nodePath.canRead() && nodePath.canExecute()); + assertEquals("Embedded NodeJs installation is not used", nodePath, embeddedNodePath); + } + + @Test + public void testNodeJsEmbedderWhich() throws Exception { + URL nodeJsInfo = FileLocator.find(Activator.getDefault().getBundle(), new Path("nodejs-info.properties")); + assertNotNull("NodeJs descriptor \"nodejs-info.properties\" not found!", nodeJsInfo); + + Properties properties = new Properties(); + try (InputStream infoStream = nodeJsInfo.openStream()) { + properties.load(infoStream); + } + + assertTrue("Property \"archiveURL\" is not defined", properties.getProperty("archiveURL") != null && + !properties.getProperty("archiveURL").isEmpty()); + assertTrue("Property \"archiveFile\" is not defined", properties.getProperty("archiveFile") != null && + !properties.getProperty("archiveFile").isEmpty()); + assertTrue("Property \"nodePath\" is not defined", properties.getProperty("nodePath") != null && + !properties.getProperty("nodePath").isEmpty()); + + File nodePath = NodeJSManager.getNodeJsLocation(); + assertNotNull("Node.Js location cannot be found", nodePath); + + IPath stateLocationPath = InternalPlatform.getDefault().getStateLocation(Platform + .getBundle(Activator.PLUGIN_ID)); + assertNotNull("State location cannot be found for plugin \"" + Activator.PLUGIN_ID + "\"", + stateLocationPath); + + File installationPath = stateLocationPath.toFile(); + File embeddedNodePath = new File(installationPath, properties.getProperty("nodePath")); + assertTrue("Embedded NodeJs is not extracted", nodePath.exists() && nodePath.canRead() && nodePath.canExecute()); + + File whichNode = NodeJSManager.which("node"); + assertTrue("NodeJSManager.which(\"node\") didn't return an embedded NodeJs", + whichNode.exists() && whichNode.canRead() && whichNode.canExecute() && + embeddedNodePath.getParent().equals(whichNode.getParent())); + + File whichNpm = NodeJSManager.which("npm"); + assertTrue("NodeJSManager.which(\"npm\") didn't return an embedded NodeJs\'s NPM", + whichNpm.exists() && whichNpm.canRead() && whichNpm.canExecute() && + embeddedNodePath.getParent().equals(whichNpm.getParent())); + + File whichNpx = NodeJSManager.which("npx"); + assertTrue("NodeJSManager.which(\"npx\") didn't return an embedded NodeJs\\'s NPX", + whichNpx.exists() && whichNpx.canRead() && whichNpx.canExecute() && + embeddedNodePath.getParent().equals(whichNpx.getParent())); + } +} diff --git a/org.eclipse.wildwebdeveloper/META-INF/MANIFEST.MF b/org.eclipse.wildwebdeveloper/META-INF/MANIFEST.MF index c67b97feeb..47ab163c52 100644 --- a/org.eclipse.wildwebdeveloper/META-INF/MANIFEST.MF +++ b/org.eclipse.wildwebdeveloper/META-INF/MANIFEST.MF @@ -26,7 +26,8 @@ Require-Bundle: org.eclipse.ui, org.eclipse.tm4e.languageconfiguration, org.eclipse.compare;resolution:=optional, org.eclipse.ui.console;bundle-version="3.9.0", - org.eclipse.ui.browser;bundle-version="3.6.0" + org.eclipse.ui.browser;bundle-version="3.6.0", + org.eclipse.wildwebdeveloper.embedder.node;bundle-version="0.1.0" Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-ActivationPolicy: lazy Eclipse-BundleShape: dir diff --git a/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/angular/AngularLanguageServer.java b/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/angular/AngularLanguageServer.java index 02e4b0d7db..5e620a0d80 100644 --- a/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/angular/AngularLanguageServer.java +++ b/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/angular/AngularLanguageServer.java @@ -23,7 +23,7 @@ import org.eclipse.lsp4e.server.ProcessStreamConnectionProvider; import org.eclipse.ui.preferences.ScopedPreferenceStore; import org.eclipse.wildwebdeveloper.Activator; -import org.eclipse.wildwebdeveloper.InitializeLaunchConfigurations; +import org.eclipse.wildwebdeveloper.embedder.node.NodeJSManager; public class AngularLanguageServer extends ProcessStreamConnectionProvider { @@ -40,7 +40,7 @@ public AngularLanguageServer() { this.isLoggingToConsoleEnabled = scopedPreferenceStore.getBoolean(LOG_TO_CONSOLE_ANGULAR_LS_PREFERENCE); List commands = new ArrayList<>(); - commands.add(InitializeLaunchConfigurations.getNodeJsLocation()); + commands.add(NodeJSManager.getNodeJsLocation().getAbsolutePath()); try { URL url = FileLocator.toFileURL(getClass().getResource("/node_modules/@angular/language-server/index.js")); commands.add(new java.io.File(url.getPath()).getAbsolutePath()); diff --git a/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/css/CSSLanguageServer.java b/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/css/CSSLanguageServer.java index 28d69804ad..0c7dfc3f76 100644 --- a/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/css/CSSLanguageServer.java +++ b/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/css/CSSLanguageServer.java @@ -31,13 +31,13 @@ import org.eclipse.lsp4j.jsonrpc.messages.ResponseMessage; import org.eclipse.lsp4j.services.LanguageServer; import org.eclipse.wildwebdeveloper.Activator; -import org.eclipse.wildwebdeveloper.InitializeLaunchConfigurations; +import org.eclipse.wildwebdeveloper.embedder.node.NodeJSManager; public class CSSLanguageServer extends ProcessStreamConnectionProvider { public CSSLanguageServer() { List commands = new ArrayList<>(); - commands.add(InitializeLaunchConfigurations.getNodeJsLocation()); + commands.add(NodeJSManager.getNodeJsLocation().getAbsolutePath()); try { URL url = FileLocator.toFileURL(getClass().getResource("/node_modules/vscode-css-languageserver/dist/cssServerMain.js")); commands.add(new java.io.File(url.getPath()).getAbsolutePath()); diff --git a/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/debug/AbstractHTMLDebugDelegate.java b/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/debug/AbstractHTMLDebugDelegate.java index 6f87be64a3..06add365c4 100644 --- a/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/debug/AbstractHTMLDebugDelegate.java +++ b/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/debug/AbstractHTMLDebugDelegate.java @@ -27,7 +27,7 @@ import org.eclipse.lsp4e.debug.launcher.DSPLaunchDelegate; import org.eclipse.swt.widgets.Display; import org.eclipse.wildwebdeveloper.Activator; -import org.eclipse.wildwebdeveloper.InitializeLaunchConfigurations; +import org.eclipse.wildwebdeveloper.embedder.node.NodeJSManager; public class AbstractHTMLDebugDelegate extends DSPLaunchDelegate { public static final String PROGRAM = "program"; //$NON-NLS-1$ @@ -51,7 +51,7 @@ public void launchWithParameters(ILaunchConfiguration configuration, String mode DSPLaunchDelegateLaunchBuilder builder = new DSPLaunchDelegateLaunchBuilder(configuration, mode, launch, monitor); - builder.setLaunchDebugAdapter(InitializeLaunchConfigurations.getNodeJsLocation(), debugCmdArgs); + builder.setLaunchDebugAdapter(NodeJSManager.getNodeJsLocation().getAbsolutePath(), debugCmdArgs); builder.setMonitorDebugAdapter(configuration.getAttribute(DSPPlugin.ATTR_DSP_MONITOR_DEBUG_ADAPTER, false)); builder.setDspParameters(param); diff --git a/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/debug/chrome/ChromeRunDAPDebugDelegate.java b/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/debug/chrome/ChromeRunDAPDebugDelegate.java index 156c6842b2..bc3078b441 100644 --- a/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/debug/chrome/ChromeRunDAPDebugDelegate.java +++ b/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/debug/chrome/ChromeRunDAPDebugDelegate.java @@ -32,8 +32,8 @@ import org.eclipse.jface.dialogs.ErrorDialog; import org.eclipse.swt.widgets.Display; import org.eclipse.wildwebdeveloper.Activator; -import org.eclipse.wildwebdeveloper.InitializeLaunchConfigurations; import org.eclipse.wildwebdeveloper.debug.AbstractHTMLDebugDelegate; +import org.eclipse.wildwebdeveloper.embedder.node.NodeJSManager; import com.google.gson.JsonObject; @@ -128,15 +128,15 @@ static String findChromeLocation(ILaunchConfiguration configuration) { res = "chromium-browser"; //$NON-NLS-1$ } // Failsafe, in case user doesn't have their preferred browser - res = InitializeLaunchConfigurations.which(res); + res = NodeJSManager.which(res).getAbsolutePath(); if (res != null) { return res; } - res = InitializeLaunchConfigurations.which("chromium-browser"); + res = NodeJSManager.which("chromium-browser").getAbsolutePath(); if (res != null) { return res; } - res = InitializeLaunchConfigurations.which("google-chrome-stable"); + res = NodeJSManager.which("google-chrome-stable").getAbsolutePath(); if (res != null) { return res; } diff --git a/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/debug/firefox/FirefoxRunDABDebugDelegate.java b/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/debug/firefox/FirefoxRunDABDebugDelegate.java index c1e45d40cc..26a202f9da 100644 --- a/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/debug/firefox/FirefoxRunDABDebugDelegate.java +++ b/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/debug/firefox/FirefoxRunDABDebugDelegate.java @@ -30,9 +30,9 @@ import org.eclipse.jface.dialogs.ErrorDialog; import org.eclipse.swt.widgets.Display; import org.eclipse.wildwebdeveloper.Activator; -import org.eclipse.wildwebdeveloper.InitializeLaunchConfigurations; import org.eclipse.wildwebdeveloper.debug.AbstractHTMLDebugDelegate; import org.eclipse.wildwebdeveloper.debug.chrome.ChromeRunDAPDebugDelegate; +import org.eclipse.wildwebdeveloper.embedder.node.NodeJSManager; public class FirefoxRunDABDebugDelegate extends AbstractHTMLDebugDelegate { @@ -98,7 +98,7 @@ static File findDebugAdapter() { } static String findFirefoxLocation() { - String res = InitializeLaunchConfigurations.which("firefox"); + String res = NodeJSManager.which("firefox").getAbsolutePath(); if (res == null) { res = "/path/to/firefox"; } diff --git a/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/debug/node/NodeAttachDebugDelegate.java b/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/debug/node/NodeAttachDebugDelegate.java index d2c1d8e641..76d432b490 100644 --- a/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/debug/node/NodeAttachDebugDelegate.java +++ b/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/debug/node/NodeAttachDebugDelegate.java @@ -33,7 +33,7 @@ import org.eclipse.lsp4e.debug.launcher.DSPLaunchDelegate; import org.eclipse.swt.widgets.Display; import org.eclipse.wildwebdeveloper.Activator; -import org.eclipse.wildwebdeveloper.InitializeLaunchConfigurations; +import org.eclipse.wildwebdeveloper.embedder.node.NodeJSManager; public class NodeAttachDebugDelegate extends DSPLaunchDelegate { @@ -66,7 +66,7 @@ public void launch(ILaunchConfiguration configuration, String mode, ILaunch laun DSPLaunchDelegateLaunchBuilder builder = new DSPLaunchDelegateLaunchBuilder(configuration, mode, launch, monitor); - builder.setLaunchDebugAdapter(InitializeLaunchConfigurations.getNodeJsLocation(), debugCmdArgs); + builder.setLaunchDebugAdapter(NodeJSManager.getNodeJsLocation().getAbsolutePath(), debugCmdArgs); builder.setMonitorDebugAdapter(configuration.getAttribute(DSPPlugin.ATTR_DSP_MONITOR_DEBUG_ADAPTER, false)); builder.setDspParameters(param); diff --git a/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/debug/node/NodeRunDAPDebugDelegate.java b/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/debug/node/NodeRunDAPDebugDelegate.java index ad6f4c211c..2f20ea3826 100644 --- a/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/debug/node/NodeRunDAPDebugDelegate.java +++ b/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/debug/node/NodeRunDAPDebugDelegate.java @@ -56,8 +56,8 @@ import org.eclipse.ui.ide.IDE; import org.eclipse.ui.part.FileEditorInput; import org.eclipse.wildwebdeveloper.Activator; -import org.eclipse.wildwebdeveloper.InitializeLaunchConfigurations; import org.eclipse.wildwebdeveloper.debug.Messages; +import org.eclipse.wildwebdeveloper.embedder.node.NodeJSManager; import com.google.gson.Gson; import com.google.gson.JsonObject; @@ -73,6 +73,7 @@ public class NodeRunDAPDebugDelegate extends DSPLaunchDelegate { public static final String ARGUMENTS = "args"; //$NON-NLS-1$ private static final String CWD = "cwd"; //$NON-NLS-1$ private static final String ENV = "env"; //$NON-NLS-1$ + private static final String RUNTIME_EXECUTABLE = "runtimeExecutable"; //$NON-NLS-1$ @Override public void launch(ILaunchConfiguration configuration, String mode, ILaunch launch, IProgressMonitor monitor) @@ -99,6 +100,10 @@ public void launch(ILaunchConfiguration configuration, String mode, ILaunch laun if (!cwd.isEmpty()) { param.put(CWD, cwd); } + File runtimeExecutable = NodeJSManager.which("node"); + if (runtimeExecutable != null) { + param.put(RUNTIME_EXECUTABLE, runtimeExecutable.getAbsolutePath()); + } if (!configureAdditionalParameters(param)) { return; @@ -112,7 +117,7 @@ public void launch(ILaunchConfiguration configuration, String mode, ILaunch laun DSPLaunchDelegateLaunchBuilder builder = new DSPLaunchDelegateLaunchBuilder(configuration, mode, launch, monitor); - builder.setLaunchDebugAdapter(InitializeLaunchConfigurations.getNodeJsLocation(), debugCmdArgs); + builder.setLaunchDebugAdapter(NodeJSManager.getNodeJsLocation().getAbsolutePath(), debugCmdArgs); builder.setMonitorDebugAdapter(configuration.getAttribute(DSPPlugin.ATTR_DSP_MONITOR_DEBUG_ADAPTER, false)); builder.setDspParameters(param); super.launch(builder); diff --git a/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/debug/npm/NpmLaunchDelegate.java b/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/debug/npm/NpmLaunchDelegate.java index b729c3af27..2e95e7091a 100644 --- a/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/debug/npm/NpmLaunchDelegate.java +++ b/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/debug/npm/NpmLaunchDelegate.java @@ -34,8 +34,8 @@ import org.eclipse.ui.console.IConsole; import org.eclipse.ui.console.MessageConsole; import org.eclipse.wildwebdeveloper.Activator; -import org.eclipse.wildwebdeveloper.InitializeLaunchConfigurations; import org.eclipse.wildwebdeveloper.debug.AbstractHTMLDebugDelegate; +import org.eclipse.wildwebdeveloper.embedder.node.NodeJSManager; public class NpmLaunchDelegate implements ILaunchConfigurationDelegate { @@ -97,7 +97,7 @@ public void launch(ILaunchConfiguration configuration, String mode, ILaunch laun } private static String findNPMLocation() { - return InitializeLaunchConfigurations.which("npm"); //$NON-NLS-1$ + return NodeJSManager.which("npm").getAbsolutePath(); //$NON-NLS-1$ } } diff --git a/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/html/HTMLLanguageServer.java b/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/html/HTMLLanguageServer.java index f383de5994..43446a4f77 100644 --- a/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/html/HTMLLanguageServer.java +++ b/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/html/HTMLLanguageServer.java @@ -31,13 +31,13 @@ import org.eclipse.lsp4j.jsonrpc.messages.ResponseMessage; import org.eclipse.lsp4j.services.LanguageServer; import org.eclipse.wildwebdeveloper.Activator; -import org.eclipse.wildwebdeveloper.InitializeLaunchConfigurations; +import org.eclipse.wildwebdeveloper.embedder.node.NodeJSManager; public class HTMLLanguageServer extends ProcessStreamConnectionProvider { public HTMLLanguageServer() { List commands = new ArrayList<>(); - commands.add(InitializeLaunchConfigurations.getNodeJsLocation()); + commands.add(NodeJSManager.getNodeJsLocation().getAbsolutePath()); try { URL url = FileLocator.toFileURL(getClass() .getResource("/node_modules/vscode-html-languageserver/dist/htmlServerMain.js")); diff --git a/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/json/JSonLanguageServer.java b/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/json/JSonLanguageServer.java index 037f5ced73..6137b148e2 100644 --- a/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/json/JSonLanguageServer.java +++ b/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/json/JSonLanguageServer.java @@ -35,7 +35,7 @@ import org.eclipse.lsp4j.jsonrpc.messages.ResponseMessage; import org.eclipse.lsp4j.services.LanguageServer; import org.eclipse.wildwebdeveloper.Activator; -import org.eclipse.wildwebdeveloper.InitializeLaunchConfigurations; +import org.eclipse.wildwebdeveloper.embedder.node.NodeJSManager; public class JSonLanguageServer extends ProcessStreamConnectionProvider { @@ -44,7 +44,7 @@ public class JSonLanguageServer extends ProcessStreamConnectionProvider { private final static String URL_ATTR = "url"; //$NON-NLS-1$ public JSonLanguageServer() { List commands = new ArrayList<>(); - commands.add(InitializeLaunchConfigurations.getNodeJsLocation()); + commands.add(NodeJSManager.getNodeJsLocation().getAbsolutePath()); try { URL url = FileLocator.toFileURL(getClass() .getResource("/node_modules/vscode-json-languageserver/dist/jsonServerMain.js")); diff --git a/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/jsts/JSTSLanguageServer.java b/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/jsts/JSTSLanguageServer.java index a488a403dd..ac86f22ad2 100644 --- a/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/jsts/JSTSLanguageServer.java +++ b/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/jsts/JSTSLanguageServer.java @@ -27,13 +27,13 @@ import org.eclipse.core.runtime.Status; import org.eclipse.lsp4e.server.ProcessStreamConnectionProvider; import org.eclipse.wildwebdeveloper.Activator; -import org.eclipse.wildwebdeveloper.InitializeLaunchConfigurations; +import org.eclipse.wildwebdeveloper.embedder.node.NodeJSManager; public class JSTSLanguageServer extends ProcessStreamConnectionProvider { public JSTSLanguageServer() { List commands = new ArrayList<>(); - commands.add(InitializeLaunchConfigurations.getNodeJsLocation()); + commands.add(NodeJSManager.getNodeJsLocation().getAbsolutePath()); try { URL url = FileLocator.toFileURL(getClass().getResource("/node_modules/typescript-language-server/lib/cli.js")); URL tsServer = FileLocator.toFileURL(getClass().getResource("/node_modules/typescript/lib/tsserver.js")); diff --git a/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/yaml/YAMLLanguageServer.java b/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/yaml/YAMLLanguageServer.java index 2bcc3c3009..5183a78817 100644 --- a/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/yaml/YAMLLanguageServer.java +++ b/org.eclipse.wildwebdeveloper/src/org/eclipse/wildwebdeveloper/yaml/YAMLLanguageServer.java @@ -26,7 +26,7 @@ import org.eclipse.lsp4j.jsonrpc.messages.Message; import org.eclipse.lsp4j.services.LanguageServer; import org.eclipse.wildwebdeveloper.Activator; -import org.eclipse.wildwebdeveloper.InitializeLaunchConfigurations; +import org.eclipse.wildwebdeveloper.embedder.node.NodeJSManager; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; @@ -37,7 +37,7 @@ public class YAMLLanguageServer extends ProcessStreamConnectionProvider { public YAMLLanguageServer() { List commands = new ArrayList<>(); - commands.add(InitializeLaunchConfigurations.getNodeJsLocation()); + commands.add(NodeJSManager.getNodeJsLocation().getAbsolutePath()); try { URL url = FileLocator.toFileURL(getClass() .getResource("/node_modules/yaml-language-server/out/server/src/server.js")); diff --git a/pom.xml b/pom.xml index 7e7f139056..4d70c8bac7 100644 --- a/pom.xml +++ b/pom.xml @@ -20,13 +20,19 @@ target-platform + org.eclipse.wildwebdeveloper.embedder.node.linux.x86_64 + org.eclipse.wildwebdeveloper.embedder.node.macos.x86_64 + org.eclipse.wildwebdeveloper.embedder.node.win32.x86_64 + org.eclipse.wildwebdeveloper.embedder.node org.eclipse.wildwebdeveloper org.eclipse.wildwebdeveloper.xml org.eclipse.wildwebdeveloper.tests + org.eclipse.wildwebdeveloper.embedder.node.feature org.eclipse.wildwebdeveloper.xml.feature org.eclipse.wildwebdeveloper.feature repository + @@ -157,6 +163,31 @@ download-maven-plugin 1.5.0 + + org.eclipse.tycho + target-platform-configuration + ${tycho-version} + + p2 + + + win32 + win32 + x86_64 + + + linux + gtk + x86_64 + + + macosx + cocoa + x86_64 + + + + diff --git a/target-platform/target-platform.target b/target-platform/target-platform.target index afaf2d17d2..ffd4fb29b1 100644 --- a/target-platform/target-platform.target +++ b/target-platform/target-platform.target @@ -17,6 +17,7 @@ + @@ -36,4 +37,4 @@ - + \ No newline at end of file