Repository: incubator-nifi Updated Branches: refs/heads/nifi-27 fef807136 -> 2f2474efb
NIFI-145: Initial commit of bootstrap module Project: http://git-wip-us.apache.org/repos/asf/incubator-nifi/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-nifi/commit/567dfc79 Tree: http://git-wip-us.apache.org/repos/asf/incubator-nifi/tree/567dfc79 Diff: http://git-wip-us.apache.org/repos/asf/incubator-nifi/diff/567dfc79 Branch: refs/heads/nifi-27 Commit: 567dfc794c565854850b7e223601528f2a3fd814 Parents: 203e83e Author: Mark Payne <marka...@hotmail.com> Authored: Tue Dec 9 08:48:07 2014 -0500 Committer: Mark Payne <marka...@hotmail.com> Committed: Tue Dec 9 08:48:07 2014 -0500 ---------------------------------------------------------------------- .gitignore | 1 + nifi-bootstrap/pom.xml | 18 ++ .../java/org/apache/nifi/bootstrap/RunNiFi.java | 176 +++++++++++++++++++ .../org/apache/nifi/bootstrap/ShutdownHook.java | 14 ++ 4 files changed, 209 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/567dfc79/.gitignore ---------------------------------------------------------------------- diff --git a/.gitignore b/.gitignore index f026df6..6d4eca9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ target .project .settings +.classpath nbactions.xml .DS_Store http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/567dfc79/nifi-bootstrap/pom.xml ---------------------------------------------------------------------- diff --git a/nifi-bootstrap/pom.xml b/nifi-bootstrap/pom.xml new file mode 100644 index 0000000..b620c84 --- /dev/null +++ b/nifi-bootstrap/pom.xml @@ -0,0 +1,18 @@ +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <parent> + <groupId>org.apache.nifi</groupId> + <artifactId>nifi-parent</artifactId> + <version>0.0.1-SNAPSHOT</version> + </parent> + + <artifactId>nifi-bootstrap</artifactId> + <packaging>jar</packaging> + + <name>nifi-bootstrap</name> + + <dependencies> + </dependencies> +</project> http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/567dfc79/nifi-bootstrap/src/main/java/org/apache/nifi/bootstrap/RunNiFi.java ---------------------------------------------------------------------- diff --git a/nifi-bootstrap/src/main/java/org/apache/nifi/bootstrap/RunNiFi.java b/nifi-bootstrap/src/main/java/org/apache/nifi/bootstrap/RunNiFi.java new file mode 100644 index 0000000..afa1f47 --- /dev/null +++ b/nifi-bootstrap/src/main/java/org/apache/nifi/bootstrap/RunNiFi.java @@ -0,0 +1,176 @@ +package org.apache.nifi.bootstrap; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FilenameFilter; +import java.io.IOException; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Properties; + + +/** + * Bootstrap class to run Apache NiFi. + * + * This class looks for the bootstrap.conf file by looking in the following places (in order): + * <ol> + * <li>First argument to the program</li> + * <li>Java System Property named {@code org.apache.nifi.bootstrap.config.file}</li> + * <li>${NIFI_HOME}/./conf/bootstrap.conf, where ${NIFI_HOME} references an environment variable {@code NIFI_HOME}</li> + * <li>./conf/bootstrap.conf, where {@code .} represents the working directory. + * </ol> + * + * If the {@code bootstrap.conf} file cannot be found, throws a {@code FileNotFoundException]. + */ +public class RunNiFi { + public static final String DEFAULT_CONFIG_FILE = "./conf/boostrap.conf"; + public static final String DEFAULT_NIFI_PROPS_FILE = "./conf/nifi.properties"; + + @SuppressWarnings({ "rawtypes", "unchecked" }) + public static void main(final String[] args) throws IOException, InterruptedException { + final ProcessBuilder builder = new ProcessBuilder(); + + String configFilename = (args.length > 0) ? args[0] : System.getProperty("org.apache.nifi.boostrap.config.file"); + + if ( configFilename == null ) { + final String nifiHome = System.getenv("NIFI_HOME"); + if ( nifiHome != null ) { + final File nifiHomeFile = new File(nifiHome.trim()); + final File configFile = new File(nifiHomeFile, DEFAULT_CONFIG_FILE); + configFilename = configFile.getAbsolutePath(); + } + } + + if ( configFilename == null ) { + configFilename = DEFAULT_CONFIG_FILE; + } + + final File configFile = new File(configFilename); + if ( !configFile.exists() ) { + throw new FileNotFoundException(DEFAULT_CONFIG_FILE); + } + + final Properties properties = new Properties(); + try (final FileInputStream fis = new FileInputStream(configFile)) { + properties.load(fis); + } + + final Map<String, String> props = new HashMap<>(); + props.putAll( (Map) properties ); + + final String specifiedWorkingDir = props.get("working.dir"); + if ( specifiedWorkingDir != null ) { + builder.directory(new File(specifiedWorkingDir)); + } + + final File workingDir = builder.directory(); + + final String libFilename = replaceNull(props.get("lib.dir"), "./lib").trim(); + File libDir = getFile(libFilename, workingDir); + + final String confFilename = replaceNull(props.get("conf.dir"), "./conf").trim(); + File confDir = getFile(confFilename, workingDir); + + String nifiPropsFilename = props.get("props.file"); + if ( nifiPropsFilename == null ) { + if ( confDir.exists() ) { + nifiPropsFilename = new File(confDir, "nifi.properties").getAbsolutePath(); + } else { + nifiPropsFilename = DEFAULT_CONFIG_FILE; + } + } + + nifiPropsFilename = nifiPropsFilename.trim(); + + final List<String> javaAdditionalArgs = new ArrayList<>(); + for ( final Map.Entry<String, String> entry : props.entrySet() ) { + final String key = entry.getKey(); + final String value = entry.getValue(); + + if ( key.startsWith("java.arg") ) { + javaAdditionalArgs.add(value); + } + } + + final File[] libFiles = libDir.listFiles(new FilenameFilter() { + @Override + public boolean accept(final File dir, final String filename) { + return filename.toLowerCase().endsWith(".jar"); + } + }); + + if ( libFiles == null || libFiles.length == 0 ) { + throw new RuntimeException("Could not find lib directory at " + libDir.getAbsolutePath()); + } + + final File[] confFiles = confDir.listFiles(); + if ( confFiles == null || confFiles.length == 0 ) { + throw new RuntimeException("Could not find conf directory at " + confDir.getAbsolutePath()); + } + + final Path workingDirPath = workingDir.toPath(); + final List<String> cpFiles = new ArrayList<>(confFiles.length + libFiles.length); + cpFiles.add(confDir.getAbsolutePath()); + for ( final File file : libFiles ) { + final Path path = workingDirPath.relativize(file.toPath()); + final String cpPath = path.toString(); + cpFiles.add(cpPath); + } + + final StringBuilder classPathBuilder = new StringBuilder(); + for (int i=0; i < cpFiles.size(); i++) { + final String filename = cpFiles.get(i); + classPathBuilder.append(filename); + if ( i < cpFiles.size() - 1 ) { + classPathBuilder.append(File.pathSeparatorChar); + } + } + + final String classPath = classPathBuilder.toString(); + String javaCmd = props.get("java"); + if ( javaCmd == null ) { + javaCmd = "java"; + } + + final List<String> cmd = new ArrayList<>(); + cmd.add(javaCmd); + cmd.add("-classpath"); + cmd.add(classPath); + cmd.addAll(javaAdditionalArgs); + cmd.add("-Dnifi.properties.file.path=" + nifiPropsFilename); + cmd.add("org.apache.nifi.NiFi"); + + builder.command(cmd).inheritIO(); + + final StringBuilder cmdBuilder = new StringBuilder(); + for ( final String s : cmd ) { + cmdBuilder.append(s).append(" "); + } + System.out.println("Starting Apache NiFi..."); + System.out.println("Working Directory: " + workingDir.getAbsolutePath()); + System.out.println("Command: " + cmdBuilder.toString()); + + final Process proc = builder.start(); + Runtime.getRuntime().addShutdownHook(new ShutdownHook(proc)); + final int statusCode = proc.waitFor(); + System.out.println("Apache NiFi exited with Status Code " + statusCode); + } + + + private static File getFile(final String filename, final File workingDir) { + File libDir = new File(filename); + if ( !libDir.isAbsolute() ) { + libDir = new File(workingDir, filename); + } + + return libDir; + } + + private static String replaceNull(final String value, final String replacement) { + return (value == null) ? replacement : value; + } +} http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/567dfc79/nifi-bootstrap/src/main/java/org/apache/nifi/bootstrap/ShutdownHook.java ---------------------------------------------------------------------- diff --git a/nifi-bootstrap/src/main/java/org/apache/nifi/bootstrap/ShutdownHook.java b/nifi-bootstrap/src/main/java/org/apache/nifi/bootstrap/ShutdownHook.java new file mode 100644 index 0000000..55e1f45 --- /dev/null +++ b/nifi-bootstrap/src/main/java/org/apache/nifi/bootstrap/ShutdownHook.java @@ -0,0 +1,14 @@ +package org.apache.nifi.bootstrap; + +public class ShutdownHook extends Thread { + private final Process nifiProcess; + + public ShutdownHook(final Process nifiProcess) { + this.nifiProcess = nifiProcess; + } + + @Override + public void run() { + nifiProcess.destroy(); + } +}