azkaban-developers

Details

diff --git a/azkaban-common/src/main/java/azkaban/jobcallback/JobCallbackConstants.java b/azkaban-common/src/main/java/azkaban/jobcallback/JobCallbackConstants.java
index b66eb58..122640d 100644
--- a/azkaban-common/src/main/java/azkaban/jobcallback/JobCallbackConstants.java
+++ b/azkaban-common/src/main/java/azkaban/jobcallback/JobCallbackConstants.java
@@ -6,6 +6,10 @@ public interface JobCallbackConstants {
   public static final String HTTP_GET = "GET";
   public static final String HTTP_POST = "POST";
 
+  public static final String MAX_POST_BODY_LENGTH_PROPERTY_KEY =
+      "jobcallback.max.body.length";
+  public static final int DEFAULT_POST_BODY_LENGTH = 4096;
+
   public static final String MAX_CALLBACK_COUNT_PROPERTY_KEY =
       "jobcallback.max_count";
   public static final int DEFAULT_MAX_CALLBACK_COUNT = 3;
@@ -24,12 +28,12 @@ public interface JobCallbackConstants {
   public static final String JOB_CALLBACK_BODY_TEMPLATE = "job.notification."
       + STATUS_TOKEN + "." + SEQUENCE_TOKEN + ".body";
 
-  public static final String SERVER_TOKEN = "?{server}";
-  public static final String PROJECT_TOKEN = "?{project}";
-  public static final String FLOW_TOKEN = "?{flow}";
-  public static final String EXECUTION_ID_TOKEN = "?{executionId}";
-  public static final String JOB_TOKEN = "?{job}";
-  public static final String JOB_STATUS_TOKEN = "?{status}";
+  public static final String CONTEXT_SERVER_TOKEN = "?{server}";
+  public static final String CONTEXT_PROJECT_TOKEN = "?{project}";
+  public static final String CONTEXT_FLOW_TOKEN = "?{flow}";
+  public static final String CONTEXT_EXECUTION_ID_TOKEN = "?{executionId}";
+  public static final String CONTEXT_JOB_TOKEN = "?{job}";
+  public static final String CONTEXT_JOB_STATUS_TOKEN = "?{status}";
 
   public static final String HEADER_ELEMENT_DELIMITER = "\r\n";
   public static final String HEADER_NAME_VALUE_DELIMITER = ":";
diff --git a/azkaban-common/src/main/java/azkaban/jobcallback/JobCallbackValidator.java b/azkaban-common/src/main/java/azkaban/jobcallback/JobCallbackValidator.java
index b4848d2..9f9ea38 100644
--- a/azkaban-common/src/main/java/azkaban/jobcallback/JobCallbackValidator.java
+++ b/azkaban-common/src/main/java/azkaban/jobcallback/JobCallbackValidator.java
@@ -1,10 +1,12 @@
 package azkaban.jobcallback;
 
+import static azkaban.jobcallback.JobCallbackConstants.DEFAULT_POST_BODY_LENGTH;
 import static azkaban.jobcallback.JobCallbackConstants.HTTP_GET;
 import static azkaban.jobcallback.JobCallbackConstants.HTTP_POST;
 import static azkaban.jobcallback.JobCallbackConstants.JOB_CALLBACK_BODY_TEMPLATE;
 import static azkaban.jobcallback.JobCallbackConstants.JOB_CALLBACK_REQUEST_METHOD_TEMPLATE;
 import static azkaban.jobcallback.JobCallbackConstants.JOB_CALLBACK_URL_TEMPLATE;
+import static azkaban.jobcallback.JobCallbackConstants.MAX_POST_BODY_LENGTH_PROPERTY_KEY;
 import static azkaban.jobcallback.JobCallbackConstants.SEQUENCE_TOKEN;
 import static azkaban.jobcallback.JobCallbackConstants.STATUS_TOKEN;
 
@@ -41,10 +43,15 @@ public class JobCallbackValidator {
             JobCallbackConstants.MAX_CALLBACK_COUNT_PROPERTY_KEY,
             JobCallbackConstants.DEFAULT_MAX_CALLBACK_COUNT);
 
+    int maxPostBodyLength =
+        serverProps.getInt(MAX_POST_BODY_LENGTH_PROPERTY_KEY,
+            DEFAULT_POST_BODY_LENGTH);
+
     int totalCallbackCount = 0;
     for (JobCallbackStatusEnum jobStatus : JobCallbackStatusEnum.values()) {
       totalCallbackCount +=
-          validateBasedOnStatus(jobProps, errors, jobStatus, maxNumCallback);
+          validateBasedOnStatus(jobProps, errors, jobStatus, maxNumCallback,
+              maxPostBodyLength);
     }
 
     logger.info("Found " + totalCallbackCount + " job callbacks for job "
@@ -54,44 +61,48 @@ public class JobCallbackValidator {
 
   private static int validateBasedOnStatus(Props jobProps,
       Collection<String> errors, JobCallbackStatusEnum jobStatus,
-      int maxNumCallback) {
+      int maxNumCallback, int maxPostBodyLength) {
 
     int callbackCount = 0;
     // replace property templates with status
     String jobCallBackUrl =
-        JOB_CALLBACK_URL_TEMPLATE.replace(STATUS_TOKEN, jobStatus.name()
+        JOB_CALLBACK_URL_TEMPLATE.replaceFirst(STATUS_TOKEN, jobStatus.name()
             .toLowerCase());
 
     String requestMethod =
-        JOB_CALLBACK_REQUEST_METHOD_TEMPLATE.replace(STATUS_TOKEN, jobStatus
-            .name().toLowerCase());
+        JOB_CALLBACK_REQUEST_METHOD_TEMPLATE.replaceFirst(STATUS_TOKEN,
+            jobStatus.name().toLowerCase());
 
     String httpBody =
-        JOB_CALLBACK_BODY_TEMPLATE.replace(STATUS_TOKEN, jobStatus.name()
+        JOB_CALLBACK_BODY_TEMPLATE.replaceFirst(STATUS_TOKEN, jobStatus.name()
             .toLowerCase());
 
     for (int i = 1; i <= maxNumCallback; i++) {
       // callback url
       String callbackUrlKey =
-          jobCallBackUrl.replace(SEQUENCE_TOKEN, Integer.toString(i));
+          jobCallBackUrl.replaceFirst(SEQUENCE_TOKEN, Integer.toString(i));
       String callbackUrlValue = jobProps.get(callbackUrlKey);
 
       if (callbackUrlValue == null || callbackUrlValue.length() == 0) {
         break;
       } else {
         String requestMethodKey =
-            requestMethod.replace(SEQUENCE_TOKEN, Integer.toString(i));
+            requestMethod.replaceFirst(SEQUENCE_TOKEN, Integer.toString(i));
 
         String methodValue = jobProps.getString(requestMethodKey, HTTP_GET);
 
         if (HTTP_POST.equals(methodValue)) {
           // now try to get the post body
           String postBodyKey =
-              httpBody.replace(SEQUENCE_TOKEN, Integer.toString(i));
+              httpBody.replaceFirst(SEQUENCE_TOKEN, Integer.toString(i));
           String postBodyValue = jobProps.get(postBodyKey);
           if (postBodyValue == null || postBodyValue.length() == 0) {
             errors.add("No POST body was specified for job callback '"
                 + callbackUrlValue + "'");
+          } else if (postBodyValue.length() > maxPostBodyLength) {
+            errors.add("POST body length is : " + postBodyValue.length()
+                + " which is larger than supported length of "
+                + maxPostBodyLength);
           } else {
             callbackCount++;
           }
diff --git a/azkaban-common/src/test/java/azkaban/jobcallback/JobCallbackValidatorTest.java b/azkaban-common/src/test/java/azkaban/jobcallback/JobCallbackValidatorTest.java
index f20497a..53c76ff 100644
--- a/azkaban-common/src/test/java/azkaban/jobcallback/JobCallbackValidatorTest.java
+++ b/azkaban-common/src/test/java/azkaban/jobcallback/JobCallbackValidatorTest.java
@@ -2,6 +2,7 @@ package azkaban.jobcallback;
 
 import static azkaban.jobcallback.JobCallbackConstants.DEFAULT_MAX_CALLBACK_COUNT;
 import static azkaban.jobcallback.JobCallbackConstants.MAX_CALLBACK_COUNT_PROPERTY_KEY;
+import static azkaban.jobcallback.JobCallbackConstants.MAX_POST_BODY_LENGTH_PROPERTY_KEY;
 
 import java.util.HashSet;
 import java.util.Set;
@@ -167,4 +168,37 @@ public class JobCallbackValidatorTest {
 
     Assert.assertEquals(0, errors.size());
   }
+
+  @Test
+  public void postBodyLengthTooLargeTest() {
+
+    Props jobProps = new Props();
+    jobProps.put("job.notification."
+        + JobCallbackStatusEnum.FAILURE.name().toLowerCase() + ".1.url",
+        "http://www.linkedin.com");
+
+    jobProps.put("job.notification."
+        + JobCallbackStatusEnum.FAILURE.name().toLowerCase() + ".1.method",
+        JobCallbackConstants.HTTP_POST);
+
+    String postBodyValue = "abcdefghijklmnopqrstuvwxyz";
+
+    int postBodyLength = 20;
+    Assert.assertTrue(postBodyValue.length() > postBodyLength);
+    jobProps.put("job.notification."
+        + JobCallbackStatusEnum.FAILURE.name().toLowerCase() + ".1.body",
+        postBodyValue);
+
+    Props localServerProps = new Props();
+    localServerProps.put(MAX_POST_BODY_LENGTH_PROPERTY_KEY, postBodyLength);
+
+    Set<String> errors = new HashSet<String>();
+
+    Assert.assertEquals(0, JobCallbackValidator.validate("bogusJob",
+        localServerProps, jobProps, errors));
+
+    System.out.println(errors);
+    Assert.assertEquals(1, errors.size());
+
+  }
 }
diff --git a/azkaban-execserver/src/main/java/azkaban/execapp/event/JobCallbackManager.java b/azkaban-execserver/src/main/java/azkaban/execapp/event/JobCallbackManager.java
index 6b31314..2714c12 100644
--- a/azkaban-execserver/src/main/java/azkaban/execapp/event/JobCallbackManager.java
+++ b/azkaban-execserver/src/main/java/azkaban/execapp/event/JobCallbackManager.java
@@ -1,6 +1,6 @@
 package azkaban.execapp.event;
 
-import static azkaban.jobcallback.JobCallbackConstants.JOB_TOKEN;
+import static azkaban.jobcallback.JobCallbackConstants.CONTEXT_JOB_TOKEN;
 import static azkaban.jobcallback.JobCallbackStatusEnum.COMPLETED;
 import static azkaban.jobcallback.JobCallbackStatusEnum.FAILURE;
 import static azkaban.jobcallback.JobCallbackStatusEnum.STARTED;
@@ -162,7 +162,7 @@ public class JobCallbackManager implements EventListener {
       jobCallBackStatusEnum = null; // to be explicit
     }
 
-    String jobId = contextInfo.get(JOB_TOKEN);
+    String jobId = contextInfo.get(CONTEXT_JOB_TOKEN);
 
     if (jobCallBackStatusEnum != null) {
       List<HttpRequestBase> jobCallbackHttpRequests =
@@ -219,7 +219,7 @@ public class JobCallbackManager implements EventListener {
           JobCallbackUtil.parseJobCallbackProperties(props, STARTED,
               contextInfo, maxNumCallBack, jobRunner.getLogger());
 
-      String jobId = contextInfo.get(JOB_TOKEN);
+      String jobId = contextInfo.get(CONTEXT_JOB_TOKEN);
       String msg =
           String.format("Making %d job callbacks for job %s for jobStatus: %s",
               jobCallbackHttpRequests.size(), jobId, STARTED.name());
diff --git a/azkaban-execserver/src/main/java/azkaban/execapp/event/JobCallbackUtil.java b/azkaban-execserver/src/main/java/azkaban/execapp/event/JobCallbackUtil.java
index cd576b7..a6ed354 100644
--- a/azkaban-execserver/src/main/java/azkaban/execapp/event/JobCallbackUtil.java
+++ b/azkaban-execserver/src/main/java/azkaban/execapp/event/JobCallbackUtil.java
@@ -1,8 +1,8 @@
 package azkaban.execapp.event;
 
-import static azkaban.jobcallback.JobCallbackConstants.EXECUTION_ID_TOKEN;
+import static azkaban.jobcallback.JobCallbackConstants.CONTEXT_EXECUTION_ID_TOKEN;
 import static azkaban.jobcallback.JobCallbackConstants.FIRST_JOB_CALLBACK_URL_TEMPLATE;
-import static azkaban.jobcallback.JobCallbackConstants.FLOW_TOKEN;
+import static azkaban.jobcallback.JobCallbackConstants.CONTEXT_FLOW_TOKEN;
 import static azkaban.jobcallback.JobCallbackConstants.HEADER_ELEMENT_DELIMITER;
 import static azkaban.jobcallback.JobCallbackConstants.HEADER_NAME_VALUE_DELIMITER;
 import static azkaban.jobcallback.JobCallbackConstants.HTTP_GET;
@@ -11,11 +11,11 @@ import static azkaban.jobcallback.JobCallbackConstants.JOB_CALLBACK_BODY_TEMPLAT
 import static azkaban.jobcallback.JobCallbackConstants.JOB_CALLBACK_REQUEST_HEADERS_TEMPLATE;
 import static azkaban.jobcallback.JobCallbackConstants.JOB_CALLBACK_REQUEST_METHOD_TEMPLATE;
 import static azkaban.jobcallback.JobCallbackConstants.JOB_CALLBACK_URL_TEMPLATE;
-import static azkaban.jobcallback.JobCallbackConstants.JOB_STATUS_TOKEN;
-import static azkaban.jobcallback.JobCallbackConstants.JOB_TOKEN;
-import static azkaban.jobcallback.JobCallbackConstants.PROJECT_TOKEN;
+import static azkaban.jobcallback.JobCallbackConstants.CONTEXT_JOB_STATUS_TOKEN;
+import static azkaban.jobcallback.JobCallbackConstants.CONTEXT_JOB_TOKEN;
+import static azkaban.jobcallback.JobCallbackConstants.CONTEXT_PROJECT_TOKEN;
 import static azkaban.jobcallback.JobCallbackConstants.SEQUENCE_TOKEN;
-import static azkaban.jobcallback.JobCallbackConstants.SERVER_TOKEN;
+import static azkaban.jobcallback.JobCallbackConstants.CONTEXT_SERVER_TOKEN;
 import static azkaban.jobcallback.JobCallbackConstants.STATUS_TOKEN;
 
 import java.io.UnsupportedEncodingException;
@@ -25,6 +25,7 @@ import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.regex.Pattern;
 
 import org.apache.http.Header;
 import org.apache.http.client.methods.HttpGet;
@@ -159,7 +160,7 @@ public class JobCallbackUtil {
             // update the wiki about skipping callback url if body is missing
             privateLogger.warn("Missing value for key: " + postBodyKey
                 + " skipping job callback '" + callbackUrl + " for job "
-                + contextInfo.get(JOB_TOKEN));
+                + contextInfo.get(CONTEXT_JOB_TOKEN));
           } else {
             // put together an URL
             HttpPost httpPost = new HttpPost(callbackUrlWithTokenReplaced);
@@ -219,7 +220,7 @@ public class JobCallbackUtil {
 
   private static String replaceStatusToken(String template,
       JobCallbackStatusEnum status) {
-    return template.replace(STATUS_TOKEN, status.name().toLowerCase());
+    return template.replaceFirst(STATUS_TOKEN, status.name().toLowerCase());
   }
 
   private static StringEntity createStringEntity(String str) {
@@ -250,12 +251,12 @@ public class JobCallbackUtil {
       String jobId = node.getId();
 
       Map<String, String> result = new HashMap<String, String>();
-      result.put(SERVER_TOKEN, server);
-      result.put(PROJECT_TOKEN, projectName);
-      result.put(FLOW_TOKEN, flowName);
-      result.put(EXECUTION_ID_TOKEN, executionId);
-      result.put(JOB_TOKEN, jobId);
-      result.put(JOB_STATUS_TOKEN, node.getStatus().name().toLowerCase());
+      result.put(CONTEXT_SERVER_TOKEN, server);
+      result.put(CONTEXT_PROJECT_TOKEN, projectName);
+      result.put(CONTEXT_FLOW_TOKEN, flowName);
+      result.put(CONTEXT_EXECUTION_ID_TOKEN, executionId);
+      result.put(CONTEXT_JOB_TOKEN, jobId);
+      result.put(CONTEXT_JOB_STATUS_TOKEN, node.getStatus().name().toLowerCase());
 
       /*
        * if (node.getStatus() == Status.SUCCEEDED || node.getStatus() ==
@@ -285,26 +286,26 @@ public class JobCallbackUtil {
 
     String result = value;
     String tokenValue =
-        encodeQueryParam(contextInfo.get(SERVER_TOKEN), withEncoding);
-    result = result.replace(SERVER_TOKEN, tokenValue);
+        encodeQueryParam(contextInfo.get(CONTEXT_SERVER_TOKEN), withEncoding);
+    result = result.replaceFirst(Pattern.quote(CONTEXT_SERVER_TOKEN), tokenValue);
 
-    tokenValue = encodeQueryParam(contextInfo.get(PROJECT_TOKEN), withEncoding);
-    result = result.replace(PROJECT_TOKEN, tokenValue);
+    tokenValue = encodeQueryParam(contextInfo.get(CONTEXT_PROJECT_TOKEN), withEncoding);
+    result = result.replaceFirst(Pattern.quote(CONTEXT_PROJECT_TOKEN), tokenValue);
 
-    tokenValue = encodeQueryParam(contextInfo.get(FLOW_TOKEN), withEncoding);
-    result = result.replace(FLOW_TOKEN, tokenValue);
+    tokenValue = encodeQueryParam(contextInfo.get(CONTEXT_FLOW_TOKEN), withEncoding);
+    result = result.replaceFirst(Pattern.quote(CONTEXT_FLOW_TOKEN), tokenValue);
 
-    tokenValue = encodeQueryParam(contextInfo.get(JOB_TOKEN), withEncoding);
-    result = result.replace(JOB_TOKEN, tokenValue);
+    tokenValue = encodeQueryParam(contextInfo.get(CONTEXT_JOB_TOKEN), withEncoding);
+    result = result.replaceFirst(Pattern.quote(CONTEXT_JOB_TOKEN), tokenValue);
 
     tokenValue =
-        encodeQueryParam(contextInfo.get(EXECUTION_ID_TOKEN), withEncoding);
-    result = result.replace(EXECUTION_ID_TOKEN, tokenValue);
+        encodeQueryParam(contextInfo.get(CONTEXT_EXECUTION_ID_TOKEN), withEncoding);
+    result = result.replaceFirst(Pattern.quote(CONTEXT_EXECUTION_ID_TOKEN), tokenValue);
 
     tokenValue =
-        encodeQueryParam(contextInfo.get(JOB_STATUS_TOKEN), withEncoding);
+        encodeQueryParam(contextInfo.get(CONTEXT_JOB_STATUS_TOKEN), withEncoding);
 
-    result = result.replace(JOB_STATUS_TOKEN, tokenValue);
+    result = result.replaceFirst(Pattern.quote(CONTEXT_JOB_STATUS_TOKEN), tokenValue);
 
     return result;
   }
diff --git a/azkaban-execserver/src/test/java/azkaban/execapp/event/JobCallbackRequestMakerTest.java b/azkaban-execserver/src/test/java/azkaban/execapp/event/JobCallbackRequestMakerTest.java
index f86e2ec..bd14da4 100644
--- a/azkaban-execserver/src/test/java/azkaban/execapp/event/JobCallbackRequestMakerTest.java
+++ b/azkaban-execserver/src/test/java/azkaban/execapp/event/JobCallbackRequestMakerTest.java
@@ -1,11 +1,11 @@
 package azkaban.execapp.event;
 
-import static azkaban.jobcallback.JobCallbackConstants.EXECUTION_ID_TOKEN;
-import static azkaban.jobcallback.JobCallbackConstants.FLOW_TOKEN;
-import static azkaban.jobcallback.JobCallbackConstants.JOB_STATUS_TOKEN;
-import static azkaban.jobcallback.JobCallbackConstants.JOB_TOKEN;
-import static azkaban.jobcallback.JobCallbackConstants.PROJECT_TOKEN;
-import static azkaban.jobcallback.JobCallbackConstants.SERVER_TOKEN;
+import static azkaban.jobcallback.JobCallbackConstants.CONTEXT_EXECUTION_ID_TOKEN;
+import static azkaban.jobcallback.JobCallbackConstants.CONTEXT_FLOW_TOKEN;
+import static azkaban.jobcallback.JobCallbackConstants.CONTEXT_JOB_STATUS_TOKEN;
+import static azkaban.jobcallback.JobCallbackConstants.CONTEXT_JOB_TOKEN;
+import static azkaban.jobcallback.JobCallbackConstants.CONTEXT_PROJECT_TOKEN;
+import static azkaban.jobcallback.JobCallbackConstants.CONTEXT_SERVER_TOKEN;
 
 import java.io.BufferedReader;
 import java.io.IOException;
@@ -62,12 +62,12 @@ public class JobCallbackRequestMakerTest {
       jobCBMaker = JobCallbackRequestMaker.getInstance();
 
       contextInfo = new HashMap<String, String>();
-      contextInfo.put(SERVER_TOKEN, SERVER_NAME);
-      contextInfo.put(PROJECT_TOKEN, PROJECT_NANE);
-      contextInfo.put(FLOW_TOKEN, FLOW_NANE);
-      contextInfo.put(EXECUTION_ID_TOKEN, EXECUTION_ID);
-      contextInfo.put(JOB_TOKEN, JOB_NANE);
-      contextInfo.put(JOB_STATUS_TOKEN, JobCallbackStatusEnum.STARTED.name());
+      contextInfo.put(CONTEXT_SERVER_TOKEN, SERVER_NAME);
+      contextInfo.put(CONTEXT_PROJECT_TOKEN, PROJECT_NANE);
+      contextInfo.put(CONTEXT_FLOW_TOKEN, FLOW_NANE);
+      contextInfo.put(CONTEXT_EXECUTION_ID_TOKEN, EXECUTION_ID);
+      contextInfo.put(CONTEXT_JOB_TOKEN, JOB_NANE);
+      contextInfo.put(CONTEXT_JOB_STATUS_TOKEN, JobCallbackStatusEnum.STARTED.name());
 
       embeddedJettyServer = new Server(PORT_NUMBER);
 
diff --git a/azkaban-execserver/src/test/java/azkaban/execapp/event/JobCallbackUtilTest.java b/azkaban-execserver/src/test/java/azkaban/execapp/event/JobCallbackUtilTest.java
index d5e0902..646f6e1 100644
--- a/azkaban-execserver/src/test/java/azkaban/execapp/event/JobCallbackUtilTest.java
+++ b/azkaban-execserver/src/test/java/azkaban/execapp/event/JobCallbackUtilTest.java
@@ -1,13 +1,13 @@
 package azkaban.execapp.event;
 
-import static azkaban.jobcallback.JobCallbackConstants.EXECUTION_ID_TOKEN;
-import static azkaban.jobcallback.JobCallbackConstants.FLOW_TOKEN;
+import static azkaban.jobcallback.JobCallbackConstants.CONTEXT_EXECUTION_ID_TOKEN;
+import static azkaban.jobcallback.JobCallbackConstants.CONTEXT_FLOW_TOKEN;
 import static azkaban.jobcallback.JobCallbackConstants.HTTP_GET;
 import static azkaban.jobcallback.JobCallbackConstants.HTTP_POST;
-import static azkaban.jobcallback.JobCallbackConstants.JOB_STATUS_TOKEN;
-import static azkaban.jobcallback.JobCallbackConstants.JOB_TOKEN;
-import static azkaban.jobcallback.JobCallbackConstants.PROJECT_TOKEN;
-import static azkaban.jobcallback.JobCallbackConstants.SERVER_TOKEN;
+import static azkaban.jobcallback.JobCallbackConstants.CONTEXT_JOB_STATUS_TOKEN;
+import static azkaban.jobcallback.JobCallbackConstants.CONTEXT_JOB_TOKEN;
+import static azkaban.jobcallback.JobCallbackConstants.CONTEXT_PROJECT_TOKEN;
+import static azkaban.jobcallback.JobCallbackConstants.CONTEXT_SERVER_TOKEN;
 
 import java.net.URLEncoder;
 import java.util.HashMap;
@@ -39,12 +39,12 @@ public class JobCallbackUtilTest {
   @BeforeClass
   public static void setup() {
     contextInfo = new HashMap<String, String>();
-    contextInfo.put(SERVER_TOKEN, SERVER_NAME);
-    contextInfo.put(PROJECT_TOKEN, PROJECT_NAME);
-    contextInfo.put(FLOW_TOKEN, FLOW_NAME);
-    contextInfo.put(EXECUTION_ID_TOKEN, EXECUTION_ID);
-    contextInfo.put(JOB_TOKEN, JOB_NAME);
-    contextInfo.put(JOB_STATUS_TOKEN, JOB_STATUS_NAME);
+    contextInfo.put(CONTEXT_SERVER_TOKEN, SERVER_NAME);
+    contextInfo.put(CONTEXT_PROJECT_TOKEN, PROJECT_NAME);
+    contextInfo.put(CONTEXT_FLOW_TOKEN, FLOW_NAME);
+    contextInfo.put(CONTEXT_EXECUTION_ID_TOKEN, EXECUTION_ID);
+    contextInfo.put(CONTEXT_JOB_TOKEN, JOB_NAME);
+    contextInfo.put(CONTEXT_JOB_STATUS_TOKEN, JOB_STATUS_NAME);
   }
 
   @Test
@@ -169,7 +169,7 @@ public class JobCallbackUtilTest {
   public void oneTokenTest() {
 
     String urlWithOneToken =
-        "http://www.linkedin.com?project=" + PROJECT_TOKEN + "&another=yes";
+        "http://www.linkedin.com?project=" + CONTEXT_PROJECT_TOKEN + "&another=yes";
 
     String result =
         JobCallbackUtil.replaceTokens(urlWithOneToken, contextInfo, true);
@@ -181,8 +181,8 @@ public class JobCallbackUtilTest {
   public void twoTokensTest() {
 
     String urlWithOneToken =
-        "http://www.linkedin.com?project=" + PROJECT_TOKEN + "&flow="
-            + FLOW_TOKEN;
+        "http://www.linkedin.com?project=" + CONTEXT_PROJECT_TOKEN + "&flow="
+            + CONTEXT_FLOW_TOKEN;
 
     String result =
         JobCallbackUtil.replaceTokens(urlWithOneToken, contextInfo, true);
@@ -195,9 +195,9 @@ public class JobCallbackUtilTest {
 
     String urlWithOneToken =
         "http://www.linkedin.com?server=" + SERVER_NAME + "&project="
-            + PROJECT_TOKEN + "&flow=" + FLOW_TOKEN + "&executionId="
-            + EXECUTION_ID_TOKEN + "&job=" + JOB_TOKEN + "&status="
-            + JOB_STATUS_TOKEN;
+            + CONTEXT_PROJECT_TOKEN + "&flow=" + CONTEXT_FLOW_TOKEN + "&executionId="
+            + CONTEXT_EXECUTION_ID_TOKEN + "&job=" + CONTEXT_JOB_TOKEN + "&status="
+            + CONTEXT_JOB_STATUS_TOKEN;
 
     String result =
         JobCallbackUtil.replaceTokens(urlWithOneToken, contextInfo, true);
@@ -217,15 +217,15 @@ public class JobCallbackUtilTest {
 
     Map<String, String> customContextInfo = new HashMap<String, String>();
     customContextInfo = new HashMap<String, String>();
-    customContextInfo.put(SERVER_TOKEN, SERVER_NAME);
-    customContextInfo.put(PROJECT_TOKEN, PROJECT_NAME);
-    customContextInfo.put(FLOW_TOKEN, FLOW_NAME);
-    customContextInfo.put(EXECUTION_ID_TOKEN, EXECUTION_ID);
-    customContextInfo.put(JOB_TOKEN, jobNameWithSpaces);
-    customContextInfo.put(JOB_STATUS_TOKEN, JOB_STATUS_NAME);
+    customContextInfo.put(CONTEXT_SERVER_TOKEN, SERVER_NAME);
+    customContextInfo.put(CONTEXT_PROJECT_TOKEN, PROJECT_NAME);
+    customContextInfo.put(CONTEXT_FLOW_TOKEN, FLOW_NAME);
+    customContextInfo.put(CONTEXT_EXECUTION_ID_TOKEN, EXECUTION_ID);
+    customContextInfo.put(CONTEXT_JOB_TOKEN, jobNameWithSpaces);
+    customContextInfo.put(CONTEXT_JOB_STATUS_TOKEN, JOB_STATUS_NAME);
 
     String urlWithOneToken =
-        "http://www.linkedin.com?job=" + JOB_TOKEN + "&flow=" + FLOW_TOKEN;
+        "http://www.linkedin.com?job=" + CONTEXT_JOB_TOKEN + "&flow=" + CONTEXT_FLOW_TOKEN;
 
     String result =
         JobCallbackUtil.replaceTokens(urlWithOneToken, customContextInfo, true);