[OLINGO-955] Fix NPE for ListProcessors
diff --git a/odata2-annotation-processor/annotation-processor-core/src/main/java/org/apache/olingo/odata2/annotation/processor/core/ListsProcessor.java b/odata2-annotation-processor/annotation-processor-core/src/main/java/org/apache/olingo/odata2/annotation/processor/core/ListsProcessor.java
index a03136b..df23b31 100644
--- a/odata2-annotation-processor/annotation-processor-core/src/main/java/org/apache/olingo/odata2/annotation/processor/core/ListsProcessor.java
+++ b/odata2-annotation-processor/annotation-processor-core/src/main/java/org/apache/olingo/odata2/annotation/processor/core/ListsProcessor.java
@@ -1431,9 +1431,9 @@
       final MethodExpression methodExpression = (MethodExpression) expression;
       final String first = evaluateExpression(data, methodExpression.getParameters().get(0));
       final String second = methodExpression.getParameterCount() > 1 ?
-          evaluateExpression(data, methodExpression.getParameters().get(1)) : null;
+          evaluateExpression(data, methodExpression.getParameters().get(1)) : "";
       final String third = methodExpression.getParameterCount() > 2 ?
-          evaluateExpression(data, methodExpression.getParameters().get(2)) : null;
+          evaluateExpression(data, methodExpression.getParameters().get(2)) : "";
 
       switch (methodExpression.getMethod()) {
       case ENDSWITH:
@@ -1449,8 +1449,9 @@
       case TRIM:
         return first.trim();
       case SUBSTRING:
-        final int offset = Integer.parseInt(second);
-        return first.substring(offset, offset + Integer.parseInt(third));
+        final int offset = second.length() == 0 ? 0 : Integer.parseInt(second);
+        final int length = third.length() == 0 ? 0 : Integer.parseInt(second);
+        return first.substring(offset, offset + length);
       case SUBSTRINGOF:
         return Boolean.toString(second.contains(first));
       case CONCAT:
diff --git a/odata2-lib/odata-ref/src/main/java/org/apache/olingo/odata2/ref/processor/ListsProcessor.java b/odata2-lib/odata-ref/src/main/java/org/apache/olingo/odata2/ref/processor/ListsProcessor.java
index 86ae0cb..fb48d5f 100644
--- a/odata2-lib/odata-ref/src/main/java/org/apache/olingo/odata2/ref/processor/ListsProcessor.java
+++ b/odata2-lib/odata-ref/src/main/java/org/apache/olingo/odata2/ref/processor/ListsProcessor.java
@@ -1438,26 +1438,27 @@
       final MethodExpression methodExpression = (MethodExpression) expression;
       final String first = evaluateExpression(data, methodExpression.getParameters().get(0));
       final String second = methodExpression.getParameterCount() > 1 ?
-          evaluateExpression(data, methodExpression.getParameters().get(1)) : null;
+          evaluateExpression(data, methodExpression.getParameters().get(1)) : "";
       final String third = methodExpression.getParameterCount() > 2 ?
-          evaluateExpression(data, methodExpression.getParameters().get(2)) : null;
+          evaluateExpression(data, methodExpression.getParameters().get(2)) : "";
 
       switch (methodExpression.getMethod()) {
-      case ENDSWITH:
-        return Boolean.toString(first.endsWith(second));
-      case INDEXOF:
-        return Integer.toString(first.indexOf(second));
-      case STARTSWITH:
-        return Boolean.toString(first.startsWith(second));
-      case TOLOWER:
-        return first.toLowerCase(Locale.ROOT);
-      case TOUPPER:
-        return first.toUpperCase(Locale.ROOT);
-      case TRIM:
-        return first.trim();
-      case SUBSTRING:
-        final int offset = Integer.parseInt(second);
-        return first.substring(offset, offset + Integer.parseInt(third));
+        case ENDSWITH:
+          return Boolean.toString(first.endsWith(second));
+        case INDEXOF:
+          return Integer.toString(first.indexOf(second));
+        case STARTSWITH:
+          return Boolean.toString(first.startsWith(second));
+        case TOLOWER:
+          return first.toLowerCase(Locale.ROOT);
+        case TOUPPER:
+          return first.toUpperCase(Locale.ROOT);
+        case TRIM:
+          return first.trim();
+        case SUBSTRING:
+          final int offset = second.length() == 0 ? 0 : Integer.parseInt(second);
+          final int length = third.length() == 0 ? 0 : Integer.parseInt(second);
+          return first.substring(offset, offset + length);
       case SUBSTRINGOF:
         return Boolean.toString(second.contains(first));
       case CONCAT: