From 8f470ec47d2e8bb2f294ae8f6222489061431d06 Mon Sep 17 00:00:00 2001 From: pritha-tarento Date: Mon, 25 Mar 2019 17:42:12 +0530 Subject: [PATCH 1/6] Issue OS-VT-2 Providers added --- .../providers/SampleViewFunctionProvider.java | 31 ++++++++++++ .../io/opensaber/views/EvaluatorFactory.java | 34 ++++++++++++++ .../java/io/opensaber/views/IEvaluator.java | 10 ++++ .../io/opensaber/views/ProviderEvaluator.java | 47 +++++++++++++++++++ .../views/SampleViewFunctionProvider.java | 13 ----- .../java/io/opensaber/views/Transformer.java | 12 +++-- .../java/io/opensaber/views/ViewTemplate.java | 2 +- 7 files changed, 131 insertions(+), 18 deletions(-) create mode 100644 src/main/java/io/opensaber/providers/SampleViewFunctionProvider.java create mode 100644 src/main/java/io/opensaber/views/EvaluatorFactory.java create mode 100644 src/main/java/io/opensaber/views/IEvaluator.java create mode 100644 src/main/java/io/opensaber/views/ProviderEvaluator.java delete mode 100644 src/main/java/io/opensaber/views/SampleViewFunctionProvider.java diff --git a/src/main/java/io/opensaber/providers/SampleViewFunctionProvider.java b/src/main/java/io/opensaber/providers/SampleViewFunctionProvider.java new file mode 100644 index 0000000..896a0d1 --- /dev/null +++ b/src/main/java/io/opensaber/providers/SampleViewFunctionProvider.java @@ -0,0 +1,31 @@ +package io.opensaber.provider; + +import io.opensaber.views.IViewFunctionProvider; +import java.util.List; +/** + * This class is a sample implementation class of IViewFunctionProvider + * + */ +public class SampleViewFunctionProvider implements IViewFunctionProvider { + + @Override + public String doAction(List values) { + // doing a simple concat for the values + return concat(values); + } + + /** + * simple concat for the values as string and comma(',') as seperator + * + * @param args + * @return + */ + public String concat(List args) { + String res = ""; + for (Object arg : args) { + res = res.toString().isEmpty() ? arg.toString() : (res + ", " + arg.toString()); + } + return res; + } + +} diff --git a/src/main/java/io/opensaber/views/EvaluatorFactory.java b/src/main/java/io/opensaber/views/EvaluatorFactory.java new file mode 100644 index 0000000..3665b62 --- /dev/null +++ b/src/main/java/io/opensaber/views/EvaluatorFactory.java @@ -0,0 +1,34 @@ +package io.opensaber.views; + +public class EvaluatorFactory { + + public static final String concat = "concat"; + public static final String userDefinedConcat = "userDefinedConcat"; + public static final String customDefinedConcat = "customDefinedConcat"; + /** + * returns the instance of IEvaluator implementations (like:FunctionEvaluator, ProviderEvaluator + * @param functionName + * @param function + * @return + */ + public static IEvaluator getInstance(String functionName, FieldFunction function){ + IEvaluator evaluator = null; + switch(functionName){ + + case concat : + evaluator = new FunctionEvaluator(function); + break; + case userDefinedConcat : + evaluator = new ProviderEvaluator(function); + break; + case customDefinedConcat : + break; + default : + evaluator = new FunctionEvaluator(function); + break; + } + + return evaluator; + } + +} diff --git a/src/main/java/io/opensaber/views/IEvaluator.java b/src/main/java/io/opensaber/views/IEvaluator.java new file mode 100644 index 0000000..c5ff8ba --- /dev/null +++ b/src/main/java/io/opensaber/views/IEvaluator.java @@ -0,0 +1,10 @@ +package io.opensaber.views; + +public interface IEvaluator { + /** + * evaluates to provide result + * From a given expression, a provider class, a reference template of a sview template + * @return + */ + public T evaluate(); +} diff --git a/src/main/java/io/opensaber/views/ProviderEvaluator.java b/src/main/java/io/opensaber/views/ProviderEvaluator.java new file mode 100644 index 0000000..fdc98f7 --- /dev/null +++ b/src/main/java/io/opensaber/views/ProviderEvaluator.java @@ -0,0 +1,47 @@ +package io.opensaber.views; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class ProviderEvaluator implements IEvaluator { + + private static Logger logger = LoggerFactory.getLogger(ProviderEvaluator.class); + + private FieldFunction function; + + public ProviderEvaluator(FieldFunction function) { + this.function = function; + } + + @Override + public Object evaluate() { + IViewFunctionProvider viewFuntionProvider = getInstance(function.getExpression()); + Object result = viewFuntionProvider.doAction(function.getArgValues()); + return result; + } + + /** + * invokes instance for given providerName + * @param providerName full qualified name of class + * @return + */ + public IViewFunctionProvider getInstance(String providerName) { + + IViewFunctionProvider viewFunctionProvider = null; + try { + if (providerName == null || providerName.isEmpty()) { + throw new IllegalArgumentException( + "view function provider class {} cannot be instantiate with empty value"); + } + Class advisorClass = Class.forName(providerName); + viewFunctionProvider = (IViewFunctionProvider) advisorClass.newInstance(); + logger.info("Invoked view function provider class with classname: " + providerName); + + } catch (ClassNotFoundException | SecurityException | InstantiationException | IllegalAccessException + | IllegalArgumentException e) { + logger.error("view function provider class {} cannot be instantiate with exception:", providerName, e); + } + return viewFunctionProvider; + } + +} diff --git a/src/main/java/io/opensaber/views/SampleViewFunctionProvider.java b/src/main/java/io/opensaber/views/SampleViewFunctionProvider.java deleted file mode 100644 index a2b7c50..0000000 --- a/src/main/java/io/opensaber/views/SampleViewFunctionProvider.java +++ /dev/null @@ -1,13 +0,0 @@ -package io.opensaber.views; - -import java.util.List; - -public class SampleViewFunctionProvider implements IViewFunctionProvider { - - @Override - public String doAction(List values) { - // TODO Auto-generated method stub - return null; - } - -} diff --git a/src/main/java/io/opensaber/views/Transformer.java b/src/main/java/io/opensaber/views/Transformer.java index 206ebb3..b046c69 100644 --- a/src/main/java/io/opensaber/views/Transformer.java +++ b/src/main/java/io/opensaber/views/Transformer.java @@ -42,11 +42,15 @@ public JsonNode transform(ViewTemplate viewTemplate, ObjectNode node) { } function.setArgValues(actualValues); - FunctionEvaluator evaluator = new FunctionEvaluator(function); - + IEvaluator evaluator = EvaluatorFactory.getInstance(fdName, function); + if (field.getDisplay()) { - result.put(field.getTitle(), evaluator.evaluate().toString()); - + Object evaluatedValue = evaluator.evaluate(); + if(evaluatedValue instanceof String){ + result.put(field.getTitle(), evaluatedValue.toString()); + } else { + result.set(field.getTitle(), JsonNodeFactory.instance.pojoNode(evaluatedValue)); + } } } else if (field.getDisplay()) { result.set(field.getTitle(), nodeAttrs.get(field.getName())); diff --git a/src/main/java/io/opensaber/views/ViewTemplate.java b/src/main/java/io/opensaber/views/ViewTemplate.java index 9563e50..fc30ed7 100644 --- a/src/main/java/io/opensaber/views/ViewTemplate.java +++ b/src/main/java/io/opensaber/views/ViewTemplate.java @@ -49,7 +49,7 @@ public String getExpression(String name) { String expression = ""; for (FunctionDefinition fd : this.getFunctionDefinitions()) { if (fd.getName().compareTo(name) == 0) { - expression = fd.getResult(); + expression = fd.getResult()!=null ? fd.getResult(): fd.getProvider(); } } From 42b21509ce5da877bd6ff102f9f1d7cd2382948c Mon Sep 17 00:00:00 2001 From: pritha-tarento Date: Mon, 25 Mar 2019 17:46:36 +0530 Subject: [PATCH 2/6] Issue #OS-VT-2 FunctionEvaluator impls IEvaluator --- src/main/java/io/opensaber/views/FunctionEvaluator.java | 3 ++- src/test/java/io/opensaber/views/TransformerTest.java | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/io/opensaber/views/FunctionEvaluator.java b/src/main/java/io/opensaber/views/FunctionEvaluator.java index c2bcb83..e555673 100644 --- a/src/main/java/io/opensaber/views/FunctionEvaluator.java +++ b/src/main/java/io/opensaber/views/FunctionEvaluator.java @@ -7,7 +7,7 @@ import org.apache.commons.jexl2.MapContext; -public class FunctionEvaluator { +public class FunctionEvaluator implements IEvaluator{ private static final JexlEngine jexl = new JexlEngine(); private JexlContext jexlContext = new MapContext(); @@ -34,6 +34,7 @@ private void prepare() { setContextArgs(); } + @Override public Object evaluate() { prepare(); Object result = jexlExpression.evaluate(jexlContext); diff --git a/src/test/java/io/opensaber/views/TransformerTest.java b/src/test/java/io/opensaber/views/TransformerTest.java index f627d5e..1566255 100644 --- a/src/test/java/io/opensaber/views/TransformerTest.java +++ b/src/test/java/io/opensaber/views/TransformerTest.java @@ -51,7 +51,7 @@ public void testTransformForMathVT() throws JsonProcessingException, IOException ViewTemplate viewTemplate = new ObjectMapper().readValue(viewTemplateJson, ViewTemplate.class); JsonNode actualnode = transformer.transform(viewTemplate, node); - JsonNode expectedNode = new ObjectMapper().readTree("{\"Math\":{\"addend_A\":5,\"addend_B\":2,\"SUM\":\"7\"}}"); + JsonNode expectedNode = new ObjectMapper().readTree("{\"Math\":{\"addend_A\":5,\"addend_B\":2,\"SUM\":7}}"); assertEquals(expectedNode.toString(), actualnode.toString()); } From 8a8738b4d591bed5cf7bfc39a30e55fbfb4ffe94 Mon Sep 17 00:00:00 2001 From: pritha-tarento Date: Mon, 25 Mar 2019 18:55:31 +0530 Subject: [PATCH 3/6] Issue OS-VT-2 re-work on the viewtemplate: added getFunctionDefinition(), EvaluatorFactor:getInstance() modified --- .../io/opensaber/views/EvaluatorFactory.java | 36 +++++++++---------- .../java/io/opensaber/views/Transformer.java | 10 +++--- .../java/io/opensaber/views/ViewTemplate.java | 21 ++++++----- src/test/resources/personVT1.json | 4 +-- 4 files changed, 33 insertions(+), 38 deletions(-) diff --git a/src/main/java/io/opensaber/views/EvaluatorFactory.java b/src/main/java/io/opensaber/views/EvaluatorFactory.java index 3665b62..3dc6bf0 100644 --- a/src/main/java/io/opensaber/views/EvaluatorFactory.java +++ b/src/main/java/io/opensaber/views/EvaluatorFactory.java @@ -1,33 +1,31 @@ package io.opensaber.views; +import java.util.List; + public class EvaluatorFactory { - public static final String concat = "concat"; - public static final String userDefinedConcat = "userDefinedConcat"; - public static final String customDefinedConcat = "customDefinedConcat"; /** * returns the instance of IEvaluator implementations (like:FunctionEvaluator, ProviderEvaluator - * @param functionName - * @param function + * + * @param actualValues + * @param functiondef * @return */ - public static IEvaluator getInstance(String functionName, FieldFunction function){ + public static IEvaluator getInstance(List actualValues, FunctionDefinition functiondef) { IEvaluator evaluator = null; - switch(functionName){ - - case concat : + FieldFunction function = null; + + if (functiondef.getResult() != null) { + function = new FieldFunction(functiondef.getResult()); + function.setArgValues(actualValues); evaluator = new FunctionEvaluator(function); - break; - case userDefinedConcat : + + } else if (functiondef.getProvider() != null) { + function = new FieldFunction(functiondef.getProvider()); + function.setArgValues(actualValues); evaluator = new ProviderEvaluator(function); - break; - case customDefinedConcat : - break; - default : - evaluator = new FunctionEvaluator(function); - break; - } - + } + return evaluator; } diff --git a/src/main/java/io/opensaber/views/Transformer.java b/src/main/java/io/opensaber/views/Transformer.java index b046c69..aa1df75 100644 --- a/src/main/java/io/opensaber/views/Transformer.java +++ b/src/main/java/io/opensaber/views/Transformer.java @@ -32,18 +32,15 @@ public JsonNode transform(ViewTemplate viewTemplate, ObjectNode node) { if (functionStr != null) { String fdName = field.getFunctioName(); - String expression = viewTemplate.getExpression(fdName); - - FieldFunction function = new FieldFunction(expression); + FunctionDefinition funcDef = viewTemplate.getFunctionDefinition(fdName); + List actualValues = new ArrayList<>(); for (String oneArg : field.getArgNames()) { // Cut off the $ actualValues.add(ValueType.getValue(nodeAttrs.get(oneArg.substring(1)))); } - function.setArgValues(actualValues); - - IEvaluator evaluator = EvaluatorFactory.getInstance(fdName, function); + IEvaluator evaluator = EvaluatorFactory.getInstance(actualValues, funcDef); if (field.getDisplay()) { Object evaluatedValue = evaluator.evaluate(); if(evaluatedValue instanceof String){ @@ -60,5 +57,6 @@ public JsonNode transform(ViewTemplate viewTemplate, ObjectNode node) { logger.debug("Node transformation result: " + result); return JsonNodeFactory.instance.objectNode().set(subjectType, result); } + } diff --git a/src/main/java/io/opensaber/views/ViewTemplate.java b/src/main/java/io/opensaber/views/ViewTemplate.java index fc30ed7..5a31847 100644 --- a/src/main/java/io/opensaber/views/ViewTemplate.java +++ b/src/main/java/io/opensaber/views/ViewTemplate.java @@ -38,25 +38,24 @@ public List getFields() { public void setFields(List fields) { this.fields = fields; } + /** - * return the result for a given function name - * Example: "arg1 + \" : \" + arg2" - * - * @param name function name (like concat) - * @return result + * return a FunctionDefinition for a given function name + + * @param name function name (like concat) + * @return */ - public String getExpression(String name) { - String expression = ""; + public FunctionDefinition getFunctionDefinition(String name) { + FunctionDefinition functionDef = null; for (FunctionDefinition fd : this.getFunctionDefinitions()) { if (fd.getName().compareTo(name) == 0) { - expression = fd.getResult()!=null ? fd.getResult(): fd.getProvider(); - + functionDef = fd; } } - if (expression.isEmpty()) { + if (functionDef == null) { logger.error("No function definition specified for function - " + name); throw new IllegalArgumentException("No function definition specified for function - " + name); } - return expression; + return functionDef; } } diff --git a/src/test/resources/personVT1.json b/src/test/resources/personVT1.json index cdf99d8..539fb1c 100644 --- a/src/test/resources/personVT1.json +++ b/src/test/resources/personVT1.json @@ -18,7 +18,7 @@ }, { "title": "Name in passport", - "function": "#/functionDefinitions/concat($lastName, $firstName)", + "function": "#/functionDefinitions/userDefinedConcat($lastName, $firstName)", "$comment": "This is a virtual field not defined in the schema" }, { @@ -37,7 +37,7 @@ }, { "name" : "userDefinedConcat", - "provider": "user.opensaber.registry.utils.MySplConcatenator", + "provider": "io.opensaber.provider.SampleViewFunctionProvider", "$comment" : "Complex operations that cannot be expressed easily in an in-line function definition can be implemented as a class. " }, { From ef782837fc3022e5e31597aa19e073ef23eab5ca Mon Sep 17 00:00:00 2001 From: pritha-tarento Date: Mon, 25 Mar 2019 19:29:43 +0530 Subject: [PATCH 4/6] Issue #OS-VT-2 refactoring minor, testcase changes --- src/main/java/io/opensaber/views/EvaluatorFactory.java | 2 +- src/main/java/io/opensaber/views/Transformer.java | 2 +- src/test/java/io/opensaber/views/ViewTemplateTest.java | 8 ++++---- src/test/resources/personVT1.json | 2 ++ 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/main/java/io/opensaber/views/EvaluatorFactory.java b/src/main/java/io/opensaber/views/EvaluatorFactory.java index 3dc6bf0..a41279b 100644 --- a/src/main/java/io/opensaber/views/EvaluatorFactory.java +++ b/src/main/java/io/opensaber/views/EvaluatorFactory.java @@ -11,7 +11,7 @@ public class EvaluatorFactory { * @param functiondef * @return */ - public static IEvaluator getInstance(List actualValues, FunctionDefinition functiondef) { + public static IEvaluator getInstance(FunctionDefinition functiondef, List actualValues) { IEvaluator evaluator = null; FieldFunction function = null; diff --git a/src/main/java/io/opensaber/views/Transformer.java b/src/main/java/io/opensaber/views/Transformer.java index aa1df75..1826d0a 100644 --- a/src/main/java/io/opensaber/views/Transformer.java +++ b/src/main/java/io/opensaber/views/Transformer.java @@ -40,7 +40,7 @@ public JsonNode transform(ViewTemplate viewTemplate, ObjectNode node) { actualValues.add(ValueType.getValue(nodeAttrs.get(oneArg.substring(1)))); } - IEvaluator evaluator = EvaluatorFactory.getInstance(actualValues, funcDef); + IEvaluator evaluator = EvaluatorFactory.getInstance(funcDef, actualValues); if (field.getDisplay()) { Object evaluatedValue = evaluator.evaluate(); if(evaluatedValue instanceof String){ diff --git a/src/test/java/io/opensaber/views/ViewTemplateTest.java b/src/test/java/io/opensaber/views/ViewTemplateTest.java index 7bba99b..581f2e4 100644 --- a/src/test/java/io/opensaber/views/ViewTemplateTest.java +++ b/src/test/java/io/opensaber/views/ViewTemplateTest.java @@ -26,17 +26,17 @@ public void init() { @Test public void testGetExpression() { - String result = vt.getExpression("name"); + FunctionDefinition fd = vt.getFunctionDefinition("name"); - assertEquals(vt.getFunctionDefinitions().get(0).getResult(), result); - assertNotEquals("unexpected", result); + assertEquals(vt.getFunctionDefinitions().get(0).getResult(), fd.getResult()); + assertNotEquals("unexpected", fd.getResult()); } @Test(expected = IllegalArgumentException.class) public void testGetExpressionException() { - vt.getExpression("invalid_name"); + vt.getFunctionDefinition("invalid_name"); } diff --git a/src/test/resources/personVT1.json b/src/test/resources/personVT1.json index 539fb1c..d325c33 100644 --- a/src/test/resources/personVT1.json +++ b/src/test/resources/personVT1.json @@ -37,6 +37,8 @@ }, { "name" : "userDefinedConcat", + "result": "arg1 + \", \" + arg2", + "provider": "io.opensaber.provider.SampleViewFunctionProvider", "$comment" : "Complex operations that cannot be expressed easily in an in-line function definition can be implemented as a class. " }, From 553d09bc8f5c48b70c0949187973a9987685b0b2 Mon Sep 17 00:00:00 2001 From: pritha-tarento Date: Mon, 25 Mar 2019 21:54:31 +0530 Subject: [PATCH 5/6] Issue #OS-VT-2 PR comments addressed --- .../io/opensaber/views/EvaluatorFactory.java | 18 +++++-- .../provider}/SampleViewFunctionProvider.java | 2 +- .../io/opensaber/views/TransformerTest.java | 50 +++++++++++++------ src/test/resources/person_inline.json | 49 ++++++++++++++++++ .../{personVT1.json => person_provider.json} | 4 +- src/test/resources/person_ref.json | 49 ++++++++++++++++++ 6 files changed, 148 insertions(+), 24 deletions(-) rename src/main/java/{io/opensaber/providers => org/example/provider}/SampleViewFunctionProvider.java (96%) create mode 100644 src/test/resources/person_inline.json rename src/test/resources/{personVT1.json => person_provider.json} (91%) create mode 100644 src/test/resources/person_ref.json diff --git a/src/main/java/io/opensaber/views/EvaluatorFactory.java b/src/main/java/io/opensaber/views/EvaluatorFactory.java index a41279b..e8c12e1 100644 --- a/src/main/java/io/opensaber/views/EvaluatorFactory.java +++ b/src/main/java/io/opensaber/views/EvaluatorFactory.java @@ -16,17 +16,27 @@ public static IEvaluator getInstance(FunctionDefinition functiondef, Lis FieldFunction function = null; if (functiondef.getResult() != null) { - function = new FieldFunction(functiondef.getResult()); - function.setArgValues(actualValues); + function = getFieldFunction(functiondef.getResult(), actualValues); evaluator = new FunctionEvaluator(function); } else if (functiondef.getProvider() != null) { - function = new FieldFunction(functiondef.getProvider()); - function.setArgValues(actualValues); + function = getFieldFunction(functiondef.getProvider(), actualValues); evaluator = new ProviderEvaluator(function); } return evaluator; } + /** + * Creates FieldFunction and sets argValues + * @param expression + * @param actualValues + * @return + */ + private static FieldFunction getFieldFunction(String expression, List actualValues) { + FieldFunction function = new FieldFunction(expression); + function.setArgValues(actualValues); + return function; + + } } diff --git a/src/main/java/io/opensaber/providers/SampleViewFunctionProvider.java b/src/main/java/org/example/provider/SampleViewFunctionProvider.java similarity index 96% rename from src/main/java/io/opensaber/providers/SampleViewFunctionProvider.java rename to src/main/java/org/example/provider/SampleViewFunctionProvider.java index 896a0d1..693e896 100644 --- a/src/main/java/io/opensaber/providers/SampleViewFunctionProvider.java +++ b/src/main/java/org/example/provider/SampleViewFunctionProvider.java @@ -1,4 +1,4 @@ -package io.opensaber.provider; +package org.example.provider; import io.opensaber.views.IViewFunctionProvider; import java.util.List; diff --git a/src/test/java/io/opensaber/views/TransformerTest.java b/src/test/java/io/opensaber/views/TransformerTest.java index 1566255..9f82eec 100644 --- a/src/test/java/io/opensaber/views/TransformerTest.java +++ b/src/test/java/io/opensaber/views/TransformerTest.java @@ -18,27 +18,30 @@ public class TransformerTest { private Transformer transformer = new Transformer(); @Test - public void testTransformForPersonVT() throws JsonProcessingException, IOException{ - String personJson = "{\"Person\": " + - " {\"nationalIdentifier\":\"nid823\"," + - " \"firstName\":\"Ram\"," + - " \"lastName\":\"Moorthy\"," + - " \"gender\":\"MALE\"," + - " \"dob\":\"1990-12-10\"}}"; - ObjectNode personNode = (ObjectNode) new ObjectMapper().readTree(personJson); - String viewTemplateJson = readFileContent("personVT1.json"); - ViewTemplate viewTemplate = new ObjectMapper().readValue(viewTemplateJson, ViewTemplate.class); + public void testTransformForPersonFunction() throws JsonProcessingException, IOException{ - JsonNode actualnode = transformer.transform(viewTemplate, personNode); + ObjectNode personNode = getPerson(); + ViewTemplate viewTemplate = getViewTemplatePerson("person_inline.json"); - System.out.println("actualnode = "+actualnode); + JsonNode actualnode = transformer.transform(viewTemplate, personNode); JsonNode expectedNode = new ObjectMapper().readTree("{\"Person\":{\"NAME\":\"Ram\",\"lastName\":\"Moorthy\",\"Name in passport\":\"Moorthy, Ram\"}}"); - System.out.println("expectedNode = "+expectedNode); assertEquals(expectedNode, actualnode); } + @Test + public void testTransformForPersonProvider() throws JsonProcessingException, IOException{ + + ObjectNode personNode = getPerson(); + ViewTemplate viewTemplate = getViewTemplatePerson("person_provider.json"); + + JsonNode actualnode = transformer.transform(viewTemplate, personNode); + JsonNode expectedNode = new ObjectMapper().readTree("{\"Person\":{\"NAME\":\"Ram\",\"lastName\":\"Moorthy\",\"Name in passport\":\"Moorthy, Ram\"}}"); + + assertEquals(expectedNode, actualnode); + + } @Test public void testTransformForMathVT() throws JsonProcessingException, IOException{ @@ -47,14 +50,29 @@ public void testTransformForMathVT() throws JsonProcessingException, IOException " \"b\": 2 }}"; ObjectNode node = (ObjectNode) new ObjectMapper().readTree(mathProblem); - String viewTemplateJson = readFileContent("mathVT1.json"); - ViewTemplate viewTemplate = new ObjectMapper().readValue(viewTemplateJson, ViewTemplate.class); - + ViewTemplate viewTemplate = getViewTemplatePerson("mathVT1.json"); JsonNode actualnode = transformer.transform(viewTemplate, node); JsonNode expectedNode = new ObjectMapper().readTree("{\"Math\":{\"addend_A\":5,\"addend_B\":2,\"SUM\":7}}"); assertEquals(expectedNode.toString(), actualnode.toString()); } + + + private ViewTemplate getViewTemplatePerson(String personJsonFileName) throws JsonProcessingException, IOException{ + + String viewTemplateJson = readFileContent(personJsonFileName); + return new ObjectMapper().readValue(viewTemplateJson, ViewTemplate.class); + } + + private ObjectNode getPerson() throws JsonProcessingException, IOException{ + String personJson = "{\"Person\": " + + " {\"nationalIdentifier\":\"nid823\"," + + " \"firstName\":\"Ram\"," + + " \"lastName\":\"Moorthy\"," + + " \"gender\":\"MALE\"," + + " \"dob\":\"1990-12-10\"}}"; + return (ObjectNode) new ObjectMapper().readTree(personJson); + } private static String readFileContent(String fileName) { InputStream in; diff --git a/src/test/resources/person_inline.json b/src/test/resources/person_inline.json new file mode 100644 index 0000000..b9b19b4 --- /dev/null +++ b/src/test/resources/person_inline.json @@ -0,0 +1,49 @@ +{ + "id": "personDefaultView1", + "subject": "Person", + "fields": [ + { + "name": "firstName", + "title": "NAME" + }, + { + "name": "lastName", + "display": true + }, + { + "name": "nationalIdentifier", + "title": "AADHAAR number", + "display": false, + "$comment": "This field is not displayable, but needed for internal referencing" + }, + { + "title": "Name in passport", + "function": "#/functionDefinitions/concat($lastName, $firstName)", + "$comment": "This is a virtual field not defined in the schema" + }, + { + "name": "vehicles", + "$comment": "Nested child entity which may be of interest", + "fetchType": "eager", + "viewTemplateName": "vehicleNameView.json", + "display": false + } + ], + "functionDefinitions": [ + { + "name" : "concat", + "result": "arg1 + \", \" + arg2", + "$comment": "arg1 and arg2 will be populated with parameter values at runtime" + }, + { + "name" : "userDefinedConcat", + "provider": "org.example.provider.SampleViewFunctionProvider", + "$comment" : "Complex operations that cannot be expressed easily in an in-line function definition can be implemented as a class. " + }, + { + "name" : "customDefinedConcat", + "$ref": "AnotherViewTemplate.json#functionDefinitions/customDefinedConcat", + "$comment": "The functions defined in another template can be reused" + } + ] +} \ No newline at end of file diff --git a/src/test/resources/personVT1.json b/src/test/resources/person_provider.json similarity index 91% rename from src/test/resources/personVT1.json rename to src/test/resources/person_provider.json index d325c33..955daac 100644 --- a/src/test/resources/personVT1.json +++ b/src/test/resources/person_provider.json @@ -37,9 +37,7 @@ }, { "name" : "userDefinedConcat", - "result": "arg1 + \", \" + arg2", - - "provider": "io.opensaber.provider.SampleViewFunctionProvider", + "provider": "org.example.provider.SampleViewFunctionProvider", "$comment" : "Complex operations that cannot be expressed easily in an in-line function definition can be implemented as a class. " }, { diff --git a/src/test/resources/person_ref.json b/src/test/resources/person_ref.json new file mode 100644 index 0000000..225e8dd --- /dev/null +++ b/src/test/resources/person_ref.json @@ -0,0 +1,49 @@ +{ + "id": "personDefaultView1", + "subject": "Person", + "fields": [ + { + "name": "firstName", + "title": "NAME" + }, + { + "name": "lastName", + "display": true + }, + { + "name": "nationalIdentifier", + "title": "AADHAAR number", + "display": false, + "$comment": "This field is not displayable, but needed for internal referencing" + }, + { + "title": "Name in passport", + "function": "#/functionDefinitions/customDefinedConcat($lastName, $firstName)", + "$comment": "This is a virtual field not defined in the schema" + }, + { + "name": "vehicles", + "$comment": "Nested child entity which may be of interest", + "fetchType": "eager", + "viewTemplateName": "vehicleNameView.json", + "display": false + } + ], + "functionDefinitions": [ + { + "name" : "concat", + "result": "arg1 + \", \" + arg2", + "$comment": "arg1 and arg2 will be populated with parameter values at runtime" + }, + { + "name" : "userDefinedConcat", + "provider": "io.opensaber.provider.SampleViewFunctionProvider", + "$comment" : "Complex operations that cannot be expressed easily in an in-line function definition can be implemented as a class. " + }, + { + "name" : "customDefinedConcat", + "$ref": "AnotherViewTemplate.json#functionDefinitions/customDefinedConcat", + "$comment": "The functions defined in another template can be reused" + } + ] +} \ No newline at end of file From 89fd558104e649cbe1cf2c28011f30464a91b440 Mon Sep 17 00:00:00 2001 From: pritha-tarento Date: Tue, 26 Mar 2019 13:16:24 +0530 Subject: [PATCH 6/6] Issue #OS-VT-2 person_vt.json includes sample for inline expression and provider as examples --- .../provider/SampleViewFunctionProvider.java | 2 +- .../io/opensaber/views/TransformerTest.java | 17 +------ src/test/resources/person_provider.json | 49 ------------------- src/test/resources/person_ref.json | 2 +- .../{person_inline.json => person_vt.json} | 8 ++- 5 files changed, 11 insertions(+), 67 deletions(-) delete mode 100644 src/test/resources/person_provider.json rename src/test/resources/{person_inline.json => person_vt.json} (83%) diff --git a/src/main/java/org/example/provider/SampleViewFunctionProvider.java b/src/main/java/org/example/provider/SampleViewFunctionProvider.java index 693e896..dc58620 100644 --- a/src/main/java/org/example/provider/SampleViewFunctionProvider.java +++ b/src/main/java/org/example/provider/SampleViewFunctionProvider.java @@ -23,7 +23,7 @@ public String doAction(List values) { public String concat(List args) { String res = ""; for (Object arg : args) { - res = res.toString().isEmpty() ? arg.toString() : (res + ", " + arg.toString()); + res = res.toString().isEmpty() ? arg.toString() : (res + " : " + arg.toString()); } return res; } diff --git a/src/test/java/io/opensaber/views/TransformerTest.java b/src/test/java/io/opensaber/views/TransformerTest.java index 9f82eec..94ecd4b 100644 --- a/src/test/java/io/opensaber/views/TransformerTest.java +++ b/src/test/java/io/opensaber/views/TransformerTest.java @@ -21,23 +21,10 @@ public class TransformerTest { public void testTransformForPersonFunction() throws JsonProcessingException, IOException{ ObjectNode personNode = getPerson(); - ViewTemplate viewTemplate = getViewTemplatePerson("person_inline.json"); + ViewTemplate viewTemplate = getViewTemplatePerson("person_vt.json"); JsonNode actualnode = transformer.transform(viewTemplate, personNode); - JsonNode expectedNode = new ObjectMapper().readTree("{\"Person\":{\"NAME\":\"Ram\",\"lastName\":\"Moorthy\",\"Name in passport\":\"Moorthy, Ram\"}}"); - - assertEquals(expectedNode, actualnode); - - } - - @Test - public void testTransformForPersonProvider() throws JsonProcessingException, IOException{ - - ObjectNode personNode = getPerson(); - ViewTemplate viewTemplate = getViewTemplatePerson("person_provider.json"); - - JsonNode actualnode = transformer.transform(viewTemplate, personNode); - JsonNode expectedNode = new ObjectMapper().readTree("{\"Person\":{\"NAME\":\"Ram\",\"lastName\":\"Moorthy\",\"Name in passport\":\"Moorthy, Ram\"}}"); + JsonNode expectedNode = new ObjectMapper().readTree("{\"Person\":{\"NAME\":\"Ram\",\"lastName\":\"Moorthy\",\"Name in passport\":\"Moorthy, Ram\",\"Name as in DL\":\"Ram : Moorthy\"}}"); assertEquals(expectedNode, actualnode); diff --git a/src/test/resources/person_provider.json b/src/test/resources/person_provider.json deleted file mode 100644 index 955daac..0000000 --- a/src/test/resources/person_provider.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "id": "personDefaultView1", - "subject": "Person", - "fields": [ - { - "name": "firstName", - "title": "NAME" - }, - { - "name": "lastName", - "display": true - }, - { - "name": "nationalIdentifier", - "title": "AADHAAR number", - "display": false, - "$comment": "This field is not displayable, but needed for internal referencing" - }, - { - "title": "Name in passport", - "function": "#/functionDefinitions/userDefinedConcat($lastName, $firstName)", - "$comment": "This is a virtual field not defined in the schema" - }, - { - "name": "vehicles", - "$comment": "Nested child entity which may be of interest", - "fetchType": "eager", - "viewTemplateName": "vehicleNameView.json", - "display": false - } - ], - "functionDefinitions": [ - { - "name" : "concat", - "result": "arg1 + \", \" + arg2", - "$comment": "arg1 and arg2 will be populated with parameter values at runtime" - }, - { - "name" : "userDefinedConcat", - "provider": "org.example.provider.SampleViewFunctionProvider", - "$comment" : "Complex operations that cannot be expressed easily in an in-line function definition can be implemented as a class. " - }, - { - "name" : "customDefinedConcat", - "$ref": "AnotherViewTemplate.json#functionDefinitions/customDefinedConcat", - "$comment": "The functions defined in another template can be reused" - } - ] -} \ No newline at end of file diff --git a/src/test/resources/person_ref.json b/src/test/resources/person_ref.json index 225e8dd..08318e5 100644 --- a/src/test/resources/person_ref.json +++ b/src/test/resources/person_ref.json @@ -42,7 +42,7 @@ }, { "name" : "customDefinedConcat", - "$ref": "AnotherViewTemplate.json#functionDefinitions/customDefinedConcat", + "result": "arg1 + \", \" + arg2", "$comment": "The functions defined in another template can be reused" } ] diff --git a/src/test/resources/person_inline.json b/src/test/resources/person_vt.json similarity index 83% rename from src/test/resources/person_inline.json rename to src/test/resources/person_vt.json index b9b19b4..4da4033 100644 --- a/src/test/resources/person_inline.json +++ b/src/test/resources/person_vt.json @@ -21,6 +21,12 @@ "function": "#/functionDefinitions/concat($lastName, $firstName)", "$comment": "This is a virtual field not defined in the schema" }, + { + "title": "Name as in DL", + "function": "#/functionDefinitions/userDefinedConcat($firstName, $lastName)", + "$comment": "This is a virtual field not defined in the schema" + }, + { "name": "vehicles", "$comment": "Nested child entity which may be of interest", @@ -42,7 +48,7 @@ }, { "name" : "customDefinedConcat", - "$ref": "AnotherViewTemplate.json#functionDefinitions/customDefinedConcat", + "$ref": "person_ref.json#functionDefinitions/customDefinedConcat", "$comment": "The functions defined in another template can be reused" } ]