Skip to content

Commit

Permalink
Merge 3631be9 into 19564dc
Browse files Browse the repository at this point in the history
  • Loading branch information
patrickfust committed Oct 17, 2016
2 parents 19564dc + 3631be9 commit 3c27597
Show file tree
Hide file tree
Showing 3 changed files with 135 additions and 0 deletions.
6 changes: 6 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -369,6 +369,12 @@
<version>2.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.13</version>
<scope>compile</scope>
</dependency>
</dependencies>

<reporting>
Expand Down
72 changes: 72 additions & 0 deletions src/main/java/de/danielbechler/diff/node/DiffJSONVisitor.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
package de.danielbechler.diff.node;

import de.danielbechler.diff.path.NodePath;
import de.danielbechler.diff.selector.BeanPropertyElementSelector;
import de.danielbechler.diff.selector.ElementSelector;
import de.danielbechler.util.Strings;
import org.codehaus.jackson.map.ObjectMapper;

import java.io.IOException;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

/**
* This visitor can take the differencies and output the value from the modified object.
* You can either get the result as a {@link Map} or get it as a JSON-string.
* @author Patrick Fust (patrickfust)
*/
public class DiffJSONVisitor extends PrintingVisitor {

private final Map<String, Object> messages = new LinkedHashMap<String, Object>();

public DiffJSONVisitor(Object working, Object base) {
super(working, base);
}

@Override
protected String differenceToString(DiffNode node, Object base, Object modified) {
String text = Strings.toSingleLineString(node.canonicalGet(modified));
NodePath nodePath = node.getPath();
getMapFromPath(nodePath).put(getLastName(nodePath), text);
return text;
}

public Map<String, Object> getMessagesAsMap() {
return messages;
}

public String getAsJSON() throws IOException {
return new ObjectMapper().writeValueAsString(messages);
}

@Override
protected void print(final String text) {
}

private Map<String, Object> getMapFromPath(NodePath path) {
Map<String, Object> resultMap = messages;
List<ElementSelector> elementSelectors = path.getElementSelectors();
int idx = 0;
for (ElementSelector elementSelector : elementSelectors) {
if (elementSelector instanceof BeanPropertyElementSelector) {
BeanPropertyElementSelector beanPropertyElementSelector = (BeanPropertyElementSelector) elementSelector;
if (idx != elementSelectors.size() - 1) { // Has more -> go deeper
String key = beanPropertyElementSelector.getPropertyName();
Map<String, Object> resultMapTmp = (Map<String, Object>) resultMap.get(key);
if (resultMapTmp == null) {
resultMapTmp = new LinkedHashMap<String, Object>();
resultMap.put(key, resultMapTmp);
resultMap = resultMapTmp;
}
}
}
idx++;
}
return resultMap;
}

private String getLastName(NodePath path) {
return ((BeanPropertyElementSelector) path.getLastElementSelector()).getPropertyName();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package de.danielbechler.diff.node

import de.danielbechler.diff.ObjectDifferBuilder
import spock.lang.Specification


class DiffJSONVisitorTest extends Specification {

DiffJSONVisitor visitor

Something workingObject
Something baseObject

def setup() {
workingObject = new Something(name: 'working name', someOther: new Something(name: 'working other'), theSame: 'theSame')
baseObject = new Something(name: 'base name', someOther: new Something(name: 'base other'), theSame: 'theSame')
visitor = new DiffJSONVisitor(workingObject, baseObject)
}

def "something to map"() {
when:
DiffNode root = ObjectDifferBuilder.buildDefault().compare(workingObject, baseObject)
root.visit(visitor)
Map<String, Object> messages = visitor.messagesAsMap

then:
messages.name == 'working name'
messages.someOther.name == 'working other'
}

def "something to json"() {
when:
DiffNode root = ObjectDifferBuilder.buildDefault().compare(workingObject, baseObject)
root.visit(visitor)
String json = visitor.getAsJSON()

then:
json == '{"name":"working name","someOther":{"name":"working other"}}'
}

def "clearing a field"() {
when:
workingObject.name = null
DiffNode root = ObjectDifferBuilder.buildDefault().compare(workingObject, baseObject)
root.visit(visitor)
String json = visitor.getAsJSON()

then:
json == '{"name":null,"someOther":{"name":"working other"}}'
}

static class Something {
String name
String theSame
Something someOther
}
}

0 comments on commit 3c27597

Please sign in to comment.