-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #56 from codeblessing/main
sprint 2 completed
- Loading branch information
Showing
21 changed files
with
859 additions
and
90 deletions.
There are no files selected for viewing
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
87 changes: 87 additions & 0 deletions
87
src/main/java/pl/poznan/put/jsontools/logic/JsonTransformCountFieldsValues.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,87 @@ | ||
package pl.poznan.put.jsontools.logic; | ||
|
||
import com.fasterxml.jackson.core.JsonProcessingException; | ||
import com.fasterxml.jackson.databind.JsonNode; | ||
import com.fasterxml.jackson.databind.ObjectMapper; | ||
import com.fasterxml.jackson.databind.node.ObjectNode; | ||
import org.slf4j.Logger; | ||
import org.slf4j.LoggerFactory; | ||
import pl.poznan.put.jsontools.error.JsonToolsInvalidJsonError; | ||
|
||
import java.util.*; | ||
|
||
/** | ||
* Counts values in JSON file nodes. | ||
*/ | ||
public class JsonTransformCountFieldsValues extends JsonTransformer { | ||
/** | ||
* Class-level logger instance. | ||
*/ | ||
private static final Logger logger = LoggerFactory.getLogger(JsonTransformCountFieldsValues.class); | ||
/** | ||
* Object mapper to retrieve JSON structure from string. | ||
*/ | ||
private static final ObjectMapper objectMapper = new ObjectMapper(); | ||
|
||
/** | ||
* @param transform transform to be executed before flatten JSON. | ||
*/ | ||
public JsonTransformCountFieldsValues(JsonTransform transform) { | ||
super(transform); | ||
logger.info("CountFieldsValues transform created."); | ||
} | ||
|
||
/** | ||
* Counts values in JSON file fields and determines their type. | ||
* | ||
* @return Transformed JSON. | ||
*/ | ||
@Override | ||
public String execute() { | ||
String json = super.execute(); | ||
logger.debug("Executing counting nodes' values."); | ||
try { | ||
JsonNode jsonNode = objectMapper.readTree(json); | ||
JsonNode counted = count(jsonNode); | ||
|
||
return counted.toString(); | ||
} catch (JsonProcessingException e) { | ||
logger.error("Invalid JSON: " + json); | ||
throw new JsonToolsInvalidJsonError(e.getLocation().toString(), json); | ||
} | ||
} | ||
|
||
/** | ||
* Provides number of values for each JSON file attribute. | ||
* Checks whether the value is: | ||
* - object, | ||
* - array, | ||
* - text. | ||
* | ||
* @param jsonNode JsonNode to be transformed. | ||
* @return JSON with counted values per node in form of Jackson's ObjectNode. | ||
*/ | ||
private JsonNode count(JsonNode jsonNode) { | ||
|
||
List<Map.Entry<String, JsonNode>> fields = new ArrayList<>(); | ||
jsonNode.fields().forEachRemaining(fields::add); | ||
ObjectNode objectNode = objectMapper.createObjectNode(); | ||
|
||
for (var field : fields) { | ||
if (field.getValue().isArray()) { | ||
String fieldName = field.getKey(); | ||
int fieldValues = field.getValue().size(); | ||
objectNode.put(fieldName, fieldValues + " elements in array"); | ||
} else if (field.getValue().isObject()) { | ||
String fieldName = field.getKey(); | ||
int fieldValues = field.getValue().size(); | ||
objectNode.put(fieldName, fieldValues + " fields in object"); | ||
} else if (field.getValue().isEmpty()) { | ||
String fieldName = field.getKey(); | ||
objectNode.put(fieldName, 1 + " value in node"); | ||
} | ||
|
||
} | ||
return objectNode; | ||
} | ||
} |
49 changes: 49 additions & 0 deletions
49
src/main/java/pl/poznan/put/jsontools/logic/JsonTransformDeleteNulls.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,49 @@ | ||
package pl.poznan.put.jsontools.logic; | ||
|
||
|
||
import com.google.gson.Gson; | ||
import com.google.gson.GsonBuilder; | ||
import com.google.gson.JsonObject; | ||
import org.slf4j.Logger; | ||
import org.slf4j.LoggerFactory; | ||
import pl.poznan.put.jsontools.error.JsonToolsInvalidJsonError; | ||
|
||
/** | ||
* Class enables to get JSON with no empty fields. | ||
*/ | ||
public class JsonTransformDeleteNulls extends JsonTransformer { | ||
|
||
/** | ||
* Class-level logger instance. | ||
*/ | ||
private static final Logger _logger = LoggerFactory.getLogger(JsonTransformDeleteNulls.class); | ||
|
||
/** | ||
* @param transform transform to be executed before empty values removal. | ||
*/ | ||
public JsonTransformDeleteNulls(JsonTransform transform) { | ||
super(transform); | ||
_logger.debug("DeleteNulls transform created."); | ||
} | ||
|
||
/** | ||
* Removes attributes with empty values. | ||
* | ||
* @return Transformed JSON. | ||
*/ | ||
@Override | ||
public String execute() { | ||
String input = super.execute(); | ||
_logger.debug("Executing deleting null values"); | ||
try { | ||
String json = input.replace("\"\"", "null"); | ||
JsonObject jsonObject = new Gson().fromJson(json, JsonObject.class); | ||
Gson gson = new GsonBuilder().create(); | ||
return gson.toJson(jsonObject); | ||
} catch (Exception e) { | ||
throw new JsonToolsInvalidJsonError(e.getMessage()); | ||
} | ||
} | ||
} | ||
|
||
|
91 changes: 91 additions & 0 deletions
91
src/main/java/pl/poznan/put/jsontools/logic/JsonTransformFlatten.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,91 @@ | ||
package pl.poznan.put.jsontools.logic; | ||
|
||
import com.fasterxml.jackson.core.JsonProcessingException; | ||
import com.fasterxml.jackson.databind.JsonNode; | ||
import com.fasterxml.jackson.databind.ObjectMapper; | ||
import com.fasterxml.jackson.databind.node.ObjectNode; | ||
import org.slf4j.Logger; | ||
import org.slf4j.LoggerFactory; | ||
import pl.poznan.put.jsontools.error.JsonToolsInvalidJsonError; | ||
|
||
import java.util.ArrayList; | ||
import java.util.List; | ||
|
||
/** | ||
* Class enables to get flattened JSON | ||
*/ | ||
public class JsonTransformFlatten extends JsonTransformer { | ||
|
||
/** | ||
* Class-level logger instance. | ||
*/ | ||
private static final Logger _logger = LoggerFactory.getLogger(JsonTransformFlatten.class); | ||
|
||
|
||
/** | ||
* @param transform transform to be executed before flatten JSON | ||
*/ | ||
public JsonTransformFlatten(JsonTransform transform) { | ||
super(transform); | ||
_logger.debug("Flatten transform created."); | ||
} | ||
|
||
/** | ||
* flatten json. | ||
* | ||
* @return recursively flattened JSON | ||
*/ | ||
@Override | ||
public String execute() { | ||
String json = super.execute(); | ||
_logger.debug("Executing flatten json"); | ||
try { | ||
ObjectMapper mapper = new ObjectMapper(); | ||
JsonNode jsonNode = mapper.readTree(json); | ||
JsonNode flattenJsonNode = mapper.createObjectNode(); | ||
|
||
flattenNodes(jsonNode, flattenJsonNode, ""); | ||
|
||
return flattenJsonNode.toString(); | ||
} catch (JsonProcessingException e) { | ||
throw new JsonToolsInvalidJsonError(e.getLocation().toString(), json); | ||
} | ||
} | ||
|
||
private void flattenNodes(JsonNode root, JsonNode flattenJson, String nestedName) { | ||
if (root.isObject()) { | ||
List<String> jsonAttributes = new ArrayList<>(); | ||
root.fieldNames().forEachRemaining(jsonAttributes::add); | ||
|
||
for (String attribute : jsonAttributes) { | ||
JsonNode fieldValue = root.get(attribute); | ||
if (fieldValue.isObject() || fieldValue.isArray()) { | ||
if (nestedName.equals("")) | ||
flattenNodes(fieldValue, flattenJson, nestedName + attribute); | ||
else | ||
flattenNodes(fieldValue, flattenJson, nestedName + "." + attribute); | ||
} else { | ||
if (nestedName.equals("")) | ||
((ObjectNode) flattenJson).set(nestedName + attribute, fieldValue); | ||
else | ||
((ObjectNode) flattenJson).set(nestedName + "." + attribute, fieldValue); | ||
|
||
} | ||
} | ||
} else if (root.isArray()) { | ||
Integer i = 0; | ||
for (JsonNode fieldValue : root) { | ||
if (fieldValue.isObject() || fieldValue.isArray()) { | ||
flattenNodes(fieldValue, flattenJson, nestedName + (++i).toString()); | ||
} else { | ||
((ObjectNode) flattenJson).set(nestedName + (++i).toString(), fieldValue); | ||
} | ||
} | ||
|
||
} | ||
|
||
} | ||
} | ||
|
||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.