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();
+       }
+}

Reply via email to