io.linguarobot.aws.cdk.maven.node.AbstractNodeInstaller Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of aws-cdk-maven-plugin Show documentation
Show all versions of aws-cdk-maven-plugin Show documentation
The AWS CDK Maven plugin produces and deploys CloudFormation templates based on the cloud infrastructure defined
by means of CDK. The goal of the project is to improve the experience of Java developers while working with
CDK by eliminating the need for installing Node.js and interacting with the CDK application by means of CDK
Toolkit.
package io.linguarobot.aws.cdk.maven.node;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
public abstract class AbstractNodeInstaller implements NodeInstaller {
private static final Logger logger = LoggerFactory.getLogger(UnixNodeInstaller.class);
private static final byte[] INSTALLED_STATE = new byte[]{1};
private final String os;
private final String arch;
private final Path localRepositoryDirectory;
protected AbstractNodeInstaller(Path localRepositoryDirectory, String os, String arch) {
this.os = os;
this.arch = arch;
this.localRepositoryDirectory = localRepositoryDirectory;
}
@Override
public NodeClient install(NodeVersion version) {
String artifactName = String.join("-", "node", os, arch);
Path homeDirectory = localRepositoryDirectory.resolve(Paths.get("io", "linguarobot", artifactName, version.toString()));
Path stateFile = homeDirectory.resolve(".state");
if (!isInstallationCompleted(stateFile)) {
try {
Files.createDirectories(homeDirectory);
} catch (IOException e) {
throw new NodeInstallationException("Failed to create directory structure for Node.js in the local " +
"Maven repository");
}
try (FileChannel fileChannel = FileChannel.open(stateFile, StandardOpenOption.CREATE, StandardOpenOption.READ, StandardOpenOption.WRITE)) {
fileChannel.lock();
ByteBuffer buffer = ByteBuffer.allocate(1);
if (fileChannel.read(buffer) == -1) {
logger.info("Node.js {} wasn't found in the local Maven repository. It will be downloaded " +
"from {}", version, BASE_DOWNLOAD_URL);
Files.walk(homeDirectory)
.filter(file -> !file.equals(stateFile) && !file.equals(homeDirectory))
.forEach(file -> {
try {
Files.deleteIfExists(file);
} catch (IOException e) {
throw new NodeInstallationException(e);
}
});
download(version, os, arch, homeDirectory);
buffer.put(INSTALLED_STATE);
buffer.flip();
fileChannel.write(buffer);
logger.info("The Node.js {} has been successfully installed to {}", version, homeDirectory);
}
} catch (IOException e) {
throw new NodeInstallationException(e);
}
}
return toNodeProcessRunner(homeDirectory);
}
private boolean isInstallationCompleted(Path state) {
try {
return Files.exists(state) && Files.readAllBytes(state).length > 0;
} catch (IOException e) {
return false;
}
}
/**
* Downloads the required Node.js version (taking into account the operating system and its architecture) to the
* specified directory.
*
* @param version Node.js version
* @param os operating system name
* @param arch operating system architecture
* @param destination destination directory
*/
protected abstract void download(NodeVersion version, String os, String arch, Path destination);
/**
* Creates a {@code NodeProcessRunner}.
*
* @param homeDirectory the directory where Node.js is installed
* @return a new instance of a {@code NodeProcessRunner}.
*/
protected abstract NodeProcessRunner toNodeProcessRunner(Path homeDirectory);
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy