2
\$\begingroup\$

I have this JSON schema:

 {  
   "name":{  
      "first":{  
     "attributeValue":"firstName",
     "attributeType":1,
     "dataType":1
      },
      "last":{  
     "attributeValue":"lastName",
     "attributeType":1,
     "dataType":1
      }
   },
   "age":{  
      "attributeValue":"age",
      "attributeType":1,
      "dataType":2
   },
   "address":{  
      "number":{  
     "attributeValue":"number",
     "attributeType":1,
     "dataType":1
      },
      "street":{  
     "attributeValue":"street",
     "attributeType":1,
     "dataType":1
      },
      "city":{  
     "attributeValue":"city",
     "attributeType":1,
     "dataType":1
      },
      "country":{  
     "attributeValue":"country",
     "attributeType":1,
     "dataType":1
      }
   },
   "fullName":{  
      "attributeValue":"#firstName.concat(' ').concat(#lastName)",
      "attributeType":2,
      "dataType":1
   }
}

In here, each node that has attributeValue, dataType and attributeType nodes are called Field. Every other parent node is a handler. "name" is a handler which has "first" and "last" fields. But for age, since there is no parent key, there should be a handler created named "age" and a field "age" should be added to that. Handlers can have handlers. Handlers have fields in them.

Here is the Handler object representation:

  public interface Handler<T> {
     void addField(Field field);
    void addHandler(Handler handler);
     String getName();
     List<Field> getFields();
     T handle(T target);
  }

Here is the field representation:

  public interface Field<T> {
      void setValue(String value);
      T getField();
     String getFieldName();
  }

Now I need to parse the json schema and return a list of handlers:

   private List<Handler> parseJsonSchema(Handler handler, String jsonSchema) throws JSONMapperException {
    List<Handler> handlerList = new ArrayList<>();
    boolean isParentLeaf = false;
    Field<ObjectNode> objectNodeField = null;
    try {
        JsonNode rootNode = objectMapper.readTree(jsonSchema);
        Iterator<Map.Entry<String, JsonNode>> childrenIterator = rootNode.fields();
        while (childrenIterator.hasNext()) {
        Map.Entry<String, JsonNode> field = childrenIterator.next();
        System.out.println("Key: " + field.getKey() + "\tValue:" + field.getValue());
        if (field.getValue().has("attributeValue") && field.getValue().has("attributeType")
                && field.getValue().has("dataType")) {
            if (handler == null) {
                handler = jsonNodeHandlerFactory.create(field.getKey());
                isParentLeaf = true;
            }
            JsonNode valueNode = field.getValue();
            //String fieldName = valueNode.get("attributeValue").toString();
            String fieldName = field.getKey();
            String dataType = valueNode.get("dataType").toString();
            switch (dataType) {
                case "1":
                    objectNodeField = dataFieldFactory.createStringField(fieldName);
                    break;
                case "2":
                    objectNodeField = dataFieldFactory.createIntField(fieldName);
                    break;
                case "3":
                    objectNodeField = dataFieldFactory.createBooleanField(fieldName);
                    break;
                default:
                    break;
            }
            handler.addField(objectNodeField);
            if(isParentLeaf) {
                handlerList.add(handler);
                handler =null;
            }
        } else {
            handler = jsonNodeHandlerFactory.create(field.getKey());
            List<Handler> handlers = parseJsonSchema(handler, field.getValue().toString());
            for (Handler handler1 : handlers) {
                if(handler != null) { //means we already have a handler and we've come into another handler
                    handler.addHandler(handler1);
                    handlerList.add(handler);
                } else {
                    handlerList.add(handler1);
                }
            }
            handler = null;
        }
        if ((handler != null && handler.getFields().size() == rootNode.size())) {
            handlerList.add(handler);
        }
        }
    } catch (IOException e) {
        logger.error(JSON_SCHEMA_PARSE_EXCEPTION, e);
        throw new JSONMapperException(JSON_SCHEMA_PARSE_EXCEPTION);
    }
    return handlerList;
    }

But it overrides handlers, when there are handlers within handlers. Also, it looks pretty clumsy with too many null assignments and if checks. Is there a better way to do what this method is already doing? That is, return the schema as a list of handlers.

\$\endgroup\$

0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.