Skip to content

Commit 43071c5

Browse files
jonpereiradevJonathan Pereira
authored andcommitted
DiffCollectionStrategy value() implementation.
1 parent 48d5075 commit 43071c5

6 files changed

Lines changed: 110 additions & 34 deletions

File tree

src/main/java/com/github/jonpereiradev/diffobjects/builder/DiffBuilder.java

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,11 @@
2222
public final class DiffBuilder implements DiffInstanceBuilder, DiffMappingBuilder, DiffConfiguration {
2323

2424
private final Class<?> classMap;
25-
private final List<DiffMetadata> metadatas;
25+
private final Map<String, DiffMetadata> metadatas;
2626

2727
private DiffBuilder(Class<?> classMap) {
2828
this.classMap = classMap;
29-
this.metadatas = new LinkedList<>();
29+
this.metadatas = new LinkedHashMap<>();
3030
}
3131

3232
/**
@@ -56,7 +56,7 @@ public DiffMappingBuilder mapper() {
5656
* @return the instance instance responsible for this mapping.
5757
*/
5858
@Override
59-
public DiffInstanceBuilder mappingAll() {
59+
public DiffMappingBuilder mappingAll() {
6060
Class<?> clazz = classMap;
6161

6262
if (!metadatas.isEmpty()) {
@@ -115,14 +115,9 @@ public DiffMappingBuilder mapping(String field, String value) {
115115
}
116116

117117
DiffMetadata diffMetadata = new DiffMetadata(value, method, diffStrategyType);
118-
119-
if (metadatas.contains(diffMetadata)) {
120-
throw new DiffException("Field \"" + field + "\" already mapped in this builder.");
121-
}
122-
123118
diffMetadata.getProperties().put("field", field);
124119

125-
metadatas.add(diffMetadata);
120+
metadatas.put(field, diffMetadata);
126121

127122
return this;
128123
}
@@ -172,6 +167,6 @@ public DiffConfiguration configuration() {
172167
*/
173168
@Override
174169
public List<DiffMetadata> build() {
175-
return Collections.unmodifiableList(metadatas);
170+
return new ArrayList<>(metadatas.values());
176171
}
177172
}

src/main/java/com/github/jonpereiradev/diffobjects/builder/DiffMappingBuilder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public interface DiffMappingBuilder {
2222
*
2323
* @return the instance instance responsible for this mapping.
2424
*/
25-
DiffInstanceBuilder mappingAll();
25+
DiffMappingBuilder mappingAll();
2626

2727
/**
2828
* Maps the getter of the field for the class.

src/main/java/com/github/jonpereiradev/diffobjects/strategy/DiffCollectionStrategy.java

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -31,31 +31,43 @@ public <T> DiffResult<T> diff(Object before, Object after, DiffMetadata diffMeta
3131
return new DiffResult<>(null, null, true);
3232
}
3333

34-
if (isEqualsSize(beforeCollection, afterCollection)) {
35-
Iterator<?> beforeIterator = beforeCollection.iterator();
36-
Iterator<?> afterIterator = afterCollection.iterator();
37-
38-
while (beforeIterator.hasNext() && afterIterator.hasNext()) {
39-
if (diffMetadata.getValue().isEmpty()) {
40-
Object beforeObject = beforeIterator.next();
41-
Object afterObject = afterIterator.next();
42-
43-
if (!beforeObject.equals(afterObject)) {
44-
return new DiffResult<>((T) beforeCollection, (T) afterCollection, false);
45-
}
34+
if (!isEqualsSize(beforeCollection, afterCollection)) {
35+
return new DiffResult<>((T) beforeCollection, (T) afterCollection, false);
36+
}
37+
38+
Iterator<?> beforeIterator = beforeCollection.iterator();
39+
Iterator<?> afterIterator = afterCollection.iterator();
40+
41+
while (beforeIterator.hasNext() && afterIterator.hasNext()) {
42+
Object beforeObject = beforeIterator.next();
43+
Object afterObject = afterIterator.next();
44+
45+
if (!diffMetadata.getValue().isEmpty()) {
46+
Method method = DiffReflections.discoverGetter(beforeObject.getClass(), diffMetadata.getValue());
47+
DiffMetadata metadata = new DiffMetadata(null, method, DiffStrategyType.SINGLE);
48+
DiffResult<Object> single = DiffStrategyType.SINGLE.getStrategy().diff(beforeObject, afterObject, metadata);
49+
50+
if (!single.isEquals()) {
51+
return new DiffResult<>((T) beforeCollection, (T) afterCollection, false);
4652
}
53+
} else if (!beforeObject.equals(afterObject)) {
54+
return new DiffResult<>((T) beforeCollection, (T) afterCollection, false);
4755
}
4856
}
4957

5058
return new DiffResult<>((T) beforeCollection, (T) afterCollection, true);
5159
}
5260

5361
private boolean isEqualsSize(Collection<?> beforeCollection, Collection<?> afterCollection) {
54-
if (beforeCollection == null && !afterCollection.isEmpty()) {
62+
if (beforeCollection == null && afterCollection != null) {
63+
return false;
64+
}
65+
66+
if (beforeCollection != null && afterCollection == null) {
5567
return false;
5668
}
5769

58-
return beforeCollection != null && afterCollection != null && beforeCollection.isEmpty();
70+
return beforeCollection.size() == afterCollection.size();
5971
}
6072

6173
/**

src/test/java/com/github/jonpereiradev/diffobjects/ComplexElement.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,18 @@ public class ComplexElement extends ParentObjectElement {
99

1010
private final ObjectElement objectElement;
1111
private final List<ObjectElement> objectElementList;
12+
private final List<ObjectElement> objectElementListByName;
1213

1314
public ComplexElement(ObjectElement objectElement) {
1415
this.objectElement = objectElement;
1516
this.objectElementList = new ArrayList<>();
17+
this.objectElementListByName = new ArrayList<>();
1618
}
1719

1820
public ComplexElement(List<ObjectElement> objectElementList) {
1921
this.objectElement = null;
2022
this.objectElementList = objectElementList;
23+
this.objectElementListByName = new ArrayList<>();
2124
}
2225

2326
@DiffMapping("name")
@@ -29,4 +32,9 @@ public ObjectElement getObjectElement() {
2932
public List<ObjectElement> getObjectElementList() {
3033
return objectElementList;
3134
}
35+
36+
@DiffMapping("name")
37+
public List<ObjectElement> getObjectElementListByName() {
38+
return objectElementListByName;
39+
}
3240
}

src/test/java/com/github/jonpereiradev/diffobjects/builder/DiffBuilderTest.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ public void testDiffBuilderMappingAll() {
2323
.map(ObjectElement.class)
2424
.mapper()
2525
.mappingAll()
26+
.instance()
2627
.configuration()
2728
.build();
2829

@@ -40,6 +41,7 @@ public void testDiffBuilderMappingAllInvalidState() {
4041
.mapper()
4142
.mapping("name")
4243
.mappingAll()
44+
.instance()
4345
.configuration()
4446
.build();
4547
}
@@ -76,11 +78,6 @@ public void testDiffBuilderMappingFieldParent() {
7678
Assert.assertEquals("getParent", metadata.get(0).getMethod().getName());
7779
}
7880

79-
@Test(expected = DiffException.class)
80-
public void testDiffBuilderMappingDuplicated() {
81-
DiffBuilder.map(ObjectElement.class).mapper().mapping("name").mapping("name");
82-
}
83-
8481
@Test(expected = DiffException.class)
8582
public void testDiffBuilderMappingNotFound() {
8683
DiffBuilder.map(ObjectElement.class).mapper().mapping("notExists");

src/test/java/com/github/jonpereiradev/diffobjects/strategy/DiffCollectionStrategyTest.java

Lines changed: 68 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.github.jonpereiradev.diffobjects.strategy;
22

3-
import com.github.jonpereiradev.diffobjects.DiffResult;
43
import com.github.jonpereiradev.diffobjects.ComplexElement;
4+
import com.github.jonpereiradev.diffobjects.DiffResult;
55
import com.github.jonpereiradev.diffobjects.ObjectElement;
66
import org.junit.Assert;
77
import org.junit.Before;
@@ -14,13 +14,16 @@ public class DiffCollectionStrategyTest extends BaseStrategyTest {
1414

1515
private DiffStrategy diffStrategy;
1616
private DiffMetadata diffMetadata;
17+
private DiffMetadata diffMetadataByName;
1718

1819
@Before
1920
public void beforeTest() {
2021
diffStrategy = DiffStrategyType.COLLECTION.getStrategy();
21-
diffMetadata = discoverByName(ComplexElement.class,"getObjectElementList");
22+
diffMetadata = discoverByName(ComplexElement.class, "getObjectElementList");
23+
diffMetadataByName = discoverByName(ComplexElement.class, "getObjectElementListByName");
2224
Assert.assertNotNull(diffStrategy);
2325
Assert.assertNotNull(diffMetadata);
26+
Assert.assertNotNull(diffMetadataByName);
2427
}
2528

2629
@Test
@@ -93,7 +96,7 @@ public void testCollectionStrategyDifferentObjectsDifferentSizeList() {
9396
DiffResult<List<ObjectElement>> diffResult = diffStrategy.diff(complexA, complexB, diffMetadata);
9497

9598
Assert.assertNotNull(diffResult);
96-
Assert.assertTrue(diffResult.isEquals());
99+
Assert.assertFalse(diffResult.isEquals());
97100
Assert.assertNotNull(diffResult.getBefore());
98101
Assert.assertNotNull(diffResult.getAfter());
99102
Assert.assertTrue(diffResult.getBefore().size() == 1);
@@ -114,12 +117,73 @@ public void testCollectionStrategyDifferentObjectsSameSizeList() {
114117
DiffResult<List<ObjectElement>> diffResult = diffStrategy.diff(complexA, complexB, diffMetadata);
115118

116119
Assert.assertNotNull(diffResult);
117-
Assert.assertTrue(diffResult.isEquals());
120+
Assert.assertFalse(diffResult.isEquals());
118121
Assert.assertNotNull(diffResult.getBefore());
119122
Assert.assertNotNull(diffResult.getAfter());
120123
Assert.assertTrue(diffResult.getBefore().size() == 1);
121124
Assert.assertEquals("Object A.A", diffResult.getBefore().get(0).getName());
122125
Assert.assertTrue(diffResult.getAfter().size() == 1);
123126
Assert.assertEquals("Object B.A", diffResult.getAfter().get(0).getName());
124127
}
128+
129+
@Test
130+
public void testCollectionStrategySameObjectsSameSizeList() {
131+
ComplexElement complexA = new ComplexElement(new ArrayList<ObjectElement>());
132+
ComplexElement complexB = new ComplexElement(new ArrayList<ObjectElement>());
133+
ObjectElement objectElement = new ObjectElement("Object");
134+
135+
complexA.getObjectElementList().add(objectElement);
136+
complexB.getObjectElementList().add(objectElement);
137+
138+
DiffResult<List<ObjectElement>> diffResult = diffStrategy.diff(complexA, complexB, diffMetadata);
139+
140+
Assert.assertNotNull(diffResult);
141+
Assert.assertTrue(diffResult.isEquals());
142+
Assert.assertNotNull(diffResult.getBefore());
143+
Assert.assertNotNull(diffResult.getAfter());
144+
Assert.assertTrue(diffResult.getBefore().size() == 1);
145+
Assert.assertEquals("Object", diffResult.getBefore().get(0).getName());
146+
Assert.assertTrue(diffResult.getAfter().size() == 1);
147+
Assert.assertEquals("Object", diffResult.getAfter().get(0).getName());
148+
}
149+
150+
@Test
151+
public void testCollectionStrategySameObjectsByNameSameSizeList() {
152+
ComplexElement complexA = new ComplexElement(new ArrayList<ObjectElement>());
153+
ComplexElement complexB = new ComplexElement(new ArrayList<ObjectElement>());
154+
155+
complexA.getObjectElementListByName().add(new ObjectElement("Object"));
156+
complexB.getObjectElementListByName().add(new ObjectElement("Object"));
157+
158+
DiffResult<List<ObjectElement>> diffResult = diffStrategy.diff(complexA, complexB, diffMetadataByName);
159+
160+
Assert.assertNotNull(diffResult);
161+
Assert.assertTrue(diffResult.isEquals());
162+
Assert.assertNotNull(diffResult.getBefore());
163+
Assert.assertNotNull(diffResult.getAfter());
164+
Assert.assertTrue(diffResult.getBefore().size() == 1);
165+
Assert.assertEquals("Object", diffResult.getBefore().get(0).getName());
166+
Assert.assertTrue(diffResult.getAfter().size() == 1);
167+
Assert.assertEquals("Object", diffResult.getAfter().get(0).getName());
168+
}
169+
170+
@Test
171+
public void testCollectionStrategyDifferentObjectsByNameSameSizeList() {
172+
ComplexElement complexA = new ComplexElement(new ArrayList<ObjectElement>());
173+
ComplexElement complexB = new ComplexElement(new ArrayList<ObjectElement>());
174+
175+
complexA.getObjectElementListByName().add(new ObjectElement("Object A"));
176+
complexB.getObjectElementListByName().add(new ObjectElement("Object B"));
177+
178+
DiffResult<List<ObjectElement>> diffResult = diffStrategy.diff(complexA, complexB, diffMetadataByName);
179+
180+
Assert.assertNotNull(diffResult);
181+
Assert.assertFalse(diffResult.isEquals());
182+
Assert.assertNotNull(diffResult.getBefore());
183+
Assert.assertNotNull(diffResult.getAfter());
184+
Assert.assertTrue(diffResult.getBefore().size() == 1);
185+
Assert.assertEquals("Object A", diffResult.getBefore().get(0).getName());
186+
Assert.assertTrue(diffResult.getAfter().size() == 1);
187+
Assert.assertEquals("Object B", diffResult.getAfter().get(0).getName());
188+
}
125189
}

0 commit comments

Comments
 (0)