Repository: cloudslang/cloud-slang
Issue: False validation error

if an input has the tag private: true, it should not be accessible to the user at runtime:

> 11:36:02 [ERROR] Failed to extract metadata for file: 'c:\\Users\\moldovas\\cloudslang\\cloud-slang-content\\content\\io\\cloudslang\\base\\datetime\\get_time.sl'.
> Error for executable io.cloudslang.base.datetime.get_time: Input 'localeLang' is missing description.
> 
> ```
> - localeLang:
>     default: ${get("locale_lang", "en")}
>     private: true
> ```


Changed files:
cloudslang-content-verifier/src/test/java/io/cloudslang/lang/tools/build/validation/StaticValidatorTest.java
cloudslang-content-verifier/src/main/java/io/cloudslang/lang/tools/build/validation/StaticValidatorImpl.java

diff --git a/cloudslang-content-verifier/src/main/java/io/cloudslang/lang/tools/build/validation/StaticValidatorImpl.java b/cloudslang-content-verifier/src/main/java/io/cloudslang/lang/tools/build/validation/StaticValidatorImpl.java
index ed6f7ca2f..55bb76bc6 100644
--- a/cloudslang-content-verifier/src/main/java/io/cloudslang/lang/tools/build/validation/StaticValidatorImpl.java
+++ b/cloudslang-content-verifier/src/main/java/io/cloudslang/lang/tools/build/validation/StaticValidatorImpl.java
@@ -13,6 +13,7 @@ import io.cloudslang.lang.compiler.Extension;
 import io.cloudslang.lang.compiler.modeller.model.Executable;
 import io.cloudslang.lang.compiler.modeller.model.Metadata;
 import io.cloudslang.lang.entities.bindings.InOutParam;
+import io.cloudslang.lang.entities.bindings.Input;
 import org.apache.commons.collections4.ListUtils;
 import org.apache.commons.lang.Validate;
 import org.springframework.stereotype.Component;
@@ -55,7 +56,8 @@ public class StaticValidatorImpl implements StaticValidator {
         for (InOutParam inOutParam : ListUtils.emptyIfNull(inOutParams)) {
             if (metadataInOutParams == null) {
                 throw new MetadataMissingException(errorMessagePrefix + "s are missing description entirely.");
-            } else if (metadataInOutParams.get(inOutParam.getName()) == null) {
+            } else if (metadataInOutParams.get(inOutParam.getName()) == null &&
+                    (!(inOutParam instanceof Input) || !((Input) inOutParam).isPrivateInput())) {
                 throw new MetadataMissingException(errorMessagePrefix + " '" + inOutParam.getName() + "' is missing description.");
             }
         }
diff --git a/cloudslang-content-verifier/src/test/java/io/cloudslang/lang/tools/build/validation/StaticValidatorTest.java b/cloudslang-content-verifier/src/test/java/io/cloudslang/lang/tools/build/validation/StaticValidatorTest.java
index 55c8f0caf..75608c5d1 100644
--- a/cloudslang-content-verifier/src/test/java/io/cloudslang/lang/tools/build/validation/StaticValidatorTest.java
+++ b/cloudslang-content-verifier/src/test/java/io/cloudslang/lang/tools/build/validation/StaticValidatorTest.java
@@ -54,7 +54,8 @@ public class StaticValidatorTest {
         List<Input> inputList = Lists.newArrayList(new Input.InputBuilder("input1", "value1").build(),
                 new Input.InputBuilder("input2", "value2").build(),
                 new Input.InputBuilder("input3", "value3").build());
-        Flow newExecutable = new Flow(null, null, null, "no_dependencies", "empty_flow", inputList, null, null, new HashSet<String>(), SYSTEM_PROPERTY_DEPENDENCIES);
+        Flow newExecutable = new Flow(null, null, null, "no_dependencies", "empty_flow", inputList, null, null,
+                new HashSet<String>(), SYSTEM_PROPERTY_DEPENDENCIES);
         Metadata metadata = new Metadata();
         Map<String, String> inputMap = new HashMap<>();
         inputMap.put("input1", "description1");
@@ -63,7 +64,25 @@ public class StaticValidatorTest {
 
         exception.expect(RuntimeException.class);
         exception.expectMessage("Error for executable no_dependencies.empty_flow: Input 'input3' is missing description.");
-        staticValidator.validateSlangFile(new File(getClass().getResource("/no_dependencies/empty_flow.sl").toURI()), newExecutable, metadata, true);
+        staticValidator.validateSlangFile(new File(getClass().getResource("/no_dependencies/empty_flow.sl").toURI()),
+                newExecutable, metadata, true);
+    }
+
+    @Test
+    public void missingDescriptionForPrivateInputInput() throws URISyntaxException {
+        List<Input> inputList = Lists.newArrayList(new Input.InputBuilder("input1", "value1").build(),
+                new Input.InputBuilder("input2", "value2").build(),
+                new Input.InputBuilder("input3", "value3").withPrivateInput(true).build());
+        Flow newExecutable = new Flow(null, null, null, "no_dependencies", "empty_flow", inputList, null, null,
+                new HashSet<String>(), SYSTEM_PROPERTY_DEPENDENCIES);
+        Metadata metadata = new Metadata();
+        Map<String, String> inputMap = new HashMap<>();
+        inputMap.put("input1", "description1");
+        inputMap.put("input2", "description2");
+        metadata.setInputs(inputMap);
+
+        staticValidator.validateSlangFile(new File(getClass().getResource("/no_dependencies/empty_flow.sl").toURI()),
+                newExecutable, metadata, true);
     }
 
     @Test