azkaban-developers

Details

diff --git a/src/main/java/azkaban/execapp/JobRunner.java b/src/main/java/azkaban/execapp/JobRunner.java
index dd9ad96..3a2b8a4 100644
--- a/src/main/java/azkaban/execapp/JobRunner.java
+++ b/src/main/java/azkaban/execapp/JobRunner.java
@@ -503,7 +503,7 @@ public class JobRunner extends EventHandler implements Runnable {
 				job = jobtypeManager.buildJobExecutor(this.jobId, props, logger);
 			}
 			catch (JobTypeManagerException e) {
-				logger.error("Failed to build job type");
+				logger.error("Failed to build job type", e);
 				return false;
 			}
 		}
diff --git a/src/main/java/azkaban/utils/PropsUtils.java b/src/main/java/azkaban/utils/PropsUtils.java
index 2f826a3..6b05f62 100644
--- a/src/main/java/azkaban/utils/PropsUtils.java
+++ b/src/main/java/azkaban/utils/PropsUtils.java
@@ -268,6 +268,11 @@ public class PropsUtils {
 			throw new IllegalArgumentException("Expression " + value + " not well formed. " + e.getMessage(), e);
 		}
 		
+		if (result == null) {
+			// for backward compatibility it is best to return value
+			return value;
+		}
+		
 		String newValue = value.substring(0, lastIndex) + result.toString() + value.substring(nextClosed + 1);
 		return resolveVariableExpression(newValue, lastIndex, jexl);
 	}
diff --git a/unit/java/azkaban/test/jobExecutor/JavaProcessJobTest.java b/unit/java/azkaban/test/jobExecutor/JavaProcessJobTest.java
index 21c1e92..048801b 100644
--- a/unit/java/azkaban/test/jobExecutor/JavaProcessJobTest.java
+++ b/unit/java/azkaban/test/jobExecutor/JavaProcessJobTest.java
@@ -30,7 +30,7 @@ public class JavaProcessJobTest
     " By JULIE BOSMAN \n" +
     "Published: August 11, 2010 \n" +
     " \n" +
-    "Twelve years later, it may be Joe Fox�s turn to worry. Readers have gone from skipping small \n" +
+    "Twelve years later, it may be Joe Fox's turn to worry. Readers have gone from skipping small \n" +
     "bookstores to wondering if they need bookstores at all. More people are ordering books online  \n" +
     "or plucking them from the best-seller bin at Wal-Mart";
 
@@ -103,7 +103,7 @@ public class JavaProcessJobTest
   @Test
   public void testJavaJob() throws Exception {
     /* initialize the Props */
-    props.put(JavaProcessJob.JOB_CLASS, "azkaban.test.jobExecutor.WordCountLocal");
+    props.put(JavaProcessJob.JAVA_CLASS, "azkaban.test.jobExecutor.WordCountLocal");
     props.put(ProcessJob.WORKING_DIR, ".");
     props.put("input", inputFile);
     props.put("output", outputFile);
@@ -114,7 +114,7 @@ public class JavaProcessJobTest
   @Test
   public void testJavaJobHashmap() throws Exception {
     /* initialize the Props */
-    props.put(JavaProcessJob.JOB_CLASS, "azkaban.test.executor.SleepJavaJob");
+    props.put(JavaProcessJob.JAVA_CLASS, "azkaban.test.executor.SleepJavaJob");
     props.put("seconds", 1);
     props.put(ProcessJob.WORKING_DIR, ".");
     props.put("input", inputFile);
@@ -125,7 +125,7 @@ public class JavaProcessJobTest
   
   @Test
   public void testFailedJavaJob() throws Exception {
-    props.put(JavaProcessJob.JOB_CLASS, "azkaban.test.jobExecutor.WordCountLocal");
+    props.put(JavaProcessJob.JAVA_CLASS, "azkaban.test.jobExecutor.WordCountLocal");
     props.put(ProcessJob.WORKING_DIR, ".");
     props.put("input", errorInputFile);
     props.put("output", outputFile);
diff --git a/unit/java/azkaban/test/jobExecutor/WordCountLocal.java b/unit/java/azkaban/test/jobExecutor/WordCountLocal.java
index c22119e..d63fc39 100644
--- a/unit/java/azkaban/test/jobExecutor/WordCountLocal.java
+++ b/unit/java/azkaban/test/jobExecutor/WordCountLocal.java
@@ -3,15 +3,18 @@ package azkaban.test.jobExecutor;
 import java.io.BufferedReader;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
+import java.io.FileReader;
 import java.io.InputStreamReader;
 import java.io.PrintWriter;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.Properties;
 import java.util.StringTokenizer;
 
 import org.apache.log4j.Logger;
 
 import azkaban.jobExecutor.AbstractJob;
+import azkaban.jobExecutor.ProcessJob;
 import azkaban.utils.Props;
 
 public class WordCountLocal extends AbstractJob {
@@ -20,6 +23,13 @@ public class WordCountLocal extends AbstractJob {
     private String _output = null;
     private Map<String, Integer> _dic = new HashMap<String,Integer>();
     
+    public static void main(String[] args) throws Exception {
+    		String propsFile = System.getenv(ProcessJob.JOB_PROP_ENV);
+    		System.out.println("propsFile: " + propsFile);
+		Props prop = new Props(null, propsFile);
+    		WordCountLocal instance = new WordCountLocal("", prop);
+    		instance.run();
+    }
     public WordCountLocal(String id, Props prop)
     {
         super(id, Logger.getLogger(WordCountLocal.class));
diff --git a/unit/java/azkaban/test/utils/EmailMessageTest.java b/unit/java/azkaban/test/utils/EmailMessageTest.java
index 43bf216..8ab509e 100644
--- a/unit/java/azkaban/test/utils/EmailMessageTest.java
+++ b/unit/java/azkaban/test/utils/EmailMessageTest.java
@@ -3,8 +3,10 @@ package azkaban.test.utils;
 import java.io.IOException;
 
 import javax.mail.MessagingException;
+
 import org.junit.After;
 import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Test;
 
 import azkaban.utils.EmailMessage;
@@ -29,6 +31,7 @@ public class EmailMessageTest {
 	public void tearDown() throws Exception {
 	}
 
+	@Ignore
 	@Test
 	public void testSendEmail() throws IOException {
 		em.addToAddress(toAddr);
diff --git a/unit/java/azkaban/test/utils/PropsUtilsTest.java b/unit/java/azkaban/test/utils/PropsUtilsTest.java
index 6b34b48..75bc979 100644
--- a/unit/java/azkaban/test/utils/PropsUtilsTest.java
+++ b/unit/java/azkaban/test/utils/PropsUtilsTest.java
@@ -51,6 +51,19 @@ public class PropsUtilsTest {
 	}
 	
 	@Test
+	public void testInvalidSyntax() throws Exception {
+		Props propsGrandParent = new Props();
+		Props propsParent = new Props(propsGrandParent);
+		Props props = new Props(propsParent);
+		
+		propsParent.put("my", "name");
+		props.put("res1", "$(my)");
+		
+		Props resolved = PropsUtils.resolveProps(props);
+		Assert.assertEquals("$(my)", resolved.get("res1"));
+	}
+	
+	@Test
 	public void testExpressionResolution() throws IOException {
 		Props props = Props.of(
 			"normkey", "normal",