Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions app/src/main/java/hexlet/code/Formatter.java
Original file line number Diff line number Diff line change
@@ -1,29 +1,29 @@
package hexlet.code;

import com.fasterxml.jackson.core.JsonProcessingException;
import hexlet.code.source.Difference;
import hexlet.code.source.formatters.Json;
import hexlet.code.source.formatters.Plain;
import hexlet.code.source.formatters.Stylish;

import java.util.List;
import java.util.Map;

public class Formatter {

public static String getOrder(String format, List<Difference> difference) throws IllegalArgumentException,
JsonProcessingException {
public static String getOrder(String format, Map<String, List<Object>> differenceMap)
throws IllegalArgumentException, JsonProcessingException {
var normalizeFormat = format.trim().toLowerCase();
var result = "";

switch (normalizeFormat) {
case "plain":
result += Plain.plain(difference);
result += Plain.plain(differenceMap);
break;
case "stylish":
result += Stylish.stylish(difference);
result += Stylish.stylish(differenceMap);
break;
case "json":
result += Json.json(difference);
result += Json.json(differenceMap);
break;
default:
throw new IllegalArgumentException("Не найден формат");
Expand Down
67 changes: 33 additions & 34 deletions app/src/main/java/hexlet/code/source/Differ.java
Original file line number Diff line number Diff line change
@@ -1,25 +1,27 @@
package hexlet.code.source;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.yaml.YAMLMapper;
import hexlet.code.Formatter;
import hexlet.code.source.parsers.Parser;
import hexlet.code.source.parsers.ParserJson;
import hexlet.code.source.parsers.ParserYAML;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.Map;
import java.util.TreeMap;
import java.util.TreeSet;
import java.util.ArrayList;


public class Differ {

public static final String ADD = "ADD";
public static final String DEL = "DEL";
public static final String UNC = "UNC";
public static final String CHN = "CHN";
public static final String ADDED = "ADDED";
public static final String DELETED = "DELETED";
public static final String CHANGED = "CHANGED";
public static final String UNCHANGED = "UNCHANGED";

public static String generate(String filePath1, String filePath2, String format) throws IOException {
var normalizedPath1 = FileManager.normaolizePath(Path.of(filePath1));
Expand All @@ -30,41 +32,38 @@ public static String generate(String filePath1, String filePath2, String format)
throw new FileNotFoundException("Файл для чтения не найден");
}

Parser parser = (FileManager.isJsonFile(normalizedPath1)) ? new ParserJson() : new ParserYAML();
ObjectMapper mapper = (FileManager.isJsonFile(normalizedPath1)) ? new ObjectMapper() : new YAMLMapper();
var dataFirst = mapper.readValue(normalizedPath1.toFile(), Map.class);
var dataSecond = mapper.readValue(normalizedPath2.toFile(), Map.class);


var dataFile1 = parser.parsFile(normalizedPath1);
var dataFile2 = parser.parsFile(normalizedPath2);

Map<String, Difference> differenceTreeMap = new TreeMap<>();
Map<String, List<Object>> differenceMap = new TreeMap<>();
Set<String> keySet = new TreeSet<>(dataFirst.keySet());
keySet.addAll(dataSecond.keySet());

dataFile1.forEach((key, value) -> {
var currentDifference = new Difference();
currentDifference.setKey(key);
var addValue = value == null ? "null" : value;
currentDifference.setOldValue(addValue);
currentDifference.setState(DEL);
differenceTreeMap.put(key, currentDifference);
});
keySet.forEach(key -> {
String stage = "";
var dataFirstValue = dataFirst.get(key) == null ? "null" : dataFirst.get(key);
var dataSecondValue = dataSecond.get(key) == null ? "null" : dataSecond.get(key);

if (dataFirst.containsKey(key) && dataSecond.containsKey(key)) {

dataFile2.forEach((key, value) -> {
var currentDifference = differenceTreeMap.getOrDefault(key, new Difference());
var addValue = value == null ? "null" : value;
currentDifference.setKey(key);
currentDifference.setNewValue(addValue);
stage = (dataFirstValue.equals(dataSecondValue)) ? UNCHANGED : CHANGED;

var addStage = ADD;
if (currentDifference.getOldValue() != null && currentDifference.getNewValue() != null) {
addStage = (currentDifference.getOldValue().equals(currentDifference.getNewValue()))
? UNC : CHN;
} else {
stage = dataSecond.containsKey(key) ? ADDED : DELETED;
}
currentDifference.setState(addStage);
differenceTreeMap.put(key, currentDifference);
});

List<Object> date = new ArrayList<>(3);
date.add(stage);
date.add(dataFirstValue);
date.add(dataSecondValue);

differenceMap.put(key, date);
});

var listDifference = new ArrayList<>(differenceTreeMap.values());
return Formatter.getOrder(format, listDifference);
return Formatter.getOrder(format, differenceMap);
}

}
26 changes: 0 additions & 26 deletions app/src/main/java/hexlet/code/source/Difference.java

This file was deleted.

6 changes: 3 additions & 3 deletions app/src/main/java/hexlet/code/source/formatters/Json.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import hexlet.code.source.Difference;

import java.util.List;
import java.util.Map;

public class Json {
public static String json(List<Difference> data) throws JsonProcessingException {
public static String json(Map<String, List<Object>> differenceMap) throws JsonProcessingException {
ObjectMapper objectMapper = new ObjectMapper();
var result = objectMapper.writeValueAsString(data);
var result = objectMapper.writeValueAsString(differenceMap);
return result.trim();
}
}
65 changes: 36 additions & 29 deletions app/src/main/java/hexlet/code/source/formatters/Plain.java
Original file line number Diff line number Diff line change
@@ -1,39 +1,12 @@
package hexlet.code.source.formatters;

import hexlet.code.source.Differ;
import hexlet.code.source.Difference;

import java.util.List;
import java.util.Map;

public class Plain {
public static String plain(List<Difference> differences) {
StringBuilder result = new StringBuilder();
differences.forEach(value -> {
String addString = "";
var currentState = value.getState();

if (currentState.equals(Differ.ADD)) {
addString = "Property '" + value.getKey() + "' was ";
var newValue = getPrintString(value.getNewValue());
addString += "added with value: " + newValue + "\n";
}

if (currentState.equals(Differ.DEL)) {
addString = "Property '" + value.getKey() + "' was ";
addString += "removed" + "\n";
}

if (currentState.equals(Differ.CHN)) {
addString = "Property '" + value.getKey() + "' was ";
var newValue = getPrintString(value.getNewValue());
var oldValue = getPrintString(value.getOldValue());
addString += "updated. From " + oldValue + " to " + newValue + "\n";
}

result.append(addString);
});
return result.toString().trim();
}
public class Plain {

public static String getPrintString(Object value) {

Expand All @@ -52,4 +25,38 @@ public static String getPrintString(Object value) {
}
return result;
}

public static String plain(Map<String, List<Object>> differenceMap) {
StringBuilder result = new StringBuilder();
differenceMap.forEach((key, value) -> {
String addString = "Property '" + key + "' was ";
if (value.size() != 3) {
throw new IllegalArgumentException("Неподходящие данные");
}

var currentState = value.getFirst();

if (currentState.equals(Differ.ADDED)) {
Object newValue = getPrintString(value.getLast());
addString += "added with value: " + newValue + "\n";
}

if (currentState.equals(Differ.DELETED)) {
addString += "removed" + "\n";
}

if (currentState.equals(Differ.CHANGED)) {
Object oldValue = getPrintString(value.get(1));
Object newValue = getPrintString(value.getLast());
addString += "updated. From " + oldValue + " to " + newValue + "\n";
}

if (currentState.equals(Differ.UNCHANGED)) {
addString = "";
}

result.append(addString);
});
return result.toString().trim();
}
}
28 changes: 16 additions & 12 deletions app/src/main/java/hexlet/code/source/formatters/Stylish.java
Original file line number Diff line number Diff line change
@@ -1,29 +1,33 @@
package hexlet.code.source.formatters;

import hexlet.code.source.Differ;
import hexlet.code.source.Difference;

import java.util.List;
import java.util.Map;

public class Stylish {
public static String stylish(List<Difference> differences) {
public static String stylish(Map<String, List<Object>> differenceMap) {
StringBuilder result = new StringBuilder("{\n");
differences.forEach(value -> {
var currentState = value.getState();
String addString = "";
differenceMap.forEach((key, value) -> {
String addedString = "";

if (currentState.equals(Differ.DEL) || currentState.equals(Differ.CHN)) {
addString += "- " + value.getKey() + ": " + value.getOldValue() + "\n";
if (value.size() != 3) {
throw new IllegalArgumentException("Неподходящие данные");
}

if (currentState.equals(Differ.ADD) || currentState.equals(Differ.CHN)) {
addString += "+ " + value.getKey() + ": " + value.getNewValue() + "\n";
if (value.getFirst().equals(Differ.DELETED) || value.getFirst().equals(Differ.CHANGED)) {
addedString += "- " + key + ": " + value.get(1) + "\n";
}

if (currentState.equals(Differ.UNC)) {
addString += " " + value.getKey() + ": " + value.getOldValue() + "\n";
if (value.getFirst().equals(Differ.ADDED) || value.getFirst().equals(Differ.CHANGED)) {
addedString += "+ " + key + ": " + value.get(2) + "\n";
}
result.append(addString);

if (value.getFirst().equals(Differ.UNCHANGED)) {
addedString += " " + key + ": " + value.get(1) + "\n";
}

result.append(addedString);
});
result.append("}");
return result.toString();
Expand Down
9 changes: 0 additions & 9 deletions app/src/main/java/hexlet/code/source/parsers/Parser.java

This file was deleted.

15 changes: 0 additions & 15 deletions app/src/main/java/hexlet/code/source/parsers/ParserJson.java

This file was deleted.

15 changes: 0 additions & 15 deletions app/src/main/java/hexlet/code/source/parsers/ParserYAML.java

This file was deleted.

1 change: 1 addition & 0 deletions app/src/test/java/fixtures/Json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"chars1":["UNCHANGED",["a","b","c"],["a","b","c"]],"chars2":["CHANGED",["d","e","f"],false],"checked":["CHANGED",false,true],"default":["CHANGED","null",["value1","value2"]],"id":["CHANGED",45,"null"],"key1":["DELETED","value1","null"],"key2":["ADDED","null","value2"],"numbers1":["UNCHANGED",[1,2,3,4],[1,2,3,4]],"numbers2":["CHANGED",[2,3,4,5],[22,33,44,55]],"numbers3":["DELETED",[3,4,5],"null"],"numbers4":["ADDED","null",[4,5,6]],"obj1":["ADDED","null",{"nestedKey":"value","isNested":true}],"setting1":["CHANGED","Some value","Another value"],"setting2":["CHANGED",200,300],"setting3":["CHANGED",true,"none"]}
13 changes: 13 additions & 0 deletions app/src/test/java/fixtures/Plain
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
Property 'chars2' was updated. From [complex value] to false
Property 'checked' was updated. From false to true
Property 'default' was updated. From null to [complex value]
Property 'id' was updated. From 45 to null
Property 'key1' was removed
Property 'key2' was added with value: 'value2'
Property 'numbers2' was updated. From [complex value] to [complex value]
Property 'numbers3' was removed
Property 'numbers4' was added with value: [complex value]
Property 'obj1' was added with value: [complex value]
Property 'setting1' was updated. From 'Some value' to 'Another value'
Property 'setting2' was updated. From 200 to 300
Property 'setting3' was updated. From true to 'none'
25 changes: 25 additions & 0 deletions app/src/test/java/fixtures/Stylish
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
{
chars1: [a, b, c]
- chars2: [d, e, f]
+ chars2: false
- checked: false
+ checked: true
- default: null
+ default: [value1, value2]
- id: 45
+ id: null
- key1: value1
+ key2: value2
numbers1: [1, 2, 3, 4]
- numbers2: [2, 3, 4, 5]
+ numbers2: [22, 33, 44, 55]
- numbers3: [3, 4, 5]
+ numbers4: [4, 5, 6]
+ obj1: {nestedKey=value, isNested=true}
- setting1: Some value
+ setting1: Another value
- setting2: 200
+ setting2: 300
- setting3: true
+ setting3: none
}
Loading